| /******************************************************************************* |
| * Copyright (c) 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 |
| *******************************************************************************/ |
| package org.eclipse.bpel.common.ui.tray; |
| |
| import org.eclipse.draw2d.Label; |
| import org.eclipse.draw2d.geometry.Rectangle; |
| import org.eclipse.emf.common.notify.Adapter; |
| import org.eclipse.emf.common.notify.Notification; |
| import org.eclipse.emf.common.notify.Notifier; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.gef.AccessibleEditPart; |
| import org.eclipse.gef.DragTracker; |
| import org.eclipse.gef.EditPolicy; |
| import org.eclipse.gef.Request; |
| import org.eclipse.gef.RequestConstants; |
| import org.eclipse.gef.editparts.AbstractGraphicalEditPart; |
| import org.eclipse.gef.requests.DirectEditRequest; |
| import org.eclipse.gef.tools.CellEditorLocator; |
| import org.eclipse.gef.tools.DirectEditManager; |
| import org.eclipse.gef.tools.SelectEditPartTracker; |
| import org.eclipse.jface.viewers.CellEditor; |
| import org.eclipse.jface.viewers.ILabelProvider; |
| import org.eclipse.jface.viewers.TextCellEditor; |
| import org.eclipse.swt.graphics.Point; |
| import org.eclipse.swt.widgets.Text; |
| |
| /** |
| * An edit part for the Tray framework. |
| */ |
| public abstract class TrayEditPart extends AbstractGraphicalEditPart { |
| |
| protected Adapter adapter; |
| protected ILabelProvider labelProvider; |
| protected DirectEditManager directEditManager; |
| protected AccessibleEditPart acc; |
| |
| public TrayEditPart() { |
| super(); |
| adapter = createAdapter(); |
| } |
| |
| protected Adapter createAdapter() { |
| return new Adapter() { |
| public void notifyChanged(Notification notification) { |
| refresh(); |
| } |
| public Notifier getTarget() {return null;} |
| public void setTarget(Notifier newTarget) {} |
| public boolean isAdapterForType(Object type) {return false;} |
| }; |
| } |
| |
| @Override |
| public void activate() { |
| super.activate(); |
| EObject modelObject = (EObject)getModel(); |
| modelObject.eAdapters().add(adapter); |
| } |
| |
| @Override |
| public void deactivate() { |
| super.deactivate(); |
| EObject modelObject = (EObject)getModel(); |
| modelObject.eAdapters().remove(adapter); |
| } |
| |
| /** |
| * Provides the label and text for the edit part. |
| */ |
| public void setLabelProvider(ILabelProvider labelProvider) { |
| this.labelProvider = labelProvider; |
| } |
| |
| public ILabelProvider getLabelProvider() { |
| return labelProvider; |
| } |
| |
| /** |
| * Overwrite the default behaviour since these edit parts |
| * should not move. |
| */ |
| @Override |
| public DragTracker getDragTracker(Request request) { |
| return new SelectEditPartTracker(this); |
| } |
| |
| /** |
| * Override to handle direct edit requests |
| */ |
| @Override |
| public void performRequest(Request request) { |
| if (request.getType() == RequestConstants.REQ_DIRECT_EDIT) { |
| performDirectEdit((DirectEditRequest)request); |
| } else { |
| super.performRequest(request); |
| } |
| } |
| |
| protected void performDirectEdit(DirectEditRequest request) { |
| // check if we support direct edit |
| if (getEditPolicy(EditPolicy.DIRECT_EDIT_ROLE) == null) return; // there is nothing to be done |
| |
| if(directEditManager == null) { |
| directEditManager = new TrayCategoryEntryEditPartDirectEditManager(this, |
| TextCellEditor.class, new CellEditorLocator() { |
| public void relocate(CellEditor celleditor) { |
| Text text = (Text) celleditor.getControl(); |
| Point sel = text.getSelection(); |
| Point pref = text.computeSize(-1, -1); |
| Label label = getDirectEditLabel(); |
| Rectangle rect = label.getTextBounds().getCopy(); |
| label.translateToAbsolute(rect); |
| text.setBounds(rect.x - 4, rect.y - 1, Math.min(pref.x + 1, text.getParent().getSize().x - 20), pref.y + 1); |
| text.setSelection(0); |
| text.setSelection(sel); |
| } |
| }); |
| } |
| directEditManager.show(); |
| } |
| |
| /** |
| * Returns the Label to be used for direct edit. |
| */ |
| public abstract Label getDirectEditLabel(); |
| |
| @Override |
| protected AccessibleEditPart getAccessibleEditPart() { |
| if (acc == null) acc = createAccessible(); |
| return acc; |
| } |
| |
| protected AccessibleEditPart createAccessible() { |
| return new TrayAccessibleEditPart(this); |
| } |
| |
| @Override |
| public Object getAdapter(Class key) { |
| if (key == AccessibleEditPart.class) { |
| return getAccessibleEditPart(); |
| } |
| return super.getAdapter(key); |
| } |
| } |