improved include detection
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / PHPeclipsePlugin.java
index 1ec421e..e59ece1 100644 (file)
@@ -19,11 +19,17 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
+import net.sourceforge.phpdt.core.IBuffer;
+import net.sourceforge.phpdt.core.IBufferFactory;
+import net.sourceforge.phpdt.core.ICompilationUnit;
+import net.sourceforge.phpdt.core.IJavaElement;
 import net.sourceforge.phpdt.core.JavaCore;
+import net.sourceforge.phpdt.core.WorkingCopyOwner;
 import net.sourceforge.phpdt.externaltools.internal.model.ColorManager;
 import net.sourceforge.phpdt.externaltools.internal.model.ExternalToolsPlugin;
 import net.sourceforge.phpdt.externaltools.internal.model.VariableContextManager;
-import net.sourceforge.phpdt.internal.core.JavaModelManager;
+import net.sourceforge.phpdt.internal.ui.JavaElementAdapterFactory;
+import net.sourceforge.phpdt.internal.ui.ResourceAdapterFactory;
 import net.sourceforge.phpdt.internal.ui.preferences.MembersOrderPreferenceCache;
 import net.sourceforge.phpdt.internal.ui.preferences.TemplatePreferencePage;
 import net.sourceforge.phpdt.internal.ui.text.java.hover.JavaEditorTextHoverDescriptor;
@@ -37,19 +43,17 @@ import net.sourceforge.phpeclipse.builder.ExternalEditorInput;
 import net.sourceforge.phpeclipse.builder.ExternalStorageDocumentProvider;
 import net.sourceforge.phpeclipse.builder.FileStorage;
 import net.sourceforge.phpeclipse.builder.IdentifierIndexManager;
+import net.sourceforge.phpeclipse.phpeditor.CustomBufferFactory;
+import net.sourceforge.phpeclipse.phpeditor.DocumentAdapter;
 import net.sourceforge.phpeclipse.phpeditor.PHPDocumentProvider;
 import net.sourceforge.phpeclipse.phpeditor.PHPSyntaxRdr;
 import net.sourceforge.phpeclipse.phpeditor.WorkingCopyManager;
 import net.sourceforge.phpeclipse.phpeditor.util.PHPColorProvider;
-import net.sourceforge.phpeclipse.resourcesview.PHPElement;
-import net.sourceforge.phpeclipse.resourcesview.PHPElementAdapterFactory;
-import net.sourceforge.phpeclipse.resourcesview.ResourceAdapterFactory;
 
 import org.eclipse.core.boot.BootLoader;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
 import org.eclipse.core.resources.IWorkspace;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
@@ -60,13 +64,19 @@ import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Status;
+import net.sourceforge.phpdt.internal.ui.text.folding.JavaFoldingStructureProviderRegistry;
+
+import net.sourceforge.phpdt.internal.ui.text.PreferencesAdapter;
 import org.eclipse.jface.action.GroupMarker;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.Separator;
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.jface.resource.JFaceResources;
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.IEditorDescriptor;
@@ -77,11 +87,15 @@ import org.eclipse.ui.IWorkbench;
 import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.editors.text.EditorsUI;
 import org.eclipse.ui.ide.IDE;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants;
+import org.eclipse.ui.texteditor.ChainedPreferenceStore;
 import org.eclipse.ui.texteditor.IDocumentProvider;
 import org.eclipse.ui.texteditor.ITextEditor;
 import org.eclipse.ui.texteditor.MarkerAnnotationPreferences;
+import org.osgi.framework.BundleContext;
 /**
  * The main plugin class to be used in the desktop.
  */
@@ -136,12 +150,39 @@ public class PHPeclipsePlugin extends AbstractUIPlugin
   private ImageDescriptorRegistry fImageDescriptorRegistry;
   private HashMap fIndexManagerMap = new HashMap();
   private IWorkingCopyManager fWorkingCopyManager;
+       private IBufferFactory fBufferFactory;
   private PHPDocumentProvider fCompilationUnitDocumentProvider;
   private JavaTextTools fJavaTextTools;
   private ProblemMarkerManager fProblemMarkerManager;
   private MembersOrderPreferenceCache fMembersOrderPreferenceCache;
   private IFile fLastEditorFile = null;
   private JavaEditorTextHoverDescriptor[] fJavaEditorTextHoverDescriptors;
