/* ****************************************************************************** * 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.internal.mindmap; import java.util.ArrayList; import java.util.List; import org.xmind.core.ISheet; import org.xmind.core.ITopic; import org.xmind.gef.IGraphicalViewer; import org.xmind.gef.service.GraphicalViewerService; import org.xmind.ui.mindmap.IDrillDownTraceListener; import org.xmind.ui.mindmap.IDrillDownTraceService; import org.xmind.ui.mindmap.IMindMap; public class DrillDownTraceService extends GraphicalViewerService implements IDrillDownTraceService { private List<ITopic> centralTopics = new ArrayList<ITopic>(); private List<IDrillDownTraceListener> listeners = null; public DrillDownTraceService(IGraphicalViewer viewer) { super(viewer); } protected void activate() { } protected void deactivate() { } @Override public void init(List<ITopic> centralTopics) { if (centralTopics != null && centralTopics.size() != 0) { this.centralTopics.addAll(centralTopics); } } public List<ITopic> getCentralTopics() { checkEmpty(); return centralTopics; } public ITopic getCurrentCentralTopic() { checkEmpty(); if (centralTopics.isEmpty()) return (ITopic) getViewer().getAdapter(ITopic.class); return centralTopics.get(centralTopics.size() - 1); } public boolean canDrillUp() { checkEmpty(); return centralTopics.size() >= 2; } public ITopic getPreviousCentralTopic() { checkEmpty(); int size = centralTopics.size(); if (size >= 2) return centralTopics.get(size - 2); return null; } public void setCentralTopic(ITopic topic) { if (topic == null) { centralTopics.clear(); checkEmpty(); fireHistoryChanged(); } else { boolean changed = checkEmpty(); for (int i = 0; i < centralTopics.size(); i++) { ITopic t = centralTopics.get(i); if (t.equals(topic)) { while (centralTopics.size() > i + 1) { ITopic removed = centralTopics .remove(centralTopics.size() - 1); changed |= removed != null; } if (changed) fireHistoryChanged(); return; } } centralTopics.add(topic); fireHistoryChanged(); } } private boolean checkEmpty() { if (centralTopics.isEmpty()) { ITopic rootTopic = (ITopic) getViewer().getAdapter(ITopic.class); if (rootTopic != null) { centralTopics.add(rootTopic); return true; } } return false; } public void addTraceListener(IDrillDownTraceListener listener) { if (listener == null) return; if (listeners == null) listeners = new ArrayList<IDrillDownTraceListener>(); listeners.add(listener); } public void removeTraceListener(IDrillDownTraceListener listener) { if (listener == null || listeners == null) return; listeners.remove(listener); if (listeners.isEmpty()) listeners = null; } protected void fireHistoryChanged() { if (listeners == null || listeners.isEmpty()) return; for (Object o : listeners.toArray()) { ((IDrillDownTraceListener) o).traceChanged(this); } } public void inputChanged(Object oldInput, Object newInput) { if (newInput instanceof IMindMap) { setCentralTopic(((IMindMap) newInput).getCentralTopic()); } else if (newInput instanceof ISheet) { setCentralTopic(((ISheet) newInput).getRootTopic()); } else if (newInput instanceof ITopic) { setCentralTopic((ITopic) newInput); } else { setCentralTopic(null); } } }