/* 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 net.sf.jabref.gui.AutoCompleteListener;
import java.awt.Color;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.text.Document;
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.CannotUndoException;
import javax.swing.undo.UndoManager;
public class FieldTextField extends JTextField implements FieldEditor {
protected String fieldName;
protected JLabel label;
protected UndoManager undo;
private AutoCompleteListener autoCompleteListener = null;
//protected UndoManager undo = new UndoManager();
public FieldTextField(String fieldName_, String content, boolean changeColorOnFocus) {
super(content);
// Listen for undo and redo events
/*getDocument().addUndoableEditListener(new UndoableEditListener() {
public void undoableEditHappened(UndoableEditEvent evt) {
undo.addEdit(evt.getEdit());
}
});*/
setupUndoRedo();
updateFont();
// Add the global focus listener, so a menu item can see if this field
// was focused when
// an action was called.
addFocusListener(Globals.focusListener);
if (changeColorOnFocus)
addFocusListener(new FieldEditorFocusListener());
fieldName = fieldName_;
label = new FieldNameLabel(" " + Util.nCase(fieldName) + " ");
// label = new JLabel(" "+Util.nCase(fieldName)+" ", JLabel.CENTER);
// label.setBorder(BorderFactory.createEtchedBorder());
setBackground(GUIGlobals.validFieldBackgroundColor);
setForeground(GUIGlobals.editorTextColor);
// label.setOpaque(true);
// if ((content != null) && (content.length() > 0))
// label.setForeground(GUIGlobals.entryEditorLabelColor);
// At construction time, the field can never have an invalid value.
// else label.setForeground(GUIGlobals.nullFieldColor);
FieldTextMenu popMenu = new FieldTextMenu(this);
this.addMouseListener(popMenu);
label.addMouseListener(popMenu);
}
protected void setupUndoRedo() {
undo = new UndoManager();
Document doc = getDocument();
// Listen for undo and redo events
doc.addUndoableEditListener(new UndoableEditListener() {
public void undoableEditHappened(UndoableEditEvent evt) {
undo.addEdit(evt.getEdit());
}
});
// Create an undo action and add it to the text component
getActionMap().put("Undo",
new AbstractAction("Undo") {
public void actionPerformed(ActionEvent evt) {
try {
if (undo.canUndo()) {
undo.undo();
}
} catch (CannotUndoException e) {
}
}
});
// Bind the undo action to ctl-Z
getInputMap().put(Globals.prefs.getKey("Undo"), "Undo");
// Create a redo action and add it to the text component
getActionMap().put("Redo",
new AbstractAction("Redo") {
public void actionPerformed(ActionEvent evt) {
try {
if (undo.canRedo()) {
undo.redo();
}
} catch (CannotRedoException e) {
}
}
});
// Bind the redo action to ctl-Y
getInputMap().put(Globals.prefs.getKey("Redo"), "Redo");
}
@Override
public void setText(String t) {
super.setText(t);
if (undo != null) undo.discardAllEdits();
}
public void append(String text) {
setText(getText() + text);
}
public String getFieldName() {
return fieldName;
}
public JLabel getLabel() {
return label;
}
public void setLabelColor(Color c) {
label.setForeground(c);
throw new NullPointerException("ok");
}
public JComponent getPane() {
return this;
}
public JComponent getTextComponent() {
return this;
}
public void setActiveBackgroundColor() {
setBackground(GUIGlobals.activeBackground);
}
public void setValidBackgroundColor() {
setBackground(GUIGlobals.validFieldBackgroundColor);
}
public void setInvalidBackgroundColor() {
setBackground(GUIGlobals.invalidFieldBackgroundColor);
}
public void updateFontColor() {
setForeground(GUIGlobals.editorTextColor);
}
public void updateFont() {
setFont(GUIGlobals.CURRENTFONT);
}
/*public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
if (antialias)
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
super.paint(g2);
}*/
public void paste(String textToInsert) {
int sel = getSelectionEnd() - getSelectionStart();
if (sel < 1) {
int cPos = getCaretPosition();
select(cPos, cPos);
}
replaceSelection(textToInsert);
}
public boolean hasUndoInformation() {
return false;//undo.canUndo();
}
public void undo() {
/*try {
if (undo.canUndo()) {
undo.undo();
}
} catch (CannotUndoException e) {
}*/
}
public boolean hasRedoInformation() {
return false;//undo.canRedo();
}
public void redo() {
/*try {
if (undo.canRedo()) {
undo.redo();
}
} catch (CannotUndoException e) {
}*/
}
public void addUndoableEditListener(UndoableEditListener listener) {
getDocument().addUndoableEditListener(listener);
}
public void setAutoCompleteListener(AutoCompleteListener listener) {
autoCompleteListener = listener;
}
public void clearAutoCompleteSuggestion() {
if (autoCompleteListener != null)
autoCompleteListener.clearCurrentSuggestion(this);
}
}