|
AnnotDiffDialog |
|
1 /* AnnotDiffDialog.java 2 * Copyright (c) 1998-2001, The University of Sheffield. 3 * 4 * This file is part of GATE (see http://gate.ac.uk/), and is free 5 * software, licenced under the GNU Library General Public License, 6 * Version 2, June 1991 (in the distribution as file licence.html, 7 * and also available at http://gate.ac.uk/gate/licence.html). 8 * 9 * Cristian URSU, 7/03/2001 10 * 11 * $Id: AnnotDiffDialog.java,v 1.21 2001/10/12 17:20:57 cursu Exp $ 12 * 13 */ 14 package gate.gui; 15 16 import gate.*; 17 import gate.annotation.*; 18 import gate.persist.*; 19 import gate.util.*; 20 import gate.creole.*; 21 22 import javax.swing.*; 23 import java.awt.event.*; 24 import java.awt.*; 25 import java.util.*; 26 27 /** This class wraps the {@link gate.annotation.AnnotationDiff} one. It adds the 28 * the GUI functionality needed to set up params for AnnotationDiff and also 29 * adds the AnnotationDiff as a tool in GATE. 30 */ 31 class AnnotDiffDialog extends JFrame { 32 // Local data needed in initLocalData() method 33 34 /** A map from documentName 2 GATE document It is used to display names in 35 * combo boxes 36 */ 37 Map documentsMap = null; 38 /** A map from AnnotationSetNames 2 AnnotationSets, used to display AnnotSets 39 * in combo boxes 40 */ 41 Map keyAnnotationSetMap = null; 42 /** A map from AnnotationSetNames 2 AnnotationSets, used to display AnnotSets 43 * in combo boxes 44 */ 45 Map responseAnnotationSetMap = null; 46 /** A map from Annotation types 2 AnnotationSchema, 47 * used to display annotations in combo boxes 48 */ 49 Map typesMap = null; 50 /** A set containing annot types for calculating falsePoz measure*/ 51 Set falsePozTypes = null; 52 /** AnnotDiff's tool parent frame*/ 53 MainFrame mainFrame = null; 54 /** A pointer to this object used in some internal classes*/ 55 AnnotDiffDialog thisAnnotDiffDialog = null; 56 57 // GUI components used in initGuiComponents() 58 /** Renders key documents*/ 59 JComboBox keyDocComboBox = null; 60 /** Renders response documents*/ 61 JComboBox responseDocComboBox = null; 62 /** Renders annot types which come from intersecting keyAnnotSet with 63 * responseAnnotSet 64 */ 65 JComboBox typesComboBox = null; 66 /** Renders annot types used in calculating falsPoz measure*/ 67 JComboBox falsePozTypeComboBox = null; 68 /** Renders the annotation sets that come from the response document and 69 * used in calculating falsePoz measure 70 */ 71 JComboBox responseDocAnnotSetFalsePozComboBox = null; 72 /** Renders the annotation sets that come from the key document*/ 73 JComboBox keyDocAnnotSetComboBox = null; 74 /** Renders the annotation sets that come from the response document*/ 75 JComboBox responseDocAnnotSetComboBox = null; 76 /** Renders the text label for keyDocAnnotSetComboBox*/ 77 JLabel keyLabel = null; 78 /** Renders the text label for responseDocAnnotSetComboBox*/ 79 JLabel responseLabel = null; 80 /** Renders the text label for typesComboBox*/ 81 JLabel typesLabel = null; 82 /** Renders the text label for falsePozTypeComboBox*/ 83 JLabel falsePozLabel = null; 84 /** Renders the text label for keyDocComboBox*/ 85 JLabel keyDocAnnotSetLabel = null; 86 /** Renders the text label for responseDocComboBox*/ 87 JLabel responseDocAnnotSetLabel = null; 88 /** Renders the text label for responseDocComboBox used in calc falsePoz.*/ 89 JLabel responseDocAnnotSetFalsePozLabel = null; 90 /** Renders the label for weightTextField*/ 91 JLabel weightLabel = null; 92 /** Renders the value of weight used in calculating F measure*/ 93 JTextField weightTextField = null; 94 /** Renders the button which triggers the diff process*/ 95 JButton evalButton = null; 96 /** A reference to annotDiff object that does the diff*/ 97 AnnotationDiff annotDiff = null; 98 /** A split between configuration pannel and AnnotDifff*/ 99 JSplitPane jSplit = null; 100 /** A Radio button for selecting certian features that would be used in diff*/ 101 JRadioButton someFeaturesRadio = null; 102 /** A Radio button for selecting no features that would be used in diff*/ 103 JRadioButton noFeaturesRadio = null; 104 /** A Radio button for selecting all features that would be used in diff*/ 105 JRadioButton allFeaturesRadio = null; 106 /** A group buttons for the 3 Radio buttons above*/ 107 ButtonGroup groupRadios = null; 108 /** A label for Radio Buttons selection*/ 109 JLabel selectFeaturesLabel = null; 110 /** A selection dialog used in case that the user selects some radio button*/ 111 CollectionSelectionDialog featureSelectionDialog = null; 112 /** Constructs an annotDiffDialog object having as parent aMainFrame 113 * @param aMainFrame the parent frame for this AnnotDiffDialog. If can be 114 * <b>null</b>, meaning no parent. 115 */ 116 public AnnotDiffDialog(MainFrame aMainFrame){ 117 mainFrame = aMainFrame; 118 thisAnnotDiffDialog = this; 119 initLocalData(); 120 initGuiComponents(); 121 initListeners(); 122 }//AnnotDiffDialog 123 124 /** This method is called when adding or removing a document*/ 125 public void updateData(){ 126 documentsMap = null; 127 typesMap = null; 128 falsePozTypes = null; 129 this.removeAll(); 130 131 SwingUtilities.invokeLater(new Runnable(){ 132 public void run(){ 133 initLocalData(); 134 initGuiComponents(); 135 initListeners(); 136 } 137 }); 138 }//updateData() 139 140 /** Initialises the data needed to set up {@link gate.annotation.AnnotationDiff} 141 * GUI components will be build using this data. 142 */ 143 public void initLocalData(){ 144 annotDiff = new AnnotationDiff(); 145 // Get all available documents and construct the documentsMap 146 // (docName, gate.Document) pairs 147 documentsMap = new HashMap(); 148 149 CreoleRegister registry = Gate.getCreoleRegister(); 150 ResourceData resourceData = 151 (ResourceData)registry.get("gate.corpora.DocumentImpl"); 152 if(resourceData != null && !resourceData.getInstantiations().isEmpty()){ 153 java.util.List instantiations = resourceData.getInstantiations(); 154 Iterator iter = instantiations.iterator(); 155 while (iter.hasNext()){ 156 Resource resource = (Resource) iter.next(); 157 String docName = resource.getName (); 158 gate.Document doc = (Document) resource; 159 // add it to the Map 160 documentsMap.put(docName,doc); 161 }// while 162 }else documentsMap.put("No docs found",null); 163 164 keyAnnotationSetMap = new TreeMap(); 165 responseAnnotationSetMap = new TreeMap(); 166 167 typesMap = new TreeMap(); 168 // init types map with Type,AnnotationSchema pairs 169 typesMap.put("No annot.",null); 170 171 // init falsePozTypes 172 falsePozTypes = new TreeSet(); 173 falsePozTypes.add("No annot."); 174 }// initLocalData 175 176 /** 177 * This method initializes the GUI components. Data is loaded from localData 178 * fields. 179 */ 180 public void initGuiComponents(){ 181 182 //Initialise GUI components 183 //this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 184 this.getContentPane().setLayout(new BorderLayout()); 185 // init keyDocComboBox 186 Set comboCont = new TreeSet(documentsMap.keySet()); 187 keyDocComboBox = new JComboBox(comboCont.toArray()); 188 keyDocComboBox.setSelectedIndex(0); 189 keyDocComboBox.setEditable(false); 190 keyDocComboBox.setAlignmentX(Component.LEFT_ALIGNMENT); 191 Dimension dim = new Dimension(150,keyDocComboBox.getPreferredSize().height); 192 keyDocComboBox.setPreferredSize(dim); 193 keyDocComboBox.setMaximumSize(dim); 194 keyDocComboBox.setMinimumSize(dim); 195 keyDocComboBox.setRenderer(new MyCellRenderer(Color.green, Color.black)); 196 // init its label 197 keyLabel = new JLabel("Select the KEY doc"); 198 keyLabel.setAlignmentX(Component.LEFT_ALIGNMENT); 199 keyLabel.setOpaque(true); 200 keyLabel.setFont(keyLabel.getFont().deriveFont(Font.BOLD)); 201 keyLabel.setForeground(Color.black); 202 keyLabel.setBackground(Color.green); 203 204 // init keyDocAnnotSetComboBox 205 Set comboAsCont = new TreeSet(keyAnnotationSetMap.keySet()); 206 keyDocAnnotSetComboBox = new JComboBox(comboAsCont.toArray()); 207 keyDocAnnotSetComboBox.setEditable(false); 208 keyDocAnnotSetComboBox.setAlignmentX(Component.LEFT_ALIGNMENT); 209 // init its label 210 keyDocAnnotSetLabel = new JLabel("Select the KEY annotation set"); 211 keyDocAnnotSetLabel.setAlignmentX(Component.LEFT_ALIGNMENT); 212 keyDocAnnotSetLabel.setOpaque(true); 213 keyDocAnnotSetLabel.setFont( 214 keyDocAnnotSetLabel.getFont().deriveFont(Font.BOLD)); 215 keyDocAnnotSetLabel.setForeground(Color.black); 216 keyDocAnnotSetLabel.setBackground(Color.green); 217 218 // init responseDocComboBox 219 responseDocComboBox = new JComboBox(comboCont.toArray()); 220 responseDocComboBox.setSelectedIndex(0); 221 responseDocComboBox.setEditable(false); 222 responseDocComboBox.setAlignmentX(Component.LEFT_ALIGNMENT); 223 responseDocComboBox.setPreferredSize(dim); 224 responseDocComboBox.setMaximumSize(dim); 225 responseDocComboBox.setMinimumSize(dim); 226 responseDocComboBox.setRenderer(new MyCellRenderer(Color.red, Color.black)); 227 // init its label 228 responseLabel = new JLabel("Select the RESPONSE doc"); 229 responseLabel.setAlignmentX(Component.LEFT_ALIGNMENT); 230 responseLabel.setOpaque(true); 231 responseLabel.setFont(responseLabel.getFont().deriveFont(Font.BOLD)); 232 responseLabel.setBackground(Color.red); 233 responseLabel.setForeground(Color.black); 234 235 // init responseDocAnnotSetComboBox 236 comboAsCont = new TreeSet(responseAnnotationSetMap.keySet()); 237 responseDocAnnotSetComboBox = new JComboBox(comboAsCont.toArray()); 238 responseDocAnnotSetComboBox.setEditable(false); 239 responseDocAnnotSetComboBox.setAlignmentX(Component.LEFT_ALIGNMENT); 240 // init its label 241 responseDocAnnotSetLabel = new JLabel("Select the RESPONSE annot set"); 242 responseDocAnnotSetLabel.setAlignmentX(Component.LEFT_ALIGNMENT); 243 responseDocAnnotSetLabel.setOpaque(true); 244 responseDocAnnotSetLabel.setFont( 245 responseDocAnnotSetLabel.getFont().deriveFont(Font.BOLD)); 246 responseDocAnnotSetLabel.setForeground(Color.black); 247 responseDocAnnotSetLabel.setBackground(Color.red); 248 249 // init responseDocAnnotSetFalsePozComboBox 250 // This combo is used in calculating False Poz 251 comboAsCont = new TreeSet(responseAnnotationSetMap.keySet()); 252 responseDocAnnotSetFalsePozComboBox = new JComboBox(comboAsCont.toArray()); 253 responseDocAnnotSetFalsePozComboBox.setEditable(false); 254 responseDocAnnotSetFalsePozComboBox.setAlignmentX(Component.LEFT_ALIGNMENT); 255 // init its label 256 responseDocAnnotSetFalsePozLabel = new JLabel("Select the RESPONSE annot set"); 257 responseDocAnnotSetFalsePozLabel.setAlignmentX(Component.LEFT_ALIGNMENT); 258 responseDocAnnotSetFalsePozLabel.setOpaque(true); 259 responseDocAnnotSetFalsePozLabel.setFont( 260 responseDocAnnotSetFalsePozLabel.getFont().deriveFont(Font.BOLD)); 261 responseDocAnnotSetFalsePozLabel.setForeground(Color.black); 262 responseDocAnnotSetFalsePozLabel.setBackground(Color.red); 263 264 265 // init typesComboBox 266 Vector typesCont = new Vector(typesMap.keySet()); 267 Collections.sort(typesCont); 268 typesComboBox = new JComboBox(typesCont); 269 typesComboBox.setEditable(false); 270 typesComboBox.setAlignmentX(Component.LEFT_ALIGNMENT); 271 // init its label 272 typesLabel = new JLabel("Select annot. type"); 273 typesLabel.setFont(typesLabel.getFont().deriveFont(Font.BOLD)); 274 typesLabel.setOpaque(true); 275 typesLabel.setAlignmentX(Component.LEFT_ALIGNMENT); 276 277 // init falsePozTypeComboBox 278 falsePozTypeComboBox = new JComboBox(falsePozTypes.toArray()); 279 falsePozTypeComboBox.setEditable(false); 280 falsePozTypeComboBox.setAlignmentX(Component.LEFT_ALIGNMENT); 281 // init its label 282 falsePozLabel = new JLabel("Select annot. type for FalsePoz"); 283 falsePozLabel.setFont(falsePozLabel.getFont().deriveFont(Font.BOLD)); 284 falsePozLabel.setOpaque(true); 285 falsePozLabel.setAlignmentX(Component.LEFT_ALIGNMENT); 286 287 // init weightTextField 288 weightTextField = new JTextField( 289 (new Double(AnnotationDiff.weight)).toString()); 290 weightTextField.setAlignmentX(Component.LEFT_ALIGNMENT); 291 // init its label 292 weightLabel = new JLabel("Weight for F-Measure"); 293 weightLabel.setFont(falsePozLabel.getFont().deriveFont(Font.BOLD)); 294 weightLabel.setOpaque(true); 295 weightLabel.setAlignmentX(Component.LEFT_ALIGNMENT); 296 297 // Set initial dimmension for weightTextField 298 Dimension d = new Dimension(weightLabel.getPreferredSize().width, 299 weightTextField.getPreferredSize().height); 300 weightTextField.setMinimumSize(d); 301 weightTextField.setMaximumSize(d); 302 weightTextField.setPreferredSize(d); 303 304 // evaluate button 305 evalButton = new JButton("Evaluate"); 306 evalButton.setFont(evalButton.getFont().deriveFont(Font.BOLD)); 307 308 // Some features radio Button 309 someFeaturesRadio = new JRadioButton("Some"); 310 someFeaturesRadio.setToolTipText("Select some features from the key"+ 311 " annotation set, that will be taken into consideration"+ 312 " in the diff process."); 313 // No features RB 314 noFeaturesRadio = new JRadioButton("None"); 315 noFeaturesRadio.setToolTipText("No features from the key"+ 316 " annotation set will be taken into consideration"+ 317 " in the diff process."); 318 // All features RB 319 allFeaturesRadio = new JRadioButton("All"); 320 allFeaturesRadio.setSelected(true); 321 allFeaturesRadio.setToolTipText("All features from the key"+ 322 " annotation set will be taken into consideration"+ 323 " in the diff process."); 324 // Add radio buttons to the group 325 groupRadios = new ButtonGroup(); 326 groupRadios.add(allFeaturesRadio); 327 groupRadios.add(someFeaturesRadio); 328 groupRadios.add(noFeaturesRadio); 329 // The label for the Features radio buttons group 330 selectFeaturesLabel = new JLabel("Features"); 331 selectFeaturesLabel.setFont(falsePozLabel.getFont().deriveFont(Font.BOLD)); 332 selectFeaturesLabel.setOpaque(true); 333 selectFeaturesLabel.setAlignmentX(Component.LEFT_ALIGNMENT); 334 // *************************************************************** 335 // Put all those components at their place 336 // *************************************************************** 337 Box northBox = new Box(BoxLayout.X_AXIS); 338 // Arange Key Document components 339 Box currentBox = new Box(BoxLayout.Y_AXIS); 340 currentBox.add(keyLabel); 341 currentBox.add(keyDocComboBox); 342 currentBox.add(Box.createVerticalStrut(10)); 343 currentBox.add(responseLabel); 344 currentBox.add(responseDocComboBox); 345 northBox.add(currentBox); 346 347 northBox.add(Box.createRigidArea(new Dimension(10,0))); 348 349 // Arange annotation set components 350 currentBox = new Box(BoxLayout.Y_AXIS); 351 currentBox.add(keyDocAnnotSetLabel); 352 currentBox.add(keyDocAnnotSetComboBox); 353 currentBox.add(Box.createVerticalStrut(10)); 354 currentBox.add(responseDocAnnotSetLabel); 355 currentBox.add(responseDocAnnotSetComboBox); 356 northBox.add(currentBox); 357 358 northBox.add(Box.createRigidArea(new Dimension(10,0))); 359 360 // Arange annotation types components 361 currentBox = new Box(BoxLayout.Y_AXIS); 362 currentBox.add(typesLabel); 363 currentBox.add(typesComboBox); 364 northBox.add(currentBox); 365 366 northBox.add(Box.createRigidArea(new Dimension(10,0))); 367 368 // Arrange the radio buttons 369 currentBox = new Box(BoxLayout.Y_AXIS); 370 currentBox.add(selectFeaturesLabel); 371 currentBox.add(allFeaturesRadio); 372 currentBox.add(someFeaturesRadio); 373 currentBox.add(noFeaturesRadio); 374 northBox.add(currentBox); 375 376 northBox.add(Box.createRigidArea(new Dimension(10,0))); 377 378 // Arange F-Measure weight components 379 currentBox = new Box(BoxLayout.Y_AXIS); 380 currentBox.add(weightLabel); 381 currentBox.add(weightTextField); 382 northBox.add(currentBox); 383 384 northBox.add(Box.createRigidArea(new Dimension(10,0))); 385 386 // Arange false poz components 387 currentBox = new Box(BoxLayout.Y_AXIS); 388 currentBox.add(falsePozLabel); 389 currentBox.add(falsePozTypeComboBox); 390 currentBox.add(Box.createVerticalStrut(10)); 391 currentBox.add(responseDocAnnotSetFalsePozLabel); 392 currentBox.add(responseDocAnnotSetFalsePozComboBox); 393 northBox.add(currentBox); 394 395 northBox.add(Box.createRigidArea(new Dimension(10,0))); 396 northBox.add(evalButton); 397 398 initKeyAnnotSetNames(); 399 initResponseAnnotSetNames(); 400 initAnnotTypes(); 401 initAnnotTypesFalsePoz(); 402 403 this.getContentPane().setLayout(new BoxLayout(this.getContentPane(), 404 BoxLayout.Y_AXIS)); 405 Dimension maxDimm = Toolkit.getDefaultToolkit().getScreenSize(); 406 Dimension newDim = new Dimension(maxDimm.width/3, maxDimm.height/3); 407 JScrollPane upperScrolPane = new JScrollPane(northBox); 408 upperScrolPane.getViewport(). 409 putClientProperty("EnableWindowBlit", new Boolean(true)); 410 JScrollPane lowerScrolPane = new JScrollPane(annotDiff); 411 lowerScrolPane.getViewport(). 412 putClientProperty("EnableWindowBlit", new Boolean(true)); 413 lowerScrolPane.setMaximumSize(newDim); 414 lowerScrolPane.setMinimumSize(newDim); 415 lowerScrolPane.setPreferredSize(newDim); 416 417 jSplit = new JSplitPane(JSplitPane.VERTICAL_SPLIT, 418 upperScrolPane, 419 lowerScrolPane); 420 jSplit.setOneTouchExpandable(true); 421 jSplit.setOpaque(true); 422 jSplit.setAlignmentY(Component.TOP_ALIGNMENT); 423 this.getContentPane().add(jSplit); 424 this.pack(); 425 //////////////////////////////// 426 // Center it on screen 427 /////////////////////////////// 428 Dimension ownerSize; 429 Point ownerLocation; 430 if(getOwner() == null){ 431 ownerSize = Toolkit.getDefaultToolkit().getScreenSize(); 432 ownerLocation = new Point(0, 0); 433 }else{ 434 ownerSize = getOwner().getSize(); 435 ownerLocation = getOwner().getLocation(); 436 if(ownerSize.height == 0 || 437 ownerSize.width == 0 || 438 !getOwner().isVisible()){ 439 ownerSize = Toolkit.getDefaultToolkit().getScreenSize(); 440 ownerLocation = new Point(0, 0); 441 } 442 } 443 //Center the window 444 Dimension frameSize = getSize(); 445 if (frameSize.height > ownerSize.height) 446 frameSize.height = ownerSize.height; 447 if (frameSize.width > ownerSize.width) 448 frameSize.width = ownerSize.width; 449 setLocation(ownerLocation.x + (ownerSize.width - frameSize.width) / 2, 450 ownerLocation.y + (ownerSize.height - frameSize.height) / 2); 451 452 }//initGuiComponents 453 454 /** This method is called when the user want to close the tool. See 455 * initListeners() method for more details 456 */ 457 void this_windowClosing(WindowEvent e){ 458 this.setVisible(false); 459 }//this_windowClosing(); 460 461 /** This method starts AnnotationDiff tool in a separate thread.*/ 462 private void doDiff(){ 463 try{ 464 Double d = new Double(thisAnnotDiffDialog.getCurrentWeight()); 465 AnnotationDiff.weight = d.doubleValue(); 466 }catch (NumberFormatException e){ 467 JOptionPane.showMessageDialog(thisAnnotDiffDialog, 468 "The weight for F-Measure should be a double !", 469 "Annotation Diff initialization error !", 470 JOptionPane.ERROR_MESSAGE); 471 return; 472 }// End try 473 Thread thread = new Thread(Thread.currentThread().getThreadGroup(), 474 new DiffRunner(), 475 "AnnotDiffDialog1"); 476 thread.setPriority(Thread.MIN_PRIORITY); 477 thread.start(); 478 }//doDiff(); 479 480 /**This one initializes the listeners fot the GUI components */ 481 public void initListeners(){ 482 483 this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 484 this.addWindowListener(new java.awt.event.WindowAdapter() { 485 public void windowClosing(WindowEvent e) { 486 this_windowClosing(e); 487 }// windowClosing(); 488 });// addWindowListener(); 489 490 evalButton.addActionListener(new java.awt.event.ActionListener() { 491 public void actionPerformed(ActionEvent e) { 492 thisAnnotDiffDialog.doDiff(); 493 }// actionPerformed(); 494 });//addActionListener(); 495 496 keyDocComboBox.addActionListener(new ActionListener() { 497 public void actionPerformed(ActionEvent e) { 498 initKeyAnnotSetNames(); 499 initAnnotTypes(); 500 }// actionPerformed(); 501 });//addActionListener(); 502 503 responseDocComboBox.addActionListener(new ActionListener() { 504 public void actionPerformed(ActionEvent e) { 505 initResponseAnnotSetNames(); 506 initAnnotTypes(); 507 }// actionPerformed(); 508 });//addActionListener(); 509 510 keyDocAnnotSetComboBox.addActionListener(new ActionListener() { 511 public void actionPerformed(ActionEvent e) { 512 initAnnotTypes(); 513 }// actionPerformed(); 514 });//addActionListener(); 515 516 responseDocAnnotSetComboBox.addActionListener(new ActionListener() { 517 public void actionPerformed(ActionEvent e) { 518 initAnnotTypes(); 519 }// actionPerformed(); 520 });//addActionListener(); 521 522 responseDocAnnotSetFalsePozComboBox.addActionListener(new ActionListener() { 523 public void actionPerformed(ActionEvent e) { 524 initAnnotTypesFalsePoz(); 525 }// actionPerformed(); 526 });//addActionListener(); 527 528 typesComboBox.addActionListener(new ActionListener() { 529 public void actionPerformed(ActionEvent e){ 530 if (featureSelectionDialog != null) featureSelectionDialog = null; 531 }// actionPerformed(); 532 });//addActionListener(); 533 534 someFeaturesRadio.addActionListener(new ActionListener() { 535 public void actionPerformed(ActionEvent e){ 536 collectSomeFeatures(); 537 }// actionPerformed(); 538 });//addActionListener(); 539 540 }//initListeners(); 541 542 /** Activates the CollectionSelectionDialog in order to colect those feature 543 * from key that will take part in the diff process 544 */ 545 private void collectSomeFeatures(){ 546 if (featureSelectionDialog == null){ 547 featureSelectionDialog = new CollectionSelectionDialog( 548 thisAnnotDiffDialog,true); 549 }else{ 550 featureSelectionDialog.setVisible(true); 551 return; 552 }// End if 553 // For the current annotation type take all the features that appear in the 554 // key set and initialize the featureSelectionDialog 555 gate.Document keyDocument = null; 556 keyDocument = (gate.Document) documentsMap.get( 557 (String)keyDocComboBox.getSelectedItem()); 558 if (keyDocument == null){ 559 JOptionPane.showMessageDialog(this, 560 "Select a key document first !", 561 "Gate", JOptionPane.ERROR_MESSAGE); 562 featureSelectionDialog = null; 563 return; 564 }//End if 565 566 AnnotationSet keySet = null; 567 if (keyDocAnnotSetComboBox.getSelectedItem()== null || 568 keyAnnotationSetMap.get(keyDocAnnotSetComboBox.getSelectedItem())==null) 569 // First add to the keySet all annotations from default set 570 keySet = keyDocument.getAnnotations(); 571 else{ 572 // Get all types of annotation from the selected keyAnnotationSet 573 AnnotationSet as = (AnnotationSet) keyAnnotationSetMap.get( 574 keyDocAnnotSetComboBox.getSelectedItem()); 575 keySet = as; 576 }// End if 577 if (keySet == null){ 578 JOptionPane.showMessageDialog(this, 579 "Select some annotation sets first !", 580 "Gate", JOptionPane.ERROR_MESSAGE); 581 featureSelectionDialog = null; 582 return; 583 }// End if 584 AnnotationSchema annotSchema = (AnnotationSchema) 585 typesMap.get(typesComboBox.getSelectedItem()); 586 if (annotSchema == null){ 587 JOptionPane.showMessageDialog(this, 588 "Select some annotation types first !", 589 "Gate", JOptionPane.ERROR_MESSAGE); 590 featureSelectionDialog = null; 591 return; 592 }// End if 593 AnnotationSet selectedTypeSet = keySet.get(annotSchema.getAnnotationName()); 594 Set featureNamesSet = new TreeSet(); 595 // Iterate this set and get all feature keys. 596 Iterator selectedTypeIterator = selectedTypeSet.iterator(); 597 while(selectedTypeIterator.hasNext()){ 598 Annotation a = (Annotation) selectedTypeIterator.next(); 599 if (a.getFeatures() != null) 600 featureNamesSet.addAll(a.getFeatures().keySet()); 601 }// End while 602 featureSelectionDialog.show("Select features for annotation type \"" + 603 annotSchema.getAnnotationName()+ "\" that would be used in diff proces", 604 featureNamesSet); 605 }//collectSomeFeatures(); 606 607 /** Initializes the annotations for false Poz masure*/ 608 private void initAnnotTypesFalsePoz(){ 609 gate.Document responseDocument = null; 610 responseDocument = (gate.Document) documentsMap.get( 611 (String)responseDocComboBox.getSelectedItem()); 612 falsePozTypes.clear(); 613 if (responseDocument == null){ 614 // init falsePozTypes 615 falsePozTypes.add("No annot."); 616 DefaultComboBoxModel cbm = new DefaultComboBoxModel(falsePozTypes.toArray()); 617 falsePozTypeComboBox.setModel(cbm); 618 return; 619 }//End if 620 621 // Fill the responseSet 622 Set responseSet = null; 623 if (responseDocAnnotSetFalsePozComboBox.getSelectedItem() == null || 624 responseAnnotationSetMap.get( 625 responseDocAnnotSetFalsePozComboBox.getSelectedItem())==null) 626 responseSet = new HashSet( 627 responseDocument.getAnnotations().getAllTypes()); 628 else{ 629 // Get all types of annotation from the selected responseAnnotationSet 630 AnnotationSet as = (AnnotationSet) responseAnnotationSetMap.get( 631 responseDocAnnotSetFalsePozComboBox.getSelectedItem()); 632 responseSet = new HashSet(as.getAllTypes()); 633 }// End if 634 635 // Init falsePozTypes 636 falsePozTypes.addAll(responseSet); 637 if (falsePozTypes.isEmpty()) 638 falsePozTypes.add("No annot."); 639 DefaultComboBoxModel cbm = new DefaultComboBoxModel(falsePozTypes.toArray()); 640 falsePozTypeComboBox.setModel(cbm); 641 }//initAnnotTypesFalsePoz(); 642 643 /** Reads the selected keyDocument + the selected responseDocument and 644 * also reads the selected annotation sets from Key and response and 645 * intersects the annotation types. The result is the typesComboBox which 646 * is filled with the intersected types. 647 */ 648 private void initAnnotTypes(){ 649 gate.Document keyDocument = null; 650 gate.Document responseDocument = null; 651 652 keyDocument = (gate.Document) documentsMap.get( 653 (String)keyDocComboBox.getSelectedItem()); 654 responseDocument = (gate.Document) documentsMap.get( 655 (String)responseDocComboBox.getSelectedItem()); 656 657 typesMap.clear(); 658 659 if (keyDocument == null || responseDocument == null){ 660 // init types map with Type,AnnotationSchema pairs 661 typesMap.put("No annot.",null); 662 ComboBoxModel cbm = new DefaultComboBoxModel(typesMap.keySet().toArray()); 663 typesComboBox.setModel(cbm); 664 return; 665 }//End if 666 667 // Do intersection for annotation types... 668 // First fill the keySet; 669 Set keySet = null; 670 if (keyDocAnnotSetComboBox.getSelectedItem()== null || 671 keyAnnotationSetMap.get(keyDocAnnotSetComboBox.getSelectedItem())==null) 672 // First add to the keySet all annotations from default set 673 keySet = new HashSet(keyDocument.getAnnotations().getAllTypes()); 674 else{ 675 // Get all types of annotation from the selected keyAnnotationSet 676 AnnotationSet as = (AnnotationSet) keyAnnotationSetMap.get( 677 keyDocAnnotSetComboBox.getSelectedItem()); 678 keySet = new HashSet(as.getAllTypes()); 679 }// End if 680 681 // Do the same thing for the responseSet 682 // Fill the responseSet 683 Set responseSet = null; 684 if (responseDocAnnotSetComboBox.getSelectedItem() == null || 685 responseAnnotationSetMap.get( 686 responseDocAnnotSetComboBox.getSelectedItem())==null) 687 responseSet = new HashSet( 688 responseDocument.getAnnotations().getAllTypes()); 689 else{ 690 // Get all types of annotation from the selected responseAnnotationSet 691 AnnotationSet as = (AnnotationSet) responseAnnotationSetMap.get( 692 responseDocAnnotSetComboBox.getSelectedItem()); 693 responseSet = new HashSet(as.getAllTypes()); 694 }// End if 695 696 // DO intersection between keySet & responseSet 697 keySet.retainAll(responseSet); 698 Set intersectSet = keySet; 699 700 Iterator iter = intersectSet.iterator(); 701 while (iter.hasNext()){ 702 String annotName = (String) iter.next(); 703 704 AnnotationSchema schema = new AnnotationSchema(); 705 schema.setAnnotationName(annotName); 706 707 typesMap.put(annotName,schema); 708 }// while 709 710 if (typesMap.isEmpty()) 711 typesMap.put("No annot.",null); 712 713 DefaultComboBoxModel cbm = new DefaultComboBoxModel( 714 typesMap.keySet().toArray()); 715 typesComboBox.setModel(cbm); 716 }//initAnnotTypes(); 717 718 /** Reads the selected keyDocument + the selected responseDocument and fill 719 * the two combo boxes called keyDocAnnotSetComboBox and 720 * responseDocAnnotSetComboBox. 721 */ 722 private void initKeyAnnotSetNames(){ 723 gate.Document keyDocument = null; 724 keyDocument = (gate.Document) documentsMap.get( 725 (String)keyDocComboBox.getSelectedItem()); 726 keyAnnotationSetMap.clear(); 727 728 if (keyDocument != null){ 729 Map namedAnnotSets = keyDocument.getNamedAnnotationSets(); 730 if (namedAnnotSets != null) 731 keyAnnotationSetMap.putAll(namedAnnotSets); 732 keyAnnotationSetMap.put("Default set",null); 733 DefaultComboBoxModel cbm = new DefaultComboBoxModel( 734 keyAnnotationSetMap.keySet().toArray()); 735 keyDocAnnotSetComboBox.setModel(cbm); 736 }// End if 737 }//initKeyAnnotSetNames(); 738 739 /** Reads the selected responseDocument and fill 740 * the combo box called responseDocAnnotSetFalsePozComboBox as well as 741 * responseDocAnnotSetComboBox. 742 */ 743 private void initResponseAnnotSetNames(){ 744 gate.Document responseDocument = null; 745 responseDocument = (gate.Document) documentsMap.get( 746 (String)responseDocComboBox.getSelectedItem()); 747 responseAnnotationSetMap.clear(); 748 749 if (responseDocument != null){ 750 Map namedAnnotSets = responseDocument.getNamedAnnotationSets(); 751 if (namedAnnotSets != null) 752 responseAnnotationSetMap.putAll(namedAnnotSets); 753 responseAnnotationSetMap.put("Default set",null); 754 DefaultComboBoxModel cbm = new DefaultComboBoxModel( 755 responseAnnotationSetMap.keySet().toArray()); 756 responseDocAnnotSetComboBox.setModel(cbm); 757 cbm = new DefaultComboBoxModel( 758 responseAnnotationSetMap.keySet().toArray()); 759 responseDocAnnotSetFalsePozComboBox.setModel(cbm); 760 }// End if 761 }//initResponseAnnotSetNames(); 762 763 /** It returns the selected KEY gate.Document*/ 764 public gate.Document getSelectedKeyDocument(){ 765 return (gate.Document) documentsMap.get( 766 (String)keyDocComboBox.getSelectedItem()); 767 }//getSelectedKeyDocument 768 769 /** It returns the selected RESPONSE gate.Document*/ 770 public gate.Document getSelectedResponseDocument(){ 771 return (gate.Document) documentsMap.get( 772 (String)responseDocComboBox.getSelectedItem()); 773 }//getSelectedResponseDocument 774 775 /** It returns the selected SCHEMA */ 776 public AnnotationSchema getSelectedSchema(){ 777 return (AnnotationSchema) typesMap.get( 778 (String)typesComboBox.getSelectedItem()); 779 }//getSelectedSchema 780 781 /** It returns the current weight */ 782 public String getCurrentWeight(){ 783 return weightTextField.getText(); 784 }//getCurrentWeight 785 786 /** It returns the selected Annotation to calculate the False Pozitive */ 787 public String getSelectedFalsePozAnnot(){ 788 return (String) falsePozTypeComboBox.getSelectedItem(); 789 }//getSelectedFalsePozAnnot 790 791 /** It returns the selected key AnnotationSet name. It returns null for the 792 * default annotation set. 793 */ 794 public String getSelectedKeyAnnotationSetName(){ 795 String asName = (String) keyDocAnnotSetComboBox.getSelectedItem(); 796 if ("Default set".equals(asName)) return null; 797 else return asName; 798 }//getSelectedKeyAnnotationSetName() 799 800 /** It returns the selected response AnnotationSet name.It returns null for the 801 * default annotation set. 802 */ 803 public String getSelectedResponseAnnotationSetName(){ 804 String asName = (String) responseDocAnnotSetComboBox.getSelectedItem(); 805 if ("Default set".equals(asName)) return null; 806 else return asName; 807 }//getSelectedResponseAnnotationSetName() 808 809 /** It returns the selected response AnnotationSet name for False Poz. 810 * It returns null for the default annotation set. 811 */ 812 public String getSelectedResponseAnnotationSetNameFalsePoz(){ 813 String asName = (String) responseDocAnnotSetFalsePozComboBox.getSelectedItem(); 814 if ("Default set".equals(asName)) return null; 815 else return asName; 816 }//getSelectedResponseAnnotationSetNameFalsePoz() 817 818 /** Inner class that adds a tool tip to the combo boxes with key and response 819 * documents. The tool tip represents the full path of the documents. 820 */ 821 class MyCellRenderer extends JLabel implements ListCellRenderer { 822 823 Color background = null; 824 Color foreground = null; 825 /** Constructs a renderer*/ 826 public MyCellRenderer(Color aBackground, Color aForeground){ 827 setOpaque(true); 828 background = aBackground; 829 foreground = aForeground; 830 }// MyCellRenderer(); 831 832 /** This method is overridden in order to implement the needed behaviour*/ 833 public Component getListCellRendererComponent( 834 JList list, 835 Object value, 836 int index, 837 boolean isSelected, 838 boolean cellHasFocus){ 839 // should be done only once... 840 ToolTipManager.sharedInstance().registerComponent(list); 841 setText(value.toString()); 842 setBackground(isSelected ? background : Color.white); 843 setForeground(isSelected ? foreground : Color.black); 844 if (isSelected) 845 list.setToolTipText(value.toString()); 846 return this; 847 }// getListCellRendererComponent() 848 }//MyCellRenderer 849 850 /**Inner class used to run an annot. diff in a new thread*/ 851 class DiffRunner implements Runnable{ 852 /** Constructor */ 853 public DiffRunner(){}// DiffRuner 854 /** This method is overridden in order to implement the needed behaviour*/ 855 public void run(){ 856 annotDiff.setKeyDocument(thisAnnotDiffDialog.getSelectedKeyDocument()); 857 annotDiff.setResponseDocument( 858 thisAnnotDiffDialog.getSelectedResponseDocument()); 859 annotDiff.setAnnotationSchema(thisAnnotDiffDialog.getSelectedSchema()); 860 annotDiff.setKeyAnnotationSetName( 861 thisAnnotDiffDialog.getSelectedKeyAnnotationSetName()); 862 annotDiff.setResponseAnnotationSetName( 863 thisAnnotDiffDialog.getSelectedResponseAnnotationSetName()); 864 annotDiff.setResponseAnnotationSetNameFalsePoz( 865 thisAnnotDiffDialog.getSelectedResponseAnnotationSetNameFalsePoz()); 866 867 // Only one of those radio buttons can be selected 868 if (allFeaturesRadio.isSelected()) 869 annotDiff.setKeyFeatureNamesSet(null); 870 if (noFeaturesRadio.isSelected()) 871 annotDiff.setKeyFeatureNamesSet(new HashSet()); 872 // If someFeaturesRadio is selected, then featureSelectionDialog is not 873 // null because of the collectSomeFeatures() method 874 if (someFeaturesRadio.isSelected()) 875 annotDiff.setKeyFeatureNamesSet( 876 new HashSet(featureSelectionDialog.getSelectedCollection())); 877 String falsePozAnnot = thisAnnotDiffDialog.getSelectedFalsePozAnnot(); 878 if ("No annot.".equals(falsePozAnnot)) 879 falsePozAnnot = null; 880 annotDiff.setAnnotationTypeForFalsePositive(falsePozAnnot); 881 try{ 882 annotDiff.init(); 883 } catch (ResourceInstantiationException e){ 884 JOptionPane.showMessageDialog(thisAnnotDiffDialog, 885 e.getMessage() + "\n Annotation diff stopped !", 886 "Annotation Diff initialization error !", 887 JOptionPane.ERROR_MESSAGE); 888 }finally { 889 SwingUtilities.invokeLater(new Runnable(){ 890 public void run(){ 891 doLayout(); 892 pack(); 893 }// run 894 });//invokeLater 895 }// End try 896 }// run(); 897 }//DiffRunner 898 }//AnnotDiffDialog 899
|
AnnotDiffDialog |
|