/* 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.event.*;
import java.awt.*;
import javax.swing.*;
import net.sf.jabref.undo.UndoablePreambleChange;
public class PreambleEditor extends JDialog {
// A reference to the entry this object works on.
BibtexDatabase base;
BasePanel panel;
JabRefFrame baseFrame;
JabRefPreferences prefs;
// Layout objects.
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints con = new GridBagConstraints();
JLabel lab;
Container conPane = getContentPane();
//JToolBar tlb = new JToolBar();
JPanel pan = new JPanel();
FieldEditor ed;
public PreambleEditor(JabRefFrame baseFrame,
BasePanel panel, BibtexDatabase base,
JabRefPreferences prefs) {
super(baseFrame);
this.baseFrame = baseFrame;
this.panel = panel;
this.base = base;
this.prefs = prefs;
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
closeAction.actionPerformed(null);
}
public void windowOpened(WindowEvent e) {
ed.requestFocus();
}
});
setFocusTraversalPolicy(new LayoutFocusTraversalPolicy() {
protected boolean accept(Component c) {
return (super.accept(c) && (c instanceof FieldEditor));
}
});
int prefHeight = (int) (GUIGlobals.PE_HEIGHT * GUIGlobals.FORM_HEIGHT[prefs.getInt("entryTypeFormHeightFactor")]);
setSize(GUIGlobals.FORM_WIDTH[prefs.getInt("entryTypeFormWidth")], prefHeight);
pan.setLayout(gbl);
con.fill = GridBagConstraints.BOTH;
con.weighty = 1;
con.insets = new Insets(10, 5, 10, 5);
String content = base.getPreamble();
ed = new FieldTextArea(Globals.lang("Preamble"), ((content != null) ? content : ""));
//ed.addUndoableEditListener(panel.undoListener);
setupJTextComponent((FieldTextArea) ed);
gbl.setConstraints(ed.getLabel(), con);
pan.add(ed.getLabel());
con.weightx = 1;
gbl.setConstraints(ed.getPane(), con);
pan.add(ed.getPane());
//tlb.add(closeAction);
//conPane.add(tlb, BorderLayout.NORTH);
conPane.add(pan, BorderLayout.CENTER);
setTitle(Globals.lang("Edit preamble"));
}
private void setupJTextComponent(javax.swing.text.JTextComponent ta) {
// Set up key bindings and focus listener for the FieldEditor.
ta.getInputMap().put(prefs.getKey("Close preamble editor"), "close");
ta.getActionMap().put("close", closeAction);
ta.getInputMap().put(prefs.getKey("Preamble editor, store changes"), "store");
ta.getActionMap().put("store", storeFieldAction);
ta.getInputMap().put(prefs.getKey("Close preamble editor"), "close");
ta.getActionMap().put("close", closeAction);
ta.getInputMap().put(prefs.getKey("Undo"), "undo");
ta.getActionMap().put("undo", undoAction);
ta.getInputMap().put(prefs.getKey("Redo"), "redo");
ta.getActionMap().put("redo", redoAction);
ta.addFocusListener(new FieldListener());
}
public void updatePreamble() {
ed.setText(base.getPreamble());
}
class FieldListener extends FocusAdapter {
/*
* Focus listener that fires the storeFieldAction when a FieldTextArea
* loses focus.
*/
public void focusLost(FocusEvent e) {
if (!e.isTemporary())
storeFieldAction.actionPerformed(new ActionEvent(e.getSource(), 0, ""));
}
}
StoreFieldAction storeFieldAction = new StoreFieldAction();
class StoreFieldAction extends AbstractAction {
public StoreFieldAction() {
super("Store field value");
putValue(SHORT_DESCRIPTION, "Store field value");
}
public void actionPerformed(ActionEvent e) {
String toSet = null;
boolean set;
if (ed.getText().length() > 0)
toSet = ed.getText();
// We check if the field has changed, since we don't want to mark the
// base as changed unless we have a real change.
if (toSet == null) {
if (base.getPreamble() == null)
set = false;
else
set = true;
} else {
if ((base.getPreamble() != null)
&& toSet.equals(base.getPreamble()))
set = false;
else
set = true;
}
if (set) {
panel.undoManager.addEdit(new UndoablePreambleChange
(base, panel, base.getPreamble(), toSet));
base.setPreamble(toSet);
if ((toSet != null) && (toSet.length() > 0)) {
ed.setLabelColor(GUIGlobals.entryEditorLabelColor);
ed.setValidBackgroundColor();
} else {
ed.setLabelColor(GUIGlobals.nullFieldColor);
ed.setValidBackgroundColor();
}
if (ed.getTextComponent().hasFocus())
ed.setActiveBackgroundColor();
panel.markBaseChanged();
}
}
}
UndoAction undoAction = new UndoAction();
class UndoAction extends AbstractAction {
public UndoAction() {
super("Undo", GUIGlobals.getImage("undo"));
putValue(SHORT_DESCRIPTION, "Undo");
}
public void actionPerformed(ActionEvent e) {
try {
panel.runCommand("undo");
} catch (Throwable ex) {
}
}
}
RedoAction redoAction = new RedoAction();
class RedoAction extends AbstractAction {
public RedoAction() {
super("Undo", GUIGlobals.getImage("redo"));
putValue(SHORT_DESCRIPTION, "Redo");
}
public void actionPerformed(ActionEvent e) {
try {
panel.runCommand("redo");
} catch (Throwable ex) {
}
}
}
// The action concerned with closing the window.
CloseAction closeAction = new CloseAction();
class CloseAction extends AbstractAction {
public CloseAction() {
super(Globals.lang("Close window"));
//, new ImageIcon(GUIGlobals.closeIconFile));
//putValue(SHORT_DESCRIPTION, "Close window (Ctrl-Q)");
}
public void actionPerformed(ActionEvent e) {
storeFieldAction.actionPerformed(null);
panel.preambleEditorClosing();
dispose();
}
}
public FieldEditor getFieldEditor() {
return ed;
}
public void storeCurrentEdit() {
storeFieldAction.actionPerformed(null);
}
}