/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 org.apache.jmeter.gui.util; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.LinkedList; import java.util.List; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.apache.jmeter.util.JMeterUtils; public class FilePanelEntry extends HorizontalPanel implements ActionListener { private static final long serialVersionUID = 280L; private static final Font FONT_DEFAULT = UIManager.getDefaults().getFont("TextField.font"); //$NON-NLS-1$ private static final Font FONT_SMALL = new Font("SansSerif", Font.PLAIN, (int) Math.round(FONT_DEFAULT.getSize() * 0.8)); //$NON-NLS-1$ private final JTextField filename = new JTextField(10); private final JLabel label; private final JButton browse = new JButton(JMeterUtils.getResString("browse")); //$NON-NLS-1$ private static final String ACTION_BROWSE = "browse"; //$NON-NLS-1$ private final List<ChangeListener> listeners = new LinkedList<>(); private final String[] filetypes; private boolean onlyDirectories = false; // Mainly needed for unit test Serialisable tests public FilePanelEntry() { this(JMeterUtils.getResString("file_visualizer_filename")); //$NON-NLS-1$ } public FilePanelEntry(String label) { this(label, (ChangeListener) null); } public FilePanelEntry(String label, String ... exts) { this(label, (ChangeListener) null, exts); } public FilePanelEntry(String label, boolean onlyDirectories, String ... exts) { this(label, onlyDirectories, (ChangeListener) null, exts); } public FilePanelEntry(String label, ChangeListener listener, String ... exts) { this(label, false, listener, exts); } public FilePanelEntry(String label, boolean onlyDirectories, ChangeListener listener, String ... exts) { this.label = new JLabel(label); if (listener != null) { listeners.add(listener); } if (exts != null && !(exts.length == 1 && exts[0] == null) // String null is converted to String[]{null} NOSONAR it's not code ) { this.filetypes = new String[exts.length]; System.arraycopy(exts, 0, this.filetypes, 0, exts.length); } else { this.filetypes = null; } this.onlyDirectories=onlyDirectories; init(); } public final void addChangeListener(ChangeListener l) { listeners.add(l); } private void init() { // WARNING: called from ctor so must not be overridden (i.e. must be private or final) add(label); add(filename); filename.addActionListener(this); browse.setFont(FONT_SMALL); add(browse); browse.setActionCommand(ACTION_BROWSE); browse.addActionListener(this); } public void clearGui(){ filename.setText(""); // $NON-NLS-1$ } /** * If the gui needs to enable/disable the FilePanel, call the method. * * @param enable The Flag whether the {@link FilePanel} should be enabled */ public void enableFile(boolean enable) { browse.setEnabled(enable); filename.setEnabled(enable); } /** * Gets the filename attribute of the FilePanel object. * * @return the filename value */ public String getFilename() { return filename.getText(); } /** * Sets the filename attribute of the FilePanel object. * * @param f * the new filename value */ public void setFilename(String f) { filename.setText(f); } private void fireFileChanged() { for (ChangeListener cl : listeners) { cl.stateChanged(new ChangeEvent(this)); } } @Override public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals(ACTION_BROWSE)) { JFileChooser chooser; if(filetypes == null || filetypes.length == 0){ chooser = FileDialoger.promptToOpenFile(filename.getText(),onlyDirectories); } else { chooser = FileDialoger.promptToOpenFile(filetypes, filename.getText(),onlyDirectories); } if (chooser != null && chooser.getSelectedFile() != null) { filename.setText(chooser.getSelectedFile().getPath()); fireFileChanged(); } } else { fireFileChanged(); } } }