package net.sf.jabref.external;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import net.sf.jabref.GUIGlobals;
import net.sf.jabref.Globals;
import net.sf.jabref.gui.FileDialogs;
import com.jgoodies.forms.builder.ButtonBarBuilder;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;
/**
* This class produces a dialog box for editing an external file type.
*/
public class ExternalFileTypeEntryEditor {
JFrame fParent = null;
JDialog dParent = null;
JDialog diag;
JTextField extension = new JTextField(),
name = new JTextField(),
mimeType = new JTextField(),
application = new JTextField();
String selectedIcon = null;
JButton icon = new JButton(GUIGlobals.getImage("picture"));
JButton ok = new JButton(Globals.lang("Ok")),
cancel = new JButton(Globals.lang("Cancel"));
JRadioButton useDefault = new JRadioButton(Globals.lang("Default")),
other = new JRadioButton("");
final String emptyMessage = "<"+Globals.lang("Use default viewer")+">";
boolean applicationFieldEmpty = false;
private ExternalFileType entry;
private boolean okPressed = false;
public ExternalFileTypeEntryEditor(JFrame parent, ExternalFileType entry) {
fParent = parent;
init(entry);
}
public ExternalFileTypeEntryEditor(JDialog parent, ExternalFileType entry) {
dParent = parent;
init(entry);
}
private void init(ExternalFileType entry) {
this.entry = entry;
icon.setText(null);
ButtonGroup bg = new ButtonGroup();
bg.add(useDefault);
bg.add(other);
DefaultFormBuilder builder = new DefaultFormBuilder(new FormLayout
("left:pref, 4dlu, fill:150dlu, 4dlu, fill:pref", ""));
builder.append(Globals.lang("Icon"));
builder.append(icon);
builder.nextLine();
builder.append(Globals.lang("Name"));
builder.append(name);
builder.nextLine();
builder.append(Globals.lang("Extension"));
builder.append(extension);
builder.nextLine();
builder.append(Globals.lang("MIME type"));
builder.append(mimeType);
builder.getPanel().setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
builder.nextLine();
builder.append(Globals.lang("Application"));
JButton browseBut = new JButton(Globals.lang("Browse"));
if (Globals.ON_WIN) {
builder.append(useDefault);
builder.nextLine();
JPanel p1 = new JPanel();
builder.append(p1);
JPanel p2 = new JPanel();
application.setPreferredSize(new Dimension(300, application.getPreferredSize().height));
BorderLayout bl = new BorderLayout();
bl.setHgap(4);
p2.setLayout(bl);
p2.add(other, BorderLayout.WEST);
p2.add(application, BorderLayout.CENTER);
builder.append(p2);
builder.append(browseBut);
} else {
builder.append(application);
builder.append(browseBut);
}
ButtonBarBuilder bb = new ButtonBarBuilder();
bb.addGlue();
bb.addGridded(ok);
bb.addGridded(cancel);
bb.addGlue();
ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
okPressed = true;
storeSettings(ExternalFileTypeEntryEditor.this.entry);
diag.dispose();
}
});
cancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
diag.dispose();
}
});
icon.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
String initSel = ExternalFileTypeEntryEditor.this.entry.getIconName();
if (selectedIcon != null)
initSel = selectedIcon;
IconSelection ic = new IconSelection(diag, initSel);
ic.setVisible(true);
if (ic.isOkPressed()) {
selectedIcon = ic.getSelectedIconKey();
icon.setIcon(GUIGlobals.getImage(selectedIcon));
}
//JOptionPane.showMessageDialog(null, "Sorry, the icon can unfortunately not be changed in this version of JabRef");
}
});
if (Globals.ON_WIN) {
application.getDocument().addDocumentListener(new DocumentListener() {
private void handle(DocumentEvent e) {
if (application.getText().length() == 0) {
useDefault.setSelected(true);
} else {
other.setSelected(true);
}
}
public void insertUpdate(DocumentEvent e) {
handle(e);
}
public void removeUpdate(DocumentEvent documentEvent) {
handle(documentEvent);
}
public void changedUpdate(DocumentEvent documentEvent) {
handle(documentEvent);
}
});
}
if (dParent != null)
diag = new JDialog(dParent, Globals.lang("Edit file type"), true);
else
diag = new JDialog(fParent, Globals.lang("Edit file type"), true);
diag.getContentPane().add(builder.getPanel(), BorderLayout.CENTER);
diag.getContentPane().add(bb.getPanel(), BorderLayout.SOUTH);
diag.pack();
BrowseListener browse = new BrowseListener(diag, application);
browseBut.addActionListener(browse);
if (dParent != null)
diag.setLocationRelativeTo(dParent);
else
diag.setLocationRelativeTo(fParent);
//Util.placeDialog(diag, parent);
setValues(entry);
}
public void setEntry(ExternalFileType entry) {
this.entry = entry;
setValues(entry);
}
public void setVisible(boolean visible) {
if (visible)
okPressed = false;
diag.setVisible(visible);
}
public void setValues(ExternalFileType entry) {
name.setText(entry.getName());
extension.setText(entry.getExtension());
mimeType.setText(entry.getMimeType());
application.setText(entry.getOpenWith());
icon.setIcon(entry.getIcon());
if (true && (application.getText().length() == 0))
useDefault.setSelected(true);
else
other.setSelected(true);
selectedIcon = null;
}
public void storeSettings(ExternalFileType entry) {
entry.setName(name.getText().trim());
entry.setMimeType(mimeType.getText().trim());
// Set extension, but remove initial dot if user has added that:
String ext = extension.getText().trim();
if ((ext.length() > 0) && (ext.charAt(0) == '.'))
entry.setExtension(ext.substring(1));
else
entry.setExtension(ext);
if (selectedIcon != null)
entry.setIconName(selectedIcon);
if (!Globals.ON_WIN) {
entry.setOpenWith(application.getText().trim());
} else {
// On Windows, store application as empty if the "Default" option is selected,
// or if the application name is empty:
if (useDefault.isSelected() || (application.getText().trim().length() == 0))
entry.setOpenWith("");
else
entry.setOpenWith(application.getText().trim());
}
}
public boolean okPressed() {
return okPressed;
}
class BrowseListener implements ActionListener {
private JTextField comp;
public BrowseListener(JDialog parent, JTextField comp) {
this.comp = comp;
}
public void actionPerformed(ActionEvent e) {
File initial = new File(comp.getText().trim());
if (comp.getText().trim().length() == 0) {
// Nothing in the field. Go to the last file dir used:
initial = new File(Globals.prefs.get("fileWorkingDirectory"));
}
String chosen = FileDialogs.getNewFile(/*parent*/null, initial, Globals.NONE,
JFileChooser.OPEN_DIALOG, false);
if (chosen != null) {
File newFile = new File(chosen);
// Store the directory for next time:
Globals.prefs.put("fileWorkingDirectory", newFile.getParent());
comp.setText(newFile.getPath());
comp.requestFocus();
}
}
}
}