void notifyListeners(Object created, Page modified, Object deleted) {
        Page root = null;
        if (created != null) root = findRoot(created);
        else if (modified != null) root = findRoot(modified);
        else if (deleted != null) root = findRoot(deleted);
        else throw new RuntimeException("Root was not found");

        List<TreeModelListener> listeners = root.modelListeners;
        for (TreeModelListener l : listeners) {
            if (created != null) {
                TreeModelEvent e = new TreeModelEvent(this, getPath(created));
                l.treeNodesInserted(e);
            }

            if (modified != null) {
                TreeModelEvent e = new TreeModelEvent(this, getPath(modified));
                l.treeNodesChanged(e);
            }

            if (deleted != null) {
                TreeModelEvent e = new TreeModelEvent(this, getPath(deleted));
                l.treeNodesRemoved(e);
                l.treeStructureChanged(new TreeModelEvent(this, getPath(root)));
            }
        }
    }