--- /dev/null
+/*
+ * 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;
+ }
+
+}