1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package unbbayes.controller;
22
23 import java.awt.Component;
24 import java.awt.Cursor;
25 import java.awt.Graphics2D;
26 import java.awt.Rectangle;
27 import java.awt.event.KeyEvent;
28 import java.awt.event.KeyListener;
29 import java.awt.image.BufferedImage;
30 import java.awt.image.RenderedImage;
31 import java.awt.print.PageFormat;
32 import java.awt.print.PrinterException;
33 import java.io.File;
34 import java.io.IOException;
35 import java.util.ArrayList;
36 import java.util.List;
37 import java.util.ResourceBundle;
38
39 import javax.imageio.ImageIO;
40 import javax.swing.JComponent;
41 import javax.swing.JDialog;
42 import javax.swing.JFileChooser;
43 import javax.swing.JOptionPane;
44 import javax.swing.JTable;
45 import javax.swing.JTextArea;
46
47 import unbbayes.evaluation.controller.EvaluationController;
48 import unbbayes.gui.FileIcon;
49 import unbbayes.gui.NetworkWindow;
50 import unbbayes.gui.SimpleFileFilter;
51 import unbbayes.gui.util.TextAreaDialog;
52 import unbbayes.io.BaseIO;
53 import unbbayes.io.extension.jpf.PluginAwareFileExtensionIODelegator;
54 import unbbayes.prs.Edge;
55 import unbbayes.prs.Graph;
56 import unbbayes.prs.Network;
57 import unbbayes.prs.Node;
58 import unbbayes.prs.bn.ProbabilisticNetwork;
59 import unbbayes.prs.bn.ProbabilisticNode;
60 import unbbayes.prs.bn.SingleEntityNetwork;
61 import unbbayes.prs.hybridbn.ContinuousNode;
62 import unbbayes.util.extension.bn.inference.IInferenceAlgorithm;
63
64
65
66
67
68
69
70
71
72
73
74
75 public class NetworkController implements KeyListener {
76
77 private NetworkWindow screen;
78 private SingleEntityNetwork singleEntityNetwork;
79
80
81 private SENController senController;
82
83 private BaseIO baseIO;
84
85
86 public IInferenceAlgorithm getInferenceAlgorithm() {
87 if (senController != null) {
88 return senController.getInferenceAlgorithm();
89 }
90 return null;
91 }
92
93 public void setInferenceAlgorithm(IInferenceAlgorithm inferenceAlgorithm) {
94 if (senController != null) {
95 senController.setInferenceAlgorithm(inferenceAlgorithm);
96 }
97 }
98
99
100 private static ResourceBundle resource = unbbayes.util.ResourceController.newInstance().getBundle(
101 unbbayes.controller.resources.ControllerResources.class.getName());
102
103
104
105
106
107
108
109 protected NetworkController() {}
110
111
112
113
114
115
116
117
118
119 public NetworkController(SingleEntityNetwork singleEntityNetwork, NetworkWindow screen) {
120 this.singleEntityNetwork = singleEntityNetwork;
121 this.screen = screen;
122 this.senController = new SENController(singleEntityNetwork, screen);
123 this.setBaseIO(PluginAwareFileExtensionIODelegator.newInstance());
124 }
125
126 public SENController getSENController(){
127 return this.senController;
128 }
129
130
131
132
133
134
135 public SingleEntityNetwork getSingleEntityNetwork() {
136
137 return this.singleEntityNetwork;
138 }
139
140
141
142
143
144 public Network getNetwork() {
145 return singleEntityNetwork;
146 }
147
148
149
150
151
152 public Graph getGraph(){
153 return singleEntityNetwork;
154 }
155
156
157
158
159 public void initialize() {
160 if (senController != null) senController.initialize();
161 }
162
163
164
165
166
167 public void createTable(Node node) {
168 if (node == null) {
169 return;
170 }
171 if (node.getType() == Node.CONTINUOUS_NODE_TYPE) {
172 createContinuousDistribution((ContinuousNode)node);
173 } else {
174 createDiscreteTable(node);
175 }
176 }
177
178
179
180
181
182
183
184 public void createContinuousDistribution(ContinuousNode node) {
185 if (senController != null) senController.createContinuousDistribution(node);
186 }
187
188
189
190
191
192
193 public void createDiscreteTable(Node node) {
194 if (senController != null) senController.createDiscreteTable(node);
195 }
196
197
198
199
200
201
202 public JTable makeTable(final Node node) {
203 if (senController != null) return senController.makeTable(node);
204 return null;
205 }
206
207
208
209
210 public void propagate() {
211 if (senController != null) senController.propagate();
212 }
213
214
215
216
217
218
219 public boolean compileNetwork() {
220 if (senController != null) return senController.compileNetwork();
221 return false;
222 }
223
224
225
226
227 public void evaluateNetwork() {
228 if (singleEntityNetwork != null && singleEntityNetwork instanceof ProbabilisticNetwork) {
229 EvaluationController evaluationController = new EvaluationController((ProbabilisticNetwork)singleEntityNetwork);
230 screen.changeToPNEvaluationPane(evaluationController.getView());
231 } else {
232 JOptionPane.showMessageDialog(screen, "Evaluation can only be done in probabilistic networks.", "Evaluation Error", JOptionPane.ERROR_MESSAGE);
233 }
234 }
235
236
237
238
239
240
241
242
243 public Node insertContinuousNode(double x, double y) {
244 if (senController != null) return senController.insertContinuousNode(x,y);
245 return null;
246 }
247
248
249
250
251
252
253
254
255 public Node insertProbabilisticNode(double x, double y) {
256 if (senController != null) return senController.insertProbabilisticNode(x,y);
257 return null;
258 }
259
260
261
262
263
264
265
266
267
268 public Node insertDecisionNode(double x, double y) {
269 if (senController != null) return senController.insertDecisionNode(x, y);
270 return null;
271 }
272
273
274
275
276
277
278
279
280 public Node insertUtilityNode(double x, double y) {
281 if (senController != null) return senController.insertUtilityNode(x, y);
282 return null;
283 }
284
285
286
287
288
289 public void showExplanationProperties(ProbabilisticNode node) {
290 if (senController != null) senController.showExplanationProperties(node);
291 }
292
293
294
295
296
297
298
299
300
301
302
303 public boolean insertEdge(Edge edge) throws Exception{
304 if (senController != null) return senController.insertEdge(edge);
305 return false;
306 }
307
308
309
310
311
312
313 public void insertState(Node node) {
314 if (senController != null) senController.insertState(node);
315 }
316
317
318
319
320
321
322 public void removeState(Node node) {
323 if (senController != null) senController.removeState(node);
324 }
325
326
327
328
329
330
331 public void deleteSelected(Object selected) {
332 if (senController != null) senController.deleteSelected(selected);
333 }
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348 public void keyTyped(KeyEvent e) { }
349
350
351
352
353
354
355
356
357
358
359 public void keyPressed(KeyEvent e) {
360
361
362
363
364
365
366
367
368
369
370
371
372 }
373
374
375
376
377
378
379
380
381 public void keyReleased(KeyEvent e) {
382 }
383
384
385
386
387
388
389
390
391
392
393 public NetworkWindow getScreen() {
394 return this.screen;
395 }
396
397
398
399
400 public void saveNetImage() {
401 String images[] = { "PNG", "JPG", "GIF", "BMP" };
402 JFileChooser chooser = new JFileChooser(FileHistoryController.getInstance().getCurrentDirectory());
403 chooser.setMultiSelectionEnabled(false);
404
405 chooser.setFileView(new FileIcon(screen));
406 chooser.addChoosableFileFilter(new SimpleFileFilter( images, resource.getString("imageFileFilter")));
407
408 int opcao = chooser.showSaveDialog(screen);
409 if (opcao == JFileChooser.APPROVE_OPTION) {
410 Rectangle r = calculateNetRectangle();
411 Component comp = screen.getGraphPane().getGraphViewport();
412 File file = new File(chooser.getSelectedFile().getPath());
413 saveComponentAsImage(comp, r.width, r.height, file);
414 FileHistoryController.getInstance().setCurrentDirectory(chooser.getCurrentDirectory());
415 }
416 }
417
418 protected void saveComponentAsImage(Component comp, int width, int height, File file) {
419 BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
420
421 Graphics2D g2d = bufferedImage.createGraphics();
422
423 comp.paint(g2d);
424 g2d.dispose();
425 RenderedImage rendImage = bufferedImage;
426
427 boolean wrongName = false;
428
429 String fileName = file.getName();
430 if (fileName.length() > 4) {
431 String fileExt = fileName.substring(fileName.length() - 3);
432 try {
433 if (fileExt.equalsIgnoreCase("png")) {
434 ImageIO.write(rendImage, "png", file);
435 } else if (fileExt.equalsIgnoreCase("jpg")) {
436 ImageIO.write(rendImage, "jpg", file);
437 } else if (fileExt.equalsIgnoreCase("gif")) {
438 ImageIO.write(rendImage, "gif", file);
439 } else if (fileExt.equalsIgnoreCase("bmp")) {
440 ImageIO.write(rendImage, "bmp", file);
441 } else {
442 wrongName = true;
443 }
444 } catch (IOException e1) {
445
446 e1.printStackTrace();
447 }
448 } else {
449 wrongName = true;
450 }
451
452 if (wrongName) {
453
454 }
455
456 }
457
458
459
460
461 public void saveTableImage() {
462 String images[] = { "PNG", "JPG", "GIF", "BMP" };
463 JFileChooser chooser = new JFileChooser(FileHistoryController.getInstance().getCurrentDirectory());
464 chooser.setMultiSelectionEnabled(false);
465
466 chooser.setFileView(new FileIcon(screen));
467 chooser.addChoosableFileFilter(new SimpleFileFilter( images, resource.getString("imageFileFilter")));
468
469 int opcao = chooser.showSaveDialog(screen);
470 if (opcao == JFileChooser.APPROVE_OPTION) {
471
472 Component comp = screen.getTable();
473 File file = new File(chooser.getSelectedFile().getPath());
474 saveComponentAsImage(comp, comp.getWidth(), comp.getHeight(), file);
475 FileHistoryController.getInstance().setCurrentDirectory(chooser.getCurrentDirectory());
476 }
477 }
478
479
480
481
482
483
484
485
486 protected String getLogContent() {
487 if (singleEntityNetwork != null) {
488 return singleEntityNetwork.getLog();
489 }
490 return "";
491 }
492
493
494
495
496
497
498
499
500 public String getLog() {
501 return this.getLogContent();
502 }
503
504
505
506
507
508
509 public JDialog showLog() {
510 TextAreaDialog dialog = new TextAreaDialog(this.getScreen().getUnbbayesFrame(), false);
511 dialog.setTextContent(this.getLog());
512 return dialog;
513 }
514
515
516
517
518
519 public void openWarningDialog(){
520 System.out.println("Not implemented yet");
521 }
522
523
524
525
526
527 public void closeWarningDialog(){
528 System.out.println("Not implemented yet");
529 }
530
531
532
533
534
535
536 public void previewPrintLog(final JTextArea texto, final JDialog dialog) {
537 screen.setCursor(new Cursor(Cursor.WAIT_CURSOR));
538 Thread t = new Thread(new Runnable() {
539 public void run() {
540 PrintText it = new PrintText(texto,
541 new PageFormat());
542 PrintPreviewer pp = new PrintPreviewer(
543 it, 0);
544
545 JDialog dlg = new JDialog(dialog,
546 resource.getString("previewLogToolTip"));
547 dlg.getContentPane().add(pp);
548 dlg.setSize(640, 480);
549 dlg.setVisible(true);
550 }
551 });
552
553 t.start();
554 screen.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
555 }
556
557
558
559
560
561 public void previewPrintTable() {
562 screen.setCursor(new Cursor(Cursor.WAIT_CURSOR));
563 Thread t = new Thread(new Runnable() {
564 public void run() {
565 List<JTable> tabelas = new ArrayList<JTable>();
566 List<Object> donos = new ArrayList<Object>();
567 List temp = screen.getGraphPane().getSelectedGroup();
568 if (temp.size() == 0) {
569 tabelas.add(screen.getTable());
570 donos.add(screen.getTableOwner());
571 } else {
572 for (int i = 0; i< temp.size(); i++) {
573 if (temp.get(i) instanceof Node) {
574 donos.add(((Node)temp.get(i)).toString());
575 tabelas.add(makeTable((Node)temp.get(i)));
576 }
577 }
578 }
579
580 PrintTable tp = new PrintTable(tabelas, donos, new PageFormat());
581 PrintPreviewer pp = new PrintPreviewer(
582 tp, 0);
583 JDialog dlg = new JDialog();
584 dlg.getContentPane().add(pp);
585 dlg.setSize(400, 300);
586 dlg.setVisible(true);
587 }
588 });
589 t.start();
590 screen.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
591 }
592
593
594
595
596
597 public void previewPrintNet(final JComponent rede, final Rectangle retangulo) {
598 screen.setCursor(new Cursor(Cursor.WAIT_CURSOR));
599 Thread t = new Thread(new Runnable() {
600 public void run() {
601 String rotulo = JOptionPane.showInputDialog(screen, resource.getString("askTitle"), resource.getString("informationText"), JOptionPane.INFORMATION_MESSAGE);
602 if (rotulo == null) {
603 rotulo = "";
604 }
605 PrintNet it = new PrintNet(rotulo, rede, retangulo, new PageFormat());
606 PrintPreviewer pp = new PrintPreviewer(
607 it, 0);
608
609 JDialog dlg = new JDialog();
610 dlg.getContentPane().add(pp);
611 dlg.setSize(640, 480);
612 dlg.setVisible(true);
613 }
614 });
615
616 t.start();
617 screen.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
618 }
619
620
621
622
623
624
625
626
627
628 public void printNet(final JComponent network, final Rectangle rectangle) {
629 screen.setCursor(new Cursor(Cursor.WAIT_CURSOR));
630 Thread t = new Thread(new Runnable() {
631 public void run() {
632 String rotulo = JOptionPane.showInputDialog(screen, resource.getString("askTitle"), resource.getString("informationText"), JOptionPane.INFORMATION_MESSAGE);
633 if (rotulo == null) {
634 rotulo = "";
635 }
636 PrintNet it = new PrintNet(rotulo, network, rectangle, new PageFormat());
637 PrintMonitor pm = new PrintMonitor(it);
638 try {
639 pm.performPrint(true);
640 } catch (PrinterException pe) {
641 JOptionPane.showMessageDialog(
642 screen,
643 resource.getString("printException") +
644 pe.getMessage());
645 }
646 }
647 });
648 t.start();
649 screen.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
650 }
651
652
653
654
655
656 public void printTable() {
657 screen.setCursor(new Cursor(Cursor.WAIT_CURSOR));
658 Thread t = new Thread(new Runnable() {
659 public void run() {
660 List<JTable> tabelas = new ArrayList<JTable>();
661 List<Object> donos = new ArrayList<Object>();
662 List temp = screen.getGraphPane().getSelectedGroup();
663 if (temp.size() == 0) {
664 tabelas.add(screen.getTable());
665 donos.add(screen.getTableOwner());
666 } else {
667 for (int i = 0; i< temp.size(); i++) {
668 if (temp.get(i) instanceof Node) {
669 donos.add(((Node)temp.get(i)).toString());
670 tabelas.add(makeTable((Node)temp.get(i)));
671 }
672 }
673 }
674 PrintTable impressora = new PrintTable(tabelas, donos, new PageFormat());
675 PrintMonitor pm = new PrintMonitor(impressora);
676 try {
677 pm.performPrint(true);
678 } catch (PrinterException pe) {
679 JOptionPane.showMessageDialog(
680 screen,
681 resource.getString("printException") +
682 pe.getMessage());
683 }
684 }
685 });
686 t.start();
687 screen.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
688 }
689
690
691
692
693
694
695
696
697 protected void printLog(final JTextArea textArea) {
698 Thread t = new Thread(new Runnable() {
699 public void run() {
700 PrintText it = new PrintText(textArea,
701 new PageFormat());
702 PrintMonitor pm = new PrintMonitor(it);
703 try {
704 pm.performPrint(true);
705 } catch (PrinterException pe) {
706 JOptionPane.showMessageDialog(
707 screen,
708 resource.getString("printException") +
709 pe.getMessage());
710 }
711 }
712 });
713 t.start();
714 }
715
716
717
718
719
720
721 public Rectangle calculateNetRectangle() {
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777 return new Rectangle(0, 0, (int)screen.getGraphPane().getBiggestPoint().x, (int)screen.getGraphPane().getBiggestPoint().y);
778
779
780 }
781
782
783
784
785
786 public Node getSelectedNode(){
787 System.out.println("Node selection is currently only available for subclasses");
788 return null;
789 }
790
791
792
793
794
795 public void selectNode(Node node){
796 System.out.println("Node selection is currently only available for subclasses");
797 }
798
799
800
801
802 public void unselectAll(){
803 System.out.println("Node selection is currently only available for subclasses");
804 }
805
806
807
808
809
810
811
812 public BaseIO getBaseIO() {
813 return baseIO;
814 }
815
816
817
818
819
820
821
822 public void setBaseIO(BaseIO baseIO) {
823 this.baseIO = baseIO;
824 }
825
826
827
828
829 public void setScreen(NetworkWindow screen) {
830 this.screen = screen;
831 }
832
833
834 }