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.ui;
022    
023    import java.awt.Component;
024    import java.awt.event.ActionEvent;
025    import java.awt.event.KeyEvent;
026    import java.io.File;
027    import java.util.HashMap;
028    import java.util.Map;
029    
030    import javax.swing.AbstractAction;
031    import javax.swing.ButtonGroup;
032    import javax.swing.JCheckBoxMenuItem;
033    import javax.swing.JMenu;
034    import javax.swing.KeyStroke;
035    
036    import csheets.CleanSheets;
037    import csheets.SpreadsheetAppEvent;
038    import csheets.SpreadsheetAppListener;
039    import csheets.core.Workbook;
040    import csheets.ui.ctrl.SelectionEvent;
041    import csheets.ui.ctrl.SelectionListener;
042    import csheets.ui.ctrl.UIController;
043    
044    /**
045     * A menu for listing the open workbooks, and allowing the user to navigate
046     * between them.
047     * @author Einar Pehrson
048     */
049    @SuppressWarnings("serial")
050    public class WindowMenu extends JMenu implements SelectionListener, SpreadsheetAppListener {
051    
052            /** The user interface controller */
053            private UIController uiController;
054    
055            /** The workbook selection items */
056            private Map<Workbook, JCheckBoxMenuItem> items
057                    = new HashMap<Workbook, JCheckBoxMenuItem>();
058    
059            /** The button group to which workbook selection items are added */
060            private ButtonGroup group = new ButtonGroup();
061    
062            /** The number of menu items on the menu not denoting workbooks */
063            private int nonWorkbookItems;
064    
065            /**
066             * Creates a window menu.
067             * @param app the CleanSheets application
068             * @param uiController the user interface controller
069             */
070            public WindowMenu(CleanSheets app, UIController uiController) {
071                    super("Window");
072                    this.uiController = uiController;
073                    app.addSpreadsheetAppListener(this);
074                    uiController.addSelectionListener(this);
075                    setMnemonic(KeyEvent.VK_W);
076            }
077    
078            /**
079             * Adds an item for the workbook that was created.
080             * @param event the spreadsheet application event that occured
081             */
082            public void workbookCreated(SpreadsheetAppEvent event) {
083                    // Creates item and names it
084                    JCheckBoxMenuItem item = new JCheckBoxMenuItem(
085                            new SelectWorkbookAction(event.getWorkbook(), uiController));
086                    int index = getItemCount() - nonWorkbookItems + 1;
087                    File file = event.getFile();
088                    item.setText(file == null ? " Untitled" : file.getName());
089    
090                    // Accelerates item
091                    KeyStroke stroke = KeyStroke.getKeyStroke("ctrl " + index);
092                    item.setMnemonic(stroke.getKeyChar());
093                    item.setAccelerator(stroke);
094                    item.setSelected(true);
095    
096                    // Adds itme
097                    items.put(event.getWorkbook(), item);
098                    group.add(item);
099                    add(item);
100            }
101    
102            /**
103             * Adds an item for the workbook that was loaded.
104             * @param event the spreadsheet application event that occured
105             */
106            public void workbookLoaded(SpreadsheetAppEvent event) {
107                    workbookCreated(event);
108            }
109    
110            /**
111             * Removes the item of the workbook that was unloaded, and renames the other.
112             * @param event the spreadsheet application event that occured
113             */
114            public void workbookUnloaded(SpreadsheetAppEvent event) {
115                    // Removes the item
116                    JCheckBoxMenuItem item = items.remove(event.getWorkbook());
117                    if (item != null)
118                            remove(item);
119    
120                    // Updates remaining items
121                    int index = 1;
122                    for (Component c : getMenuComponents()) {
123                            item = (JCheckBoxMenuItem)c;
124                            KeyStroke stroke = KeyStroke.getKeyStroke("ctrl " + index++);
125                            item.setMnemonic(stroke.getKeyChar());
126                            item.setAccelerator(stroke);
127                    }
128            }
129    
130            /**
131             * Renames the item of the workbook that was saved.
132             * @param event the spreadsheet application event that occured
133             */
134            public void workbookSaved(SpreadsheetAppEvent event) {
135                    items.get(event.getWorkbook()).setText(event.getFile().getName());;
136            }
137    
138            /**
139             * Selects the item of the workbook that was selected.
140             * @param event the selection event that was fired
141             */
142            public void selectionChanged(SelectionEvent event) {
143                    JCheckBoxMenuItem item = items.get(event.getWorkbook());
144                    if (item != null)
145                            item.setSelected(true);
146            }
147    
148            /**
149             * An action for selecting a workbook.
150             * @author Einar Pehrson
151             */
152            @SuppressWarnings("serial")
153            protected static class SelectWorkbookAction extends AbstractAction {
154    
155                    /** The workbook to select */
156                    private Workbook workbook;
157    
158                    /** The user interface controller */
159                    private UIController uiController;
160    
161                    /**
162                     * Creates a new workbook selection action.
163                     * @param workbook the workbook to select
164                     * @param uiController the user interface controller
165                     */
166                    public SelectWorkbookAction(Workbook workbook, UIController uiController) {
167                            this.workbook = workbook;
168                            this.uiController = uiController;
169                    }
170    
171                    public void actionPerformed(ActionEvent e) {
172                            uiController.setActiveWorkbook(workbook);
173                    }
174            }
175    }