package org.jabref.gui.entryeditor; import java.awt.Component; import java.awt.Rectangle; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.JTextComponent; import org.jabref.gui.fieldeditors.FieldEditor; /** * Focus listener that fires the storeFieldAction when a TextArea loses focus. */ class EntryEditorTabFocusListener implements FocusListener { /** * The EntryEditorTab this FocusListener is currently tied to */ private final EntryEditorTab entryEditorTab; /** The component this DocumentListener is currently tied to */ private JTextComponent textComponent; /** The listener which gets tied to each TextComponent (and removed) */ private DocumentListener documentListener; public EntryEditorTabFocusListener(final EntryEditorTab entryEditorTab) { this.entryEditorTab = entryEditorTab; } @Override public void focusGained(FocusEvent event) { synchronized (this) { if (textComponent != null) { textComponent.getDocument().removeDocumentListener(documentListener); textComponent = null; documentListener = null; } if (event.getSource() instanceof JTextComponent) { textComponent = (JTextComponent) event.getSource(); documentListener = new DocumentListener() { private void fire() { if (textComponent.isFocusOwner()) { entryEditorTab.markIfModified((FieldEditor) textComponent); } } @Override public void changedUpdate(DocumentEvent e) { fire(); } @Override public void insertUpdate(DocumentEvent e) { fire(); } @Override public void removeUpdate(DocumentEvent e) { fire(); } }; textComponent.getDocument().addDocumentListener(documentListener); // Makes the vertical scroll panel view follow the focus Component component = textComponent.getParent().getParent(); if (component instanceof JScrollPane) { JScrollPane scrollPane = (JScrollPane) component; Component scrollPaneParent = scrollPane.getParent(); if (scrollPaneParent instanceof JPanel) { JPanel panel = (JPanel) scrollPaneParent; Rectangle bounds = scrollPane.getBounds(); panel.scrollRectToVisible(bounds); } } } } // TODO: Reenable this //entryEditorTab.setActive((FieldEditor) event.getSource()); } @Override public void focusLost(FocusEvent event) { synchronized (this) { if (textComponent != null) { textComponent.getDocument().removeDocumentListener(documentListener); textComponent = null; documentListener = null; } } if (!event.isTemporary()) { entryEditorTab.getParent().updateField(event.getSource()); } } }