package edu.cmu.minorthird.text.gui; import java.awt.event.ActionEvent; import java.io.File; import java.io.IOException; import javax.swing.AbstractAction; import javax.swing.JComboBox; import edu.cmu.minorthird.text.FancyLoader; import edu.cmu.minorthird.text.MutableTextLabels; import edu.cmu.minorthird.text.SampleTextBases; import edu.cmu.minorthird.text.TextBase; import edu.cmu.minorthird.text.TextLabels; import edu.cmu.minorthird.text.TextLabelsLoader; /** * Interactively edit the contents of a TextBase and MutableTextLabels. * * @author William Cohen */ public class TextBaseEditor extends TrackedTextBaseComponent{ static final long serialVersionUID=200803014L; private SpanEditor spanEditor; public SpanEditor getSpanEditor(){ return spanEditor; } protected TextBaseEditor(String[] args){ super(); log.debug("construct"); try{ setLabels(args); }catch(IOException e){ log.fatal(e,e); } } public TextBaseEditor(TextBase base,TextLabels viewLabels, // seen in viewer MutableTextLabels editLabels, // changed in editor StatusMessage statusMsg,boolean readOnly){ // super(base, viewLabels, editLabels, statusMsg); init(base,viewLabels,statusMsg,editLabels,readOnly); } private void init(TextBase base,TextLabels viewLabels, StatusMessage statusMsg,MutableTextLabels editLabels,boolean readOnly){ super.init(base,viewLabels,editLabels,statusMsg); viewer=new TextBaseViewer(base,viewLabels,statusMsg); createSpanEditor(viewLabels,editLabels,statusMsg); spanEditor=(SpanEditor)viewerTracker; viewer.getTruthBox() .addActionListener( new EditTypeAction(viewer.getGuessBox(),viewer.getTruthBox(), spanEditor)); viewer.getGuessBox() .addActionListener( new EditTypeAction(viewer.getGuessBox(),viewer.getTruthBox(), spanEditor)); viewer.getDocumentList().addListSelectionListener(spanEditor); spanEditor.setReadOnly(readOnly); initializeLayout(); } protected void createSpanEditor(TextLabels viewLabels, MutableTextLabels editLabels,StatusMessage statusMsg){ viewerTracker= new SpanEditor(viewLabels,editLabels,viewer.getDocumentList(),viewer .getSpanPainter(),statusMsg); } /** Change the type of span being edited. */ public static class EditTypeAction extends AbstractAction{ static final long serialVersionUID=200803014L; private JComboBox guessBox,truthBox; private SpanEditor spanEditor; public EditTypeAction(JComboBox guessBox,JComboBox truthBox, SpanEditor spanEditor){ this.guessBox=guessBox; this.truthBox=truthBox; this.spanEditor=spanEditor; } @Override public void actionPerformed(ActionEvent event){ String truthType=(String)truthBox.getSelectedItem(); String guessType=(String)guessBox.getSelectedItem(); if(!TextBaseViewer.NULL_TRUTH_ENTRY.equals(truthType)) spanEditor.setTypesBeingEdited(guessType,truthType); else spanEditor.setTypesBeingEdited(guessType,guessType); } } /** Pop up a frame for editing the labels. */ public static TextBaseEditor edit(MutableTextLabels labels,File file){ TextBase base=labels.getTextBase(); StatusMessage statusMsg=new StatusMessage(); TextBaseEditor editor= new TextBaseEditor(base,labels,labels,statusMsg,false); if(file!=null) editor.setSaveAs(file); editor.initializeLayout(); editor.buildFrame(); return editor; } private void setLabels(String[] args) throws IOException{ boolean readOnly=checkReadOnly(args); TextBase base=null; MutableTextLabels labels=null; File saveFile=null; if(args.length==0){ base=SampleTextBases.getTextBase(); labels=SampleTextBases.getTruthLabels(); log.info("Sample Text Bases"); // labels = edu.cmu.minorthird.text.ann.TestExtractionProblem.getLabels(); // base = labels.getTextBase(); }else{ log.debug("load from "+args[0]); labels=(MutableTextLabels)FancyLoader.loadTextLabels(args[0]); base=labels.getTextBase(); if(args.length>1){ saveFile=new File(args[1]); if(saveFile.exists()) labels=new TextLabelsLoader().loadOps(base,saveFile); log.info("load text bases"); } } init(base,labels,new StatusMessage(),labels,readOnly); this.setSaveAs(saveFile); } private static boolean checkReadOnly(String[] args){ boolean readOnly=false; // int argp = 0; for(int argp=0;argp<args.length;argp++){ if("-readOnly".equals(args[argp])){ readOnly=true; argp++; } } return readOnly; } /** * Entry point that runs a gui to examine labels and change them. * * @param args * first argument is data file and second is save file */ public static void main(String[] args){ if(args.length!=2){ System.out.println("Usage: TextBaseEditor <data> <labelfile>"); return; } try{ MutableTextLabels labels= (MutableTextLabels)FancyLoader.loadTextLabels(args[0]); File saveFile=new File(args[1]); TextBaseEditor.edit(labels,saveFile); }catch(Exception e){ e.printStackTrace(); } } }