Index: loaders/src/org/openide/loaders/FolderChildren.java =================================================================== RCS file: /cvs/openide/loaders/src/org/openide/loaders/FolderChildren.java,v retrieving revision 1.5 diff -u -r1.5 FolderChildren.java --- loaders/src/org/openide/loaders/FolderChildren.java 11 Jun 2004 08:34:21 -0000 1.5 +++ loaders/src/org/openide/loaders/FolderChildren.java 21 Sep 2004 07:06:43 -0000 @@ -40,19 +40,7 @@ private PropertyChangeListener listener; /** logging, if needed */ private ErrorManager err; - /** this is true between addNotify and removeNotify */ - private boolean active; - /** true if the refrersh is done after DataFilter change */ - private boolean refresh; - /** we wait for this task finished in getNodes(true) */ - private RequestProcessor.Task refreshTask; - /** Runnable scheduled to refRP */ - private ChildrenRefreshRunnable refreshRunnable; - - /** Private req processor for the refresh tasks */ - private static RequestProcessor refRP = - new RequestProcessor("FolderChildren_Refresh"); // NOI18N - + /** * @param f folder to display content of * @param map map to use for holding of children @@ -66,6 +54,7 @@ * @param filter filter of objects */ public FolderChildren (DataFolder f, DataFilter filter) { + super (0, 1); // we may hoave either zero or one node per key this.folder = f; this.filter = filter; this.listener = org.openide.util.WeakListeners.propertyChange (this, folder); @@ -85,8 +74,7 @@ public void propertyChange (final PropertyChangeEvent ev) { if (DataFolder.PROP_CHILDREN.equals (ev.getPropertyName ())) { if (err != null) err.log("Got PROP_CHILDREN"); - refreshChildren().schedule (0); - postClearTask(); + refreshChildren (); return; } if ( @@ -94,40 +82,13 @@ DataFolder.PROP_ORDER.equals (ev.getPropertyName ()) ) { if (err != null) err.log("Got PROP_SORT_MODE or PROP_ORDER"); - refreshChildren().schedule (0); - postClearTask(); + refreshChildren (); return; } } public void stateChanged( ChangeEvent e ) { - // Filtering changed need to recompute children - refresh = true; - refreshChildren().schedule(0); - postClearTask(); - return; - } - - /** - * refreshRunnable holds references to the data object - * to prevent GC. This method post a task to the same request processor - * (refRP) to clear this references after they are no longer needed. - */ - private void postClearTask() { - refRP.post(new Runnable() { - public void run() { - refreshRunnable.clear(); - } - }); - } - - /** Refreshes the children. - */ - synchronized RequestProcessor.Task refreshChildren() { - if (refreshTask == null) { - refreshTask = refRP.post(refreshRunnable = new ChildrenRefreshRunnable()); - } - return refreshTask; + refreshChildren (); } /** Create a node for one data object. @@ -135,74 +96,19 @@ */ protected Node[] createNodes (Object key) { if (err != null) err.log("createNodes: " + key); - FileObject fo = ((Pair)key).primaryFile; + FileObject fo = (FileObject)key; DataObject obj; try { obj = DataObject.find (fo); - if (filter == null || filter.acceptDataObject (obj)) { - return new Node[] { obj.getClonedNodeDelegate (filter) }; - } else { - return new Node[0]; + if (fo.equals (obj.getPrimaryFile ())) { + if (filter == null || filter.acceptDataObject (obj)) { + return new Node[] { obj.getClonedNodeDelegate (filter) }; + } } } catch (DataObjectNotFoundException e) { ErrorManager.getDefault ().notify (ErrorManager.INFORMATIONAL, e); - return new Node[0]; - } - } - - public Node[] getNodes(boolean optimalResult) { - if (optimalResult) { - if (checkChildrenMutex()) { - active = true; - FolderList.find(folder.getPrimaryFile(), true).waitProcessingFinished(); - Task task = refreshChildren(); - task.waitFinished(); - } else { - ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, - new IllegalStateException("getNodes(true) called while holding the Children.MUTEX") // NOI18N - ); - } - } - Node[] res = getNodes(); - refreshRunnable.clear(); // we can clean the references to data objects now - // they are no longer needed - return res; - } - - public Node findChild(String name) { - if (checkChildrenMutex()) { - getNodes(true); - } - return super.findChild(name); - } - - /** - * This code could probably be replaced by - * Children.MUTEX.isReadAccess, if such call would be added to Mutex - * @return true if it is safe to wait (our thread is - * not in Children.MUTEX.readAccess - */ - private static boolean checkChildrenMutex() { - class MutexChecker implements Runnable { - public boolean checkReadOrWrite; - public boolean inReadAccess = true; - public boolean inWriteAccess = true; - public void run () { - if (checkReadOrWrite) { - inReadAccess = false; - } else { - inWriteAccess = false; - } - } } - MutexChecker test = new MutexChecker(); - // the code will run either immediatally or after we leave readAccess - // section - Children.MUTEX.postWriteRequest(test); - test.checkReadOrWrite = true; - Children.MUTEX.postReadRequest(test); - - return !test.inReadAccess && !test.inWriteAccess; + return new Node[0]; } /** Initializes the children. @@ -214,8 +120,6 @@ if ( filter instanceof ChangeableDataFilter ) { ((ChangeableDataFilter)filter).addChangeListener( this ); } - // - active = true; // start the refresh task to compute the children refreshChildren(); } @@ -229,12 +133,7 @@ if ( filter instanceof ChangeableDataFilter ) { ((ChangeableDataFilter)filter).removeChangeListener( this ); } - // - active = false; - // we don't call the setKeys directly here because - // there can be a task spawned by refreshChildren - so - // we want to clear the children after that task is finished - refreshChildren(); + setKeys (Collections.EMPTY_LIST); } /** Display name */ @@ -242,78 +141,10 @@ return folder.getPrimaryFile ().toString (); } - /** - * Instances of this class are posted to the request processor refRP - * (FolderChildren_refresher). We do this because we do not want - * to call setKeys synchronously. - */ - private final class ChildrenRefreshRunnable implements Runnable { - /** store the referneces to the data objects to - * prevent GC. - */ - private DataObject[] ch; - - /** calls setKeys with the folder children - * or with empty collection if active is false - */ - public void run() { - - if (! active) { - setKeys (java.util.Collections.EMPTY_SET); - return; - } - ch = folder.getChildren(); - Object []keys = new Object[ch.length]; - for (int i = 0; i < keys.length; i++) { - keys[i] = new Pair(ch[i].getPrimaryFile()); - } - setKeys(Arrays.asList(keys)); - - if ( refresh ) { - refresh = false; - for (int i = 0; i < keys.length; i++) { - refreshKey( keys[i] ); - } - } - } - - /** stop holding the references to the data objects. After - * calling this they can be GCed again. - */ - public void clear() { - ch = null; - } - } - - /** Pair of dataobject invalidation sequence # and primary file. - * It serves as a key for the given data object. - * It is here to create something different then data object, - * because the data object should be finalized when not needed and - * that is why it should not be used as a key. - */ - private static final class Pair extends Object { - public FileObject primaryFile; - public int seq; - - public Pair (FileObject primaryFile) { - this.primaryFile = primaryFile; - this.seq = DataObjectPool.getPOOL().registrationCount(primaryFile); - } - - public int hashCode () { - return primaryFile.hashCode () ^ seq; - } - - public boolean equals (Object o) { - if (o instanceof Pair) { - Pair p = (Pair)o; - return primaryFile.equals (p.primaryFile) && seq == p.seq; - } - return false; - } - - public String toString() { - return "FolderChildren.Pair[" + primaryFile + "," + seq + "]"; // NOI18N - } + private void refreshChildren () { + FileObject[] arr = folder.getPrimaryFile ().getChildren (); + FolderOrder order = FolderOrder.findFor (folder.getPrimaryFile ()); + Arrays.sort (arr, order); + setKeys (arr); } } Index: loaders/src/org/openide/loaders/FolderComparator.java =================================================================== RCS file: /cvs/openide/loaders/src/org/openide/loaders/FolderComparator.java,v retrieving revision 1.6 diff -u -r1.6 FolderComparator.java --- loaders/src/org/openide/loaders/FolderComparator.java 18 Aug 2004 13:54:45 -0000 1.6 +++ loaders/src/org/openide/loaders/FolderComparator.java 21 Sep 2004 07:06:43 -0000 @@ -55,67 +55,72 @@ } /** Comparing method. Can compare two DataObjects - * or two Nodes (if they have data object cookie) + * or two Nodes (if they have data object cookie) or two FileObjects. */ public int compare (Object o1, Object o2) { - DataObject obj1; - DataObject obj2; - - if (o1 instanceof Node) { - obj1 = (DataObject)((Node)o1).getCookie (DataObject.class); - obj2 = (DataObject)((Node)o2).getCookie (DataObject.class); - } else { - obj1 = (DataObject)o1; - obj2 = (DataObject)o2; - } - switch (mode) { case NONE: return 0; case NAMES: - return compareNames (obj1, obj2); + return compareNames (o1, o2); case CLASS: - return compareClass (obj1, obj2); + return compareClass (o1, o2); case FOLDER_NAMES: - return compareFoldersFirst (obj1, obj2); + return compareFoldersFirst (o1, o2); case LAST_MODIFIED: - return compareLastModified(obj1, obj2); + return compareLastModified(o1, o2); case SIZE: - return compareSize(obj1, obj2); + return compareSize(o1, o2); default: assert false : mode; return 0; } } + static FileObject findFileObject (Object o) { + if (o instanceof FileObject) return (FileObject)o; + if (o instanceof DataObject) return ((DataObject)o).getPrimaryFile (); + Node n = (Node)o; + DataObject obj = (DataObject)n.getCookie (DataObject.class); + return obj.getPrimaryFile (); + } + private static DataObject findDataObject (Object o) { + if (o instanceof DataObject) return (DataObject)o; + if (o instanceof FileObject) { + try { + return DataObject.find ((FileObject)o); + } catch (DataObjectNotFoundException ex) { + return null; + } + } + Node n = (Node)o; + DataObject obj = (DataObject)n.getCookie (DataObject.class); + return obj; + } /** for sorting data objects by names */ - private int compareNames (DataObject obj1, DataObject obj2) { - // #35069 - use extension for sorting if displayname is same. - // Otherwise the order of files is random. - int part = obj1.getName().compareTo(obj2.getName()); - return part != 0 ? part : - obj1.getPrimaryFile().getExt().compareTo(obj2.getPrimaryFile().getExt()); + private int compareNames (Object o1, Object o2) { + return findFileObject (o1).getNameExt ().compareTo (findFileObject (o2).getNameExt ()); } /** for sorting folders first and then by names */ - private int compareFoldersFirst (DataObject obj1, DataObject obj2) { - if (obj1.getClass () != obj2.getClass ()) { - // if classes are different than the folder goes first - if (obj1 instanceof DataFolder) { - return -1; - } - if (obj2 instanceof DataFolder) { - return 1; - } + private int compareFoldersFirst (Object o1, Object o2) { + boolean f1 = findFileObject (o1).isFolder (); + boolean f2 = findFileObject (o2).isFolder (); + + if (f1 != f2) { + if (f1) return -1; + if (f2) return 1; } - // otherwise compare by names - return compareNames(obj1, obj2); + return compareNames(o1, o2); } /** for sorting data objects by their classes */ - private int compareClass (DataObject obj1, DataObject obj2) { + private int compareClass (Object o1, Object o2) { + DataObject obj1 = findDataObject (o1); + DataObject obj2 = findDataObject (o2); + Class c1 = obj1.getClass (); Class c2 = obj2.getClass (); @@ -150,58 +155,52 @@ /** * Sort folders alphabetically first. Then files, newest to oldest. */ - private static int compareLastModified(DataObject obj1, DataObject obj2) { - if (obj1 instanceof DataFolder) { - if (obj2 instanceof DataFolder) { - return obj1.getName().compareTo(obj2.getName()); - } else { - return -1; - } + private static int compareLastModified(Object o1, Object o2) { + boolean f1 = findFileObject (o1).isFolder (); + boolean f2 = findFileObject (o2).isFolder (); + + if (f1 != f2) { + if (f1) return -1; + if (f2) return 1; + } + + + FileObject fo1 = findFileObject (o1); + FileObject fo2 = findFileObject (o2); + Date d1 = fo1.lastModified(); + Date d2 = fo2.lastModified(); + if (d1.after(d2)) { + return -1; + } else if (d2.after(d1)) { + return 1; } else { - if (obj2 instanceof DataFolder) { - return 1; - } else { - FileObject fo1 = obj1.getPrimaryFile(); - FileObject fo2 = obj2.getPrimaryFile(); - Date d1 = fo1.lastModified(); - Date d2 = fo2.lastModified(); - if (d1.after(d2)) { - return -1; - } else if (d2.after(d1)) { - return 1; - } else { - return fo1.getNameExt().compareTo(fo2.getNameExt()); - } - } + return fo1.getNameExt().compareTo(fo2.getNameExt()); } } /** * Sort folders alphabetically first. Then files, biggest to smallest. */ - private static int compareSize(DataObject obj1, DataObject obj2) { - if (obj1 instanceof DataFolder) { - if (obj2 instanceof DataFolder) { - return obj1.getName().compareTo(obj2.getName()); - } else { - return -1; - } + private static int compareSize(Object o1, Object o2) { + boolean f1 = findFileObject (o1).isFolder (); + boolean f2 = findFileObject (o2).isFolder (); + + if (f1 != f2) { + if (f1) return -1; + if (f2) return 1; + } + + + FileObject fo1 = findFileObject (o1); + FileObject fo2 = findFileObject (o2); + long s1 = fo1.getSize(); + long s2 = fo2.getSize(); + if (s1 > s2) { + return -1; + } else if (s2 > s1) { + return 1; } else { - if (obj2 instanceof DataFolder) { - return 1; - } else { - FileObject fo1 = obj1.getPrimaryFile(); - FileObject fo2 = obj2.getPrimaryFile(); - long s1 = fo1.getSize(); - long s2 = fo2.getSize(); - if (s1 > s2) { - return -1; - } else if (s2 > s1) { - return 1; - } else { - return fo1.getNameExt().compareTo(fo2.getNameExt()); - } - } + return fo1.getNameExt().compareTo(fo2.getNameExt()); } } Index: loaders/src/org/openide/loaders/FolderOrder.java =================================================================== RCS file: /cvs/openide/loaders/src/org/openide/loaders/FolderOrder.java,v retrieving revision 1.4 diff -u -r1.4 FolderOrder.java --- loaders/src/org/openide/loaders/FolderOrder.java 7 Jun 2004 08:28:09 -0000 1.4 +++ loaders/src/org/openide/loaders/FolderOrder.java 21 Sep 2004 07:06:43 -0000 @@ -181,21 +181,18 @@ } return s; } - + /** Compares two data object or two nodes. */ public int compare (Object o1, Object o2) { - DataObject obj1 = (DataObject) o1; - DataObject obj2 = (DataObject) o2; - - Integer i1 = (order == null) ? null : (Integer)order.get (obj1.getPrimaryFile ().getNameExt ()); - Integer i2 = (order == null) ? null : (Integer)order.get (obj2.getPrimaryFile ().getNameExt ()); + Integer i1 = (order == null) ? null : (Integer)order.get (FolderComparator.findFileObject (o1).getNameExt ()); + Integer i2 = (order == null) ? null : (Integer)order.get (FolderComparator.findFileObject (o2).getNameExt ()); if (i1 == null) { if (i2 != null) return 1; // compare by the provided comparator - return getSortMode ().compare (obj1, obj2); + return getSortMode ().compare (o1, o2); } else { if (i2 == null) return -1; // compare integers Index: src/org/openide/explorer/view/TreeView.java =================================================================== RCS file: /cvs/openide/src/org/openide/explorer/view/TreeView.java,v retrieving revision 1.164 diff -u -r1.164 TreeView.java --- src/org/openide/explorer/view/TreeView.java 1 Jun 2004 14:00:39 -0000 1.164 +++ src/org/openide/explorer/view/TreeView.java 21 Sep 2004 07:06:52 -0000 @@ -188,6 +188,7 @@ // Init of the editor tree.setCellEditor(new TreeViewCellEditor(tree)); tree.setEditable(true); + tree.setLargeModel (true); // set selection mode to DISCONTIGUOUS_TREE_SELECTION as default setSelectionMode (TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); @@ -725,8 +726,9 @@ if (node == null) { showNormalCursor (); } - + /* showWaitCursor (); + RequestProcessor.getDefault ().post (new Runnable () { public void run () { try { @@ -740,6 +742,7 @@ } } }); + */ } /** Synchronize the selected nodes from the manager of this Explorer. @@ -1193,6 +1196,15 @@ getInputMap().put(KeyStroke.getKeyStroke("CUT"), "none"); // NOI18N setupSearch(); + } + + public boolean isLargeModel () { + return true; + } + + public int getRowHeight () { + int i = super.getRowHeight (); + return Math.max (16, i); } private boolean firstPaint = true;