hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowScene.java
author never
Tue, 24 Jun 2008 16:00:14 -0700
changeset 768 d0bebc7eefc2
child 1497 cd3234c89e59
permissions -rw-r--r--
6718676: putback for 6604014 is incomplete Reviewed-by: kvn, jrose
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
768
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
     1
/*
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
     2
 * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
     4
 *
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
     7
 * published by the Free Software Foundation.
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
     8
 *
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    13
 * accompanied this code).
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    14
 *
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    18
 *
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    19
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    20
 * CA 95054 USA or visit www.sun.com if you need additional information or
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    21
 * have any questions.
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    22
 *
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    23
 */
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    24
package com.sun.hotspot.igv.controlflow;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    25
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    26
import com.sun.hotspot.igv.data.InputBlock;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    27
import com.sun.hotspot.igv.data.InputBlockEdge;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    28
import com.sun.hotspot.igv.data.InputGraph;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    29
import com.sun.hotspot.igv.data.services.InputGraphProvider;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    30
import com.sun.hotspot.igv.data.InputNode;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    31
import java.awt.Color;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    32
import java.awt.Point;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    33
import java.awt.Rectangle;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    34
import java.util.ArrayList;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    35
import java.util.HashSet;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    36
import java.util.Hashtable;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    37
import java.util.Set;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    38
import javax.swing.BorderFactory;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    39
import org.netbeans.api.visual.action.ActionFactory;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    40
import org.netbeans.api.visual.action.MoveProvider;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    41
import org.netbeans.api.visual.action.RectangularSelectDecorator;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    42
import org.netbeans.api.visual.action.RectangularSelectProvider;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    43
import org.netbeans.api.visual.action.SelectProvider;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    44
import org.netbeans.api.visual.action.WidgetAction;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    45
import org.netbeans.api.visual.anchor.AnchorFactory;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    46
import org.netbeans.api.visual.anchor.AnchorShape;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    47
import com.sun.hotspot.igv.controlflow.HierarchicalGraphLayout;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    48
import org.netbeans.api.visual.layout.LayoutFactory;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    49
import org.netbeans.api.visual.router.RouterFactory;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    50
import org.netbeans.api.visual.widget.LayerWidget;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    51
import org.netbeans.api.visual.widget.Widget;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    52
import org.netbeans.api.visual.graph.GraphScene;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    53
import org.netbeans.api.visual.graph.layout.GraphLayout;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    54
import org.netbeans.api.visual.layout.SceneLayout;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    55
import org.netbeans.api.visual.widget.ConnectionWidget;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    56
import org.openide.util.Lookup;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    57
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    58
/**
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    59
 *
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    60
 * @author Thomas Wuerthinger
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    61
 */
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    62
public class ControlFlowScene extends GraphScene<InputBlock, InputBlockEdge> implements SelectProvider, MoveProvider, RectangularSelectDecorator, RectangularSelectProvider {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    63
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    64
    private Set<BlockWidget> selection;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    65
    private Hashtable<InputBlock, BlockWidget> blockMap;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    66
    private InputGraph oldGraph;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    67
    private LayerWidget edgeLayer;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    68
    private LayerWidget mainLayer;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    69
    private LayerWidget selectLayer;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    70
    private WidgetAction hoverAction = this.createWidgetHoverAction();
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    71
    private WidgetAction selectAction = ActionFactory.createSelectAction(this);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    72
    private WidgetAction moveAction = ActionFactory.createMoveAction(null, this);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    73
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    74
    public ControlFlowScene() {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    75
        selection = new HashSet<BlockWidget>();
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    76
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    77
        this.getInputBindings().setZoomActionModifiers(0);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    78
        this.setLayout(LayoutFactory.createAbsoluteLayout());
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    79
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    80
        mainLayer = new LayerWidget(this);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    81
        this.addChild(mainLayer);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    82
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    83
        edgeLayer = new LayerWidget(this);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    84
        this.addChild(edgeLayer);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    85
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    86
        selectLayer = new LayerWidget(this);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    87
        this.addChild(selectLayer);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    88
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    89
        this.getActions().addAction(hoverAction);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    90
        this.getActions().addAction(selectAction);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    91
        this.getActions().addAction(ActionFactory.createRectangularSelectAction(this, selectLayer, this));
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    92
        this.getActions().addAction(ActionFactory.createMouseCenteredZoomAction(1.1));
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    93
    }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    94
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    95
    public void setGraph(InputGraph g) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    96
        if (g == oldGraph) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    97
            return;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    98
        }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
    99
        oldGraph = g;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   100
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   101
        ArrayList<InputBlock> blocks = new ArrayList<InputBlock>(this.getNodes());
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   102
        for (InputBlock b : blocks) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   103
            removeNode(b);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   104
        }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   105
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   106
        ArrayList<InputBlockEdge> edges = new ArrayList<InputBlockEdge>(this.getEdges());
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   107
        for (InputBlockEdge e : edges) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   108
            removeEdge(e);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   109
        }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   110
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   111
        for (InputBlock b : g.getBlocks()) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   112
            addNode(b);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   113
        }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   114
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   115
        for (InputBlock b : g.getBlocks()) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   116
            for (InputBlockEdge e : b.getOutputs()) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   117
                addEdge(e);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   118
                assert g.getBlocks().contains(e.getFrom());
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   119
                assert g.getBlocks().contains(e.getTo());
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   120
                this.setEdgeSource(e, e.getFrom());
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   121
                this.setEdgeTarget(e, e.getTo());
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   122
            }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   123
        }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   124
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   125
        GraphLayout layout = new HierarchicalGraphLayout();//GridGraphLayout();
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   126
        SceneLayout sceneLayout = LayoutFactory.createSceneGraphLayout(this, layout);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   127
        sceneLayout.invokeLayout();
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   128
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   129
        this.validate();
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   130
    }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   131
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   132
    public BlockWidget getBlockWidget(InputBlock b) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   133
        return blockMap.get(b);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   134
    }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   135
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   136
    public void clearSelection() {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   137
        for (BlockWidget w : selection) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   138
            w.setState(w.getState().deriveSelected(false));
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   139
        }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   140
        selection.clear();
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   141
        selectionChanged();
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   142
    }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   143
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   144
    public void selectionChanged() {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   145
        InputGraphProvider p = Lookup.getDefault().lookup(InputGraphProvider.class);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   146
        if (p != null) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   147
            Set<InputNode> inputNodes = new HashSet<InputNode>();
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   148
            for (BlockWidget w : selection) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   149
                inputNodes.addAll(w.getBlock().getNodes());
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   150
            }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   151
            p.setSelectedNodes(inputNodes);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   152
        }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   153
    }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   154
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   155
    public void addToSelection(BlockWidget widget) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   156
        widget.setState(widget.getState().deriveSelected(true));
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   157
        selection.add(widget);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   158
        selectionChanged();
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   159
    }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   160
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   161
    public void removeFromSelection(BlockWidget widget) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   162
        widget.setState(widget.getState().deriveSelected(false));
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   163
        selection.remove(widget);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   164
        selectionChanged();
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   165
    }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   166
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   167
    public boolean isAimingAllowed(Widget widget, Point point, boolean b) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   168
        return false;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   169
    }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   170
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   171
    public boolean isSelectionAllowed(Widget widget, Point point, boolean b) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   172
        return true;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   173
    }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   174
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   175
    public void select(Widget widget, Point point, boolean change) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   176
        if (widget == this) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   177
            clearSelection();
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   178
        } else {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   179
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   180
            assert widget instanceof BlockWidget;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   181
            BlockWidget bw = (BlockWidget) widget;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   182
            if (change) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   183
                if (selection.contains(bw)) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   184
                    removeFromSelection(bw);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   185
                } else {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   186
                    addToSelection(bw);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   187
                }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   188
            } else {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   189
                if (!selection.contains(bw)) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   190
                    clearSelection();
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   191
                    addToSelection(bw);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   192
                }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   193
            }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   194
        }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   195
    }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   196
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   197
    public void movementStarted(Widget widget) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   198
    }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   199
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   200
    public void movementFinished(Widget widget) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   201
    }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   202
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   203
    public Point getOriginalLocation(Widget widget) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   204
        return widget.getPreferredLocation();
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   205
    }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   206
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   207
    public void setNewLocation(Widget widget, Point location) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   208
        Point originalLocation = getOriginalLocation(widget);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   209
        int xOffset = location.x - originalLocation.x;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   210
        int yOffset = location.y - originalLocation.y;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   211
        for (Widget w : this.selection) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   212
            Point p = new Point(w.getPreferredLocation());
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   213
            p.translate(xOffset, yOffset);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   214
            w.setPreferredLocation(p);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   215
        }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   216
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   217
    }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   218
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   219
    public Widget createSelectionWidget() {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   220
        Widget widget = new Widget(this);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   221
        widget.setOpaque(false);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   222
        widget.setBorder(BorderFactory.createLineBorder(Color.black, 2));
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   223
        widget.setForeground(Color.red);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   224
        return widget;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   225
    }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   226
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   227
    public void performSelection(Rectangle rectangle) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   228
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   229
        if (rectangle.width < 0) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   230
            rectangle.x += rectangle.width;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   231
            rectangle.width *= -1;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   232
        }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   233
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   234
        if (rectangle.height < 0) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   235
            rectangle.y += rectangle.height;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   236
            rectangle.height *= -1;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   237
        }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   238
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   239
        boolean changed = false;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   240
        for (InputBlock b : this.getNodes()) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   241
            BlockWidget w = (BlockWidget) findWidget(b);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   242
            Rectangle r = new Rectangle(w.getBounds());
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   243
            r.setLocation(w.getLocation());
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   244
            if (r.intersects(rectangle)) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   245
                if (!selection.contains(w)) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   246
                    changed = true;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   247
                    selection.add(w);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   248
                    w.setState(w.getState().deriveSelected(true));
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   249
                }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   250
            } else {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   251
                if (selection.contains(w)) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   252
                    changed = true;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   253
                    selection.remove(w);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   254
                    w.setState(w.getState().deriveSelected(false));
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   255
                }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   256
            }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   257
        }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   258
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   259
        if (changed) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   260
            selectionChanged();
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   261
        }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   262
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   263
    }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   264
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   265
    protected Widget attachNodeWidget(InputBlock node) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   266
        BlockWidget w = new BlockWidget(this, node);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   267
        mainLayer.addChild(w);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   268
        w.getActions().addAction(hoverAction);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   269
        w.getActions().addAction(selectAction);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   270
        w.getActions().addAction(moveAction);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   271
        return w;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   272
    }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   273
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   274
    protected Widget attachEdgeWidget(InputBlockEdge edge) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   275
        ConnectionWidget w = new BlockConnectionWidget(this, edge);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   276
        w.setRouter(RouterFactory.createDirectRouter());
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   277
        w.setTargetAnchorShape(AnchorShape.TRIANGLE_FILLED);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   278
        edgeLayer.addChild(w);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   279
        return w;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   280
    }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   281
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   282
    protected void attachEdgeSourceAnchor(InputBlockEdge edge, InputBlock oldSourceNode, InputBlock sourceNode) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   283
        Widget w = this.findWidget(edge);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   284
        assert w instanceof ConnectionWidget;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   285
        ConnectionWidget cw = (ConnectionWidget) w;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   286
        cw.setSourceAnchor(AnchorFactory.createRectangularAnchor(findWidget(sourceNode)));
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   287
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   288
    }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   289
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   290
    protected void attachEdgeTargetAnchor(InputBlockEdge edge, InputBlock oldTargetNode, InputBlock targetNode) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   291
        Widget w = this.findWidget(edge);
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   292
        assert w instanceof ConnectionWidget;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   293
        ConnectionWidget cw = (ConnectionWidget) w;
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   294
        cw.setTargetAnchor(AnchorFactory.createRectangularAnchor(findWidget(targetNode)));
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   295
    }
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents:
diff changeset
   296
}