+  
+  private JavaElementAdapterFactory fJavaElementAdapterFactory;
+//     private MarkerAdapterFactory fMarkerAdapterFactory;
+//     private EditorInputAdapterFactory fEditorInputAdapterFactory;
+       private ResourceAdapterFactory fResourceAdapterFactory; 
+//     private LogicalPackageAdapterFactory fLogicalPackageAdapterFactory;
+       private IPropertyChangeListener fFontPropertyChangeListener;
+       /**
+        * Property change listener on this plugin's preference store.
+        * 
+        * @since 3.0
+        */
+       private IPropertyChangeListener fPropertyChangeListener;
+       
+       /**
+        * The combined preference store.
+        * @since 3.0
+        */
+       private IPreferenceStore fCombinedPreferenceStore;
+       /**
+        * The extension point registry for the <code>org.eclipse.jdt.ui.javaFoldingStructureProvider</code>
+        * extension point.
+        * 
+        * @since 3.0
+        */
+       private JavaFoldingStructureProviderRegistry fFoldingStructureProviderRegistry;
   /**
    * The constructor.
    */
@@ -344,6 +385,7 @@ public class PHPeclipsePlugin extends AbstractUIPlugin
       fCompilationUnitDocumentProvider = new PHPDocumentProvider();
     return fCompilationUnitDocumentProvider;
   }
+
   /**
    * Get the identifier index manager for the given project
    * 
@@ -379,6 +421,7 @@ public class PHPeclipsePlugin extends AbstractUIPlugin
       fProblemMarkerManager = new ProblemMarkerManager();
     return fProblemMarkerManager;
   }
+       
   public synchronized JavaTextTools getJavaTextTools() {
     if (fJavaTextTools == null)
       fJavaTextTools = new JavaTextTools(getPreferenceStore());
@@ -529,9 +572,6 @@ public class PHPeclipsePlugin extends AbstractUIPlugin
     //    store.setDefault(RESOURCE_BUNDLE_DE, "false");
     //    store.setDefault(RESOURCE_BUNDLE_FR, "false");
     //    store.setDefault(RESOURCE_BUNDLE_ES, "false");
-    store.setDefault(PHP_OUTLINE_CLASS, "true"); //$NON-NLS-1$
-    store.setDefault(PHP_OUTLINE_FUNC, "true"); //$NON-NLS-1$
-    store.setDefault(PHP_OUTLINE_VAR, "true"); //$NON-NLS-1$
     TemplatePreferencePage.initDefaults(store);
     //this will initialize the static fields in the syntaxrdr class
     new PHPSyntaxRdr();
@@ -663,93 +703,319 @@ public class PHPeclipsePlugin extends AbstractUIPlugin
   public void setLastEditorFile(IFile textEditor) {
     this.fLastEditorFile = textEditor;
   }
+       /*
+        * @see org.eclipse.core.runtime.Plugin#stop
+        */
+       public void stop(BundleContext context) throws Exception {
+               try {
+                       JavaCore.stop(this, context);
+                       
+                       ColorManager.getDefault().dispose();
+                   // save the information from the php index files if necessary
+                   Collection collection = fIndexManagerMap.values();
+                   Iterator iterator = collection.iterator();
+                   IdentifierIndexManager indexManager = null;
+                   while (iterator.hasNext()) {
+                     indexManager = (IdentifierIndexManager) iterator.next();
+                     indexManager.writeFile();
+                   }
+                   if (fImageDescriptorRegistry != null)
+                     fImageDescriptorRegistry.dispose();
+                   
+//                     AllTypesCache.terminate();
+       
+                       if (fImageDescriptorRegistry != null)
+                               fImageDescriptorRegistry.dispose();
+                       
+                       unregisterAdapters();
+       
+//                     if (fASTProvider != null) {
+//                             fASTProvider.dispose();
+//                             fASTProvider= null;
+//                     }
+                       
+                       if (fWorkingCopyManager != null) {
+                               fWorkingCopyManager.shutdown();
+                               fWorkingCopyManager= null;
+                       }
+                       
+                       if (fCompilationUnitDocumentProvider != null) {
+                               fCompilationUnitDocumentProvider.shutdown();
+                               fCompilationUnitDocumentProvider= null;
+                       }
+                                       
+                       if (fJavaTextTools != null) {
+                               fJavaTextTools.dispose();
+                               fJavaTextTools= null;
+                       }
+//                     JavaDocLocations.shutdownJavadocLocations();
+                       
+                       uninstallPreferenceStoreBackwardsCompatibility();
+                       
+//                     RefactoringCore.getUndoManager().shutdown();
+               } finally {     
+                       super.stop(context);
+               }
+       }
   /**
    * @see org.eclipse.ui.plugin.AbstractUIPlugin#shutdown()
    */
