blob: c553e6747e3158189e8089eafb2f130b6b54181f [file] [log] [blame]
/*******************************************************************************
* 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);
}
}