Search in sources :

Example 6 with PointLocationInShapeContext

use of cbit.vcell.graph.PointLocationInShapeContext in project vcell by virtualcell.

the class ReactionRuleEditorPropertiesPanel method initialize.

private void initialize() {
    try {
        shapePanel = new RulesShapePanel() {

            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                reactantShape.paintSelf(g);
                productShape.paintSelf(g);
            }
        };
        shapePanel.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                if (getViewSingleRowButton().isSelected()) {
                    return;
                }
                if (e.getButton() == 1) {
                    // left click selects the object (we highlight it)
                    Point whereClicked = e.getPoint();
                    PointLocationInShapeContext locationContext = new PointLocationInShapeContext(whereClicked);
                    reactantShape.setPointLocationInShapeContext(locationContext);
                    productShape.setPointLocationInShapeContext(locationContext);
                    manageMouseActivity(locationContext);
                } else if (e.getButton() == 3) {
                    // right click invokes popup menu (only if the object is highlighted)
                    Point whereClicked = e.getPoint();
                    PointLocationInShapeContext locationContext = new PointLocationInShapeContext(whereClicked);
                    reactantShape.setPointLocationInShapeContext(locationContext);
                    productShape.setPointLocationInShapeContext(locationContext);
                    manageMouseActivity(locationContext);
                    if (locationContext.getDeepestShape() != null && !locationContext.getDeepestShape().isHighlighted()) {
                    // TODO: (maybe) add code here to highlight the shape if it's not highlighted already but don't show the menu
                    // return;
                    }
                    showPopupMenu(e, locationContext);
                }
            }

            private void manageMouseActivity(PointLocationInShapeContext locationContext) {
                Graphics g = shapePanel.getGraphics();
                reactantShape.turnHighlightOffRecursive(g);
                productShape.turnHighlightOffRecursive(g);
                boolean found = false;
                if (reactantShape.contains(locationContext)) {
                    found = true;
                }
                if (!found) {
                    if (productShape.contains(locationContext)) {
                        // we just need to initialize the location context with the proper shapes under the cursor by calling "contains"
                        ;
                    }
                }
                locationContext.highlightDeepestShape();
                // if(locationContext.getDeepestShape() == null) {
                // // nothing selected means all the reactant bar or all the product bar is selected
                int xExtent = SpeciesPatternLargeShape.calculateXExtent(shapePanel);
                Rectangle2D reactantRectangle = new Rectangle2D.Double(xOffsetInitial - xExtent, yOffsetReactantInitial - 3, 3000, 80 - 2 + GraphConstants.ReactionRuleDisplay_ReservedSpaceForNameOnYAxis);
                Rectangle2D productRectangle = new Rectangle2D.Double(xOffsetInitial - xExtent, yOffsetProductInitial - 3, 3000, 80 - 2 + GraphConstants.ReactionRuleDisplay_ReservedSpaceForNameOnYAxis);
                if (locationContext.isInside(reactantRectangle)) {
                    reactantShape.paintSelf(g, true);
                } else if (locationContext.isInside(productRectangle)) {
                    productShape.paintSelf(g, true);
                // } else {
                // 
                // }
                // } else {
                // locationContext.paintDeepestShape(g);
                }
            }
        });
        shapePanel.addMouseMotionListener(new MouseMotionAdapter() {

            public void mouseMoved(MouseEvent e) {
                if (getViewSingleRowButton().isSelected()) {
                    shapePanel.setToolTipText("Single Row is view-only. To edit, unselect the 'Single Row Viewer' check box.");
                    return;
                }
                Point overWhat = e.getPoint();
                PointLocationInShapeContext locationContext = new PointLocationInShapeContext(overWhat);
                boolean inReactant = reactantShape.contains(locationContext);
                boolean inProduct = productShape.contains(locationContext);
                HighlightableShapeInterface hsi = locationContext.getDeepestShape();
                if (hsi == null) {
                    shapePanel.setToolTipText(null);
                } else {
                    shapePanel.setToolTipText("Right click for " + hsi.getDisplayType() + " menus");
                }
                List<SpeciesPatternLargeShape> spsList = null;
                if (inReactant) {
                    spsList = reactantShape.getSpeciesPatternShapeList();
                } else if (inProduct) {
                    spsList = productShape.getSpeciesPatternShapeList();
                }
                if (spsList != null) {
                    for (SpeciesPatternLargeShape sps : spsList) {
                        for (MolecularTypeLargeShape mtls : sps.getMolecularTypeLargeShapes()) {
                            Rectangle r = mtls.getAnchorHotspot();
                            if (r != null && r.contains(overWhat)) {
                                mtls.getMolecularType();
                                shapePanel.setToolTipText(mtls.getAnchorsHTML());
                                break;
                            }
                        }
                    }
                }
            }
        });
        shapePanel.setLayout(new GridBagLayout());
        shapePanel.setBackground(Color.white);
        shapePanel.zoomSmaller();
        shapePanel.zoomSmaller();
        getZoomSmallerButton().setEnabled(true);
        getZoomLargerButton().setEnabled(true);
        scrollPane = new JScrollPane(shapePanel);
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        isReversibleCheckBox = new JCheckBox("Reversible");
        isReversibleCheckBox.setHorizontalTextPosition(SwingConstants.LEFT);
        isReversibleCheckBox.addActionListener(eventHandler);
        isReversibleCheckBox.setEnabled(true);
        JPanel optionsPanel = new JPanel();
        optionsPanel.setPreferredSize(new Dimension(156, 200));
        optionsPanel.setLayout(new GridBagLayout());
        int gridy = 0;
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = gridy;
        gbc.insets = new Insets(6, 1, 2, 2);
        gbc.anchor = GridBagConstraints.WEST;
        optionsPanel.add(isReversibleCheckBox, gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 1;
        gbc.gridy = gridy;
        gbc.insets = new Insets(0, 0, 0, 0);
        // empty cell to take all available horizontal space and push the next 2 buttons to the right
        gbc.weightx = 1;
        gbc.anchor = GridBagConstraints.WEST;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        optionsPanel.add(new JLabel(""), gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 2;
        gbc.gridy = gridy;
        gbc.insets = new Insets(6, 2, 2, 2);
        gbc.anchor = GridBagConstraints.EAST;
        optionsPanel.add(getZoomLargerButton(), gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 3;
        gbc.gridy = gridy;
        gbc.insets = new Insets(6, 2, 2, 4);
        gbc.anchor = GridBagConstraints.EAST;
        optionsPanel.add(getZoomSmallerButton(), gbc);
        gridy++;
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = gridy;
        gbc.gridwidth = 4;
        // top, left bottom, right
        gbc.insets = new Insets(4, 4, 2, 4);
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.anchor = GridBagConstraints.NORTHWEST;
        optionsPanel.add(getAddReactantButton(), gbc);
        gridy++;
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = gridy;
        gbc.gridwidth = 4;
        gbc.insets = new Insets(2, 4, 4, 4);
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.anchor = GridBagConstraints.NORTHWEST;
        optionsPanel.add(getAddProductButton(), gbc);
        gridy++;
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = gridy;
        gbc.gridwidth = 4;
        gbc.weightx = 1;
        // fake cell used for filling all the vertical empty space
        gbc.weighty = 1;
        gbc.anchor = GridBagConstraints.WEST;
        gbc.insets = new Insets(4, 4, 4, 10);
        optionsPanel.add(new JLabel(""), gbc);
        // -----------------------------------------------------------
        gridy++;
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = gridy;
        gbc.gridwidth = 4;
        gbc.insets = new Insets(2, 4, 0, 4);
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.anchor = GridBagConstraints.SOUTHWEST;
        optionsPanel.add(getViewSingleRowButton(), gbc);
        gridy++;
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = gridy;
        gbc.gridwidth = 4;
        gbc.insets = new Insets(0, 4, 4, 4);
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.anchor = GridBagConstraints.SOUTHWEST;
        optionsPanel.add(getShowMoleculeColorButton(), gbc);
        gridy++;
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = gridy;
        gbc.gridwidth = 4;
        gbc.insets = new Insets(0, 4, 4, 4);
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.anchor = GridBagConstraints.SOUTHWEST;
        optionsPanel.add(getShowNonTrivialButton(), gbc);
        gridy++;
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = gridy;
        gbc.gridwidth = 3;
        gbc.insets = new Insets(0, 4, 4, 4);
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.anchor = GridBagConstraints.SOUTHWEST;
        optionsPanel.add(getShowDifferencesButton(), gbc);
        // set initial buttons' state
        getViewSingleRowButton().setSelected(false);
        getShowMoleculeColorButton().setSelected(true);
        getShowNonTrivialButton().setSelected(true);
        getShowDifferencesButton().setSelected(false);
        shapePanel.setViewSingleRow(getViewSingleRowButton().isSelected());
        shapePanel.setShowMoleculeColor(getShowMoleculeColorButton().isSelected());
        shapePanel.setShowNonTrivialOnly(getShowNonTrivialButton().isSelected());
        shapePanel.setShowDifferencesOnly(getShowDifferencesButton().isSelected());
        // ----------------------------------------------------------
        containerOfScrollPanel = new JPanel();
        containerOfScrollPanel.setLayout(new BorderLayout());
        containerOfScrollPanel.add(optionsPanel, BorderLayout.WEST);
        containerOfScrollPanel.add(scrollPane, BorderLayout.CENTER);
        reactantTree = new BioModelNodeEditableTree();
        reactantTreeModel = new ReactionRulePropertiesTreeModel(reactantTree, ReactionRuleParticipantType.Reactant);
        reactantTree.setModel(reactantTreeModel);
        productTree = new BioModelNodeEditableTree();
        productTreeModel = new ReactionRulePropertiesTreeModel(productTree, ReactionRuleParticipantType.Product);
        productTree.setModel(productTreeModel);
        setLayout(new BorderLayout());
        add(containerOfScrollPanel, BorderLayout.CENTER);
        setBackground(Color.white);
    } catch (java.lang.Throwable ivjExc) {
        handleException(ivjExc);
    }
}
Also used : JPanel(javax.swing.JPanel) GridBagConstraints(java.awt.GridBagConstraints) Insets(java.awt.Insets) GridBagLayout(java.awt.GridBagLayout) Rectangle(java.awt.Rectangle) SpeciesPatternLargeShape(cbit.vcell.graph.SpeciesPatternLargeShape) RulesShapePanel(cbit.vcell.graph.gui.RulesShapePanel) MolecularTypeLargeShape(cbit.vcell.graph.MolecularTypeLargeShape) BorderLayout(java.awt.BorderLayout) List(java.util.List) ArrayList(java.util.ArrayList) JScrollPane(javax.swing.JScrollPane) MouseEvent(java.awt.event.MouseEvent) MouseAdapter(java.awt.event.MouseAdapter) Rectangle2D(java.awt.geom.Rectangle2D) HighlightableShapeInterface(cbit.vcell.graph.HighlightableShapeInterface) JLabel(javax.swing.JLabel) Point(java.awt.Point) Dimension(java.awt.Dimension) PointLocationInShapeContext(cbit.vcell.graph.PointLocationInShapeContext) Point(java.awt.Point) Graphics(java.awt.Graphics) JCheckBox(javax.swing.JCheckBox) MouseMotionAdapter(java.awt.event.MouseMotionAdapter)

Aggregations

PointLocationInShapeContext (cbit.vcell.graph.PointLocationInShapeContext)6 BorderLayout (java.awt.BorderLayout)6 Graphics (java.awt.Graphics)6 GridBagConstraints (java.awt.GridBagConstraints)6 GridBagLayout (java.awt.GridBagLayout)6 Insets (java.awt.Insets)6 Point (java.awt.Point)6 MouseEvent (java.awt.event.MouseEvent)6 MouseMotionAdapter (java.awt.event.MouseMotionAdapter)6 JLabel (javax.swing.JLabel)6 JPanel (javax.swing.JPanel)6 JScrollPane (javax.swing.JScrollPane)6 HighlightableShapeInterface (cbit.vcell.graph.HighlightableShapeInterface)4 MolecularTypeLargeShape (cbit.vcell.graph.MolecularTypeLargeShape)4 RuleAnalysisChanged (cbit.vcell.graph.ReactionCartoon.RuleAnalysisChanged)4 GroupingCriteria (cbit.vcell.model.GroupingCriteria)4 RuleParticipantSignature (cbit.vcell.model.RuleParticipantSignature)4 Dimension (java.awt.Dimension)4 Rectangle (java.awt.Rectangle)4 MouseAdapter (java.awt.event.MouseAdapter)4