-  public void shutdown() throws CoreException {
-    // moved down (see below):
-    //    super.shutdown();
-    //  externalTools.shutDown();
-    ColorManager.getDefault().dispose();
-    // save the information from the php index files if necessary
-    Collection collection = fIndexManagerMap.values();
-    Iterator iterator = collection.iterator();
-    IdentifierIndexManager indexManager = null;
-    while (iterator.hasNext()) {
-      indexManager = (IdentifierIndexManager) iterator.next();
-      indexManager.writeFile();
-    }
-    if (fImageDescriptorRegistry != null)
-      fImageDescriptorRegistry.dispose();
-    //                         unregisterAdapters();
-    super.shutdown();
-    if (fWorkingCopyManager != null) {
-      fWorkingCopyManager.shutdown();
-      fWorkingCopyManager = null;
-    }
-    if (fCompilationUnitDocumentProvider != null) {
-      fCompilationUnitDocumentProvider.shutdown();
-      fCompilationUnitDocumentProvider = null;
-    }
-    if (fJavaTextTools != null) {
-      fJavaTextTools.dispose();
-      fJavaTextTools = null;
-    }
-    //                         JavaDocLocations.shutdownJavadocLocations();
-    //         
-    //                         JFaceResources.getFontRegistry().removeListener(fFontPropertyChangeListener);
-    // begin JavaCore#shutdown()
-    //savePluginPreferences();
-    savePluginPreferences();
-    IWorkspace workspace = ResourcesPlugin.getWorkspace();
-    workspace.removeResourceChangeListener(JavaModelManager
-        .getJavaModelManager().deltaProcessor);
-    workspace.removeSaveParticipant(PHPeclipsePlugin.getDefault());
-    ((JavaModelManager) JavaModelManager.getJavaModelManager()).shutdown();
-    //  end JavaCore#shutdown()
-  }
-  public void startup() throws CoreException {
-    super.startup();
-    // begin JavaCore.startup();
-    JavaModelManager manager = JavaModelManager.getJavaModelManager();
-    try {
-      manager.configurePluginDebugOptions();
-      // request state folder creation (workaround 19885)
-      //               JavaCore.getPlugin().getStateLocation();
-      getStateLocation();
-      // retrieve variable values
-      //               JavaCore.getPlugin().getPluginPreferences().addPropertyChangeListener(new
-      // JavaModelManager.PluginPreferencesListener());
-      getPluginPreferences().addPropertyChangeListener(
-          new JavaModelManager.PluginPreferencesListener());
-      //       TODO khartlage temp-del
-      //               manager.loadVariablesAndContainers();
-      IWorkspace workspace = ResourcesPlugin.getWorkspace();
-      workspace.addResourceChangeListener(manager.deltaProcessor,
-          IResourceChangeEvent.PRE_AUTO_BUILD
-              | IResourceChangeEvent.POST_AUTO_BUILD
-              | IResourceChangeEvent.POST_CHANGE
-              | IResourceChangeEvent.PRE_DELETE
-              | IResourceChangeEvent.PRE_CLOSE);
-      //               startIndexing();
-      workspace.addSaveParticipant(PHPeclipsePlugin.getDefault(), manager);
-    } catch (CoreException e) {
-    } catch (RuntimeException e) {
-      manager.shutdown();
-      throw e;
-    }
-    //  end JavaCore.startup();
-    IAdapterManager platformManager = Platform.getAdapterManager();
-    platformManager.registerAdapters(new PHPElementAdapterFactory(),
-        PHPElement.class);
-    platformManager.registerAdapters(new ResourceAdapterFactory(),
-        IResource.class);
-    //  externalTools.startUp();
-    getStandardDisplay().asyncExec(new Runnable() {
-      public void run() {
-        //initialize the variable context manager
-        VariableContextManager.getDefault();
-      }
-    });
-  }
+//  public void shutdown() throws CoreException {
+//    // moved down (see below):
+//    //    super.shutdown();
+//    //  externalTools.shutDown();
+//    ColorManager.getDefault().dispose();
+//    // save the information from the php index files if necessary
+//    Collection collection = fIndexManagerMap.values();
+//    Iterator iterator = collection.iterator();
+//    IdentifierIndexManager indexManager = null;
+//    while (iterator.hasNext()) {
+//      indexManager = (IdentifierIndexManager) iterator.next();
+//      indexManager.writeFile();
+//    }
+//    if (fImageDescriptorRegistry != null)
+//      fImageDescriptorRegistry.dispose();
+//    //                               unregisterAdapters();
+//    super.shutdown();
+//    if (fWorkingCopyManager != null) {
+//      fWorkingCopyManager.shutdown();
+//      fWorkingCopyManager = null;
+//    }
+//    if (fCompilationUnitDocumentProvider != null) {
+//      fCompilationUnitDocumentProvider.shutdown();
+//      fCompilationUnitDocumentProvider = null;
+//    }
+//    if (fJavaTextTools != null) {
+//      fJavaTextTools.dispose();
+//      fJavaTextTools = null;
+//    }
+//    //                               JavaDocLocations.shutdownJavadocLocations();
+//    //               
+//    //                               JFaceResources.getFontRegistry().removeListener(fFontPropertyChangeListener);
+//    // begin JavaCore#shutdown()
+//    //savePluginPreferences();
+//    savePluginPreferences();
+//    IWorkspace workspace = ResourcesPlugin.getWorkspace();
+//     workspace.removeResourceChangeListener(JavaModelManager.getJavaModelManager().deltaState);
+//     workspace.removeSaveParticipant(this);
+//     ((JavaModelManager) JavaModelManager.getJavaModelManager()).shutdown();
+//    //        end JavaCore#shutdown()
+//  }
+       /**
+        * Installs backwards compatibility for the preference store.
+        */
+       private void installPreferenceStoreBackwardsCompatibility() {
+
+               /*
+                * Installs backwards compatibility: propagate the Java editor font from a
+                * pre-2.1 plug-in to the Platform UI's preference store to preserve
+                * the Java editor font from a pre-2.1 workspace. This is done only
+                * once.
+                */
+               String fontPropagatedKey= "fontPropagated"; //$NON-NLS-1$
+               if (getPreferenceStore().contains(JFaceResources.TEXT_FONT) && !getPreferenceStore().isDefault(JFaceResources.TEXT_FONT)) {
+                       if (!getPreferenceStore().getBoolean(fontPropagatedKey))
+                               PreferenceConverter.setValue(PlatformUI.getWorkbench().getPreferenceStore(), PreferenceConstants.EDITOR_TEXT_FONT, PreferenceConverter.getFontDataArray(getPreferenceStore(), JFaceResources.TEXT_FONT));
+               }
+               getPreferenceStore().setValue(fontPropagatedKey, true);
+
+               /*
+                * Backwards compatibility: set the Java editor font in this plug-in's
+                * preference store to let older versions access it. Since 2.1 the
+                * Java editor font is managed by the workbench font preference page.
+                */
+               PreferenceConverter.putValue(getPreferenceStore(), JFaceResources.TEXT_FONT, JFaceResources.getFontRegistry().getFontData(PreferenceConstants.EDITOR_TEXT_FONT));
+
+               fFontPropertyChangeListener= new IPropertyChangeListener() {
+                       public void propertyChange(PropertyChangeEvent event) {
+                               if (PreferenceConstants.EDITOR_TEXT_FONT.equals(event.getProperty()))
+                                       PreferenceConverter.putValue(getPreferenceStore(), JFaceResources.TEXT_FONT, JFaceResources.getFontRegistry().getFontData(PreferenceConstants.EDITOR_TEXT_FONT));
+                       }
+               };
+               JFaceResources.getFontRegistry().addListener(fFontPropertyChangeListener);
+               
+               /*
+                * Backwards compatibility: propagate the Java editor tab width from a
+                * pre-3.0 plug-in to the new preference key. This is done only once.
+                */
+               final String oldTabWidthKey= PreferenceConstants.EDITOR_TAB_WIDTH;
+               final String newTabWidthKey= AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TAB_WIDTH;
+               String tabWidthPropagatedKey= "tabWidthPropagated"; //$NON-NLS-1$
+               if (getPreferenceStore().contains(oldTabWidthKey) && !getPreferenceStore().isDefault(oldTabWidthKey)) {
+                       if (!getPreferenceStore().getBoolean(tabWidthPropagatedKey))
+                               getPreferenceStore().setValue(newTabWidthKey, getPreferenceStore().getInt(oldTabWidthKey));
+               }
+               getPreferenceStore().setValue(tabWidthPropagatedKey, true);
+
+               /*
+                * Backwards compatibility: set the Java editor tab width in this plug-in's
+                * preference store with the old key to let older versions access it.
+                * Since 3.0 the tab width is managed by the extended texteditor and
+                * uses a new key.
+                */
+               getPreferenceStore().putValue(oldTabWidthKey, getPreferenceStore().getString(newTabWidthKey));
+
+               fPropertyChangeListener= new IPropertyChangeListener() {
+                       public void propertyChange(PropertyChangeEvent event) {
+                               if (newTabWidthKey.equals(event.getProperty()))
+                                       getPreferenceStore().putValue(oldTabWidthKey, getPreferenceStore().getString(newTabWidthKey));
+                       }
+               };
+               getPreferenceStore().addPropertyChangeListener(fPropertyChangeListener);
+               
+               /*
+                * Backward compatibility for the refactoring preference key. 
+                */
+//             getPreferenceStore().setValue(
+//                     PreferenceConstants.REFACTOR_ERROR_PAGE_SEVERITY_THRESHOLD, 
+//                     RefactoringCore.getConditionCheckingFailedSeverity());
+       }
+       
+       /**
+        * Uninstalls backwards compatibility for the preference store.
+        */
+       private void uninstallPreferenceStoreBackwardsCompatibility() {
+               JFaceResources.getFontRegistry().removeListener(fFontPropertyChangeListener);
+               getPreferenceStore().removePropertyChangeListener(fPropertyChangeListener);
+       }
+  /* (non - Javadoc)
+        * Method declared in Plugin
+        */
+       public void start(BundleContext context) throws Exception {
+               super.start(context);
+               
+               JavaCore.start(this, context);
+               
+               registerAdapters();
+               
+                //  externalTools.startUp();
+           getStandardDisplay().asyncExec(new Runnable() {
+             public void run() {
+               //initialize the variable context manager
+               VariableContextManager.getDefault();
+             }
+           });
+           
+//             if (USE_WORKING_COPY_OWNERS) {
+                       WorkingCopyOwner.setPrimaryBufferProvider(new WorkingCopyOwner() {
+                               public IBuffer createBuffer(ICompilationUnit workingCopy) {
+                                       ICompilationUnit original= workingCopy.getPrimary();
+                                       IResource resource= original.getResource();
+                                       if (resource instanceof IFile)
+                                               return new DocumentAdapter(workingCopy, (IFile) resource);
+                                       return DocumentAdapter.NULL;
+                               }
+                       });
+//             }
+       
+               installPreferenceStoreBackwardsCompatibility();
+               
+//             AllTypesCache.initialize();
+               
+               // Initialize AST provider
+//             getASTProvider();
+       }
+//  public void startup() throws CoreException {
+//    super.startup();
+//    // begin JavaCore.startup();
+//    JavaModelManager manager = JavaModelManager.getJavaModelManager();
+//    try {
+//      manager.configurePluginDebugOptions();
+//      // request state folder creation (workaround 19885)
+//      //             JavaCore.getPlugin().getStateLocation();
+//      getStateLocation();
+//      // retrieve variable values
+//      //             JavaCore.getPlugin().getPluginPreferences().addPropertyChangeListener(new
+//      // JavaModelManager.PluginPreferencesListener());
+//      getPluginPreferences().addPropertyChangeListener(
+//          new JavaModelManager.PluginPreferencesListener());
+//      //     TODO khartlage temp-del
+//      //             manager.loadVariablesAndContainers();
+//      final IWorkspace workspace = ResourcesPlugin.getWorkspace();
+//             workspace.addResourceChangeListener(
+//                     manager.deltaState,
+//                     IResourceChangeEvent.PRE_BUILD
+//                             | IResourceChangeEvent.POST_BUILD
+//                             | IResourceChangeEvent.POST_CHANGE
+//                             | IResourceChangeEvent.PRE_DELETE
+//                             | IResourceChangeEvent.PRE_CLOSE);
+//      //             startIndexing();
+//      workspace.addSaveParticipant(PHPeclipsePlugin.getDefault(), manager);
+//    } catch (CoreException e) {
+//    } catch (RuntimeException e) {
+//      manager.shutdown();
+//      throw e;
+//    }
+//    //        end JavaCore.startup();
+//    IAdapterManager platformManager = Platform.getAdapterManager();
+//    platformManager.registerAdapters(new PHPElementAdapterFactory(),
+//        PHPElement.class);
+//    platformManager.registerAdapters(new ResourceAdapterFactory(),
+//        IResource.class);
+//    //  externalTools.startUp();
+//    getStandardDisplay().asyncExec(new Runnable() {
+//      public void run() {
+//        //initialize the variable context manager
+//        VariableContextManager.getDefault();
+//      }
+//    });
+//  }
+       
+       
+       private void registerAdapters() {
+               fJavaElementAdapterFactory= new JavaElementAdapterFactory();
+//             fMarkerAdapterFactory= new MarkerAdapterFactory();
+//             fEditorInputAdapterFactory= new EditorInputAdapterFactory();
+               fResourceAdapterFactory= new ResourceAdapterFactory();
+//             fLogicalPackageAdapterFactory= new LogicalPackageAdapterFactory();
+
+               IAdapterManager manager= Platform.getAdapterManager();          
+               manager.registerAdapters(fJavaElementAdapterFactory, IJavaElement.class);
+//             manager.registerAdapters(fMarkerAdapterFactory, IMarker.class);
+//             manager.registerAdapters(fEditorInputAdapterFactory, IEditorInput.class);
+               manager.registerAdapters(fResourceAdapterFactory, IResource.class);
+//             manager.registerAdapters(fLogicalPackageAdapterFactory, LogicalPackage.class);
+       }
+       
+       private void unregisterAdapters() {
+               IAdapterManager manager= Platform.getAdapterManager();
+               manager.unregisterAdapters(fJavaElementAdapterFactory);
+//             manager.unregisterAdapters(fMarkerAdapterFactory);
+//             manager.unregisterAdapters(fEditorInputAdapterFactory);
+               manager.unregisterAdapters(fResourceAdapterFactory);
+//             manager.unregisterAdapters(fLogicalPackageAdapterFactory);
+       }
+       
+       /**
+        * Returns a combined preference store, this store is read-only.
+        * 
+        * @return the combined preference store
+        * 
+        * @since 3.0
+        */
+       public IPreferenceStore getCombinedPreferenceStore() {
+               if (fCombinedPreferenceStore == null) {
+                       IPreferenceStore generalTextStore= EditorsUI.getPreferenceStore(); 
+                       fCombinedPreferenceStore= new ChainedPreferenceStore(new IPreferenceStore[] { getPreferenceStore(), new PreferencesAdapter(JavaCore.getPlugin().getPluginPreferences()), generalTextStore });
+               }
+               return fCombinedPreferenceStore;
+       }
+       
+       public synchronized IBufferFactory getBufferFactory() {
+               if (fBufferFactory == null)
+                       fBufferFactory= new CustomBufferFactory();
+               return fBufferFactory;
+       }
+       /**
+        * Returns the registry of the extensions to the <code>org.eclipse.jdt.ui.javaFoldingStructureProvider</code>
+        * extension point.
+        * 
+        * @return the registry of contributed <code>IJavaFoldingStructureProvider</code>
+        * @since 3.0
+        */
+       public synchronized JavaFoldingStructureProviderRegistry getFoldingStructureProviderRegistry() {
+               if (fFoldingStructureProviderRegistry == null)
+                       fFoldingStructureProviderRegistry= new JavaFoldingStructureProviderRegistry();
+               return fFoldingStructureProviderRegistry;
+       }
 }
\ No newline at end of file