/** * Copyright 2004-2016 Riccardo Solmi. All rights reserved. * This file is part of the Whole Platform. * * The Whole Platform is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * The Whole Platform is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>. */ package org.whole.lang.e4.ui.actions; import java.util.Set; import javax.inject.Inject; import javax.inject.Named; import org.eclipse.core.runtime.ListenerList; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.core.di.annotations.Optional; import org.eclipse.e4.core.services.events.IEventBroker; import org.eclipse.e4.ui.model.application.ui.basic.MPart; import org.whole.lang.bindings.IBindingManager; import org.whole.lang.e4.ui.jobs.ShowingPolicy; import org.whole.lang.model.IEntity; import org.whole.lang.ui.viewers.IEntityPartViewer; /** * @author Enrico Persiani */ public abstract class AbstractLinkableSelectionListener implements ILinkableSelectionListener { @Inject protected IEclipseContext context; @Inject protected IEventBroker eventBroker; @Inject protected IEntityPartViewer viewer; @Inject @Named(LINK_TYPE) protected LinkType linkType; @Optional @Inject @Named(FUNCTION_URI) protected String functionUri; @Optional @Inject @Named(FUNCTION_IS_TRANSACTIONAL) protected boolean functionIsTransactional; @Optional @Inject @Named(RESULTS_SHOWING_POLICY) protected ShowingPolicy resultShowingPolicy; @Inject @Named(SHARE_EDIT_DOMAIN) protected boolean shareEditDomain; @Inject @Named(SYNCHRONIZE_SELECTION) protected boolean synchronizeSelection; @Inject @Named(IGNORABLE_PART_IDS) protected Set<String> ignorablePartIds; protected IEntityPartViewer linkedViewer; protected IBindingManager lastSelection; protected ListenerList linkViewerListenerList = new ListenerList(); @Override public void selectionChanged(MPart part, Object selection) { if (ignorablePartIds.contains(part.getElementId())) return; if (isRelevant(selection)) updateViewerContents(); } protected abstract void updateViewerContents(); @Override public void updateLinkType(LinkType linkType) { this.linkType = linkType; this.linkedViewer = linkType.isLinkedToFixedPart() ? (IEntityPartViewer) this.lastSelection.wGetValue("viewer") : null; } protected boolean isRelevant(Object selection) { if (!(selection instanceof IBindingManager)) return false; IBindingManager actualSelection = (IBindingManager) selection; IEntityPartViewer selectedViewer = (IEntityPartViewer) actualSelection.wGetValue("viewer"); if (viewer == selectedViewer) return false; lastSelection = actualSelection.clone(); return linkType.isLinkedToActivePart() || (linkType.isLinkedToFixedPart() && selectedViewer == linkedViewer); } public void addLinkViewerListener(ILinkViewerListener listener) { linkViewerListenerList.add(listener); } public void removeLinkViewerListener(ILinkViewerListener listener) { linkViewerListenerList.remove(listener); } protected void fireViewerLinked(IEntityPartViewer toViewer) { Object[] listeners = linkViewerListenerList.getListeners(); for (int i = 0; i < listeners.length; i++) ((ILinkViewerListener) listeners[i]).viewerLinked(viewer, toViewer); } protected void fireViewerUnlinked() { Object[] listeners = linkViewerListenerList.getListeners(); for (int i = 0; i < listeners.length; i++) ((ILinkViewerListener) listeners[i]).viewerUnlinked(viewer); } protected void fireContentsDerived(IEntity result) { Object[] listeners = linkViewerListenerList.getListeners(); for (int i = 0; i < listeners.length; i++) ((ILinkViewerListener) listeners[i]).contentsDerived(viewer, lastSelection, result); } public boolean isSynchronizeSelection() { return synchronizeSelection; } public boolean setSynchronizeSelection(boolean synchronizeSelection) { boolean previousValue = this.synchronizeSelection; this.synchronizeSelection = synchronizeSelection; return previousValue; } }