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 }