package net.sf.jabref.collab; import java.util.Enumeration; import java.util.TreeSet; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JScrollPane; import net.sf.jabref.*; import net.sf.jabref.undo.NamedCompound; import net.sf.jabref.undo.UndoableFieldChange; public class EntryChange extends Change { BibtexEntry memEntry, tmpEntry, diskEntry; boolean isModifiedLocally, modificationsAgree; public EntryChange(BibtexEntry memEntry, BibtexEntry tmpEntry, BibtexEntry diskEntry) { super(); String key = tmpEntry.getCiteKey(); if (key == null) name = "Modified entry"; else name = "Modified entry: '"+key+"'"; this.memEntry = memEntry; this.tmpEntry = tmpEntry; this.diskEntry = diskEntry; // We know that tmpEntry is not equal to diskEntry. Check if it has been modified // locally as well, since last tempfile was saved. isModifiedLocally = ! (DuplicateCheck.compareEntriesStrictly(memEntry, tmpEntry) > 1); // Another (unlikely?) possibility is that both disk and mem version has been modified // in the same way. Check for this, too. modificationsAgree = (DuplicateCheck.compareEntriesStrictly(memEntry, diskEntry) > 1); //Util.pr("Modified entry: "+memEntry.getCiteKey()+"\n Modified locally: "+isModifiedLocally // +" Modifications agree: "+modificationsAgree); TreeSet<String> allFields = new TreeSet<String>(); allFields.addAll(memEntry.getAllFields()); allFields.addAll(tmpEntry.getAllFields()); allFields.addAll(diskEntry.getAllFields()); for (String field : allFields){ String mem = memEntry.getField(field), tmp = tmpEntry.getField(field), disk = diskEntry.getField(field); if ((tmp != null) && (disk != null)) { if (!tmp.equals(disk)) { // Modified externally. add(new FieldChange(field, memEntry, tmpEntry, mem, tmp, disk)); } } else if ((tmp == null) && (disk != null) && !disk.equals("")) { // Added externally. add(new FieldChange(field, memEntry, tmpEntry, mem, tmp, disk)); } else if ((disk == null) && (tmp != null) && !tmp.equals("") && (mem != null) && !mem.equals("")) { // Deleted externally and not locally. add(new FieldChange(field, memEntry, tmpEntry, mem, tmp, disk)); } //Util.pr("Field: "+fld.next()); } } public boolean makeChange(BasePanel panel, BibtexDatabase secondary, NamedCompound undoEdit) { @SuppressWarnings("unchecked") boolean allAccepted = true; Enumeration<Change> e = children(); for (; e.hasMoreElements();) { Change c = e.nextElement(); if (c.isAcceptable() && c.isAccepted()) c.makeChange(panel, secondary, undoEdit); else allAccepted = false; } /*panel.database().removeEntry(memEntry.getId()); try { diskEntry.setId(Util.createNeutralId()); } catch (KeyCollisionException ex) {} panel.database().removeEntry(memEntry.getId());*/ return allAccepted; } JComponent description() { return new JLabel(name); } class FieldChange extends Change { BibtexEntry entry, tmpEntry; String field, inMem, onTmp, onDisk; InfoPane tp = new InfoPane(); JScrollPane sp = new JScrollPane(tp); public FieldChange(String field, BibtexEntry memEntry, BibtexEntry tmpEntry, String inMem, String onTmp, String onDisk) { entry = memEntry; this.tmpEntry = tmpEntry; name = field; this.field = field; this.inMem = inMem; this.onTmp = onTmp; this.onDisk = onDisk; StringBuffer text = new StringBuffer(); text.append("<FONT SIZE=10>"); text.append("<H2>").append(Globals.lang("Modification of field")).append(" <I>").append(field).append("</I></H2>"); if ((onDisk != null) && !onDisk.equals("")) text.append("<H3>").append(Globals.lang("Value set externally")).append(":</H3>" + " ").append(onDisk); else text.append("<H3>").append(Globals.lang("Value cleared externally")).append("</H3>"); if ((inMem != null) && !inMem.equals("")) text.append("<H3>").append(Globals.lang("Current value")).append(":</H3>" + " ").append(inMem); if ((onTmp != null) && !onTmp.equals("")) text.append("<H3>").append(Globals.lang("Current tmp value")).append(":</H3>" + " ").append(onTmp); else { // No value in memory. /*if ((onTmp != null) && !onTmp.equals(inMem)) text.append("<H2>"+Globals.lang("You have cleared this field. Original value")+":</H2>" +" "+onTmp);*/ } tp.setContentType("text/html"); tp.setText(text.toString()); } public boolean makeChange(BasePanel panel, BibtexDatabase secondary, NamedCompound undoEdit) { //System.out.println(field+" "+onDisk); entry.setField(field, onDisk); undoEdit.addEdit(new UndoableFieldChange(entry, field, inMem, onDisk)); tmpEntry.setField(field, onDisk); return true; } JComponent description() { return sp; } } }