/** * Shows a view for <code>note</code>. The view will be positioned at the same location the last * view for <code>note</code> was shown. If this is the first time that the view is shown, it will * be positioned at the same location as the last focused view. * * @param note the <code>Note</code> whose view should be shown */ public void show(Note note) { Tuple<DockStation, DockableProperty> location = locations.remove(note); if (location != null) show(note, location.getA(), location.getB()); else if (focusedViews.isEmpty()) show(note, null); else show(note, focusedViews.getFirst()); }
/** * Rebuilds the list of actions, introducing new actions if necessary, removing old actions if no * longer needed. * * @param force whether the entire list has to be updated or optimizations are allowed */ private void updateActionList(boolean force) { if (onUpdateList) { return; } try { onUpdateList = true; if (listener != null && !force) { return; } List<Dockable> list = new ArrayList<Dockable>(); fill(dockable, list); sort(list); // assume the list does not change much, i.e. an item was added or removed int i = 0, n = list.size(); int j = 0, m = actions.size(); Set<Dockable> pendingActions = new HashSet<Dockable>(); for (Tuple<Dockable, DockAction> item : actions) { pendingActions.add(item.getA()); } while (i < n && j < m) { Dockable dockable = list.get(i); if (actions.get(j).getA() == dockable) { i++; j++; } else if (pendingActions.contains(dockable)) { actions.remove(j); m--; fireRemoved(j, j); } else { actions.add(j, new Tuple<Dockable, DockAction>(dockable, createActionFor(dockable))); m++; fireAdded(j, j); i++; j++; } pendingActions.remove(dockable); } if (j < m) { int length = m; while (j < m) { actions.remove(--m); } fireRemoved(j, length - 1); } if (i < n) { int index = i; while (i < n) { Dockable dockable = list.get(i++); actions.add(new Tuple<Dockable, DockAction>(dockable, createActionFor(dockable))); } fireAdded(index, actions.size() - 1); } } finally { onUpdateList = false; } }