/* GeoGebra - Dynamic Mathematics for Everyone http://www.geogebra.org This file is part of GeoGebra. 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. */ package org.geogebra.desktop.gui; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; import javax.swing.BorderFactory; import javax.swing.JFormattedTextField; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.geogebra.common.kernel.Construction; import org.geogebra.common.kernel.commands.CmdGetTime; import org.geogebra.common.main.App; import org.geogebra.common.util.lang.Unicode; import org.geogebra.desktop.gui.inputfield.MyFormattedTextField; import org.geogebra.desktop.gui.inputfield.MyTextFieldD; import org.geogebra.desktop.main.AppD; import org.geogebra.desktop.main.GeoGebraPreferencesD; import org.geogebra.desktop.main.LocalizationD; /** * Panel with title, author and date of construction. Forwards all updates to * kernel and notifies attached ActionListeners about kernel changes. Thus, it * can be used to edit the aforementioned values in the kernel. * * @author Markus Hohenwarter * @author Philipp Weissenbacher (materthron@users.sourceforge.net) */ public class TitlePanel extends JPanel { private static final long serialVersionUID = 1L; private JTextField titleField, authorField; private JFormattedTextField dateField; private ArrayList<ActionListener> listeners = new ArrayList<ActionListener>(); private Construction cons; private LocalizationD loc; public TitlePanel(AppD app) { cons = app.getKernel().getConstruction(); loc = app.getLocalization(); setLayout(new BorderLayout(5, 5)); titleField = new MyTextFieldD(app); authorField = new MyTextFieldD(app); dateField = new MyFormattedTextField((GuiManagerD) app.getGuiManager(), DateFormat.getDateInstance(DateFormat.LONG)); dateField.setColumns(12); dateField.setFocusLostBehavior(JFormattedTextField.PERSIST); dateField.setFont(app.getPlainFont()); updateData(); JPanel p = new JPanel(new BorderLayout(5, 5)); p.add(new JLabel(loc.getPlain("Title") + ": "), loc.borderWest()); p.add(titleField, BorderLayout.CENTER); add(p, BorderLayout.NORTH); p = new JPanel(new BorderLayout(5, 5)); JPanel p1 = new JPanel(new BorderLayout()); p1.add(new JLabel(loc.getPlain("Author") + ": "), loc.borderWest()); p1.add(authorField, BorderLayout.CENTER); p.add(p1, BorderLayout.CENTER); p1 = new JPanel(new BorderLayout()); p1.add(new JLabel(loc.getPlain("Date") + ": "), loc.borderWest()); p1.add(dateField, BorderLayout.CENTER); p.add(p1, loc.borderEast()); add(p, BorderLayout.CENTER); setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEtchedBorder(), BorderFactory.createEmptyBorder(5, 5, 5, 5))); // setBorder(BorderFactory.createTitledBorder(app // .getPlain("Document info"))); ActionListener lst = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { fireTextFieldUpdate((JTextField) e.getSource()); } }; titleField.addActionListener(lst); addDocListener(titleField); authorField.addActionListener(lst); addDocListener(authorField); dateField.addActionListener(lst); addDocListener(dateField); FocusAdapter focusListener = new FocusAdapter() { @Override public void focusLost(FocusEvent e) { fireTextFieldUpdate((JTextField) e.getSource()); } }; titleField.addFocusListener(focusListener); authorField.addFocusListener(focusListener); dateField.addFocusListener(focusListener); } private void addDocListener(final JTextField authorField2) { authorField2.getDocument().addDocumentListener(new DocumentListener() { public void insertUpdate(DocumentEvent e) { fireTextFieldUpdate(authorField2); } public void removeUpdate(DocumentEvent e) { fireTextFieldUpdate(authorField2); } public void changedUpdate(DocumentEvent e) { fireTextFieldUpdate(authorField2); } }); } public void updateData() { titleField.setText(cons.getTitle()); authorField.setText(loadAuthor()); dateField.setText(configureDate(cons.getDate())); } public String configureDate(String src) { // If no date specified use current date if ("".equals(src)) { App app = cons.getApplication(); // in form 23 September 2012 (some languages don't want eg 25e, 25a // so omit "th" for all) String format = app.getLocalization().isRightToLeftReadingOrder() ? "\\Y " + Unicode.LeftToRightMark + "\\F" + Unicode.LeftToRightMark + " \\j" : "\\j \\F \\Y"; return CmdGetTime.buildLocalizedDate(format, new Date(), app.getLocalization()); } return src; } public String loadAuthor() { String author = cons.getAuthor(); if ("".equals(author)) { author = GeoGebraPreferencesD.getPref() .loadPreference(GeoGebraPreferencesD.AUTHOR, ""); cons.setAuthor(author); } return author; } private boolean saveAuthor(String author) { boolean kernelChanged = !author.equals(cons.getAuthor()); if (kernelChanged) { cons.setAuthor(author); GeoGebraPreferencesD.getPref() .savePreference(GeoGebraPreferencesD.AUTHOR, author); } return kernelChanged; } /** * Updates the kernel if the user makes changes to the text fields. */ private void fireTextFieldUpdate(JTextField tf) { String text = tf.getText(); boolean kernelChanged = false; if (tf == titleField) { if (text.equals(cons.getTitle())) { return; } cons.setTitle(text); kernelChanged = true; } else if (tf == authorField) { kernelChanged = saveAuthor(tf.getText()); } else if (tf == dateField) { if (text.equals(cons.getDate())) { return; } cons.setDate(text); kernelChanged = true; } if (kernelChanged) { notifyListeners(); } } public void addActionListener(ActionListener lst) { listeners.add(lst); } private void notifyListeners() { int size = listeners.size(); for (int i = 0; i < size; i++) { listeners.get(i).actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "TitleChanged")); } } }