/** * 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.parts; import javax.annotation.PostConstruct; import javax.inject.Inject; import javax.inject.Singleton; 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.di.UIEventTopic; import org.whole.lang.bindings.BindingManagerFactory; import org.whole.lang.bindings.IBindingManager; import org.whole.lang.bindings.ITransactionScope; import org.whole.lang.e4.ui.actions.ILinkableSelectionListener; import org.whole.lang.e4.ui.actions.IE4UIConstants; import org.whole.lang.e4.ui.actions.LinkViewerAdapter; import org.whole.lang.e4.ui.jobs.ExecuteSampleModelRunnable; import org.whole.lang.e4.ui.jobs.ISynchronizableRunnable; import org.whole.lang.e4.ui.jobs.ShowingPolicy; import org.whole.lang.model.IEntity; import org.whole.lang.ui.viewers.IEntityPartViewer; import org.whole.lang.util.BehaviorUtils; import org.whole.lang.util.EntityUtils; /** * @author Enrico Persiani */ @Singleton public class E4SampleGraphicalPart extends AbstractE4DerivedGraphicalPart { @Inject IEventBroker eventBroker; protected IEntity contextModel; protected IEntity selfModel; protected IBindingManager selfBindings; @PostConstruct void init() { contextModel = BindingManagerFactory.instance.createVoid(); selfModel = BindingManagerFactory.instance.createVoid(); } @Inject @Optional private void getNotified(@UIEventTopic(IE4UIConstants.TOPIC_UPDATE_SAMPLE_CONTEXT) IEntity sampleContext) { if (sampleContext != null) { contextModel = sampleContext.wGet(0); selfModel = sampleContext.wGet(1); selfBindings = (IBindingManager) sampleContext.wGet(2).wGetValue(); execute(); } } @Override protected IEclipseContext configureSelectionLinkable(IEclipseContext params) { params = super.configureSelectionLinkable(params); params.set(ILinkableSelectionListener.RESULTS_SHOWING_POLICY, ShowingPolicy.IGNORABLE); return params; } protected String getDerivationFunction() { return "whole:org.whole.lang:ViewDerivationLibrary#deriveSampleViewContents"; } protected IBindingManager bm; protected IEntity behaviorModel; protected String behaviorLabel; @Override protected ILinkableSelectionListener createSelectionLinkable(IEntityPartViewer viewer) { ILinkableSelectionListener listener = super.createSelectionLinkable(viewer); listener.addLinkViewerListener(new LinkViewerAdapter() { @Override public void contentsDerived(IEntityPartViewer viewer, IBindingManager selection, IEntity result) { boolean canExecute = EntityUtils.safeBooleanValue(result, false); if (canExecute) { IEntity primarySelectedEntity = selection.wGet("primarySelectedEntity"); IEntity model = EntityUtils.getCompoundRoot(primarySelectedEntity); bm = selection.clone(); bm.wDefValue("debug#reportModeEnabled", false); BehaviorUtils.evaluate(contextModel, 0, bm); ITransactionScope transactionScope = BindingManagerFactory.instance.createTransactionScope(); bm.wEnterScope(transactionScope); try { behaviorModel = EntityUtils.mapEntity(primarySelectedEntity, EntityUtils.clone(model)); behaviorLabel = BehaviorUtils.apply( "whole:org.whole.lang.ui.views:SamplePerspectiveSemantics#SampleViewBehaviorLabel", behaviorModel, bm).wStringValue(); } finally { transactionScope.rollback(); bm.wExitScope(); } execute(); } else { bm = null; behaviorModel = null; behaviorLabel = null; getViewer().setContents(null, createDefaultContents()); } } }); return listener; } protected void execute() { if (behaviorModel == null || selfBindings == null) return; else { ISynchronizableRunnable runnable = new ExecuteSampleModelRunnable(context, behaviorLabel, contextModel, selfBindings, selfModel, bm, behaviorModel); runnable.asyncExec("Executing "+behaviorLabel+" operation..."); } } }