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.ext;
022    
023    import java.util.Properties;
024    
025    import javax.swing.Icon;
026    import javax.swing.JComponent;
027    import javax.swing.JMenu;
028    import javax.swing.JToolBar;
029    
030    import csheets.ext.Extension;
031    import csheets.ui.ctrl.UIController;
032    
033    /**
034     * <p>A base class for user interface extensions to the CleanSheets application.
035     * Subclasses should override the accessor methods for the components that they
036     * provide, and add components as selection listeners whenever required.
037     * <p>A user interface extension should only create one instance of each type of
038     * component, and therefore always return the same component when a given
039     * method is called.
040     * @see csheets.ui.ctrl.SelectionListener
041     * @author Einar Pehrson
042     */
043    public abstract class UIExtension {
044    
045            /** The name of the extension */
046            protected final Extension extension;
047    
048            /** The user interface controller */
049            protected final UIController uiController;
050    
051            /** The application's user properties */
052            protected final Properties props;
053    
054            /**
055             * Creates a new user interface extension..
056             * @param extension the extension for which components are provided
057             * @param uiController the user interface controller
058             */
059            public UIExtension(Extension extension, UIController uiController) {
060                    // Stores member
061                    this.extension = extension;
062                    this.uiController = uiController;
063                    this.props = uiController.getUserProperties();
064    
065                    // Enables components according to properties
066                    if (getCellDecorator() != null)
067                            getCellDecorator().setEnabled(Boolean.TRUE.equals(
068                                    getEnabledProperty("celldecorator")));
069                    if (getTableDecorator() != null)
070                            getTableDecorator().setEnabled(Boolean.TRUE.equals(
071                                    getEnabledProperty("tabledecorator")));
072                    if (getToolBar() != null)
073                            getToolBar().setVisible(Boolean.TRUE.equals(
074                                    getEnabledProperty("toolbar")));
075                    if (getSideBar() != null)
076                            getSideBar().setEnabled(Boolean.TRUE.equals(
077                                    getEnabledProperty("sidebar")));
078            }
079    
080            /**
081             * Returns the extension for which this UI extension provides components.
082             * @return the extension for which this UI extension provides components
083             */
084            public final Extension getExtension() {
085                    return extension;
086            }
087    
088            /**
089             * Returns the enabled property corresponding to the given component key.
090             * @param propKey the property key of the relevant component
091             * @return a Boolean value if a property is found, null otherwise
092             */
093            public final Boolean getEnabledProperty(String propKey) {
094                    String prop = props.getProperty(extension.getPropertyKey() + propKey);
095                    if (prop == null)
096                            return null;
097                    else if (prop.equalsIgnoreCase("true"))
098                            return true;
099                    else if (prop.equalsIgnoreCase("false"))
100                            return false;
101                    else
102                            return null;
103            }
104    
105            /**
106             * Sets the enabled property corresponding to the given component key.
107             * @param propKey the property key of the relevant component
108             * @param enabled whether the component should be enabled or not
109             */
110            public final void setEnabledProperty(String propKey, boolean enabled) {
111                    props.setProperty(extension.getPropertyKey() + propKey,
112                            Boolean.toString(enabled));
113            }
114    
115            /**
116             * Returns an icon to display with the extension's name.
117             * @return an icon, or null if the extension does not provide one
118             */
119            public Icon getIcon() {
120                    return null;
121            }
122    
123            /**
124             * Returns a cell decorator that visualizes the data added by the extension.
125             * @return a cell decorator, or null if the extension does not provide one
126             */
127            public CellDecorator getCellDecorator() {
128                    return null;
129            }
130    
131            /**
132             * Returns a table decorator that visualizes the data added by the extension.
133             * @return a table decorator, or null if the extension does not provide one
134             */
135            public TableDecorator getTableDecorator() {
136                    return null;
137            }
138    
139            /**
140             * Returns a menu component that gives access to extension-specific
141             * functionality.
142             * @return a JMenu component, or null if the extension does not provide one
143             */
144            public JMenu getMenu() {
145                    return null;
146            }
147    
148            /**
149             * Returns a toolbar that gives access to extension-specific
150             * functionality.
151             * @return a JToolBar component, or null if the extension does not provide one
152             */
153            public JToolBar getToolBar() {
154                    return null;
155            }
156    
157            /**
158             * Returns a side bar that gives access to extension-specific
159             * functionality.
160             * @return a component, or null if the extension does not provide one
161             */
162            public JComponent getSideBar() {
163                    return null;
164            }
165    }