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;
import edu.cmu.minorthird.text.learn.OnlineTextClassifierLearner;
/** Interactively edit the contents of a TextBase and MutableTextLabels.
*
* @author William Cohen
*/
public class OnlineLearnerEditor extends TrackedTextBaseComponent{
static final long serialVersionUID=200803014L;
private OnlineClassifierDocumentEditor ocdEditor;
public OnlineClassifierDocumentEditor getOnlineClassifierDocumentEditor(){
return ocdEditor;
}
protected OnlineLearnerEditor(String[] args){
super();
log.debug("construct");
try{
setLabels(args);
}catch(IOException e){
log.fatal(e,e);
}
}
public OnlineLearnerEditor(TextBase base,
TextLabels viewLabels, // seen in viewer
MutableTextLabels editLabels, // changed in editor
String key,StatusMessage statusMsg,boolean readOnly,
OnlineTextClassifierLearner learner){
// super(base, viewLabels, editLabels, statusMsg);
init(base,viewLabels,statusMsg,editLabels,key,readOnly,learner);
}
private void init(TextBase base,TextLabels viewLabels,
StatusMessage statusMsg,MutableTextLabels editLabels,String key,
boolean readOnly,OnlineTextClassifierLearner learner){
super.init(base,viewLabels,editLabels,statusMsg);
viewer=new TextBaseViewer(base,viewLabels,statusMsg);
createOnlineClassifierDocumentEditor(viewLabels,viewer,editLabels,
statusMsg,learner);
ocdEditor=(OnlineClassifierDocumentEditor)viewerTracker;
File saveLabels=new File(key+".labels");
ocdEditor.setSaveAs(saveLabels);
viewer.getTruthBox()
.addActionListener(
new EditTypeAction(viewer.getGuessBox(),viewer.getTruthBox(),
ocdEditor));
viewer.getGuessBox()
.addActionListener(
new EditTypeAction(viewer.getGuessBox(),viewer.getTruthBox(),
ocdEditor));
viewer.getDocumentList().addListSelectionListener(ocdEditor);
ocdEditor.setReadOnly(readOnly);
initializeLayout();
}
protected void createOnlineClassifierDocumentEditor(TextLabels viewLabels,
TextBaseViewer viewer,MutableTextLabels editLabels,
StatusMessage statusMsg,OnlineTextClassifierLearner learner){
viewerTracker=
new OnlineClassifierDocumentEditor(learner,viewLabels,viewer,
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 OnlineClassifierDocumentEditor ocdEditor;
public EditTypeAction(JComboBox guessBox,JComboBox truthBox,
OnlineClassifierDocumentEditor ocdEditor){
this.guessBox=guessBox;
this.truthBox=truthBox;
this.ocdEditor=ocdEditor;
}
@Override
public void actionPerformed(ActionEvent event){
String truthType=(String)truthBox.getSelectedItem();
String guessType=(String)guessBox.getSelectedItem();
if(!TextBaseViewer.NULL_TRUTH_ENTRY.equals(truthType))
ocdEditor.setTypesBeingEdited(guessType,truthType);
else
ocdEditor.setTypesBeingEdited(guessType,guessType);
}
}
/** Pop up a frame for editing the labels. */
public static OnlineLearnerEditor edit(TextLabels labels,
MutableTextLabels editLabels,String rk,OnlineTextClassifierLearner learner){
TextBase textBase=labels.getTextBase();
StatusMessage statusMsg=new StatusMessage();
OnlineLearnerEditor editor=
new OnlineLearnerEditor(textBase,labels,editLabels,rk,statusMsg,false,
learner);
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,"default",readOnly,null);
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 labels file and second is save file
**/
public static void main(String[] args){
try{
MutableTextLabels labels=
(MutableTextLabels)FancyLoader.loadTextLabels(args[0]);
File saveFile=new File(args[1]);
TextBaseEditor.edit(labels,saveFile);
}catch(Exception e){
System.out.println("usage repositoryKey outputFile");
}
}
}