TooBarButtonExample.java

/**
 * This example shows custom buttons with icons in a tool bar at the borders of a window
 * and in a floating grid.
 * The buttons can be dragged and docked alone and together.
 * 
 * @author Heidi Rakels
 */
public class TooBarButtonExample extends JPanel
{

	// Static fields.

	public static final int FRAME_WIDTH = 700;
	public static final int FRAME_HEIGHT = 450;

	// Constructor.

	public TooBarButtonExample(JFrame frame)
	{
		super(new BorderLayout());

		// Create the dock model for the docks.
		FloatDockModel dockModel = new FloatDockModel();
		dockModel.addOwner("frame0", frame);

		// Give the dock model to the docking manager.
		DockingManager.setDockModel(dockModel);
		
		// Give the float dock a different child dock factory.
		// We don't want the floating docks to be splittable.
		// And we want the floating tool bars to be grids.
		FloatDock floatDock = dockModel.getFloatDock(frame);
		floatDock.setChildDockFactory(new LeafDockFactory(false));

		// Create the content components.
		TextPanel textPanel1 = new TextPanel("I am window 1.");
		TextPanel textPanel2 = new TextPanel("I am window 2.");
		
		// Create the dockables around the content components.
		Icon icon = new ImageIcon(getClass().getResource("/com/javadocking/resources/images/text12.gif"));
		Dockable dockable1 = new DefaultDockable("Window1", textPanel1, "Window 1", icon);
		Dockable dockable2 = new DefaultDockable("Window2", textPanel2, "Window 2", icon);

		// Create the child tab dock.
		TabDock tabDock1 = new TabDock();
		TabDock tabDock2 = new TabDock();
		
		// Add the dockables to the tab dock.
		tabDock1.addDockable(dockable1, new Position(0));
		tabDock2.addDockable(dockable2, new Position(1));

		// Create the split dock.
		SplitDock splitDock = new SplitDock();
		
		// Add the child docks to the split dock.
		splitDock.addChildDock(tabDock1, new Position(Position.LEFT));
		splitDock.addChildDock(tabDock2, new Position(Position.RIGHT));
		splitDock.setDividerLocation(340);
		
		// Create the buttons with a dockable around.
		Dockable[] buttonDockables = new Dockable[42];
		buttonDockables[0]  = createButtonDockable("ButtonDockableAdd",              "Add",               new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/add.png")),               "Add!");
		buttonDockables[1]  = createButtonDockable("ButtonDockableAccept",           "Accept",            new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/accept.png")),            "Accept!");
		buttonDockables[2]  = createButtonDockable("ButtonDockableCancel",           "Cancel",            new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/cancel.png")),            "Cancel!");
		buttonDockables[3]  = createButtonDockable("ButtonDockableUndo",             "Undo",              new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/undo.png")),              "Undo!");
		buttonDockables[4]  = createButtonDockable("ButtonDockableRedo",             "Redo",              new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/redo.png")),              "Redo!");
		buttonDockables[5]  = createButtonDockable("ButtonDockableRefresh",          "Refresh",           new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/refresh.png")),           "Refresh!");
		buttonDockables[6]  = createButtonDockable("ButtonDockableBin",              "Bin",               new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/bin.png")),               "Bin!");
		buttonDockables[7]  = createButtonDockable("ButtonDockableIcons",            "Icons",             new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/icons.png")),             "Icons!");
		buttonDockables[8]  = createButtonDockable("ButtonDockableList",             "List",              new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/list.png")),              "List!");
		buttonDockables[9]  = createButtonDockable("ButtonDockableImages",           "Images",            new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/images.png")),            "Images!");
		buttonDockables[10] = createButtonDockable("ButtonDockableDivide",           "Divide",            new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/divide.png")),            "Divide!");
		buttonDockables[11] = createButtonDockable("ButtonDockableJoin",             "Join",              new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/join.png")),              "Join!");
		buttonDockables[12] = createButtonDockable("ButtonDockableSwitch",           "Switch",            new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/switch.png")),            "Switch!");
		buttonDockables[13] = createButtonDockable("ButtonDockableAsterisk",         "Asterisk",          new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/asterisk.png")),          "Asterisk!");
		buttonDockables[14] = createButtonDockable("ButtonDockableAnchor",           "Anchor",            new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/anchor.png")),            "Anchor!");
		buttonDockables[15] = createButtonDockable("ButtonDockableTerminal",         "Terminal",          new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/terminal.png")),          "Terminal!");		
		buttonDockables[16] = createButtonDockable("ButtonDockableStar",             "Well Done",         new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/star.png")),              "Well Done!");
		buttonDockables[17] = createButtonDockable("ButtonDockableWakeUp",           "Wake Up",           new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/wake_up.png")),           "Wake up!");
		buttonDockables[18] = createButtonDockable("ButtonDockableAddToBasket",      "Add to Basket",     new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/add_to_basket.png")),     "Add to Basket!");
		buttonDockables[19] = createButtonDockable("ButtonDockableRemoveFromBasket", "Remove from Basket",new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/remove_from_basket.png")),"Remove from Basket!");
		buttonDockables[20] = createButtonDockable("ButtonDockableBook",             "Book",              new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/book.png")),              "Book!");
		buttonDockables[21] = createButtonDockable("ButtonDockableBookPrevious",     "Previous Book",     new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/book_previous.png")),     "Previous Book!");
		buttonDockables[22] = createButtonDockable("ButtonDockableBookNext",         "Next Book",         new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/book_next.png")),         "Next Book!");
		buttonDockables[23] = createButtonDockable("ButtonDockableBookOpen",         "Open Book",         new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/book_open.png")),         "Open Book!");
		buttonDockables[24] = createButtonDockable("ButtonDockableBookEdit",         "Edit Book",         new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/book_edit.png")),         "Edit Book!");
		buttonDockables[25] = createButtonDockable("ButtonDockableBookAdd",          "Add Book",          new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/book_add.png")),          "Add Book!");
		buttonDockables[26] = createButtonDockable("ButtonDockableBookDelete",       "Delete Book",       new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/book_delete.png")),       "Delete Book!");
		buttonDockables[27] = createButtonDockable("ButtonDockableBookLink",         "Link Book",         new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/book_link.png")),         "Link Book!");
		buttonDockables[28] = createButtonDockable("ButtonDockableAttach",           "Attach",            new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/attach.png")),            "Attach!");
		buttonDockables[29] = createButtonDockable("ButtonDockableCalculator",       "Calculator",        new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/calculator.png")),        "Calculator!");
		buttonDockables[30] = createButtonDockable("ButtonDockableBriefcase",        "Briefcase",         new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/briefcase.png")),         "Briefcase!");
		buttonDockables[31] = createButtonDockable("ButtonDockableCalendar",         "Calendar",          new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/calendar.png")),          "Calendar!");
		buttonDockables[32] = createButtonDockable("ButtonDockableCamera",           "Camera",            new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/camera.png")),            "Camera!");
		buttonDockables[33] = createButtonDockable("ButtonDockableCar",              "Car",               new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/car.png")),               "Car!");
		buttonDockables[34] = createButtonDockable("ButtonDockableCD",               "CD",                new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/cd.png")),                "CD!");
		buttonDockables[35] = createButtonDockable("ButtonDockableClock",		    "Clock",              new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/clock.png")),             "Clock!");
		buttonDockables[36] = createButtonDockable("ButtonDockableCoins",            "Coins",             new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/coins.png")),             "Coins!");
		buttonDockables[37] = createButtonDockable("ButtonDockableChartBar",         "Bar Chart",         new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/chart_bar.png")),         "Bar Chart!");
		buttonDockables[38] = createButtonDockable("ButtonDockableChartCurve",       "Curve Chart",       new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/chart_curve.png")),       "Curve Chart!");
		buttonDockables[39] = createButtonDockable("ButtonDockableChartLine",        "Line Chart",        new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/chart_line.png")),        "Chart!");
		buttonDockables[40] = createButtonDockable("ButtonDockableChartOrganisation","Organisation Chart",new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/chart_organisation.png")),"Oraganisation Chart!");
		buttonDockables[41] = createButtonDockable("ButtonDockableChartPie",         "Pie Chart",         new ImageIcon(getClass().getResource("/com/javadocking/resources/icons/chart_pie.png")),         "Pie Chart!");
		
		// Create the border dock for the buttons.
		BorderDock toolBarBorderDock = new BorderDock(new CompositeToolBarDockFactory(), splitDock);
		toolBarBorderDock.setMode(BorderDock.MODE_TOOL_BAR);
		CompositeLineDock compositeToolBarDock1 = new CompositeLineDock(CompositeLineDock.ORIENTATION_HORIZONTAL, false,
				new ToolBarDockFactory(), DockingMode.HORIZONTAL_TOOLBAR, DockingMode.VERTICAL_TOOLBAR);
		CompositeLineDock compositeToolBarDock2 = new CompositeLineDock(CompositeLineDock.ORIENTATION_VERTICAL, false,
				new ToolBarDockFactory(), DockingMode.HORIZONTAL_TOOLBAR, DockingMode.VERTICAL_TOOLBAR);
		toolBarBorderDock.setDock(compositeToolBarDock1, Position.TOP);
		toolBarBorderDock.setDock(compositeToolBarDock2, Position.LEFT);

		// The line docks for the buttons.
		LineDock toolBarDock1 = new LineDock(LineDock.ORIENTATION_HORIZONTAL, false, DockingMode.HORIZONTAL_TOOLBAR, DockingMode.VERTICAL_TOOLBAR);
		LineDock toolBarDock2 = new LineDock(LineDock.ORIENTATION_HORIZONTAL, false, DockingMode.HORIZONTAL_TOOLBAR, DockingMode.VERTICAL_TOOLBAR);
		LineDock toolBarDock3 = new LineDock(LineDock.ORIENTATION_HORIZONTAL, false, DockingMode.HORIZONTAL_TOOLBAR, DockingMode.VERTICAL_TOOLBAR);
		LineDock toolBarDock4 = new LineDock(LineDock.ORIENTATION_HORIZONTAL, false, DockingMode.HORIZONTAL_TOOLBAR, DockingMode.VERTICAL_TOOLBAR);
		LineDock toolBarDock5 = new LineDock(LineDock.ORIENTATION_VERTICAL, false, DockingMode.HORIZONTAL_TOOLBAR, DockingMode.VERTICAL_TOOLBAR);
		LineDock toolBarDock6 = new LineDock(LineDock.ORIENTATION_VERTICAL, false, DockingMode.HORIZONTAL_TOOLBAR, DockingMode.VERTICAL_TOOLBAR);
		LineDock toolBarDock7 = new LineDock(LineDock.ORIENTATION_VERTICAL, false, DockingMode.HORIZONTAL_TOOLBAR, DockingMode.VERTICAL_TOOLBAR);
		GridDock toolGridDock = new GridDock(DockingMode.TOOL_GRID);
		
		// Add the dockables to the line docks and the grid dock.
		toolBarDock1.addDockable(buttonDockables[0], new Position(0));
		toolBarDock1.addDockable(buttonDockables[1], new Position(1));
		toolBarDock1.addDockable(buttonDockables[2], new Position(2));
		toolBarDock1.addDockable(buttonDockables[3], new Position(3));
		toolBarDock1.addDockable(buttonDockables[4], new Position(4));
		toolBarDock1.addDockable(buttonDockables[5], new Position(5));
		toolBarDock1.addDockable(buttonDockables[6], new Position(6));
		
		toolBarDock2.addDockable(buttonDockables[7], new Position(0));
		toolBarDock2.addDockable(buttonDockables[8], new Position(1));
		toolBarDock2.addDockable(buttonDockables[9], new Position(2));
		
		toolBarDock3.addDockable(buttonDockables[10],new Position(0));
		toolBarDock3.addDockable(buttonDockables[11],new Position(1));
		toolBarDock3.addDockable(buttonDockables[12],new Position(2));
		
		toolBarDock4.addDockable(buttonDockables[13], new Position(0));
		toolBarDock4.addDockable(buttonDockables[14], new Position(1));
		toolBarDock4.addDockable(buttonDockables[15], new Position(2));
		toolBarDock4.addDockable(buttonDockables[16], new Position(3));
		toolBarDock4.addDockable(buttonDockables[17], new Position(4));

		toolBarDock5.addDockable(buttonDockables[18], new Position(0));
		toolBarDock5.addDockable(buttonDockables[19], new Position(1));

		toolGridDock.addDockable(buttonDockables[20], new Position(0));
		toolGridDock.addDockable(buttonDockables[21], new Position(1));
		toolGridDock.addDockable(buttonDockables[22], new Position(2));
		toolGridDock.addDockable(buttonDockables[23], new Position(3));
		toolGridDock.addDockable(buttonDockables[24], new Position(4));
		toolGridDock.addDockable(buttonDockables[25], new Position(5));
		toolGridDock.addDockable(buttonDockables[26], new Position(6));
		toolGridDock.addDockable(buttonDockables[27], new Position(7));
		toolGridDock.addDockable(buttonDockables[28], new Position(8));

		toolBarDock6.addDockable(buttonDockables[29], new Position(0));
		toolBarDock6.addDockable(buttonDockables[30], new Position(1));
		toolBarDock6.addDockable(buttonDockables[31], new Position(2));
		toolBarDock6.addDockable(buttonDockables[32], new Position(3));
		toolBarDock6.addDockable(buttonDockables[33], new Position(4));
		toolBarDock6.addDockable(buttonDockables[34], new Position(5));
		toolBarDock6.addDockable(buttonDockables[35], new Position(6));
		toolBarDock6.addDockable(buttonDockables[36], new Position(6));

		toolBarDock7.addDockable(buttonDockables[37], new Position(0));
		toolBarDock7.addDockable(buttonDockables[38], new Position(1));
		toolBarDock7.addDockable(buttonDockables[39], new Position(2));
		toolBarDock7.addDockable(buttonDockables[40], new Position(3));
		toolBarDock7.addDockable(buttonDockables[41], new Position(4));

		// Add the line docks and grid to their composite parents.
		compositeToolBarDock1.addChildDock(toolBarDock1, new Position(0));
		compositeToolBarDock1.addChildDock(toolBarDock2, new Position(1));
		compositeToolBarDock1.addChildDock(toolBarDock3, new Position(2));
		compositeToolBarDock1.addChildDock(toolBarDock4, new Position(3));
		compositeToolBarDock2.addChildDock(toolBarDock5, new Position(0));
		compositeToolBarDock2.addChildDock(toolBarDock6, new Position(1));
		compositeToolBarDock2.addChildDock(toolBarDock7, new Position(2));
		floatDock.addChildDock(toolGridDock, new Position(400, 300));
		
		// Add the root dock.
		add((Component)toolBarBorderDock, BorderLayout.CENTER);
		dockModel.addRootDock("borderDock", toolBarBorderDock, frame);

	}
	
	/**
	 * Creates a dockable with a button as content.
	 * 
	 * @param id			The ID of the dockable that has to be created.
	 * @param title			The title of the dialog that will be displayed.
	 * @param icon			The icon that will be put on the button.
	 * @param message		The message that will be displayed when the action is performed.
	 * @return				The dockable with a button as content.
	 */
	private Dockable createButtonDockable(String id, String title, Icon icon, String message)
	{
		
		// Create the action.
		MessageAction action = new MessageAction(this, title, icon, message);

		// Create the button.
		ToolBarButton button = new ToolBarButton(action);

		// Create the dockable with the button as component.
		ButtonDockable buttonDockable = new ButtonDockable(id, button);

		// Add a dragger to the individual dockable.
		createDockableDragger(buttonDockable);

		return buttonDockable;
		
	}
	
	/**
	 * Adds a drag listener on the content component of a dockable.
	 */
	private void createDockableDragger(Dockable dockable)
	{
		
		// Create the dragger for the dockable.
		DragListener dragListener = DockingManager.getDockableDragListenerFactory().createDragListener(dockable);
		dockable.getContent().addMouseListener(dragListener);
		dockable.getContent().addMouseMotionListener(dragListener);
	}
	
	/**
	 * This is the class for the content.
	 */
	private class TextPanel extends JPanel implements DraggableContent
	{
		
		private JLabel label; 
		
		public TextPanel(String text)
		{
			super(new FlowLayout());
			
			// The panel.
			setMinimumSize(new Dimension(80,80));
			setPreferredSize(new Dimension(150,150));
			setBackground(Color.white);
			setBorder(BorderFactory.createLineBorder(Color.lightGray));
			
			// The label.
			label = new JLabel(text);
			label.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
			add(label);
		}
		
		// Implementations of DraggableContent.

		public void addDragListener(DragListener dragListener)
		{
			addMouseListener(dragListener);
			addMouseMotionListener(dragListener);
			label.addMouseListener(dragListener);
			label.addMouseMotionListener(dragListener);
		}
	}

	// Private classes.

	/**
	 * An action that shows a message in a dialog.
	 */
	private class MessageAction extends AbstractAction
	{

		private Component parentComponent;
		private String message;
		private String name;
		
		public MessageAction(Component parentComponent, String name, Icon icon, String message)
		{
			super(null, icon);
			putValue(Action.SHORT_DESCRIPTION, name);
			this.message = message;
			this.name = name;
			this.parentComponent = parentComponent;
		}

		public void actionPerformed(ActionEvent actionEvent)
		{
			JOptionPane.showMessageDialog(parentComponent,
					message, name, JOptionPane.INFORMATION_MESSAGE);
		}
		
	}
	
	// Main method.
	
	public static void createAndShowGUI()
	{
		
		// Create the frame.
		JFrame frame = new JFrame("Split dock");

		// Create the panel and add it to the frame.
		TooBarButtonExample panel = new TooBarButtonExample(frame);
		frame.getContentPane().add(panel);
		
		// Set the frame properties and show it.
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		frame.setLocation((screenSize.width - FRAME_WIDTH) / 2, (screenSize.height - FRAME_HEIGHT) / 2);
		frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
		frame.setVisible(true);
		
	}

	public static void main(String args[]) 
	{
        Runnable doCreateAndShowGUI = new Runnable() 
        {
            public void run() 
            {
                createAndShowGUI();
            }
        };
        SwingUtilities.invokeLater(doCreateAndShowGUI);
    }
	
}