View Javadoc

1   /*
2   * The contents of this file are subject to the BT "ZEUS" Open Source 
3   * Licence (L77741), Version 1.0 (the "Licence"); you may not use this file 
4   * except in compliance with the Licence. You may obtain a copy of the Licence
5   * from $ZEUS_INSTALL/licence.html or alternatively from
6   * http://www.labs.bt.com/projects/agents/zeus/licence.htm
7   * 
8   * Except as stated in Clause 7 of the Licence, software distributed under the
9   * Licence is distributed WITHOUT WARRANTY OF ANY KIND, either express or 
10  * implied. See the Licence for the specific language governing rights and 
11  * limitations under the Licence.
12  * 
13  * The Original Code is within the package zeus.*.
14  * The Initial Developer of the Original Code is British Telecommunications
15  * public limited company, whose registered office is at 81 Newgate Street, 
16  * London, EC1A 7AJ, England. Portions created by British Telecommunications 
17  * public limited company are Copyright 1996-9. All Rights Reserved.
18  * 
19  * THIS NOTICE MUST BE INCLUDED ON ANY COPY OF THIS FILE
20  */
21  
22  
23  
24  /******************************************************************************
25  * TaskTablePanel.java
26  *
27  * The Container panel for the Task Table
28  *****************************************************************************/
29  
30  package zeus.generator.agent;
31  
32  import java.util.*;
33  import java.awt.*;
34  import javax.swing.*;
35  import javax.swing.event.*;
36  import javax.swing.border.*;
37  import javax.swing.table.*;
38  import java.awt.event.*;
39  
40  import zeus.util.*;
41  import zeus.concepts.*;
42  import zeus.gui.help.*;
43  import zeus.gui.fields.*;
44  import zeus.generator.*;
45  
46  public class TaskPanel extends JPanel {
47  
48    static final String[] ERROR_MESSAGE = {
49       /* 0 */ "Please select a row before\ncalling this operation"
50    };
51  
52    protected JTable            table;
53    protected TaskModel         model;
54    protected HelpWindow        helpWin;
55    protected AgentEditor       editor;
56    protected TaskToolBar       toolbar;
57    protected GeneratorModel    genmodel;
58    protected AgentGenerator    generator;
59  
60    public TaskPanel(AgentGenerator generator,
61                     GeneratorModel genmodel,
62                     AgentEditor editor,
63                     String[] tasks,
64                     String label) {
65  
66      this.editor = editor;
67      this.genmodel = genmodel;
68      this.generator = generator;
69  
70      model = new TaskModel(tasks,genmodel);
71      model.addChangeListener(editor);
72  
73      TableColumnModel tm = new DefaultTableColumnModel();
74      TableColumn column;
75      column = new TableColumn(TaskModel.TASK,12,
76         new DefaultTableCellRenderer(),
77         new DefaultCellEditor(new NameField()));
78      column.setHeaderValue(model.getColumnName(TaskModel.TASK));
79      tm.addColumn(column);
80      column = new TableColumn(TaskModel.TYPE,24);
81      column.setHeaderValue(model.getColumnName(TaskModel.TYPE));
82      tm.addColumn(column);
83  
84      table = new JTable(model,tm);
85      table.getTableHeader().setReorderingAllowed(false);
86      table.setColumnSelectionAllowed(false);
87  
88      toolbar = new TaskToolBar();
89  
90      GridBagLayout gridBagLayout = new GridBagLayout();
91      setLayout(gridBagLayout);
92      setBackground(java.awt.Color.lightGray);
93  
94      TitledBorder border = (BorderFactory.createTitledBorder(label));
95      border.setTitlePosition(TitledBorder.TOP);
96      border.setTitleJustification(TitledBorder.RIGHT);
97      border.setTitleFont(new Font("Helvetica", Font.BOLD, 14));
98      border.setTitleColor(java.awt.Color.blue);
99      setBorder(border);
100 
101     JScrollPane scrollPane = new JScrollPane(table);
102     scrollPane.setBorder(new BevelBorder(BevelBorder.LOWERED));
103     scrollPane.setMinimumSize(new Dimension(160, 80));
104     scrollPane.setPreferredSize(new Dimension(200, 80));
105     table.setBackground(Color.white);
106     
107     GridBagConstraints gbc = new GridBagConstraints();
108     gbc.gridwidth = GridBagConstraints.REMAINDER;
109     gbc.anchor = GridBagConstraints.WEST;
110     gbc.fill = GridBagConstraints.NONE;
111     gbc.insets = new Insets(0,8,0,0);
112     gridBagLayout.setConstraints(toolbar, gbc);
113     add(toolbar);
114 
115     gbc.gridwidth = GridBagConstraints.REMAINDER;
116     gbc.fill = GridBagConstraints.BOTH;
117     gbc.weightx = gbc.weighty = 1;
118     gbc.insets = new Insets(8,8,8,8);
119     gridBagLayout.setConstraints(scrollPane, gbc);
120     add(scrollPane);
121   }
122 
123   protected void errorMsg(int tag) {
124      JOptionPane.showMessageDialog(this,ERROR_MESSAGE[tag],
125                                    "Error", JOptionPane.ERROR_MESSAGE);
126   }
127 
128   public String[] getData() {
129      return model.getData();
130   }
131 
132   protected String getSelectedTaskId() {
133     int row = table.getSelectedRow();
134     if ( row == -1 ) {
135        errorMsg(0);
136        return null;
137     }
138     return (String)model.getValueAt(row,TaskModel.ID);
139   }
140 
141   class TaskToolBar extends JToolBar implements ActionListener {
142      protected JButton        newBtn;
143      protected JButton        editBtn;
144      protected JButton        deleteBtn;
145      protected JToggleButton  helpBtn;
146      protected HelpWindow     helpWin;
147      protected JPopupMenu     popup;
148      protected JMenu          primitiveMenu;
149      protected JMenu          summaryMenu;
150      protected JMenu          behaviourMenu;
151      protected JMenu          scriptMenu;
152      protected JMenuItem      primitiveMenuItem;
153      protected JMenuItem      summaryMenuItem;
154      protected JMenuItem      behaviourMenuItem;
155      protected JMenuItem      scriptMenuItem;
156 
157      public TaskToolBar() {
158        setBackground(java.awt.Color.lightGray);
159        setBorder( new BevelBorder(BevelBorder.LOWERED ) );
160        setFloatable(false);
161 
162        String sep = System.getProperty("file.separator");
163        String path = SystemProps.getProperty("gif.dir") + "generator" + sep;
164 
165        newBtn = new JButton(new ImageIcon(path + "new1.gif"));
166        newBtn.setMargin(new Insets(0,0,0,0));
167        add(newBtn);
168        newBtn.setToolTipText("Create New Task");
169        newBtn.addActionListener(this);
170 
171        editBtn = new JButton(new ImageIcon(path + "edit1.gif"));
172        editBtn.setMargin(new Insets(0,0,0,0));
173        add(editBtn);
174        editBtn.setToolTipText("Edit this Task");
175        editBtn.addActionListener(this);
176 
177        deleteBtn = new JButton(new ImageIcon(path + "delete1.gif"));
178        deleteBtn.setMargin(new Insets(0,0,0,0));
179        add(deleteBtn);
180        deleteBtn.setToolTipText("Delete this Task");
181        deleteBtn.addActionListener(this);
182 
183        addSeparator();
184 
185        helpBtn = new JToggleButton(new ImageIcon(path + "help.gif"));
186        helpBtn.setMargin(new Insets(0,0,0,0));
187        add(helpBtn);
188        helpBtn.setToolTipText("Help");
189        helpBtn.addActionListener(this);
190 
191        // ---- Popup Menu for Task Types ----
192        popup = new JPopupMenu();
193        popup.add(new JLabel ("Tasks"));
194        popup.addSeparator();
195 
196        String name = AbstractTask.getTypeName(AbstractTask.PRIMITIVE);
197        primitiveMenu = new JMenu(name,false);
198        primitiveMenuItem = new JMenuItem("New " + name + " task");
199        primitiveMenuItem.addActionListener(this);
200 
201        name = AbstractTask.getTypeName(AbstractTask.SUMMARY);
202        summaryMenu = new JMenu(name,false);
203        summaryMenuItem = new JMenuItem("New " + name + " task");
204        summaryMenuItem.addActionListener(this);
205 
206        name = AbstractTask.getTypeName(AbstractTask.BEHAVIOUR);
207        behaviourMenu = new JMenu(name,false);
208        behaviourMenuItem = new JMenuItem("New " + name);
209        behaviourMenuItem.addActionListener(this);
210 
211        name = AbstractTask.getTypeName(AbstractTask.SCRIPT);
212        scriptMenu = new JMenu(name,false);
213        scriptMenuItem = new JMenuItem("New " + name);
214        scriptMenuItem.addActionListener(this);
215 
216        popup.add(primitiveMenu);
217        popup.add(summaryMenu);
218        popup.add(behaviourMenu);
219        popup.add(scriptMenu);
220 
221        CompoundBorder cbr = new CompoundBorder(new EtchedBorder(),
222                                                new EmptyBorder(5,5,5,5));
223        popup.setBorder(cbr);
224      }
225 
226      public void actionPerformed(ActionEvent e) {
227        Object src = e.getSource();
228        String primitive = AbstractTask.getTypeName(AbstractTask.PRIMITIVE);
229        String summary   = AbstractTask.getTypeName(AbstractTask.SUMMARY);
230        String behaviour = AbstractTask.getTypeName(AbstractTask.BEHAVIOUR);
231        String script    = AbstractTask.getTypeName(AbstractTask.SCRIPT);
232 
233 
234        if ( src == newBtn ) {
235           String[] taskId = model.getData();
236           Vector names = new Vector();
237           for(int i = 0; i < taskId.length; i++ )
238              names.addElement(genmodel.getTaskName(taskId[i]));
239 
240           primitiveMenu.removeAll();
241           primitiveMenu.add(primitiveMenuItem);
242           primitiveMenu.addSeparator();
243 
244           String[] items = genmodel.getTaskNames(AbstractTask.PRIMITIVE);
245           Vector allNames = Misc.stringVector(items);
246           Vector validNames = Misc.difference(allNames,names);
247 
248           JMenuItem mi;
249           for(int i = 0; i < validNames.size(); i++ ) {
250              mi = new JMenuItem((String)validNames.elementAt(i));
251              mi.addActionListener(this);
252              mi.setActionCommand(primitive);
253              primitiveMenu.add(mi);
254           }
255 
256           summaryMenu.removeAll();
257           summaryMenu.add(summaryMenuItem);
258           summaryMenu.addSeparator();
259 
260           items = genmodel.getTaskNames(AbstractTask.SUMMARY);
261           allNames = Misc.stringVector(items);
262           validNames = Misc.difference(allNames,names);
263 
264           for(int i = 0; i < validNames.size(); i++ ) {
265              mi = new JMenuItem((String)validNames.elementAt(i));
266              mi.addActionListener(this);
267              mi.setActionCommand(summary);
268              summaryMenu.add(mi);
269           }
270 
271           behaviourMenu.removeAll();
272           behaviourMenu.add(behaviourMenuItem);
273           behaviourMenu.addSeparator();
274 
275           items = genmodel.getTaskNames(AbstractTask.BEHAVIOUR);
276           allNames = Misc.stringVector(items);
277           validNames = Misc.difference(allNames,names);
278 
279           for(int i = 0; i < validNames.size(); i++ ) {
280              mi = new JMenuItem((String)validNames.elementAt(i));
281              mi.addActionListener(this);
282              mi.setActionCommand(behaviour);
283              behaviourMenu.add(mi);
284           }
285 
286           scriptMenu.removeAll();
287           scriptMenu.add(scriptMenuItem);
288           scriptMenu.addSeparator();
289 
290           items = genmodel.getTaskNames(AbstractTask.SCRIPT);
291           allNames = Misc.stringVector(items);
292           validNames = Misc.difference(allNames,names);
293 
294           for(int i = 0; i < validNames.size(); i++ ) {
295              mi = new JMenuItem((String)validNames.elementAt(i));
296              mi.addActionListener(this);
297              mi.setActionCommand(script);
298              scriptMenu.add(mi);
299           }
300 
301           popup.pack();
302           popup.show(newBtn,0,0);
303        }
304        else if ( src == primitiveMenuItem )
305           model.addNewRow(primitive);
306        else if ( src == summaryMenuItem )
307           model.addNewRow(summary);
308        else if ( src == behaviourMenuItem )
309           model.addNewRow(behaviour);
310        else if ( src == scriptMenuItem )
311           model.addNewRow(script);
312 
313        else if ( e.getActionCommand().equals(primitive) )
314           model.addNewRow(primitive,((JMenuItem)src).getText());
315        else if ( e.getActionCommand().equals(summary) )
316           model.addNewRow(summary,((JMenuItem)src).getText());
317        else if ( e.getActionCommand().equals(behaviour) )
318           model.addNewRow(behaviour,((JMenuItem)src).getText());
319        else if ( e.getActionCommand().equals(script) )
320           model.addNewRow(script,((JMenuItem)src).getText());
321 
322        else if ( src == editBtn ) {
323           String id = getSelectedTaskId();
324           if ( id == null ) return;
325              generator.editTask(id);
326        }
327        else if ( src == deleteBtn ) {
328           int row = table.getSelectedRow();
329           if ( row == -1 ) {
330              errorMsg(0);
331              return;
332           }
333           model.removeRow(row);
334        }
335        
336        else if ( src == helpBtn ) {
337          if ( helpBtn.isSelected() ) {
338             Point dispos = getLocation();
339             helpWin = new HelpWindow(SwingUtilities.getRoot(this),dispos,
340                                      "generator", "Task Declaration");
341             helpWin.setSource(helpBtn);
342          }
343          else
344             helpWin.dispose();
345        }
346      }
347    }
348 }