/******************************************************************************* * Copyright (c) 2000, 2010 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.gef.editparts; import java.util.Iterator; import java.util.List; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.swt.widgets.Widget; import org.eclipse.gef.DragTracker; import org.eclipse.gef.EditPart; import org.eclipse.gef.Request; import org.eclipse.gef.TreeEditPart; /** * Default implementation for {@link TreeEditPart}s used in GEF * {@link org.eclipse.gef.ui.parts.TreeViewer}s. * <P> * This is an implementation class, and the documentation here is targeted at * <em>subclassing</em> this class. Callers of public API should refer to the * interface's documentation. */ public abstract class AbstractTreeEditPart extends AbstractEditPart implements TreeEditPart { /** * Either a Tree or TreeItem */ protected Widget widget; private boolean expanded; /** * Constructs a new EditPart with the specified model. * * @param model * the model */ public AbstractTreeEditPart(Object model) { setModel(model); } /** * Default constructor */ public AbstractTreeEditPart() { } /** * Implemented to assign the child its * {@link TreeEditPart#setWidget(Widget) widget}. Subclasses should not call * or override this method. * * @see AbstractEditPart#addChildVisual(EditPart, int) */ protected void addChildVisual(EditPart childEditPart, int index) { Widget widget = getWidget(); TreeItem item; if (widget instanceof Tree) item = new TreeItem((Tree) widget, 0, index); else item = new TreeItem((TreeItem) widget, 0, index); ((TreeEditPart) childEditPart).setWidget(item); } /** * Convenience method that returns <code>true</code> if the widget is a * TreeItem and is safe to use. * * @return <code>true</code> if the widget is a <code>TreeItem</code> and is * not disposed */ protected final boolean checkTreeItem() { return !(widget == null || widget.isDisposed() || widget instanceof Tree); } /** * Override this method to install the EditPolicies for your EditPart. * * @see AbstractEditPart#createEditPolicies() */ protected void createEditPolicies() { } /** * @see EditPart#getDragTracker(Request) */ public DragTracker getDragTracker(Request req) { return null; } /** * Override this method to return the <code>Image</code> for this EditPart's * {@link #widget}. This method is called from {@link #refreshVisuals()}. * * @return the Image to be displayed in the TreeItem */ protected Image getImage() { return null; } /** * Override this method to return the String to be used in this EditPart's * {@link #widget}. This method is called from {@link #refreshVisuals()}. * * @return the String to be displayed by the TreeItem */ protected String getText() { return getClass().getName(); } /** * @see TreeEditPart#getWidget() */ public Widget getWidget() { return widget; } /** * By default, this method will apply an <code>Image</code> and * <code>String</code> to the widget if it is a <code>TreeItem</code>. * Subclasses should override {@link #getImage()} and {@link #getText()} to * provide the <code>Image</code> and <code>String</code> used. * <P> * Subclasses might extend this method if they also want to change the * TreeItem's foreground or background color. * * @see AbstractEditPart#refreshVisuals() */ protected void refreshVisuals() { setWidgetImage(getImage()); setWidgetText(getText()); } /** * Disposes the child's <code>widget</code> and sets it to <code>null</code> * . * * @see AbstractEditPart#removeChildVisual(EditPart) */ protected void removeChildVisual(EditPart childEditPart) { TreeEditPart treeEditPart = (TreeEditPart) childEditPart; treeEditPart.getWidget().dispose(); treeEditPart.setWidget(null); } /** * @see AbstractEditPart#reorderChild(EditPart, int) */ protected void reorderChild(EditPart editpart, int index) { super.reorderChild(editpart, index); // Reordering assigns a new Widget to the child. Call refresh() to // update widget. editpart.refresh(); } /** * Sets the {@link #widget}. * * @see org.eclipse.gef.TreeEditPart#setWidget(Widget) */ public void setWidget(Widget widget) { List children = getChildren(); if (widget != null) { widget.setData(this); if (widget instanceof TreeItem) { final TreeItem item = (TreeItem) widget; item.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { expanded = item.getExpanded(); } }); } for (int i = 0; i < children.size(); i++) { TreeEditPart tep = (TreeEditPart) children.get(i); if (widget instanceof TreeItem) tep.setWidget(new TreeItem((TreeItem) widget, 0)); else tep.setWidget(new TreeItem((Tree) widget, 0)); // We have just assigned a new TreeItem to the EditPart tep.refresh(); } if (widget instanceof TreeItem) ((TreeItem) widget).setExpanded(expanded); } else { Iterator iter = getChildren().iterator(); while (iter.hasNext()) ((TreeEditPart) iter.next()).setWidget(null); } this.widget = widget; } /** * Sets a specified <code>Image</code> into the widget iff it is a * <code>TreeItem</code>. * * @param image * the Image */ protected final void setWidgetImage(Image image) { if (checkTreeItem()) ((TreeItem) getWidget()).setImage(image); } /** * Sets a specified <code>String</code> into the widget iff it is a * <code>TreeItem</code>. * * @param text * the String */ protected final void setWidgetText(String text) { if (checkTreeItem()) ((TreeItem) getWidget()).setText(text); } }