/* ****************************************************************************** * Copyright (c) 2006-2012 XMind Ltd. and others. * * This file is a part of XMind 3. XMind releases 3 and * above are dual-licensed under the Eclipse Public License (EPL), * which is available at http://www.eclipse.org/legal/epl-v10.html * and the GNU Lesser General Public License (LGPL), * which is available at http://www.gnu.org/licenses/lgpl.html * See http://www.xmind.net/license.html for details. * * Contributors: * XMind Ltd. - initial API and implementation *******************************************************************************/ package org.xmind.ui.gallery; import org.eclipse.swt.SWT; import org.xmind.gef.GEF; import org.xmind.gef.Request; import org.xmind.gef.event.KeyEvent; import org.xmind.gef.event.MouseEvent; import org.xmind.gef.part.IPart; import org.xmind.gef.tool.ITool; import org.xmind.gef.tool.SelectTool; public class GallerySelectTool extends SelectTool { private FramePart sourceFrame = null; private FramePart trackedFrame = null; protected boolean isFrameAsButton() { return !getTargetViewer().getProperties() .getBoolean(GalleryViewer.SolidFrames, false); } protected boolean isSingleClickToOpen() { return getTargetViewer().getProperties() .getBoolean(GalleryViewer.SingleClickToOpen, false); } protected boolean isCursorInTitle(IPart p) { return p instanceof FramePart && ((FramePart) p).getFigure().getTitle() .containsPoint(getCursorPosition()); } protected boolean isTitleEditable(IPart p) { if (getTargetViewer() instanceof GalleryViewer) { return ((GalleryViewer) getTargetViewer()).isTitleEditable(p); } return false; } /* * (non-Javadoc) * * @see org.xmind.gef.tool.SelectTool#handleMouseDown(org.xmind.gef.event. * MouseEvent ) */ protected boolean handleMouseDown(MouseEvent me) { FramePart targetFrame = findFrame(me.target); if (isFrameAsButton()) { if (targetFrame != null) { if (targetFrame.getContentPane() .containsPoint(me.cursorLocation)) { sourceFrame = targetFrame; sourceFrame.getFigure().press(); } } } boolean ret = handleSelectionOnMouseDown(me); if (isCursorInTitle(me.target) && isTitleEditable(me.target)) { Request request = new Request(GEF.REQ_EDIT); request.setDomain(getDomain()); request.setViewer(getTargetViewer()); request.setPrimaryTarget(me.target); startEditing(me.target, request); ITool et = getTool(GEF.TOOL_EDIT); if (et != null && et == getDomain().getActiveTool()) { me.consume(); } } else if (isSingleClickToOpen() && me.leftOrRight) { if (targetFrame != null) { trackedFrame = targetFrame; } } return ret; } private FramePart findFrame(IPart part) { while (part != null) { if (part instanceof FramePart) return (FramePart) part; part = part.getParent(); } return null; } protected boolean handleSelectionOnMouseDown(MouseEvent me) { return super.handleMouseDown(me); } /* * (non-Javadoc) * * @see org.xmind.gef.tool.SelectTool#handleMouseUp(org.xmind.gef.event. * MouseEvent ) */ public boolean handleMouseUp(MouseEvent me) { FramePart targetFrame = findFrame(me.target); if (sourceFrame != null) { sourceFrame.getFigure().unpress(); sourceFrame = null; } boolean handled = super.handleMouseUp(me); if (trackedFrame != null && isSingleClickToOpen() && me.leftOrRight) { if (targetFrame == trackedFrame) { performOpen(); } me.consume(); } trackedFrame = null; return handled; } /* * (non-Javadoc) * * @see * org.xmind.gef.tool.SelectTool#handleMouseDoubleClick(org.xmind.gef.event * .MouseEvent) */ protected boolean handleMouseDoubleClick(MouseEvent me) { if (me.target instanceof FramePart) { if (!isSingleClickToOpen() && (!isCursorInTitle(me.target) || !isTitleEditable(me.target))) { performOpen(); me.consume(); return true; } } return super.handleMouseDoubleClick(me); } protected void performOpen() { if (!(getTargetViewer() instanceof GalleryViewer)) return; GalleryViewer viewer = (GalleryViewer) getTargetViewer(); viewer.fireOpen(); } @Override protected boolean handleKeyTraversed(KeyEvent ke) { if (ke.traverse == SWT.TRAVERSE_RETURN) { performOpen(); ke.consume(); return false; } return super.handleKeyTraversed(ke); } }