001    /* 
002     * Copyright (c) Holger Pfaff - http://pfaff.ws
003     *
004     * This software maybe used for any purpose provided the
005     * above copyright notice is retained. It is supplied as is.
006     * No warranty expressed or implied - Use at your own risk.
007     */
008    
009    import java.awt.*;
010    import java.awt.event.*;
011    import java.util.Vector;
012    
013    /**
014      * (#)TabbedPanel.java
015      * @author   Holger Pfaff
016      * @version  3.2 19-Mar-2004<br><br> 
017      *
018      * A tabbed panel. Tab labels ca only be strings. Uses subclasses
019      * TabSelector and TabbedDisplayPanel
020      */
021    
022    public class TabbedPanel extends Awt {
023    
024      /**
025       * our tabselectors
026       */
027            private TabSelector        tabs = new TabSelector();
028    
029      /**
030       * our panels
031       */
032            private TabbedDisplayPanel disp = new TabbedDisplayPanel();
033    
034      /**
035       * Construct an empty tabbed panel
036       */
037            public TabbedPanel() {
038        this.insets = new Insets(0,0,0,0);
039                    setLayout(new BorderLayout());
040                    add(BorderLayout.NORTH,  tabs);
041                    add(BorderLayout.CENTER, disp);
042            }
043    
044      /**
045       * add a tab
046       *
047       * @param   n   Tab label
048       * @param   c   component to show within tab
049       */
050            public void addItem(String n, Component c) {
051                    tabs.addItem(n);
052                    disp.addItem(n, c);
053            }
054      
055      /**
056       * remove a tab
057       *
058       * @param   c   component to remove
059       */
060            public void removeItem(Component c) {
061        Component[] C = disp.getComponents();
062        for(int i = 0; i < C.length; ++i) {
063          if(C[i] == c) {
064                        tabs.removeItem(i);
065                        disp.removeItem(i);
066          }
067        }
068            }
069    
070      /**
071       * select a specific tab
072       *
073       * @param   i   index of tab to select
074       */
075            public void setSelectedIndex(int i) {
076        tabs.setSelectedIndex(i);
077                    disp.setSelected(tabs.getSelected());
078            }
079      
080      /**
081       * get index of selected tab
082       *
083       * @return   index of currently selected tab
084       */
085            public int getSelectedIndex() {
086                    return tabs.getSelectedIndex();
087            } 
088      
089      /**
090       * Overwrite setEnabled to do repaint
091       *
092       * @param   enabled  enable this panel?
093       */
094      public void setEnabled(boolean enabled) {
095        super.setEnabled(enabled);
096        tabs.repaint();
097      }
098      
099      /**
100       * override java.awt.Panel.getPreferredSize() and return
101       * our minimum size
102       */
103      public Dimension getPreferredSize() {
104        return getLayout() == null ? new Dimension(1,1) : getLayout().preferredLayoutSize(this);
105      }
106      
107      /**
108       * override java.awt.Panel.getMinimumSize()
109       * See getPreferredSize()
110       */
111      public Dimension getMinimumSize() {
112        return getLayout() == null ? new Dimension(1,1) : getLayout().minimumLayoutSize(this);
113      }
114    }
115    
116    /**
117     * TabSelector - Subclass for TabbedPanel
118     */
119    class TabSelector extends Awt {
120            Vector name  = new Vector();
121            int selected = 0;
122    
123      /**
124       * create a tabselector - not for public use
125       */
126            TabSelector() {
127        borderDepth = 1;
128        innerInsets = new Insets(3,2,3,2);
129        addMouseListener(this);
130            }
131    
132      /**
133       * add a selector
134       *
135       * @param   n  label for this selector
136       */
137            void addItem(String n) {
138                    name.addElement(n);
139            }
140      
141      /**
142       * remove a selector
143       *
144       * @param   i  index of selector to remove
145       */
146            void removeItem(int i) {
147                    name.removeElementAt(i);
148            }
149    
150      /**
151       * get selected item
152       *
153       * @return    name of selected item
154       */
155      public String getSelected() {
156        return (String) name.elementAt(selected);
157      } 
158    
159      /**
160       * set selected item
161       *
162       * @param   n  name of item to select
163       */
164      void setSelected(String n) {
165        setSelectedIndex(name.indexOf(n));
166      }
167      
168      /**
169       * set selected index
170       *
171       * @param   i  index of selector to select
172       */
173            public void setSelectedIndex(int i) {
174        if(i > -1 && i < name.size()) {
175          selected = i;
176                      repaint();
177        }
178            }
179      
180      /**
181       * get selected index
182       *
183       * @return   index of selected selector
184       */
185            public int getSelectedIndex() {
186         return selected;
187            }
188            
189      /**
190       * overwrite Awt.paint()
191       *
192       * @param   g       Graphics object to use
193       */
194            public void paint(Graphics g) {
195              if(g == null || name.size() == 0) return;
196        
197        makeBim();
198        paintBackground(big);
199                     
200        Font font = getParent().getFont();
201              int tw = getSize().width / name.size();
202                    
203              for(int i = 0; i < name.size(); i++) {
204          int x = tw * i;
205          int y = 0;
206          int w = tw;
207          int h = getSize().height + borderDepth;
208          
209          if(i == name.size() - 1) {
210            w = getSize().width - x - 1;
211          }
212          
213          if(i != selected) {
214            h -= 2 * borderDepth;
215            drawRectangle(big, getParent().getBackground(), x, h, w, 3 * borderDepth, borderDepth, RAISED);
216            w -= 2 * borderDepth;
217            x += borderDepth;
218            y += borderDepth;
219          }
220          
221          drawRectangle(big, getParent().getBackground(), x, y, w, h, borderDepth, RAISED);
222          drawString(big, getParent().isEnabled() ? getParent().getForeground() : getParent().getBackground(), i == selected ? bold(font) : font, (String) name.elementAt(i), x, y, w, h, getParent().isEnabled() ? CENTER : CENTER | SUNKEN);
223          paintBim(g);
224                    }
225            }
226      
227      /**
228       * overwrite Awt.measure()
229       *
230       * @return   minimum dims
231       */
232      public Dimension measure() {
233        Dimension bd = super.measure();
234        Dimension cd = measureCaption("X", getFont(), getFont(), "\n");
235        bd.width  += insets.left + cd.width + insets.right;
236        bd.height += insets.top + cd.height + insets.bottom;
237        return bd;
238      }
239    
240      /**
241       * overwrite Awt.mousePressed()
242       *
243       * @param   e  MouseEvent
244       */
245      public void mousePressed(MouseEvent e) {
246                    if(name.size() > 0) {
247                      ((TabbedPanel) getParent()).setSelectedIndex(e.getX() / (getSize().width / name.size()));
248                    }
249      }
250    }
251    
252    /**
253     * TabbedDisplayPanel - Subclass for TabbedPanel
254     */
255    class TabbedDisplayPanel extends Awt {
256    
257      /**
258       * create a TabbedDisplayPanel - not for public use
259       */
260            TabbedDisplayPanel() {
261        borderDepth = 1;
262        insets = new Insets(3,3 + borderDepth,3 + borderDepth, 3 + borderDepth);
263              setLayout(new CardLayout());
264            }
265    
266      /**
267       * add an item
268       *
269       * @param   n  name for this panel
270       * @param   c  comp to add
271       */
272            void addItem(String n, Component c) {
273              add(n, c);
274            }
275      
276      /**
277       * remove an item
278       *
279       * @param   i  index of item to remove
280       */
281            void removeItem(int i) {
282              remove(i);
283            }
284    
285      /**
286       * select an item
287       *
288       * @param   n  name of item to select
289       */
290            void setSelected(String n) {
291              ((CardLayout)getLayout()).show(this, n);
292            }
293    
294      /**
295       * overwrite Awt.paint()
296       *
297       * @param   g       Graphics object to use
298       */
299            public void paint(Graphics g) {
300        if(g == null) return;
301        makeBim();
302        paintBackground(big);
303        drawRectangle(big, getParent().getBackground(), 0, 0 - borderDepth, getBounds().width - 1, getBounds().height + borderDepth - 1, borderDepth, RAISED);
304        paintBim(g);
305            }
306    
307      /**
308       * overwrite Awt.measure()
309       *
310       * @return   minimum dims
311       */
312      public Dimension measure() {
313        Dimension bd = super.measure();
314        Dimension cd = getLayout() == null ? new Dimension(1,1) : getLayout().preferredLayoutSize(this);
315        bd.width  += cd.width;
316        bd.height += cd.height;
317        return bd;
318      }
319    }