/* Copyright (C) 2003-2011 JabRef contributors. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package net.sf.jabref; import java.awt.BorderLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; import net.sf.jabref.undo.NamedCompound; import net.sf.jabref.undo.UndoableFieldChange; /** * Dialog for creating or modifying groups. Operates directly on the * Vector containing group information. */ class ReplaceStringDialog extends JDialog { JTextField fields = new JTextField("", 30), from = new JTextField("", 30), to = new JTextField("", 30); JLabel fl = new JLabel(Globals.lang("Search for")+":"), tl = new JLabel(Globals.lang("Replace with")+":"); JButton ok = new JButton(Globals.lang("Ok")), cancel = new JButton(Globals.lang("Cancel")); JPanel settings = new JPanel(), main = new JPanel(), opt = new JPanel(); JCheckBox selOnly = new JCheckBox(Globals.lang("Limit to selected entries"), false); JRadioButton allFi = new JRadioButton(Globals.lang("All fields"), true), field = new JRadioButton(Globals.lang("Limit to fields")+":", false); ButtonGroup bg = new ButtonGroup(); private boolean ok_pressed = false; private JabRefFrame parent; String[] flds = null; String s1, s2; GridBagLayout gbl = new GridBagLayout(); GridBagConstraints con = new GridBagConstraints(); public ReplaceStringDialog(JabRefFrame parent_) { super(parent_, Globals.lang("Replace string"), true); parent = parent_; bg.add(allFi); bg.add(field); ActionListener okListener = new ActionListener() { public void actionPerformed(ActionEvent e) { s1 = from.getText(); s2 = to.getText(); if (s1.equals("")) return; ok_pressed = true; flds = Util.delimToStringArray(fields.getText().toLowerCase(), ";"); dispose(); } }; ok.addActionListener(okListener); to.addActionListener(okListener); fields.addActionListener(okListener); AbstractAction cancelAction = new AbstractAction() { public void actionPerformed(ActionEvent e) { dispose(); } }; cancel.addActionListener(cancelAction); // Key bindings: ActionMap am = settings.getActionMap(); InputMap im = settings.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); im.put(parent.prefs.getKey("Close dialog"), "close"); am.put("close", cancelAction); // Layout starts here. settings.setLayout(gbl); opt.setLayout(gbl); main.setLayout(gbl); settings.setBorder(BorderFactory.createTitledBorder (BorderFactory.createEtchedBorder(), Globals.lang("Replace string"))); main.setBorder(BorderFactory.createTitledBorder (BorderFactory.createEtchedBorder(), Globals.lang("Strings"))); // Settings panel: /* con.weightx = 0; con.insets = new Insets(3, 5, 3, 5); con.anchor = GridBagConstraints.EAST; con.fill = GridBagConstraints.NONE; con.gridx = 0; con.gridy = 2; gbl.setConstraints(nf, con); settings.add(nf);*/ //con.weightx = 1; con.fill = GridBagConstraints.HORIZONTAL; //JSeparator sep = new JSeparator() con.gridwidth = 2; con.weightx = 0; con.anchor = GridBagConstraints.WEST; con.gridy = 0; con.gridx = 0; con.insets = new Insets(3, 5, 3, 5); gbl.setConstraints(selOnly, con); settings.add(selOnly); con.gridy = 1; con.insets = new Insets(13, 5, 3, 5); gbl.setConstraints(allFi, con); settings.add(allFi); con.gridwidth = 1; con.gridy = 2; con.gridx = 0; con.insets = new Insets(3, 5, 3, 5); gbl.setConstraints(field, con); settings.add(field); con.gridx = 1; con.weightx = 1; //con.insets = new Insets(3, 5, 3, 5); gbl.setConstraints(fields, con); settings.add(fields); con.weightx = 0; con.gridx = 0; con.gridy = 0; gbl.setConstraints(fl, con); main.add(fl); con.gridy = 1; gbl.setConstraints(tl, con); main.add(tl); con.weightx = 1; con.gridx = 1; con.gridy = 0; gbl.setConstraints(from, con); main.add(from); con.gridy = 1; gbl.setConstraints(to, con); main.add(to); // Option buttons: con.gridx = GridBagConstraints.RELATIVE; con.gridy = GridBagConstraints.RELATIVE; con.weightx = 1; con.gridwidth = 1; con.anchor = GridBagConstraints.EAST; con.fill = GridBagConstraints.NONE; gbl.setConstraints(ok, con); opt.add(ok); con.anchor = GridBagConstraints.WEST; con.gridwidth = GridBagConstraints.REMAINDER; gbl.setConstraints(cancel, con); opt.add(cancel); getContentPane().add(main, BorderLayout.NORTH); getContentPane().add(settings, BorderLayout.CENTER); getContentPane().add(opt, BorderLayout.SOUTH); pack(); //setSize(400, 170); Util.placeDialog(this, parent); } public boolean okPressed() { return ok_pressed; } public boolean allFields() { return allFi.isSelected(); } public boolean selOnly() { return selOnly.isSelected(); } public String[] fields() { return Util.delimToStringArray(field.getText(), ";"); } /** * Does the actual operation on a Bibtex entry based on the * settings specified in this same dialog. Returns the number of * occurences replaced. */ public int replace(BibtexEntry be, NamedCompound ce) { int counter = 0; if (allFields()) { for (String s : be.getAllFields()){ if (!s.equals(BibtexFields.KEY_FIELD)) counter += replaceField(be, s, ce); } } else { for (int i=0; i<flds.length; i++) { if (!flds[i].equals(BibtexFields.KEY_FIELD)) counter += replaceField(be, flds[i], ce); } } return counter; } public int replaceField(BibtexEntry be, String field, NamedCompound ce) { Object o = be.getField(field); if (o == null) return 0; String txt = o.toString(); StringBuffer sb = new StringBuffer(); int ind = -1, piv = 0, counter = 0, len1 = s1.length(); while ((ind=txt.indexOf(s1, piv)) >= 0) { counter++; sb.append(txt.substring(piv, ind)); // Text leading up to s1 sb.append(s2); // Insert s2 piv = ind+len1; } sb.append(txt.substring(piv)); String newStr = sb.toString(); be.setField(field, newStr); ce.addEdit(new UndoableFieldChange(be, field, txt, newStr)); return counter; } }