11package simulator .view ;
22
3+ import java .awt .Component ;
34import java .awt .Dimension ;
45import java .awt .Frame ;
6+ import java .awt .event .ActionEvent ;
7+ import java .awt .event .ActionListener ;
58import java .util .List ;
69import java .util .Map ;
710
11+ import javax .swing .Box ;
812import javax .swing .BoxLayout ;
913import javax .swing .DefaultComboBoxModel ;
14+ import javax .swing .JButton ;
15+ import javax .swing .JComboBox ;
1016import javax .swing .JDialog ;
17+ import javax .swing .JFrame ;
18+ import javax .swing .JLabel ;
1119import javax .swing .JPanel ;
20+ import javax .swing .JScrollPane ;
1221import javax .swing .JTable ;
1322import javax .swing .table .DefaultTableModel ;
23+ import javax .swing .table .TableCellRenderer ;
24+ import javax .swing .table .TableColumn ;
1425
1526import org .json .JSONObject ;
16-
1727import simulator .control .Controller ;
1828import simulator .model .BodiesGroup ;
1929import simulator .model .Body ;
@@ -28,10 +38,14 @@ class ForceLawsDialog extends JDialog implements SimulatorObserver {
2838 private String [] _headers = { "Key" , "Value" , "Description" };
2939
3040 // TODO en caso de ser necesario, añadir los atributos aquí…
31- int _status ;
41+ int _status = 0 ;
42+ private JFrame _parent ;
43+ private JComboBox <String > _lawscomb ;
44+ private JComboBox <String > _groupscomb ;
3245
3346 ForceLawsDialog (Frame parent , Controller ctrl ) {
3447 super (parent , true );
48+ _parent = (JFrame ) parent ;
3549 _ctrl = ctrl ;
3650 initGUI ();
3751 ctrl .addObserver (this );
@@ -42,24 +56,94 @@ private void initGUI() {
4256 JPanel mainPanel = new JPanel ();
4357 mainPanel .setLayout (new BoxLayout (mainPanel , BoxLayout .Y_AXIS ));
4458 setContentPane (mainPanel );
59+
4560 // _forceLawsInfo se usará para establecer la información en la tabla
4661 _forceLawsInfo = _ctrl .getForceLawsInfo ();
4762
63+ // help
64+ JLabel help = new JLabel (
65+ "<html><p>Select a force law and provide values for the parametes in the Value column (default values are used for parametes with no value).</p></html>" );
66+
67+ help .setAlignmentX (CENTER_ALIGNMENT );
68+ mainPanel .add (help );
69+
70+ mainPanel .add (Box .createRigidArea (new Dimension (0 , 20 )));
71+
4872 _dataTableModel = new DefaultTableModel () {
4973 @ Override
5074 public boolean isCellEditable (int row , int column ) {
5175 return column == 1 ;
5276 }
5377 };
54- mainPanel .add (new JTable (_dataTableModel ));
78+ JTable dataTable = new JTable (_dataTableModel ) {
79+ private static final long serialVersionUID = 1L ;
80+
81+ // we override prepareRenderer to resize columns to fit to content
82+ @ Override
83+ public Component prepareRenderer (TableCellRenderer renderer , int row , int column ) {
84+ Component component = super .prepareRenderer (renderer , row , column );
85+ int rendererWidth = component .getPreferredSize ().width ;
86+ TableColumn tableColumn = getColumnModel ().getColumn (column );
87+ tableColumn .setPreferredWidth (
88+ Math .max (rendererWidth + getIntercellSpacing ().width , tableColumn .getPreferredWidth ()));
89+ return component ;
90+ }
91+ };
92+ JScrollPane tabelScroll = new JScrollPane (dataTable , JScrollPane .VERTICAL_SCROLLBAR_AS_NEEDED ,
93+ JScrollPane .HORIZONTAL_SCROLLBAR_AS_NEEDED );
94+ mainPanel .add (tabelScroll );
95+
96+ mainPanel .add (Box .createRigidArea (new Dimension (0 , 20 )));
97+
98+ // combBox panel
99+ JPanel comboBoxPanel = new JPanel ();
100+ comboBoxPanel .setAlignmentX (CENTER_ALIGNMENT );
101+ mainPanel .add (comboBoxPanel );
55102
56103 _dataTableModel .setColumnIdentifiers (_headers );
57104 _lawsModel = new DefaultComboBoxModel <>();
58- // TODO añadir la descripción de todas las leyes de fuerza a _lawsModel
59- // TODO crear un combobox que use _lawsModel y añadirlo al panel
105+ _forceLawsInfo .forEach (fl -> {
106+ if (!fl .has ("desc" ))
107+ throw new IllegalArgumentException ();
108+
109+ _lawsModel .addElement (fl .getString ("desc" ));
110+ });
111+ _lawscomb = new JComboBox <>(_lawsModel );
112+ comboBoxPanel .add (_lawscomb );
113+
60114 _groupsModel = new DefaultComboBoxModel <>();
61- // TODO crear un combobox que use _groupsModel y añadirlo al panel
62- // TODO crear los botones OK y Cancel y añadirlos al panel
115+ _groupscomb = new JComboBox <>(_groupsModel );
116+ comboBoxPanel .add (_groupscomb );
117+
118+ // button panel
119+ JPanel buttonPanel = new JPanel ();
120+ buttonPanel .setAlignmentX (CENTER_ALIGNMENT );
121+ mainPanel .add (buttonPanel );
122+
123+ // cancel
124+ JButton cancelButton = new JButton ("Cancel" );
125+ cancelButton .addActionListener (new ActionListener () {
126+
127+ @ Override
128+ public void actionPerformed (ActionEvent e ) {
129+ _status = 0 ;
130+ ForceLawsDialog .this .setVisible (false );
131+ }
132+ });
133+ buttonPanel .add (cancelButton );
134+
135+ // OK
136+ JButton okButton = new JButton ("OK" );
137+ okButton .addActionListener (new ActionListener () {
138+
139+ @ Override
140+ public void actionPerformed (ActionEvent e ) {
141+ _status = 1 ;
142+ ForceLawsDialog .this .setVisible (false );
143+ }
144+ });
145+ buttonPanel .add (okButton );
146+
63147 setPreferredSize (new Dimension (700 , 400 ));
64148 pack ();
65149 setResizable (false );
@@ -69,8 +153,9 @@ public boolean isCellEditable(int row, int column) {
69153 public int open () {
70154 if (_groupsModel .getSize () == 0 )
71155 return _status ;
72- // TODO Establecer la posición de la ventana de diálogo de tal manera que se
73- // abra en el centro de la ventana principal
156+
157+ setLocationRelativeTo (_parent );
158+
74159 pack ();
75160 setVisible (true );
76161 return _status ;
@@ -79,24 +164,21 @@ public int open() {
79164 // TODO el resto de métodos van aquí…
80165 @ Override
81166 public void onAdvance (Map <String , BodiesGroup > groups , double time ) {
82- // TODO Auto-generated method stub
83-
84167 }
85168
86169 @ Override
87170 public void onReset (Map <String , BodiesGroup > groups , double time , double dt ) {
88- // TODO Auto-generated method stub
89-
171+ _groupsModel .removeAllElements ();
90172 }
91173
92174 @ Override
93175 public void onRegister (Map <String , BodiesGroup > groups , double time , double dt ) {
94- // TODO Auto-generated method stub
95-
176+ groups .values ().forEach (bg -> _groupsModel .addElement (bg .getId ()));
96177 }
97178
98179 @ Override
99180 public void onGroupAdded (Map <String , BodiesGroup > groups , BodiesGroup g ) {
181+ _groupsModel .addElement (g .getId ());
100182 }
101183
102184 @ Override
@@ -105,13 +187,9 @@ public void onBodyAdded(Map<String, BodiesGroup> groups, Body b) {
105187
106188 @ Override
107189 public void onDeltaTimeChanged (double dt ) {
108- // TODO Auto-generated method stub
109-
110190 }
111191
112192 @ Override
113193 public void onForceLawsChanged (BodiesGroup g ) {
114- // TODO Auto-generated method stub
115-
116194 }
117195}
0 commit comments