Re: [Jajuk-dev] [Jajuk-commits] SF.net SVN: jajuk:[5539] trunk/jajuk/src
Your Advanced jukebox
Brought to you by:
bflorat
From: Bertrand F. <ber...@fl...> - 2009-11-22 21:18:27
|
On the Directory issue, if it's not a 1.9 regression, it probaly needs to be backported to 1.8 branch (I'm currently working on fixes for a 1.8.3 release in few weeks). Thanks On Sun, Nov 22, 2009 at 4:01 PM, <ce...@us...> wrote: > Revision: 5539 > http://jajuk.svn.sourceforge.net/jajuk/?rev=5539&view=rev > Author: centic > Date: 2009-11-22 15:01:36 +0000 (Sun, 22 Nov 2009) > > Log Message: > ----------- > try to reduce memory usage in the FileTreeView fundamentally by using > LazyLoading: > - Collection: set top-directory on Device to allow to find sub-directories > from the Device, the interface was already there in Device, it just was > never used until now > - Directory: Fix a severe bug when looking for Playlists, comparing String > with File will never be equal! > - Add base classes for LazyLoading in a JTree > - Allow AbstractTreeView to use lazy loading if specified. > - Remove the storing of the object and the "getData()" interface and use > "getUserObject()" which is already available in the base-class > DefaultMutableTreeNode > - TracksTreeView: remove unused array of selected items > - TODO: a similar thing can be done for TracksTreeView, but this does not > show up as major memory issue in EclipseMemoryAnalyzer right now... > > Modified Paths: > -------------- > trunk/jajuk/src/main/java/org/jajuk/base/Collection.java > trunk/jajuk/src/main/java/org/jajuk/base/Directory.java > > trunk/jajuk/src/main/java/org/jajuk/ui/helpers/PlaylistEditorTransferHandler.java > trunk/jajuk/src/main/java/org/jajuk/ui/helpers/TransferableAlbum.java > trunk/jajuk/src/main/java/org/jajuk/ui/helpers/TransferableTableRow.java > trunk/jajuk/src/main/java/org/jajuk/ui/helpers/TransferableTreeNode.java > trunk/jajuk/src/main/java/org/jajuk/ui/views/AbstractTreeView.java > trunk/jajuk/src/main/java/org/jajuk/ui/views/FilesTreeView.java > trunk/jajuk/src/main/java/org/jajuk/ui/views/TracksTreeView.java > trunk/jajuk/src/test/java/org/jajuk/ui/views/TestTracksTreeView.java > > Added Paths: > ----------- > > trunk/jajuk/src/main/java/org/jajuk/ui/helpers/LazyLoadingTreeExpander.java > trunk/jajuk/src/main/java/org/jajuk/ui/helpers/LazyLoadingTreeNode.java > > Modified: trunk/jajuk/src/main/java/org/jajuk/base/Collection.java > =================================================================== > --- trunk/jajuk/src/main/java/org/jajuk/base/Collection.java 2009-11-19 > 22:23:33 UTC (rev 5538) > +++ trunk/jajuk/src/main/java/org/jajuk/base/Collection.java 2009-11-22 > 15:01:36 UTC (rev 5539) > @@ -698,6 +698,11 @@ > Directory directory = > DirectoryManager.getInstance().registerDirectory(sRightID, > sItemName, dParent, device); > directory.populateProperties(attributes); > + > + // also remember top-level directories at the device > + if(dParent == null) { > + device.addDirectory(directory); > + } > } > > /** > > Modified: trunk/jajuk/src/main/java/org/jajuk/base/Directory.java > =================================================================== > --- trunk/jajuk/src/main/java/org/jajuk/base/Directory.java 2009-11-19 > 22:23:33 UTC (rev 5538) > +++ trunk/jajuk/src/main/java/org/jajuk/base/Directory.java 2009-11-22 > 15:01:36 UTC (rev 5539) > @@ -184,7 +184,7 @@ > ReadOnlyIterator<Playlist> it = > PlaylistManager.getInstance().getPlaylistsIterator(); > while (it.hasNext()) { > Playlist plf = it.next(); > - if (plf.getFIO().getParent().equals(this.getFio())) { > + if (plf.getFIO().getParentFile().equals(this.getFio())) { > out.add(plf); > } > } > > Added: > trunk/jajuk/src/main/java/org/jajuk/ui/helpers/LazyLoadingTreeExpander.java > =================================================================== > --- > trunk/jajuk/src/main/java/org/jajuk/ui/helpers/LazyLoadingTreeExpander.java > (rev 0) > +++ > trunk/jajuk/src/main/java/org/jajuk/ui/helpers/LazyLoadingTreeExpander.java > 2009-11-22 15:01:36 UTC (rev 5539) > @@ -0,0 +1,76 @@ > +package org.jajuk.ui.helpers; > + > +import javax.swing.event.TreeExpansionEvent; > +import javax.swing.event.TreeWillExpandListener; > +import javax.swing.tree.DefaultMutableTreeNode; > +import javax.swing.tree.DefaultTreeModel; > +import javax.swing.tree.ExpandVetoException; > +import javax.swing.tree.MutableTreeNode; > +import javax.swing.tree.TreePath; > + > + > +/** > + * This class handles the lazy loading of nodes. It calls the necessary > methods > + * on the current tree node to ask it for it's actual children. > + * > + * Note: This implementation is rather simple and targeted for the current > use > + * in Jajuk where the expanding of the node is usually a quick (in-memory) > + * operation. This implementation is not fully usable for cases where it > takes > + * some time to retrieve the data, e.g. when there are database or other > remote > + * requests involved. > + */ > +public class LazyLoadingTreeExpander implements TreeWillExpandListener { > + /** Tree Model */ > + private DefaultTreeModel model; > + > + /** > + * Default constructor > + * > + * @param model > + * Tree model > + */ > + public LazyLoadingTreeExpander(DefaultTreeModel model) { > + this.model = model; > + } > + > + public void treeWillCollapse(TreeExpansionEvent event) throws > ExpandVetoException { > + // Do nothing on collapse. > + } > + > + /** > + * Invoked whenever a node in the tree is about to be expanded. > + * > + * If the Node is a LazyLoadingTreeNode load it's children. > + */ > + public void treeWillExpand(TreeExpansionEvent event) throws > ExpandVetoException { > + TreePath path = event.getPath(); > + Object lastPathComponent = path.getLastPathComponent(); > + if (lastPathComponent instanceof LazyLoadingTreeNode) { > + LazyLoadingTreeNode lazyNode = (LazyLoadingTreeNode) > lastPathComponent; > + > + if (!lazyNode.areChildrenLoaded()) { > + MutableTreeNode[] nodes = lazyNode.loadChildren(model); > + ((DefaultMutableTreeNode) lazyNode).setAllowsChildren(nodes != > null && nodes.length > 0); > + setChildren(lazyNode, nodes); > + } > + } > + } > + > + /** > + * Define nodes children > + * > + * @param nodes > + * new nodes > + */ > + private void setChildren(LazyLoadingTreeNode lazyNode, > MutableTreeNode... nodes) { > + int childCount = lazyNode.getChildCount(); > + if (childCount > 0) { > + for (int i = 0; i < childCount; i++) { > + model.removeNodeFromParent((MutableTreeNode) > lazyNode.getChildAt(0)); > + } > + } > + for (int i = 0; nodes != null && i < nodes.length; i++) { > + model.insertNodeInto(nodes[i], lazyNode, i); > + } > + } > +} > > Added: > trunk/jajuk/src/main/java/org/jajuk/ui/helpers/LazyLoadingTreeNode.java > =================================================================== > --- trunk/jajuk/src/main/java/org/jajuk/ui/helpers/LazyLoadingTreeNode.java > (rev 0) > +++ trunk/jajuk/src/main/java/org/jajuk/ui/helpers/LazyLoadingTreeNode.java > 2009-11-22 15:01:36 UTC (rev 5539) > @@ -0,0 +1,82 @@ > +/* > + * Jajuk > + * Copyright (C) 2003-2009 The Jajuk Team > + * http://jajuk.info > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License > + * as published by the Free Software Foundation; either version 2 > + * of the License, or any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, > USA. > + * $Revision: 3132 $ > + */ > +package org.jajuk.ui.helpers; > + > +import javax.swing.SwingUtilities; > +import javax.swing.tree.DefaultTreeModel; > +import javax.swing.tree.MutableTreeNode; > + > +/** > + * Abstract class that is used to load TreeNodes lazily, i.e. in large > trees > + * with many sub-branches this can reduce the number of nodes that are > actually > + * created a lot. > + */ > +public abstract class LazyLoadingTreeNode extends TransferableTreeNode { > + private static final long serialVersionUID = 1L; > + > + /** > + * Instantiates a new transferable tree node. > + * > + * @param userObject > + * an Object provided by the user that constitutes the node's > data > + * > + * @param model > + * The model from the JTree is required during lazy loading of > + * child-nodes. > + */ > + public LazyLoadingTreeNode(Object userObject) { > + super(userObject); > + setAllowsChildren(true); > + } > + > + /** > + * Check if there are children loaded already. > + * > + * @return <code>true</code> if there are some childrens > + */ > + public boolean areChildrenLoaded() { > + return getChildCount() > 0 && getAllowsChildren(); > + } > + > + /** > + * If the > + * @see #getAllowsChildren() > + * @return false, this node can't be a leaf > + */ > + @Override > + public boolean isLeaf() { > + return !getAllowsChildren(); > + } > + > + /** > + * This is the point where the actual implementation can create the > actual > + * child nodes of the current node at the point when the node is > expanded. > + * > + * This method will be executed in a background thread. If you have to > do some > + * GUI stuff use {@link SwingUtilities#invokeLater(Runnable)} > + * > + * @param tree > + * The model of the tree. > + * > + * @return The created nodes. > + */ > + public abstract MutableTreeNode[] loadChildren(DefaultTreeModel model); > +} > > Modified: > trunk/jajuk/src/main/java/org/jajuk/ui/helpers/PlaylistEditorTransferHandler.java > =================================================================== > --- > trunk/jajuk/src/main/java/org/jajuk/ui/helpers/PlaylistEditorTransferHandler.java > 2009-11-19 22:23:33 UTC (rev 5538) > +++ > trunk/jajuk/src/main/java/org/jajuk/ui/helpers/PlaylistEditorTransferHandler.java > 2009-11-22 15:01:36 UTC (rev 5539) > @@ -132,17 +132,17 @@ > TransferableTableRow.ROW_FLAVOR.getHumanPresentableName())) { > TransferableTableRow ttr = (TransferableTableRow) t > .getTransferData(TransferableTableRow.ROW_FLAVOR); > - oData = ttr.getData(); > + oData = ttr.getUserObject(); > } else if (flavor.getHumanPresentableName().equals( > TransferableTreeNode.NODE_FLAVOR.getHumanPresentableName())) { > TransferableTreeNode ttn = (TransferableTreeNode) t > .getTransferData(TransferableTreeNode.NODE_FLAVOR); > - oData = ttn.getData(); > + oData = ttn.getUserObject(); > } else if (flavor.getHumanPresentableName().equals( > TransferableAlbum.ALBUM_FLAVOR.getHumanPresentableName())) { > TransferableAlbum ttn = (TransferableAlbum) t > .getTransferData(TransferableAlbum.ALBUM_FLAVOR); > - oData = ttn.getData(); > + oData = ttn.getUserObject(); > } > List<File> alSelectedFiles = UtilFeatures.getPlayableFiles((Item) > oData); > // queue case > > Modified: > trunk/jajuk/src/main/java/org/jajuk/ui/helpers/TransferableAlbum.java > =================================================================== > --- trunk/jajuk/src/main/java/org/jajuk/ui/helpers/TransferableAlbum.java > 2009-11-19 22:23:33 UTC (rev 5538) > +++ trunk/jajuk/src/main/java/org/jajuk/ui/helpers/TransferableAlbum.java > 2009-11-22 15:01:36 UTC (rev 5539) > @@ -41,27 +41,15 @@ > public static final DataFlavor ALBUM_FLAVOR = new DataFlavor( > DataFlavor.javaJVMLocalObjectMimeType, "Album"); > > - /** DOCUMENT_ME. */ > - private final Object oData; > - > /** > * Instantiates a new transferable album. > * > * @param oData DOCUMENT_ME > */ > public TransferableAlbum(Object oData) { > - this.oData = oData; > + super(oData); > } > > - /** > - * Gets the data. > - * > - * @return the data > - */ > - public Object getData() { > - return oData; > - } > - > /** DOCUMENT_ME. */ > private final DataFlavor[] flavors = { ALBUM_FLAVOR }; > > > Modified: > trunk/jajuk/src/main/java/org/jajuk/ui/helpers/TransferableTableRow.java > =================================================================== > --- > trunk/jajuk/src/main/java/org/jajuk/ui/helpers/TransferableTableRow.java > 2009-11-19 22:23:33 UTC (rev 5538) > +++ > trunk/jajuk/src/main/java/org/jajuk/ui/helpers/TransferableTableRow.java > 2009-11-22 15:01:36 UTC (rev 5539) > @@ -41,27 +41,15 @@ > public static final DataFlavor ROW_FLAVOR = new > DataFlavor(DataFlavor.javaJVMLocalObjectMimeType, > "Row"); > > - /** DOCUMENT_ME. */ > - private final Object oData; > - > /** > * Instantiates a new transferable table row. > * > * @param oData DOCUMENT_ME > */ > public TransferableTableRow(Object oData) { > - this.oData = oData; > + super(oData); > } > > - /** > - * Gets the data. > - * > - * @return the data > - */ > - public Object getData() { > - return oData; > - } > - > /** DOCUMENT_ME. */ > private final DataFlavor[] flavors = { ROW_FLAVOR }; > > > Modified: > trunk/jajuk/src/main/java/org/jajuk/ui/helpers/TransferableTreeNode.java > =================================================================== > --- > trunk/jajuk/src/main/java/org/jajuk/ui/helpers/TransferableTreeNode.java > 2009-11-19 22:23:33 UTC (rev 5538) > +++ > trunk/jajuk/src/main/java/org/jajuk/ui/helpers/TransferableTreeNode.java > 2009-11-22 15:01:36 UTC (rev 5539) > @@ -32,7 +32,7 @@ > /** > * Transferable tree node ( for DND ). > */ > -public class TransferableTreeNode extends DefaultMutableTreeNode > implements Transferable { > +public abstract class TransferableTreeNode extends DefaultMutableTreeNode > implements Transferable { > > /** Generated serialVersionUID. */ > private static final long serialVersionUID = 1L; > @@ -41,27 +41,16 @@ > public static final DataFlavor NODE_FLAVOR = new DataFlavor( > DataFlavor.javaJVMLocalObjectMimeType, "Node"); > > - /** DOCUMENT_ME. */ > - private final Object oData; > - > /** > * Instantiates a new transferable tree node. > * > - * @param oData DOCUMENT_ME > + * @param userObject an Object provided by the user that constitutes > + * the node's data > */ > - public TransferableTreeNode(Object oData) { > - this.oData = oData; > + public TransferableTreeNode(Object userObject) { > + super(userObject); > } > > - /** > - * Gets the data. > - * > - * @return the data > - */ > - public Object getData() { > - return oData; > - } > - > /** DOCUMENT_ME. */ > private final DataFlavor[] flavors = { NODE_FLAVOR }; > > > Modified: > trunk/jajuk/src/main/java/org/jajuk/ui/views/AbstractTreeView.java > =================================================================== > --- trunk/jajuk/src/main/java/org/jajuk/ui/views/AbstractTreeView.java > 2009-11-19 22:23:33 UTC (rev 5538) > +++ trunk/jajuk/src/main/java/org/jajuk/ui/views/AbstractTreeView.java > 2009-11-22 15:01:36 UTC (rev 5539) > @@ -38,6 +38,7 @@ > import javax.swing.SwingUtilities; > import javax.swing.SwingWorker; > import javax.swing.tree.DefaultMutableTreeNode; > +import javax.swing.tree.DefaultTreeModel; > import javax.swing.tree.TreePath; > import javax.swing.tree.TreeSelectionModel; > > @@ -138,20 +139,29 @@ > boolean bAutoCollapse = false; > > /** > - * Creates the tree. > - * DOCUMENT_ME > + * Creates the tree. DOCUMENT_ME > * > * @return the j tree > */ > - protected JTree createTree() { > + protected JTree createTree(boolean bLazy) { > jtree = new JXTree(top); > jtree.putClientProperty("JTree.lineStyle", "Angled"); > > jtree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); > setKeystrokes(); > + > + // set the special controller for doing lazy loading if used for this > View > + if (bLazy) { > + final org.jajuk.ui.helpers.LazyLoadingTreeExpander controller = new > org.jajuk.ui.helpers.LazyLoadingTreeExpander( > + (DefaultTreeModel) jtree.getModel()); > + jtree.addTreeWillExpandListener(controller); > + } > + > return jtree; > } > > - /* (non-Javadoc) > + /* > + * (non-Javadoc) > + * > * @see org.jajuk.ui.views.IView#initUI() > */ > public void initUI() { > @@ -194,14 +204,12 @@ > } > > /** > - * Populate tree. > - * DOCUMENT_ME > + * Populate tree. DOCUMENT_ME > */ > abstract void populateTree(); > > /** > - * Expand. > - * DOCUMENT_ME > + * Expand. DOCUMENT_ME > */ > abstract void expand(); > > @@ -239,7 +247,9 @@ > actionMap.put("rename", action); > } > > - /* (non-Javadoc) > + /* > + * (non-Javadoc) > + * > * @see org.jajuk.events.Observer#update(org.jajuk.events.JajukEvent) > */ > public void update(JajukEvent event) { > > Modified: trunk/jajuk/src/main/java/org/jajuk/ui/views/FilesTreeView.java > =================================================================== > --- trunk/jajuk/src/main/java/org/jajuk/ui/views/FilesTreeView.java > 2009-11-19 22:23:33 UTC (rev 5538) > +++ trunk/jajuk/src/main/java/org/jajuk/ui/views/FilesTreeView.java > 2009-11-22 15:01:36 UTC (rev 5539) > @@ -32,10 +32,8 @@ > import java.net.URL; > import java.util.ArrayList; > import java.util.Enumeration; > -import java.util.HashMap; > import java.util.HashSet; > import java.util.List; > -import java.util.Map; > import java.util.Properties; > import java.util.Set; > > @@ -52,6 +50,8 @@ > import javax.swing.event.TreeSelectionEvent; > import javax.swing.event.TreeSelectionListener; > import javax.swing.tree.DefaultMutableTreeNode; > +import javax.swing.tree.DefaultTreeModel; > +import javax.swing.tree.MutableTreeNode; > import javax.swing.tree.TreePath; > > import org.jajuk.base.Device; > @@ -62,7 +62,6 @@ > import org.jajuk.base.FileManager; > import org.jajuk.base.Item; > import org.jajuk.base.Playlist; > -import org.jajuk.base.PlaylistManager; > import org.jajuk.base.Type; > import org.jajuk.base.TypeManager; > import org.jajuk.events.JajukEvent; > @@ -75,6 +74,7 @@ > import org.jajuk.ui.actions.RefactorAction; > import org.jajuk.ui.helpers.FontManager; > import org.jajuk.ui.helpers.ItemMoveManager; > +import org.jajuk.ui.helpers.LazyLoadingTreeNode; > import org.jajuk.ui.helpers.TransferableTreeNode; > import org.jajuk.ui.helpers.TreeRootElement; > import org.jajuk.ui.helpers.TreeTransferHandler; > @@ -88,7 +88,6 @@ > import org.jajuk.util.IconLoader; > import org.jajuk.util.JajukIcons; > import org.jajuk.util.Messages; > -import org.jajuk.util.ReadOnlyIterator; > import org.jajuk.util.UtilFeatures; > import org.jajuk.util.UtilGUI; > import org.jajuk.util.UtilSystem; > @@ -192,7 +191,9 @@ > public FilesTreeView() { > } > > - /* (non-Javadoc) > + /* > + * (non-Javadoc) > + * > * @see org.jajuk.events.Observer#getRegistrationKeys() > */ > public Set<JajukEvents> getRegistrationKeys() { > @@ -310,7 +311,7 @@ > populateTree(); > > // create tree > - createTree(); > + createTree(true); > > /** > * CAUTION ! we register several listeners against this tree Swing > can't > @@ -343,75 +344,21 @@ > @Override > public synchronized void populateTree() { > top.removeAllChildren(); > - // add devices > + // add all devices as "LazyLoading" nodes so all subsequent elements > are > + // only > + // populated if necessary > List<Device> devices = DeviceManager.getInstance().getDevices(); > for (Device device : devices) { > DefaultMutableTreeNode nodeDevice = new DeviceNode(device); > top.add(nodeDevice); > } > - /* > - * Add directories (do not use an iterator here but a shallow copy as > - * concurrent modifications are likely to happen) > - */ > - List<Directory> dirs = > DirectoryManager.getInstance().getDirectories(); > - for (Directory directory : dirs) { > - if (directory.shouldBeHidden()) { > - continue; > - } > - // if device root directory, do not display > - if (directory.getParentDirectory() != null) { > - // parent directory is a device > - if (directory.getParentDirectory().getParentDirectory() == null) { > - DeviceNode deviceNode = > DeviceNode.getDeviceNode(directory.getDevice()); > - deviceNode.add(new DirectoryNode(directory)); > - } else { // parent directory not root > - DirectoryNode parentDirectoryNode = > DirectoryNode.getDirectoryNode(directory > - .getParentDirectory()); > - parentDirectoryNode.add(new DirectoryNode(directory)); > - } > - } > - } > - // add files > - ReadOnlyIterator<File> files = > FileManager.getInstance().getFilesIterator(); > - while (files.hasNext()) { > - File file = files.next(); > - if (file.shouldBeHidden()) { // should be hidden by option > - continue; > - } > - DirectoryNode directoryNode = > DirectoryNode.getDirectoryNode(file.getDirectory()); > - if (directoryNode == null) { > - // means this file is at root of a device > - DeviceNode deviceNode = > DeviceNode.getDeviceNode(file.getDevice()); > - deviceNode.add(new FileNode(file)); > - } else { > - // this file is in a regular directory > - directoryNode.add(new FileNode(file)); > - } > - } > - // add playlists > - ReadOnlyIterator<Playlist> playlists = > PlaylistManager.getInstance().getPlaylistsIterator(); > - while (playlists.hasNext()) { > - Playlist playlistFile = playlists.next(); > - // should be hidden by option > - if (playlistFile.shouldBeHidden()) { > - continue; > - } > - DirectoryNode directoryNode = > DirectoryNode.getDirectoryNode(playlistFile.getDirectory()); > - if (directoryNode == null) { > - // Add the playlist under the device node > - DeviceNode deviceNode = > DeviceNode.getDeviceNode(playlistFile.getDirectory().getDevice()); > - deviceNode.add(new PlaylistFileNode(playlistFile)); > - } else { > - // Add the playlist under a common directory node > - directoryNode.add(new PlaylistFileNode(playlistFile)); > - } > - } > } > > /* > * (non-Javadoc) > * > - * @see > java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) > + * @see > + * > java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) > */ > public void actionPerformed(final ActionEvent e) { > // multiple selection on properties(note we handle files and dirs > @@ -523,10 +470,14 @@ > * </p> > * <p> > * When unmounting a device from the tree, the device node is collapsed > - * </p>. > + * </p> > + * . > */ > @Override > void expand() { > + // make sure the main element is expanded > + jtree.expandRow(0); > + > // begin by expanding all needed devices and directory, only after, > // collapse unmounted devices if required > for (int i = 0; i < jtree.getRowCount(); i++) { > @@ -554,7 +505,9 @@ > */ > class FilesMouseAdapter extends MouseAdapter { > > - /* (non-Javadoc) > + /* > + * (non-Javadoc) > + * > * @see > java.awt.event.MouseAdapter#mousePressed(java.awt.event.MouseEvent) > */ > @Override > @@ -603,7 +556,9 @@ > } > } > > - /* (non-Javadoc) > + /* > + * (non-Javadoc) > + * > * @see > java.awt.event.MouseAdapter#mouseReleased(java.awt.event.MouseEvent) > */ > @Override > @@ -614,10 +569,10 @@ > } > > /** > - * Handle popup. > - * DOCUMENT_ME > + * Handle popup. DOCUMENT_ME > * > - * @param e DOCUMENT_ME > + * @param e > + * DOCUMENT_ME > */ > @SuppressWarnings("unchecked") > public void handlePopup(final MouseEvent e) { > @@ -820,9 +775,13 @@ > * DOCUMENT_ME. > */ > class FilesTreeSelectionListener implements TreeSelectionListener { > - > - /* (non-Javadoc) > - * @see > javax.swing.event.TreeSelectionListener#valueChanged(javax.swing.event.TreeSelectionEvent) > + > + /* > + * (non-Javadoc) > + * > + * @see > + * > javax.swing.event.TreeSelectionListener#valueChanged(javax.swing.event > + * .TreeSelectionEvent) > */ > @SuppressWarnings("unchecked") > public void valueChanged(TreeSelectionEvent e) { > @@ -846,9 +805,10 @@ > } > break; > } else { > - Item item = (Item) ((TransferableTreeNode) o).getData(); > + Item item = (Item) ((TransferableTreeNode) o).getUserObject(); > alSelected.add(item); > } > + > // return all childs nodes recursively > Enumeration<DefaultMutableTreeNode> e2 = ((DefaultMutableTreeNode) > o) > .depthFirstEnumeration(); > @@ -913,9 +873,13 @@ > * DOCUMENT_ME. > */ > class FilesTreeExpansionListener implements TreeExpansionListener { > - > - /* (non-Javadoc) > - * @see > javax.swing.event.TreeExpansionListener#treeCollapsed(javax.swing.event.TreeExpansionEvent) > + > + /* > + * (non-Javadoc) > + * > + * @see > + * > javax.swing.event.TreeExpansionListener#treeCollapsed(javax.swing.event > + * .TreeExpansionEvent) > */ > public void treeCollapsed(TreeExpansionEvent event) { > Object o = event.getPath().getLastPathComponent(); > @@ -928,8 +892,12 @@ > } > } > > - /* (non-Javadoc) > - * @see > javax.swing.event.TreeExpansionListener#treeExpanded(javax.swing.event.TreeExpansionEvent) > + /* > + * (non-Javadoc) > + * > + * @see > + * > javax.swing.event.TreeExpansionListener#treeExpanded(javax.swing.event > + * .TreeExpansionEvent) > */ > public void treeExpanded(TreeExpansionEvent event) { > Object o = event.getPath().getLastPathComponent(); > @@ -943,6 +911,44 @@ > > } > } > + > + /** > + * Fill the provided list with sub-elements for that directory, i.e. > + * sub-directories, files and playlists. > + * > + * @param parent > + * The parent-directory to start from. > + * @param model > + * The DefaultTreeModel to use. > + * @param list > + * The list to add elements to. This list can contain elements > before > + * which will not be touched. > + */ > + static void populateFromDirectory(Directory parent, > + List<MutableTreeNode> list) { > + // now we get all directories in this device > + for (Directory directory : parent.getDirectories()) { > + if (directory.shouldBeHidden()) { > + continue; > + } > + list.add(new DirectoryNode(directory)); > + } > + // then files > + for (File file : parent.getFiles()) { > + if (file.shouldBeHidden()) { > + continue; > + } > + list.add(new FileNode(file)); > + } > + // and playlists > + for (Playlist pl : parent.getPlaylistFiles()) { > + if (pl.shouldBeHidden()) { > + continue; > + } > + list.add(new PlaylistFileNode(pl)); > + } > + } > + > } > > /** > @@ -966,28 +972,24 @@ > */ > @Override > public String toString() { > - return ((File) super.getData()).getName(); > + return getFile().getName(); > } > > /** > * @return Returns the file. > */ > public File getFile() { > - return (File) super.getData(); > + return (File) super.getUserObject(); > } > - > } > > /** > * Device node > */ > -class DeviceNode extends TransferableTreeNode { > +class DeviceNode extends LazyLoadingTreeNode { > > private static final long serialVersionUID = 1L; > > - /** device -> deviceNode hashmap */ > - private static Map<Device, DeviceNode> hmDeviceDeviceNode = new > HashMap<Device, DeviceNode>(2); > - > /** > * Constructor > * > @@ -995,45 +997,51 @@ > */ > public DeviceNode(Device device) { > super(device); > - hmDeviceDeviceNode.put(device, this); > } > > - /** Return associated device node */ > - public static DeviceNode getDeviceNode(Device device) { > - return hmDeviceDeviceNode.get(device); > - } > - > /** > * return a string representation of this device node > */ > @Override > public String toString() { > - return ((Device) super.getData()).getName(); > + return getDevice().getName(); > } > > /** > * @return Returns the device. > */ > public Device getDevice() { > - return (Device) super.getData(); > + return (Device) super.getUserObject(); > } > > + /* > + * (non-Javadoc) > + * > + * @see > + * > org.jajuk.ui.widgets.LazyLoadingTreeNode#loadChildren(javax.swing.tree. > + * DefaultTreeModel) > + */ > + @Override > + public MutableTreeNode[] loadChildren(DefaultTreeModel model) { > + List<MutableTreeNode> list = new ArrayList<MutableTreeNode>(); > + > + // first level is the directory of the device itself, usually only one > + for (Directory parent : getDevice().getDirectories()) { > + // so for each directory that is listed for that Device we build up > the > + // list of sub-elements > + FilesTreeView.populateFromDirectory(parent, list); > + } > + return list.toArray(new MutableTreeNode[list.size()]); > + } > + > } > > /** > * Directory node > */ > -class DirectoryNode extends TransferableTreeNode { > - > - /** > - * > - */ > +class DirectoryNode extends LazyLoadingTreeNode { > private static final long serialVersionUID = 1L; > > - /** directory -> directoryNode hashmap */ > - private static Map<Directory, DirectoryNode> hmDirectoryDirectoryNode = > new HashMap<Directory, DirectoryNode>( > - 100); > - > /** > * Constructor > * > @@ -1041,36 +1049,45 @@ > */ > public DirectoryNode(Directory directory) { > super(directory); > - hmDirectoryDirectoryNode.put(directory, this); > } > > - /** Return associated directory node */ > - public static DirectoryNode getDirectoryNode(Directory directory) { > - return hmDirectoryDirectoryNode.get(directory); > - } > - > /** > * return a string representation of this directory node > */ > @Override > public String toString() { > - return ((Directory) getData()).getName(); > + return getDirectory().getName(); > } > > /** > * @return Returns the directory. > */ > public Directory getDirectory() { > - return (Directory) getData(); > + return (Directory) getUserObject(); > } > > + /* > + * (non-Javadoc) > + * > + * @see > org.jajuk.ui.helpers.LazyLoadingTreeNode#loadChildren(javax.swing.tree > + * .DefaultTreeModel) > + */ > + @Override > + public MutableTreeNode[] loadChildren(DefaultTreeModel model) { > + List<MutableTreeNode> list = new ArrayList<MutableTreeNode>(); > + > + // simply collect all items one level below that directory > + FilesTreeView.populateFromDirectory(getDirectory(), list); > + > + return list.toArray(new MutableTreeNode[list.size()]); > + } > + > } > > /** > * Playlist node > */ > class PlaylistFileNode extends TransferableTreeNode { > - > private static final long serialVersionUID = 1L; > > /** > @@ -1087,16 +1104,15 @@ > */ > @Override > public String toString() { > - return ((Playlist) super.getData()).getName(); > + return getPlaylistFile().getName(); > } > > /** > * @return Returns the playlist node. > */ > public Playlist getPlaylistFile() { > - return (Playlist) getData(); > + return (Playlist) getUserObject(); > } > - > } > > class FilesTreeCellRenderer extends SubstanceDefaultTreeCellRenderer { > > Modified: trunk/jajuk/src/main/java/org/jajuk/ui/views/TracksTreeView.java > =================================================================== > --- trunk/jajuk/src/main/java/org/jajuk/ui/views/TracksTreeView.java > 2009-11-19 22:23:33 UTC (rev 5538) > +++ trunk/jajuk/src/main/java/org/jajuk/ui/views/TracksTreeView.java > 2009-11-22 15:01:36 UTC (rev 5539) > @@ -28,7 +28,6 @@ > import java.awt.event.InputEvent; > import java.awt.event.MouseAdapter; > import java.awt.event.MouseEvent; > -import java.util.ArrayList; > import java.util.Collections; > import java.util.Date; > import java.util.Enumeration; > @@ -100,9 +99,6 @@ > /** Generated serialVersionUID. */ > private static final long serialVersionUID = 1L; > > - /** Track selection. */ > - private List<Track> alTracks; > - > /** DOCUMENT_ME. */ > private JPopupMenu jmenuCollection; > > @@ -198,7 +194,7 @@ > populateTree(); > > // create tree > - createTree(); > + createTree(false); > > jtree.setCellRenderer(new TracksTreeCellRenderer()); > > @@ -706,15 +702,6 @@ > } > } > > - /** > - * Gets the track selection. > - * > - * @return Returns the alTracks. > - */ > - public List<Track> getTrackSelection() { > - return alTracks; > - } > - > // needs to be inner class as it accesses various members > /** > * DOCUMENT_ME. > @@ -771,7 +758,7 @@ > } else if (o instanceof TransferableTreeNode) { > // this is a standard node except "by date" > // discovery nodes > - alSelected.add((Item) ((TransferableTreeNode) o).getData()); > + alSelected.add((Item) ((TransferableTreeNode) > o).getUserObject()); > } > > // return all child nodes recursively > @@ -866,7 +853,6 @@ > * > * @param e DOCUMENT_ME > */ > - @SuppressWarnings("unchecked") > public void handlePopup(final MouseEvent e) { > TreePath path = jtree.getPathForLocation(e.getX(), e.getY()); > if (path == null) { > @@ -881,7 +867,6 @@ > jtree.getSelectionModel().setSelectionPath(path); > } > paths = jtree.getSelectionModel().getSelectionPaths(); > - alTracks = new ArrayList<Track>(100); > > // test mix between types ( not allowed ) > String sClass = > paths[0].getLastPathComponent().getClass().toString(); > @@ -891,23 +876,6 @@ > } > } > > - // get all components recursively > - for (TreePath element : paths) { > - Object o = element.getLastPathComponent(); > - Enumeration<DefaultMutableTreeNode> e2 = ((DefaultMutableTreeNode) > o) > - .depthFirstEnumeration(); > - // return all childs nodes recursively > - while (e2.hasMoreElements()) { > - DefaultMutableTreeNode node = e2.nextElement(); > - if (node instanceof TrackNode) { > - Track track = ((TrackNode) node).getTrack(); > - if (track.getPlayeableFile(false) != null) { > - alTracks.add(((TrackNode) node).getTrack()); > - } > - } > - } > - } > - > // display menus according node type > buildMenu(e); > } > @@ -1022,14 +990,14 @@ > */ > @Override > public String toString() { > - return ((Style) super.getData()).getName2(); > + return getStyle().getName2(); > } > > /** > * @return Returns the track. > */ > public Style getStyle() { > - return (Style) super.getData(); > + return (Style) super.getUserObject(); > } > } > > @@ -1057,16 +1025,15 @@ > */ > @Override > public String toString() { > - return ((Author) super.getData()).getName2(); > + return getAuthor().getName2(); > } > > /** > * @return Returns the author. > */ > public Author getAuthor() { > - return (Author) super.getData(); > + return (Author) super.getUserObject(); > } > - > } > > /** > @@ -1093,8 +1060,8 @@ > */ > @Override > public String toString() { > - if (((Year) super.getData()).getValue() > 0) { > - return ((Year) super.getData()).getName(); > + if (getYear().getValue() > 0) { > + return getYear().getName(); > } else { > return Messages.getString("unknown_year"); > } > @@ -1104,9 +1071,8 @@ > * @return Returns the year. > */ > public Year getYear() { > - return (Year) super.getData(); > + return (Year) super.getUserObject(); > } > - > } > > /** > @@ -1130,14 +1096,14 @@ > */ > @Override > public String toString() { > - return ((Album) super.getData()).getName2(); > + return getAlbum().getName2(); > } > > /** > * @return Returns the album. > */ > public Album getAlbum() { > - return (Album) super.getData(); > + return (Album) super.getUserObject(); > } > } > > @@ -1162,14 +1128,14 @@ > */ > @Override > public String toString() { > - return ((Track) super.getData()).getName(); > + return getTrack().getName(); > } > > /** > * @return Returns the track. > */ > public Track getTrack() { > - return (Track) super.getData(); > + return (Track) super.getUserObject(); > } > } > > > Modified: > trunk/jajuk/src/test/java/org/jajuk/ui/views/TestTracksTreeView.java > =================================================================== > --- trunk/jajuk/src/test/java/org/jajuk/ui/views/TestTracksTreeView.java > 2009-11-19 22:23:33 UTC (rev 5538) > +++ trunk/jajuk/src/test/java/org/jajuk/ui/views/TestTracksTreeView.java > 2009-11-22 15:01:36 UTC (rev 5539) > @@ -321,15 +321,6 @@ > view.actionPerformed(new ActionEvent(this, 1, "")); > } > > - /** > - * Test method for > - * {@link org.jajuk.ui.views.TracksTreeView#getTrackSelection()}. > - */ > - public final void testGetTrackSelection() { > - TracksTreeView view = new TracksTreeView(); > - view.getTrackSelection(); > - } > - > public final void testTracksTreeSelectionListener() { > TracksTreeView view = new TracksTreeView(); > TracksTreeView.TracksTreeSelectionListener task = view.new > TracksTreeSelectionListener(); > > > This was sent by the SourceForge.net collaborative development platform, > the world's largest Open Source development site. > > > ------------------------------------------------------------------------------ > Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day > trial. Simplify your report design, integration and deployment - and focus > on > what you do best, core application coding. Discover what's new with > Crystal Reports now. http://p.sf.net/sfu/bobj-july > _______________________________________________ > Jajuk-commits mailing list > Jaj...@li... > https://lists.sourceforge.net/lists/listinfo/jajuk-commits > -- Bertrand FLORAT ber...@fl... http://www.florat.net PGP keyserver: pgp.mit.edu Try Jajuk Advanced jukebox (http://jajuk.info) |