/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is NetBeans. The Initial Developer of the Original * Code is Sun Microsystems, Inc. Portions Copyright 1997-2003 Sun * Microsystems, Inc. All Rights Reserved. */ package org.openide.explorer.view; import java.util.*; import org.openide.nodes.*; /** List of Visualizers. This is holded by parent visualizer by a * weak reference, * * @author Jaroslav Tulach */ final class VisualizerChildren extends Object { /** parent visualizer */ public final VisualizerNode parent; /** list of all objects here (VisualizerNode) */ public final List list = new LinkedList (); /** Creates new VisualizerChildren. * Can be called only from EventQueue. */ public VisualizerChildren (VisualizerNode parent, Node[] nodes) { this.parent = parent; int s = nodes.length; for (int i = 0; i < s; i++) { VisualizerNode v = VisualizerNode.getVisualizer (this, nodes[i]); list.add (v); } } /** Notification of children addded event. Modifies the list of nodes * and fires info to all listeners. */ public void added (VisualizerEvent.Added ev) { ListIterator it = list.listIterator (); boolean empty = !it.hasNext (); int[] indxs = ev.getArray (); Node[] nodes = ev.getAdded (); int current = 0; int inIndxs = 0; while (inIndxs < indxs.length) { while (current++ < indxs[inIndxs]) { it.next (); } it.add (VisualizerNode.getVisualizer (this, nodes[inIndxs])); inIndxs++; } VisualizerNode parent = this.parent; while (parent != null) { Object[] listeners = parent.getListenerList (); for (int i = listeners.length - 1; i >= 0; i -= 2) { ((NodeModel)listeners[i]).added (ev); } parent = (VisualizerNode)parent.getParent (); } if (empty) { // change of state this.parent.notifyVisualizerChildrenChange (list.size (), this); } } /** Notification that children has been removed. Modifies the list of nodes * and fires info to all listeners. */ public void removed (VisualizerEvent.Removed ev) { List remList = Arrays.asList (ev.getRemovedNodes ()); Iterator it = list.iterator (); VisualizerNode vis; int[] indx = new int[remList.size ()]; int count = 0, remSize = 0; while (it.hasNext ()) { // take visualizer node vis = (VisualizerNode)it.next (); // check if it will removed if (remList.contains (vis.node)) { indx[remSize++] = count; // remove this VisualizerNode from children it.remove (); } count++; } // notify event about changed indexes ev.setRemovedIndicies (indx); VisualizerNode parent = this.parent; while (parent != null) { Object[] listeners = parent.getListenerList (); for (int i = listeners.length - 1; i >= 0; i -= 2) { ((NodeModel)listeners[i]).removed (ev); } parent = (VisualizerNode)parent.getParent (); } if (list.isEmpty ()) { // now is empty this.parent.notifyVisualizerChildrenChange (0, this); } } /** Notification that children has been reordered. Modifies the list of nodes * and fires info to all listeners. */ public void reordered (VisualizerEvent.Reordered ev) { int[] indxs = ev.getArray (); Object[] old = list.toArray (); Object[] arr = new Object[old.length]; int s = indxs.length; try { for (int i = 0; i < s; i++) { // arr[indxs[i]] = old[i]; Object old_i = old[i]; int indxs_i = indxs[i]; if (arr[indxs_i] != null) { // this is bad <-- we are rewriting some old value --> there will remain some null somewhere System.err.println("Writing to this index for the second time: " + indxs_i); // NOI18N System.err.println("Length of indxs array: " + indxs.length); // NOI18N System.err.println("Length of actual array: " + old.length); // NOI18N System.err.println("Indices of reorder event:"); // NOI18N for (int j = 0; i < indxs.length; j++) System.err.println("\t" + indxs[j]); // NOI18N Thread.dumpStack(); return; } arr[indxs_i] = old_i; } } catch (ArrayIndexOutOfBoundsException e) { e.printStackTrace(); System.err.println("Length of actual array: " + old.length); // NOI18N System.err.println("Indices of reorder event:"); // NOI18N for (int i = 0; i < indxs.length; i++) System.err.println("\t" + indxs[i]); // NOI18N return; } list.clear (); list.addAll (Arrays.asList (arr)); VisualizerNode parent = this.parent; while (parent != null) { Object[] listeners = parent.getListenerList (); for (int i = listeners.length - 1; i >= 0; i -= 2) { ((NodeModel)listeners[i]).reordered (ev); } parent = (VisualizerNode)parent.getParent (); } } }