package org.jabref.gui.openoffice;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;
import java.util.Optional;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import org.jabref.Globals;
import org.jabref.gui.JabRefFrame;
import org.jabref.gui.keyboard.KeyBinding;
import org.jabref.logic.l10n.Localization;
import org.jabref.logic.openoffice.CitationEntry;
import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.gui.TableFormat;
import ca.odell.glazedlists.swing.DefaultEventTableModel;
import com.jgoodies.forms.builder.ButtonBarBuilder;
import com.jgoodies.forms.builder.FormBuilder;
import com.jgoodies.forms.layout.FormLayout;
import com.sun.star.beans.IllegalTypeException;
import com.sun.star.beans.NotRemoveableException;
import com.sun.star.beans.PropertyExistException;
import com.sun.star.beans.UnknownPropertyException;
import com.sun.star.container.NoSuchElementException;
import com.sun.star.container.XNameAccess;
import com.sun.star.lang.IllegalArgumentException;
import com.sun.star.lang.WrappedTargetException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Dialog for modifying existing citations.
*/
class CitationManager {
private static final Log LOGGER = LogFactory.getLog(CitationManager.class);
private final OOBibBase ooBase;
private final JDialog diag;
private final EventList<CitationEntry> list;
private final JTable table;
private final DefaultEventTableModel<CitationEntry> tableModel;
public CitationManager(final JabRefFrame frame, OOBibBase ooBase)
throws NoSuchElementException, WrappedTargetException, UnknownPropertyException {
diag = new JDialog(frame, Localization.lang("Manage citations"), true);
this.ooBase = ooBase;
list = new BasicEventList<>();
XNameAccess nameAccess = ooBase.getReferenceMarks();
List<String> names = ooBase.getJabRefReferenceMarks(nameAccess);
for (String name : names) {
list.add(new CitationEntry(name,
"<html>..." + ooBase.getCitationContext(nameAccess, name, 30, 30, true) + "...</html>",
ooBase.getCustomProperty(name)));
}
tableModel = new DefaultEventTableModel<>(list, new CitationEntryFormat());
table = new JTable(tableModel);
diag.add(new JScrollPane(table), BorderLayout.CENTER);
ButtonBarBuilder bb = new ButtonBarBuilder();
bb.addGlue();
JButton ok = new JButton(Localization.lang("OK"));
bb.addButton(ok);
JButton cancel = new JButton(Localization.lang("Cancel"));
bb.addButton(cancel);
bb.addGlue();
bb.getPanel().setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
diag.add(bb.getPanel(), BorderLayout.SOUTH);
diag.pack();
diag.setSize(700, 400);
ok.addActionListener(e -> {
try {
storeSettings();
} catch (UnknownPropertyException | NotRemoveableException | PropertyExistException | IllegalTypeException |
IllegalArgumentException ex) {
LOGGER.warn("Problem modifying citation", ex);
JOptionPane.showMessageDialog(frame, Localization.lang("Problem modifying citation"));
}
diag.dispose();
});
Action cancelAction = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
diag.dispose();
}
};
cancel.addActionListener(cancelAction);
bb.getPanel().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put
(Globals.getKeyPrefs().getKey(KeyBinding.CLOSE_DIALOG), "close");
bb.getPanel().getActionMap().put("close", cancelAction);
table.getColumnModel().getColumn(0).setPreferredWidth(580);
table.getColumnModel().getColumn(1).setPreferredWidth(110);
table.setPreferredScrollableViewportSize(new Dimension(700, 500));
table.addMouseListener(new TableClickListener());
}
private void storeSettings() throws UnknownPropertyException, NotRemoveableException, PropertyExistException,
IllegalTypeException, IllegalArgumentException {
for (CitationEntry entry : list) {
Optional<String> pageInfo = entry.getPageInfo();
if (entry.pageInfoChanged() && pageInfo.isPresent()) {
ooBase.setCustomProperty(entry.getRefMarkName(), pageInfo.get());
}
}
}
public void showDialog() {
diag.setLocationRelativeTo(diag.getParent());
diag.setVisible(true);
}
private static class CitationEntryFormat implements TableFormat<CitationEntry> {
@Override
public int getColumnCount() {
return 2;
}
@Override
public String getColumnName(int i) {
if (i == 0) {
return Localization.lang("Citation");
} else {
return Localization.lang("Extra information");
}
}
@Override
public Object getColumnValue(CitationEntry citEntry, int i) {
if (i == 0) {
return citEntry.getContext();
} else {
return citEntry.getPageInfo().orElse("");
}
}
}
private class TableClickListener extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
if ((e.getButton() == MouseEvent.BUTTON1) && (e.getClickCount() == 2)) {
int row = table.rowAtPoint(e.getPoint());
if (row >= 0) {
SingleCitationDialog scd = new SingleCitationDialog(list.get(row));
scd.showDialog();
}
}
}
}
class SingleCitationDialog {
private final JDialog singleCiteDialog;
private final JTextField pageInfo = new JTextField(20);
private final JButton okButton = new JButton(Localization.lang("OK"));
private final JButton cancelButton = new JButton(Localization.lang("Cancel"));
private final CitationEntry entry;
public SingleCitationDialog(CitationEntry citEntry) {
this.entry = citEntry;
pageInfo.setText(entry.getPageInfo().orElse(""));
singleCiteDialog = new JDialog(CitationManager.this.diag, Localization.lang("Citation"), true);
FormBuilder builder = FormBuilder.create()
.layout(new FormLayout("left:pref, 4dlu, fill:150dlu:grow", "pref, 4dlu, pref"));
builder.add(entry.getContext()).xyw(1, 1, 3);
builder.add(Localization.lang("Extra information (e.g. page number)")).xy(1, 3);
builder.add(pageInfo).xy(3, 3);
builder.padding("10dlu, 10dlu, 10dlu, 10dlu");
singleCiteDialog.getContentPane().add(builder.getPanel(), BorderLayout.CENTER);
ButtonBarBuilder bb = new ButtonBarBuilder();
bb.addGlue();
bb.addButton(okButton);
bb.addButton(cancelButton);
bb.addGlue();
bb.padding("5dlu, 5dlu, 5dlu, 5dlu");
singleCiteDialog.add(bb.getPanel(), BorderLayout.SOUTH);
okButton.addActionListener(e -> {
if (pageInfo.getText().trim().isEmpty()) {
entry.setPageInfo(null);
} else {
entry.setPageInfo(pageInfo.getText().trim());
}
tableModel.fireTableDataChanged();
singleCiteDialog.dispose();
});
Action cancelAction = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
singleCiteDialog.dispose();
}
};
cancelButton.addActionListener(cancelAction);
builder.getPanel().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put
(Globals.getKeyPrefs().getKey(KeyBinding.CLOSE_DIALOG), "close");
builder.getPanel().getActionMap().put("close", cancelAction);
}
public void showDialog() {
singleCiteDialog.pack();
singleCiteDialog.setLocationRelativeTo(singleCiteDialog.getParent());
singleCiteDialog.setVisible(true);
}
}
}