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.event.ActionEvent;
024    import java.awt.event.KeyEvent;
025    import java.text.DateFormat;
026    import java.text.Format;
027    import java.text.NumberFormat;
028    
029    import javax.swing.ImageIcon;
030    
031    import csheets.core.Cell;
032    import csheets.core.IllegalValueTypeException;
033    import csheets.core.Value;
034    import csheets.ext.style.StylableCell;
035    import csheets.ext.style.StyleExtension;
036    import csheets.ui.ctrl.FocusOwnerAction;
037    import csheets.ui.ctrl.SelectionEvent;
038    import csheets.ui.ctrl.SelectionListener;
039    import csheets.ui.ctrl.UIController;
040    
041    /**
042     * A format changing operation.
043     * @author Einar Pehrson
044     */
045    @SuppressWarnings("serial")
046    public class FormatAction extends FocusOwnerAction implements SelectionListener {
047    
048            /** The user interface controller */
049            private UIController uiController;
050    
051            /** The cell being styled */
052            private StylableCell cell;
053    
054            /**
055             * Creates a new format action.
056             * @param uiController the user interface controller
057             */
058            public FormatAction(UIController uiController) {
059                    this.uiController = uiController;
060                    uiController.addSelectionListener(this);
061            }
062    
063            protected String getName() {
064                    return "Format...";
065            }
066    
067            protected void defineProperties() {
068                    putValue(MNEMONIC_KEY, KeyEvent.VK_D);
069                    putValue(SMALL_ICON, new ImageIcon(StyleExtension.class.getResource("res/img/format.gif")));
070            }
071    
072            /**
073             * Updates the state of the action when a new cell is selected.
074             * @param event the selection event that was fired
075             */
076            public void selectionChanged(SelectionEvent event) {
077                    Cell c = event.getCell();
078                    cell = c == null ? null : (StylableCell)c.getExtension(StyleExtension.NAME);
079                    setEnabled(c == null ? false : cell.isFormattable());
080            }
081    
082            /**
083             * Lets the user select a format from a chooser.
084             * Then applies the format to the selected cells in the focus owner table.
085             * @param event the event that was fired
086             */
087            public void actionPerformed(ActionEvent event) {
088                    if (focusOwner == null)
089                            return;
090                    // Lets user select a format
091                    Format format = null;
092                    try {
093                            if (cell.getValue().getType() == Value.Type.NUMERIC)
094                                    format = new FormatChooser(
095                                            (NumberFormat)cell.getFormat().clone(), cell.getValue().toNumber()
096                                    ).showDialog(null, "Choose Format");
097                            else if (cell.getValue().getType() == Value.Type.DATE)
098                                    format = new FormatChooser(
099                                            (DateFormat)cell.getFormat().clone(), cell.getValue().toDate()
100                                    ).showDialog(null, "Choose Format");
101                    } catch (IllegalValueTypeException e) {}
102    
103                    if (format != null) {
104                            // Changes the format of each selected cell
105                            for (Cell[] row : focusOwner.getSelectedCells())
106                                    for (Cell cell : row) {
107                                            StylableCell stylableCell = (StylableCell)cell.getExtension(
108                                                    StyleExtension.NAME);
109                                            stylableCell.setFormat(
110                                                    stylableCell.isFormattable() ? format : null);
111                                    }
112            
113                            uiController.setWorkbookModified(focusOwner.getSpreadsheet().getWorkbook());
114                            focusOwner.repaint();
115                    }
116            }
117    }