Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
   /*
    *  Copyright (c) 2011 Leibniz Institute of Plant Genetics and Crop Plant Research (IPK), Gatersleben, Germany.
    *  All rights reserved. This program and the accompanying materials
    *  are made available under the terms of the GNU Lesser Public License v2.1
    *  which accompanies this distribution, and is available at
    *  http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
    *
    *  Contributors:
    *      Leibniz Institute of Plant Genetics and Crop Plant Research (IPK), Gatersleben, Germany - RMI Client, FileChooser and WebDAV
   */
  package de.ipk_gatersleben.bit.bi.edal.rmi.client.gui;
  
  import java.awt.Color;
  import java.awt.Cursor;
  import java.awt.Dialog;
  import java.awt.Font;
  import java.awt.Frame;
  import java.awt.Point;
  import java.util.HashMap;
  import java.util.HashSet;
  import java.util.List;
  import java.util.Map;
  import java.util.Set;
  
  import javax.swing.JTree;
  
  
  
  
EDALFileChooser provides a simple mechanism for the user to choose a file from EDAL File System.

The following code pops up a file chooser for the user that sees only .jpg and .gif images:

 EDALFileChooser chooser = new EDALFileChooser((Frame) window, rootDirectory);
 EdalFileNameExtensionFilter filter = new EdalFileNameExtensionFilter(
   "JPG & GIF Images", "jpg", "gif");
 chooser.setFileFilter(filter);
 int returnVal = chooser.showOpenDialog();
 if (returnVal == EDALFileChooser.APPROVE_OPTION) {
  System.out.println("You chose to open this file: "
    + chooser.getSelectedFile().getName());
 }
 

