/** * @param node The node which still contains the old group. * @param newGroup The new group to replace the one currently stored in <b>node </b>. */ public UndoableModifyGroup( GroupSelector gs, GroupTreeNode groupsRoot, GroupTreeNode node, AbstractGroup newGroup) { m_groupSelector = gs; m_oldGroupBackup = node.getGroup().deepCopy(); m_newGroupBackup = newGroup.deepCopy(); m_pathToNode = node.getIndexedPath(); m_groupsRootHandle = groupsRoot; }
@Override public void redo() { super.redo(); GroupTreeNode treeNode = mGroupsRootHandle.getChildAt(mPathToNode); if (treeNode != null) { ExplicitGroup group = (ExplicitGroup) treeNode.getGroup(); group.clearAssignments(); for (final BibEntry aM_newAssignmentBackup : m_newAssignmentBackup) { group.addEntry(aM_newAssignmentBackup); } } }
/** @param move For add: if true, remove from previous groups */ private void insertNodes( JMenu menu, GroupTreeNode node, BibtexEntry[] selection, boolean add, boolean move) { final AbstractAction action = getAction(node, selection, add, move); if (node.getChildCount() == 0) { JMenuItem menuItem = new JMenuItem(action); setGroupFontAndIcon(menuItem, node.getGroup()); menu.add(menuItem); if (action.isEnabled()) { menu.setEnabled(true); } return; } JMenu submenu; if (node.getGroup() instanceof AllEntriesGroup) { for (int i = 0; i < node.getChildCount(); ++i) { insertNodes(menu, (GroupTreeNode) node.getChildAt(i), selection, add, move); } } else { submenu = new JMenu('[' + node.getGroup().getName() + ']'); setGroupFontAndIcon(submenu, node.getGroup()); // setEnabled(true) is done above/below if at least one menu // entry (item or submenu) is enabled submenu.setEnabled(action.isEnabled()); JMenuItem menuItem = new JMenuItem(action); setGroupFontAndIcon(menuItem, node.getGroup()); submenu.add(menuItem); submenu.add(new Separator()); for (int i = 0; i < node.getChildCount(); ++i) { insertNodes(submenu, (GroupTreeNode) node.getChildAt(i), selection, add, move); } menu.add(submenu); if (submenu.isEnabled()) { menu.setEnabled(true); } } }
/** @param move For add: if true, remove from all previous groups */ private AbstractAction getAction( GroupTreeNode node, BibtexEntry[] selection, boolean add, boolean move) { AbstractAction action = add ? new AddToGroupAction(node, move, panel) : new RemoveFromGroupAction(node, panel); AbstractGroup group = node.getGroup(); if (!move) { action.setEnabled( add ? group.supportsAdd() && !group.containsAll(selection) : group.supportsRemove() && group.containsAny(selection)); } else { action.setEnabled(group.supportsAdd()); } return action; }
@Override public void actionPerformed(ActionEvent evt) { final BibtexEntry[] entries = m_panel.getSelectedEntries(); final Vector<GroupTreeNode> removeGroupsNodes = new Vector<GroupTreeNode>(); // used only when moving if (m_move) { // collect warnings for removal Enumeration<GroupTreeNode> e = ((GroupTreeNode) m_node.getRoot()).preorderEnumeration(); GroupTreeNode node; while (e.hasMoreElements()) { node = e.nextElement(); if (!node.getGroup().supportsRemove()) { continue; } for (BibtexEntry entry : entries) { if (node.getGroup().contains(entry)) { removeGroupsNodes.add(node); } } } // warning for all groups from which the entries are removed, and // for the one to which they are added! hence the magical +1 AbstractGroup[] groups = new AbstractGroup[removeGroupsNodes.size() + 1]; for (int i = 0; i < removeGroupsNodes.size(); ++i) { groups[i] = removeGroupsNodes.elementAt(i).getGroup(); } groups[groups.length - 1] = m_node.getGroup(); if (!Util.warnAssignmentSideEffects( groups, entries, m_panel.getDatabase(), m_panel.frame())) { return; // user aborted operation } } else { // warn if assignment has undesired side effects (modifies a field != keywords) if (!Util.warnAssignmentSideEffects( new AbstractGroup[] {m_node.getGroup()}, entries, m_panel.getDatabase(), m_panel.frame())) { return; // user aborted operation } } // if an editor is showing, its fields must be updated // after the assignment, and before that, the current // edit has to be stored: m_panel.storeCurrentEdit(); NamedCompound undoAll = new NamedCompound(Globals.lang("change assignment of entries")); if (m_move) { // first remove for (int i = 0; i < removeGroupsNodes.size(); ++i) { GroupTreeNode node = removeGroupsNodes.elementAt(i); if (node.getGroup().containsAny(entries)) { undoAll.addEdit(node.removeFromGroup(entries)); } } // then add AbstractUndoableEdit undoAdd = m_node.addToGroup(entries); if (undoAdd != null) { undoAll.addEdit(undoAdd); } } else { AbstractUndoableEdit undoAdd = m_node.addToGroup(entries); if (undoAdd == null) { return; // no changed made } undoAll.addEdit(undoAdd); } undoAll.end(); m_panel.undoManager.addEdit(undoAll); m_panel.markBaseChanged(); m_panel.updateEntryEditorIfShowing(); m_panel.getGroupSelector().valueChanged(null); }
/** @param move If true, remove node from all other groups. */ public AddToGroupAction(GroupTreeNode node, boolean move, BasePanel panel) { super(node.getGroup().getName()); m_node = node; m_move = move; m_panel = panel; }