View Javadoc

1   /*
2    * FindDialog.java
3    *
4    * Created on 14. august 2005, 14:29
5    */
6   
7   package com.vikash.firsttool.UI;
8   import com.vikash.firsttool.Diagram.*;
9   import com.vikash.firsttool.ProfileImpl.*;
10  import javax.swing.*;
11  import javax.swing.border.*;
12  import javax.swing.tree.*;
13  import javax.swing.table.*;
14  import java.awt.*;
15  import java.awt.event.*;
16  import java.util.*;
17  import org.jgraph.graph.*;
18  /***
19   *
20   * @author  studajb
21   */
22  public class FindDialog extends JDialog implements MouseListener,ActionListener{
23      JTextArea help=new JTextArea();
24      JComboBox Element=new JComboBox();
25      JComboBox Diagram=new JComboBox();
26      JComboBox ElementType=new JComboBox();
27      JComboBox DiagramType=new JComboBox();
28      JButton Search=new JButton("Search");
29      JButton ClearSearch=new JButton("Reset");
30      JButton close=new JButton("Close");
31      JScrollPane scrollpane;
32      ToolTable table;
33      JLabel resultlabel;
34      JPanel MainPanel=new JPanel();
35      JPanel SearchPanel=new JPanel();
36      JPanel ResultsPanel=new JPanel();
37      JPanel ClosePanel=new JPanel();
38      MainFrame frame;
39      DiagramElementTreePane tree;
40      DiagramTreePane diagramtree;
41      Vector elementResults=null;
42      Vector diagramResults;
43      Vector initialResults;
44      /*** Creates a new instance of FindDialog */
45      public FindDialog(Frame mainframe,boolean flag) {
46          super(mainframe,flag);
47          this.frame=(MainFrame)mainframe;
48          this.tree=this.frame.getDiagramElementTree();
49          this.diagramtree=this.frame.getDiagramTree();
50          setTitle("Search");
51          setSize(500,350);
52          setDialogLocation();
53          JTabbedPane tabbedpane=new JTabbedPane();
54          
55          // Add the search panel
56          initSearch();
57          tabbedpane.addTab("Search",MainPanel);
58          
59          // Add the search help information
60          initHelp();
61          tabbedpane.addTab("Help",new JScrollPane(help));
62          
63          Container contentPane=getContentPane();
64          contentPane.add(tabbedpane);
65      }
66      
67      public void initSearch(){
68          
69          
70          Element.setEditable(true);
71          Element.addItem("*");
72          Element.setPreferredSize(new Dimension(180,25));
73          Element.setMaximumSize(new Dimension(180,25));
74          Element.setMinimumSize(new Dimension(180,25));
75          Diagram.setEditable(true);
76          Diagram.addItem("*");
77          Diagram.setPreferredSize(new Dimension(180,25));
78          Diagram.setMaximumSize(new Dimension(180,25));
79          Diagram.setMinimumSize(new Dimension(180,25));
80          ElementType.setBorder(new EtchedBorder(EtchedBorder.LOWERED));
81          initElementType();
82          DiagramType.setBorder(new EtchedBorder(EtchedBorder.LOWERED));
83          initDiagramType();
84          
85          JLabel elementLabel = new JLabel("Element Name:");
86          JLabel diagramLabel = new JLabel("In Diagram:");
87          JLabel elementtypeLabel = new JLabel("Element Type:");
88          JLabel diagramtypeLabel = new JLabel("Diagram Type:");
89          
90          GridBagLayout layout = new GridBagLayout();
91          SearchPanel.setLayout(layout);
92          SearchPanel.setBorder(new EtchedBorder());
93          ResultsPanel.setBorder(new EtchedBorder());
94          GridBagConstraints constraints=new GridBagConstraints();
95          
96          
97          constraints.gridwidth = 1;
98          
99          
100         constraints.gridx = 0;
101         constraints.gridy = 0;
102         constraints.weightx = 0.0;
103         layout.setConstraints(elementLabel, constraints);
104         SearchPanel.add(elementLabel);
105         
106         constraints.gridx = 0;
107         constraints.gridy = 1;
108         constraints.weightx = 0.0;
109         layout.setConstraints(diagramLabel, constraints);
110         SearchPanel.add(diagramLabel);
111         
112         
113         
114         constraints.gridx = 2;
115         constraints.gridy = 0;
116         constraints.weightx = 0.0;
117         layout.setConstraints(elementtypeLabel, constraints);
118         SearchPanel.add(elementtypeLabel);
119         
120         constraints.gridx = 2;
121         constraints.gridy = 1;
122         constraints.weightx = 0.0;
123         layout.setConstraints(diagramtypeLabel, constraints);
124         SearchPanel.add(diagramtypeLabel);
125         
126         constraints.gridx = 1;
127         constraints.gridy = 0;
128         constraints.weightx = 100;
129         layout.setConstraints(Element, constraints);
130         SearchPanel.add(Element);
131         
132         constraints.gridx = 1;
133         constraints.gridy = 1;
134         constraints.weightx = 100;
135         layout.setConstraints(Diagram, constraints);
136         SearchPanel.add(Diagram);
137         
138         
139         
140         constraints.gridx = 3;
141         constraints.gridy = 0;
142         constraints.weightx = 100;
143         layout.setConstraints(ElementType, constraints);
144         SearchPanel.add(ElementType);
145         
146         
147         
148         constraints.gridx = 3;
149         constraints.gridy = 1;
150         constraints.weightx = 100;
151         layout.setConstraints(DiagramType, constraints);
152         SearchPanel.add(DiagramType);
153         
154         JPanel buttonPanel = new JPanel();
155         
156         Search.addActionListener(new ActionListener(){
157             public void actionPerformed(ActionEvent e) {
158                 doSearch(null,null);
159                 ClearSearch.setEnabled(true);
160             }
161         });
162         buttonPanel.add(Search);
163         ClearSearch.addActionListener(new ActionListener(){
164             public void actionPerformed(ActionEvent e) {
165                 doNewSearch();
166                 ClearSearch.setEnabled(false);
167             }
168         });
169         ClearSearch.setEnabled(false);
170         buttonPanel.add(ClearSearch);
171         
172         buttonPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
173         constraints.gridx = 0;     constraints.gridy = 2;
174         constraints.weightx = 0.0; constraints.weighty = 0.0;
175         constraints.gridwidth = 4; constraints.gridheight = 4;
176         layout.setConstraints(buttonPanel,constraints);
177         SearchPanel.add(buttonPanel);
178         
179         
180         
181         //Results panel
182         resultlabel=new JLabel("Results:");
183         TableModel model=new TableModel(elementResults);
184         table=new ToolTable(model);
185         ResultsPanel.setLayout(new BorderLayout());
186         ResultsPanel.add(resultlabel,BorderLayout.NORTH);
187         scrollpane =new JScrollPane(table);
188         ResultsPanel.add(scrollpane,BorderLayout.CENTER);
189         
190         MainPanel.setLayout(new BorderLayout());
191         MainPanel.add(SearchPanel,BorderLayout.NORTH);
192         MainPanel.add(ResultsPanel,BorderLayout.CENTER);
193         close.addActionListener(this);
194         ClosePanel.add(close);
195         MainPanel.add(ClosePanel,BorderLayout.SOUTH);
196         
197         
198     }
199     public void initElementType(){
200         ElementType.addItem("Any Type");
201         ElementType.addItem("SWOT Elements");
202         ElementType.addItem("Asset Elements");
203         ElementType.addItem("Stakeholder Elements");
204         ElementType.addItem("Entity Elements");
205         ElementType.addItem("ThreatAgents Elements");
206         ElementType.addItem("ThreatScenario Elements");
207         ElementType.addItem("UnwantedIncident Elements");
208         ElementType.addItem("Risk Elements");
209         ElementType.addItem("Treatment Elements");
210         ElementType.addItem("TreatmentEffect Elements");
211     }
212     public void initDiagramType(){
213         DiagramType.addItem("Any Type");
214         DiagramType.addItem("SWOT Diagram");
215         DiagramType.addItem("Asset Diagram");
216         DiagramType.addItem("UnwantedIncident Diagram");
217         DiagramType.addItem("Risk Diagram");
218         DiagramType.addItem("Treatment Diagram");
219         DiagramType.addItem("TreatmentEffect Diagram");
220         
221     }
222     
223     
224     
225     public void doSearch(String name,String type){
226         String elementname=null;
227         String elementtype=null;
228         if(name==null){//to allow searching from the diagram element tree
229             elementname=(String)Element.getSelectedItem();
230         }
231         else
232             elementname=name;
233         if (elementname != null) {
234             Element.removeItem(elementname);
235             Element.insertItemAt(elementname, 0);
236             Element.setSelectedItem(elementname);
237         }
238         String diagramname=(String)Diagram.getSelectedItem();
239         if (diagramname != null) {
240             Diagram.removeItem(diagramname);
241             Diagram.insertItemAt(diagramname, 0);
242             Diagram.setSelectedItem(diagramname);
243         }
244         if (type==null)
245             elementtype=(String)ElementType.getSelectedItem();
246         
247         else{
248             elementtype=type;
249             ElementType.setSelectedItem(type);
250         }
251         String diagramtype=(String)DiagramType.getSelectedItem();
252         
253         
254         DefaultMutableTreeNode diagramroot=(DefaultMutableTreeNode)diagramtree.getModel().getRoot();
255         DefaultMutableTreeNode node;
256         TreeElement tempelem;
257         initialResults=new Vector();
258         DefaultMutableTreeNode root=(DefaultMutableTreeNode)diagramtree.getModel().getRoot();
259         Enumeration en=root.breadthFirstEnumeration();
260         if(diagramname.equals("*")){
261             while(en.hasMoreElements()){ // take each diagram and store the elements present in it.
262                 node=(DefaultMutableTreeNode)en.nextElement();
263                 if(node instanceof TreeElement){
264                     
265                     ToolGraph graph=((TreeElement)node).getInternalFrame().getGraph();
266                     Object[] cells=graph.getGraphLayoutCache().getVisibleCells(graph.getRoots());
267                     for(int i=0;i<cells.length;i++){
268                         tempelem=new TreeElement((DefaultGraphCell)cells[i]);
269                         tempelem.setInternalFrame(((TreeElement)node).getInternalFrame());
270                         initialResults.add(tempelem);
271                     }
272                 }
273             }
274             
275         }
276         else{
277             while(en.hasMoreElements()){
278                 node=(DefaultMutableTreeNode)en.nextElement();
279                 if(node instanceof TreeElement && ((TreeElement)node).getInternalFrame().getFrameTitle().equals(diagramname)){
280                     
281                     ToolGraph graph=((TreeElement)node).getInternalFrame().getGraph();
282                     Object[] cells=graph.getGraphLayoutCache().getVisibleCells(graph.getRoots());
283                     for(int i=0;i<cells.length;i++){
284                         tempelem=new TreeElement((DefaultGraphCell)cells[i]);
285                         tempelem.setInternalFrame(((TreeElement)node).getInternalFrame());
286                         initialResults.add(tempelem);
287                     }
288                 }
289                 
290             }
291             
292         }
293         
294         // search for elements in diagrams
295         diagramResults=new Vector();
296         if(diagramtype.equals("Any Type")){
297             diagramResults = initialResults;
298             
299         }
300         else{
301             for(int i=0;i<initialResults.size();i++){
302                 node=(DefaultMutableTreeNode)initialResults.elementAt(i);
303                 
304                 if(((TreeElement)node).getInternalFrame().getGraph().toString().equals(diagramtype)){
305                     diagramResults.add(node);
306                     
307                 }
308             }
309             
310         }
311         
312         DefaultMutableTreeNode elementnode;
313         DefaultGraphCell elementcell,cell,celltype=null;
314         
315         // search for the elements with the same name and type
316         elementResults=new Vector();
317         root=(DefaultMutableTreeNode)tree.getModel().getRoot();
318         
319         if (!(elementtype.equals("Any Type")) && !(elementname.equals("*"))){ // searching for particualr type of elements(ex:SWOTelements)
320             for(int i=0;i<root.getChildCount();i++){
321                 if(elementtype.equals(root.getChildAt(i).toString())) {
322                     if(root.getChildAt(i).getChildCount()!=0){
323                         celltype=(DefaultGraphCell)((DefaultMutableTreeNode)root.getChildAt(i).getChildAt(0)).getUserObject();
324                     }
325                     
326                 }
327             }
328             if(celltype!=null){
329                 for(int i=0;i<diagramResults.size();i++){
330                     elementnode=(DefaultMutableTreeNode)diagramResults.elementAt(i);
331                     elementcell=(DefaultGraphCell)elementnode.getUserObject();
332                     if((elementcell.getClass().getName()==celltype.getClass().getName()) && elementname.equals(elementcell.toString())){
333                         elementResults.add(elementnode);
334                         
335                     }
336                 }
337             }
338         }
339         else if (elementtype.equals("Any Type") && !(elementname.equals("*"))){
340             for(int i=0;i<diagramResults.size();i++){
341                 elementnode=(DefaultMutableTreeNode)diagramResults.elementAt(i);
342                 elementcell=(DefaultGraphCell)elementnode.getUserObject();
343                 if(elementname.equals(elementcell.toString())){
344                     elementResults.add(elementnode);
345                     
346                 }
347             }
348         }
349         else if (!(elementtype.equals("Any Type")) && elementname.equals("*")){
350             for(int i=0;i<root.getChildCount();i++){
351                 if(elementtype.equals(root.getChildAt(i).toString())) {
352                     if(root.getChildAt(i).getChildCount()!=0){
353                         
354                         celltype=(DefaultGraphCell)((DefaultMutableTreeNode)root.getChildAt(i).getChildAt(0)).getUserObject();
355                     }
356                     
357                     
358                 }
359             }
360             if(celltype!=null){
361                 for(int i=0;i<diagramResults.size();i++){
362                     elementnode=(DefaultMutableTreeNode)diagramResults.elementAt(i);
363                     elementcell=(DefaultGraphCell)elementnode.getUserObject();
364                     if((elementcell.getClass().getName()==celltype.getClass().getName())){
365                         elementResults.add(elementnode);
366                         
367                     }
368                 }
369             }
370         }
371         else{
372             elementResults=diagramResults;
373             
374         }
375         if(diagramname =="*" && diagramtype=="Any Type"){
376             //search in the model for the elements which are not visble in diagrams
377             root=(DefaultMutableTreeNode)tree.getModel().getRoot();
378             en=root.breadthFirstEnumeration();
379             while(en.hasMoreElements()){
380                 node=(DefaultMutableTreeNode)en.nextElement();
381                 if(node instanceof TreeElement){
382                     elementcell=(DefaultGraphCell)node.getUserObject();
383                     boolean found=false;
384                     for(int i=0;i<elementResults.size();i++){ //check if the element is already present in a diagram
385                         if(elementcell==(DefaultGraphCell)((TreeElement)elementResults.elementAt(i)).getUserObject())
386                             found=true;
387                     }
388                     if(!found){
389                         if(!(elementtype.equals("Any Type")) && !(elementname.equals("*"))) {
390                             if(node.getParent().toString().equals(elementtype) && elementname.equals(elementcell.toString())){
391                                 TreeElement temp=new TreeElement(elementcell);
392                                 elementResults.add(temp);
393                             }
394                         }
395                         else if (elementtype.equals("Any Type") && !(elementname.equals("*"))){
396                             if(elementname.equals(elementcell.toString())){
397                                 TreeElement temp=new TreeElement(elementcell);
398                                 elementResults.add(temp);
399                             }
400                         }
401                         else if (!(elementtype.equals("Any Type")) && elementname.equals("*")){
402                             if(node.getParent().toString().equals(elementtype)){
403                                 TreeElement temp=new TreeElement(elementcell);
404                                 elementResults.add(temp);
405                             }
406                             
407                         }
408                         else{
409                             TreeElement temp=new TreeElement(elementcell);
410                             elementResults.add(temp);
411                         }
412                     }
413                     
414                 }
415                 
416             }
417         }
418         
419         createResultsTable();
420     }
421     public void createResultsTable(){
422         resultlabel.setText("Results:  "+elementResults.size()+" elements found");
423         
424         // replace old results with new
425         //ResultsPanel.remove(table);
426         ResultsPanel.remove(scrollpane);
427         TableModel model=new TableModel(elementResults);
428         table=new ToolTable(model);
429         table.addMouseListener(this);
430         scrollpane=new JScrollPane(table);
431         ResultsPanel.add(scrollpane,BorderLayout.CENTER);
432         
433     }
434     public void doNewSearch(){
435         Element.removeAllItems();
436         Element.addItem("*");
437         Diagram.removeAllItems();
438         Diagram.addItem("*");
439         ElementType.setSelectedIndex(0);
440         DiagramType.setSelectedIndex(0);
441         resultlabel.setText("Results:  ");
442         TableModel model=new TableModel(null);
443         table=new ToolTable(model);
444         scrollpane =new JScrollPane(table);
445         ResultsPanel.add(scrollpane,BorderLayout.CENTER);
446         
447         
448     }
449     public void initHelp(){
450         String text;
451         text =
452         "Follow these steps to search for elements: \n\n" +
453         "1. Enter the element & diagram information in the text fields. \n\n" +
454         "2. Press the \"Search\" button to search.  \n\n" +
455         "3. This will update the table in the center with the results(if any).\n\n\n" +
456         
457         "Single click on a result to go to -- \n" +
458         "The diagram in which the element is present \n" +
459         "or \n"+
460         "The element in the diagram element tree(upper tree) \n\n"+
461         
462         "Double click on a result to open a dialog for editing the element\n\n\n" +
463         
464         "Press \"Reset\" to reset all the search fields and the results table\n\n" +
465         
466         "Press \"Close\" to close the search window";
467         
468         help.setText(text);
469         help.setEditable(false);
470         
471         
472     }
473     private void setDialogLocation() {
474         Dimension size = getSize();
475         Dimension p = getParent().getSize();
476         int x = (getParent().getX() - size.width)
477         + (int) ((size.width + p.width) / 2d);
478         int y = (getParent().getY() - size.height)
479         + (int) ((size.height + p.height) / 2d);
480         setLocation(x, y);
481     }
482     
483     public void mouseClicked(MouseEvent e) {
484         int row=table.rowAtPoint(e.getPoint());
485         TreeElement element=(TreeElement)elementResults.elementAt(row);
486         if(e.getClickCount()==2){
487             TreeElementEditDialog dialog=new TreeElementEditDialog(frame,true,element, (DiagramElementTreeModel) tree.getModel());
488             dialog.show();
489             
490         }
491         if(e.getClickCount()==1){
492             
493             // show or display the window(internalframe) conatining the cell represented by the selected table element
494             ToolInternalFrame intframe=element.getInternalFrame();
495             if(intframe!=null){
496                 try{
497                     if(!(intframe.isVisible())){
498                         intframe.setVisible(true);
499                         
500                     }
501                     
502                     if(intframe.isIcon())intframe.setIcon(false);
503                     intframe.toFront();
504                     
505                 }catch(Exception excp) {
506                     JOptionPane.showMessageDialog(null,excp);
507                 }
508                 
509                 
510                 intframe.getGraph().setSelectionCell((DefaultGraphCell)element.getUserObject());
511                 
512             }
513             
514             else{
515                 DefaultGraphCell cell=(DefaultGraphCell)element.getUserObject();
516                 DefaultMutableTreeNode root=(DefaultMutableTreeNode)tree.getModel().getRoot();
517                 Enumeration en=root.breadthFirstEnumeration();
518                 while(en.hasMoreElements()){
519                     DefaultMutableTreeNode node=(DefaultMutableTreeNode)en.nextElement();
520                     if(node instanceof TreeElement){
521                         if(cell==(DefaultGraphCell)node.getUserObject())
522                             ((DiagramElementTreeModel)tree.getModel()).showTreeElement(cell);
523                         
524                     }
525                 }
526             }
527         }
528     }
529     
530     public void mouseEntered(MouseEvent e) {
531     }
532     
533     public void mouseExited(MouseEvent e) {
534     }
535     
536     public void mousePressed(MouseEvent e) {
537         
538     }
539     
540     
541     
542     public void mouseReleased(MouseEvent e) {
543     }
544     
545     public void actionPerformed(ActionEvent e) {
546         if(e.getSource()==close){
547             hide();
548             dispose();
549         }
550     }
551     
552     
553 }
554 
555 class ToolTable extends JTable{
556     public ToolTable(){
557         this(null);
558         
559     }
560     public ToolTable(TableModel model){
561         super(model);
562         this.setRowSelectionAllowed(true);
563         this.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
564         
565     }
566 }
567 class TableModel extends AbstractTableModel{
568     Vector Result;
569     public TableModel(Vector elements){
570         this.Result=elements;
571         
572     }
573     
574     public int getColumnCount() {
575         return 4;
576     }
577     
578     public int getRowCount() {
579         if (Result == null)
580             return 0;
581         return Result.size();
582         
583     }
584     public String getColumnName(int c) {
585         if(c==0)
586             return "Element Type";
587         else if (c == 1)
588             return "Element Name";
589         else if(c ==2)
590             return "In Diagram";
591         else
592             return "Diagram Type";
593         
594     }
595     public boolean isCellEditable(int row, int col) {
596         return false;
597     }
598     
599     
600     public Object getValueAt(int rowIndex, int columnIndex) {
601         if (rowIndex < 0 || rowIndex >= Result.size())
602             return "Outof Bounds";
603         if (columnIndex < 0 || columnIndex >= 4)
604             return "Outof Bounds";
605         
606         // for each row
607         TreeElement element=(TreeElement)Result.elementAt(rowIndex);
608         switch(columnIndex){
609             case 0: DefaultGraphCell cell=(DefaultGraphCell)element.getUserObject();
610             if(cell instanceof SWOTGraphCell)
611                 return "SWOT Element";
612             else if(cell instanceof AssetGraphCell)
613                 return "Asset Element";
614             
615             else if(cell instanceof StakeholderGraphCell)
616                 return "Stakeholder Element";
617             
618             else if(cell instanceof EntityGraphCell)
619                 return "Entity Element";
620             
621             else if(cell instanceof ThreatAgentGraphCell)
622                 return "ThreatAgent Element";
623             
624             else if(cell instanceof ThreatScenarioGraphCell)
625                 return "ThreatScenario Element";
626             
627             else if(cell instanceof UnwantedIncidentGraphCell)
628                 return "UnwantedIncident Element";
629             else if(cell instanceof TreatmentGraphCell)
630                 return "Treatment Element";
631             else if(cell instanceof RiskGraphCell)
632                 return "Risk Element";
633             else if(cell instanceof TreatmentEffectGraphCell)
634                 return "TreatmentEffect Element";
635             else
636                 return "Edge";
637             case 1: return element.getUserObject();
638             
639             case 2:if(element.getInternalFrame()==null)
640                 return "N/A";
641             else
642                 return element.getInternalFrame().getTitle();
643             
644             case 3: if(element.getInternalFrame()==null)
645                 return "N/A";
646             else
647                 return element.getInternalFrame().getGraph().toString();
648         }
649         return "N/A";
650     }
651     
652 }