/* * This file is part of WebLookAndFeel library. * * WebLookAndFeel library 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 3 of the License, or * (at your option) any later version. * * WebLookAndFeel library 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 WebLookAndFeel library. If not, see . */ package com.alee.extended.list; import com.alee.laf.list.WebList; import com.alee.laf.list.editor.ListCellEditor; import com.alee.laf.scroll.WebScrollPane; import com.alee.utils.FileUtils; import javax.swing.*; import java.awt.*; import java.io.File; import java.io.FileFilter; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * Special list component that simplifies files rendering. * * @author Mikle Garin */ public class WebFileList extends WebList { /** * Whether to generate image file thumbnails or not. * Thumbnails generation might slow down list rendering in some cases. */ protected boolean generateThumbnails = WebFileListStyle.generateThumbnails; /** * Preferred visible column count. */ protected int preferredColumnCount = WebFileListStyle.preferredColumnCount; /** * Preferred visible row count. */ protected int preferredRowCount = WebFileListStyle.preferredRowCount; /** * File view mode. */ protected FileListViewType fileListViewType = WebFileListStyle.fileListViewType; /** * File filter. */ protected FileFilter fileFilter = WebFileListStyle.fileFilter; /** * Displayed directory. */ protected File displayedDirectory = null; /** * Scroll pane with fixed preferred size that fits file list settings. */ protected WebScrollPane scrollView = null; /** * Constructs empty file list. */ public WebFileList () { super ( new FileListModel () ); initializeDefaultSettings (); } /** * Constructs file list with files from directory under the specified path. * * @param directoryPath directory path */ public WebFileList ( final String directoryPath ) { super ( new FileListModel ( directoryPath ) ); initializeDefaultSettings (); } /** * Constructs file list with files from the specified directory. * * @param directory directory */ public WebFileList ( final File directory ) { super ( new FileListModel ( directory ) ); initializeDefaultSettings (); } /** * Constructs file list with the specified files. * * @param data files array */ public WebFileList ( final File[] data ) { super ( new FileListModel ( data ) ); initializeDefaultSettings (); } /** * Constructs file list with the specified files. * * @param data files list */ public WebFileList ( final List data ) { super ( new FileListModel ( data ) ); initializeDefaultSettings (); } /** * Initializes default file list settings. */ protected void initializeDefaultSettings () { // Standard settings setLayoutOrientation ( JList.HORIZONTAL_WRAP ); setVisibleRowCount ( 0 ); // Files list renderer setCellRenderer ( new WebFileListCellRenderer ( WebFileList.this ) ); } /** * Returns specific for WebFileList renderer. * Be aware that this method might throw ClassCastException if renderer is altered by user. * * @return specific for WebFileList renderer * @throws ClassCastException */ public WebFileListCellRenderer getWebFileListCellRenderer () throws ClassCastException { final ListCellRenderer cellRenderer = getCellRenderer (); return cellRenderer instanceof WebFileListCellRenderer ? ( WebFileListCellRenderer ) cellRenderer : null; } /** * Returns specific for WebFileList model. * Be aware that this method might throw ClassCastException if model is altered by user. * * @return specific for WebFileList model * @throws ClassCastException */ public FileListModel getFileListModel () throws ClassCastException { return ( FileListModel ) getModel (); } /** * Returns default list cell editor for this list. * * @return default list cell editor for this list */ @Override protected ListCellEditor createDefaultCellEditor () { return new WebFileListCellEditor (); } /** * Sets preferred visible column count. * * @param preferredColumnCount new preferred visible column count */ public void setPreferredColumnCount ( final int preferredColumnCount ) { this.preferredColumnCount = preferredColumnCount; } /** * Returns preferred visible column count. * * @return preferred visible column count */ public int getPreferredColumnCount () { return preferredColumnCount; } /** * Returns preferred visible row count. * * @return preferred visible row count */ public int getPreferredRowCount () { return preferredRowCount; } /** * Sets preferred visible row count. * * @param preferredRowCount new preferred visible row count */ public void setPreferredRowCount ( final int preferredRowCount ) { this.preferredRowCount = preferredRowCount; } /** * Returns whether to generate image file thumbnails or not. * * @return true if file list renderer should generate image file thumbnails, false otherwise */ public boolean isGenerateThumbnails () { return generateThumbnails; } /** * Sets whether to generate image file thumbnails or not. * * @param generateThumbnails whether to generate image file thumbnails or not */ public void setGenerateThumbnails ( final boolean generateThumbnails ) { this.generateThumbnails = generateThumbnails; } /** * Returns file view mode. * * @return file view mode */ public FileListViewType getFileListViewType () { return fileListViewType; } /** * Sets file view mode. * * @param fileListViewType new file view mode */ public void setFileListViewType ( final FileListViewType fileListViewType ) { this.fileListViewType = fileListViewType; getWebFileListCellRenderer ().updateFilesView (); } /** * Returns file filter. * * @return file filter */ public FileFilter getFileFilter () { return fileFilter; } /** * Sets file filter. * * @param fileFilter new file filter */ public void setFileFilter ( final FileFilter fileFilter ) { this.fileFilter = fileFilter; reloadFiles (); } /** * Reloads files from displayed directory. */ public void reloadFiles () { setDisplayedDirectory ( getDisplayedDirectory () ); } /** * Returns displayed directory. * Returned File might be null in case custom files list was set or no data is loaded into list yet. * * @return displayed directory */ public File getDisplayedDirectory () { return displayedDirectory; } /** * Sets displayed directory. * This will force list to load and display files from the specified directory. * * @param file new displayed directory */ public void setDisplayedDirectory ( final File file ) { // Stop cell editing stopCellEditing (); // Saving selection to restore later final List oldSelection = getSelectedFiles (); // Getting files and updating list model final File[] files = file != null ? FileUtils.sortFiles ( file.listFiles ( fileFilter ) ) : FileUtils.getDiskRoots (); getFileListModel ().setData ( files ); // Restoring selection if its same folder if ( FileUtils.equals ( displayedDirectory, file ) ) { setSelectedFiles ( oldSelection ); } // Saving new displayed directory this.displayedDirectory = file; } /** * Returns list of selected files. * * @return list of selected files */ public List getSelectedFiles () { final Object[] selectedValues = getSelectedValues (); final List selectedFiles = new ArrayList ( selectedValues.length ); for ( final Object value : selectedValues ) { selectedFiles.add ( ( ( FileElement ) value ).getFile () ); } return selectedFiles; } /** * Returns selected file. * * @return selected file */ public File getSelectedFile () { final Object selectedValue = getSelectedValue (); return selectedValue != null ? ( ( FileElement ) selectedValue ).getFile () : null; } /** * Selects specified file if it presents in the list. * * @param file file to select */ public void setSelectedFile ( final File file ) { setSelectedFile ( file, true ); } /** * Selects specified file if it presents in the list. * * @param file file to select * @param shouldScroll whether to scroll to selected file or not */ public void setSelectedFile ( final File file, final boolean shouldScroll ) { final FileElement element = getFileListModel ().getElement ( file ); if ( element != null ) { setSelectedValue ( element, shouldScroll ); } else { clearSelection (); } } /** * Selects specified files if they present in the list. * * @param files files to select */ public void setSelectedFiles ( final Collection files ) { final List elements = new ArrayList ( files.size () ); for ( final File file : files ) { final FileElement element = getFileListModel ().getElement ( file ); if ( element != null ) { elements.add ( element ); } } setSelectedValues ( elements ); } /** * Returns scroll pane with fixed preferred size that fits file list settings. * * @return scroll pane with fixed preferred size that fits file list settings */ public WebScrollPane getScrollView () { if ( scrollView == null ) { scrollView = createScrollView (); } return scrollView; } /** * Returns new scroll pane with fixed preferred size that fits file list settings. * * @return new scroll pane with fixed preferred size that fits file list settings */ public WebScrollPane createScrollView () { return new WebScrollPane ( WebFileList.this ) { @Override public Dimension getPreferredSize () { final Dimension ps = super.getPreferredSize (); final int fcw = getFixedCellWidth (); final int fch = getFixedCellHeight (); final Dimension oneCell; if ( fcw != -1 && fch != -1 ) { oneCell = new Dimension ( fcw, fch ); } else { if ( getModel ().getSize () > 0 ) { oneCell = getCellBounds ( 0, 0 ).getSize (); } else { final WebFileListCellRenderer fileListCellRenderer = getWebFileListCellRenderer (); if ( fileListCellRenderer != null ) { oneCell = fileListCellRenderer.getPreferredSize (); } else { oneCell = new Dimension ( 90, 90 ); } } if ( fcw != -1 ) { oneCell.width = fcw; } else if ( fch != -1 ) { oneCell.width = fcw; } } final Insets bi = getInsets (); final JScrollBar vsb = getVerticalScrollBar (); final int sbw = vsb != null && vsb.isShowing () ? vsb.getPreferredSize ().width : 0; ps.width = oneCell.width * preferredColumnCount + bi.left + bi.right + sbw + 1; ps.height = oneCell.height * preferredRowCount + bi.top + bi.bottom + 1; return ps; } }; } /** * Returns preferred size for this list. * * @return preferred size for this list */ @Override public Dimension getPreferredSize () { final Dimension ps = super.getPreferredSize (); if ( getModel ().getSize () > 0 ) { final Dimension oneCell = getCellBounds ( 0, 0 ).getSize (); ps.width = oneCell.width * preferredColumnCount; } return ps; } /** * Repaints cell with specified element. * * @param element element to process */ public void repaint ( final FileElement element ) { repaint ( getFileListModel ().indexOf ( element ) ); } }