Author(s):
Jinbo Chen
Version:
1.0
Beaninfo:
attribute: isContainer false description: A component which allows for the interactive selection of a file.
 
 
 public class EdalFileChooser extends EdalTitleDialog {
 	private static final long serialVersionUID = 1L;
 	private static final Font FONT = new Font("Courier New"., 12);
 	private DefaultTableModel defaultModel = null;
 	private JTable filemetatable = null;
 	private List<Stringmetadatatoshow = new ArrayList<String>();
 	private Map<StringJTextFielddetailmap = new HashMap<StringJTextField>();
 	private boolean bindui = false;
 	private final JLabel pathlabel = new JLabel("Path:".);
 	protected final JTextField pathtext = new JTextField();
 	protected ClientPrimaryDataEntity selectedFile = null;
 	private final JTextField searchtext = new JTextField();
 	protected JButton okbutton;
 	private int returnvalue;
 	private int[] selectrows;
 	private EdalAbstractFileFilter fileFilter = null;
 	private int fileSelectionMode = ;
 	private boolean savemodal = false;
 	private int fileselectindex;
 	private String username = null;
 	private static final String CHANGEMETADATAMETHODNAME = "setMetaData";
 	private static final String CHANGEPERMISSIONTHODNAME = "grantPermission";
 	private JTree tree;
 	private JButton configbutton = new JButton("eDAL Configration");
 	private JButton metadatabutton = new JButton("ChangeMetadata");
 	private JButton permissionbutton = new JButton("ChangePermissions");
 	private Color tablebackcolor = null;
 	private XStatusBar statusbar = null;
 	private JPanel centerPane = new JPanel();
 	private boolean isSelected = false;

Return value if cancel is chosen.
 
 	public static final int CANCEL_OPTION = 1;
Return value if approve (yes, ok) is chosen.
 
 	public static final int APPROVE_OPTION = 0;
Return value if an error occured.
 
 	public static final int ERROR_OPTION = -1;

Instruction to display only files.
 
 	public static final int FILES_ONLY = 0;

Instruction to display only directories.
 
 	public static final int DIRECTORIES_ONLY = 1;

Instruction to display both files and directories.
 
 	public static final int FILES_AND_DIRECTORIES = 2;

the max length of description and date
 
 	private static final int TEXTLIMIT = 40;
the max length of tooltips
 
 	private static final int TOOLTIPSLEN = 20;
the max length of metadata abstract
 
 	private static final int METADATALEN = 80;
 
 	private boolean multiSelectionEnabled = false;
 	private Map<StringStringtipsmap = new HashMap<StringString>();
 	private int row;
 	private int column;
 	private ClientDataManager client = null;

Constructs a EDALFileChooser that is initialized with owner as the swing container owner(JFrame), rootDirectory as the root directory, and client as the rmi client datamanager. If any of the parameters are null this method will not initialize.

Parameters:
owner the swing container owner
client the rmi client datamanager
 
 
 	public EdalFileChooser(Frame ownerClientDataManager client) {
 		super(owner);
 		if (client != null) {
 			this. = client;
 			try {
 				this. = client.getRootDirectory();
 			} catch (RemoteException e1) {
 						.error(StackTraceUtil.getStackTrace(e1));
 				JOptionPane.showMessageDialog(
 						null,
 						"Call remote Edal server function exception:"
 			} catch (EdalAuthenticateException e1) {
 						.error(StackTraceUtil.getStackTrace(e1));
 				JOptionPane
 								null,
 								"Can't login to Edal System,Please check your username and password!",
 			}
 
 			catch (NotBoundException e1) {
 						.error(StackTraceUtil.getStackTrace(e1));
 				JOptionPane.showMessageDialog(null"No DataManager is bound!",
 			} catch (PrimaryDataDirectoryException e1) {
 						.error(StackTraceUtil.getStackTrace(e1));
 				JOptionPane.showMessageDialog(null,
 						"Can't get Edal root directory!".,
 			} catch (EdalException e1) {
 						.error(StackTraceUtil.getStackTrace(e1));
 				JOptionPane.showMessageDialog(
 						null,
 						"Call remote Edal server function exception:"
 			}
 			 = new XStatusBar(client.getHost(), client.getPort(),
 		}
 	}

Constructs a EDALFileChooser that is initialized with owner as the swing container owner(JDialog), rootDirectory as the root directory, and client as the rmi client datamanager. If any of the parameters are null this method will not initialize.

Parameters:
owner the swing container owner
client the rmi client datamanager
 
 	public EdalFileChooser(Dialog ownerClientDataManager client) {
 		super(owner);
 		if (client != null) {
 			this. = client;
 			try {
 				this. = client.getRootDirectory();
 			} catch (RemoteException e1) {
 						.error(StackTraceUtil.getStackTrace(e1));
 				JOptionPane.showMessageDialog(
 						null,
 						"Call remote Edal server function exception:"
 			} catch (EdalAuthenticateException e1) {
 						.error(StackTraceUtil.getStackTrace(e1));
 				JOptionPane
 								null,
 								"Can't login to Edal System,Please check your username and password!",
 			}
 
 			catch (NotBoundException e1) {
 						.error(StackTraceUtil.getStackTrace(e1));
 				JOptionPane.showMessageDialog(null"No DataManager is bound!",
 			} catch (PrimaryDataDirectoryException e1) {
 						.error(StackTraceUtil.getStackTrace(e1));
 				JOptionPane.showMessageDialog(null,
 						"Can't get Edal root directory!".,
 			} catch (EdalException e1) {
 						.error(StackTraceUtil.getStackTrace(e1));
 				JOptionPane.showMessageDialog(
 						null,
 						"Call remote Edal server function exception:"
 			}
 			 = new XStatusBar(client.getHost(), client.getPort(),
 		}
 	}

Returns the selected file. This can be set by a user action, such as selecting the file from a list in the UI.

Returns:
the selected file
 
 
 		if (!) {
 			return null;
 		}
 			try {
 					return ;
 				}
 			} catch (RemoteException e) {
 				JOptionPane.showMessageDialog(
 						null,
 						"Call remote Edal server function exception:"
 			}
 			return null;
 		} else if ( == ) {
 			try {
 					return ;
 				}
 			} catch (RemoteException e) {
 				JOptionPane.showMessageDialog(
 						null,
 						"Call remote Edal server function exception:"
 			}
 			return null;
 		} else {
 			if ( != null) {
 				return ;
 			} else {
 				return ;
 			}
 		}
 	}
 
 		try {
 			it = dataentity.getVersions().iterator();
 			while (it.hasNext()) {
 				final ClientPrimaryDataEntityVersion curr = it.next();
 				if (curr.getRevision().longValue() == version.getRevision()
 						.longValue()) {
 					return curr.getMetaData();
 				}
 			}
 			return dataentity.getMetaData();
 		} catch (RemoteException e) {
 			JOptionPane.showMessageDialog(
 					null,
 					"Call remote Edal server function exception:"
 		}
 		return null;
 	}

Returns a list of selected files if the file chooser is set to allow multiple selection.
 
 
 		if ( != null && .size() > 0) {
 				ClientPrimaryDataEntity[] selectedFiles = new ClientPrimaryDataEntity[1];
 				selectedFiles[0] = ;
 				return selectedFiles;
 			} else if ( == ) {
 				for (int i = 0; i < selectedFiles.lengthi++) {
 					selectedFiles[i] = .get([i]);
 				}
 				return selectedFiles;
 			} else {
 				for (int i = 0; i < selectedFiles.lengthi++) {
 					selectedFiles[i] = .get([i]);
 				}
 				return selectedFiles;
 			}
 
 		} else {
 				return new ClientPrimaryDataFile[0];
 			} else {
 				ClientPrimaryDataEntity[] selectedFiles = new ClientPrimaryDataEntity[1];
 				selectedFiles[0] = ;
 				return selectedFiles;
 			}
 		}
 	}

Pops up an "Open File" file chooser dialog. Note that the text that appears in the approve button is determined by the L&F.

Returns:
the return state of the file chooser on popdown:
  • EDALFileChooser.CANCEL_OPTION
  • EDALFileChooser.APPROVE_OPTION
  • EDALFileChooser.ERROR_OPTION if an error occurs or the dialog is dismissed
 
 
 	public int showOpenDialog() {
 		try {
 			 = false;
 			setTitle("Open File");
 			if ( == null) {
 					return ;
 				}
 			}
 			setModal(true);
 			setVisible(true);
 			return ;
 		} catch (Exception e) {
 			JOptionPane.showMessageDialog(nulle.getMessage(),
 		}
 
 	}

Pops up a "Save File" file chooser dialog. Note that the text that appears in the approve button is determined by the L&F.

Returns:
the return state of the file chooser on popdown:
  • EDALFileChooser.CANCEL_OPTION
  • EDALFileChooser.APPROVE_OPTION
  • EDALFileChooser.ERROR_OPTION if an error occurs or the dialog is dismissed
 
 
 	public int showSaveDialog() {
 		try {
 			 = true;
 			setTitle("Save File");
 			setModal(true);
 			if ( == null) {
 					return ;
 				}
 			}
 			setVisible(true);
 			return ;
 		} catch (Exception e) {
 			JOptionPane.showMessageDialog(nulle.getMessage(),
 		}
 	}

Sets the file chooser to allow multiple file selections.

Parameters:
b true if multiple files may be selected
Beaninfo:
bound: true description: Sets multiple file selection mode.
 
 
 	public void setMultiSelectionEnabled(boolean b) {
 	}

Sets the current file filter. The file filter is used by the file chooser to filter out files from the user's view.

Parameters:
filter the new current file filter to use
See also:
getFileFilter()
Beaninfo:
preferred: true bound: true description: Sets the File Filter used to filter out files of type.
 
 
 	public void setFileFilter(EdalAbstractFileFilter filter) {
 		this. = filter;
 	}

Returns the currently selected file filter.

 
 
 		return this.;
 	}

Sets the EDALFileChooser to allow the user to just select files, just select directories, or select both files and directories. The default is EDALFileChooser.FILES_ONLY.

Parameters:
mode the type of files to be displayed:
  • EDALFileChooser.FILES_ONLY
  • EDALFileChooser.DIRECTORIES_ONLY
  • EDALFileChooser.FILES_AND_DIRECTORIES
Throws:
java.lang.IllegalArgumentException if mode is an illegal file selection mode
See also:
getFileSelectionMode()
Beaninfo:
preferred: true bound: true description: Sets the types of files that the JFileChooser can choose. enum: FILES_ONLY EDALFileChooser.FILES_ONLY DIRECTORIES_ONLY EDALFileChooser.DIRECTORIES_ONLY EDALFileChooser.FILES_AND_DIRECTORIES
 
 	public void setFileSelectionMode(int mode) {
 		if ((mode == ) || (mode == )
 				|| (mode == )) {
 		} else {
 					"Incorrect Mode for file selection: " + mode);
 		}
 	}

Returns the current file-selection mode. The default is EDALFileChooser.FILES_ONLY.

Returns:
the type of files to be displayed, one of the following:
  • EDALFileChooser.FILES_ONLY
  • EDALFileChooser.DIRECTORIES_ONLY
  • EDALFileChooser.FILES_AND_DIRECTORIES
See also:
setFileSelectionMode(int)
 
 
 	public int getFileSelectionMode() {
 	}
 
 	protected void init(ClientPrimaryDataDirectory rootDirectory) {
 		 = rootDirectory;
 
 		// JPanel maincontents = (JPanel) getContentPane();
 		JPanel maincontents = new JPanel();
 		setContentPane(maincontents);
 
 		maincontents.setLayout(new BorderLayout());
 
 		maincontents.add(.);
 		maincontents.add(.);
 
 						"insets 1 1 1 10",
 						"[7%!][5%!][9%!][36%!][5%!][2.8%!][22.1%!][1%!][2%!][7%!][1%!]",
 						"[30!][grow,fill][30!][6!]"));
 
 		if (rootDirectory != null) {
 			.add("cell 0 0 1 1");
 
 			.add("cell 1 0 4 1,width max(50%, 50%)");
 		}
 
 		if (rootDirectory != null) {
 			.add("cell 6 0 1 1,width max(35%, 35%)");
 				public void actionPerformed(ActionEvent e) {
 				}
 			});
 		}
 
 		JButton searchbutton = new JButton();
 		searchbutton.setFont();
 		if (rootDirectory != null) {
 			.add(searchbutton"cell 8 0 2 1");
 		}
 
 
 		if (rootDirectory != null) {
 			final ClientPrimaryDataDirectory f_rootDirectory = rootDirectory;
 			 = new JTree(addNodes(nullrootDirectory));
 			.setCellRenderer(renderer);
 			.setOpaque(true);
 			UIDefaults treeDefaults = new UIDefaults();
 			treeDefaults.put("Tree.selectionBackground"null);
 			.putClientProperty("Nimbus.Overrides"treeDefaults);
 			.putClientProperty("Nimbus.Overrides.InheritDefaults"false);
 			// final JScrollPane treepanelparent = new JScrollPane(tree);
 
 				public void valueChanged(TreeSelectionEvent e) {
 					 = true;
 					treenodeclick(f_rootDirectory);
 				}
 			});
 
 					rootDirectory));
 
 				public void mousePressed(MouseEvent e) {
 					// linux
 				}
 
 				public void mouseReleased(MouseEvent e) {
 					// windows
 				}
 
 				public void mouseClicked(MouseEvent e) {
 					if ( != null) {
 
 						final JTree ttree = (JTreee.getComponent();
 						TreePath tpath = ttree.getPathForLocation(e.getX(),
 								e.getY());
 						if (tpath != null
 								&& tpath.getLastPathComponent() != null) {
 							EdalNode mynode = (EdalNode
 						}
 					}
 					treenodeclick(f_rootDirectory);
 				}
 
 			});
 
 			try {
 				 = buildtable(rootDirectory
 			} catch (RemoteException e1) {
 						.error(StackTraceUtil.getStackTrace(e1));
 				JOptionPane.showMessageDialog(
 						null,
 						"Call remote Edal server function exception:"
 			} catch (PrimaryDataDirectoryException e1) {
 						.error(StackTraceUtil.getStackTrace(e1));
 				JOptionPane.showMessageDialog(
 						null,
 						"Call Edal server function exception:"
 			}
 			// filemetatable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
 			} else {
 			}
 
 
 				public void mouseDragged(MouseEvent e) {
 				}
 
 				public void mouseMoved(MouseEvent e) {
 					Point point = e.getPoint();
 					int x = .rowAtPoint(point);
 					int y = .columnAtPoint(point);
 					if (x !=  || y != ) {
 						 = x;
 						 = y;
 					}
 					if (.containsKey(( + 1) + "," + ( + 1))) {
 								.get(( + 1) + "," + ( + 1))));
 					} else if ( > 0 &&  > 0) {
 								.toString()));
 					}
 				}
 			});
 
 				public void mousePressed(MouseEvent evt) {
 					// linux
 				}
 
 				public void mouseReleased(MouseEvent evt) {
 					// windows
 				}
 			});
 
 			if ( == null) {
 			}
 
 			/*
 			 * 
 			 * filemetatable.addFocusListener(new FocusListener(){ public void
 			 * focusLost(FocusEvent e) { if (!e.isTemporary()) { //
 			 * filemetatable.clearSelection(); //
 			 * filemetatable.setSelectionBackground(new Color(135,206,250)); } }
 			 * 
 			 * @Override public void focusGained(FocusEvent e) {
 			 * filemetatable.setSelectionBackground(tablebackcolor); } });
 			 */
 
 
 			if ( != null) {
 			}
 
 
 
 			.add("cell 0 1 11 1,width max(100%, 100%)");
 
 				public void mousePressed(MouseEvent e) {
 					// linux
 				}
 
 				public void mouseReleased(MouseEvent e) {
 					// windows
 				}
 
 			});
 		}
 
 
 			public void actionPerformed(final ActionEvent e) {
 			}
 		});
 
 
 			public void actionPerformed(final ActionEvent e) {
 				if (.size() > 0
 						&& .get() != null) {
 					permission.showOpenDialog();
 				} else {
 					PermissionDialog permission = new PermissionDialog(
 					permission.showOpenDialog();
 				}
 			}
 		});
 
 
 			public void actionPerformed(final ActionEvent e) {
 				if ( != null) {
 					int returnVal = metadlg.showOpenDialog();
 					if (returnVal == .) {
 						Map<EnumDublinCoreElementsUntypedDatametadatavalue = metadlg
 						changemetadata(metadatavaluefalse);
 					}
 				}
 				/*
 				 * if (filelist.size() > 0 && filelist.get(fileselectindex) !=
 				 * null) { MetaDataSaveDialog metadlg = new MetaDataSaveDialog(
 				 * filelist.get(fileselectindex)); int returnVal =
 				 * metadlg.showOpenDialog(); if (returnVal ==
 				 * MetaDataSaveDialog.APPROVE_OPTION) {
 				 * Map<EnumDublinCoreElements, UntypedData> metadatavalue =
 				 * metadlg .getMetadatavalue();
 				 * changemetadata(filelist.get(fileselectindex), metadatavalue,
 				 * true); } } else { MetaDataSaveDialog metadlg = new
 				 * MetaDataSaveDialog(currentdir); int returnVal =
 				 * metadlg.showOpenDialog(); if (returnVal ==
 				 * MetaDataSaveDialog.APPROVE_OPTION) {
 				 * Map<EnumDublinCoreElements, UntypedData> metadatavalue =
 				 * metadlg .getMetadatavalue(); changemetadata(currentdir,
 				 * metadatavalue, false); } }
 				 */
 			}
 		});
 
 
 			public void actionPerformed(final ActionEvent e) {
 				if (getSelectedFile() == null) {
 					return;
 				}
 			}
 		});
 
 		JButton cancelbutton = new JButton();
 		cancelbutton.setFont();
 
 		JPanel functionButtons = new JPanel();
 		functionButtons.setLayout(new FlowLayout(.));
 		functionButtons.add();
 		if (rootDirectory != null) {
 			functionButtons.add();
 			functionButtons.add();
 
 			showmetabutton(rootDirectory);
 			showpermissionbutton(rootDirectory);
 		}
 		functionButtons.add();
 		functionButtons.add(cancelbutton);
 
 		JPanel buttons = new JPanel();
 		buttons.setLayout(new BorderLayout());
 		buttons.add(functionButtons.);
 
 		.add(buttons"cell 0 2 9 1,align right");
 
 		this.setPreferredSize(new Dimension(950, 575));
 		this.setMinimumSize(new Dimension(950, 575));
 
 		if (rootDirectory != null) {
 				public void componentResized(ComponentEvent e) {
 				}
 			});
 		}
 
 		maincontents.updateUI();
 		this.pack();
 		if (rootDirectory != null) {
 		}
 
 	}
 
 	private void treenodeclick(DefaultMutableTreeNode currentnode,
 			ClientPrimaryDataDirectory f_rootDirectory) {
 		if (currentnode == null || currentnode.getUserObject() == null) {
 			return;
 		}
 		EdalNode mynode = (EdalNodecurrentnode.getUserObject();
 		try {
 			try {
 				 = (ClientPrimaryDataDirectory) EdalFileHelper
 						.getEntity(mynode.getPath(), f_rootDirectory);
 			} catch (PrimaryDataDirectoryException e1) {
 						.error(StackTraceUtil.getStackTrace(e1));
 				JOptionPane.showMessageDialog(null,
 						"No such " + mynode.getPath() + " exists!",
 			}
 			List<ClientPrimaryDataEntitydirlist = null;
 			try {
 			} catch (PrimaryDataDirectoryException e1) {
 						.error(StackTraceUtil.getStackTrace(e1));
 				JOptionPane.showMessageDialog(null"Can't load load all "
.getName() + "objects!",
			if (dirlist != null) {
				if ( != null) {
			if ( != null) {
			// jinbo tree.scrollPathToVisible(e.getPath());
catch (RemoteException e1) {
			JOptionPane.showMessageDialog(
					null,
					"Call remote Edal server function exception:"
catch (NotBoundException e1) {
			JOptionPane.showMessageDialog(null,
					"Edal internal server error occurred:" + e1.getMessage(),
	private int showlogindialog() {
		EdalConfigDialog eDALConfigUi = new EdalConfigDialog();
		int returnVal = eDALConfigUi.showOpenDialog();
		if (returnVal == .) {
			/*
			 * EdalLoginHelper helper = new EdalLoginHelper();
			 * helper.savedata(eDALConfigUi.getServeraddress(),
			 * eDALConfigUi.getServerport(), eDALConfigUi.getUsername(),
			 * eDALConfigUi.getPassword()); bindui = false; cleartable();
			 * init(EdalConfigDialog.rootDirectory); if (EdalConfigDialog.client
			 * != null) { client = EdalConfigDialog.client; username =
			 * client.getAuthentication().getName(); pathtext.setText(""); }
			 */
	private void cleanbuttonevent(JButton button) {
		if (button != null) {
			for (ActionListener al : button.getActionListeners()) {
	private void checktableRightClick(MouseEvent evtfinal JTree tree) {
		if (evt.isPopupTrigger()) {
			final int rightclickrow = evt.getY() / .getRowHeight();
			JMenuItem permissionmenu = new JMenuItem(
			JPopupMenu popupMenu;
			popupMenu = new JPopupMenu();
			if () {
				popupMenu.add(del);
				popupMenu.add(rename);
			if (.size() > 0
					&& .get(rightclickrow) != null) {
				popupMenu.add(permissionmenu);
			JMenuItem metadatamenu = new JMenuItem("Change Metadata");
			if (.size() > 0 && .get() != null) {
				popupMenu.add(metadatamenu);
				if (!PrincipalUtil.checkPermission(
					metadatamenu.setEnabled(false);
else if ( != null) {
				popupMenu.add(metadatamenu);
				if (!PrincipalUtil.checkPermission(,
					metadatamenu.setEnabled(false);
			metadatamenu.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					if (.size() > 0
							&& .get() != null) {
						int returnVal = metadlg.showOpenDialog();
						if (returnVal == .) {
							Map<EnumDublinCoreElementsUntypedDatametadatavalue = metadlg
									metadatavaluetrue);
else {
						int returnVal = metadlg.showOpenDialog();
						if (returnVal == .) {
							Map<EnumDublinCoreElementsUntypedDatametadatavalue = metadlg
							changemetadata(metadatavaluefalse);
			});
				public void actionPerformed(ActionEvent e) {
					final String[] buttons = { "Yes""No" };
					final int rc = JOptionPane.showOptionDialog(null,
							"Do you want to delete?".,
							., 0, nullbuttons,
							buttons[1]);
					if (rc == 0) {
						// delete current Directory or File
						try {
							if (.size() > 0) {
								boolean shouldfresh = false;
								if (.get(rightclickrow).isDirectory()) {
									shouldfresh = true;
								.get(rightclickrow).delete();
								.remove(rightclickrow);
								List<ClientPrimaryDataEntitydirlist = null;
								try {
									dirlist = 
											.error(StackTraceUtil
									JOptionPane.showMessageDialog(
											null,
											"Can't load load all "
"objects!",
								if (dirlist != null) {