package com.horstmann.violet.workspace.sidebar.graphtools; import java.awt.GridLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; import javax.swing.JPanel; public class GraphToolsBarPanel extends JPanel { public GraphToolsBarPanel(GraphToolsBar umlToolsPanel) { super(); this.graphToolsPanel = umlToolsPanel; this.nodeButtons = getToggleButtons(this.graphToolsPanel.getNodeTools()); this.edgeButtons = getToggleButtons(this.graphToolsPanel.getEdgeTools()); this.graphToolsPanel.addListener(getGraphToolsPanelListener()); } private IGraphToolsBarListener getGraphToolsPanelListener() { if (this.listener == null) { this.listener = new IGraphToolsBarListener() { public void toolSelectionChanged(GraphTool selectedTool) { for (GraphToolsBarButton aButton : nodeButtons) { if (aButton.getTool().equals(selectedTool)) { setSelectedButton(aButton); return; } } for (GraphToolsBarButton aButton : edgeButtons) { if (aButton.getTool().equals(selectedTool)) { setSelectedButton(aButton); return; } } } }; } return this.listener; } /** * @param diagram tools * @return buttons representing tools */ private List<GraphToolsBarButton> getToggleButtons(List<GraphTool> tools) { List<GraphToolsBarButton> buttons = new ArrayList<GraphToolsBarButton>(); for (GraphTool aTool : tools) { final GraphToolsBarButton button = new GraphToolsBarButton(aTool); buttons.add(button); } return buttons; } /** * @return curretly selected button */ private GraphToolsBarButton getSelectedButton() { for (GraphToolsBarButton button : this.nodeButtons) { if (button.isSelected()) { return button; } } for (GraphToolsBarButton button : this.edgeButtons) { if (button.isSelected()) { return button; } } return this.nodeButtons.get(0); } /** * @return all node_old buttons */ public List<GraphToolsBarButton> getNodeButtons() { return this.nodeButtons; } /** * @return all edge buttons */ public List<GraphToolsBarButton> getEdgeButtons() { return this.edgeButtons; } public void selectNextButton() { int nextPos = 0; GraphToolsBarButton selectedButton = getSelectedButton(); int posForNodes = this.nodeButtons.indexOf(selectedButton); if (posForNodes >= 0) { nextPos = posForNodes + 1; if (nextPos < this.nodeButtons.size()) { setSelectedButton(this.nodeButtons.get(nextPos)); } if (nextPos >= this.nodeButtons.size() && this.edgeButtons.size() > 0) { setSelectedButton(this.edgeButtons.get(0)); } return; } int posForEdges = this.edgeButtons.indexOf(selectedButton); if (posForEdges >= 0) { nextPos = posForEdges + 1; if (nextPos < this.edgeButtons.size()) { setSelectedButton(this.edgeButtons.get(nextPos)); } return; } } public void selectPreviousButton() { int previousPos = 0; GraphToolsBarButton selectedButton = getSelectedButton(); int posForNodes = this.nodeButtons.indexOf(selectedButton); if (posForNodes >= 0) { previousPos = posForNodes - 1; if (previousPos >= 0) { setSelectedButton(this.nodeButtons.get(previousPos)); } return; } int posForEdges = this.edgeButtons.indexOf(selectedButton); if (posForEdges >= 0) { previousPos = posForEdges - 1; if (previousPos >= 0) { setSelectedButton(this.edgeButtons.get(previousPos)); } if (previousPos < 0 && this.nodeButtons.size() > 0) { setSelectedButton(this.nodeButtons.get(this.nodeButtons.size() - 1)); } return; } } /** * Performs button select * * @param selectedButton to be considered as selected */ private void setSelectedButton(GraphToolsBarButton selectedButton) { for (GraphToolsBarButton button : this.nodeButtons) { if (button != selectedButton) { button.setSelected(false); } if (button == selectedButton) { button.setSelected(true); int pos = this.nodeButtons.indexOf(button); this.graphToolsPanel.setSelectedTool(this.graphToolsPanel.getNodeTools().get(pos)); } } for (GraphToolsBarButton button : this.edgeButtons) { if (button != selectedButton) { button.setSelected(false); } if (button == selectedButton) { button.setSelected(true); int pos = this.edgeButtons.indexOf(button); this.graphToolsPanel.setSelectedTool(this.graphToolsPanel.getEdgeTools().get(pos)); } } } private void notifyMouseEvent(GraphToolsBarButton selectedButton, MouseEvent event) { for (GraphToolsBarButton button : this.nodeButtons) { if (button == selectedButton) { int pos = this.nodeButtons.indexOf(button); this.graphToolsPanel.notifyMouseEvent(this.graphToolsPanel.getNodeTools().get(pos), event); } } for (GraphToolsBarButton button : this.edgeButtons) { if (button == selectedButton) { int pos = this.edgeButtons.indexOf(button); this.graphToolsPanel.notifyMouseEvent(this.graphToolsPanel.getEdgeTools().get(pos), event); } } } /** * @return panel containing node_old buttons */ public JPanel getNodeButtonsPanel() { if (this.nodeButtonsPanel == null) { this.nodeButtonsPanel = getButtonPanel(this.nodeButtons); } return this.nodeButtonsPanel; } /** * @return panel containing edge buttons */ public JPanel getEdgeButtonsPanel() { if (this.edgeButtonsPanel == null) { this.edgeButtonsPanel = getButtonPanel(this.edgeButtons); } return this.edgeButtonsPanel; } /** * Creates a panel that contains custom toggle buttons. Also sets mouse listeners. * * @param buttons to be added to this panel * @return JPanel */ private JPanel getButtonPanel(List<GraphToolsBarButton> buttons) { JPanel buttonPanel = new JPanel(); for (final GraphToolsBarButton button : buttons) { button.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent arg0) { notifyMouseEvent(button, arg0); } public void mouseReleased(MouseEvent arg0) { notifyMouseEvent(button, arg0); } public void mouseClicked(MouseEvent arg0) { setSelectedButton(button); } }); button.addMouseMotionListener(new MouseAdapter() { public void mouseDragged(MouseEvent arg0) { notifyMouseEvent(button, arg0); } }); buttonPanel.add(button); } buttonPanel.setLayout(new GridLayout(0, 1)); // buttonPanel.addMouseWheelListener(new MouseWheelListener() // { // // public void mouseWheelMoved(MouseWheelEvent e) // { // boolean isCtrl = (e.getModifiersEx() & InputEvent.CTRL_DOWN_MASK) != 0; // if (isCtrl) { // return; // } // int scroll = e.getUnitsToScroll(); // if (scroll > 0) // { // selectNextButton(); // } // if (scroll < 0) // { // selectPreviousButton(); // } // } // // }); return buttonPanel; } private IGraphToolsBarListener listener; private GraphToolsBar graphToolsPanel; private List<GraphToolsBarButton> nodeButtons; private List<GraphToolsBarButton> edgeButtons; private JPanel nodeButtonsPanel; private JPanel edgeButtonsPanel; }