/* * IzPack - Copyright 2001-2009 Julien Ponge, All Rights Reserved. * * Copyright 2009 Dennis Reil * * http://izpack.org/ * http://izpack.codehaus.org/ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.izforge.izpack.panels; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.io.File; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ListSelectionModel; import com.izforge.izpack.gui.ButtonFactory; import com.izforge.izpack.installer.InstallData; import com.izforge.izpack.installer.InstallerFrame; import com.izforge.izpack.util.Debug; public class MultipleFileInputField extends JPanel implements ActionListener, FocusListener { private static final long serialVersionUID = 4673684743657328492L; boolean isDirectory; InstallerFrame parentFrame; List<ValidatorContainer> validators; DefaultListModel model; JList fileList; JButton browseBtn; JButton deleteBtn; String set; int size; InstallData data; String fileExtension; String fileExtensionDescription; boolean allowEmpty; boolean createMultipleVariables; int visibleRows = 10; int preferredX = 200; int preferredY = 200; String labeltext; public MultipleFileInputField(InstallerFrame parent, InstallData data, boolean directory, String set, int size,List<ValidatorContainer> validatorConfig,String fileExt, String fileExtDesc,boolean createMultipleVariables,int visibleRows, int preferredXSize, int preferredYSize, String labelText){ this.parentFrame = parent; this.data = data; this.validators = validatorConfig; this.set = set; this.size = size; this.fileExtension = fileExt; this.fileExtensionDescription = fileExtDesc; this.isDirectory = directory; this.createMultipleVariables = createMultipleVariables; this.visibleRows = visibleRows; this.preferredX = preferredXSize; this.preferredY = preferredYSize; this.labeltext = labelText; this.initialize(); } public void clearFiles(){ this.model.clear(); } public void addFile(String file){ this.model.addElement(file); } public void initialize(){ JPanel main = new JPanel(); main.setLayout(new BoxLayout(main,BoxLayout.Y_AXIS)); JPanel labelPanel = new JPanel(); labelPanel.setLayout(new BoxLayout(labelPanel,BoxLayout.X_AXIS)); JLabel label = new JLabel(this.labeltext); labelPanel.add(label); labelPanel.add(Box.createHorizontalGlue()); main.add(labelPanel); model = new DefaultListModel(); fileList = new JList(model); fileList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); fileList.setVisibleRowCount(visibleRows); JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel,BoxLayout.X_AXIS)); JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new BoxLayout(buttonPanel,BoxLayout.Y_AXIS)); browseBtn = ButtonFactory.createButton(data.langpack.getString("UserInputPanel.button.browse"), data.buttonsHColor); browseBtn.addActionListener(this); deleteBtn = ButtonFactory.createButton(data.langpack.getString("UserInputPanel.button.delete"), data.buttonsHColor); deleteBtn.addActionListener(this); JScrollPane scroller = new JScrollPane(fileList); scroller.setPreferredSize(new Dimension(preferredX,preferredY)); panel.add(scroller); buttonPanel.add(browseBtn); buttonPanel.add(deleteBtn); buttonPanel.add(Box.createVerticalGlue()); panel.add(buttonPanel); main.add(panel); main.add(Box.createVerticalGlue()); add(main); } public void actionPerformed(ActionEvent arg0) { if (arg0.getSource() == browseBtn){ Debug.trace("Show dirchooser"); String initialPath = "."; if (fileList.getSelectedValue() != null){ initialPath = (String) fileList.getSelectedValue(); } JFileChooser filechooser = new JFileChooser(initialPath); if (isDirectory){ filechooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); } else { filechooser.setFileSelectionMode(JFileChooser.FILES_ONLY); if ((fileExtension != null) && (fileExtensionDescription != null)){ UserInputFileFilter fileFilter = new UserInputFileFilter(); fileFilter.setFileExt(fileExtension); fileFilter.setFileExtDesc(fileExtensionDescription); filechooser.setFileFilter(fileFilter); } } if (filechooser.showOpenDialog(parentFrame) == JFileChooser.APPROVE_OPTION) { String selectedFile = filechooser.getSelectedFile().getAbsolutePath(); model.addElement(selectedFile); Debug.trace("Setting current file chooser directory to: " + selectedFile); } } if (arg0.getSource() == deleteBtn){ Debug.trace("Delete selected file from list"); if (fileList.getSelectedValue() != null){ model.removeElement(fileList.getSelectedValue()); } } } public List<String> getSelectedFiles(){ List<String> result = null; if (model.size() > 0){ result = new ArrayList<String>(); Enumeration<?> elements = model.elements(); for (;elements.hasMoreElements();) { String element = (String) elements.nextElement(); result.add(element); } } return result; } private void showMessage(String messageType) { JOptionPane.showMessageDialog(parentFrame, parentFrame.langpack.getString("UserInputPanel." + messageType + ".message"), parentFrame.langpack.getString("UserInputPanel." + messageType + ".caption"), JOptionPane.WARNING_MESSAGE); } private boolean validateFile(String input){ boolean result = false; if (allowEmpty && ((input == null) || (input.length() == 0))){ result = true; } else if (input != null){ File file = new File(input); if (isDirectory && !file.isDirectory()){ result = false; showMessage("dir.notdirectory"); } else if (!isDirectory && !file.isFile()){ result = false; showMessage("file.notfile"); } else { StringInputProcessingClient processingClient = new StringInputProcessingClient(input,validators); boolean success = processingClient.validate(); if (!success){ JOptionPane.showMessageDialog(parentFrame, processingClient.getValidationMessage(), parentFrame.langpack.getString("UserInputPanel.error.caption"), JOptionPane.WARNING_MESSAGE); } result = success; } } else { if (isDirectory){ showMessage("dir.nodirectory"); } else { showMessage("file.nofile"); } } return result; } public boolean validateField(){ boolean result = false; int fileCount = model.getSize(); for (int i=0; i < fileCount; i++){ result = validateFile((String) model.getElementAt(i)); if (!result){ break; } } return result; } public boolean isAllowEmptyInput() { return allowEmpty; } public void setAllowEmptyInput(boolean allowEmpty) { this.allowEmpty = allowEmpty; } public void focusGained(FocusEvent e) { // TODO Auto-generated method stub } public void focusLost(FocusEvent e) { } public boolean isCreateMultipleVariables() { return createMultipleVariables; } public void setCreateMultipleVariables(boolean createMultipleVariables) { this.createMultipleVariables = createMultipleVariables; } }