alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

/*******************************************************************************
 * 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>
  • if this is the only item, return -1 (meaning select the parent)
  • * <li>if this is the last item, return the index of the predecessor * <li>otherwise, return the index of the successor

    * * @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; } }
    ... this post is sponsored by my books ...

    #1 New Release!

    FP Best Seller

     

    new blog posts

     

    Copyright 1998-2021 Alvin Alexander, alvinalexander.com
    All Rights Reserved.

    A percentage of advertising revenue from
    pages under the /java/jwarehouse URI on this website is
    paid back to open source projects.