Fixed bug in CodeFormatter; for partial formatting select complete <?php ... ?> range
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / PHPEditor.java
index d7acab4..3da3755 100644 (file)
@@ -21,21 +21,26 @@ import java.util.StringTokenizer;
 
 import net.sourceforge.phpdt.core.ICompilationUnit;
 import net.sourceforge.phpdt.core.IJavaElement;
+import net.sourceforge.phpdt.core.IJavaProject;
 import net.sourceforge.phpdt.core.IMember;
 import net.sourceforge.phpdt.core.ISourceRange;
 import net.sourceforge.phpdt.core.ISourceReference;
 import net.sourceforge.phpdt.core.JavaCore;
 import net.sourceforge.phpdt.core.JavaModelException;
 import net.sourceforge.phpdt.internal.ui.actions.CompositeActionGroup;
+import net.sourceforge.phpdt.internal.ui.actions.FoldingActionGroup;
+import net.sourceforge.phpdt.internal.ui.text.CustomSourceInformationControl;
 import net.sourceforge.phpdt.internal.ui.text.HTMLTextPresenter;
 import net.sourceforge.phpdt.internal.ui.text.IPHPPartitions;
 import net.sourceforge.phpdt.internal.ui.text.PHPPairMatcher;
+import net.sourceforge.phpdt.internal.ui.text.PreferencesAdapter;
 import net.sourceforge.phpdt.internal.ui.viewsupport.IViewPartInputProvider;
 import net.sourceforge.phpdt.ui.IContextMenuConstants;
 import net.sourceforge.phpdt.ui.JavaUI;
 import net.sourceforge.phpdt.ui.PreferenceConstants;
 import net.sourceforge.phpdt.ui.actions.GotoMatchingBracketAction;
 import net.sourceforge.phpdt.ui.text.JavaTextTools;
+import net.sourceforge.phpdt.ui.text.folding.IJavaFoldingStructureProvider;
 import net.sourceforge.phpeclipse.PHPeclipsePlugin;
 
 import org.eclipse.core.resources.IMarker;
@@ -81,7 +86,10 @@ import org.eclipse.jface.text.source.ISourceViewer;
 import org.eclipse.jface.text.source.IVerticalRuler;
 import org.eclipse.jface.text.source.OverviewRuler;
 import org.eclipse.jface.text.source.SourceViewerConfiguration;
+import org.eclipse.jface.text.source.projection.ProjectionSupport;
+import org.eclipse.jface.text.source.projection.ProjectionViewer;
 import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.ListenerList;
 import org.eclipse.jface.util.PropertyChangeEvent;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
@@ -123,10 +131,12 @@ import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.actions.ActionContext;
 import org.eclipse.ui.actions.ActionGroup;
 import org.eclipse.ui.editors.text.DefaultEncodingSupport;
+import org.eclipse.ui.editors.text.EditorsUI;
 import org.eclipse.ui.editors.text.IEncodingSupport;
 import org.eclipse.ui.part.IShowInTargetList;
+import org.eclipse.ui.texteditor.AbstractDecoratedTextEditor;
+import org.eclipse.ui.texteditor.ChainedPreferenceStore;
 import org.eclipse.ui.texteditor.DefaultRangeIndicator;
-import org.eclipse.ui.texteditor.ExtendedTextEditor;
 import org.eclipse.ui.texteditor.IDocumentProvider;
 import org.eclipse.ui.texteditor.IEditorStatusLine;
 import org.eclipse.ui.texteditor.ITextEditorActionConstants;
@@ -140,7 +150,7 @@ import org.eclipse.ui.views.tasklist.TaskList;
 /**
  * PHP specific text editor.
  */
