001    /**
002     * ========================================
003     * JFreeReport : a free Java report library
004     * ========================================
005     *
006     * Project Info:  http://reporting.pentaho.org/
007     *
008     * (C) Copyright 2000-2007, by Object Refinery Limited, Pentaho Corporation and Contributors.
009     *
010     * This library is free software; you can redistribute it and/or modify it under the terms
011     * of the GNU Lesser General Public License as published by the Free Software Foundation;
012     * either version 2.1 of the License, or (at your option) any later version.
013     *
014     * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
015     * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
016     * See the GNU Lesser General Public License for more details.
017     *
018     * You should have received a copy of the GNU Lesser General Public License along with this
019     * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
020     * Boston, MA 02111-1307, USA.
021     *
022     * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
023     * in the United States and other countries.]
024     *
025     * ------------
026     * $Id: AbstractActionPlugin.java 3525 2007-10-16 11:43:48Z tmorgner $
027     * ------------
028     * (C) Copyright 2000-2005, by Object Refinery Limited.
029     * (C) Copyright 2005-2007, by Pentaho Corporation.
030     */
031    
032    package org.jfree.report.modules.gui.swing.common;
033    
034    import java.awt.Dialog;
035    import java.awt.Frame;
036    import java.awt.Window;
037    import java.beans.PropertyChangeListener;
038    import java.beans.PropertyChangeSupport;
039    
040    import org.jfree.report.modules.gui.common.IconTheme;
041    import org.jfree.util.ExtendedConfiguration;
042    import org.jfree.util.ExtendedConfigurationWrapper;
043    import org.jfree.util.ResourceBundleSupport;
044    
045    /**
046     * The AbstractExportPlugin provides a basic implementation of the ExportPlugin
047     * interface.
048     *
049     * @author Thomas Morgner
050     */
051    public abstract class AbstractActionPlugin implements ActionPlugin
052    {
053      private PropertyChangeSupport propertyChangeSupport;
054    
055      private boolean enabled;
056    
057      /**
058       * Localised resources.
059       */
060      private ResourceBundleSupport baseResources;
061      private IconTheme iconTheme;
062      private String statusText;
063    
064      /**
065       * The base resource class.
066       */
067      public static final String BASE_RESOURCE_CLASS =
068          "org.jfree.report.modules.gui.common.resources";
069      private SwingGuiContext context;
070      private ExtendedConfiguration configuration;
071    
072      protected AbstractActionPlugin()
073      {
074        propertyChangeSupport = new PropertyChangeSupport(this);
075      }
076    
077      public boolean initialize(final SwingGuiContext context)
078      {
079        this.context = context;
080        this.baseResources = new ResourceBundleSupport
081            (context.getLocale(), BASE_RESOURCE_CLASS);
082        this.iconTheme = context.getIconTheme();
083        this.configuration = new ExtendedConfigurationWrapper
084            (context.getConfiguration());
085        return true;
086      }
087    
088      protected PropertyChangeSupport getPropertyChangeSupport()
089      {
090        return propertyChangeSupport;
091      }
092    
093      public SwingGuiContext getContext()
094      {
095        return context;
096      }
097    
098      public ExtendedConfiguration getConfig()
099      {
100        return configuration;
101      }
102    
103      /**
104       * Returns true if the action is separated, and false otherwise. A separated
105       * action starts a new action group and will be spearated from previous
106       * actions on the menu and toolbar.
107       *
108       * @return true, if the action should be separated from previous actions,
109       *         false otherwise.
110       */
111      public boolean isSeparated()
112      {
113        return getConfig().getBoolProperty
114            (getConfigurationPrefix() + "separated");
115      }
116    
117      /**
118       * Returns an error description for the last operation. This implementation
119       * provides a basic default failure description text and should be overriden
120       * to give a more detailed explaination.
121       *
122       * @return returns a error description.
123       */
124      public String getFailureDescription()
125      {
126        return baseResources.formatMessage
127            ("statusline.export.generic-failure-description", getDisplayName());
128      }
129    
130      public String getStatusText()
131      {
132        return statusText;
133      }
134    
135      public void setStatusText(final String statusText)
136      {
137        final String oldText = this.statusText;
138        this.statusText = statusText;
139        propertyChangeSupport.firePropertyChange("statusText", oldText, statusText);
140      }
141    
142      /**
143       * Returns true if the action should be added to the toolbar, and false
144       * otherwise.
145       *
146       * @return true, if the plugin should be added to the toolbar, false
147       *         otherwise.
148       */
149      public boolean isAddToToolbar()
150      {
151        return getConfig().getBoolProperty
152            (getConfigurationPrefix() + "add-to-toolbar");
153      }
154    
155      /**
156       * Returns true if the action should be added to the menu, and false
157       * otherwise.
158       *
159       * @return A boolean.
160       */
161      public boolean isAddToMenu()
162      {
163        final String name = getConfigurationPrefix() + "add-to-menu";
164        return getConfig().getBoolProperty(name);
165      }
166    
167      /**
168       * Creates a progress dialog, and tries to assign a parent based on the given
169       * preview proxy.
170       *
171       * @return the progress dialog.
172       */
173      protected ReportProgressDialog createProgressDialog()
174      {
175        final Window proxy = context.getWindow();
176        if (proxy instanceof Frame)
177        {
178          return new ReportProgressDialog((Frame) proxy);
179        }
180        else if (proxy instanceof Dialog)
181        {
182          return new ReportProgressDialog((Dialog) proxy);
183        }
184        else
185        {
186          return new ReportProgressDialog();
187        }
188      }
189    
190      public void addPropertyChangeListener(final PropertyChangeListener l)
191      {
192        propertyChangeSupport.addPropertyChangeListener(l);
193      }
194    
195      public void addPropertyChangeListener(final String property,
196                                            final PropertyChangeListener l)
197      {
198        propertyChangeSupport.addPropertyChangeListener(property, l);
199      }
200    
201      public void removePropertyChangeListener(final PropertyChangeListener l)
202      {
203        propertyChangeSupport.removePropertyChangeListener(l);
204      }
205    
206      public void setEnabled(final boolean enabled)
207      {
208        final boolean oldEnabled = this.enabled;
209        this.enabled = enabled;
210        propertyChangeSupport.firePropertyChange("enabled", oldEnabled, enabled);
211      }
212    
213      public boolean isEnabled()
214      {
215        return enabled;
216      }
217    
218      public IconTheme getIconTheme()
219      {
220        return iconTheme;
221      }
222    
223      protected abstract String getConfigurationPrefix();
224    
225    
226      /**
227       * A sort key used to enforce a certain order within the actions.
228       *
229       * @return
230       */
231      public int getMenuOrder()
232      {
233        return getConfig().getIntProperty
234            (getConfigurationPrefix() + "menu-order", 0);
235      }
236    
237      public int getToolbarOrder()
238      {
239        return getConfig().getIntProperty
240            (getConfigurationPrefix() + "toolbar-order", 0);
241      }
242    
243      public String getRole()
244      {
245        return getConfig().getConfigProperty
246            (getConfigurationPrefix() + "role");
247      }
248    
249      public int getRolePreference()
250      {
251        return getConfig().getIntProperty
252            (getConfigurationPrefix() + "role-preference", 0);
253      }
254    }