/*******************************************************************************
* Copyright (c) 2001, 2011 IBM Corporation and others. All rights reserved. This program and the
* accompanying materials are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html Contributors: IBM Corporation - initial API and
* implementation Jens Lukowski/Innoopract - initial renaming/restructuring
*******************************************************************************/
package org.eclipse.wst.sse.ui.views.contentoutline;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.TransferDragSourceListener;
import org.eclipse.jface.util.TransferDropTargetListener;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
import org.eclipse.wst.sse.ui.internal.contentoutline.PropertyChangeUpdateAction;
import org.eclipse.wst.sse.ui.internal.contentoutline.PropertyChangeUpdateActionContributionItem;
import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImageHelper;
import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImages;
/**
* Basic Configuration class for Outline Pages
*
* @since 1.0
*/
public abstract class ContentOutlineConfiguration {
/**
* Add a collapse action to help with navigation.
*/
private class CollapseTreeAction extends Action {
private TreeViewer fTreeViewer = null;
public CollapseTreeAction(TreeViewer viewer) {
super(SSEUIMessages.ContentOutlineConfiguration_0, AS_PUSH_BUTTON); //$NON-NLS-1$
setImageDescriptor(COLLAPSE_E);
setDisabledImageDescriptor(COLLAPSE_D);
setToolTipText(getText());
fTreeViewer = viewer;
}
public void run() {
super.run();
fTreeViewer.collapseAll();
}
}
/**
* Toggles whether incoming selection notification affects us
*/
private class ToggleLinkAction extends PropertyChangeUpdateAction {
public ToggleLinkAction(IPreferenceStore store, String preference) {
super(SSEUIMessages.ContentOutlineConfiguration_1, store, preference, true); //$NON-NLS-1$
setToolTipText(getText());
setDisabledImageDescriptor(SYNCED_D);
setImageDescriptor(SYNCED_E);
update();
}
public void update() {
super.update();
setLinkWithEditor(isChecked());
}
}
ImageDescriptor COLLAPSE_D = EditorPluginImageHelper.getInstance().getImageDescriptor(
EditorPluginImages.IMG_DLCL_COLLAPSEALL);
ImageDescriptor COLLAPSE_E = EditorPluginImageHelper.getInstance().getImageDescriptor(
EditorPluginImages.IMG_ELCL_COLLAPSEALL);
private boolean fIsLinkWithEditor = false;
private ILabelProvider fLabelProvider;
private IContributionItem[] fMenuContributions = null;
private IContributionItem[] fToolbarContributions = null;
private final String OUTLINE_LINK_PREF = "outline-link-editor"; //$NON-NLS-1$
private static final String OUTLINE_FILTER_PREF = "org.eclipse.wst.sse.ui.OutlinePage"; //$NON-NLS-1$
ImageDescriptor SYNCED_D = EditorPluginImageHelper.getInstance().getImageDescriptor(
EditorPluginImages.IMG_DLCL_SYNCED);
ImageDescriptor SYNCED_E = EditorPluginImageHelper.getInstance().getImageDescriptor(
EditorPluginImages.IMG_ELCL_SYNCED);
/**
* Create new instance of ContentOutlineConfiguration
*/
public ContentOutlineConfiguration() {
// Must have empty constructor to createExecutableExtension
super();
}
/**
* Creates the contributions for the view's local menu. Subclasses should merge their
* contributions with these.
*
* @param viewer the TreeViewer associated with this configuration
* @return menu contributions
*/
protected IContributionItem[] createMenuContributions(TreeViewer viewer) {
IContributionItem toggleLinkItem = new PropertyChangeUpdateActionContributionItem(
new ToggleLinkAction(getPreferenceStore(), OUTLINE_LINK_PREF));
IContributionItem[] items = new IContributionItem[] {toggleLinkItem};
return items;
}
/**
* Creates the toolbar contributions. Subclasses should merge their contributions with these.
*
* @param viewer the TreeViewer associated with this configuration
* @return toolbar contributions
*/
protected IContributionItem[] createToolbarContributions(TreeViewer viewer) {
IContributionItem collapseAllItem = new ActionContributionItem(new CollapseTreeAction(viewer));
IContributionItem[] items = new IContributionItem[] {collapseAllItem};
return items;
}
/**
* Returns the ContentProvider to use with the given viewer.
*
* @param viewer the TreeViewer associated with this configuration
* @return the IContentProvider to use with this viewer
*/
public abstract IContentProvider getContentProvider(TreeViewer viewer);
/**
* Returns an array of KeyListeners to attach to the given viewer's control or null.
*
* @param viewer the TreeViewer associated with this configuration
* @return an array of KeyListeners to attach to the TreeViewer's Control, or null. The listeners
* should adhere to the KeyEvent.doit field to ensure proper behaviors. Ordering of the
* event notifications is dependent on the Control in the TreeViewer.
*/
public KeyListener[] getKeyListeners(TreeViewer viewer) {
return null;
}
/**
* Returns the LabelProvider for the items within the given viewer.
*
* @param viewer the TreeViewer associated with this configuration
* @return the ILabelProvider for items within the viewer
*/
public ILabelProvider getLabelProvider(TreeViewer viewer) {
if (fLabelProvider == null)
fLabelProvider = new LabelProvider();
return fLabelProvider;
}
/**
* Returns the menu contribution items for the local menu in the outline.
*
* @param viewer the TreeViewer associated with this configuration
* @return IContributionItem[] for the local menu
*/
public final IContributionItem[] getMenuContributions(TreeViewer viewer) {
if (fMenuContributions == null
&& (viewer.getControl() != null && !viewer.getControl().isDisposed())) {
fMenuContributions = createMenuContributions(viewer);
}
return fMenuContributions;
}
/**
* Returns the menu listener to notify when the given viewer's context menu is about to be shown
* or null.
*
* @param viewer the TreeViewer associated with this configuration
* @return the IMenuListener to notify when the viewer's context menu is about to be shown, or
* null
*/
public IMenuListener getMenuListener(TreeViewer viewer) {
return null;
}
/**
* Returns the PreferenceStore to use for this configuration.
*
* @return the preference store in which to remember preferences (such as the link-with-editor
* toggle state)
*/
protected IPreferenceStore getPreferenceStore() {
return SSEUIPlugin.getInstance().getPreferenceStore();
}
/**
* Returns the (filtered) selection from the given selection.
*
* @param selection model selection
* @param viewer the TreeViewer associated with this configuration
* @return The (filtered) selection from this event. Uses include mapping model selection onto
* elements provided by the content provider. Should only return elements that will be
* shown in the Tree Control.
*/
public ISelection getSelection(TreeViewer viewer, ISelection selection) {
return selection;
}
/**
* @since 2.0
* @param treeViewer
* @return a label provider providing the status line contents
*/
public ILabelProvider getStatusLineLabelProvider(TreeViewer treeViewer) {
return null;
}
/**
* Returns contribution items for the local toolbar in the outline.
*
* @param viewer the TreeViewer associated with this configuration
* @return IContributionItem[] for the local toolbar
*/
public final IContributionItem[] getToolbarContributions(TreeViewer viewer) {
if (fToolbarContributions == null
&& (viewer.getControl() != null && !viewer.getControl().isDisposed())) {
fToolbarContributions = createToolbarContributions(viewer);
}
return fToolbarContributions;
}
/**
* Adopted since you can't easily removeDragSupport from StructuredViewers.
*
* @param treeViewer the TreeViewer associated with this configuration
* @return an array of TransferDragSourceListeners
*/
public TransferDragSourceListener[] getTransferDragSourceListeners(TreeViewer treeViewer) {
return new TransferDragSourceListener[0];
}
/**
* Adopted since you can't easily removeDropSupport from StructuredViewers.
*
* @param treeViewer the TreeViewer associated with this configuration
* @return an array of TransferDropTargetListeners
*/
public TransferDropTargetListener[] getTransferDropTargetListeners(TreeViewer treeViewer) {
return new TransferDropTargetListener[0];
}
/**
* Returns true if node selection changes affect selection in the TreeViewer.
*
* @param treeViewer the TreeViewer associated with this configuration
* @return true if outline is currently linked to selection in editor, false otherwise
*/
public boolean isLinkedWithEditor(TreeViewer treeViewer) {
return fIsLinkWithEditor;
}
/**
* Sets whether or not outline view should be linked with selection in editor.
*
* @param isLinkWithEditor The isLinkWithEditor to set.
*/
void setLinkWithEditor(boolean isLinkWithEditor) {
fIsLinkWithEditor = isLinkWithEditor;
}
/**
* General hook for resource releasing and listener removal when configurations change or the
* viewer is disposed of. This implementation stops of any remaining
* PropertyChangeUpdateActionContributionItem from preference listening.
*
* @param viewer the TreeViewer associated with this configuration
*/
public void unconfigure(TreeViewer viewer) {
if (fToolbarContributions != null) {
for (int i = 0; i < fToolbarContributions.length; i++) {
if (fToolbarContributions[i] instanceof PropertyChangeUpdateActionContributionItem) {
((PropertyChangeUpdateActionContributionItem) fToolbarContributions[i]).disconnect();
}
}
fToolbarContributions = null;
}
if (fMenuContributions != null) {
for (int i = 0; i < fMenuContributions.length; i++) {
if (fMenuContributions[i] instanceof PropertyChangeUpdateActionContributionItem) {
((PropertyChangeUpdateActionContributionItem) fMenuContributions[i]).disconnect();
}
}
fMenuContributions = null;
}
}
/**
* Provides the target used when associating filters to the outline
*
* @return The target id used when associating filters to the outline
*/
protected String getOutlineFilterTarget() {
return OUTLINE_FILTER_PREF;
}
/**
* Returns the content outline filter processor for this configuration
*
* @param viewer the {@link TreeViewer} that is associated with the filter
* @return A {@link ContentOutlineFilterProcessor} to filter nodes in the outline
*/
public ContentOutlineFilterProcessor getOutlineFilterProcessor(TreeViewer viewer) {
return new ContentOutlineFilterProcessor(getPreferenceStore(), getOutlineFilterTarget(), viewer);
}
}