blob: 165339573b2f69abbc7451e7e48e03adc2e8c9f3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2007 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
*******************************************************************************/
package org.eclipse.pde.internal.ui.editor;
import org.eclipse.jface.action.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.pde.internal.ui.parts.StructuredViewerPart;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.forms.widgets.FormToolkit;
public abstract class StructuredViewerSection extends PDESection implements IPDEDragParticipant, IPDEDropParticipant {
protected StructuredViewerPart fViewerPart;
private boolean fDoSelection;
private PDEDragAdapter fDragAdapter;
private PDEDropAdapter fDropAdapter;
/**
* Constructor for StructuredViewerSection.
* @param formPage
*/
public StructuredViewerSection(PDEFormPage formPage, Composite parent, int style, String[] buttonLabels) {
this(formPage, parent, style, true, buttonLabels);
}
/**
* Constructor for StructuredViewerSection.
* @param formPage
*/
public StructuredViewerSection(PDEFormPage formPage, Composite parent, int style, boolean titleBar, String[] buttonLabels) {
super(formPage, parent, style, titleBar);
fViewerPart = createViewerPart(buttonLabels);
fViewerPart.setMinimumSize(50, 50);
FormToolkit toolkit = formPage.getManagedForm().getToolkit();
createClient(getSection(), toolkit);
fDoSelection = true;
}
protected void createViewerPartControl(Composite parent, int style, int span, FormToolkit toolkit) {
fViewerPart.createControl(parent, style, span, toolkit);
MenuManager popupMenuManager = new MenuManager();
IMenuListener listener = new IMenuListener() {
public void menuAboutToShow(IMenuManager mng) {
fillContextMenu(mng);
}
};
popupMenuManager.addMenuListener(listener);
popupMenuManager.setRemoveAllWhenShown(true);
Control control = fViewerPart.getControl();
Menu menu = popupMenuManager.createContextMenu(control);
control.setMenu(menu);
// Initialize drag and drop
if (isDragAndDropEnabled()) {
initializeDragAndDrop();
} else {
fDragAdapter = null;
fDropAdapter = null;
}
}
protected Composite createClientContainer(Composite parent, int span, FormToolkit toolkit) {
Composite container = toolkit.createComposite(parent);
container.setLayout(FormLayoutFactory.createSectionClientGridLayout(false, span));
return container;
}
protected abstract StructuredViewerPart createViewerPart(String[] buttonLabels);
protected void fillContextMenu(IMenuManager manager) {
}
protected void buttonSelected(int index) {
}
protected void doPaste() {
ISelection selection = getViewerSelection();
IStructuredSelection ssel = (IStructuredSelection) selection;
if (ssel.size() > 1)
return;
Object target = ssel.getFirstElement();
Clipboard clipboard = getPage().getPDEEditor().getClipboard();
ModelDataTransfer modelTransfer = ModelDataTransfer.getInstance();
Object[] objects = (Object[]) clipboard.getContents(modelTransfer);
if (objects != null) {
doPaste(target, objects);
}
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.editor.PDESection#canPaste(org.eclipse.swt.dnd.Clipboard)
*/
public boolean canPaste(Clipboard clipboard) {
// TODO: MP: CCP: Checking clipboard data done incorrectly. See Bug 37223
ISelection selection = getViewerSelection();
IStructuredSelection ssel = (IStructuredSelection) selection;
if (ssel.size() > 1)
return false;
Object target = ssel.getFirstElement();
ModelDataTransfer modelTransfer = ModelDataTransfer.getInstance();
Object[] objects = (Object[]) clipboard.getContents(modelTransfer);
if (objects != null && objects.length > 0) {
return canPaste(target, objects);
}
return false;
}
protected ISelection getViewerSelection() {
return fViewerPart.getViewer().getSelection();
}
/**
* @param targetObject
* @param sourceObjects
*/
protected void doPaste(Object targetObject, Object[] sourceObjects) {
// NO-OP
// Children will override to provide fuctionality
}
/**
* @param targetObject
* @param sourceObjects
* @return
*/
protected boolean canPaste(Object targetObject, Object[] sourceObjects) {
return false;
}
public void setFocus() {
fViewerPart.getControl().setFocus();
}
public StructuredViewerPart getStructuredViewerPart() {
return this.fViewerPart;
}
/**
* <p>Given the index of TreeViewer item and the size of the array of its immediate
* siblings, gets the index of the desired new selection as follows:
* <ul><li>if this is the only item, return -1 (meaning select the parent)</li>
* <li>if this is the last item, return the index of the predecessor</li>
* <li>otherwise, return the index of the successor</li></p>
*
* @param thisIndex
* the item's index
* @param length
* the array length
* @return
* new selection index or -1 for parent
*/
protected int getNewSelectionIndex(int thisIndex, int length) {
if (thisIndex == length - 1)
return thisIndex - 1;
return thisIndex + 1;
}
protected int getArrayIndex(Object[] array, Object object) {
for (int i = 0; i < array.length; i++) {
if (array[i].equals(object))
return i;
}
return -1;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.editor.IPDEDragParticipant#canDragCopy(java.lang.Object[])
*/
public boolean canDragCopy(Object[] sourceObjects) {
return false;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.editor.IPDEDragParticipant#canDragLink(java.lang.Object[])
*/
public boolean canDragLink(Object[] sourceObjects) {
return false;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.editor.IPDEDragParticipant#canDragMove(java.lang.Object[])
*/
public boolean canDragMove(Object[] sourceObjects) {
return false;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.editor.IPDEDropParticipant#canDropCopy(java.lang.Object, java.lang.Object[], int)
*/
public boolean canDropCopy(Object targetObject, Object[] sourceObjects, int targetLocation) {
return false;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.editor.IPDEDropParticipant#canDropLink(java.lang.Object, java.lang.Object[], int)
*/
public boolean canDropLink(Object targetObject, Object[] sourceObjects, int targetLocation) {
return false;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.editor.IPDEDropParticipant#canDropMove(java.lang.Object, java.lang.Object[], int)
*/
public boolean canDropMove(Object targetObject, Object[] sourceObjects, int targetLocation) {
return false;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.editor.IPDEDropParticipant#doDropCopy(java.lang.Object, java.lang.Object[], int)
*/
public void doDropCopy(Object targetObject, Object[] sourceObjects, int targetLocation) {
// NO-OP
// Sub-classes to override
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.editor.IPDEDropParticipant#doDropLink(java.lang.Object, java.lang.Object[], int)
*/
public void doDropLink(Object targetObject, Object[] sourceObjects, int targetLocation) {
// NO-OP
// Sub-classes to override
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.editor.IPDEDropParticipant#doDropMove(java.lang.Object, java.lang.Object[], int)
*/
public void doDropMove(Object targetObject, Object[] sourceObjects, int targetLocation) {
// NO-OP
// Sub-classes to override
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.editor.IPDEDragParticipant#doDragRemove(java.lang.Object[])
*/
public void doDragRemove(Object[] sourceObjects) {
// NO-OP
// Sub-classes to override
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.editor.IPDEDragParticipant#getSupportedDNDOperations()
*/
public int getSupportedDNDOperations() {
return DND.DROP_MOVE;
}
/**
*
*/
protected void initializeDragAndDrop() {
// Ensure the model is editable and we have a viewer part
if (isEditable() == false) {
return;
} else if (fViewerPart == null) {
return;
}
StructuredViewer viewer = fViewerPart.getViewer();
// Ensure we have a viewer
if (viewer == null) {
return;
}
// Create drag adapter
fDragAdapter = new PDEDragAdapter(this);
// Create drop adapter
fDropAdapter = new PDEDropAdapter(viewer, this, fDragAdapter);
// Add drag support to viewer
int dragOperations = getSupportedDNDOperations();
viewer.addDragSupport(dragOperations, getDragTransfers(), fDragAdapter);
// Add drop support to viewer
int dropOperations = dragOperations | DND.DROP_DEFAULT;
viewer.addDropSupport(dropOperations, getDropTransfers(), fDropAdapter);
}
/**
* @return The original source objects (dragged)
*/
protected Object[] getDragSourceObjects() {
// Verify DND is enabled
if (isDragAndDropEnabled() == false) {
return null;
} else if (fDragAdapter == null) {
return null;
}
return fDragAdapter.getSourceObjects();
}
/**
* @return
*/
protected Transfer[] getDragTransfers() {
return new Transfer[] {ModelDataTransfer.getInstance(), TextTransfer.getInstance()};
}
/**
* @return
*/
protected Transfer[] getDropTransfers() {
return getDragTransfers();
}
/**
* @return
*/
protected boolean isDragAndDropEnabled() {
return false;
}
/**
* @param select
*/
protected void doSelect(boolean select) {
fDoSelection = select;
}
/**
* @return
*/
protected boolean canSelect() {
return fDoSelection;
}
}