001 package swingui; 002 003 import java.awt.Dimension; 004 import java.awt.GridLayout; 005 006 import javax.swing.JPanel; 007 import javax.swing.JTabbedPane; 008 009 import components.Absorber; 010 import components.Ball; 011 import components.GameObject; 012 013 /** The DetailPanel is a mutable class that displays detailed information about 014 * a particular object, when it is selected in build mode. 015 * <p> 016 * DetailPanel contains several panes that can represent different types of information 017 * about an object. Depending on the type of object passed into update(), 018 * DetailPanel will use different panes -- i.e. only Absorbers will display the AbsorberPanel, 019 * which contains information about whether a ball is held inside the Absorber. 020 * 021 * @author ruthdhan 022 * 023 */ 024 public class DetailPanel extends JPanel { 025 //fields 026 private MainGUI gui; 027 028 //the panels 029 private OrientationPanel orientPanel; 030 private TriggerPanel triggerPanel; 031 private DelayPanel delayPanel; 032 private TargetPanel targetPanel; 033 private VelocityPanel velocityPanel; 034 private AbsorberPanel absorberPanel; 035 036 //the pane 037 private JTabbedPane tabbedPane; 038 private int tab; //which tab is selected 039 040 //selected 041 private GameObject selected; 042 043 public DetailPanel(MainGUI gui) { 044 super(); 045 this.gui = gui; 046 047 // THE PANELS 048 orientPanel = new OrientationPanel(); 049 triggerPanel = new TriggerPanel(); 050 delayPanel = new DelayPanel(); 051 targetPanel = new TargetPanel(gui); 052 velocityPanel = new VelocityPanel(); 053 absorberPanel = new AbsorberPanel(); 054 055 //the tabbed pane 056 tabbedPane = new JTabbedPane(JTabbedPane.LEFT); 057 tabbedPane.setPreferredSize(new Dimension(225, 300)); 058 tab = 0; 059 060 /////////////////////////////// 061 //putting everything together// 062 /////////////////////////////// 063 this.add(tabbedPane); 064 this.setVisible(true); 065 } 066 067 /** update the detail panel UI with information about obj 068 * @requires obj != null 069 */ 070 public void update(GameObject obj) { 071 selected = obj; 072 //System.err.println("entered update with obj="+obj); 073 074 //if ball, show velocity section 075 if (selected instanceof Ball) { 076 this.setLayout(new GridLayout(1, 1)); 077 velocityPanel.setObject(obj); 078 tabbedPane.add(velocityPanel); 079 } else { 080 this.setLayout(new GridLayout(1, 4)); 081 082 //absorbers don't have o-panel 083 if (selected instanceof Absorber) { 084 absorberPanel.setObject(obj); 085 tabbedPane.add(absorberPanel); 086 } else { 087 orientPanel.setObject(obj); 088 tabbedPane.add(orientPanel); 089 } 090 091 //trigger/delay/target for all gizmos 092 triggerPanel.setObject(obj); 093 delayPanel.setObject(obj); 094 targetPanel.setObject(obj); 095 tabbedPane.add(triggerPanel); 096 tabbedPane.add(delayPanel); 097 tabbedPane.add(targetPanel); 098 } 099 try { 100 tabbedPane.setSelectedIndex(tab); 101 } catch (IndexOutOfBoundsException e) { 102 tabbedPane.setSelectedIndex(0); 103 } 104 this.add(tabbedPane); 105 106 //check: 107 System.err.println("count="+this.getComponentCount()+ ", comp="+this.getComponents()); 108 109 //repaint 110 this.setVisible(true); 111 this.repaint(); 112 } 113 114 115 /** clear the detail panel (i.e. in play mode) **/ 116 public void clear() { 117 //System.out.println("clear detail panel"); 118 this.removeAll(); 119 tab = tabbedPane.getSelectedIndex(); 120 tabbedPane.removeAll(); 121 this.repaint(); 122 } 123 }