X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.modeling.template2d.ui%2Fsrc%2Forg%2Fsimantics%2Fmodeling%2Ftemplate2d%2Fui%2Factions%2FAssignDrawingTemplate.java;fp=bundles%2Forg.simantics.modeling.template2d.ui%2Fsrc%2Forg%2Fsimantics%2Fmodeling%2Ftemplate2d%2Fui%2Factions%2FAssignDrawingTemplate.java;h=5ee106bc7816beb7c3e8860528f1cab6edbc13db;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.modeling.template2d.ui/src/org/simantics/modeling/template2d/ui/actions/AssignDrawingTemplate.java b/bundles/org.simantics.modeling.template2d.ui/src/org/simantics/modeling/template2d/ui/actions/AssignDrawingTemplate.java new file mode 100644 index 000000000..5ee106bc7 --- /dev/null +++ b/bundles/org.simantics.modeling.template2d.ui/src/org/simantics/modeling/template2d/ui/actions/AssignDrawingTemplate.java @@ -0,0 +1,233 @@ +/******************************************************************************* + * Copyright (c) 2014 Association for Decentralized Information Management in + * Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + * Semantum Oy - enabled template unassignment (#5030) + * Semantum Oy - multi-selection support (#5425) + *******************************************************************************/ +package org.simantics.modeling.template2d.ui.actions; + +import gnu.trove.set.hash.THashSet; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.dialogs.IDialogSettings; +import org.eclipse.jface.viewers.BaseLabelProvider; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.window.Window; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.PlatformUI; +import org.simantics.NameLabelUtil; +import org.simantics.Simantics; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.WriteGraph; +import org.simantics.db.common.CommentMetadata; +import org.simantics.db.common.request.PossibleIndexRoot; +import org.simantics.db.common.request.ReadRequest; +import org.simantics.db.common.request.WriteRequest; +import org.simantics.db.common.utils.NameUtils; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.adapter.ActionFactory; +import org.simantics.db.layer0.adapter.ActionFactory2; +import org.simantics.db.layer0.adapter.Instances; +import org.simantics.modeling.ModelingResources; +import org.simantics.modeling.template2d.ontology.Template2dResource; +import org.simantics.modeling.template2d.ui.Activator; +import org.simantics.structural.stubs.StructuralResource2; +import org.simantics.ui.workbench.dialogs.ResourceListDialog; +import org.simantics.utils.ObjectUtils; +import org.simantics.utils.datastructures.Pair; + +public class AssignDrawingTemplate implements ActionFactory, ActionFactory2 { + + @Override + public Runnable create(Collection targets) { + final List resources = new ArrayList(); + for (Object target : targets) { + if (!(target instanceof Resource)) + return null; + resources.add((Resource) target); + } + return (targets.isEmpty()) ? null : assign(resources); + } + + @Override + public Runnable create(Object target) { + if(!(target instanceof Resource)) + return null; + return assign(Collections.singletonList((Resource) target)); + } + + private Runnable assign(final Collection composites) { + return new Runnable() { + @Override + public void run() { + Simantics.getSession().asyncRequest(new ReadRequest() { + @Override + public void run(ReadGraph graph) throws DatabaseException { + assign(graph, composites); + } + }); + } + }; + } + + private void assign(ReadGraph graph, final Collection composites) throws DatabaseException { + Template2dResource TEMPLATE2D = Template2dResource.getInstance(graph); + StructuralResource2 STR = StructuralResource2.getInstance(graph); + ModelingResources MOD = ModelingResources.getInstance(graph); + + Instances query = graph.adapt(TEMPLATE2D.DrawingTemplate, Instances.class); + Resource root = null; + Set initialResources = new THashSet(); + + for (Resource composite : composites) { + if (!graph.isInstanceOf(composite, STR.Composite)) + return; + + // Ensure all composites are part of the same index root. + Resource r = graph.sync(new PossibleIndexRoot(composite)); + if (r == null || (root != null && !r.equals(root))) + return; + root = r; + + // Ensure each composite has a diagram. + Resource diagram = graph.getPossibleObject(composite, MOD.CompositeToDiagram); + if (diagram == null) + return; + + Resource initial = graph.getPossibleObject(diagram, TEMPLATE2D.HasDrawingTemplate); + if (initial != null) + initialResources.add(initial); + } + + final List> elements = new ArrayList>(); + + for (Resource template : query.find(graph, root)) { + String name = NameLabelUtil.modalName(graph, template); + elements.add(Pair.make(template, name)); + } + + Resource init = initialResources.size() == 1 ? initialResources.iterator().next() : null; + final Pair initialSelection = init != null + ? Pair.make(init, NameLabelUtil.modalName(graph, init)) + : null; + + Display.getDefault().asyncExec(new Runnable() { + @Override + public void run() { + queryDrawingTemplate(composites, elements, initialSelection); + } + }); + } + + private static void queryDrawingTemplate( + final Collection composites, + List> elements, + Pair initialSelection + ) + { + Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); + ResourceListDialog dialog = new ResourceListDialog(shell, "Select template from list", "Select diagram template to assign " + ResourceListDialog.DEFAULT_LABEL_SUFFIX, new LabelProvider()) { + @Override + protected void createButtonsForButtonBar(Composite parent) { + Button unassign = createButton(parent, IDialogConstants.CLIENT_ID, "Unassign", false); + unassign.setToolTipText("Remove Diagram Template Assignment"); + createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); + createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); + } + @Override + protected void buttonPressed(int buttonId) { + super.buttonPressed(buttonId); + if (buttonId == IDialogConstants.CLIENT_ID) { + setSelectionResult(new Object[0]); + setReturnCode(OK); + close(); + } + } + @Override + protected IDialogSettings getDialogBoundsSettings() { + return Activator.getDefault().getDialogSettings(); + } + }; + dialog.setElements(elements); + dialog.setInitialSelection(initialSelection); + dialog.setMultipleSelection(false); + if (dialog.open() == Window.OK) { + @SuppressWarnings("unchecked") + Pair result = (Pair) dialog.getSingleResult(); + final Resource template = result != null ? result.first : null; + if (!ObjectUtils.objectEquals(template, initialSelection)) { + //System.out.println("setting template: " + template); + Simantics.getSession().async(new WriteRequest() { + @Override + public void perform(WriteGraph graph) throws DatabaseException { + assignTemplateToDiagrams(graph, composites, template); + } + }); + } + } + } + + private static class LabelProvider extends BaseLabelProvider implements ILabelProvider { + + @Override + public Image getImage(Object element) { + return null; + } + + @SuppressWarnings("unchecked") + @Override + public String getText(Object element) { + return ((Pair) element).second; + } + + } + + public static void assignTemplateToDiagrams(WriteGraph graph, Collection composites, Resource template) throws DatabaseException { + graph.markUndoPoint(); + + ModelingResources MOD = ModelingResources.getInstance(graph); + Template2dResource TEMPLATE2D = Template2dResource.getInstance(graph); + + StringBuilder comment = new StringBuilder(); + if (template != null) { + comment.append("Assigned diagram template ").append(NameUtils.getSafeName(graph, template, true)).append(" to diagram"); + } else { + comment.append("Removed diagram template from diagram"); + } + if (composites.size() > 1) + comment.append('s'); + comment.append('\n'); + + for (Resource composite : composites) { + Resource diagram = graph.getSingleObject(composite, MOD.CompositeToDiagram); + + graph.deny(diagram, TEMPLATE2D.HasDrawingTemplate); + if (template != null) + graph.claim(diagram, TEMPLATE2D.HasDrawingTemplate, null, template); + + comment.append('\t').append(NameUtils.getSafeName(graph, composite, true)); + } + + CommentMetadata cm = graph.getMetadata(CommentMetadata.class); + graph.addMetadata( cm.add( comment.toString() ) ); + } + +}