--- /dev/null
+/*
+ * Copyright (c) 2003-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 API and implementation
+ *
+ * $Id: CssOutlinePage.java,v 1.1 2004-09-02 18:11:49 jsurfer Exp $
+ */
+
+package net.sourceforge.phpeclipse.css.ui.internal.outline;
+
+import java.util.List;
+
+import net.sourceforge.phpeclipse.core.model.ISourceReference;
+import net.sourceforge.phpeclipse.css.core.model.IAtRule;
+import net.sourceforge.phpeclipse.css.core.model.IStyleSheet;
+import net.sourceforge.phpeclipse.css.ui.CssUI;
+import net.sourceforge.phpeclipse.css.ui.internal.CssDocumentProvider;
+import net.sourceforge.phpeclipse.css.ui.internal.CssUIMessages;
+import net.sourceforge.phpeclipse.css.ui.internal.CssUIPreferences;
+import net.sourceforge.phpeclipse.css.ui.internal.editor.CssEditor;
+import net.sourceforge.phpeclipse.css.ui.internal.editor.ShowSelectedElementOnlyAction;
+import net.sourceforge.phpeclipse.ui.views.outline.ProblemsLabelDecorator;
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.part.IPageSite;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
+import org.eclipse.ui.texteditor.ResourceAction;
+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
+
+/**
+ * Implements the outline page associated with the CSS editor.
+ */
+public class CssOutlinePage extends ContentOutlinePage {
+
+ // Inner Classes -----------------------------------------------------------
+
+ /**
+ * Action that activates or deactivates the lexical sorting of elements in
+ * the outline tree viewer.
+ */
+ private class ToggleLexicalSortingAction extends ResourceAction {
+
+ // Constants -----------------------------------------------------------
+
+ private static final int CATEGORY_AT_RULE = 0;
+ private static final int CATEGORY_STYLE_RULE = 1;
+
+ // Instance Variables --------------------------------------------------
+
+ /**
+ * The viewer sorter. At-rules are displayed before style rules,
+ * otherwise the default lexical sorting applies.
+ */
+ private final ViewerSorter sorter = new ViewerSorter() {
+ public int category(Object element) {
+ if (element instanceof IAtRule) {
+ return CATEGORY_AT_RULE;
+ } else {
+ return CATEGORY_STYLE_RULE;
+ }
+ }
+ };
+
+ // Constructors --------------------------------------------------------
+
+ /**
+ * Constructor.
+ */
+ public ToggleLexicalSortingAction() {
+ super(CssUIMessages.getResourceBundle(),
+ "CssOutlinePage.sort."); //$NON-NLS-1$
+ CssUI plugin = CssUI.getDefault();
+ boolean checked = plugin.getPreferenceStore().getBoolean(
+ CssUIPreferences.OUTLINE_SORT_LEXICALLY); //$NON-NLS-1$
+ valueChanged(checked, false);
+ }
+
+ // Action Implementation -----------------------------------------------
+
+ /*
+ * @see org.eclipse.jface.action.Action#run()
+ */
+ public void run() {
+ valueChanged(isChecked(), true);
+ }
+
+ // Private Methods -----------------------------------------------------
+
+ /**
+ * Updates the sorting of the outline.
+ *
+ * @param checked Whether lexical sorting 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() {
+ getTreeViewer().setSorter(checked ? sorter : null);
+ }
+ });
+ if (store) {
+ CssUI plugin = CssUI.getDefault();
+ plugin.getPreferenceStore().setValue(
+ CssUIPreferences.OUTLINE_SORT_LEXICALLY, checked);
+ }
+ }
+
+ }
+
+ /**
+ * This action toggles whether this Java Outline page links its selection
+ * to the active editor.
+ */
+ private class ToggleLinkingAction extends ResourceAction {
+
+ /**
+ * Constructs a new action.
+ */
+ public ToggleLinkingAction() {
+ super(CssUIMessages.getResourceBundle(),
+ "CssOutlinePage.linkWithEditor."); //$NON-NLS-1$
+ CssUI plugin = CssUI.getDefault();
+ boolean checked = plugin.getPreferenceStore().getBoolean(
+ CssUIPreferences.OUTLINE_LINK_WITH_EDITOR); //$NON-NLS-1$
+ valueChanged(checked, false);
+ }
+
+ /*
+ * @see org.eclipse.jface.action.Action#run()
+ */
+ public void run() {
+ valueChanged(isChecked(), true);
+ }
+
+ // Private Methods -----------------------------------------------------
+
+ /**
+ * Updates the sorting of the outline.
+ *
+ * @param checked Whether lexical sorting 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) {
+ CssUI plugin = CssUI.getDefault();
+ plugin.getPreferenceStore().setValue(
+ CssUIPreferences.OUTLINE_LINK_WITH_EDITOR, checked);
+ }
+ }
+
+ }
+
+ // Instance Variables ------------------------------------------------------
+
+ /**
+ * The associated editor.
+ */
+ private CssEditor editor;
+
+ /**
+ * Toolbar action for showing only the selected element in the editor.
+ */
+ private ShowSelectedElementOnlyAction showSelectedElementOnlyAction =
+ new ShowSelectedElementOnlyAction(); //$NON-NLS-1$
+
+ // Constructors ------------------------------------------------------------
+
+ /**
+ * Constructor.
+ *
+ * @param editor The associated text editor
+ */
+ public CssOutlinePage(CssEditor 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.addDoubleClickListener(new CssOutlineDoubleClickListener(this));
+ viewer.setContentProvider(new CssOutlineContentProvider());
+ viewer.setLabelProvider(new DecoratingLabelProvider(
+ new CssOutlineLabelProvider(),
+ new ProblemsLabelDecorator(editor)));
+ viewer.setInput(getStyleSheet());
+ }
+
+ /*
+ * @see org.eclipse.ui.part.IPage#dispose()
+ */
+ public void dispose() {
+ if (editor != null) {
+ editor.outlinePageClosed();
+ editor = null;
+ }
+ super.dispose();
+ }
+
+ /*
+ * @see org.eclipse.ui.part.IPageBookViewPage#init(org.eclipse.ui.part.IPageSite)
+ */
+ public void init(IPageSite pageSite) {
+ super.init(pageSite);
+ IActionBars bars = pageSite.getActionBars();
+ bars.setGlobalActionHandler(
+ ITextEditorActionDefinitionIds.TOGGLE_SHOW_SELECTED_ELEMENT_ONLY,
+ showSelectedElementOnlyAction);
+ showSelectedElementOnlyAction.setEditor(editor);
+ showSelectedElementOnlyAction.update();
+ }
+
+ /*
+ * @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 ToggleLexicalSortingAction());
+ toolBarManager.add(new ToggleLinkingAction());
+ }
+ super.makeContributions(menuManager, toolBarManager, statusLineManager);
+ }
+
+ // 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);
+ }
+ }
+ }
+ }
+
+ /**
+ * Updates the outline page.
+ */
+ public void update() {
+ IStyleSheet styleSheet = getStyleSheet();
+ if (styleSheet != null) {
+ TreeViewer viewer = getTreeViewer();
+ if (viewer != null) {
+ Control control = viewer.getControl();
+ if ((control != null) && !control.isDisposed()) {
+ control.setRedraw(false);
+ viewer.setInput(styleSheet);
+ viewer.expandAll();
+ control.setRedraw(true);
+ }
+ }
+ }
+ }
+
+ // Private Methods ---------------------------------------------------------
+
+ /**
+ * Returns the parsed model of the style sheet that is loaded into the
+ * associated editor.
+ *
+ * @return the parsed style sheet
+ */
+ private IStyleSheet getStyleSheet() {
+ IDocumentProvider provider = editor.getDocumentProvider();
+ if (provider instanceof CssDocumentProvider) {
+ CssDocumentProvider cssProvider = (CssDocumentProvider) provider;
+ return cssProvider.getStyleSheet(editor.getEditorInput());
+ }
+ return null;
+ }
+
+}