blob: 07f0d629f55b7ed6e98898785a977a03ff3e7b34 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2005 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$
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) {
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;
}
/**
* 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) {
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;
}
}
}