package net.sf.jabref.journals; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.*; import java.io.File; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.*; import javax.swing.*; import javax.swing.table.AbstractTableModel; import net.sf.jabref.GUIGlobals; import net.sf.jabref.Globals; import net.sf.jabref.HelpAction; import net.sf.jabref.JabRefFrame; import net.sf.jabref.gui.FileDialogs; import net.sf.jabref.net.URLDownload; import com.jgoodies.forms.builder.ButtonBarBuilder; import com.jgoodies.forms.builder.ButtonStackBuilder; import com.jgoodies.forms.builder.DefaultFormBuilder; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; /** * Created by IntelliJ IDEA. * User: alver * Date: Sep 19, 2005 * Time: 7:57:29 PM * To browseOld this template use File | Settings | File Templates. */ public class ManageJournalsPanel extends JPanel{ JabRefFrame frame; JTextField personalFile = new JTextField(); AbbreviationsTableModel tableModel = new AbbreviationsTableModel(); JTable userTable; // builtInTable JPanel userPanel = new JPanel(), journalEditPanel, externalFilesPanel = new JPanel(), addExtPan = new JPanel(); JTextField nameTf = new JTextField(), newNameTf = new JTextField(), abbrTf = new JTextField(); List<ExternalFileEntry> externals = new ArrayList<ExternalFileEntry>(); // To hold references to external journal lists. JDialog dialog; JRadioButton newFile = new JRadioButton(Globals.lang("New file")), oldFile = new JRadioButton(Globals.lang("Existing file")); JButton add = new JButton(GUIGlobals.getImage("add")), remove = new JButton(GUIGlobals.getImage("remove")), ok = new JButton(Globals.lang("Ok")), cancel = new JButton(Globals.lang("Cancel")), help = new JButton(Globals.lang("Help")), browseOld = new JButton(Globals.lang("Browse")), browseNew = new JButton(Globals.lang("Browse")), addExt = new JButton(GUIGlobals.getImage("add")); public ManageJournalsPanel(final JabRefFrame frame) { this.frame = frame; personalFile.setEditable(false); ButtonGroup group = new ButtonGroup(); group.add(newFile); group.add(oldFile); addExtPan.setLayout(new BorderLayout()); addExtPan.add(addExt, BorderLayout.EAST); addExtPan.setToolTipText(Globals.lang("Add")); //addExtPan.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.red)); FormLayout layout = new FormLayout ("1dlu, 8dlu, left:pref, 4dlu, fill:200dlu:grow, 4dlu, fill:pref", // 4dlu, left:pref, 4dlu", "pref, 20dlu, 20dlu, fill:200dlu, 4dlu, pref");//150dlu"); DefaultFormBuilder builder = new DefaultFormBuilder(layout); CellConstraints cc = new CellConstraints(); /*JLabel description = new JLabel("<HTML>"+Globals.lang("JabRef can switch journal names between " +"abbreviated and full form. Since it knows only a limited number of journal names, " +"you may need to add your own definitions.")+"</HTML>");*/ builder.addSeparator(Globals.lang("Personal journal list"), cc.xyw(2,1,6)); //builder.add(description, cc.xyw(2,1,6)); builder.add(newFile, cc.xy(3,2)); builder.add(newNameTf, cc.xy(5,2)); builder.add(browseNew, cc.xy(7,2)); builder.add(oldFile, cc.xy(3,3)); builder.add(personalFile, cc.xy(5,3)); //BrowseAction action = new BrowseAction(personalFile, false); //JButton browse = new JButton(Globals.lang("Browse")); //browse.addActionListener(action); builder.add(browseOld, cc.xy(7,3)); userPanel.setLayout(new BorderLayout()); //builtInTable = new JTable(Globals.journalAbbrev.getTableModel()); builder.add(userPanel, cc.xyw(2,4,4)); ButtonStackBuilder butBul = new ButtonStackBuilder(); butBul.addGridded(add); butBul.addGridded(remove); butBul.addGlue(); builder.add(butBul.getPanel(), cc.xy(7,4)); builder.addSeparator(Globals.lang("External files"), cc.xyw(2,6,6)); externalFilesPanel.setLayout(new BorderLayout()); //builder.add(/*new JScrollPane(*/externalFilesPanel/*)*/, cc.xyw(2,8,6)); setLayout(new BorderLayout()); builder.getPanel().setBorder(BorderFactory.createEmptyBorder(5,5,5,5));//createMatteBorder(1,1,1,1,Color.green)); add(builder.getPanel(), BorderLayout.NORTH); add(externalFilesPanel, BorderLayout.CENTER); ButtonBarBuilder bb = new ButtonBarBuilder(); bb.addGlue(); bb.addGridded(ok); bb.addGridded(cancel); bb.addUnrelatedGap(); bb.addGridded(help); bb.addGlue(); bb.getPanel().setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); dialog = new JDialog(frame.getFrame(), Globals.lang("Journal abbreviations"), false); dialog.getContentPane().add(this, BorderLayout.CENTER); dialog.getContentPane().add(bb.getPanel(), BorderLayout.SOUTH); //add(new JScrollPane(builtInTable), BorderLayout.CENTER); // Set up panel for editing a single journal, to be used in a dialog box: FormLayout layout2 = new FormLayout ("right:pref, 4dlu, fill:180dlu", ""); DefaultFormBuilder builder2 = new DefaultFormBuilder(layout2); builder2.append(Globals.lang("Journal name")); builder2.append(nameTf); builder2.nextLine(); builder2.append(Globals.lang("ISO abbreviation")); builder2.append(abbrTf); journalEditPanel = builder2.getPanel(); browseNew.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { File old = null; if (!newNameTf.getText().equals("")) old = new File(newNameTf.getText()); String name = FileDialogs.getNewFile(frame.getFrame(), old, null, JFileChooser.SAVE_DIALOG, false); if (name != null) { if ((old != null) && (tableModel.getRowCount() > 0)) { } newNameTf.setText(name); newFile.setSelected(true); } } }); browseOld.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { File old = null; if (!personalFile.getText().equals("")) old = new File(personalFile.getText()); String name = FileDialogs.getNewFile(frame.getFrame(), old, null, JFileChooser.OPEN_DIALOG, false); if (name != null) { if ((old != null) && (tableModel.getRowCount() > 0)) { } personalFile.setText(name); oldFile.setSelected(true); oldFile.setEnabled(true); setupUserTable(); } } }); ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (readyToClose()) { storeSettings(); dialog.dispose(); } } }); help.addActionListener(new HelpAction(Globals.helpDiag, GUIGlobals.journalAbbrHelp)); AbstractAction cancelAction = new AbstractAction() { public void actionPerformed(ActionEvent e) { dialog.dispose(); } }; cancel.addActionListener(cancelAction); add.addActionListener(tableModel); remove.addActionListener(tableModel); addExt.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { externals.add(new ExternalFileEntry()); buildExternalsPanel(); } }); // Key bindings: ActionMap am = getActionMap(); InputMap im = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); im.put(Globals.prefs.getKey("Close dialog"), "close"); am.put("close", cancelAction); //dialog.pack(); int xSize = getPreferredSize().width; dialog.setSize(xSize+10,700); } public JDialog getDialog() { return dialog; } public void setValues() { personalFile.setText(Globals.prefs.get("personalJournalList")); if (personalFile.getText().length() == 0) { newFile.setSelected(true); oldFile.setEnabled(false); } else { oldFile.setSelected(true); oldFile.setEnabled(true); } setupUserTable(); setupExternals(); buildExternalsPanel(); } private void buildExternalsPanel() { DefaultFormBuilder builder = new DefaultFormBuilder(new FormLayout("fill:pref:grow","")); for (Iterator<ExternalFileEntry> i=externals.iterator(); i.hasNext();) { ExternalFileEntry efe = i.next(); builder.append(efe.getPanel()); builder.nextLine(); } builder.append(Box.createVerticalGlue()); builder.nextLine(); builder.append(addExtPan); builder.nextLine(); builder.append(Box.createVerticalGlue()); //builder.getPanel().setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.green)); //externalFilesPanel.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.red)); JScrollPane pane = new JScrollPane(builder.getPanel()); pane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); externalFilesPanel.setMinimumSize(new Dimension(400,400)); externalFilesPanel.setPreferredSize(new Dimension(400,400)); externalFilesPanel.removeAll(); externalFilesPanel.add(pane, BorderLayout.CENTER); externalFilesPanel.revalidate(); externalFilesPanel.repaint(); } private void setupExternals() { String[] externalFiles = Globals.prefs.getStringArray("externalJournalLists"); if ((externalFiles == null) || (externalFiles.length == 0)) { ExternalFileEntry efe = new ExternalFileEntry(); externals.add(efe); } else { for (int i=0; i<externalFiles.length; i++) { ExternalFileEntry efe = new ExternalFileEntry(externalFiles[i]); externals.add(efe); } } //efe = new ExternalFileEntry(); //externals.add(efe); } public void setupUserTable() { JournalAbbreviations userAbbr = new JournalAbbreviations(); String filename = personalFile.getText(); if (!filename.equals("") && (new File(filename)).exists()) { try { userAbbr.readJournalList(new File(filename)); } catch (FileNotFoundException e) { e.printStackTrace(); } } tableModel.setJournals(userAbbr.getJournals()); userTable = new JTable(tableModel); userTable.addMouseListener(tableModel.getMouseListener()); userPanel.add(new JScrollPane(userTable), BorderLayout.CENTER); } public boolean readyToClose() { File f; if (newFile.isSelected()) { if (newNameTf.getText().length() > 0) { f = new File(newNameTf.getText()); return (!f.exists() || (JOptionPane.showConfirmDialog (this, "'"+f.getName()+"' "+Globals.lang("exists. Overwrite file?"), Globals.lang("Store journal abbreviations"), JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION)); } else { if (tableModel.getRowCount() > 0) { JOptionPane.showMessageDialog(this, Globals.lang("You must choose a file name to store journal abbreviations"), Globals.lang("Store journal abbreviations"), JOptionPane.ERROR_MESSAGE); return false; } else return true; } } return true; } public void storeSettings() { File f = null; if (newFile.isSelected()) { if (newNameTf.getText().length() > 0) { f = new File(newNameTf.getText()); }// else { // return; // Nothing to do. //} } else f = new File(personalFile.getText()); if (f != null) { FileWriter fw = null; try { fw = new FileWriter(f, false); for (Iterator<JournalEntry> i=tableModel.getJournals().iterator(); i.hasNext();) { JournalEntry entry = i.next(); fw.write(entry.name); fw.write(" = "); fw.write(entry.abbreviation); fw.write(Globals.NEWLINE); } } catch (IOException e) { e.printStackTrace(); } finally { if (fw != null) try { fw.close(); } catch (IOException e) { e.printStackTrace(); } } String filename = f.getPath(); if (filename.equals("")) filename = null; Globals.prefs.put("personalJournalList", filename); } // Store the list of external files set up: ArrayList<String> extFiles = new ArrayList<String>(); for (Iterator<ExternalFileEntry> i=externals.iterator(); i.hasNext();) { ExternalFileEntry efe = i.next(); if (!efe.getValue().equals("")) { extFiles.add(efe.getValue()); } } if (extFiles.size() == 0) Globals.prefs.put("externalJournalLists", ""); else { String[] list = extFiles.toArray(new String[extFiles.size()]); Globals.prefs.putStringArray("externalJournalLists", list); } Globals.initializeJournalNames(); // Update the autocompleter for the "journal" field in all base panels, // so added journal names are available: for (int i=0; i<frame.baseCount(); i++) { frame.baseAt(i).addJournalListToAutoCompleter(); } } class DownloadAction extends AbstractAction { JTextField comp; public DownloadAction(JTextField tc) { super(Globals.lang("Download")); comp = tc; } public void actionPerformed(ActionEvent e) { String chosen = null; chosen = JOptionPane.showInputDialog(Globals.lang("Choose the URL to download. The default value points to a list provided by the JabRef developers."), "http://jabref.sf.net/journals/journal_abbreviations_general.txt"); if (chosen == null) return; File toFile; try { URL url = new URL(chosen); String toName = FileDialogs.getNewFile(frame.getFrame(), new File(System.getProperty("user.home")), null, JFileChooser.SAVE_DIALOG, false); if (toName == null) return; else toFile = new File(toName); URLDownload ud = new URLDownload(comp, url, toFile); ud.download(); comp.setText(toFile.getPath()); } catch (MalformedURLException ex) { ex.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (IOException ex2) { ex2.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } } class BrowseAction extends AbstractAction { JTextField comp; boolean dir; public BrowseAction(JTextField tc, boolean dir) { super(Globals.lang("Browse")); this.dir = dir; comp = tc; } public void actionPerformed(ActionEvent e) { String chosen = null; if (dir) chosen = FileDialogs.getNewDir(frame.getFrame(), new File(comp.getText()), Globals.NONE, JFileChooser.OPEN_DIALOG, false); else chosen = FileDialogs.getNewFile(frame.getFrame(), new File(comp.getText()), Globals.NONE, JFileChooser.OPEN_DIALOG, false); if (chosen != null) { File newFile = new File(chosen); comp.setText(newFile.getPath()); } } } class AbbreviationsTableModel extends AbstractTableModel implements ActionListener { String[] names = new String[] {Globals.lang("Journal name"), Globals.lang("Abbreviation")}; ArrayList<JournalEntry> journals = null; public AbbreviationsTableModel() { } public void setJournals(Map<String, String> journals) { this.journals = new ArrayList<JournalEntry>(); for (Map.Entry<String, String> entry : journals.entrySet()){ this.journals.add(new JournalEntry(entry.getKey(), entry.getValue())); } fireTableDataChanged(); } public ArrayList<JournalEntry> getJournals() { return journals; } public int getColumnCount() { return 2; } public int getRowCount() { return journals.size(); } public Object getValueAt(int row, int col) { if (col == 0) return journals.get(row).name; else return journals.get(row).abbreviation; } public void setValueAt(Object object, int row, int col) { JournalEntry entry = journals.get(row); if (col == 0) entry.name = (String)object; else entry.abbreviation = (String)object; } public String getColumnName(int i) { return names[i]; } public boolean isCellEditable(int i, int i1) { return false; } public MouseListener getMouseListener() { return new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { JTable table = (JTable)e.getSource(); int row = table.rowAtPoint(e.getPoint()); nameTf.setText((String)getValueAt(row,0)); abbrTf.setText((String)getValueAt(row,1)); if (JOptionPane.showConfirmDialog(dialog, journalEditPanel, Globals.lang("Edit journal"), JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION) { setValueAt(nameTf.getText(), row, 0); setValueAt(abbrTf.getText(), row, 1); Collections.sort(journals); fireTableDataChanged(); } } } }; } public void actionPerformed(ActionEvent e) { if (e.getSource() == add) { //int sel = userTable.getSelectedRow(); //if (sel < 0) // sel = 0; nameTf.setText(""); abbrTf.setText(""); if (JOptionPane.showConfirmDialog(dialog, journalEditPanel, Globals.lang("Edit journal"), JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION) { journals.add(new JournalEntry(nameTf.getText(), abbrTf.getText())); //setValueAt(nameTf.getText(), sel, 0); //setValueAt(abbrTf.getText(), sel, 1); Collections.sort(journals); fireTableDataChanged(); } } else if (e.getSource() == remove) { int[] rows = userTable.getSelectedRows(); if (rows.length > 0) { for (int i=rows.length-1; i>=0; i--) { journals.remove(rows[i]); } fireTableDataChanged(); } } } } class ExternalFileEntry { private JPanel pan; private JTextField tf; private JButton browse = new JButton(Globals.lang("Browse")), view = new JButton(Globals.lang("Preview")), clear = new JButton(GUIGlobals.getImage("delete")), download = new JButton(Globals.lang("Download")); public ExternalFileEntry() { tf = new JTextField(); setupPanel(); } public ExternalFileEntry(String filename) { tf = new JTextField(filename); setupPanel(); } private void setupPanel() { tf.setEditable(false); BrowseAction browseA = new BrowseAction(tf, false); browse.addActionListener(browseA); DownloadAction da = new DownloadAction(tf); download.addActionListener(da); DefaultFormBuilder builder = new DefaultFormBuilder (new FormLayout("fill:pref:grow, 4dlu, fill:pref, 4dlu, fill:pref, 4dlu, fill:pref, 4dlu, fill:pref", "")); builder.append(tf); builder.append(browse); builder.append(download); builder.append(view); builder.append(clear); pan = builder.getPanel(); view.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { JournalAbbreviations abbr = new JournalAbbreviations(new File(tf.getText())); JTable table = new JTable(abbr.getTableModel()); JScrollPane pane = new JScrollPane(table); JOptionPane.showMessageDialog(null, pane, Globals.lang("Journal list preview"), JOptionPane.INFORMATION_MESSAGE); } catch (FileNotFoundException ex) { JOptionPane.showMessageDialog(null, Globals.lang("File '%0' not found", tf.getText()), Globals.lang("Error"), JOptionPane.ERROR_MESSAGE); } } }); clear.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { externals.remove(ExternalFileEntry.this); buildExternalsPanel(); } }); clear.setToolTipText(Globals.lang("Remove")); } public JPanel getPanel() { return pan; } public String getValue() { return tf.getText(); } } class JournalEntry implements Comparable<JournalEntry> { String name, abbreviation; public JournalEntry(String name, String abbreviation) { this.name = name; this.abbreviation = abbreviation; } public int compareTo(JournalEntry other) { return this.name.compareTo(other.name); } } }