20 package net.sf.gridarta.gui.mapmenu;
22 import java.io.IOException;
23 import java.util.ArrayDeque;
24 import java.util.Deque;
25 import javax.swing.JTree;
26 import javax.swing.event.TreeModelEvent;
27 import javax.swing.event.TreeModelListener;
28 import javax.swing.tree.DefaultMutableTreeNode;
29 import javax.swing.tree.DefaultTreeModel;
30 import javax.swing.tree.MutableTreeNode;
31 import javax.swing.tree.TreeNode;
32 import javax.swing.tree.TreePath;
37 import org.apache.log4j.Category;
38 import org.apache.log4j.Logger;
39 import org.jetbrains.annotations.NotNull;
40 import org.jetbrains.annotations.Nullable;
52 private static final Category
LOG = Logger.getLogger(
MapMenu.class);
64 private final DefaultMutableTreeNode
root =
new DefaultMutableTreeNode(
new MapMenuEntryDir(
"Bookmarks"),
true);
76 private final Deque<DeletedNode>
deletedNodes =
new ArrayDeque<>();
91 public void treeNodesChanged(
final TreeModelEvent e) {
96 public void treeNodesInserted(
final TreeModelEvent e) {
101 public void treeNodesRemoved(
final TreeModelEvent e) {
106 public void treeStructureChanged(
final TreeModelEvent e) {
118 if (
LOG.isDebugEnabled()) {
120 LOG.debug(System.identityHashCode(
this) +
" new " + key);
131 if (
LOG.isDebugEnabled()) {
132 LOG.debug(System.identityHashCode(
this) +
" load: root.removeAllChildren");
134 root.removeAllChildren();
135 for (
int i = 0; i < num; i++) {
139 }
catch (
final IOException ex) {
140 LOG.warn(
"dropping invalid bookmark: " + ex.getMessage());
167 for (
int i = num; i < prevNum; i++) {
179 private int saveEntries(@NotNull
final DefaultMutableTreeNode treeNode,
final int startIndex, @NotNull
final String
directory) {
180 final int[] index = { startIndex };
181 for (
int i = 0; i <
treeModel.getChildCount(treeNode); i++) {
182 final DefaultMutableTreeNode childTreeNode = (DefaultMutableTreeNode)
treeModel.getChild(treeNode, i);
184 final String title = childMapMenuEntry.
getTitle();
200 childMapMenuEntry.
visit(mapMenuEntryVisitor);
221 @SuppressWarnings(
"TypeMayBeWeakened")
223 if (
LOG.isDebugEnabled()) {
224 LOG.debug(System.identityHashCode(
this) +
" addMapMenuEntry(" +
directory +
", " + treeNode +
")");
227 DefaultMutableTreeNode dir2 =
root;
228 for (
final String path : paths) {
229 if (!path.isEmpty()) {
233 treeModel.insertNodeInto(treeNode, dir2, dir2.getChildCount());
234 return new TreePath(
treeModel.getPathToRoot(treeNode));
245 public DefaultMutableTreeNode
getOrCreateDirectory(@NotNull
final MutableTreeNode this2, @NotNull
final String path) {
247 if (
LOG.isDebugEnabled()) {
248 LOG.debug(System.identityHashCode(
this) +
" getOrCreateDirectory(" + this2 +
", " + path +
")=invalid directory name");
250 throw new IllegalArgumentException(
"invalid directory name '" + path +
"'");
253 for (
int i = this2.getChildCount() - 1; i >= 0; i--) {
254 final DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) this2.getChildAt(i);
257 if (
LOG.isDebugEnabled()) {
258 LOG.debug(System.identityHashCode(
this) +
" getOrCreateDirectory(" + this2 +
", " + path +
")=existing " + treeNode);
264 final DefaultMutableTreeNode new2 =
new DefaultMutableTreeNode(
new MapMenuEntryDir(path),
true);
265 treeModel.insertNodeInto(new2, this2, this2.getChildCount());
266 if (
LOG.isDebugEnabled()) {
267 LOG.debug(System.identityHashCode(
this) +
" getOrCreateDirectory(" + this2 +
", " + path +
")=new " + new2);
281 if (
LOG.isDebugEnabled()) {
282 LOG.debug(System.identityHashCode(
this) +
" insertNodeInto(" + mapEntry +
", " + parent +
", " + index +
")");
284 final DefaultMutableTreeNode treeNode =
new DefaultMutableTreeNode(mapEntry, mapEntry.allowsChildren());
285 treeModel.insertNodeInto(treeNode, parent, index);
287 return new TreePath(
treeModel.getPathToRoot(treeNode));
294 public void removeNode(@NotNull
final DefaultMutableTreeNode treeNode) {
295 if (treeNode ==
root) {
296 if (
LOG.isDebugEnabled()) {
297 LOG.debug(System.identityHashCode(
this) +
" removeNode: not removing root " + treeNode);
300 if (
LOG.isDebugEnabled()) {
301 LOG.debug(System.identityHashCode(
this) +
" removeNode " + treeNode);
304 treeModel.removeNodeFromParent(treeNode);
320 final TreeNode[] treePath =
treeModel.getPathToRoot(treeNode);
321 if (treePath ==
null) {
322 throw new IllegalArgumentException(
"tree node not found: " + treeNode);
324 final StringBuilder sb =
new StringBuilder();
325 for (
int i = 1; i + 1 < treePath.length; i++) {
326 final TreeNode tmp = treePath[i];
328 if (sb.length() > 0) {
361 int result = childCount;
362 for (
int i = 0; i < childCount; i++) {
363 final DefaultMutableTreeNode childTreeNode = (DefaultMutableTreeNode)
treeModel.getChild(
root, i);
366 result +=
size(childTreeNode);
369 if (
LOG.isDebugEnabled()) {
370 LOG.debug(System.identityHashCode(
this) +
" size(" +
root +
")=" + result);