/* Copyright (C) 2003-2011 JabRef contributors. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package net.sf.jabref.collab; import javax.swing.JComponent; import javax.swing.JLabel; import net.sf.jabref.BasePanel; import net.sf.jabref.Globals; import net.sf.jabref.BibtexDatabase; import net.sf.jabref.groups.AllEntriesGroup; import net.sf.jabref.groups.GroupTreeNode; import net.sf.jabref.groups.UndoableModifySubtree; import net.sf.jabref.undo.NamedCompound; public class GroupChange extends Change { private final GroupTreeNode m_changedGroups; private GroupTreeNode tmpGroupRoot; public GroupChange(GroupTreeNode changedGroups, GroupTreeNode tmpGroupRoot) { super(changedGroups != null ? "Modified groups tree" : "Removed all groups"); // JZTODO lyrics m_changedGroups = changedGroups; this.tmpGroupRoot = tmpGroupRoot; } public boolean makeChange(BasePanel panel, BibtexDatabase secondary, NamedCompound undoEdit) { final GroupTreeNode root = panel.metaData().getGroups(); final UndoableModifySubtree undo = new UndoableModifySubtree( panel.getGroupSelector(), panel.metaData().getGroups(), root, Globals.lang("Modified groups")); // JZTODO lyrics root.removeAllChildren(); if (m_changedGroups == null) { // I think setting root to null is not possible root.setGroup(new AllEntriesGroup()); } else { // change root group, even though it'll be AllEntries anyway root.setGroup(m_changedGroups.getGroup()); for (int i = 0; i < m_changedGroups.getChildCount(); ++i) root.add(((GroupTreeNode) m_changedGroups.getChildAt(i)).deepCopy()); // the group tree is now appled to a different BibtexDatabase than it was created // for, which affects groups such as ExplicitGroup (which links to BibtexEntry objects). // We must traverse the tree and refresh all groups: root.refreshGroupsForNewDatabase(panel.database()); } if (panel.getGroupSelector().getGroupTreeRoot() == root) panel.getGroupSelector().revalidateGroups(); undoEdit.addEdit(undo); // Update tmp database: GroupTreeNode copied = m_changedGroups.deepCopy(); tmpGroupRoot.removeAllChildren(); tmpGroupRoot.setGroup(copied.getGroup()); for (int i = 0; i < copied.getChildCount(); ++i) tmpGroupRoot.add(((GroupTreeNode) copied.getChildAt(i)).deepCopy()); tmpGroupRoot.refreshGroupsForNewDatabase(secondary); return true; } JComponent description() { return new JLabel("<html>" + name + "." + (m_changedGroups != null ? " " + "Accepting the change replaces the complete " + "groups tree with the externally modified groups tree." : "") + "</html>"); // JZTODO lyrics } }