-public abstract class PHPEditor  extends ExtendedTextEditor implements IViewPartInputProvider {
+public abstract class PHPEditor  extends AbstractDecoratedTextEditor implements IViewPartInputProvider {
 //extends StatusTextEditor implements IViewPartInputProvider { // extends TextEditor {
   /**
         * "Smart" runnable for updating the outline page's selection.
@@ -181,6 +191,387 @@ public abstract class PHPEditor  extends ExtendedTextEditor implements IViewPart
     }
   };
 
+  /**
+        * Adapts an options {@link java.util.Map} to {@link org.eclipse.jface.preference.IPreferenceStore}.
+        * <p>
+        * This preference store is read-only i.e. write access
+        * throws an {@link java.lang.UnsupportedOperationException}.
+        * </p>
+        * 
+        * @since 3.0
+        */
+       private static class OptionsAdapter implements IPreferenceStore {
+
+
+               /**
+                * A property change event filter.
+                */
+               public interface IPropertyChangeEventFilter {
+
+                       /**
+                        * Should the given event be filtered?
+                        * @param event The property change event.
+                        * @return <code>true</code> iff the given event should be filtered.
+                        */
+                       public boolean isFiltered(PropertyChangeEvent event);
+
+               }
+               /**
+                * Property change listener. Listens for events in the options Map and
+                * fires a {@link org.eclipse.jface.util.PropertyChangeEvent}
+                * on this adapter with arguments from the received event.
+                */
+               private class PropertyChangeListener implements IPropertyChangeListener {
+
+                       /**
+                        * {@inheritDoc}
+                        */
+                       public void propertyChange(PropertyChangeEvent event) {
+                               if (getFilter().isFiltered(event))
+                                       return;
+                               
+                               if (event.getNewValue() == null)
+                                       fOptions.remove(event.getProperty());
+                               else
+                                       fOptions.put(event.getProperty(), event.getNewValue());
+                               
+                               firePropertyChangeEvent(event.getProperty(), event.getOldValue(), event.getNewValue());
+                       }
+               }
+
+               /** Listeners on this adapter */
+               private ListenerList fListeners= new ListenerList();
+
+               /** Listener on the adapted options Map */
+               private IPropertyChangeListener fListener= new PropertyChangeListener();
+
+               /** Adapted options Map */
+               private Map fOptions;
+
+               /** Preference store through which events are received. */
+               private IPreferenceStore fMockupPreferenceStore;
+
+               /** Property event filter. */
+               private IPropertyChangeEventFilter fFilter;
+               
+               /**
+                * Initialize with the given options.
+                * 
+                * @param options The options to wrap
+                * @param mockupPreferenceStore the mock-up preference store
+                * @param filter the property change filter
+                */
+               public OptionsAdapter(Map options, IPreferenceStore mockupPreferenceStore, IPropertyChangeEventFilter filter) {
+                       fMockupPreferenceStore= mockupPreferenceStore;
+                       fOptions= options;
+                       setFilter(filter);
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public void addPropertyChangeListener(IPropertyChangeListener listener) {
+                       if (fListeners.size() == 0)
+                               fMockupPreferenceStore.addPropertyChangeListener(fListener);
+                       fListeners.add(listener);
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public void removePropertyChangeListener(IPropertyChangeListener listener) {
+                       fListeners.remove(listener);
+                       if (fListeners.size() == 0)
+                               fMockupPreferenceStore.removePropertyChangeListener(fListener);
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public boolean contains(String name) {
+                       return fOptions.containsKey(name);
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public void firePropertyChangeEvent(String name, Object oldValue, Object newValue) {
+                       PropertyChangeEvent event= new PropertyChangeEvent(this, name, oldValue, newValue);
+                       Object[] listeners= fListeners.getListeners();
+                       for (int i= 0; i < listeners.length; i++)
+                               ((IPropertyChangeListener) listeners[i]).propertyChange(event);
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public boolean getBoolean(String name) {
+                       boolean value= BOOLEAN_DEFAULT_DEFAULT;
+                       String s= (String) fOptions.get(name);
+                       if (s != null)
+                               value= s.equals(TRUE);
+                       return value;
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public boolean getDefaultBoolean(String name) {
+                       return BOOLEAN_DEFAULT_DEFAULT;
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public double getDefaultDouble(String name) {
+                       return DOUBLE_DEFAULT_DEFAULT;
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public float getDefaultFloat(String name) {
+                       return FLOAT_DEFAULT_DEFAULT;
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public int getDefaultInt(String name) {
+                       return INT_DEFAULT_DEFAULT;
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public long getDefaultLong(String name) {
+                       return LONG_DEFAULT_DEFAULT;
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public String getDefaultString(String name) {
+                       return STRING_DEFAULT_DEFAULT;
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public double getDouble(String name) {
+                       double value= DOUBLE_DEFAULT_DEFAULT;
+                       String s= (String) fOptions.get(name);
+                       if (s != null) {
+                               try {
+                                       value= new Double(s).doubleValue();
+                               } catch (NumberFormatException e) {
+                               }
+                       }
+                       return value;
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public float getFloat(String name) {
+                       float value= FLOAT_DEFAULT_DEFAULT;
+                       String s= (String) fOptions.get(name);
+                       if (s != null) {
+                               try {
+                                       value= new Float(s).floatValue();
+                               } catch (NumberFormatException e) {
+                               }
+                       }
+                       return value;
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public int getInt(String name) {
+                       int value= INT_DEFAULT_DEFAULT;
+                       String s= (String) fOptions.get(name);
+                       if (s != null) {
+                               try {
+                                       value= new Integer(s).intValue();
+                               } catch (NumberFormatException e) {
+                               }
+                       }
+                       return value;
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public long getLong(String name) {
+                       long value= LONG_DEFAULT_DEFAULT;
+                       String s= (String) fOptions.get(name);
+                       if (s != null) {
+                               try {
+                                       value= new Long(s).longValue();
+                               } catch (NumberFormatException e) {
+                               }
+                       }
+                       return value;
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public String getString(String name) {
+                       String value= (String) fOptions.get(name);
+                       if (value == null)
+                               value= STRING_DEFAULT_DEFAULT;
+                       return value;
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public boolean isDefault(String name) {
+                       return false;
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public boolean needsSaving() {
+                       return !fOptions.isEmpty();
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public void putValue(String name, String value) {
+                       throw new UnsupportedOperationException();
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public void setDefault(String name, double value) {
+                       throw new UnsupportedOperationException();
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public void setDefault(String name, float value) {
+                       throw new UnsupportedOperationException();
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public void setDefault(String name, int value) {
+                       throw new UnsupportedOperationException();
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public void setDefault(String name, long value) {
+                       throw new UnsupportedOperationException();
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public void setDefault(String name, String defaultObject) {
+                       throw new UnsupportedOperationException();
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public void setDefault(String name, boolean value) {
+                       throw new UnsupportedOperationException();
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public void setToDefault(String name) {
+                       throw new UnsupportedOperationException();
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public void setValue(String name, double value) {
+                       throw new UnsupportedOperationException();
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public void setValue(String name, float value) {
+                       throw new UnsupportedOperationException();
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public void setValue(String name, int value) {
+                       throw new UnsupportedOperationException();
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public void setValue(String name, long value) {
+                       throw new UnsupportedOperationException();
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public void setValue(String name, String value) {
+                       throw new UnsupportedOperationException();
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               public void setValue(String name, boolean value) {
+                       throw new UnsupportedOperationException();
+               }
+
+               /**
+                * Returns the adapted options Map.
+                * 
+                * @return Returns the adapted options Map.
+                */
+               public Map getOptions() {
+                       return fOptions;
+               }
+
+               /**
+                * Returns the mock-up preference store, events are received through this preference store.
+                * @return Returns the mock-up preference store.
+                */
+               public IPreferenceStore getMockupPreferenceStore() {
+                       return fMockupPreferenceStore;
+               }
+
+               /**
+                * Set the event filter to the given filter.
+                * 
+                * @param filter The new filter.
+                */
+               public void setFilter(IPropertyChangeEventFilter filter) {
+                       fFilter= filter;
+               }
+               
+               /**
+                * Returns the event filter.
+                * 
+                * @return The event filter.
+                */
+               public IPropertyChangeEventFilter getFilter() {
+                       return fFilter;
+               }
+       }
   /*
   * Link mode.  
   */
@@ -1159,6 +1550,23 @@ public abstract class PHPEditor  extends ExtendedTextEditor implements IViewPart
   protected CompositeActionGroup fActionGroups;
   protected CompositeActionGroup fContextMenuGroup;
 
+  /** 
+        * This editor's projection support 
+        * @since 3.0
+        */
+       private ProjectionSupport fProjectionSupport;
+       /** 
+        * This editor's projection model updater 
+        * @since 3.0
+        */
+       private IJavaFoldingStructureProvider fProjectionModelUpdater;
+  /**
+        * The action group for folding.
+        *  
+        * @since 3.0
+        */
+       private FoldingActionGroup fFoldingGroup;
+       
   /** The information presenter. */
   private InformationPresenter fInformationPresenter;
   /** The annotation access */
@@ -1193,20 +1601,48 @@ public abstract class PHPEditor  extends ExtendedTextEditor implements IViewPart
    */
   public PHPEditor() {
     super();
-       JavaTextTools textTools= PHPeclipsePlugin.getDefault().getJavaTextTools();
-       setSourceViewerConfiguration(new PHPSourceViewerConfiguration(textTools, this)); //, IJavaPartitions.JAVA_PARTITIONING));
-       setRangeIndicator(new DefaultRangeIndicator());
-       IPreferenceStore store= PHPeclipsePlugin.getDefault().getPreferenceStore();
-       setPreferenceStore(store);
-       setKeyBindingScopes(new String[] { "net.sourceforge.phpdt.ui.phpEditorScope" });  //$NON-NLS-1$
-//     fMarkOccurrenceAnnotations= store.getBoolean(PreferenceConstants.EDITOR_MARK_OCCURRENCES);
-//     fStickyOccurrenceAnnotations= store.getBoolean(PreferenceConstants.EDITOR_STICKY_OCCURRENCES);
-    
-       // TODO changed in 3.x ?
-    if (PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE))
-      fUpdater= new OutlinePageSelectionUpdater();
   }
  
+       /*
+        * @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#initializeKeyBindingScopes()
+        */
+       protected void initializeKeyBindingScopes() {
+               setKeyBindingScopes(new String[] { "net.sourceforge.phpdt.ui.phpEditorScope" });  //$NON-NLS-1$
+       }
+       
+       /*
+        * @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#initializeEditor()
+        */
+       protected void initializeEditor() {
+         //jsurfer old code
+               JavaTextTools textTools= PHPeclipsePlugin.getDefault().getJavaTextTools();
+               setSourceViewerConfiguration(new PHPSourceViewerConfiguration(textTools, this)); //, IJavaPartitions.JAVA_PARTITIONING));
+               setRangeIndicator(new DefaultRangeIndicator());
+//             IPreferenceStore store= PHPeclipsePlugin.getDefault().getPreferenceStore();
+//             setPreferenceStore(store);
+               IPreferenceStore store= createCombinedPreferenceStore(null);
+               setPreferenceStore(store);
+               
+               // TODO changed in 3.x ?
+           if (PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE))
+             fUpdater= new OutlinePageSelectionUpdater();
+           // jsurfer end
+           
+//             IPreferenceStore store= createCombinedPreferenceStore(null);
+//             setPreferenceStore(store);
+//             JavaTextTools textTools= PHPeclipsePlugin.getDefault().getJavaTextTools();
+//             setSourceViewerConfiguration(new JavaSourceViewerConfiguration(textTools.getColorManager(), store, this, IJavaPartitions.JAVA_PARTITIONING));
+//             fMarkOccurrenceAnnotations= store.getBoolean(PreferenceConstants.EDITOR_MARK_OCCURRENCES);
+//             fStickyOccurrenceAnnotations= store.getBoolean(PreferenceConstants.EDITOR_STICKY_OCCURRENCES);
+//             fMarkTypeOccurrences= store.getBoolean(PreferenceConstants.EDITOR_MARK_TYPE_OCCURRENCES);
+//             fMarkMethodOccurrences= store.getBoolean(PreferenceConstants.EDITOR_MARK_METHOD_OCCURRENCES);
+//             fMarkConstantOccurrences= store.getBoolean(PreferenceConstants.EDITOR_MARK_CONSTANT_OCCURRENCES);
+//             fMarkFieldOccurrences= store.getBoolean(PreferenceConstants.EDITOR_MARK_FIELD_OCCURRENCES);
+//             fMarkLocalVariableypeOccurrences= store.getBoolean(PreferenceConstants.EDITOR_MARK_LOCAL_VARIABLE_OCCURRENCES);
+//             fMarkExceptionOccurrences= store.getBoolean(PreferenceConstants.EDITOR_MARK_EXCEPTION_OCCURRENCES);
+//             fMarkMethodExitPoints= store.getBoolean(PreferenceConstants.EDITOR_MARK_METHOD_EXIT_POINTS);
+       }
   /*
    * @see org.eclipse.ui.texteditor.AbstractTextEditor#updatePropertyDependentActions()
    */
@@ -1262,6 +1698,9 @@ public abstract class PHPEditor  extends ExtendedTextEditor implements IViewPart
     super.doSetSelection(selection);
     synchronizeOutlinePageSelection();
   }
+       boolean isFoldingEnabled() {
+               return PHPeclipsePlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_FOLDING_ENABLED);
+       }
   /*
    * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.
    * widgets.Composite)
@@ -1271,9 +1710,27 @@ public abstract class PHPEditor  extends ExtendedTextEditor implements IViewPart
 
     //fSourceViewerDecorationSupport.install(getPreferenceStore());
 
-    Preferences preferences = PHPeclipsePlugin.getDefault().getPluginPreferences();
+    ProjectionViewer projectionViewer= (ProjectionViewer) getSourceViewer();
+       
+       fProjectionSupport= new ProjectionSupport(projectionViewer, getAnnotationAccess(), getSharedColors());
+       fProjectionSupport.addSummarizableAnnotationType("org.eclipse.ui.workbench.texteditor.error"); //$NON-NLS-1$
+       fProjectionSupport.addSummarizableAnnotationType("org.eclipse.ui.workbench.texteditor.warning"); //$NON-NLS-1$
+       fProjectionSupport.setHoverControlCreator(new IInformationControlCreator() {
+               public IInformationControl createInformationControl(Shell shell) {
+                       return new CustomSourceInformationControl(shell, IDocument.DEFAULT_CONTENT_TYPE);
+               }
+       });
+    fProjectionSupport.install();
+       
+       fProjectionModelUpdater= PHPeclipsePlugin.getDefault().getFoldingStructureProviderRegistry().getCurrentFoldingProvider();
+       if (fProjectionModelUpdater != null)
+               fProjectionModelUpdater.install(this, projectionViewer);
+                       
+       if (isFoldingEnabled())
+               projectionViewer.doOperation(ProjectionViewer.TOGGLE);
+       Preferences preferences = PHPeclipsePlugin.getDefault().getPluginPreferences();
     preferences.addPropertyChangeListener(fPropertyChangeListener);
-
+    
     IInformationControlCreator informationControlCreator = new IInformationControlCreator() {
       public IInformationControl createInformationControl(Shell parent) {
         boolean cutDown = false;
@@ -1323,9 +1780,11 @@ public abstract class PHPEditor  extends ExtendedTextEditor implements IViewPart
   protected void createActions() {
     super.createActions();
     
+    fFoldingGroup= new FoldingActionGroup(this, getViewer());
+    
        ResourceAction resAction= new TextOperationAction(PHPEditorMessages.getResourceBundle(), "ShowJavaDoc.", this, ISourceViewer.INFORMATION, true); //$NON-NLS-1$
        resAction= new InformationDispatchAction(PHPEditorMessages.getResourceBundle(), "ShowJavaDoc.", (TextOperationAction) resAction); //$NON-NLS-1$
-       resAction.setActionDefinitionId(PHPEditorActionDefinitionIds.SHOW_JAVADOC);
+       resAction.setActionDefinitionId(net.sourceforge.phpdt.ui.actions.PHPEditorActionDefinitionIds.SHOW_JAVADOC);
        setAction("ShowJavaDoc", resAction); //$NON-NLS-1$
 //     WorkbenchHelp.setHelp(resAction, IJavaHelpContextIds.SHOW_JAVADOC_ACTION);
        
@@ -1389,17 +1848,50 @@ public abstract class PHPEditor  extends ExtendedTextEditor implements IViewPart
        // add annotation actions
        action= new JavaSelectMarkerRulerAction2(PHPEditorMessages.getResourceBundle(), "Editor.RulerAnnotationSelection.", this); //$NON-NLS-1$
        setAction("AnnotationAction", action); //$NON-NLS-1$
-    
-       // add annotation actions
-       action= new JavaSelectMarkerRulerAction2(PHPEditorMessages.getResourceBundle(), "Editor.RulerAnnotationSelection.", this); //$NON-NLS-1$
-       setAction("AnnotationAction", action); //$NON-NLS-1$
   }
 
+       private void internalDoSetInput(IEditorInput input) throws CoreException {
+               super.doSetInput(input);
+               
+               if (fEncodingSupport != null)
+                       fEncodingSupport.reset();
+               
+               setOutlinePageInput(fOutlinePage, input);
+                               
+               if (fProjectionModelUpdater != null)
+                       fProjectionModelUpdater.initialize();
+               
+//             if (isShowingOverrideIndicators())
+//                     installOverrideIndicator(true);
+       }
+
+       /*
+        * @see org.eclipse.ui.texteditor.AbstractTextEditor#setPreferenceStore(org.eclipse.jface.preference.IPreferenceStore)
+        * @since 3.0
+        */
+       protected void setPreferenceStore(IPreferenceStore store) {
+               super.setPreferenceStore(store);
+               if (getSourceViewerConfiguration() instanceof PHPSourceViewerConfiguration) {
+                       JavaTextTools textTools= PHPeclipsePlugin.getDefault().getJavaTextTools();
+                       setSourceViewerConfiguration(new PHPSourceViewerConfiguration(textTools.getColorManager(), store, this, IPHPPartitions.PHP_PARTITIONING));
+               }
+               if (getSourceViewer() instanceof JavaSourceViewer)
+                       ((JavaSourceViewer)getSourceViewer()).setPreferenceStore(store);
+       }
   /** The <code>PHPEditor</code> implementation of this 
    * <code>AbstractTextEditor</code> method performs any extra 
    * disposal actions required by the php editor.
    */
   public void dispose() {
+       if (fProjectionModelUpdater != null) {
+               fProjectionModelUpdater.uninstall();
+               fProjectionModelUpdater= null;
+       }
+       
+       if (fProjectionSupport != null) {
+               fProjectionSupport.dispose();
+               fProjectionSupport= null;
+       }
     //   PHPEditorEnvironment.disconnect(this);
     if (fOutlinePage != null)
       fOutlinePage.setInput(null);
@@ -1774,7 +2266,12 @@ public abstract class PHPEditor  extends ExtendedTextEditor implements IViewPart
 
       };
     }
-
+    if (fProjectionSupport != null) {
+               Object adapter= fProjectionSupport.getAdapter(getSourceViewer(), required);
+               if (adapter != null)
+                       return adapter;
+       }
+               
     return super.getAdapter(required);
   }
   //  public Object getAdapter(Class required) {
@@ -1950,8 +2447,9 @@ public abstract class PHPEditor  extends ExtendedTextEditor implements IViewPart
        if (PreferenceConstants.EDITOR_DISABLE_OVERWRITE_MODE.equals(property)) {
                if (event.getNewValue() instanceof Boolean) {
                        Boolean disable= (Boolean) event.getNewValue();
-                       configureInsertMode(OVERWRITE, !disable.booleanValue());
+                       enableOverwriteMode(!disable.booleanValue());
                }
+               return;
        }
        
 //     if (PreferenceConstants.EDITOR_MARK_OCCURRENCES.equals(property)) {
@@ -1978,7 +2476,19 @@ public abstract class PHPEditor  extends ExtendedTextEditor implements IViewPart
 //                     }
 //             }
 //     }
-       
+       if (PreferenceConstants.EDITOR_FOLDING_PROVIDER.equals(property)) {
+               if (sourceViewer instanceof ProjectionViewer) {
+                       ProjectionViewer projectionViewer= (ProjectionViewer) sourceViewer;
+                       if (fProjectionModelUpdater != null)
+                               fProjectionModelUpdater.uninstall();
+                       // either freshly enabled or provider changed
+                       fProjectionModelUpdater= PHPeclipsePlugin.getDefault().getFoldingStructureProviderRegistry().getCurrentFoldingProvider();
+                       if (fProjectionModelUpdater != null) {
+                               fProjectionModelUpdater.install(this, projectionViewer);
+                       }
+               }
+               return;
+       }
     } finally {
       super.handlePreferenceStoreChanged(event);
     }
@@ -2129,7 +2639,14 @@ public abstract class PHPEditor  extends ExtendedTextEditor implements IViewPart
                if (!isEditingScriptRunning() && fUpdater != null)
                        fUpdater.post();
        }
-       
+       /*
+        * @see org.eclipse.ui.texteditor.AbstractTextEditor#handleElementContentReplaced()
+        */
+       protected void handleElementContentReplaced() {
+               super.handleElementContentReplaced();
+               if (fProjectionModelUpdater != null)
+                       fProjectionModelUpdater.initialize();
+       }
   /**
    * Initializes the given line number ruler column from the preference store.
    * @param rulerColumn the ruler column to be initialized
@@ -2343,6 +2860,14 @@ public abstract class PHPEditor  extends ExtendedTextEditor implements IViewPart
 //
 //  }
   /**
+        * Returns the Java element wrapped by this editors input.
+        * 
+        * @return the Java element wrapped by this editors input.
+        * @since 3.0
+        */
+       abstract protected IJavaElement getInputJavaElement();
+
+  /**
     * Jumps to the matching bracket.
     */
   public void gotoMatchingBracket() {
@@ -2508,45 +3033,6 @@ public abstract class PHPEditor  extends ExtendedTextEditor implements IViewPart
        return getSourceViewer();
   }
   
-  protected final ISourceViewer createSourceViewer(Composite parent, IVerticalRuler verticalRuler, int styles) {
-       ISourceViewer viewer= createJavaSourceViewer(parent, verticalRuler, getOverviewRuler(), isOverviewRulerVisible(), styles);
-       
-       StyledText text= viewer.getTextWidget();
-       text.addBidiSegmentListener(new  BidiSegmentListener() {
-               public void lineGetSegments(BidiSegmentEvent event) {
-                       event.segments= getBidiLineSegments(event.lineOffset, event.lineText);
-               }
-       });
-       
-//     JavaUIHelp.setHelp(this, text, IJavaHelpContextIds.JAVA_EDITOR);
-
-       // ensure source viewer decoration support has been created and configured
-       getSourceViewerDecorationSupport(viewer);                               
-       
-       return viewer;
-       
-//    ISharedTextColors sharedColors = PHPeclipsePlugin.getDefault().getJavaTextTools().getColorManager();
-//
-//    fOverviewRuler = new OverviewRuler(fAnnotationAccess, VERTICAL_RULER_WIDTH, sharedColors);
-//    fOverviewRuler.addHeaderAnnotationType(AnnotationType.WARNING);
-//    fOverviewRuler.addHeaderAnnotationType(AnnotationType.ERROR);
-//
-//    ISourceViewer viewer = createJavaSourceViewer(parent, verticalRuler, fOverviewRuler, isOverviewRulerVisible(), styles);
-//
-//    StyledText text = viewer.getTextWidget();
-//    text.addBidiSegmentListener(new BidiSegmentListener() {
-//      public void lineGetSegments(BidiSegmentEvent event) {
-//        event.segments = getBidiLineSegments(event.lineOffset, event.lineText);
-//      }
-//    });
-//
-//    //               JavaUIHelp.setHelp(this, text, IJavaHelpContextIds.JAVA_EDITOR);
-//
-//    fSourceViewerDecorationSupport = new SourceViewerDecorationSupport(viewer, fOverviewRuler, fAnnotationAccess, sharedColors);
-//    configureSourceViewerDecorationSupport();
-//
-//    return viewer;
-  }
 
 //  protected void showOverviewRuler() {
 //    if (fOverviewRuler != null) {
@@ -2579,13 +3065,71 @@ public abstract class PHPEditor  extends ExtendedTextEditor implements IViewPart
 //    int styles) {
 //    return new SourceViewer(parent, ruler, overviewRuler, isOverviewRulerVisible(), styles);
 //  }
-  
+       /*
+        * @see AbstractTextEditor#createSourceViewer(Composite, IVerticalRuler, int)
+        */
+       protected ISourceViewer createJavaSourceViewer(Composite parent, IVerticalRuler verticalRuler, IOverviewRuler overviewRuler, boolean isOverviewRulerVisible, int styles, IPreferenceStore store) {
+               return new JavaSourceViewer(parent, verticalRuler, getOverviewRuler(), isOverviewRulerVisible(), styles, store);
+       }
   /*
         * @see AbstractTextEditor#createSourceViewer(Composite, IVerticalRuler, int)
         */
-       protected ISourceViewer createJavaSourceViewer(Composite parent, IVerticalRuler verticalRuler, IOverviewRuler overviewRuler, boolean isOverviewRulerVisible, int styles) {
-               return new JavaSourceViewer(parent, verticalRuler, getOverviewRuler(), isOverviewRulerVisible(), styles);
+       protected final ISourceViewer createSourceViewer(Composite parent, IVerticalRuler verticalRuler, int styles) {
+               
+               ISourceViewer viewer= createJavaSourceViewer(parent, verticalRuler, getOverviewRuler(), isOverviewRulerVisible(), styles, getPreferenceStore());
+               
+               StyledText text= viewer.getTextWidget();
+               text.addBidiSegmentListener(new  BidiSegmentListener() {
+                       public void lineGetSegments(BidiSegmentEvent event) {
+                               event.segments= getBidiLineSegments(event.lineOffset, event.lineText);
+                       }
+               });
+               
+//             JavaUIHelp.setHelp(this, text, IJavaHelpContextIds.JAVA_EDITOR);
+
+               // ensure source viewer decoration support has been created and configured
+               getSourceViewerDecorationSupport(viewer);                               
+               
+               return viewer;
+       }
+       /**
+        * Creates and returns the preference store for this Java editor with the given input.
+        *
+        * @param input The editor input for which to create the preference store
+        * @return the preference store for this editor
+        *
+        * @since 3.0
+        */
+       private IPreferenceStore createCombinedPreferenceStore(IEditorInput input) {
+               List stores= new ArrayList(3);
+
+               IJavaProject project= EditorUtility.getJavaProject(input);
+               if (project != null)
+                       stores.add(new OptionsAdapter(project.getOptions(false), PHPeclipsePlugin.getDefault().getMockupPreferenceStore(), new OptionsAdapter.IPropertyChangeEventFilter() {
+
+                               public boolean isFiltered(PropertyChangeEvent event) {
+                                       IJavaElement inputJavaElement= getInputJavaElement();
+                                       IJavaProject javaProject= inputJavaElement != null ? inputJavaElement.getJavaProject() : null;
+                                       if (javaProject == null)
+                                               return true;
+                                       
+                                       return !javaProject.getProject().equals(event.getSource());
+                               }
+                               
+                       }));
+               
+               stores.add(PHPeclipsePlugin.getDefault().getPreferenceStore());
+               stores.add(new PreferencesAdapter(JavaCore.getPlugin().getPluginPreferences()));
+               stores.add(EditorsUI.getPreferenceStore());
+               
+               return new ChainedPreferenceStore((IPreferenceStore[]) stores.toArray(new IPreferenceStore[stores.size()]));
        }
+         /*
+        * @see AbstractTextEditor#createSourceViewer(Composite, IVerticalRuler, int)
+        */
+//     protected ISourceViewer createJavaSourceViewer(Composite parent, IVerticalRuler verticalRuler, IOverviewRuler overviewRuler, boolean isOverviewRulerVisible, int styles) {
+//             return new JavaSourceViewer(parent, verticalRuler, getOverviewRuler(), isOverviewRulerVisible(), styles);
+//     }
   /*
    * @see AbstractTextEditor#affectsTextPresentation(PropertyChangeEvent)
    */
@@ -2708,4 +3252,59 @@ public abstract class PHPEditor  extends ExtendedTextEditor implements IViewPart
                fOccurrenceAnnotations= null;
        }
 }
+//  protected void uninstallOverrideIndicator() {
+//     if (fOverrideIndicatorManager != null) {
+//             fOverrideIndicatorManager.removeAnnotations();
+//             fOverrideIndicatorManager= null;
+//     }
+//}
+
+protected void installOverrideIndicator(boolean waitForReconcilation) {
+//     uninstallOverrideIndicator();
+       IAnnotationModel model= getDocumentProvider().getAnnotationModel(getEditorInput());
+//     IJavaElement inputElement= getInputJavaElement();
+
+//     if (model == null || inputElement == null)
+//             return;
+
+//     CompilationUnit ast= PHPeclipsePlugin.getDefault().getASTProvider().getAST(inputElement, true, null);
+//     fOverrideIndicatorManager= new OverrideIndicatorManager(model, inputElement, ast);              
+}
+
+/**
+ * Tells whether override indicators are shown.
+ * 
+ * @return <code>true</code> if the override indicators are shown
+ * @since 3.0
+ */
+//protected boolean isShowingOverrideIndicators() {
+//     AnnotationPreference preference= getAnnotationPreferenceLookup().getAnnotationPreference(OverrideIndicatorManager.ANNOTATION_TYPE);
+//     IPreferenceStore store= getPreferenceStore();
+//     return getBoolean(store, preference.getHighlightPreferenceKey())
+//             || getBoolean(store, preference.getVerticalRulerPreferenceKey())
+//             || getBoolean(store, preference.getOverviewRulerPreferenceKey())
+//             || getBoolean(store, preference.getTextPreferenceKey());
+//}
+
+/**
+ * Returns the boolean preference for the given key.
+ * 
+ * @param store the preference store
+ * @param key the preference key
+ * @return <code>true</code> if the key exists in the store and its value is <code>true</code>
+ * @since 3.0
+ */
+private boolean getBoolean(IPreferenceStore store, String key) {
+       return key != null && store.getBoolean(key);
+}
+
+  /**
+        * Returns the folding action group, or <code>null</code> if there is none.
+        * 
+        * @return the folding action group, or <code>null</code> if there is none
+        * @since 3.0
+        */
+       protected FoldingActionGroup getFoldingActionGroup() {
+               return fFoldingGroup;
+       }
 }