package com.vitco.util.components.dialog.components; import com.vitco.util.components.dialog.BlankDialogModule; import com.vitco.util.file.FileTools; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.io.File; import java.util.ArrayList; /** * Object that allows the user to select a folder. */ public class FolderSelectModule extends BlankDialogModule { // dialog that is used to select the folder private final JFileChooser fileDialog; // the label that displays the folder private final JLabel label; // set the folder for this module private void setSelectedFolder(String path) { File file = new File(FileTools.ensureTrailingSeparator(path)); File dir = file.isFile() ? file.getParentFile() : file; dir = dir != null && dir.exists() ? dir : null; // set the information in the correct event queue fileDialog.setSelectedFile(dir); fileDialog.setCurrentDirectory(dir); label.setText(FileTools.shortenPath(getSelectedFolder(), 50)); } // obtain the currently selected folder private String getSelectedFolder() { File file = fileDialog.getSelectedFile(); file = file == null ? fileDialog.getCurrentDirectory() : file; file = file.isFile() ? file.getParentFile() : file; return FileTools.ensureTrailingSeparator(file.getAbsolutePath()); } // constructor public FolderSelectModule(String identifier, final Frame owner, File initTo) { super(identifier); // set layout setLayout(new BorderLayout()); // setup dialog fileDialog = new JFileChooser(); fileDialog.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); // setup label label = new JLabel(); label.setBorder(BorderFactory.createEmptyBorder(0,10,0,0)); add(label, BorderLayout.CENTER); // initialize setSelectedFolder(initTo.getAbsolutePath()); // create the "select folder" button DialogButton selectFolderButton = new DialogButton("Select Folder..."); selectFolderButton.setFocusable(false); add(selectFolderButton, BorderLayout.WEST); selectFolderButton.addActionListener(new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { // open dialog to select folder location String currentSelectedFolder = getSelectedFolder(); if (fileDialog.showDialog(owner, "Select") == JFileChooser.APPROVE_OPTION) { setSelectedFolder(getSelectedFolder()); notifyContentChanged(); } else { setSelectedFolder(currentSelectedFolder); // roll back } } }); } @Override protected String getValue(String identifier) { return getSelectedFolder(); } @Override protected ArrayList<String[]> getSerialization(String path) { ArrayList<String[]> keyValuePair = new ArrayList<String[]>(); keyValuePair.add(new String[]{path, getValue(null)}); return keyValuePair; } @Override protected boolean loadValue(String[] pair) { if (pair[0].equals("")) { setSelectedFolder(pair[1]); notifyContentChanged(); return true; } return false; } }