X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/JavaSourceViewer.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/JavaSourceViewer.java index 2dae127..124ee59 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/JavaSourceViewer.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/JavaSourceViewer.java @@ -11,47 +11,130 @@ package net.sourceforge.phpeclipse.phpeditor; +import java.util.ArrayList; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.IRegion; -import org.eclipse.jface.text.IRewriteTarget; -import org.eclipse.jface.text.Region; -import org.eclipse.jface.text.formatter.FormattingContextProperties; -import org.eclipse.jface.text.formatter.IContentFormatterExtension2; -import org.eclipse.jface.text.formatter.IFormattingContext; +import net.sourceforge.phpdt.internal.ui.text.SmartBackspaceManager; +import net.sourceforge.phpdt.ui.PreferenceConstants; +import net.sourceforge.phpdt.ui.text.PHPSourceViewerConfiguration; + +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.preference.PreferenceConverter; +import org.eclipse.jface.text.Assert; +import org.eclipse.jface.text.ITextPresentationListener; import org.eclipse.jface.text.information.IInformationPresenter; +import org.eclipse.jface.text.reconciler.IReconciler; import org.eclipse.jface.text.source.IOverviewRuler; import org.eclipse.jface.text.source.IVerticalRuler; -import org.eclipse.jface.text.source.SourceViewer; import org.eclipse.jface.text.source.SourceViewerConfiguration; +import org.eclipse.jface.text.source.projection.ProjectionViewer; +import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants; -//import net.sourceforge.phpdt.ui.text.JavaSourceViewerConfiguration; - - - -public class JavaSourceViewer extends SourceViewer { +public class JavaSourceViewer extends ProjectionViewer implements + IPropertyChangeListener { /** * Text operation code for requesting the outline for the current input. */ - public static final int SHOW_OUTLINE= 51; + public static final int SHOW_OUTLINE = 51; /** - * Text operation code for requesting the outline for the element at the current position. + * Text operation code for requesting the outline for the element at the + * current position. */ - public static final int OPEN_STRUCTURE= 52; + public static final int OPEN_STRUCTURE = 52; + /** + * Text operation code for requesting the hierarchy for the current input. + */ + public static final int SHOW_HIERARCHY = 53; private IInformationPresenter fOutlinePresenter; + private IInformationPresenter fStructurePresenter; - public JavaSourceViewer(Composite parent, IVerticalRuler verticalRuler, IOverviewRuler overviewRuler, boolean showAnnotationsOverview, int styles) { - super(parent, verticalRuler, overviewRuler, showAnnotationsOverview, styles); + // private IInformationPresenter fHierarchyPresenter; + + /** + * This viewer's foreground color. + * + * @since 3.0 + */ + private Color fForegroundColor; + + /** + * The viewer's background color. + * + * @since 3.0 + */ + private Color fBackgroundColor; + + /** + * This viewer's selection foreground color. + * + * @since 3.0 + */ + private Color fSelectionForegroundColor; + + /** + * The viewer's selection background color. + * + * @since 3.0 + */ + private Color fSelectionBackgroundColor; + + /** + * The preference store. + * + * @since 3.0 + */ + private IPreferenceStore fPreferenceStore; + + /** + * Is this source viewer configured? + * + * @since 3.0 + */ + private boolean fIsConfigured; + + /** + * The backspace manager of this viewer. + * + * @since 3.0 + */ + private SmartBackspaceManager fBackspaceManager; + + public JavaSourceViewer(Composite parent, IVerticalRuler verticalRuler, + IOverviewRuler overviewRuler, boolean showAnnotationsOverview, + int styles, IPreferenceStore store) { + super(parent, verticalRuler, overviewRuler, showAnnotationsOverview, + styles); + setPreferenceStore(store); } /* + * @see org.eclipse.jface.text.source.SourceViewer#createFormattingContext() + * @since 3.0 + */ + // public IFormattingContext createFormattingContext() { + // + // IFormattingContext context= new CommentFormattingContext(); + // Map map= new Hashtable(JavaCore.getOptions()); + // + // context.storeToMap(PreferenceConstants.getPreferenceStore(), map, false); + // context.setProperty(FormattingContextProperties.CONTEXT_PREFERENCES, + // map); + // + // return context; + // } + /* * @see ITextOperationTarget#doOperation(int) */ public void doOperation(int operation) { @@ -59,68 +142,24 @@ public class JavaSourceViewer extends SourceViewer { return; switch (operation) { - case SHOW_OUTLINE: - fOutlinePresenter.showInformation(); - return; - case OPEN_STRUCTURE: - fStructurePresenter.showInformation(); - return; - case FORMAT : - { - final Point selection= rememberSelection(); - - final IDocument document= getDocument(); - IRegion region= new Region(selection.x, selection.y); - if (region.getLength()==0) { - region = new Region(0, document.getLength()); - } - final IRewriteTarget target= getRewriteTarget(); - final IFormattingContext context= createFormattingContext(); - - if (selection.y == 0) { - context.setProperty(FormattingContextProperties.CONTEXT_DOCUMENT, Boolean.TRUE); - } else { - context.setProperty(FormattingContextProperties.CONTEXT_DOCUMENT, Boolean.FALSE); - context.setProperty(FormattingContextProperties.CONTEXT_REGION, region); - } - try { - setRedraw(false); - startSequentialRewriteMode(false); - target.beginCompoundChange(); - - final String rememberedContents= document.get(); - - try { - - if (fContentFormatter instanceof IContentFormatterExtension2) { - - final IContentFormatterExtension2 extension= (IContentFormatterExtension2)fContentFormatter; - extension.format(document, context); - - } else - fContentFormatter.format(document, region); - - } catch (RuntimeException x) { - // firewall for https://bugs.eclipse.org/bugs/show_bug.cgi?id=47472 - // if something went wrong we undo the changes we just did - // TODO to be removed - document.set(rememberedContents); - throw x; - } - - } finally { - - target.endCompoundChange(); - stopSequentialRewriteMode(); - setRedraw(true); - - restoreSelection(); - context.dispose(); - } - return; + case SHOW_OUTLINE: + fOutlinePresenter.showInformation(); + return; + case OPEN_STRUCTURE: + fStructurePresenter.showInformation(); + return; + case SHOW_HIERARCHY: + // fHierarchyPresenter.showInformation(); + return; + case FORMAT: + Point point = getSelectedRange(); + if (point.y == 0) { + // setSelectedRange(0, getDocument().getLength()); + revealRange(0, getDocument().getLength()); } + break; } - + super.doOperation(operation); } @@ -132,6 +171,10 @@ public class JavaSourceViewer extends SourceViewer { return fOutlinePresenter != null; if (operation == OPEN_STRUCTURE) return fStructurePresenter != null; + if (operation == SHOW_HIERARCHY) + // return fHierarchyPresenter != null; + return false; + return super.canDoOperation(operation); } @@ -141,27 +184,288 @@ public class JavaSourceViewer extends SourceViewer { public void configure(SourceViewerConfiguration configuration) { super.configure(configuration); if (configuration instanceof PHPSourceViewerConfiguration) { - fOutlinePresenter= ((PHPSourceViewerConfiguration)configuration).getOutlinePresenter(this, false); + fOutlinePresenter = ((PHPSourceViewerConfiguration) configuration) + .getOutlinePresenter(this, false); fOutlinePresenter.install(this); } if (configuration instanceof PHPSourceViewerConfiguration) { - fStructurePresenter= ((PHPSourceViewerConfiguration)configuration).getOutlinePresenter(this, true); + fStructurePresenter = ((PHPSourceViewerConfiguration) configuration) + .getOutlinePresenter(this, true); fStructurePresenter.install(this); } + if (configuration instanceof PHPSourceViewerConfiguration) { + // fHierarchyPresenter= + // ((PHPSourceViewerConfiguration)configuration).getHierarchyPresenter(this, + // true); + // fHierarchyPresenter.install(this); + + if (fPreferenceStore != null) { + fPreferenceStore.addPropertyChangeListener(this); + initializeViewerColors(); + } + } + fIsConfigured = true; + } + + protected void initializeViewerColors() { + if (fPreferenceStore != null) { + + StyledText styledText = getTextWidget(); + + // ----------- foreground color -------------------- + Color color = fPreferenceStore + .getBoolean(PreferenceConstants.EDITOR_FOREGROUND_DEFAULT_COLOR) ? null + : createColor(fPreferenceStore, + PreferenceConstants.EDITOR_FOREGROUND_COLOR, + styledText.getDisplay()); + styledText.setForeground(color); + + if (fForegroundColor != null) + fForegroundColor.dispose(); + + fForegroundColor = color; + + // ---------- background color ---------------------- + color = fPreferenceStore + .getBoolean(PreferenceConstants.EDITOR_BACKGROUND_DEFAULT_COLOR) ? null + : createColor(fPreferenceStore, + PreferenceConstants.EDITOR_BACKGROUND_COLOR, + styledText.getDisplay()); + styledText.setBackground(color); + + if (fBackgroundColor != null) + fBackgroundColor.dispose(); + + fBackgroundColor = color; + + // ----------- selection foreground color -------------------- + color = fPreferenceStore + .getBoolean(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_FOREGROUND_DEFAULT_COLOR) ? null + : createColor( + fPreferenceStore, + AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_FOREGROUND_COLOR, + styledText.getDisplay()); + styledText.setSelectionForeground(color); + + if (fSelectionForegroundColor != null) + fSelectionForegroundColor.dispose(); + + fSelectionForegroundColor = color; + + // ---------- selection background color ---------------------- + color = fPreferenceStore + .getBoolean(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_BACKGROUND_DEFAULT_COLOR) ? null + : createColor( + fPreferenceStore, + AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_BACKGROUND_COLOR, + styledText.getDisplay()); + styledText.setSelectionBackground(color); + + if (fSelectionBackgroundColor != null) + fSelectionBackgroundColor.dispose(); + + fSelectionBackgroundColor = color; + } + } + + /** + * Creates a color from the information stored in the given preference + * store. Returns null if there is no such information + * available. + * + * @param store + * the store to read from + * @param key + * the key used for the lookup in the preference store + * @param display + * the display used create the color + * @return the created color according to the specification in the + * preference store + * @since 3.0 + */ + private Color createColor(IPreferenceStore store, String key, + Display display) { + + RGB rgb = null; + + if (store.contains(key)) { + + if (store.isDefault(key)) + rgb = PreferenceConverter.getDefaultColor(store, key); + else + rgb = PreferenceConverter.getColor(store, key); + + if (rgb != null) + return new Color(display, rgb); + } + + return null; } /* - * @see TextViewer#handleDispose() + * @see org.eclipse.jface.text.source.ISourceViewerExtension2#unconfigure() + * @since 3.0 */ - protected void handleDispose() { + public void unconfigure() { if (fOutlinePresenter != null) { - fOutlinePresenter.uninstall(); - fOutlinePresenter= null; + fOutlinePresenter.uninstall(); + fOutlinePresenter = null; } if (fStructurePresenter != null) { fStructurePresenter.uninstall(); - fStructurePresenter= null; + fStructurePresenter = null; + } + // if (fHierarchyPresenter != null) { + // fHierarchyPresenter.uninstall(); + // fHierarchyPresenter= null; + // } + if (fForegroundColor != null) { + fForegroundColor.dispose(); + fForegroundColor = null; + } + if (fBackgroundColor != null) { + fBackgroundColor.dispose(); + fBackgroundColor = null; } + if (fPreferenceStore != null) + fPreferenceStore.removePropertyChangeListener(this); + + super.unconfigure(); + + fIsConfigured = false; + } + + /* + * @see org.eclipse.jface.text.source.SourceViewer#rememberSelection() + */ + public Point rememberSelection() { + return super.rememberSelection(); + } + + /* + * @see org.eclipse.jface.text.source.SourceViewer#restoreSelection() + */ + public void restoreSelection() { + super.restoreSelection(); + } + + /* + * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent) + */ + public void propertyChange(PropertyChangeEvent event) { + String property = event.getProperty(); + if (PreferenceConstants.EDITOR_FOREGROUND_COLOR.equals(property) + || PreferenceConstants.EDITOR_FOREGROUND_DEFAULT_COLOR + .equals(property) + || PreferenceConstants.EDITOR_BACKGROUND_COLOR.equals(property) + || PreferenceConstants.EDITOR_BACKGROUND_DEFAULT_COLOR + .equals(property) + || AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_FOREGROUND_COLOR + .equals(property) + || AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_FOREGROUND_DEFAULT_COLOR + .equals(property) + || AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_BACKGROUND_COLOR + .equals(property) + || AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_BACKGROUND_DEFAULT_COLOR + .equals(property)) { + initializeViewerColors(); + } + } + + /** + * Sets the preference store on this viewer. + * + * @param store + * the preference store + * + * @since 3.0 + */ + public void setPreferenceStore(IPreferenceStore store) { + if (fIsConfigured && fPreferenceStore != null) + fPreferenceStore.removePropertyChangeListener(this); + + fPreferenceStore = store; + + if (fIsConfigured && fPreferenceStore != null) { + fPreferenceStore.addPropertyChangeListener(this); + initializeViewerColors(); + } + } + + /* + * @see org.eclipse.jface.text.source.SourceViewer#createControl(org.eclipse.swt.widgets.Composite, + * int) + */ + protected void createControl(Composite parent, int styles) { + super.createControl(parent, styles); + + fBackspaceManager = new SmartBackspaceManager(); + fBackspaceManager.install(this); + } + + /** + * Returns the backspace manager for this viewer. + * + * @return the backspace manager for this viewer, or null if + * there is none + * @since 3.0 + */ + public SmartBackspaceManager getBackspaceManager() { + return fBackspaceManager; + } + + /* + * @see org.eclipse.jface.text.source.SourceViewer#handleDispose() + */ + protected void handleDispose() { + if (fBackspaceManager != null) { + fBackspaceManager.uninstall(); + fBackspaceManager = null; + } + super.handleDispose(); } + + /** + * Prepends the text presentation listener at the beginning of the viewer's + * list of text presentation listeners. If the listener is already + * registered with the viewer this call moves the listener to the beginning + * of the list. + * + * @param listener + * the text presentation listener + * @since 3.0 + */ + public void prependTextPresentationListener( + ITextPresentationListener listener) { + + Assert.isNotNull(listener); + + if (fTextPresentationListeners == null) + fTextPresentationListeners = new ArrayList(); + + fTextPresentationListeners.remove(listener); + fTextPresentationListeners.add(0, listener); + } + + /** + * Sets the given reconciler. + * + * @param reconciler + * the reconciler + * @since 3.0 + */ + void setReconciler(IReconciler reconciler) { + fReconciler = reconciler; + } + + /** + * Returns the reconciler. + * + * @return the reconciler or null if not set + * @since 3.0 + */ + Object getReconciler() { + return fReconciler; + } }