/* ****************************************************************************** * 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.gef.policy; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.xmind.gef.GEF; import org.xmind.gef.Request; import org.xmind.gef.part.IPart; public class NavigablePolicy extends AbstractEditPolicy { public boolean understands(String requestType) { return super.understands(requestType) || GEF.REQ_NAV_UP.equals(requestType) || GEF.REQ_NAV_DOWN.equals(requestType) || GEF.REQ_NAV_LEFT.equals(requestType) || GEF.REQ_NAV_RIGHT.equals(requestType) || GEF.REQ_NAV_BEGINNING.equals(requestType) || GEF.REQ_NAV_END.equals(requestType) || GEF.REQ_NAV_NEXT.equals(requestType) || GEF.REQ_NAV_PREV.equals(requestType); } public void handle(Request request) { String navType = request.getType(); if (GEF.REQ_NAV_UP.equals(navType) || GEF.REQ_NAV_DOWN.equals(navType) || GEF.REQ_NAV_LEFT.equals(navType) || GEF.REQ_NAV_RIGHT.equals(navType) || GEF.REQ_NAV_BEGINNING.equals(navType) || GEF.REQ_NAV_END.equals(navType)) { List<IPart> sources = request.getTargets(); List<IPart> result = new ArrayList<IPart>(); IPart seqStart = getSequenceStart(request); if (seqStart != null) { findSequentialNavParts(request, navType, seqStart, sources, result); } else { findNavParts(request, navType, sources, result); } setNavigationResult(request, result); } else if (GEF.REQ_NAV_NEXT.equals(navType) || GEF.REQ_NAV_PREV.equals(navType)) { IPart source = request.getPrimaryTarget(); IPart target = findNextOrPrev(source, GEF.REQ_NAV_NEXT .equals(navType)); if (target != null) { setNavigationResult(request, Arrays.asList(target)); } } } protected IPart findNextOrPrev(IPart source, boolean nextOrPrev) { return null; } protected void setNavigationResult(Request request, List<? extends IPart> result) { if (!result.isEmpty()) { request.setResult(GEF.RESULT_NAVIGATION, result .toArray(new IPart[result.size()])); } } protected void findNavParts(Request request, String navType, List<IPart> sources, List<IPart> result) { result.addAll(sources); } protected void findSequentialNavParts(Request request, String navType, IPart sequenceStart, List<IPart> sources, List<IPart> result) { result.addAll(sources); } protected IPart getSequenceStart(Request request) { if (isSequential(request)) { return (IPart) request.getParameter(GEF.PARAM_NAV_SEQUENCE_START); } return null; } protected boolean isSequential(Request request) { return request.isParameter(GEF.PARAM_NAV_SEQUENTIAL); } }