X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=bundles%2Forg.simantics.g2d%2Fsrc%2Forg%2Fsimantics%2Fg2d%2Fdiagram%2Fparticipant%2FZOrderHandler.java;h=8b893a2b1e7f0730fac80482cd67feb7ae1e115d;hb=HEAD;hp=03dffd676e52e86704b4c653fcf0780b62fa5e42;hpb=969bd23cab98a79ca9101af33334000879fb60c5;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/ZOrderHandler.java b/bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/ZOrderHandler.java index 03dffd676..8b893a2b1 100644 --- a/bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/ZOrderHandler.java +++ b/bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/ZOrderHandler.java @@ -1,221 +1,221 @@ -/******************************************************************************* - * Copyright (c) 2007, 2010 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 - *******************************************************************************/ -package org.simantics.g2d.diagram.participant; - -import java.awt.Shape; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Map.Entry; -import java.util.Set; - -import org.eclipse.core.runtime.ListenerList; -import org.simantics.g2d.canvas.impl.DependencyReflection.Dependency; -import org.simantics.g2d.diagram.DiagramHints; -import org.simantics.g2d.diagram.DiagramUtils; -import org.simantics.g2d.diagram.IDiagram; -import org.simantics.g2d.diagram.handler.PickContext; -import org.simantics.g2d.diagram.handler.PickRequest; -import org.simantics.g2d.diagram.handler.PickRequest.PickPolicy; -import org.simantics.g2d.diagram.handler.TransactionContext.TransactionType; -import org.simantics.g2d.element.ElementUtils; -import org.simantics.g2d.element.IElement; -import org.simantics.scenegraph.g2d.events.EventHandlerReflection.EventHandler; -import org.simantics.scenegraph.g2d.events.command.Command; -import org.simantics.scenegraph.g2d.events.command.CommandEvent; -import org.simantics.scenegraph.g2d.events.command.Commands; -import org.simantics.utils.threads.ThreadUtils; - -import gnu.trove.map.hash.TObjectIntHashMap; - -/** - * This participant handles commands that manipulate z-ordering of elements. - * - * @author Toni Kalajainen - */ -public class ZOrderHandler extends AbstractDiagramParticipant { - - @Dependency Selection sel; - @Dependency PickContext pickContext; - - private final ListenerList zOrderListeners = new ListenerList(ListenerList.IDENTITY); - - public void addOrderListener(ZOrderListener listener) { - zOrderListeners.add(listener); - } - - public void removeOrderListener(ZOrderListener listener) { - zOrderListeners.remove(listener); - } - - @EventHandler(priority = 0) - public boolean handleCommand(CommandEvent ce) { - assertDependencies(); - Command c = ce.command; - - if (c.equals( Commands.BRING_UP )) { - final Set selectedElements = sel.getAllSelections(); - if (selectedElements==null || selectedElements.isEmpty()) return true; - //Shape area = ElementUtils.getElementBoundsOnDiagram(selectedElements); - Shape area = ElementUtils.getElementShapesOnDiagram(selectedElements); - if (area==null) return true; - final ArrayList pickedElements = new ArrayList(); - PickRequest req = new PickRequest(area); - req.pickPolicy = PickPolicy.PICK_INTERSECTING_OBJECTS; - pickContext.pick(diagram, req, pickedElements); - DiagramUtils.inDiagramTransaction(diagram, TransactionType.WRITE, new Runnable() { - @Override - public void run() { - List elements = diagram.getElements(); - - boolean changed = false; - int nextPos = elements.size()-1; - for (int i=pickedElements.size()-1; i>=0; i--) - { - IElement e = pickedElements.get(i); - int index = elements.indexOf(e); - if (index != -1 && selectedElements.contains(e)) { - changed |= diagram.moveTo(e, nextPos); - nextPos = index; - } - } - if (changed) { - notifyZOrderListeners(diagram); - setDirty(); - scheduleSynchronizeElementOrder(diagram); - } - } - }); - return true; - } - if (c.equals( Commands.SEND_DOWN)) { - final Set selectedElements = sel.getAllSelections(); - if (selectedElements==null || selectedElements.isEmpty()) return true; - //Shape area = ElementUtils.getElementBoundsOnDiagram(selectedElements); - Shape area = ElementUtils.getElementShapesOnDiagram(selectedElements); - if (area==null) return true; - final ArrayList pickedElements = new ArrayList(); - PickRequest req = new PickRequest(area); - req.pickPolicy = PickPolicy.PICK_INTERSECTING_OBJECTS; - pickContext.pick(diagram, req, pickedElements); - DiagramUtils.inDiagramTransaction(diagram, TransactionType.WRITE, new Runnable() { - @Override - public void run() { - List elements = diagram.getElements(); - - boolean changed = false; - int nextPos = 0; - for (int i=0; i> e : sel.getSelections().entrySet()) - { - ArrayList ll = new ArrayList(e.getValue()); - _sortByOrder(ll); - for (int i=ll.size()-1; i>=0; i--) { - if (diagram.containsElement(ll.get(i))) - changed |= diagram.bringToTop(ll.get(i)); - } - } - if (changed) { - notifyZOrderListeners(diagram); - setDirty(); - scheduleSynchronizeElementOrder(diagram); - } - } - }); - return true; - } - if (c.equals( Commands.SEND_TO_BOTTOM) ){ - DiagramUtils.inDiagramTransaction(diagram, TransactionType.WRITE, new Runnable() { - @Override - public void run() { - boolean changed = false; - for (Entry> e : sel.getSelections().entrySet()) - { - ArrayList ll = new ArrayList(e.getValue()); - _sortByOrder(ll); - for (int i=0; i { - DiagramUtils.mutateDiagram(diagram, m -> m.synchronizeElementOrder()); - //System.out.println("z-order synchronized to back-end"); - }); - } - - void notifyZOrderListeners(IDiagram diagram) { - for (Object l : zOrderListeners.getListeners()) { - ((ZOrderListener) l).orderChanged(diagram); - } - } - - void _sortByOrder(List list) - { - List elements = diagram.getElements(); - final TObjectIntHashMap position = new TObjectIntHashMap(); - for (IElement e : list) - position.put(e, elements.indexOf(e)); - Comparator c = new Comparator() { - @Override - public int compare(IElement o1, IElement o2) { - int pos1 = position.get(o1); - int pos2 = position.get(o2); - return pos2-pos1; - } - }; - Collections.sort(list, c); - } - -} +/******************************************************************************* + * Copyright (c) 2007, 2010 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 + *******************************************************************************/ +package org.simantics.g2d.diagram.participant; + +import java.awt.Shape; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map.Entry; +import java.util.Set; + +import org.eclipse.core.runtime.ListenerList; +import org.simantics.g2d.canvas.impl.DependencyReflection.Dependency; +import org.simantics.g2d.diagram.DiagramHints; +import org.simantics.g2d.diagram.DiagramUtils; +import org.simantics.g2d.diagram.IDiagram; +import org.simantics.g2d.diagram.handler.PickContext; +import org.simantics.g2d.diagram.handler.PickRequest; +import org.simantics.g2d.diagram.handler.PickRequest.PickPolicy; +import org.simantics.g2d.diagram.handler.TransactionContext.TransactionType; +import org.simantics.g2d.element.ElementUtils; +import org.simantics.g2d.element.IElement; +import org.simantics.scenegraph.g2d.events.EventHandlerReflection.EventHandler; +import org.simantics.scenegraph.g2d.events.command.Command; +import org.simantics.scenegraph.g2d.events.command.CommandEvent; +import org.simantics.scenegraph.g2d.events.command.Commands; +import org.simantics.utils.threads.ThreadUtils; + +import gnu.trove.map.hash.TObjectIntHashMap; + +/** + * This participant handles commands that manipulate z-ordering of elements. + * + * @author Toni Kalajainen + */ +public class ZOrderHandler extends AbstractDiagramParticipant { + + @Dependency Selection sel; + @Dependency PickContext pickContext; + + private final ListenerList zOrderListeners = new ListenerList<>(ListenerList.IDENTITY); + + public void addOrderListener(ZOrderListener listener) { + zOrderListeners.add(listener); + } + + public void removeOrderListener(ZOrderListener listener) { + zOrderListeners.remove(listener); + } + + @EventHandler(priority = 0) + public boolean handleCommand(CommandEvent ce) { + assertDependencies(); + Command c = ce.command; + + if (c.equals( Commands.BRING_UP )) { + final Set selectedElements = sel.getAllSelections(); + if (selectedElements==null || selectedElements.isEmpty()) return true; + //Shape area = ElementUtils.getElementBoundsOnDiagram(selectedElements); + Shape area = ElementUtils.getElementShapesOnDiagram(selectedElements); + if (area==null) return true; + final ArrayList pickedElements = new ArrayList(); + PickRequest req = new PickRequest(area).context(getContext()); + req.pickPolicy = PickPolicy.PICK_INTERSECTING_OBJECTS; + pickContext.pick(diagram, req, pickedElements); + DiagramUtils.inDiagramTransaction(diagram, TransactionType.WRITE, new Runnable() { + @Override + public void run() { + List elements = diagram.getElements(); + + boolean changed = false; + int nextPos = elements.size()-1; + for (int i=pickedElements.size()-1; i>=0; i--) + { + IElement e = pickedElements.get(i); + int index = elements.indexOf(e); + if (index != -1 && selectedElements.contains(e)) { + changed |= diagram.moveTo(e, nextPos); + } + nextPos = index; + } + if (changed) { + notifyZOrderListeners(diagram); + setDirty(); + scheduleSynchronizeElementOrder(diagram); + } + } + }); + return true; + } + if (c.equals( Commands.SEND_DOWN)) { + final Set selectedElements = sel.getAllSelections(); + if (selectedElements==null || selectedElements.isEmpty()) return true; + //Shape area = ElementUtils.getElementBoundsOnDiagram(selectedElements); + Shape area = ElementUtils.getElementShapesOnDiagram(selectedElements); + if (area==null) return true; + final ArrayList pickedElements = new ArrayList(); + PickRequest req = new PickRequest(area).context(getContext()); + req.pickPolicy = PickPolicy.PICK_INTERSECTING_OBJECTS; + pickContext.pick(diagram, req, pickedElements); + DiagramUtils.inDiagramTransaction(diagram, TransactionType.WRITE, new Runnable() { + @Override + public void run() { + List elements = diagram.getElements(); + + boolean changed = false; + int nextPos = 0; + for (int i=0; i> e : sel.getSelections().entrySet()) + { + ArrayList ll = new ArrayList(e.getValue()); + _sortByOrder(ll); + for (int i=ll.size()-1; i>=0; i--) { + if (diagram.containsElement(ll.get(i))) + changed |= diagram.bringToTop(ll.get(i)); + } + } + if (changed) { + notifyZOrderListeners(diagram); + setDirty(); + scheduleSynchronizeElementOrder(diagram); + } + } + }); + return true; + } + if (c.equals( Commands.SEND_TO_BOTTOM) ){ + DiagramUtils.inDiagramTransaction(diagram, TransactionType.WRITE, new Runnable() { + @Override + public void run() { + boolean changed = false; + for (Entry> e : sel.getSelections().entrySet()) + { + ArrayList ll = new ArrayList(e.getValue()); + _sortByOrder(ll); + for (int i=0; i { + DiagramUtils.mutateDiagram(diagram, m -> m.synchronizeElementOrder()); + //System.out.println("z-order synchronized to back-end"); + }); + } + + void notifyZOrderListeners(IDiagram diagram) { + for (Object l : zOrderListeners.getListeners()) { + ((ZOrderListener) l).orderChanged(diagram); + } + } + + void _sortByOrder(List list) + { + List elements = diagram.getElements(); + final TObjectIntHashMap position = new TObjectIntHashMap(); + for (IElement e : list) + position.put(e, elements.indexOf(e)); + Comparator c = new Comparator() { + @Override + public int compare(IElement o1, IElement o2) { + int pos1 = position.get(o1); + int pos2 = position.get(o2); + return pos2-pos1; + } + }; + Collections.sort(list, c); + } + +}