package net.sourceforge.pmd.eclipse.ui.preferences.editors; import java.io.File; import net.sourceforge.pmd.util.StringUtil; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; /** * A general purpose selection widget that deals with files. * * @author Brian Remedios */ public class FilePicker extends Composite { private Text fileField; private Button pickButton; private final String dialogTitle; private final String[] filterExtensions; public FilePicker(final Composite parent, int style, String theDialogTitle, String[] theFilterExtensions) { super(parent, SWT.None); dialogTitle = theDialogTitle; filterExtensions = theFilterExtensions; GridLayout layout = new GridLayout(3, true); layout.verticalSpacing = 0; layout.horizontalSpacing = 0; layout.marginHeight = 0; layout.marginWidth = 0; setLayout(layout); fileField = new Text(this, style); fileField.addListener(SWT.FocusOut, new Listener() { public void handleEvent(Event event) { // reviseMethodListFor(fileField.getText()); } }); fileField.addListener(SWT.Modify, new Listener() { public void handleEvent(Event event) { // reviseMethodListFor(fileField.getText()); // no cleanup, avoid event loop & overflow } }); pickButton = new Button(this, SWT.PUSH); pickButton.setText("..."); pickButton.setLayoutData( new GridData(GridData.BEGINNING, GridData.CENTER, false, false) ); pickButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { openFileDialog(parent.getShell()); } }); GridData data = new GridData(GridData.FILL_HORIZONTAL); data.horizontalSpan = 2; fileField.setLayoutData(data); } public void addFocusOutListener(Listener listener) { fileField.addListener(SWT.FocusOut, listener); } private void openFileDialog(Shell shell) { FileDialog fd = new FileDialog(shell, SWT.OPEN); fd.setText(dialogTitle); fd.setFilterPath("C:/"); if (filterExtensions != null) fd.setFilterExtensions(filterExtensions); String selected = fd.open(); fileField.setText(selected == null ? "" : selected); fileField.setFocus(); } public void setBackground(Color clr) { fileField.setBackground(clr); } public void setFile(File file) { fileField.setText(file == null ? "" : file.getAbsolutePath()); } public void setEnabled(boolean flag) { super.setEnabled(flag); fileField.setEnabled(flag); pickButton.setEnabled(flag); } public void setEditable(boolean flag) { fileField.setEditable(flag); } public File getFile() { String name = fileField.getText(); return StringUtil.isEmpty(name) ? null : new File(name); } }