001 /* 002 * The contents of this file are subject to the Mozilla Public 003 * License Version 1.1 (the "License"); you may not use this file 004 * except in compliance with the License. You may obtain a copy of 005 * the License at http://www.mozilla.org/MPL/ 006 * 007 * Software distributed under the License is distributed on an "AS 008 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or 009 * implied. See the License for the specific language governing 010 * rights and limitations under the License. 011 * 012 * The Original Code is Knowtator. 013 * 014 * The Initial Developer of the Original Code is University of Colorado. 015 * Copyright (C) 2005 - 2008. All Rights Reserved. 016 * 017 * Knowtator was developed by the Center for Computational Pharmacology 018 * (http://compbio.uchcs.edu) at the University of Colorado Health 019 * Sciences Center School of Medicine with support from the National 020 * Library of Medicine. 021 * 022 * Current information about Knowtator can be obtained at 023 * http://knowtator.sourceforge.net/ 024 * 025 * Contributor(s): 026 * Philip V. Ogren <philip@ogren.info> (Original Author) 027 */ 028 package edu.uchsc.ccp.knowtator.wizards; 029 030 import java.awt.BorderLayout; 031 import java.awt.Color; 032 import java.awt.Dimension; 033 import java.awt.Font; 034 import java.awt.GridBagConstraints; 035 import java.awt.GridBagLayout; 036 import java.awt.Insets; 037 import java.awt.Point; 038 import java.awt.event.ActionEvent; 039 import java.awt.event.ActionListener; 040 import java.io.File; 041 import java.util.Collection; 042 import java.util.HashSet; 043 import java.util.Set; 044 import java.util.TreeSet; 045 046 import javax.swing.JButton; 047 import javax.swing.JCheckBox; 048 import javax.swing.JFileChooser; 049 import javax.swing.JFrame; 050 import javax.swing.JLabel; 051 import javax.swing.JList; 052 import javax.swing.JOptionPane; 053 import javax.swing.JPanel; 054 import javax.swing.JScrollPane; 055 import javax.swing.JTextArea; 056 import javax.swing.JTextField; 057 import javax.swing.event.CaretEvent; 058 import javax.swing.event.CaretListener; 059 060 import edu.stanford.smi.protege.model.KnowledgeBase; 061 import edu.stanford.smi.protege.model.Project; 062 import edu.stanford.smi.protege.model.SimpleInstance; 063 import edu.stanford.smi.protege.ui.DisplayUtilities; 064 import edu.stanford.smi.protege.ui.FrameRenderer; 065 import edu.stanford.smi.protege.ui.InstanceDisplay; 066 import edu.stanford.smi.protege.util.CollectionUtilities; 067 import edu.stanford.smi.protege.util.ComponentUtilities; 068 import edu.uchsc.ccp.knowtator.FilterUtil; 069 import edu.uchsc.ccp.knowtator.KnowtatorProjectUtil; 070 071 public class IAAWizard implements ActionListener, CaretListener { 072 073 public static final String IAA_DIRECTORY = "IAA_DIRECTORY"; 074 075 public static final String IAA_FILTER = "IAA_FILTER"; 076 077 public static final String IAA_TEXTSOURCES = "IAA_TEXTSOURCES"; 078 079 public static final String IAA_CONFIG = "IAA_CONFIG"; 080 081 public static final String IAA_CONFIG_DISPLAY = "IAA_CONFIG_DISPLAY"; 082 083 public static final String IAA_WELCOME_MESSAGE = "This wizard allows you to configure how inter-annotator agreement (IAA) metrics will be calculated. " 084 + "All IAA results are written to local html files that are veiwable using a web browser. Please " 085 + "consult available documentation for details on how IAA is calculated and what the results mean. " 086 + "Calculating the IAA may take some time depending on how many matchers are used and how many " 087 + "annotations are in your project. Please be patient!"; 088 089 public static final String TO_WELCOME_FRAME = "TO_WELCOME_FRAME"; 090 091 public static final String TO_OUTPUT_FRAME = "TO_OUTPUT_FRAME"; 092 093 public static final String TO_FILTER_FRAME = "TO_FILTER_FRAME"; 094 095 public static final String TO_TEXTSOURCES_FRAME = "TO_TEXTSOURCES_FRAME"; 096 097 public static final String TO_CONFIG_FRAME = "TO_CONFIG_FRAME"; 098 099 public static final String GO_CLICKED = "GO_CLICKED"; 100 101 public static final String ADD_SLOT_MATCHER_CLICKED = "ADD_SLOT_MATCHER_CLICKED"; 102 103 public static final String REMOVE_SLOT_MATCHER_CLICKED = "REMOVE_SLOT_MATCHER_CLICKED"; 104 105 File outputDirectory; 106 107 SimpleInstance filter; 108 109 Set<SimpleInstance> textSources; 110 111 boolean goClicked = false; 112 113 SimpleInstance slotMatcherConfig; 114 115 Project project; 116 117 KnowledgeBase kb; 118 119 KnowtatorProjectUtil kpu; 120 121 JFrame parent; 122 123 WizardFrame welcomeFrame; 124 125 WizardFrame outputFrame; 126 127 WizardFrame filterFrame; 128 129 WizardFrame textSourcesFrame; 130 131 WizardFrame configFrame; 132 133 WizardFrame visibleFrame; // one of the above frames 134 135 JLabel outputDirectoryLabel; 136 137 JTextField outputDirectoryField; 138 139 JButton outputDirectoryButton; 140 141 JLabel outputDirectoryWarningLabel; 142 143 JLabel filterLabel; 144 145 JButton filterButton; 146 147 JLabel textSourcesLabel; 148 149 JList textSourcesList; 150 151 JButton textSourcesRemoveButton; 152 153 JButton textSourcesAddButton; 154 155 JPanel configPanel; 156 157 JCheckBox classMatcherCheckBox; 158 159 JCheckBox spanMatcherCheckBox; 160 161 JCheckBox classAndSpanMatcherCheckBox; 162 163 JCheckBox subclassMatcherCheckBox; 164 165 JPanel slotMatcherPanel; 166 167 JButton addSlotMatcherButton; 168 169 InstanceDisplay instanceDisplay; 170 171 Dimension wizardSize; 172 173 Point wizardLocation; 174 175 public IAAWizard(Project project, KnowledgeBase kb, KnowtatorProjectUtil kpu, JFrame parent) 176 177 { 178 this.project = project; 179 this.kb = kb; 180 this.kpu = kpu; 181 this.parent = parent; 182 183 textSources = new TreeSet<SimpleInstance>(); 184 185 createWelcomeFrame(); 186 createOutputFrame(); 187 createFilterFrame(); 188 createTextSourcesFrame(); 189 createConfigFrame(); 190 191 setOutputDirectory(getRecentIAADirectory(), true); 192 setIAAFilter(getRecentIAAFilter()); 193 addTextSources(getRecentTextSources()); 194 } 195 196 private void createWelcomeFrame() { 197 welcomeFrame = new WizardFrame(parent, "Inter-annotator agreement metrics"); 198 welcomeFrame.setAlwaysOnTop(false); 199 welcomeFrame.previousButton.setEnabled(false); 200 welcomeFrame.nextButton.setActionCommand(TO_OUTPUT_FRAME); 201 welcomeFrame.nextButton.addActionListener(this); 202 welcomeFrame.cancelButton.addActionListener(this); 203 welcomeFrame.contentPane.setLayout(new BorderLayout()); 204 welcomeFrame.setLocation(WizardUtil.getCentralDialogLocation(parent, welcomeFrame)); 205 206 JTextArea welcomeMessage = new JTextArea(); 207 welcomeMessage.setEditable(false); 208 welcomeMessage.setText(IAA_WELCOME_MESSAGE); 209 welcomeMessage.setLineWrap(true); 210 welcomeMessage.setWrapStyleWord(true); 211 Font font = welcomeMessage.getFont(); 212 Font newFont = font.deriveFont((float) (font.getSize() + 4)); 213 welcomeMessage.setFont(newFont); 214 welcomeFrame.contentPane.add(welcomeMessage, BorderLayout.CENTER); 215 } 216 217 private void createOutputFrame() { 218 outputFrame = new WizardFrame(parent, "Select IAA output directory"); 219 outputFrame.setAlwaysOnTop(false); 220 outputFrame.previousButton.setActionCommand(TO_WELCOME_FRAME); 221 outputFrame.previousButton.addActionListener(this); 222 outputFrame.nextButton.setActionCommand(TO_FILTER_FRAME); 223 outputFrame.nextButton.addActionListener(this); 224 outputFrame.cancelButton.addActionListener(this); 225 226 outputDirectoryLabel = new JLabel("Output directory"); 227 228 outputDirectoryField = new JTextField(); 229 outputDirectoryField.addCaretListener(this); 230 231 outputDirectoryButton = new JButton(ComponentUtilities.loadImageIcon(IAAWizard.class, 232 "/edu/uchsc/ccp/knowtator/images/Open24.gif")); 233 outputDirectoryButton.setToolTipText("Browse for output directory using file chooser."); 234 outputDirectoryButton.addActionListener(this); 235 236 outputDirectoryWarningLabel = new JLabel(); 237 outputDirectoryWarningLabel.setForeground(Color.BLUE); 238 239 outputFrame.contentPane.setLayout(new GridBagLayout()); 240 outputFrame.contentPane.add(outputDirectoryLabel, new GridBagConstraints(0, 0, 1, 1, 0d, 0d, 241 GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(3, 3, 3, 3), 2, 2)); 242 outputFrame.contentPane.add(outputDirectoryField, new GridBagConstraints(1, 0, 1, 1, 1.0d, 0d, 243 GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(3, 3, 3, 3), 2, 2)); 244 outputFrame.contentPane.add(outputDirectoryButton, new GridBagConstraints(2, 0, 1, 1, 0d, 0d, 245 GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(3, 3, 3, 3), 2, 2)); 246 outputFrame.contentPane.add(outputDirectoryWarningLabel, new GridBagConstraints(1, 1, 1, 1, 0d, 0d, 247 GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(3, 3, 3, 3), 2, 2)); 248 } 249 250 private void createFilterFrame() { 251 filterFrame = new WizardFrame(parent, "Select annotation filter that specifies which annotations to compare."); 252 filterFrame.setAlwaysOnTop(false); 253 filterFrame.previousButton.setActionCommand(TO_OUTPUT_FRAME); 254 filterFrame.previousButton.addActionListener(this); 255 filterFrame.nextButton.setActionCommand(TO_TEXTSOURCES_FRAME); 256 filterFrame.nextButton.addActionListener(this); 257 filterFrame.cancelButton.addActionListener(this); 258 259 filterLabel = new JLabel(); 260 filterButton = new JButton("Choose filter"); 261 filterButton.addActionListener(this); 262 263 filterFrame.contentPane.setLayout(new GridBagLayout()); 264 filterFrame.contentPane.add(filterLabel, new GridBagConstraints(0, 0, 1, 1, 0d, 0d, GridBagConstraints.CENTER, 265 GridBagConstraints.NONE, new Insets(3, 3, 3, 3), 2, 2)); 266 filterFrame.contentPane.add(filterButton, new GridBagConstraints(1, 0, 1, 1, 0d, 0d, GridBagConstraints.CENTER, 267 GridBagConstraints.NONE, new Insets(3, 3, 3, 3), 2, 2)); 268 } 269 270 private void createTextSourcesFrame() { 271 textSourcesFrame = new WizardFrame(parent, "Select text sources to perform IAA on."); 272 textSourcesFrame.setAlwaysOnTop(false); 273 textSourcesFrame.previousButton.setActionCommand(TO_FILTER_FRAME); 274 textSourcesFrame.previousButton.addActionListener(this); 275 textSourcesFrame.nextButton.setActionCommand(TO_CONFIG_FRAME); 276 textSourcesFrame.nextButton.addActionListener(this); 277 textSourcesFrame.cancelButton.addActionListener(this); 278 279 textSourcesLabel = new JLabel("Selected text sources"); 280 textSourcesList = new JList(); 281 textSourcesList.setCellRenderer(new FrameRenderer()); 282 JScrollPane scrollPane = new JScrollPane(textSourcesList); 283 284 textSourcesAddButton = new JButton("Add"); 285 textSourcesAddButton.addActionListener(this); 286 textSourcesRemoveButton = new JButton("Remove"); 287 textSourcesRemoveButton.addActionListener(this); 288 289 textSourcesFrame.contentPane.setLayout(new GridBagLayout()); 290 textSourcesFrame.contentPane.add(textSourcesLabel, new GridBagConstraints(0, 0, 2, 1, 0d, 0d, 291 GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(3, 3, 3, 3), 2, 2)); 292 textSourcesFrame.contentPane.add(scrollPane, new GridBagConstraints(0, 1, 2, 1, 1.0d, 1.0d, 293 GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 2, 2)); 294 textSourcesFrame.contentPane.add(textSourcesAddButton, new GridBagConstraints(0, 2, 1, 1, 0d, 0d, 295 GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(3, 3, 3, 3), 2, 2)); 296 textSourcesFrame.contentPane.add(textSourcesRemoveButton, new GridBagConstraints(1, 2, 1, 1, 0d, 0d, 297 GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(3, 3, 3, 3), 2, 2)); 298 } 299 300 private void createConfigFrame() { 301 configFrame = new WizardFrame(parent, "IAA configuration"); 302 configFrame.setAlwaysOnTop(false); 303 configFrame.previousButton.setActionCommand(TO_TEXTSOURCES_FRAME); 304 configFrame.previousButton.addActionListener(this); 305 configFrame.nextButton.setText("Go!"); 306 configFrame.nextButton.setActionCommand(GO_CLICKED); 307 configFrame.nextButton.addActionListener(this); 308 309 configFrame.cancelButton.addActionListener(this); 310 311 configPanel = new JPanel(new GridBagLayout()); 312 313 classMatcherCheckBox = new JCheckBox("class matcher"); 314 classMatcherCheckBox.setSelected(true); 315 316 spanMatcherCheckBox = new JCheckBox("span matcher"); 317 spanMatcherCheckBox.setSelected(true); 318 319 classAndSpanMatcherCheckBox = new JCheckBox("class and span matcher"); 320 classAndSpanMatcherCheckBox.setSelected(true); 321 322 subclassMatcherCheckBox = new JCheckBox("subclass matcher"); 323 subclassMatcherCheckBox.setSelected(true); 324 325 slotMatcherPanel = new JPanel(new GridBagLayout()); 326 327 addSlotMatcherButton = new JButton("add slot matcher"); 328 addSlotMatcherButton.setActionCommand(ADD_SLOT_MATCHER_CLICKED); 329 addSlotMatcherButton.addActionListener(this); 330 slotMatcherPanel.add(addSlotMatcherButton, new GridBagConstraints(0, 0, 1, 1, 0d, 0d, 331 GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(3, 3, 3, 3), 2, 2)); 332 333 instanceDisplay = new InstanceDisplay(project); 334 if (getRecentDisplayConfig()) 335 showSlotMatcherConfig(); 336 337 configPanel.add(classMatcherCheckBox, new GridBagConstraints(0, 0, 1, 1, 0d, 0d, GridBagConstraints.WEST, 338 GridBagConstraints.NONE, new Insets(3, 3, 3, 3), 2, 2)); 339 configPanel.add(spanMatcherCheckBox, new GridBagConstraints(0, 1, 1, 1, 0d, 0d, GridBagConstraints.WEST, 340 GridBagConstraints.NONE, new Insets(3, 3, 3, 3), 2, 2)); 341 configPanel.add(classAndSpanMatcherCheckBox, new GridBagConstraints(0, 2, 1, 1, 0d, 0d, 342 GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(3, 3, 3, 3), 2, 2)); 343 configPanel.add(subclassMatcherCheckBox, new GridBagConstraints(0, 3, 1, 1, 0d, 0d, GridBagConstraints.WEST, 344 GridBagConstraints.NONE, new Insets(3, 3, 3, 3), 2, 2)); 345 configPanel.add(subclassMatcherCheckBox, new GridBagConstraints(0, 4, 1, 1, 0d, 0d, GridBagConstraints.WEST, 346 GridBagConstraints.NONE, new Insets(3, 3, 3, 3), 2, 2)); 347 configPanel.add(slotMatcherPanel, new GridBagConstraints(0, 5, 1, 1, 1.0d, 1.0d, GridBagConstraints.NORTHWEST, 348 GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 2, 2)); 349 350 JScrollPane configScrollPane = new JScrollPane(configPanel); 351 configFrame.contentPane.setLayout(new BorderLayout()); 352 configFrame.contentPane.add(configScrollPane, BorderLayout.CENTER); 353 354 } 355 356 private void showSlotMatcherConfig() { 357 if (slotMatcherConfig == null) { 358 slotMatcherConfig = getRecentSlotMatcherConfig(); 359 if (slotMatcherConfig == null) { 360 slotMatcherConfig = kb.createSimpleInstance(null, null, CollectionUtilities.createCollection(kb 361 .getCls("knowtator slot matcher config")), true); 362 setRecentSlotMatcherConfig(slotMatcherConfig); 363 } 364 } 365 366 instanceDisplay.setInstance(slotMatcherConfig); 367 368 slotMatcherPanel.add(instanceDisplay, new GridBagConstraints(0, 2, 1, 1, 1.0d, 1.0d, 369 GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 2, 2)); 370 371 addSlotMatcherButton.setActionCommand(REMOVE_SLOT_MATCHER_CLICKED); 372 addSlotMatcherButton.setText("remove slot matcher"); 373 374 slotMatcherPanel.repaint(); 375 376 setRecentDisplayConfig(true); 377 } 378 379 private void hideSlotMatcherConfig() { 380 slotMatcherPanel.remove(instanceDisplay); 381 382 addSlotMatcherButton.setActionCommand(ADD_SLOT_MATCHER_CLICKED); 383 addSlotMatcherButton.setText("add slot matcher"); 384 385 slotMatcherPanel.repaint(); 386 setRecentDisplayConfig(false); 387 388 } 389 390 private SimpleInstance getRecentSlotMatcherConfig() { 391 SimpleInstance recentSlotMatcherConfig = (SimpleInstance) project.getClientInformation(IAA_CONFIG); 392 return recentSlotMatcherConfig; 393 } 394 395 private void setRecentSlotMatcherConfig(SimpleInstance slotMatcherConfig) { 396 project.setClientInformation(IAA_CONFIG, slotMatcherConfig); 397 } 398 399 private boolean getRecentDisplayConfig() { 400 Boolean recentDisplayConfig = (Boolean) project.getClientInformation(IAA_CONFIG_DISPLAY); 401 if (recentDisplayConfig != null) 402 return recentDisplayConfig.booleanValue(); 403 else 404 return false; 405 } 406 407 private void setRecentDisplayConfig(boolean displayed) { 408 project.setClientInformation(IAA_CONFIG_DISPLAY, new Boolean(displayed)); 409 } 410 411 private void setOutputDirectory(File directory, boolean updateOutputDirectoryField) { 412 if (directory != null && directory.exists() && directory.isDirectory()) { 413 outputDirectory = directory; 414 setRecentIAADirectory(outputDirectory); 415 outputDirectoryWarningLabel.setText(""); 416 if (updateOutputDirectoryField) { 417 outputDirectoryField.setText(outputDirectory.getPath()); 418 } 419 } else { 420 outputDirectoryWarningLabel.setText("Output directory is not valid."); 421 } 422 } 423 424 private void chooseOutputDirectory() { 425 JFileChooser chooser = new JFileChooser(); 426 chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 427 428 File chooserDirectory = null; 429 File userEnteredDirectory = new File(outputDirectoryField.getText()); 430 if (userEnteredDirectory.exists()) { 431 if (userEnteredDirectory.isDirectory()) 432 chooserDirectory = userEnteredDirectory; 433 else 434 chooserDirectory = userEnteredDirectory.getParentFile(); 435 } else { 436 File recentDirectory = getRecentIAADirectory(); 437 if (recentDirectory != null && recentDirectory.exists() && recentDirectory.isDirectory()) { 438 chooserDirectory = recentDirectory; 439 } 440 } 441 if (chooserDirectory != null) { 442 chooser.setCurrentDirectory(chooserDirectory); 443 } 444 445 int returnVal = chooser.showOpenDialog(outputFrame); 446 if (returnVal == JFileChooser.APPROVE_OPTION) { 447 setOutputDirectory(chooser.getSelectedFile(), true); 448 } 449 } 450 451 private File getRecentIAADirectory() { 452 String path = (String) project.getClientInformation(IAA_DIRECTORY); 453 if (path == null) 454 return null; 455 File projectDirectory = new File(path); 456 if (projectDirectory.exists()) { 457 if (projectDirectory.isDirectory()) { 458 return projectDirectory; 459 } else { 460 return projectDirectory.getParentFile(); 461 } 462 } 463 return null; 464 } 465 466 private void setRecentIAADirectory(File iaaDirectory) { 467 project.setClientInformation(IAA_DIRECTORY, iaaDirectory.getPath()); 468 } 469 470 private void setIAAFilter(SimpleInstance setFilter) { 471 if (setFilter != null) { 472 Set<SimpleInstance> annotators = new HashSet<SimpleInstance>(FilterUtil.getAnnotators(setFilter)); 473 Set<SimpleInstance> sets = FilterUtil.getSets(setFilter); 474 if (annotators.size() >= 2 || sets.size() >= 2) { 475 filter = setFilter; 476 filterLabel.setText("Selected filter is '" + filter.getBrowserText() + "'"); 477 setRecentIAAFilter(filter); 478 return; 479 } 480 } 481 filterLabel.setText("No filter selected."); 482 } 483 484 private void chooseIAAFilter() { 485 SimpleInstance chosenFilter = (SimpleInstance) DisplayUtilities.pickInstance(filterFrame, CollectionUtilities 486 .createCollection(kpu.getFilterCls()), "Select annotation filter"); 487 488 if (chosenFilter == null) 489 return; 490 Set<SimpleInstance> annotators = new HashSet<SimpleInstance>(FilterUtil.getAnnotators(chosenFilter)); 491 Set<SimpleInstance> sets = FilterUtil.getSets(chosenFilter); 492 if (annotators.size() < 2 && sets.size() < 2) { 493 JOptionPane.showMessageDialog(filterFrame, 494 "The selected filter must have either two annotators or two annotation sets specified.", 495 "Incomplete annotation filter", JOptionPane.ERROR_MESSAGE); 496 return; 497 } 498 setIAAFilter(chosenFilter); 499 } 500 501 private SimpleInstance getRecentIAAFilter() { 502 SimpleInstance filter = (SimpleInstance) project.getClientInformation(IAA_FILTER); 503 return filter; 504 } 505 506 private void setRecentIAAFilter(SimpleInstance filter) { 507 project.setClientInformation(IAA_FILTER, filter); 508 } 509 510 private Collection<SimpleInstance> getRecentTextSources() { 511 Collection<SimpleInstance> recentTextSources = (Collection<SimpleInstance>) project 512 .getClientInformation(IAA_TEXTSOURCES); 513 return recentTextSources; 514 } 515 516 private void setRecentTextSources(Set<SimpleInstance> textSources) { 517 project.setClientInformation(IAA_TEXTSOURCES, textSources); 518 } 519 520 private void addTextSources(Collection<SimpleInstance> addedTextSources) { 521 if (addedTextSources != null && addedTextSources.size() > 0) { 522 textSources.addAll(addedTextSources); 523 textSourcesList.setListData(textSources.toArray()); 524 setRecentTextSources(textSources); 525 } 526 } 527 528 private void chooseTextSources() { 529 Collection<SimpleInstance> textSources = (Collection<SimpleInstance>) DisplayUtilities.pickInstances( 530 textSourcesFrame, project.getKnowledgeBase(), CollectionUtilities.createCollection(kpu 531 .getTextSourceCls()), "Select text sources"); 532 addTextSources(textSources); 533 } 534 535 private void removeTextSources() { 536 Object[] selectedValues = textSourcesList.getSelectedValues(); 537 for (Object selectedValue : selectedValues) { 538 textSources.remove(selectedValue); 539 } 540 textSourcesList.setListData(textSources.toArray()); 541 } 542 543 public void actionPerformed(ActionEvent actionEvent) { 544 String command = actionEvent.getActionCommand(); 545 Object source = actionEvent.getSource(); 546 if (command.equals(TO_WELCOME_FRAME)) { 547 showFrame(welcomeFrame); 548 } else if (command.equals(TO_OUTPUT_FRAME)) { 549 showFrame(outputFrame); 550 } else if (command.equals(TO_FILTER_FRAME)) { 551 showFrame(filterFrame); 552 } else if (command.equals(TO_TEXTSOURCES_FRAME)) { 553 showFrame(textSourcesFrame); 554 } else if (command.equals(TO_CONFIG_FRAME)) { 555 showFrame(configFrame); 556 } 557 558 else if (command.equals("CANCEL")) { 559 setVisible(false); 560 } else if (source == outputDirectoryButton) { 561 chooseOutputDirectory(); 562 } else if (source == filterButton) { 563 chooseIAAFilter(); 564 } else if (source == textSourcesAddButton) { 565 chooseTextSources(); 566 } else if (source == textSourcesRemoveButton) { 567 removeTextSources(); 568 } else if (command.equals(GO_CLICKED)) { 569 goClicked = true; 570 setVisible(false); 571 } else if (command.equals(ADD_SLOT_MATCHER_CLICKED)) { 572 showSlotMatcherConfig(); 573 } else if (command.equals(REMOVE_SLOT_MATCHER_CLICKED)) { 574 hideSlotMatcherConfig(); 575 } 576 } 577 578 public void setVisible(boolean visible) { 579 if (visible) { 580 goClicked = false; 581 showFrame(welcomeFrame); 582 } else { 583 welcomeFrame.setVisible(false); 584 outputFrame.setVisible(false); 585 filterFrame.setVisible(false); 586 textSourcesFrame.setVisible(false); 587 configFrame.setVisible(false); 588 } 589 } 590 591 public void showFrame(WizardFrame wizardFrame) { 592 if (visibleFrame != null) { 593 wizardSize = visibleFrame.getSize(); 594 wizardLocation = visibleFrame.getLocation(); 595 wizardFrame.setSize(wizardSize); 596 wizardFrame.setLocation(wizardLocation); 597 } 598 visibleFrame = wizardFrame; 599 setVisible(false); 600 visibleFrame.setVisible(true); 601 } 602 603 public void caretUpdate(CaretEvent caretEvent) { 604 Object source = caretEvent.getSource(); 605 if (source == outputDirectoryField) { 606 String directoryString = outputDirectoryField.getText(); 607 File outputFile = new File(directoryString); 608 setOutputDirectory(outputFile, false); 609 } 610 } 611 612 public boolean isGoClicked() { 613 return goClicked; 614 } 615 616 public File getOutputDirectory() { 617 return outputDirectory; 618 } 619 620 public SimpleInstance getFilter() { 621 return filter; 622 } 623 624 public Set<SimpleInstance> getTextSources() { 625 return textSources; 626 } 627 628 public boolean isClassMatcherSelected() { 629 return classMatcherCheckBox.isSelected(); 630 } 631 632 public boolean isSpanMatcherSelected() { 633 return spanMatcherCheckBox.isSelected(); 634 } 635 636 public boolean isClassAndSpanMatcherSelected() { 637 return classAndSpanMatcherCheckBox.isSelected(); 638 } 639 640 public boolean isSubclassMatcherSelected() { 641 return subclassMatcherCheckBox.isSelected(); 642 } 643 644 public SimpleInstance getSlotMatcherConfig() { 645 return slotMatcherConfig; 646 } 647 } 648 649 // private static List<Slot> askForSlots(SimpleInstance filter, Project project, 650 // Component parent) 651 // { 652 // List<Slot> slots = new ArrayList<Slot>(); 653 // Set<Cls> clses = new HashSet<Cls>(); 654 // Set<Cls> filterTypes = FilterUtil.getTypes(filter); 655 // if(filterTypes.size() > 0) 656 // { 657 // clses.addAll(filterTypes); 658 // for(Cls filterType : filterTypes) 659 // { 660 // clses.addAll(filterType.getSubclasses()); 661 // } 662 // } 663 // else 664 // { 665 // Cls rootCls = ProjectSettings.getRootCls(project); 666 // if(rootCls != null) 667 // { 668 // clses.add(rootCls); 669 // clses.addAll(rootCls.getSubclasses()); 670 // } 671 // } 672 // for(Cls cls : clses) 673 // { 674 // Collection<Slot> clsSlots = (Collection<Slot>) cls.getTemplateSlots(); 675 // for(Slot clsSlot : clsSlots) 676 // { 677 // ValueType slotType = clsSlot.getValueType(); 678 // if(slotType == ValueType.BOOLEAN || 679 // slotType == ValueType.FLOAT || 680 // slotType == ValueType.INTEGER || 681 // slotType == ValueType.STRING || 682 // slotType == ValueType.SYMBOL) 683 // { 684 // slots.add(clsSlot); 685 // } 686 // } 687 // } 688 // if(slots.size() > 0) 689 // { 690 // Collection<Slot> selectedSlots = (Collection<Slot>) 691 // DisplayUtilities.pickSlots(parent, slots, 692 // "Select slots that you want matched."); 693 // slots.clear(); 694 // slots.addAll(selectedSlots); 695 // } 696 // return slots; 697 // } 698