/* * Copyright (c) 2006, 2007 Borland Software Corporation * * 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: * Artem Tikhomirov (Borland) - initial API and implementation */ package org.eclipse.gmf.internal.bridge.wizards.pages; import java.util.List; import org.eclipse.gmf.mappings.LinkMapping; import org.eclipse.gmf.mappings.NodeMapping; import org.eclipse.gmf.tooldef.AbstractTool; import org.eclipse.gmf.tooldef.CreationTool; import org.eclipse.gmf.tooldef.ToolContainer; import org.eclipse.gmf.tooldef.ToolRegistry; /** * @author artem */ public class ToolDefLookup implements ToolDefSupplier { private final ToolRegistry myRegistry; private final ToolContainer myNodeTools; private final ToolContainer myLinkTools; private final boolean sameToolContainer; // basically, myNodeTools == myLinkTools private int myNodeUseIndex = 0; private int myLinkUseIndex = 0; public ToolDefLookup(ToolRegistry registry) { assert registry != null && registry.getPalette() != null; myRegistry = registry; final List<AbstractTool> tools = myRegistry.getPalette().getTools(); int i = tools.size(); boolean found = false; while (!found && i > 0) { i--; if (tools.get(i) instanceof ToolContainer) { ToolContainer t = (ToolContainer) tools.get(i); found = t.getTools().size() > 0; } } if (!found) { myNodeTools = myLinkTools = myRegistry.getPalette(); sameToolContainer = true; return; } myLinkTools = (ToolContainer) tools.get(i); found = false; while (i > 0 && !found) { i--; if (tools.get(i) instanceof ToolContainer) { ToolContainer t = (ToolContainer) tools.get(i); found = t.getTools().size() > 0; } } if (!found) { myNodeTools = myLinkTools; sameToolContainer = true; } else { sameToolContainer = false; myNodeTools = (ToolContainer) tools.get(i); } } public AbstractTool findTool(NodeMapping nm) { final int nodeToolsLen = myNodeTools.getTools().size(); for (int i = 0; i < nodeToolsLen; i++) { Object next = myNodeTools.getTools().get((myNodeUseIndex + i) % nodeToolsLen); if (isTool(next)) { myNodeUseIndex = (myNodeUseIndex + i + 1) % nodeToolsLen; if (sameToolContainer) { myLinkUseIndex = myNodeUseIndex; } return (AbstractTool) next; } } return null; } public AbstractTool findTool(LinkMapping lm) { final int linkToolsLen = myLinkTools.getTools().size(); for (int i = 0; i < linkToolsLen; i++) { Object next = myLinkTools.getTools().get((myLinkUseIndex + i) % linkToolsLen); if (isTool(next)) { myLinkUseIndex = (myLinkUseIndex + i + 1) % linkToolsLen; if (sameToolContainer) { myNodeUseIndex = myLinkUseIndex; } return (AbstractTool) next; } } return null; } private boolean isTool(Object next) { return next instanceof CreationTool; } }