/***************************************************************************** * Copyright (c) 2010 CEA LIST. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation *****************************************************************************/ package org.eclipse.papyrus.customization.properties.generation.wizard.widget; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.emf.common.ui.dialogs.WorkspaceResourceDialog; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.papyrus.customization.properties.generation.messages.Messages; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; 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.Listener; import org.eclipse.swt.widgets.Text; /** * A Widget for selecting or creating a file in the workspace * * @author Camille Letavernier */ public class FileChooser extends Composite implements SelectionListener, Listener { private Text text; private Button browse; private IFile currentFile; private List<ViewerFilter> filters; private Set<Listener> listeners = new HashSet<Listener>(); private boolean newFile; /** * Constructs a new FileChooser in the given Composite * * @param parent * The composite in which the FileChooser is created * @param newFile * True if the fileChooser allows the user to create a new file, * false if he should select an existing one */ public FileChooser(Composite parent, boolean newFile) { super(parent, SWT.NONE); setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); GridLayout layout = new GridLayout(2, false); layout.marginWidth = 0; setLayout(layout); text = new Text(this, SWT.BORDER); text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); text.addListener(SWT.FocusOut, this); browse = new Button(this, SWT.PUSH); browse.setText(Messages.FileChooser_browseWorkspace); browse.addSelectionListener(this); filters = new LinkedList<ViewerFilter>(); this.newFile = newFile; } /** * @return the selected file path */ public String getFilePath() { String path = text.getText(); if(path.trim().equals("")) { //$NON-NLS-1$ return null; } return path.trim(); } /** * Sets the file extensions that this FileChooser accepts * Files that don't match one of these extensions will be hidden * * @param extensions */ public void setFilterExtensions(String[] extensions) { filters.clear(); ExtensionFilter filter = new ExtensionFilter(extensions); filters.add(filter); } public void handleEvent(Event event) { notifyChange(); } /** * Add a listener to this widget. The listener will be notified when the user * choose a new file * * @param listener */ public void addListener(Listener listener) { listeners.add(listener); } public void widgetSelected(SelectionEvent e) { IFile[] result = new IFile[0]; if(newFile) { IFile file = WorkspaceResourceDialog.openNewFile(getShell(), null, null, null, filters); if(file != null) result = new IFile[]{ file }; } else { result = WorkspaceResourceDialog.openFileSelection(getShell(), null, null, false, new Object[]{ currentFile }, filters); } if(result.length >= 1) { currentFile = result[0]; text.setText(currentFile.getFullPath().toString()); notifyChange(); } } private void notifyChange() { for(Listener listener : listeners) { listener.handleEvent(null); } } public void widgetDefaultSelected(SelectionEvent e) { //Nothing } }