/******************************************************************************** * * * (c) Copyright 2010 Verizon Communications USA and The Open University UK * * * * This software is freely distributed in accordance with * * the GNU Lesser General Public (LGPL) license, version 3 or later * * as published by the Free Software Foundation. * * For details see LGPL: http://www.fsf.org/licensing/licenses/lgpl.html * * and GPL: http://www.fsf.org/licensing/licenses/gpl-3.0.html * * * * This software is provided by the copyright holders and contributors "as is" * * and any express or implied warranties, including, but not limited to, the * * implied warranties of merchantability and fitness for a particular purpose * * are disclaimed. In no event shall the copyright owner or contributors be * * liable for any direct, indirect, incidental, special, exemplary, or * * consequential damages (including, but not limited to, procurement of * * substitute goods or services; loss of use, data, or profits; or business * * interruption) however caused and on any theory of liability, whether in * * contract, strict liability, or tort (including negligence or otherwise) * * arising in any way out of the use of this software, even if advised of the * * possibility of such damage. * * * ********************************************************************************/ package com.compendium.ui.toolbars.system; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Event; import java.awt.Font; import java.awt.GridLayout; import java.awt.Insets; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.help.CSH; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.DefaultListCellRenderer; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.KeyStroke; import javax.swing.SwingConstants; import javax.swing.border.BevelBorder; import javax.swing.border.EmptyBorder; /** * UIToolBarFloater defines a dialog to display a floating toolbar in. * * @author Michelle Bachler */ public class UIToolBarFloater extends JDialog implements ActionListener { /** The main conatiner of the dialog. */ private Container oContentPane = null; /** The parent Frame the dialog will be drawn in. */ private JFrame oParent = null; /** The toolbar manager the flaoting toolbar is responsible to.*/ private IUIToolBarManager oManager = null; /** The toolbar placed in this flaoting toolbar dialog.*/ private UIToolBar oToolBar = null; /** The toolbar type.*/ private int nType = -1; /** The allowed docable orientations of this toolbar.*/ private int nDockableOrientation = -1; /** The button to dock the toolbar on the north.*/ private JButton upButton = null; /** The button to dock the toolbar on the south.*/ private JButton downButton = null; /** The button to dock the toolbar on the west.*/ private JButton leftButton = null; /** The button to dock the toolbar on the east.*/ private JButton rightButton = null; /** The choicebox for the node label font size.*/ private JComboBox cbRows = null; /** The panel for the font size choice box.*/ private JPanel rowsPanel = null; /** the row that the toolbar was in before being floated.*/ private int nRow = 0; /** The main panel the contents is drawn in.*/ protected JPanel mainPanel = null; /** * Initializes and sets up this toolbar floating dialog palette. */ public UIToolBarFloater(IUIToolBarManager manager, UIToolBar bar, int type, int row) { super(manager.getToolBarFloatFrame(), false); JFrame parent = manager.getToolBarFloatFrame(); this.oParent = parent; this.oManager = manager; this.oToolBar = bar; this.nType = type; this.nRow = row; // REGISTER SELF WITH MANAGER oManager.addFloatingToolBar(this); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { onCancel(); } }); mainPanel = new JPanel(); setContentPane(mainPanel); Action actionEnter = new CreateAction(KeyEvent.VK_ENTER, InputEvent.CTRL_MASK); mainPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.CTRL_MASK),"enter"); mainPanel.getActionMap().put("enter", actionEnter); Action actionEscape = new CreateAction(KeyEvent.VK_ESCAPE, 0); mainPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),"escape"); mainPanel.getActionMap().put("escape", actionEscape); Action actionW = new CreateAction(KeyEvent.VK_W, InputEvent.CTRL_MASK); mainPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_W, InputEvent.CTRL_MASK),"w"); mainPanel.getActionMap().put("w", actionW); // WHATEVER ORIENTATION IT MAY HAVE BEEN, IT NEEDS TO BE HORIZONTAL NOW bar.setOrientation(SwingConstants.HORIZONTAL); setTitle(bar.getName()); oContentPane = getContentPane(); oContentPane.setLayout(new BorderLayout()); upButton = new JButton(); upButton.setIcon(UIToolBarImages.get(UIToolBarImages.TOOLBAR_DOWN_SOUTH_ICON)); upButton.setToolTipText("Dock toolbar to the top"); upButton.setMargin(new Insets(0,0,0,0)); upButton.addActionListener(this); upButton.setFocusPainted(false); leftButton = new JButton(); leftButton.setIcon(UIToolBarImages.get(UIToolBarImages.TOOLBAR_DOWN_EAST_ICON)); leftButton.setToolTipText("Dock toobar to the left"); leftButton.setMargin(new Insets(0,0,0,0)); leftButton.addActionListener(this); leftButton.setFocusPainted(false); rightButton = new JButton(); rightButton.setIcon(UIToolBarImages.get(UIToolBarImages.TOOLBAR_DOWN_WEST_ICON)); rightButton.setToolTipText("Dock toobar to the right"); rightButton.setMargin(new Insets(0,0,0,0)); rightButton.addActionListener(this); rightButton.setFocusPainted(false); downButton = new JButton(); downButton.setIcon(UIToolBarImages.get(UIToolBarImages.TOOLBAR_DOWN_NORTH_ICON)); downButton.setToolTipText("Dock toolbar to the bottom"); downButton.setMargin(new Insets(0,0,0,0)); downButton.addActionListener(this); downButton.setFocusPainted(false); nDockableOrientation = bar.getDockableOrientation(); if (nDockableOrientation == UIToolBar.NORTHSOUTH) { leftButton.setEnabled(false); rightButton.setEnabled(false); } else if (nDockableOrientation == UIToolBar.EASTWEST) { upButton.setEnabled(false); downButton.setEnabled(false); } GridLayout grid = new GridLayout(2,2); grid.setVgap(0); grid.setHgap(0); JPanel buttonPanel = new JPanel(grid); buttonPanel.setBorder(new EmptyBorder(0,0,0,5)); buttonPanel.add(upButton); buttonPanel.add(downButton); buttonPanel.add(leftButton); buttonPanel.add(rightButton); JPanel oControlPanel = new JPanel(new BorderLayout()); oControlPanel.setBorder(new BevelBorder(BevelBorder.RAISED)); oControlPanel.add(createRowChoiceBox(), BorderLayout.WEST); oControlPanel.add(buttonPanel, BorderLayout.EAST); oContentPane.add(oControlPanel, BorderLayout.WEST); oContentPane.add(oToolBar, BorderLayout.CENTER); pack(); setResizable(false); } /** * Create a choicbox for node label size face setting. * @return JPanel, the panel holding the new choicebox for the node label size font face. */ private JPanel createRowChoiceBox() { BorderLayout layout = new BorderLayout(); layout.setHgap(0); layout.setVgap(0); rowsPanel = new JPanel(layout); CSH.setHelpIDString(rowsPanel,"toolbars.format"); Integer[] sizes = {new Integer(1), new Integer(2), new Integer(3), new Integer(4)}; cbRows = new JComboBox(sizes); cbRows.setOpaque(true); cbRows.setEditable(false); cbRows.setEnabled(true); cbRows.setMaximumRowCount(10); cbRows.setFont( new Font("Dialog", Font.PLAIN, 10 )); cbRows.validate(); cbRows.setSelectedIndex(nRow); DefaultListCellRenderer fontSizeRenderer = new DefaultListCellRenderer() { public Component getListCellRendererComponent( JList list, Object value, int modelIndex, boolean isSelected, boolean cellHasFocus) { if (list != null) { if (isSelected) { setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground()); } else { setBackground(list.getBackground()); setForeground(list.getForeground()); } } setText( "row "+((Integer) value).toString()+" "); return this; } }; cbRows.setRenderer(fontSizeRenderer); rowsPanel.add(new JLabel(" "), BorderLayout.WEST); rowsPanel.add(cbRows, BorderLayout.CENTER); rowsPanel.add(new JLabel(" "), BorderLayout.EAST); cbRows.setSize(new Dimension(cbRows.getWidth()/2, cbRows.getHeight())); return rowsPanel; } /** * Process a button pushed event. * * @param ActionEvent evt, the event object. */ public void actionPerformed(ActionEvent evt) { Object source = evt.getSource(); // UNREGISTER SELF WITH MANAGER oManager.removeFloatingToolBar(this); if (source.equals(upButton)) { nRow = ((Integer)cbRows.getSelectedItem()).intValue()-1; UIToolBarController topController = oManager.getTopToolBarController(); topController.addToolBar(oToolBar, nType, true, true, true, nRow); setVisible(false); dispose(); } else if (source.equals(leftButton)) { nRow = ((Integer)cbRows.getSelectedItem()).intValue()-1; UIToolBarController leftController = oManager.getLeftToolBarController(); leftController.addToolBar(oToolBar, nType, true, true, true, nRow); setVisible(false); dispose(); } else if (source.equals(rightButton)) { nRow = ((Integer)cbRows.getSelectedItem()).intValue()-1; UIToolBarController rightController = oManager.getRightToolBarController(); rightController.addToolBar(oToolBar, nType, true, true, true, nRow); setVisible(false); dispose(); } else if (source.equals(downButton)) { nRow = ((Integer)cbRows.getSelectedItem()).intValue()-1; UIToolBarController bottomController = oManager.getBottomToolBarController(); bottomController.addToolBar(oToolBar, nType, true, true, true, nRow); setVisible(false); dispose(); } } /** * Creates an abstract action to handle enter and escape key presses. */ private class CreateAction extends AbstractAction { private int nKey = 0; private int nModifier = 0; public CreateAction(int key, int modifier) { super(); nKey = key; nModifier = modifier; } public void actionPerformed(ActionEvent evt) { if (nKey == KeyEvent.VK_ENTER && nModifier == Event.CTRL_MASK ) { onEnter(); } else if ( (nKey == KeyEvent.VK_ESCAPE && nModifier == 0) || (nKey == KeyEvent.VK_W && nModifier == Event.CTRL_MASK) ) { onCancel(); } } } /** * Produce and XML representation of the data in this object and return. * @return String, XML representation of this object. */ public String toXML() { Point loc = getLocation(); StringBuffer data = new StringBuffer(100); data.append("<floater type=\""+nType+"\""); data.append(" name=\""+oToolBar.getName()+"\""); data.append(" isVisible=\"true\""); data.append(" wasVisible=\"true\""); data.append(" xPos=\""+loc.x+"\" yPos=\""+loc.y+"\""); data.append(" row=\""+nRow+"\">"); data.append("</floater>\n"); return data.toString(); } /** * Handle the enter key action. Override superclass to do nothing */ public void onEnter() {} /** * Close the floating toolbar dialog and unregister self with manager. */ public void onCancel() { // UNREGISTER SELF WITH MANAGER oManager.removeFloatingToolBar(this); if (nDockableOrientation == UIToolBar.EASTWEST) { UIToolBarController left = oManager.getLeftToolBarController(); left.addToolBar(oToolBar, nType, true, true, true, 0); } else { UIToolBarController top = oManager.getTopToolBarController(); top.addToolBar(oToolBar, nType, true, true, true, 0); } setVisible(false); dispose(); } }