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 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.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;
*/
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) {
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());
+ }
+ break;
}
super.doOperation(operation);
return fOutlinePresenter != null;
if (operation == OPEN_STRUCTURE)
return fStructurePresenter != null;
+ if (operation == SHOW_HIERARCHY)
+// return fHierarchyPresenter != null;
+ return false;
+
return super.canDoOperation(operation);
}
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 <code>null</code> 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;
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 <code>null</code> 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);
+ }
}