package org.jabref.collab;
import javax.swing.JComponent;
import javax.swing.JScrollPane;
import org.jabref.gui.BasePanel;
import org.jabref.gui.undo.NamedCompound;
import org.jabref.gui.undo.UndoableInsertString;
import org.jabref.gui.undo.UndoableStringChange;
import org.jabref.logic.l10n.Localization;
import org.jabref.model.database.BibDatabase;
import org.jabref.model.database.KeyCollisionException;
import org.jabref.model.entry.BibtexString;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
class StringChange extends Change {
private static final Log LOGGER = LogFactory.getLog(StringChange.class);
private final BibtexString string;
private final String mem;
private final String disk;
private final String label;
private final InfoPane tp = new InfoPane();
private final JScrollPane sp = new JScrollPane(tp);
private final BibtexString tmpString;
public StringChange(BibtexString string, BibtexString tmpString, String label, String mem, String disk) {
super(Localization.lang("Modified string") + ": '" + label + '\'');
this.tmpString = tmpString;
this.string = string;
this.label = label;
this.mem = mem;
this.disk = disk;
StringBuilder sb = new StringBuilder(46);
sb.append("<HTML><H2>").append(Localization.lang("Modified string")).append("</H2><H3>")
.append(Localization.lang("Label")).append(":</H3>").append(label).append("<H3>")
.append(Localization.lang("New content")).append(":</H3>").append(disk);
if (string == null) {
sb.append("<P><I>");
sb.append(Localization.lang("Cannot merge this change")).append(": ");
sb.append(Localization.lang("The string has been removed locally")).append("</I>");
} else {
sb.append("<H3>");
sb.append(Localization.lang("Current content")).append(":</H3>");
sb.append(string.getContent());
}
sb.append("</HTML>");
tp.setText(sb.toString());
}
@Override
public boolean makeChange(BasePanel panel, BibDatabase secondary, NamedCompound undoEdit) {
if (string == null) {
// The string was removed or renamed locally. We guess that it was removed.
BibtexString bs = new BibtexString(label, disk);
try {
panel.getDatabase().addString(bs);
undoEdit.addEdit(new UndoableInsertString(panel, panel.getDatabase(), bs));
} catch (KeyCollisionException ex) {
LOGGER.info("Error: could not add string '" + bs.getName() + "': " + ex.getMessage(), ex);
}
} else {
string.setContent(disk);
undoEdit.addEdit(new UndoableStringChange(panel, string, false, mem, disk));
}
// Update tmp database:
if (tmpString == null) {
BibtexString bs = new BibtexString(label, disk);
secondary.addString(bs);
} else {
tmpString.setContent(disk);
}
return true;
}
@Override
public JComponent description() {
return sp;
}
}