package edu.cmu.minorthird.text.gui;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListCellRenderer;
import javax.swing.text.SimpleAttributeSet;
import edu.cmu.minorthird.text.FancyLoader;
import edu.cmu.minorthird.text.Span;
import edu.cmu.minorthird.text.SpanDifference;
import edu.cmu.minorthird.text.TextLabels;
import edu.cmu.minorthird.text.TextLabelsLoader;
import edu.cmu.minorthird.util.gui.ComponentViewer;
import edu.cmu.minorthird.util.gui.Controllable;
import edu.cmu.minorthird.util.gui.ControlledViewer;
import edu.cmu.minorthird.util.gui.Viewer;
import edu.cmu.minorthird.util.gui.ViewerControls;
import edu.cmu.minorthird.util.gui.ViewerFrame;
/**
* View the contents of a bunch of spans, using the util.gui.Viewer framework.
*
* <p>
* Hopefully this will evolve into a cleaner version of the TextBaseViewer,
* TextBaseEditor, etc suite. It replaces an earlier attempt, the
* SpanLooperViewer.
*
* @author William Cohen
*/
public class TextLabelsViewer extends ComponentViewer implements Controllable{
static final long serialVersionUID=200803014L;
static SimpleAttributeSet[] colorByStatus=
new SimpleAttributeSet[SpanDifference.MAX_STATUS+1];
static{
colorByStatus[SpanDifference.FALSE_POS]=HiliteColors.red;
colorByStatus[SpanDifference.FALSE_NEG]=HiliteColors.blue;
colorByStatus[SpanDifference.TRUE_POS]=HiliteColors.green;
colorByStatus[SpanDifference.UNKNOWN_POS]=HiliteColors.yellow;
}
private TextLabels labels;
private Span[] spans;
private SpanViewer.TextViewer[] viewers=null;
private Map<String,SpanViewer.TextViewer> viewerForId=new HashMap<String,SpanViewer.TextViewer>();
private JList jlist;
public TextLabelsViewer(TextLabels labels){
super();
this.labels=labels;
setContent(labels);
}
public TextLabels getLabels(){
return labels;
}
@Override
public void applyControls(ViewerControls viewerControls){
MarkupControls controls=(MarkupControls)viewerControls;
if(viewers!=null){
for(int i=0;i<viewers.length;i++){
viewers[i].applyControls(controls);
}
SpanDifference sd=controls.getSpanDifference();
if(sd!=null){
for(SpanDifference.Looper i=sd.differenceIterator();i.hasNext();){
Span s=i.next();
SpanViewer.TextViewer sv=
viewerForId.get(s.getDocumentId());
if(sv==null)
throw new IllegalStateException("can't highlight span "+s);
sv.highlight(s,colorByStatus[i.getStatus()]);
}
}
jlist.repaint(10); // optional argument seems to be necessary
}
}
@Override
public JComponent componentFor(Object o){
final TextLabels labels=(TextLabels)o;
int n=labels.getTextBase().size();
spans=new Span[n];
viewers=new SpanViewer.TextViewer[n];
int j=0;
for(Iterator<Span> i=labels.getTextBase().documentSpanIterator();i
.hasNext();){
spans[j]=i.next();
viewers[j]=new SpanViewer.TextViewer(labels,spans[j]);
viewers[j].setContent(spans[j]);
viewers[j].setSuperView(this);
viewerForId.put(spans[j].getDocumentId(),viewers[j]);
j++;
}
jlist=new JList(spans);
jlist.setCellRenderer(new ListCellRenderer(){
@Override
public Component getListCellRendererComponent(JList el,Object v,
int index,boolean sel,boolean focus){
Color borderColor=sel?Color.blue:Color.black;
viewers[index].setBorder(BorderFactory.createLineBorder(borderColor,2));
return viewers[index];
}
});
monitorSelections(jlist);
// for (int i=0; i<viewers.length; i++)
// System.out.println("viewers["+i+"].superView
// "+viewers[i].getSuperView());
JPanel panel=new JPanel();
panel.setLayout(new GridBagLayout());
JPanel subpanel=new JPanel();
final JTextField fileField=new JTextField(20);
subpanel.add(new JLabel("[ "+n+" documents "+labels.getTypes().size()+
" types ]"));
subpanel.add(new JButton(new AbstractAction("Save as... "){
static final long serialVersionUID=20080314L;
@Override
public void actionPerformed(ActionEvent ev){
try{
new TextLabelsLoader().saveTypesAsOps(labels,new File(fileField
.getText()));
}catch(Exception ex){
System.out.println("Error saving "+ex);
}
}
}));
subpanel.add(fileField);
panel.add(jlist,fillerGBC());
GridBagConstraints gbc=fillerGBC();
gbc.gridy=1;
gbc.weighty=0;
gbc.fill=GridBagConstraints.HORIZONTAL;
panel.add(subpanel,gbc);
return new JScrollPane(panel);
}
// fancy test case
public static void main(String[] argv){
try{
final TextLabels labels=FancyLoader.loadTextLabels(argv[0]);
TextLabelsViewer sv;
sv=new TextLabelsViewer(labels);
MarkupControls mc=new MarkupControls(labels);
Viewer v=new ControlledViewer(sv,mc);
new ViewerFrame("TextLabelsViewer",v);
}catch(Exception e){
e.printStackTrace();
System.out.println("usage: labelKey");
}
}
}