/* * Copyright (c) 2012, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.dart.tools.ui.internal.compare; import com.google.dart.tools.ui.DartPluginImages; import com.google.dart.tools.ui.DartToolsPlugin; import com.google.dart.tools.ui.text.DartPartitions; import com.google.dart.tools.ui.text.DartTextTools; import org.eclipse.compare.CompareConfiguration; import org.eclipse.compare.CompareEditorInput; import org.eclipse.compare.IEncodedStreamContentAccessor; import org.eclipse.compare.IStreamContentAccessor; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.jface.action.IAction; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocumentPartitioner; import org.eclipse.ui.IEditorInput; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import java.util.MissingResourceException; import java.util.ResourceBundle; public class DartCompareUtilities { private static final char PACKAGEDECLARATION = '%'; private static final char IMPORTDECLARATION = '#'; private static final char IMPORT_CONTAINER = '<'; private static final char FIELD = '^'; private static final char METHOD = '~'; private static final char INITIALIZER = '|'; private static final char COMPILATIONUNIT = '{'; private static final char TYPE = '['; /** * Needed to avoid unnecessary loading of Compare plug-in */ public static boolean isCompareEditorInput(IEditorInput input) { return input instanceof CompareEditorInput; } public static String readString(IStreamContentAccessor sa) throws CoreException { InputStream is = sa.getContents(); if (is != null) { String encoding = null; if (sa instanceof IEncodedStreamContentAccessor) { try { encoding = ((IEncodedStreamContentAccessor) sa).getCharset(); } catch (Exception e) { } } if (encoding == null) { encoding = ResourcesPlugin.getEncoding(); } return readString(is, encoding); } return null; } /** * Returns a name which identifies the given typed name. The type is encoded as a single character * at the beginning of the string. */ static String buildID(int type, String name) { StringBuffer sb = new StringBuffer(); switch (type) { case DartNode.CU: sb.append(COMPILATIONUNIT); break; case DartNode.CLASS: case DartNode.INTERFACE: case DartNode.ENUM: case DartNode.ANNOTATION: sb.append(TYPE); sb.append(name); break; case DartNode.FIELD: sb.append(FIELD); sb.append(name); break; case DartNode.CONSTRUCTOR: case DartNode.METHOD: sb.append(METHOD); sb.append(name); break; case DartNode.INIT: sb.append(INITIALIZER); sb.append(name); break; case DartNode.PACKAGE: sb.append(PACKAGEDECLARATION); break; case DartNode.IMPORT: sb.append(IMPORTDECLARATION); sb.append(name); break; case DartNode.IMPORT_CONTAINER: sb.append(IMPORT_CONTAINER); break; default: Assert.isTrue(false); break; } return sb.toString(); } static IDocumentPartitioner createDartPartitioner() { DartTextTools tools = getDartTextTools(); if (tools != null) { return tools.createDocumentPartitioner(); } return null; } static ImageDescriptor getAnnotationImageDescriptor() { return DartPluginImages.DESC_OBJS_ANNOTATION; } static boolean getBoolean(CompareConfiguration cc, String key, boolean dflt) { if (cc != null) { Object value = cc.getProperty(key); if (value instanceof Boolean) { return ((Boolean) value).booleanValue(); } } return dflt; } /** * Returns the contents of the given string as an array of bytes in the platform's default * encoding. */ static byte[] getBytes(String s, String encoding) { try { return s.getBytes(encoding); } catch (UnsupportedEncodingException e) { return s.getBytes(); } } static DartTextTools getDartTextTools() { DartToolsPlugin plugin = DartToolsPlugin.getDefault(); if (plugin != null) { return plugin.getDartTextTools(); } return null; } static ImageDescriptor getEnumImageDescriptor() { return DartPluginImages.DESC_OBJS_ENUM; } static ImageDescriptor getImageDescriptor(int type) { switch (type) { // case DartElement.INITIALIZER: // case DartElement.METHOD: // return getImageDescriptor("obj16/compare_method.gif"); //$NON-NLS-1$ // case DartElement.FIELD: // return getImageDescriptor("obj16/compare_field.gif"); //$NON-NLS-1$ // case DartElement.PACKAGE_DECLARATION: // return DartPluginImages.DESC_OBJS_PACKDECL; // case DartElement.IMPORT_DECLARATION: // return DartPluginImages.DESC_OBJS_IMPDECL; // case DartElement.IMPORT_CONTAINER: // return DartPluginImages.DESC_OBJS_IMPCONT; // case DartElement.COMPILATION_UNIT: // return DartPluginImages.DESC_OBJS_CUNIT; } return ImageDescriptor.getMissingImageDescriptor(); } static ImageDescriptor getImageDescriptor(String relativePath) { IPath path = DartPluginImages.ICONS_PATH.append(relativePath); return DartPluginImages.createImageDescriptor( DartToolsPlugin.getDefault().getBundle(), path, true); } static int getInteger(ResourceBundle bundle, String key, int dfltValue) { if (bundle != null) { try { String s = bundle.getString(key); if (s != null) { return Integer.parseInt(s); } } catch (NumberFormatException x) { // NeedWork } catch (MissingResourceException x) { // NeedWork } } return dfltValue; } static String getString(ResourceBundle bundle, String key) { return getString(bundle, key, key); } static String getString(ResourceBundle bundle, String key, String dfltValue) { if (bundle != null) { try { return bundle.getString(key); } catch (MissingResourceException x) { // NeedWork } } return dfltValue; } static ImageDescriptor getTypeImageDescriptor() { return DartPluginImages.DESC_OBJS_CLASS; } // static ImageDescriptor getTypeImageDescriptor(boolean isClass) { // if (isClass) { // return DartPluginImages.DESC_OBJS_CLASS; // } // return DartPluginImages.DESC_OBJS_INTERFACE; // } /** * Initialize the given Action from a ResourceBundle. */ static void initAction(IAction a, ResourceBundle bundle, String prefix) { String labelKey = "label"; //$NON-NLS-1$ String tooltipKey = "tooltip"; //$NON-NLS-1$ String imageKey = "image"; //$NON-NLS-1$ String descriptionKey = "description"; //$NON-NLS-1$ if (prefix != null && prefix.length() > 0) { labelKey = prefix + labelKey; tooltipKey = prefix + tooltipKey; imageKey = prefix + imageKey; descriptionKey = prefix + descriptionKey; } a.setText(getString(bundle, labelKey, labelKey)); a.setToolTipText(getString(bundle, tooltipKey, null)); a.setDescription(getString(bundle, descriptionKey, null)); String relPath = getString(bundle, imageKey, null); if (relPath != null && relPath.trim().length() > 0) { String dPath; String ePath; if (relPath.indexOf("/") >= 0) { //$NON-NLS-1$ String path = relPath.substring(1); dPath = 'd' + path; ePath = 'e' + path; } else { dPath = "dlcl16/" + relPath; //$NON-NLS-1$ ePath = "elcl16/" + relPath; //$NON-NLS-1$ } ImageDescriptor id = DartCompareUtilities.getImageDescriptor(dPath); // we set the disabled image first (see PR 1GDDE87) if (id != null) { a.setDisabledImageDescriptor(id); } id = DartCompareUtilities.getImageDescriptor(ePath); if (id != null) { a.setImageDescriptor(id); a.setHoverImageDescriptor(id); } } } static void initToggleAction(IAction a, ResourceBundle bundle, String prefix, boolean checked) { String tooltip = null; if (checked) { tooltip = getString(bundle, prefix + "tooltip.checked", null); //$NON-NLS-1$ } else { tooltip = getString(bundle, prefix + "tooltip.unchecked", null); //$NON-NLS-1$ } if (tooltip == null) { tooltip = getString(bundle, prefix + "tooltip", null); //$NON-NLS-1$ } if (tooltip != null) { a.setToolTipText(tooltip); } String description = null; if (checked) { description = getString(bundle, prefix + "description.checked", null); //$NON-NLS-1$ } else { description = getString(bundle, prefix + "description.unchecked", null); //$NON-NLS-1$ } if (description == null) { description = getString(bundle, prefix + "description", null); //$NON-NLS-1$ } if (description != null) { a.setDescription(description); } } /** * Breaks the contents of the given input stream into an array of strings. The function assumes * that the input stream uses the platform's default encoding ( * <code>ResourcesPlugin.getEncoding()</code>). Returns null if an error occurred. */ static String[] readLines(InputStream is2, String encoding) { BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(is2, encoding)); StringBuffer sb = new StringBuffer(); List<String> list = new ArrayList<String>(); while (true) { int c = reader.read(); if (c == -1) { break; } sb.append((char) c); if (c == '\r') { // single CR or a CR followed by LF c = reader.read(); if (c == -1) { break; } sb.append((char) c); if (c == '\n') { list.add(sb.toString()); sb = new StringBuffer(); } } else if (c == '\n') { // a single LF list.add(sb.toString()); sb = new StringBuffer(); } } if (sb.length() > 0) { list.add(sb.toString()); } return list.toArray(new String[list.size()]); } catch (IOException ex) { return null; } finally { if (reader != null) { try { reader.close(); } catch (IOException ex) { // silently ignored } } } } static void setupDocument(IDocument document) { DartTextTools tools = getDartTextTools(); if (tools != null) { tools.setupDartDocumentPartitioner(document, DartPartitions.DART_PARTITIONING); } } // static void setupPropertiesFileDocument(IDocument document) { // PropertiesFileDocumentSetupParticipant.setupDocument(document); // } /** * Reads the contents of the given input stream into a string. The function assumes that the input * stream uses the platform's default encoding (<code>ResourcesPlugin.getEncoding()</code>). * Returns null if an error occurred. */ private static String readString(InputStream is, String encoding) { if (is == null) { return null; } BufferedReader reader = null; try { StringBuffer buffer = new StringBuffer(); char[] part = new char[2048]; int read = 0; reader = new BufferedReader(new InputStreamReader(is, encoding)); while ((read = reader.read(part)) != -1) { buffer.append(part, 0, read); } return buffer.toString(); } catch (IOException ex) { // NeedWork } finally { if (reader != null) { try { reader.close(); } catch (IOException ex) { // silently ignored } } } return null; } }