001    /*
002     * Copyright (c) 2005 Einar Pehrson <einar@pehrson.nu>.
003     *
004     * This file is part of
005     * CleanSheets - a spreadsheet application for the Java platform.
006     *
007     * CleanSheets is free software; you can redistribute it and/or modify
008     * it under the terms of the GNU General Public License as published by
009     * the Free Software Foundation; either version 2 of the License, or
010     * (at your option) any later version.
011     *
012     * CleanSheets is distributed in the hope that it will be useful,
013     * but WITHOUT ANY WARRANTY; without even the implied warranty of
014     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
015     * GNU General Public License for more details.
016     *
017     * You should have received a copy of the GNU General Public License
018     * along with CleanSheets; if not, write to the Free Software
019     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
020     */
021    package csheets.ext.style.ui;
022    
023    import java.awt.Insets;
024    import java.util.HashMap;
025    import java.util.Map;
026    
027    import javax.swing.Action;
028    import javax.swing.ButtonGroup;
029    import javax.swing.JButton;
030    import javax.swing.JToggleButton;
031    import javax.swing.JToolBar;
032    import javax.swing.SwingConstants;
033    
034    import csheets.ext.style.StylableCell;
035    import csheets.ext.style.StyleExtension;
036    import csheets.ui.ctrl.SelectionEvent;
037    import csheets.ui.ctrl.SelectionListener;
038    import csheets.ui.ctrl.UIController;
039    
040    /**
041     * A tool bar that displays style-related actions.
042     * @author Einar Pehrson
043     */
044    @SuppressWarnings("serial")
045    public class StyleToolBar extends JToolBar implements SelectionListener {
046    
047            /** The common button insets */
048            private static final Insets INSETS = new Insets(2, 2, 2, 2);
049    
050            /** The button for making the current font bold */
051            private JToggleButton boldButton;
052    
053            /** The button for making the current font italic */
054            private JToggleButton italicButton;
055    
056            /** The button for applying left alignment */
057            private Map<Integer, JToggleButton> hAlignButtons
058                    = new HashMap<Integer, JToggleButton>();
059    
060            /**
061             * Creates a new style tool bar.
062             * @param uiController the user interface controller
063             */
064            public StyleToolBar(UIController uiController) {
065                    super("Style");
066                    uiController.addSelectionListener(this);
067    
068                    // Adds font actions
069                    add(new FontAction(uiController));
070                    boldButton = addToggleButton(new BoldAction(uiController));
071                    italicButton = addToggleButton(new ItalicAction(uiController));
072                    addSeparator();
073    
074                    // Adds color actions
075                    add(new FormatAction(uiController));
076                    add(new BorderAction(uiController));
077                    add(new ForegroundAction(uiController));
078                    add(new BackgroundAction(uiController));
079                    addSeparator();
080    
081                    // Adds alignment actions
082                    ButtonGroup hAlignGroup = new ButtonGroup();
083                    hAlignButtons.put(SwingConstants.LEFT, addToggleButton(
084                            new AlignLeftAction(uiController), hAlignGroup));
085                    hAlignButtons.put(SwingConstants.CENTER, addToggleButton(
086                            new AlignCenterAction(uiController), hAlignGroup));
087                    hAlignButtons.put(SwingConstants.RIGHT, addToggleButton(
088                            new AlignRightAction(uiController), hAlignGroup));
089            }
090    
091            /**
092             * Adds a button with the given action to the tool bar, and reduces the
093             * default insets.
094             * @param action the action to add
095             * @return the button that was added
096             */
097            public JButton add(Action action) {
098                    JButton button = super.add(action);
099                    button.setMargin(INSETS);
100                    return button;
101            }
102    
103            /**
104             * Adds a button with the given action to the tool bar, and reduces the
105             * default insets.
106             * @param action the action to add
107             * @param groups the button groups to which the button belongs
108             * @return the button that was added
109             */
110            public JToggleButton addToggleButton(Action action, ButtonGroup... groups) {
111                    JToggleButton button = new JToggleButton(action);
112                    button.setText(null);
113                    button.setMargin(INSETS);
114                    add(button);
115                    for (ButtonGroup group : groups)
116                            group.add(button);
117                    return button;
118            }
119    
120            /**
121             * Selects buttons depending on the style of the active cell.
122             * @param event the selection event that was fired
123             */
124            public void selectionChanged(SelectionEvent event) {
125                    if (event.getCell() != null && event.isCellChanged()) {
126                            StylableCell cell = (StylableCell)event.getCell().getExtension(
127                                    StyleExtension.NAME);
128                            boldButton.setSelected(cell.getFont().isBold());
129                            italicButton.setSelected(cell.getFont().isItalic());
130                            hAlignButtons.get(cell.getHorizontalAlignment()).setSelected(true);
131                    }
132            }
133    }