/* ****************************************************************************** * Copyright (c) 2006-2016 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.internal.editor; import java.util.Arrays; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.xmind.core.ISheet; import org.xmind.gef.EditDomain; import org.xmind.gef.GEF; import org.xmind.gef.IGraphicalViewer; import org.xmind.gef.Request; import org.xmind.gef.part.IGraphicalEditPart; import org.xmind.gef.part.IPart; import org.xmind.gef.tool.ISourceTool; import org.xmind.gef.tool.ITool; import org.xmind.gef.ui.editor.IGraphicalEditor; import org.xmind.gef.ui.editor.IGraphicalEditorPage; import org.xmind.ui.internal.tools.SheetTitleEditTool; import org.xmind.ui.mindmap.MindMapUI; public class MindMapPageTitleEditor { private static final int MIN_EDITOR_WIDTH = 50; private final CTabFolder tabFolder; private final IGraphicalEditor editor; public MindMapPageTitleEditor(CTabFolder tabFolder, MindMapEditor mindmapEditor) { super(); this.tabFolder = tabFolder; this.editor = mindmapEditor; hookControl(tabFolder); } protected void hookControl(CTabFolder tabFolder) { Listener eventHandler = new Listener() { @Override public void handleEvent(Event event) { doHandleEvent(event); } }; tabFolder.addListener(SWT.MouseDoubleClick, eventHandler); tabFolder.addListener(SWT.MouseDown, eventHandler); } private void doHandleEvent(Event event) { if (event.type == SWT.MouseDoubleClick) { startEditing(new Point(event.x, event.y)); } if (event.type == SWT.MouseDown) { if (tabFolder.isFocusControl()) { startEditing(new Point(event.x, event.y)); } } } /** * @param mouseLocation */ private void startEditing(Point mouseLocation) { if (mouseLocation == null) return; CTabItem item = tabFolder.getItem(mouseLocation); if (item == null) return; startEditing(tabFolder.indexOf(item)); } /** * @param pageIndex */ public void startEditing(int pageIndex) { IGraphicalEditorPage page = editor.getPage(pageIndex); if (page == null) return; IGraphicalViewer viewer = page.getViewer(); if (viewer == null) return; EditDomain editDomain = page.getEditDomain(); if (editDomain == null) return; ISheet sheet = viewer.getAdapter(ISheet.class); if (sheet == null) return; IPart part = viewer.findPart(sheet); if (part == null || !(part instanceof IGraphicalEditPart)) return; IGraphicalEditPart sourcePart = (IGraphicalEditPart) part; ITool tool = editDomain.getTool(MindMapUI.TOOL_EDIT_SHEET_TITLE); if (tool == null) return; if (tool instanceof ISourceTool) { ((ISourceTool) tool).setSource(sourcePart); } if (tool instanceof SheetTitleEditTool) { CTabItem item = tabFolder.getItem(pageIndex); Rectangle itemBounds = item.getBounds(); Rectangle editorBounds = new Rectangle(itemBounds.x, itemBounds.y, Math.max(MIN_EDITOR_WIDTH, itemBounds.width), itemBounds.height); ((SheetTitleEditTool) tool).setTextEditorParameters(tabFolder, editorBounds); } editDomain.setActiveTool(MindMapUI.TOOL_EDIT_SHEET_TITLE); if (tool != editDomain.getActiveTool()) return; tool.handleRequest(new Request(GEF.REQ_EDIT).setViewer(viewer) .setTargets(Arrays.asList(sourcePart))); } }