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 }