/* * ***************************************************************************** * * 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.properties; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.PlatformUI; import org.xmind.core.event.CoreEvent; import org.xmind.core.event.CoreEventRegister; import org.xmind.core.event.ICoreEventListener; import org.xmind.core.event.ICoreEventRegister; import org.xmind.gef.EditDomain; import org.xmind.gef.IGraphicalViewer; import org.xmind.gef.ISourceProvider; import org.xmind.gef.IViewer; import org.xmind.gef.Request; import org.xmind.gef.command.Command; import org.xmind.gef.command.ICommandStack; import org.xmind.gef.graphicalpolicy.IStyleSelector; import org.xmind.gef.part.IGraphicalPart; import org.xmind.gef.part.IPart; import org.xmind.gef.ui.editor.IGraphicalEditorPage; import org.xmind.gef.ui.properties.PropertySectionPart; import org.xmind.ui.style.StyleUtils; public abstract class MindMapPropertySectionPartBase extends PropertySectionPart implements ICoreEventListener { protected static final Object[] NO_ELEMENTS = new Object[0]; private ICoreEventRegister eventRegister = null; private boolean refreshing = false; protected boolean isRefreshing() { return refreshing; } public void refresh() { super.refresh(); refreshing = true; doRefresh(); refreshing = false; } protected abstract void doRefresh(); protected IGraphicalEditorPage getActivePage() { return getContributedEditor().getActivePageInstance(); } protected IGraphicalViewer getActiveViewer() { IGraphicalEditorPage editorPage = getActivePage(); return editorPage == null ? null : editorPage.getViewer(); } protected EditDomain getActiveDomain() { IGraphicalEditorPage editorPage = getActivePage(); return editorPage == null ? null : editorPage.getEditDomain(); } protected IPart getPart(Object o) { IViewer viewer = getActiveViewer(); return viewer == null ? null : viewer.findPart(o); } protected IGraphicalPart getGraphicalPart(Object o) { return getGraphicalPart(o, getActiveViewer()); } protected IGraphicalPart getGraphicalPart(Object o, IViewer viewer) { if (viewer == null) return null; IPart p = viewer.findPart(o); return p instanceof IGraphicalPart ? (IGraphicalPart) p : null; } protected IStyleSelector getStyleSelector(IGraphicalPart part) { return StyleUtils.getStyleSelector(part); } protected void saveAndRun(Command command) { ICommandStack cs = getContributedEditor().getCommandStack(); if (cs != null) { cs.execute(command); if (command instanceof ISourceProvider) { List<Object> sources = ((ISourceProvider) command).getSources(); getContributedEditor().getSite().getSelectionProvider() .setSelection(new StructuredSelection(sources)); } } } protected void sendRequest(String request) { EditDomain domain = getActiveDomain(); if (domain != null) { domain.handleRequest(request, getActiveViewer()); } } protected void sendRequest(Request request) { if (request == null) return; EditDomain domain = getActiveDomain(); if (domain != null) { domain.handleRequest(request); } } protected Request fillTargets(Request request) { IViewer viewer = getActiveViewer(); if (viewer != null) { request.setViewer(viewer); request.setDomain(viewer.getEditDomain()); Object[] elements = getSelectedElements(); List<IPart> parts = new ArrayList<IPart>(elements.length); for (Object o : elements) { IPart p = viewer.findPart(o); if (p != null && !parts.contains(p) && isRequestTarget(request, p)) parts.add(p); } if (!parts.isEmpty()) { request.setTargets(parts); } } return request; } protected boolean isRequestTarget(Request request, IPart part) { return true; } protected Object[] getSelectedElements() { if (getCurrentSelection() != null && getCurrentSelection() instanceof IStructuredSelection) { return ((IStructuredSelection) getCurrentSelection()).toArray(); } return NO_ELEMENTS; } protected void hookSelection(ISelection selection) { super.hookSelection(selection); for (Object source : getSelectedElements()) { if (eventRegister == null) eventRegister = new CoreEventRegister(this); eventRegister.setNextSourceFrom(source); registerEventListener(source, eventRegister); } } public void createControl(Composite parent) { parent.setLayout(createLayout(parent)); createContent(parent); } protected GridLayout createLayout(Composite parent) { GridLayout layout = new GridLayout(1, true); layout.marginWidth = 3; layout.marginHeight = 3; layout.horizontalSpacing = 3; layout.verticalSpacing = 3; return layout; } protected abstract void createContent(Composite parent); protected abstract void registerEventListener(Object source, ICoreEventRegister register); protected void unhookSelection(ISelection selection) { if (eventRegister != null) { eventRegister.unregisterAll(); eventRegister = null; } super.unhookSelection(selection); } public void handleCoreEvent(final CoreEvent event) { if (getContainer().getContainerSite() != null) { getContainer().getContainerSite().getWorkbenchWindow() .getWorkbench().getDisplay().syncExec(new Runnable() { public void run() { refresh(); } }); } else { PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() { @Override public void run() { refresh(); } }); } } }