blob: 65d9fec2a8f74b7cf7fe0598ad22450bf4b7bdc3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2004 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.xml.ui.internal.views.contentoutline;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.preference.IPreferenceStore;
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.TreeViewer;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.wst.common.ui.internal.dnd.ObjectTransfer;
import org.eclipse.wst.common.ui.internal.dnd.ViewerDragAdapter;
import org.eclipse.wst.common.ui.internal.dnd.ViewerDropAdapter;
import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
import org.eclipse.wst.sse.ui.internal.IReleasable;
import org.eclipse.wst.sse.ui.internal.provisional.views.contentoutline.StructuredContentOutlineConfiguration;
import org.eclipse.wst.sse.ui.internal.view.events.NodeSelectionChangedEvent;
import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeContentProvider;
import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeLabelProvider;
import org.eclipse.wst.xml.ui.internal.contentoutline.XMLNodeActionManager;
import org.eclipse.wst.xml.ui.internal.dnd.XMLDragAndDropManager;
import org.w3c.dom.Attr;
import org.w3c.dom.Node;
public class XMLContentOutlineConfiguration extends StructuredContentOutlineConfiguration {
private IContentProvider fContentProvider = null;
private ILabelProvider fLabelProvider = null;
private class ActionManagerMenuListener implements IMenuListener, IReleasable {
private XMLNodeActionManager fActionManager;
private TreeViewer fTreeViewer;
public ActionManagerMenuListener(TreeViewer viewer) {
fTreeViewer = viewer;
fActionManager = createNodeActionManager(fTreeViewer);
}
public void menuAboutToShow(IMenuManager manager) {
if (fActionManager != null)
fActionManager.fillContextMenu(manager, fTreeViewer.getSelection());
}
public void release() {
fTreeViewer = null;
fActionManager.setModel(null);
}
}
protected ActionManagerMenuListener fContextMenuFiller = null;
private TransferDragSourceListener[] fTransferDragSourceListeners;
private TransferDropTargetListener[] fTransferDropTargetListeners;
public XMLContentOutlineConfiguration() {
super();
}
protected XMLNodeActionManager createNodeActionManager(TreeViewer treeViewer) {
return new XMLNodeActionManager(getEditor().getModel(), treeViewer);
}
public IContentProvider getContentProvider(TreeViewer viewer) {
if (fContentProvider == null) {
if (getFactory() != null) {
fContentProvider = new JFaceNodeContentProvider((INodeAdapterFactory) getFactory());
} else {
fContentProvider = super.getContentProvider(viewer);
}
}
return fContentProvider;
}
/**
* @see org.eclipse.wst.sse.ui.internal.provisional.views.contentoutline.ContentOutlineConfiguration#getLabelProvider(org.eclipse.jface.viewers.TreeViewer)
*/
public ILabelProvider getLabelProvider(TreeViewer viewer) {
if (fLabelProvider == null) {
if (getFactory() != null) {
fLabelProvider = new JFaceNodeLabelProvider((INodeAdapterFactory) getFactory());
} else {
fLabelProvider = super.getLabelProvider(viewer);
}
}
return fLabelProvider;
}
/**
* @see org.eclipse.wst.sse.ui.internal.provisional.views.contentoutline.ContentOutlineConfiguration#getMenuListener(org.eclipse.jface.viewers.TreeViewer)
*/
public IMenuListener getMenuListener(TreeViewer viewer) {
if (fContextMenuFiller == null) {
fContextMenuFiller = new ActionManagerMenuListener(viewer);
}
return fContextMenuFiller;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getNodes(java.util.List)
*/
public List getNodes(List nodes) {
List filteredNodes = new ArrayList(super.getNodes(nodes));
for (int i = 0; i < filteredNodes.size(); i++) {
Object selectedNode = filteredNodes.get(i);
if (selectedNode instanceof Node) {
Node eachNode = (Node) selectedNode;
// replace attribute node in selection with its parent
if (eachNode.getNodeType() == Node.ATTRIBUTE_NODE)
filteredNodes.set(i, ((Attr) eachNode).getOwnerElement());
// replace TextNode in selection with its parent
else if (eachNode.getNodeType() == Node.TEXT_NODE)
filteredNodes.set(i, eachNode.getParentNode());
}
}
return filteredNodes;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getSelectedNodes(org.eclipse.wst.sse.ui.view.events.NodeSelectionChangedEvent)
*/
public List getSelectedNodes(NodeSelectionChangedEvent event) {
return getNodes(super.getSelectedNodes(event));
}
/**
* @see org.eclipse.wst.sse.ui.internal.provisional.views.contentoutline.ContentOutlineConfiguration#getTransferDragSourceListeners(org.eclipse.jface.viewers.TreeViewer)
*/
public TransferDragSourceListener[] getTransferDragSourceListeners(TreeViewer treeViewer) {
if (fTransferDragSourceListeners == null) {
// emulate the XMLDragAndDropManager
final ViewerDragAdapter dragAdapter = new ViewerDragAdapter(treeViewer);
fTransferDragSourceListeners = new TransferDragSourceListener[]{new TransferDragSourceListener() {
public void dragFinished(DragSourceEvent event) {
dragAdapter.dragFinished(event);
}
public void dragSetData(DragSourceEvent event) {
dragAdapter.dragSetData(event);
}
public void dragStart(DragSourceEvent event) {
dragAdapter.dragStart(event);
}
public Transfer getTransfer() {
return ObjectTransfer.getInstance();
}
}};
}
return fTransferDragSourceListeners;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getTransferDropTargetListeners(org.eclipse.jface.viewers.TreeViewer)
*/
public TransferDropTargetListener[] getTransferDropTargetListeners(TreeViewer treeViewer) {
if (fTransferDropTargetListeners == null) {
// emulate the XMLDragAnDropManager
final ViewerDropAdapter dropAdapter = new ViewerDropAdapter(treeViewer, new XMLDragAndDropManager());
fTransferDropTargetListeners = new TransferDropTargetListener[]{new TransferDropTargetListener() {
public void dragEnter(DropTargetEvent event) {
dropAdapter.dragEnter(event);
}
public void dragLeave(DropTargetEvent event) {
dropAdapter.dragLeave(event);
}
public void dragOperationChanged(DropTargetEvent event) {
dropAdapter.dragOperationChanged(event);
}
public void dragOver(DropTargetEvent event) {
dropAdapter.dragOver(event);
}
public void drop(DropTargetEvent event) {
dropAdapter.drop(event);
}
public void dropAccept(DropTargetEvent event) {
dropAdapter.dropAccept(event);
}
public Transfer getTransfer() {
return ObjectTransfer.getInstance();
}
public boolean isEnabled(DropTargetEvent event) {
return getTransfer().isSupportedType(event.currentDataType);
}
}};
}
return fTransferDropTargetListeners;
}
public void unconfigure(TreeViewer viewer) {
super.unconfigure(viewer);
fTransferDragSourceListeners = null;
fTransferDropTargetListeners = null;
if (fContextMenuFiller != null) {
fContextMenuFiller.release();
fContextMenuFiller = null;
}
// TODO: Add DnD support
// XMLDragAndDropManager.addDragAndDropSupport(fTreeViewer);
}
/* (non-Javadoc)
* @see org.eclipse.wst.sse.ui.views.contentoutline.StructuredContentOutlineConfiguration#getPreferenceStore()
*/
protected IPreferenceStore getPreferenceStore() {
return XMLUIPlugin.getDefault().getPreferenceStore();
}
}