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: JStatusBar.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    package org.jfree.report.modules.gui.swing.common;
032    
033    import java.awt.BorderLayout;
034    import java.awt.Dimension;
035    import java.awt.IllegalComponentStateException;
036    import java.util.Locale;
037    import javax.swing.BorderFactory;
038    import javax.swing.Icon;
039    import javax.swing.JComponent;
040    import javax.swing.JLabel;
041    import javax.swing.JPanel;
042    import javax.swing.UIManager;
043    
044    import org.jfree.report.modules.gui.common.DefaultIconTheme;
045    import org.jfree.report.modules.gui.common.IconTheme;
046    
047    public class JStatusBar extends JComponent
048    {
049      public static final int TYPE_ERROR = 3;
050      public static final int TYPE_WARNING = 2;
051      public static final int TYPE_INFORMATION = 1;
052      public static final int TYPE_NONE = 0;
053    
054      private JComponent otherComponents;
055      private JLabel statusHolder;
056      private IconTheme iconTheme;
057      private int statusType;
058    
059      public JStatusBar()
060      {
061        this(new DefaultIconTheme());
062      }
063    
064      public JStatusBar (final IconTheme theme)
065      {
066        setLayout(new BorderLayout());
067        setBorder(BorderFactory.createMatteBorder
068                (1, 0, 0, 0, UIManager.getDefaults().getColor("controlShadow")));
069        statusHolder = new JLabel(" ");
070        statusHolder.setMinimumSize(new Dimension(0, 20));
071        add(statusHolder, BorderLayout.CENTER);
072    
073        otherComponents = new JPanel();
074        add(otherComponents, BorderLayout.EAST);
075        this.iconTheme = theme;
076      }
077    
078      protected IconTheme getIconTheme()
079      {
080        return iconTheme;
081      }
082    
083      public void setIconTheme(final IconTheme iconTheme)
084      {
085        final IconTheme oldTheme = this.iconTheme;
086        this.iconTheme = iconTheme;
087        firePropertyChange("iconTheme", oldTheme, iconTheme);
088    
089        if (iconTheme == null)
090        {
091          statusHolder.setIcon(null);
092        }
093        else
094        {
095          updateTypeIcon(getStatusType());
096        }
097      }
098    
099      public JComponent getExtensionArea ()
100      {
101        return otherComponents;
102      }
103    
104      public int getStatusType()
105      {
106        return statusType;
107      }
108    
109      public String getStatusText()
110      {
111        return statusHolder.getText();
112      }
113    
114      public void setStatusText (final String text)
115      {
116        final String oldText = statusHolder.getText();
117        this.statusHolder.setText(text);
118        firePropertyChange("statusText", oldText, text);
119      }
120    
121      public void setStatusType (final int type)
122      {
123        final int oldType = statusType;
124        this.statusType = type;
125        firePropertyChange("statusType", oldType, type);
126        updateTypeIcon(type);
127      }
128    
129      public void setStatus (final int type, final String text)
130      {
131        this.statusType = type;
132        updateTypeIcon(type);
133        statusHolder.setText(text);
134      }
135    
136      private void updateTypeIcon(final int type)
137      {
138        if (iconTheme != null)
139        {
140          if (type == TYPE_ERROR)
141          {
142            final Icon res = getIconTheme().getSmallIcon(getLocale(), "statusbar.errorIcon");
143            statusHolder.setIcon(res);
144          }
145          else if (type == TYPE_WARNING)
146          {
147            final Icon res = getIconTheme().getSmallIcon(getLocale(), "statusbar.warningIcon");
148            statusHolder.setIcon(res);
149          }
150          else if (type == TYPE_INFORMATION)
151          {
152            final Icon res = getIconTheme().getSmallIcon(getLocale(), "statusbar.informationIcon");
153            statusHolder.setIcon(res);
154          }
155          else
156          {
157            final Icon res = getIconTheme().getSmallIcon(getLocale(), "statusbar.otherIcon");
158            statusHolder.setIcon(res);
159          }
160        }
161      }
162    
163      public void clear ()
164      {
165        setStatus(TYPE_NONE, " ");
166      }
167    
168      /**
169       * Gets the locale of this component.
170       *
171       * @return this component's locale; if this component does not have a locale,
172       *         the locale of its parent is returned
173       * @throws java.awt.IllegalComponentStateException
174       *          if the <code>Component</code> does not have its own locale and has
175       *          not yet been added to a containment hierarchy such that the locale
176       *          can be determined from the containing parent
177       * @see #setLocale
178       * @since JDK1.1
179       */
180      public Locale getLocale()
181      {
182        try
183        {
184          return super.getLocale();
185        }
186        catch(IllegalComponentStateException ice)
187        {
188          return Locale.getDefault();
189        }
190      }
191    }