/*
Copyright (C) 2004 R. Nagel
All programs in this directory and
subdirectories are published under the GNU General Public License as
described below.
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
Further information about the GNU GPL is available at:
http://www.gnu.org/copyleft/gpl.ja.html
*/
// A wizard dialog for generating a new sub database from existing TeX aux file
//
// created by : r.nagel 23.08.2004
//
// modified : 18.04.2006 r.nagel
// insert a "short info" section
package net.sf.jabref.wizard.auximport.gui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.BorderFactory;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JEditorPane;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;
import net.sf.jabref.BasePanel;
import net.sf.jabref.BibtexDatabase;
import net.sf.jabref.GUIGlobals;
import net.sf.jabref.Globals;
import net.sf.jabref.JabRef;
import net.sf.jabref.JabRefFrame;
import net.sf.jabref.gui.FileDialogs;
import net.sf.jabref.wizard.auximport.AuxSubGenerator;
import com.jgoodies.forms.builder.ButtonBarBuilder;
public class FromAuxDialog
extends JDialog {
private JPanel statusPanel = new JPanel();
private JPanel buttons = new JPanel();
private JButton okButton = new JButton();
private JButton cancelButton = new JButton();
private JButton generateButton = new JButton();
private JComboBox dbChooser = new JComboBox();
private JTextField auxFileField;
private JButton browseAuxFileButton;
private JList notFoundList;
private JTextArea statusInfos;
// all open databases from JabRefFrame
private JTabbedPane parentTabbedPane;
private boolean okPressed = false;
private AuxSubGenerator auxParser;
public FromAuxDialog(JabRefFrame frame, String title, boolean modal,
JTabbedPane viewedDBs) {
super(frame, title, modal);
parentTabbedPane = viewedDBs;
auxParser = new AuxSubGenerator(null);
try {
jbInit(frame);
pack();
setSize(600, 500);
} catch (Exception ex) {
ex.printStackTrace();
}
}
private void jbInit(JabRefFrame parent) {
JPanel panel1 = new JPanel();
panel1.setLayout(new BorderLayout());
okButton.setText(Globals.lang("Ok"));
okButton.setEnabled(false);
okButton.addActionListener(new FromAuxDialog_ok_actionAdapter(this));
cancelButton.setText(Globals.lang("Cancel"));
cancelButton.addActionListener(new FromAuxDialog_Cancel_actionAdapter(this));
generateButton.setText(Globals.lang("Generate"));
generateButton.addActionListener(new FromAuxDialog_generate_actionAdapter(this));
initPanels(parent);
// insert the buttons
ButtonBarBuilder bb = new ButtonBarBuilder();
JPanel buttonPanel = bb.getPanel();
buttonPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
bb.addGlue();
bb.addButton(generateButton);
bb.addRelatedGap();
bb.addButton(okButton);
bb.addButton(cancelButton);
bb.addGlue();
this.setModal(true);
this.setResizable(true);
this.setTitle(Globals.lang("AUX file import"));
JLabel desc = new JLabel("<html><h3>"+Globals.lang("AUX file import")+"</h3><p>"
+Globals.lang("This feature generates a new database based on which entries "
+"are needed in an existing LaTeX document.")+"</p>"
+"<p>"+Globals.lang("You need to select one of your open databases from which to choose "
+"entries, as well as the AUX file produced by LaTeX when compiling your document.")+"</p></html>");
desc.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
panel1.add(desc, BorderLayout.NORTH);
JPanel centerPane = new JPanel(new BorderLayout());
centerPane.add(buttons, BorderLayout.NORTH);
centerPane.add(statusPanel, BorderLayout.CENTER);
getContentPane().add(panel1, BorderLayout.NORTH);
getContentPane().add(centerPane, BorderLayout.CENTER);
getContentPane().add(buttonPanel, BorderLayout.SOUTH);
// Key bindings:
ActionMap am = statusPanel.getActionMap();
InputMap im = statusPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
im.put(parent.prefs().getKey("Close dialog"), "close");
am.put("close", new AbstractAction() {
public void actionPerformed(ActionEvent e) {
dispose();
}
});
}
private void initPanels(JabRefFrame parent) {
// collect the names of all open databases
int len = parentTabbedPane.getTabCount();
int toSelect = -1;
for (int i = 0; i<len; i++) {
dbChooser.addItem(parentTabbedPane.getTitleAt(i));
if (parent.baseAt(i) == parent.basePanel())
toSelect = i;
}
if (toSelect >= 0)
dbChooser.setSelectedIndex(toSelect);
auxFileField = new JTextField("", 25);
browseAuxFileButton = new JButton(Globals.lang("Browse"));
browseAuxFileButton.addActionListener(new BrowseAction(auxFileField, parent));
notFoundList = new JList();
JScrollPane listScrollPane = new JScrollPane(notFoundList);
//listScrollPane.setPreferredSize(new Dimension(250, 120));
statusInfos = new JTextArea("", 5, 20);
JScrollPane statusScrollPane = new JScrollPane(statusInfos);
//statusScrollPane.setPreferredSize(new Dimension(250, 120));
//statusInfos.setBorder(BorderFactory.createEtchedBorder());
statusInfos.setEditable(false);
DefaultFormBuilder b = new DefaultFormBuilder(new FormLayout(
"left:pref, 4dlu, fill:pref:grow, 4dlu, left:pref", ""), buttons);
b.appendSeparator(Globals.lang("Options"));
b.append(Globals.lang("Reference database") + ":");
b.append(dbChooser, 3);
b.nextLine();
b.append(Globals.lang("LaTeX AUX file") + ":");
b.append(auxFileField);
b.append(browseAuxFileButton);
b.getPanel().setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
b = new DefaultFormBuilder(new FormLayout(
"fill:pref:grow, 4dlu, fill:pref:grow", "pref, pref, fill:pref:grow"), statusPanel);
b.appendSeparator(Globals.lang("Unknown bibtex entries")+":");
b.append(Globals.lang("Unknown bibtex entries")+":");
b.append(Globals.lang("Messages")+":");
b.nextLine();
b.append(listScrollPane);
b.append(statusScrollPane);
b.getPanel().setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
}
void ok_actionPerformed(ActionEvent e) {
okPressed = true;
dispose();
}
void Cancel_actionPerformed(ActionEvent e) {
dispose();
}
void generate_actionPerformed(ActionEvent e) {
generateButton.setEnabled(false);
BasePanel bp = (BasePanel) parentTabbedPane.getComponentAt(
dbChooser.getSelectedIndex());
notFoundList.removeAll();
statusInfos.setText(null);
BibtexDatabase refBase = bp.getDatabase();
String auxName = auxFileField.getText();
if (auxName != null) {
if ((refBase != null) && (auxName.length() > 0)) {
auxParser.clear();
notFoundList.setListData(auxParser.generate(auxName, refBase));
statusInfos.append(Globals.lang("keys in database") + " " +
refBase.getEntryCount());
statusInfos.append("\n" + Globals.lang("found in aux file") + " " +
auxParser.getFoundKeysInAux());
statusInfos.append("\n" + Globals.lang("resolved") + " " +
auxParser.getResolvedKeysCount());
statusInfos.append("\n" + Globals.lang("not found") + " " +
auxParser.getNotResolvedKeysCount());
statusInfos.append("\n" + Globals.lang("crossreferenced entries included") + " " +
auxParser.getCrossreferencedEntriesCount());
int nested = auxParser.getNestedAuxCounter();
if (nested > 0) {
statusInfos.append("\n" + Globals.lang("nested_aux_files") + " " +
nested);
}
okButton.setEnabled(true);
}
}
// the generated database contains no entries -> no active ok-button
if (auxParser.getGeneratedDatabase().getEntryCount() < 1) {
statusInfos.append("\n" + Globals.lang("empty database"));
okButton.setEnabled(false);
}
generateButton.setEnabled(true);
}
public boolean okPressed() {
return okPressed;
}
public BibtexDatabase getGenerateDB() {
return auxParser.getGeneratedDatabase();
}
// ---------------------------------------------------------------------------
/**
* Action used to produce a "Browse" button for one of the text fields.
*/
class BrowseAction
extends AbstractAction {
private JTextField comp;
private JabRefFrame _frame;
public BrowseAction(JTextField tc, JabRefFrame frame) {
super(Globals.lang("Browse"));
_frame = frame;
comp = tc;
}
public void actionPerformed(ActionEvent e) {
String chosen = null;
chosen = FileDialogs.getNewFile(_frame,
new File(comp.getText()),
".aux",
JFileChooser.OPEN_DIALOG, false);
if (chosen != null) {
File newFile = new File(chosen);
comp.setText(newFile.getPath());
}
}
}
}
// ----------- helper class -------------------
class FromAuxDialog_ok_actionAdapter
implements java.awt.event.ActionListener {
FromAuxDialog adaptee;
FromAuxDialog_ok_actionAdapter(FromAuxDialog adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.ok_actionPerformed(e);
}
}
class FromAuxDialog_Cancel_actionAdapter
implements java.awt.event.ActionListener {
FromAuxDialog adaptee;
FromAuxDialog_Cancel_actionAdapter(FromAuxDialog adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.Cancel_actionPerformed(e);
}
}
class FromAuxDialog_generate_actionAdapter
implements java.awt.event.ActionListener {
FromAuxDialog adaptee;
FromAuxDialog_generate_actionAdapter(FromAuxDialog adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.generate_actionPerformed(e);
}
}