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 }