1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package zeus.agentviewer.protocol;
25
26 import javax.swing.*;
27 import javax.swing.table.*;
28 import javax.swing.event.*;
29 import javax.swing.border.*;
30 import java.awt.*;
31 import java.awt.event.*;
32 import java.util.*;
33
34 import zeus.agentviewer.*;
35 import zeus.util.*;
36
37
38 public class ProtocolUI extends ZeusInternalFrame
39 implements ListSelectionListener {
40
41 final int TOP_PANE_MIN_HEIGHT = 43;
42 final int TOP_PANE_MIN_WIDTH = 500;
43 final int BOTTOM_PANE_MIN_WIDTH = 100;
44 final int BOTTOM_PANE_MIN_HEIGHT = 100;
45
46 private JPanel contentPane;
47 private JTable protocolTable, strategyTable, attributesTable;
48
49
50
51 private static int NUMBER_DISPLAYED = 0;
52 private InternalFramesPanel deskTop;
53
54 ProtocolModel protocolBuffer;
55 StrategyModel strategyBuffer;
56 AttributesModel attributesBuffer;
57
58
59
60 public ProtocolUI(InternalFramesPanel deskTop, ProtocolModel protocolBuffer,
61 StrategyModel strategyBuffer, AttributesModel attributesBuffer)
62 {
63 super(" ",true,true,true,true);
64 setTitle("Protocols & Strategies:" + (++NUMBER_DISPLAYED));
65 String sep = System.getProperty("file.separator");
66 String gifpath = SystemProps.getProperty("gif.dir") + "agentviewer" + sep;
67 ImageIcon icon = new ImageIcon(gifpath + ViewerNames.PROTOCOL_IMG);
68 setFrameIcon(icon);
69 this.deskTop = deskTop;
70 this.protocolBuffer =protocolBuffer;
71 this.strategyBuffer = strategyBuffer;
72 this.attributesBuffer = attributesBuffer;
73 buildUI();
74 deskTop.addInternalFrame(this);
75 setVisible(true);
76 }
77
78 private void buildUI(){
79 contentPane = (JPanel) getContentPane();
80 contentPane.setLayout(new BorderLayout());
81 contentPane.setBorder(BorderFactory.createEtchedBorder(Color.gray,Color.black));
82 contentPane.add(BorderLayout.NORTH,getProtocolPanel());
83 contentPane.add(BorderLayout.CENTER,getStrategyPanel());
84
85 pack();
86
87 }
88
89 JPanel getProtocolPanel(){
90 JPanel north = new JPanel(new BorderLayout());
91 north.setBorder(makeBorder("Known Protocols"));
92
93 TableColumnModel tm = new DefaultTableColumnModel();
94 TableColumn column;
95 column = new TableColumn(ProtocolModel.TYPE,24);
96 column.setHeaderValue(protocolBuffer.getColumnName(ProtocolModel.TYPE));
97 tm.addColumn(column);
98 column = new TableColumn(ProtocolModel.PROTOCOL,24);
99 column.setCellRenderer(new FriendlyRenderer());
100 column.setHeaderValue(protocolBuffer.getColumnName(ProtocolModel.PROTOCOL));
101 tm.addColumn(column);
102 column = new TableColumn(ProtocolModel.STATE,8);
103 column.setCellRenderer(new CheckBoxCellRenderer());
104 column.setHeaderValue(protocolBuffer.getColumnName(ProtocolModel.STATE));
105 tm.addColumn(column);
106
107 protocolTable = new JTable(protocolBuffer,tm);
108 protocolTable.setPreferredScrollableViewportSize(
109 new Dimension(TOP_PANE_MIN_WIDTH, TOP_PANE_MIN_HEIGHT));
110 protocolTable.getTableHeader().setReorderingAllowed(false);
111
112 JScrollPane protocolTableSP = new JScrollPane(protocolTable);
113 protocolTable.getSelectionModel().addListSelectionListener(this );
114 protocolTable.getSelectionModel().setSelectionMode(
115 ListSelectionModel.SINGLE_SELECTION);
116 north.add(BorderLayout.CENTER,protocolTableSP);
117
118 TableColumn stateColumn = protocolTable.getColumnModel().getColumn(1);
119 TableColumn protocolColumn = protocolTable.getColumnModel().getColumn(0);
120 protocolColumn.setPreferredWidth(stateColumn.getPreferredWidth()*3);
121
122
123 return north;
124 }
125
126 JPanel getStrategyPanel(){
127 JPanel center = new JPanel(new GridLayout(2,1,2,6));
128 center.setBorder(makeBorder("Coordination Strategies"));
129
130 TableColumnModel tm = new DefaultTableColumnModel();
131 TableColumn column = new TableColumn(StrategyModel.MODE,4);
132 column.setCellRenderer(new CheckBoxCellRenderer());
133 column.setHeaderValue(strategyBuffer.getColumnName(StrategyModel.MODE));
134 tm.addColumn(column);
135
136 column = new TableColumn(StrategyModel.AGENTS,24);
137 column.setCellRenderer(new StringArrayCellRenderer());
138 column.setHeaderValue(strategyBuffer.getColumnName(StrategyModel.AGENTS));
139 tm.addColumn(column);
140
141 column = new TableColumn(StrategyModel.RELATIONS,24);
142 column.setCellRenderer(new StringArrayCellRenderer());
143 column.setHeaderValue(strategyBuffer.getColumnName(StrategyModel.RELATIONS));
144 tm.addColumn(column);
145
146 column = new TableColumn(StrategyModel.STRATEGY,24);
147 column.setCellRenderer(new FriendlyRenderer());
148 column.setHeaderValue(strategyBuffer.getColumnName(StrategyModel.STRATEGY));
149 tm.addColumn(column);
150
151 column = new TableColumn(StrategyModel.FACT,12);
152 column.setHeaderValue(strategyBuffer.getColumnName(StrategyModel.FACT));
153 tm.addColumn(column);
154
155 column = new TableColumn(StrategyModel.PARAMETERS,24);
156 column.setCellRenderer(new HashtableCellRenderer());
157 column.setHeaderValue(strategyBuffer.getColumnName(StrategyModel.PARAMETERS));
158 tm.addColumn(column);
159
160
161 strategyTable = new JTable(strategyBuffer,tm);
162 strategyTable.setPreferredScrollableViewportSize(
163 new Dimension(TOP_PANE_MIN_WIDTH/2, TOP_PANE_MIN_HEIGHT));
164
165 strategyTable.getTableHeader().setReorderingAllowed(false);
166
167 JScrollPane strategyTableSP = new JScrollPane(strategyTable);
168 strategyTable.getSelectionModel().addListSelectionListener(this );
169 strategyTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
170 strategyTable.setBorder(BorderFactory.createLineBorder(Color.black));
171 center.add(strategyTableSP);
172
173
174 attributesTable = new JTable(attributesBuffer);
175 attributesTable.setPreferredScrollableViewportSize(
176 new Dimension(TOP_PANE_MIN_WIDTH/2, TOP_PANE_MIN_HEIGHT));
177 JScrollPane attributesTableSP = new JScrollPane(attributesTable);
178 attributesTable.setBorder(BorderFactory.createLineBorder(Color.black));
179 center.add(attributesTableSP);
180
181 return center;
182 }
183
184 private TitledBorder makeBorder(String title){
185 TitledBorder border = (BorderFactory.createTitledBorder(title));
186 border.setTitlePosition(TitledBorder.TOP);
187 border.setTitleJustification(TitledBorder.RIGHT);
188 border.setTitleFont(new Font("Helvetica", Font.BOLD, 12));
189 border.setTitleColor(Color.black);
190
191 return border;
192
193 }
194
195 public void valueChanged(ListSelectionEvent e) {
196 int selectedRow;
197 if (e.getSource() == protocolTable.getSelectionModel() ) {
198
199 selectedRow = protocolTable.getSelectedRow();
200 if (selectedRow >= 0 && selectedRow < protocolBuffer.getRowCount()) {
201
202 strategyBuffer.setStrategies(protocolBuffer.getStrategyInfos(selectedRow));
203 attributesBuffer.setFact(strategyBuffer.getFact(0));
204 }
205 }
206 else if (e.getSource() == strategyTable.getSelectionModel() ) {
207 selectedRow = strategyTable.getSelectedRow();
208
209 if (selectedRow >= 0 && selectedRow < strategyBuffer.getRowCount()) {
210 attributesBuffer.setFact(strategyBuffer.getFact(selectedRow));
211 }
212 }
213 }
214
215
216 void reSize(){
217 setSize(getWidth()+1,getHeight());
218 setSize(getWidth()-1,getHeight());
219 }
220 }
221
222 class StringArrayCellRenderer extends DefaultTableCellRenderer {
223 public void setValue(Object value) {
224 String text = Misc.concat((String[])value);
225 super.setValue(text);
226 }
227 }
228
229
230 class HashtableCellRenderer extends DefaultTableCellRenderer {
231 public void setValue(Object input) {
232 if ( input == null )
233 super.setValue(input);
234 else {
235 Hashtable table = (Hashtable)input;
236 Enumeration enum = table.keys();
237 String key, value;
238 String result = "";
239 while( enum.hasMoreElements() ) {
240 key = (String)enum.nextElement();
241 value = (String)table.get(key);
242 result += key + "=" + value + " ";
243 }
244 super.setValue(result.trim());
245 }
246 }
247 }
248
249 class FriendlyRenderer extends DefaultTableCellRenderer {
250 public void setValue(Object value) {
251 if ( value == null )
252 super.setValue(value);
253 else {
254 String name = SystemProps.getProperty("friendly.name." + value,
255 (String)value);
256 super.setValue(name);
257 }
258 }
259 }
260
261 class CheckBoxCellRenderer extends JCheckBox implements TableCellRenderer {
262
263 public CheckBoxCellRenderer() {
264 setHorizontalAlignment(JCheckBox.CENTER);
265 }
266
267 public Component getTableCellRendererComponent(JTable table,
268 Object value, boolean isSelected, boolean hasFocus,
269 int row, int column) {
270
271 if ( value != null )
272 this.setSelected(((Boolean)value).booleanValue());
273 return this;
274 }
275 }