/**
*
*/
package org.xmind.ui.internal.tools;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.swt.SWT;
import org.xmind.core.Core;
import org.xmind.gef.GEF;
import org.xmind.gef.Request;
import org.xmind.gef.draw2d.IReferencedFigure;
import org.xmind.gef.event.KeyEvent;
import org.xmind.gef.event.MouseEvent;
import org.xmind.gef.tool.IGraphicalTool;
import org.xmind.gef.tool.ITool;
import org.xmind.ui.internal.MindMapMessages;
import org.xmind.ui.mindmap.ISheetPart;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.tools.DummyCreateTool;
import org.xmind.ui.viewers.SWTUtils;
/**
* @author frankshaka
*
*/
public class FloatingTopicCreateTool extends DummyCreateTool {
private Request request;
private Point position;
private BranchDummy branchDummy = null;
/*
* (non-Javadoc)
*
* @see
* org.xmind.gef.tool.AbstractTool#onActivated(org.xmind.gef.tool.ITool)
*/
protected void onActivated(ITool prevTool) {
request = null;
if (prevTool instanceof IGraphicalTool) {
setCursorPosition(((IGraphicalTool) prevTool).getCursorPosition());
}
super.onActivated(prevTool);
createDummy();
}
/*
* (non-Javadoc)
*
* @see
* org.xmind.gef.tool.AbstractTool#onDeactivated(org.xmind.gef.tool.ITool)
*/
protected void onDeactivated(ITool nextTool) {
super.onDeactivated(nextTool);
request = null;
}
/*
* (non-Javadoc)
*
* @see
* org.xmind.gef.tool.CreateTool#internalHandleRequest(org.xmind.gef.Request
* )
*/
@Override
protected void internalHandleRequest(Request request) {
if (!getStatus().isStatus(GEF.ST_ACTIVE))
return;
if (this.request == null
&& MindMapUI.REQ_CREATE_FLOAT.equals(request.getType())) {
this.request = request;
pack();
} else {
super.internalHandleRequest(request);
}
}
/*
* (non-Javadoc)
*
* @see org.xmind.ui.tools.DummyCreateTool#createRequest()
*/
protected Request createRequest() {
if (position == null)
return null;
Request req;
if (request != null) {
req = request;
} else {
req = new Request(MindMapUI.REQ_CREATE_FLOAT);
}
req.setParameter(GEF.PARAM_POSITION, position);
ISheetPart sheet = (ISheetPart) getTargetViewer().getAdapter(
ISheetPart.class);
if (sheet != null) {
req.setPrimaryTarget(sheet);
}
return req;
}
/*
* (non-Javadoc)
*
* @see org.xmind.ui.tools.DummyCreateTool#doCreateDummy()
*/
protected IFigure doCreateDummy() {
if (branchDummy == null) {
branchDummy = new BranchDummy(getTargetViewer(), true);
branchDummy.getTopic().setTitleText(
MindMapMessages.TitleText_FloatingTopic);
pack();
}
IFigure figure = branchDummy.getBranch().getFigure();
if (getCursorPosition() != null) {
if (figure instanceof IReferencedFigure) {
((IReferencedFigure) figure).setReference(getCursorPosition());
} else {
Dimension size = figure.getSize();
figure.setLocation(getCursorPosition().getTranslated(
-size.width / 2, -size.height / 2));
}
}
return figure;
}
private void pack() {
if (branchDummy == null)
return;
if (request != null) {
Object param = request.getParameter(MindMapUI.PARAM_PROPERTY_PREFIX
+ Core.StructureClass);
if (param instanceof String) {
branchDummy.getTopic().setStructureClass((String) param);
}
}
branchDummy.pack();
}
/*
* (non-Javadoc)
*
* @see
* org.xmind.ui.tools.DummyCreateTool#destroyDummy(org.eclipse.draw2d.IFigure
* )
*/
protected void destroyDummy(IFigure dummy) {
if (branchDummy != null) {
branchDummy.dispose();
branchDummy = null;
}
super.destroyDummy(dummy);
}
/*
* (non-Javadoc)
*
* @see
* org.xmind.ui.tools.DummyCreateTool#updateDummyPosition(org.eclipse.draw2d
* .IFigure, org.eclipse.draw2d.geometry.Point)
*/
protected void updateDummyPosition(IFigure dummy, Point pos) {
this.position = pos;
((IReferencedFigure) dummy).setReference(pos);
}
/*
* (non-Javadoc)
*
* @see
* org.xmind.gef.tool.CreateTool#canCancelOnRightMouseDown(org.xmind.gef
* .event.MouseEvent)
*/
protected boolean canCancelOnRightMouseDown(MouseEvent me) {
return true;
}
/*
* (non-Javadoc)
*
* @see org.xmind.gef.tool.CreateTool#canFinish(java.lang.String)
*/
protected boolean canFinish(String requestType) {
return position != null;
}
/*
* (non-Javadoc)
*
* @see
* org.xmind.gef.tool.CreateTool#canFinishOnLeftMouseDown(org.xmind.gef.
* event.MouseEvent)
*/
protected boolean canFinishOnLeftMouseDown(MouseEvent me) {
return position != null;
}
/*
* (non-Javadoc)
*
* @see
* org.xmind.gef.tool.CreateTool#shouldCancel(org.xmind.gef.event.KeyEvent)
*/
protected boolean shouldCancel(KeyEvent ke) {
return SWTUtils.matchKey(ke.getState(), ke.keyCode, 0, SWT.ESC);
}
}