1 15 16 18 36 package ixenon.free.swing; 37 38 import java.awt.*; 39 import java.awt.event.*; 40 import java.util.*; 41 import java.io.*; 42 import java.beans.*; 44 import javax.swing.*; import javax.swing.event.*; import javax.swing.border.*; 48 80 public class Pager extends JPanel 81 implements ActionListener 82 { 83 84 public final static String HELP_BUTTON_PRESSED_PROPERTY="help_button_pressed_property"; 85 86 public final static String PREVIOUS_BUTTON_PRESSED_PROPERTY="back_button_pressed_property"; 87 88 public final static String NEXT_BUTTON_PRESSED_PROPERTY="next_button_pressed_property"; 89 90 91 public final static String DEFAULT_HELP_TEXT="Help"; 92 93 public final static String DEFAULT_PREVIOUS_TEXT="<Back"; 94 95 public final static String DEFAULT_NEXT_TEXT="Next>"; 96 97 98 protected JButton bt_help; 99 100 protected JButton bt_prev; 101 102 protected JButton bt_next; 103 104 105 protected String buttonGeometry; 106 107 protected Container buttonBox; 108 protected JPanel centrePanel; 109 protected JPanel pagerPanel; 110 111 protected int pageIndex = -1; 113 protected Vector pages = new Vector(); 115 116 private SwingPropertyChangeSupport propertyListeners; 117 118 127 Pager() 128 { 129 this(BorderLayout.SOUTH, 130 DEFAULT_HELP_TEXT, DEFAULT_PREVIOUS_TEXT, DEFAULT_NEXT_TEXT ); 131 } 132 133 154 Pager( 155 String buttonGeometry, String helpText, 156 String previousText, String nextText ) 157 { 158 this.buttonGeometry = buttonGeometry; 159 160 setLayout( new BorderLayout( 2,2 )); 161 162 int axis; 166 if ( buttonGeometry.equals( BorderLayout.NORTH ) || 167 buttonGeometry.equals( BorderLayout.SOUTH ) ) { 168 axis = BoxLayout.X_AXIS; 169 buttonBox = Box.createHorizontalBox(); 170 buttonBox.add( Box.createHorizontalStrut(5) ); 171 } 172 else if ( buttonGeometry.equals( BorderLayout.EAST ) || 173 buttonGeometry.equals( BorderLayout.WEST ) ) { 174 axis = BoxLayout.Y_AXIS; 175 buttonBox = Box.createVerticalBox(); 176 buttonBox.add( Box.createVerticalStrut(5) ); 177 } 178 else 179 throw new RuntimeException ( 180 "Pager cannot have button geometry of border layout:"+BorderLayout.CENTER ); 181 182 if ( buttonGeometry.equals( BorderLayout.CENTER )) 183 throw new RuntimeException ( 184 "Pager cannot have button geometry of border layout:"+BorderLayout.CENTER ); 185 186 bt_help = new JButton( helpText ); 187 buttonBox.add(bt_help); 188 189 if (axis == BoxLayout.X_AXIS) 190 buttonBox.add( Box.createHorizontalGlue() ); 191 else 192 buttonBox.add( Box.createVerticalGlue() ); 193 194 bt_prev = new JButton( previousText ); 195 bt_prev.addActionListener( this ); 196 buttonBox.add(bt_prev); 197 198 if (axis == BoxLayout.X_AXIS) 199 buttonBox.add( Box.createHorizontalStrut(5) ); 200 else 201 buttonBox.add( Box.createVerticalStrut(5) ); 202 203 bt_next = new JButton( nextText ); 204 bt_next.addActionListener( this ); 205 buttonBox.add(bt_next); 206 207 if (axis == BoxLayout.X_AXIS) 208 buttonBox.add( Box.createHorizontalStrut(50) ); 209 else 210 buttonBox.add( Box.createVerticalStrut(50) ); 211 212 add( buttonBox, buttonGeometry ); 213 214 pagerPanel = new JPanel(); 218 pagerPanel.setLayout( new FixedSizeLayout() ); 219 220 centrePanel = new JPanel(); 221 CompoundBorder border = new CompoundBorder( 222 new BevelBorder( BevelBorder.RAISED ), 223 new BevelBorder( BevelBorder.LOWERED )); 224 centrePanel.setBorder( border ); 225 centrePanel.setLayout( new BorderLayout(5,5 )); 226 centrePanel.add( pagerPanel, BorderLayout.CENTER ); 227 228 add( centrePanel, BorderLayout.CENTER ); 229 } 230 231 235 public void addExtraComponent( Component kid ) 236 { 237 buttonBox.add( kid ); 238 if ( buttonGeometry.equals( BorderLayout.NORTH ) || 239 buttonGeometry.equals( BorderLayout.SOUTH ) ) 240 buttonBox.add( Box.createHorizontalStrut(5) ); 241 else 242 buttonBox.add( Box.createVerticalStrut(5) ); 243 } 244 245 255 public void addCenterSideComponent( Component kid, String geometry ) 256 { 257 if (geometry == BorderLayout.CENTER ) 258 throw new IllegalArgumentException ( 259 "Cannot add side component with geometry BorderLayout.CENTER" ); 260 centrePanel.add( kid, geometry ); 261 } 262 263 267 268 public int getNumPages() 269 { 270 return pages.size(); 271 } 272 273 274 public int getPageIndex() 275 { 276 return (pageIndex); 277 } 278 279 284 public void setPageIndex( int newIndex ) 285 { 286 if ( newIndex < 0 ) 287 throw new IllegalArgumentException ("page index can be negative."); 288 if ( newIndex >= pages.size() ) 289 throw new IllegalArgumentException ( 290 "page index exceeds number of pages in pager:"+pages.size() ); 291 pageIndex = newIndex; 292 showPage( pageIndex ); 293 } 294 295 296 public JButton getNextButton() 297 { 298 return (bt_next); 299 } 300 301 302 public String getNextButtonText() 303 { 304 return bt_next.getText(); 305 } 306 307 308 public void setNextButtonText( String text ) 309 { 310 bt_next.setText(text); 311 } 312 313 314 public String getNextButtonToolTipText() 315 { 316 return bt_next.getToolTipText(); 317 } 318 319 320 public void setNextButtonToolTipText( String tooltip_text ) 321 { 322 bt_next.setToolTipText(tooltip_text); 323 } 324 325 326 327 public JButton getPrevButton() 328 { 329 return (bt_prev); 330 } 331 332 333 public String getPrevButtonText() 334 { 335 return bt_prev.getText(); 336 } 337 338 339 public void setPrevButtonText( String text ) 340 { 341 bt_prev.setText(text); 342 } 343 344 345 public String getPrevButtonToolTipText() 346 { 347 return bt_prev.getToolTipText(); 348 } 349 350 351 public void setPrevButtonToolTipText( String tooltip_text ) 352 { 353 bt_prev.setToolTipText(tooltip_text); 354 } 355 356 357 358 public JButton getHelpButton() 359 { 360 return (bt_help); 361 } 362 363 364 public String getHelpButtonText() 365 { 366 return bt_help.getText(); 367 } 368 369 370 public void setHelpButtonText( String text ) 371 { 372 bt_help.setText(text); 373 } 374 375 376 public String getHelpButtonToolTipText() 377 { 378 return bt_help.getToolTipText(); 379 } 380 381 382 public void setHelpButtonToolTipText( String tooltip_text ) 383 { 384 bt_help.setToolTipText(tooltip_text); 385 } 386 387 388 400 404 405 public void gotoPrevPage() 406 { 407 if (pageIndex > 0 ) { 408 --pageIndex; 409 showPage(); 410 } 411 } 412 413 414 public void gotoNextPage() 415 { 416 if (pageIndex < pages.size()-1 ) { 417 ++pageIndex; 418 showPage(); 419 } 420 } 421 422 423 public Component addPage( Component page ) 424 { 425 if (pages == null) 426 pages = new Vector(); 427 pagerPanel.add(page); 428 pages.addElement(page); 429 if ( pages.size() == 1 ) { 430 pageIndex = 0; 432 showPage(); 433 } 434 else { 435 page.setVisible(false); 437 updatePrevNextButtons(); 438 } 439 440 return (page); 441 } 442 443 444 public void removePageAt( int index ) 445 { 446 if (index >=0 && index < pages.size() ) { 447 Component page = (Component)pages.elementAt(index); 448 page.setVisible(false); 449 if (pageIndex == index ) 450 gotoPrevPage(); 453 pages.removeElementAt( index ); 454 if (pages.size() < 1) 455 pageIndex = -1; 456 pagerPanel.remove(index); 457 } 458 } 459 460 461 public void removePage( Component page ) 462 { 463 int index = pages.indexOf(page); 464 if (index != -1 ) 465 removePageAt(index); 466 } 467 468 469 public void removeAllPages() 470 { 471 pageIndex = -1; 472 showPage(-1); 473 pages.removeAllElements(); 474 pagerPanel.removeAll(); 475 } 476 477 480 protected void updatePrevNextButtons() 481 { 482 int numPages = pages.size(); 484 bt_prev.setEnabled( pageIndex > 0 ); 485 bt_next.setEnabled( pageIndex < numPages - 1); 486 } 487 488 489 public void showPage() 490 { 491 showPage( pageIndex ); 492 } 493 494 495 496 protected void showPage( int showIndex ) 497 { 498 int numKids = pagerPanel.getComponentCount(); 500 if (numKids > 0 ) { 501 Component kids[] = pagerPanel.getComponents(); 502 for (int k=0; k<kids.length; ++k) { 503 kids[k].setVisible( k == showIndex ? true : false ); 504 } 505 506 updatePrevNextButtons(); 507 } 508 } 509 510 511 515 protected class FixedSizeLayout implements LayoutManager { 516 517 Dimension preferredSize = new Dimension(); 518 519 public void addLayoutComponent( String name, Component comp ) 520 { } 521 522 public void removeLayoutComponent( Component comp ) 523 { } 524 525 public Dimension preferredLayoutSize( Container parent ) 526 { 527 preferredSize = recomputeSize( parent ); 528 return preferredSize; 529 } 530 531 public Dimension minimumLayoutSize( Container parent ) 532 { 533 preferredSize = recomputeSize( parent ); 535 return new Dimension( preferredSize.width/8, 536 preferredSize.height/8 ); 537 } 538 539 public void layoutContainer( Container parent ) 540 { 541 int k; 543 int numKids = pagerPanel.getComponentCount(); 544 Component kids[] = pagerPanel.getComponents(); 545 546 Dimension parentSize = parent.getSize(); 547 Insets insets = parent.getInsets(); 548 Dimension fixedSize = 549 new Dimension( parentSize.width-4-insets.left-insets.right, 550 parentSize.height-4-insets.top-insets.bottom ); 551 552 for (k=0; k<numKids; ++k) { 553 Component kid = kids[k]; 554 kid.setBounds( 2+insets.left, 2+insets.top, 555 fixedSize.width, fixedSize.height ); 556 } 557 } 558 559 public Dimension recomputeSize( Container parent ) 560 { 561 Dimension prefSize; 562 Dimension greatestSize = new Dimension(0,0); 563 564 int k; 566 int numKids = pagerPanel.getComponentCount(); 567 Component kids[] = pagerPanel.getComponents(); 568 569 for (k=0; k<numKids; ++k) { 570 Component kid = kids[k]; 571 572 prefSize = kid.getPreferredSize(); 573 if ( greatestSize.width < prefSize.width ) 574 greatestSize.width = prefSize.width ; 575 if ( greatestSize.height < prefSize.height ) 576 greatestSize.height = prefSize.height ; 577 } 578 579 return greatestSize; 580 } 581 582 583 } 584 585 586 590 594 public void addPropertyChangeListener( PropertyChangeListener listener ) 595 { 596 if (propertyListeners == null) 597 propertyListeners = new SwingPropertyChangeSupport( this ); 598 propertyListeners.addPropertyChangeListener( listener ); 599 } 600 601 605 public void removePropertyChangeListener( PropertyChangeListener listener ) 606 { 607 if (propertyListeners != null) 608 propertyListeners.removePropertyChangeListener( listener ); 609 } 610 611 617 public void firePropertyChange( String propertyName, Object oldValue, Object newValue ) 618 { 619 if (propertyListeners != null) 620 propertyListeners.firePropertyChange( propertyName, oldValue, newValue ); 621 } 622 623 public void actionPerformed( ActionEvent evt ) 624 { 625 Object src = evt.getSource(); 626 if ( bt_prev == src ) { 627 gotoPrevPage(); 629 firePropertyChange( PREVIOUS_BUTTON_PRESSED_PROPERTY, null, evt ); 630 } 631 else if ( bt_next == src ) { 632 gotoNextPage(); 634 firePropertyChange( NEXT_BUTTON_PRESSED_PROPERTY, null, evt ); 635 } 636 else if ( bt_help == src ) { 637 firePropertyChange( HELP_BUTTON_PRESSED_PROPERTY, null, evt ); 639 } 640 } 641 642 public static void main( String [] args ) 643 { 644 JFrame frame = new JFrame("Pager Demonstration"); 645 frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 646 647 Pager pager = new Pager(); 648 pager.setPrevButtonToolTipText("go to previous item"); 649 pager.setNextButtonToolTipText("go to next item"); 650 pager.setHelpButtonToolTipText("call the lifeguard"); 651 652 Font font = new Font( "Dialog", Font.BOLD, 24 ); 653 for (int q=0; q<10; ++q ) { 654 JPanel panel = new JPanel(); 655 panel.setLayout( new BorderLayout() ); 656 panel.setPreferredSize( new Dimension( 325, 200 )); 657 JButton button = new JButton("Page #"+q ); 658 panel.add(button, BorderLayout.CENTER ); 659 pager.addPage(panel); 660 } 661 662 frame.getContentPane().add( pager, BorderLayout.CENTER ); 663 frame.pack(); 664 frame.setVisible(true); 665 } 666 667 } 668 669 | Popular Tags |