intial source from http://www.sf.net/projects/wdte
[phpeclipse.git] / net.sourceforge.phpeclipse.ui / src / net / sourceforge / phpeclipse / ui / views / outline / ModelBasedOutlinePage.java
diff --git a/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpeclipse/ui/views/outline/ModelBasedOutlinePage.java b/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpeclipse/ui/views/outline/ModelBasedOutlinePage.java
new file mode 100644 (file)
index 0000000..8f9fda4
--- /dev/null
@@ -0,0 +1,289 @@
+/*
+ * Copyright (c) 2004 Christopher Lenz and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors:
+ *     Christopher Lenz - initial implementation
+ * 
+ * $Id: ModelBasedOutlinePage.java,v 1.1 2004-09-02 18:26:28 jsurfer Exp $
+ */
+
+package net.sourceforge.phpeclipse.ui.views.outline;
+
+import java.util.List;
+
+import net.sourceforge.phpeclipse.core.model.ISourceModel;
+import net.sourceforge.phpeclipse.core.model.ISourceReference;
+import net.sourceforge.phpeclipse.ui.editor.StructuredTextEditor;
+import net.sourceforge.phpeclipse.ui.internal.WebUIMessages;
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.texteditor.IUpdate;
+import org.eclipse.ui.texteditor.ResourceAction;
+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
+
+/**
+ * 
+ */
+public class ModelBasedOutlinePage extends ContentOutlinePage
+       implements IUpdate {
+
+       // Inner Classes -----------------------------------------------------------
+
+       public class ContentProvider implements ITreeContentProvider {
+
+               /*
+                * ITreeContentProvider#getChildren(Object)
+                */
+               public Object[] getChildren(Object parentElement) {
+                       if (parentElement instanceof ISourceReference) {
+                               return model.getChildren((ISourceReference) parentElement);
+                       }
+                       return new Object[0];
+               }
+
+               /*
+                * @see ITreeContentProvider#getParent(Object)
+                */
+               public Object getParent(Object element) {
+                       if (element instanceof ISourceReference) {
+                               return model.getParent((ISourceReference) element);
+                       }
+                       return null;
+               }
+
+               /*
+                * @see ITreeContentProvider#hasChildren(Object)
+                */
+               public boolean hasChildren(Object element) {
+                       return getChildren(element).length > 0;
+               }
+
+               /*
+                * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(Object)
+                */
+               public Object[] getElements(Object inputElement) {
+                       return model.getElements();
+               }
+
+               /* 
+                * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+                */
+               public void dispose() {
+               }
+
+               /*
+                * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(Viewer, Object, Object)
+                */
+               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+                       if (oldInput != newInput) {
+                               if (newInput instanceof ISourceModel) {
+                                       model = (ISourceModel) newInput;
+                               }          
+                       }
+               }
+
+       }
+
+       /**
+        * This action toggles whether this outline page links its selection
+        * to the active editor.
+        */
+       private class ToggleLinkingAction extends ResourceAction {
+               
+               /**
+                * Constructs a new action.
+                */
+               public ToggleLinkingAction() {
+                       super(WebUIMessages.getResourceBundle(),
+                               "OutlinePage.linkWithEditor."); //$NON-NLS-1$
+                       if ((preferenceStore != null)
+                        && (linkWithEditorPreferenceKey != null)) {
+                               boolean checked = preferenceStore.getBoolean(
+                                               linkWithEditorPreferenceKey);
+                               valueChanged(checked, false);
+                       } else {
+                               setEnabled(false);
+                       }
+               }
+
+               /*
+                * @see org.eclipse.jface.action.Action#run()
+                */
+               public void run() {
+                       if ((preferenceStore != null)
+                        && (linkWithEditorPreferenceKey != null)) {
+                               valueChanged(isChecked(), true);
+                       }
+               }
+       
+               // Private Methods -----------------------------------------------------
+
+               /**
+                * Updates whether the outline page is linked to the active editor.
+                * 
+                * @param checked Whether linking is enabled
+                * @param store Whether the new state should be written back as a 
+                *        preference
+                */
+               private void valueChanged(final boolean checked, boolean store) {
+                       setChecked(checked);
+                       BusyIndicator.showWhile(getTreeViewer().getControl().getDisplay(),
+                               new Runnable() {
+                                       public void run() {
+                                               editor.synchronizeOutlinePage();
+                                       }
+                               });
+                       if (store) {
+                               preferenceStore.setValue(
+                                       linkWithEditorPreferenceKey, checked);
+                       }
+               }
+
+       }
+
+       // Instance Variables ------------------------------------------------------
+
+       /**
+        * The associated editor.
+        */
+       private StructuredTextEditor editor;
+
+       /**
+        * The structured source model.
+        */
+       private ISourceModel model;
+
+       /**
+        * The preference store.
+        */
+       private IPreferenceStore preferenceStore;
+
+       /**
+        * The preference key which specifies whether the outline page is linked to
+        * the active editor.
+        */
+       private String linkWithEditorPreferenceKey;
+
+       // Constructors ------------------------------------------------------------
+
+       /**
+        * Constructor.
+        * 
+        * @param editor The associated structured text editor
+        */
+       public ModelBasedOutlinePage(StructuredTextEditor editor) {
+               this.editor = editor;
+       }
+
+       // ContentOutlinePage Implementation ---------------------------------------
+
+       /*
+        * @see org.eclipse.ui.part.IPage#createControl(Composite)
+        */
+       public void createControl(Composite parent) {
+               super.createControl(parent);
+               TreeViewer viewer = getTreeViewer();
+               viewer.setContentProvider(new ContentProvider());
+       }
+
+       /*
+        * @see org.eclipse.ui.part.IPage#dispose()
+        */
+       public void dispose() {
+               if (editor != null) {
+                       editor.outlinePageClosed();
+                       editor = null;
+               }
+               super.dispose();
+       }
+
+       /*
+        * @see org.eclipse.ui.part.Page#makeContributions(IMenuManager, IToolBarManager, IStatusLineManager)
+        */
+       public void makeContributions(IMenuManager menuManager,
+               IToolBarManager toolBarManager, IStatusLineManager statusLineManager) {
+               if (toolBarManager != null) {
+                       toolBarManager.add(new ToggleLinkingAction());
+               }
+               super.makeContributions(menuManager, toolBarManager, statusLineManager);
+       }
+
+       // IUpdate Implementation --------------------------------------------------
+
+       /**
+        * @see IUpdate#update()
+        */
+       public void update() {
+               ISourceModel model = editor.getSourceModel();
+               if (model != null) {
+                       TreeViewer viewer = getTreeViewer();
+                       if (viewer != null) {
+                               Control control = viewer.getControl();
+                               if ((control != null) && !control.isDisposed()) {
+                                       control.setRedraw(false);
+                                       viewer.setInput(model);
+                                       viewer.expandAll();
+                                       control.setRedraw(true);
+                               }
+                       }
+               }
+       }
+
+       // Public Methods ----------------------------------------------------------
+
+       /**
+        * Selects a specific element in the outline page.
+        * 
+        * @param element the element to select
+        */
+       public void select(ISourceReference element) {
+               TreeViewer viewer = getTreeViewer();
+               if (viewer != null) {
+                       ISelection selection = viewer.getSelection();
+                       if (selection instanceof IStructuredSelection) {
+                               IStructuredSelection structuredSelection =
+                                       (IStructuredSelection) selection;
+                               List elements = structuredSelection.toList();
+                               if (!elements.contains(element)) {
+                                       if (element == null) {
+                                               selection = StructuredSelection.EMPTY;
+                                       } else {
+                                               selection = new StructuredSelection(element);
+                                       }
+                                       viewer.setSelection(selection, true);
+                               }
+                       }
+               }
+       }
+
+       // Protected Methods -------------------------------------------------------
+
+       protected final StructuredTextEditor getEditor() {
+               return editor;
+       }
+
+       protected final void setPreferenceStore(IPreferenceStore store) {
+               preferenceStore = store;
+       }
+
+       protected final void setLinkWithEditorPreferenceKey(String key) {
+               linkWithEditorPreferenceKey = key;
+       }
+
+}