package edu.harvard.wcfia.yoshikoder.ui;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.Iterator;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import edu.harvard.wcfia.yoshikoder.Yoshikoder;
import edu.harvard.wcfia.yoshikoder.document.tokenizer.DuplicatePluginException;
import edu.harvard.wcfia.yoshikoder.document.tokenizer.PluginException;
import edu.harvard.wcfia.yoshikoder.document.tokenizer.TM;
import edu.harvard.wcfia.yoshikoder.document.tokenizer.TokenizationService;
import edu.harvard.wcfia.yoshikoder.util.DialogUtil;
import edu.harvard.wcfia.yoshikoder.util.Messages;
import edu.harvard.wcfia.yoshikoder.util.TaskWorker;
public class TokenizerPluginsPanel extends CommitableJPanel{
private static Logger log =
Logger.getLogger("edu.harvard.wcfia.yoshikoder.ui.TokenizerPluginsPanel");
protected Yoshikoder yoshikoder;
protected JList list;
protected DefaultListModel listModel;
protected JButton add, remove;
protected FileDialog chooser;
public TokenizerPluginsPanel(Yoshikoder yk){
super(new BorderLayout());
yoshikoder = yk;
chooser = new FileDialog(yoshikoder, Messages.getString("open"), FileDialog.LOAD);
chooser.setFilenameFilter(DialogUtil.jarFilenameFilter);
makeGUI();
}
protected void makeButtons(){
remove = new JButton(Messages.getString("remove"));
remove.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){ remove(); }
});
add = new JButton(Messages.getString("add"));
add.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){ add(); }
});
int width = Math.max( add.getPreferredSize().width,
remove.getPreferredSize().width);
add.setPreferredSize(new Dimension(width, add.getPreferredSize().height));
remove.setPreferredSize(new Dimension(width, remove.getPreferredSize().height));
}
protected void makeGUI(){
makeButtons();
listModel = new DefaultListModel();
Set pluginmd =
TokenizationService.getTokenizationService().getTokenizerPluginMetadata();
for (Iterator iter = pluginmd.iterator(); iter.hasNext();) {
TM tm = (TM)iter.next();
listModel.addElement(tm);
}
list = new JList(listModel){
public String getToolTipText(MouseEvent evt) {
int index = locationToIndex(evt.getPoint());
TM item = (TM)getModel().getElementAt(index);
StringBuffer sb = new StringBuffer();
sb.append("<html>");
sb.append(item.description);
sb.append("<br>");
sb.append("Suitable for locales:<br>");
for (int ii=0; ii<item.supportedLocales.length; ii++)
sb.append("* " + item.supportedLocales[ii].getDisplayName() + "<br>");
sb.append("</html>");
return sb.toString();
}};
list.setBorder(BorderFactory.createEmptyBorder(0,0,0,5));
if (listModel.size() > 0){
list.setSelectedIndex(0);
}
JPanel bpanel = new JPanel(new BorderLayout());
Box bbox = Box.createVerticalBox();
bbox.add(Box.createVerticalGlue());
bbox.add(add);
bbox.add(Box.createVerticalStrut(5));
bbox.add(remove);
bbox.add(Box.createVerticalGlue());
bpanel.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
bpanel.add(bbox, BorderLayout.NORTH);
JPanel ppanel = new JPanel(new BorderLayout());
ppanel.add(bpanel, BorderLayout.EAST);
JScrollPane sp = new JScrollPane(list);
sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
ppanel.add(sp, BorderLayout.CENTER);
add(ppanel, BorderLayout.CENTER);
setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
}
protected void add(){
chooser.show();
String fname = chooser.getFile();
if (fname == null) return;
final File f = new File(chooser.getDirectory(), fname);
TaskWorker tworker = new TaskWorker(yoshikoder){
TM tmd;
protected void doWork() throws Exception {
tmd =
TokenizationService.getTokenizationService().addTokenizerPlugin(f);
log.info(tmd.name + "/" + tmd.description + "/" + tmd.classname + "/" + tmd.location);
}
protected void onError(){
if (e instanceof DuplicatePluginException){
int resp = DialogUtil.askYesNo(yoshikoder,
"Replace existing plugin with this name?",
"Replace Tokenizer Plugin");
if (resp == JOptionPane.YES_OPTION){
// replace on the dispatch thread - not ideal
try {
TM tm =
TokenizationService.getTokenizationService().replaceTokenizerPlugin(tmd,f);
listModel.removeElement(tmd);
listModel.addElement(tm);
list.setSelectedValue(tm, true);
return;
} catch (PluginException ple){
log.log(Level.WARNING, "Failed to replace tokenizer", ple);
}
} else {
// just leave things as they are
return;
}
}
String mess =
Messages.getString("TokenizerPluginsPanel.metadataExtractionFailure");
DialogUtil.yelp(yoshikoder, mess, new PluginException(mess));
}
protected void onSuccess() {
listModel.addElement(tmd);
list.setSelectedValue(tmd, true);
}
};
tworker.start();
}
protected void remove(){
final int index = list.getSelectedIndex();
if (index == -1) return; // nothing selected
TaskWorker tworker = new TaskWorker(yoshikoder){
TM tmd = null;
protected void doWork() throws Exception {
tmd = (TM)listModel.get(index);
TokenizationService.getTokenizationService().removeTokenizerPlugin(tmd);
}
protected void onError() {
String mess = Messages.getString("TokenizerPluginsPanel.removeFailure");
DialogUtil.yelp(yoshikoder, mess, new PluginException(mess));
}
protected void onSuccess() {
listModel.remove(index);
}
};
tworker.start();
}
public void commit() throws CommitException {
//
}
}