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..030c7d5 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/JavaSourceViewer.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/JavaSourceViewer.java @@ -11,29 +11,37 @@ 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 net.sourceforge.phpdt.ui.text.JavaSourceViewerConfiguration; - +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants; -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; @@ -43,15 +51,75 @@ public class JavaSourceViewer extends SourceViewer { */ 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; +// private IInformationPresenter fHierarchyPresenter; - public JavaSourceViewer(Composite parent, IVerticalRuler verticalRuler, IOverviewRuler overviewRuler, boolean showAnnotationsOverview, int styles) { + /** + * 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) { @@ -65,60 +133,16 @@ public class JavaSourceViewer extends SourceViewer { 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_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 +156,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); } @@ -148,12 +176,103 @@ public class JavaSourceViewer extends SourceViewer { 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; @@ -162,6 +281,146 @@ public class JavaSourceViewer extends SourceViewer { fStructurePresenter.uninstall(); 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; + } }