/* * Copyright (C) 2012 The Android Open Source Project * * 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.motorola.studio.android.wizards.elements; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyListener; 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.layout.RowData; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import org.eclipse.ui.dialogs.ISelectionStatusValidator; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.eclipse.ui.views.navigator.ResourceComparator; import com.motorola.studio.android.common.CommonPlugin; import com.motorola.studio.android.common.utilities.i18n.UtilitiesNLS; /** * Composite to allow users to choose between filesystem and workspace files */ public class FileChooser extends Composite { /* * Label: TextField * Workspace... Filesystem... * */ private final String label; private Label fileLabel = null; private Text pathWidget = null; private Button filesystem = null, workspace = null; private String[] extensionFilter = null; private IContainer container; /** * Constructs a new FileChooser object * @param parent the parent composite * @param style the style * @param label A label to put before the path text or null to no label */ public FileChooser(Composite parent, int style, String label) { super(parent, style); this.label = label; setupLayout(); createFields(); } /** * Constructs a new FileChooser object * * @param container Container in which limits the range of the filter. For instance * if a project is passed as a container, all the search will be done within the passed-project. * @param parent the parent composite * @param style the style * @param label A label to put before the path text or null to no label */ public FileChooser(IContainer container, Composite parent, int style, String label) { // call constructor this(parent, style, label); // assign container this.container = container; } /** * Setup this composite layout */ private void setupLayout() { GridLayout layout = new GridLayout(2, false); layout.marginHeight = 0; layout.marginWidth = 0; this.setLayout(layout); this.setLayoutData(new GridData(GridData.FILL_BOTH)); } private void createFields() { GridData gridData; if (label != null) { fileLabel = new Label(this, SWT.NONE); fileLabel.setText(label); gridData = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); fileLabel.setLayoutData(gridData); } pathWidget = new Text(this, SWT.BORDER); gridData = new GridData(SWT.FILL, SWT.CENTER, true, false, label != null ? 1 : 2, 1); pathWidget.setLayoutData(gridData); Composite buttonsComposite = new Composite(this, SWT.NONE); gridData = new GridData(SWT.RIGHT, SWT.CENTER, true, false, 2, 1); buttonsComposite.setLayoutData(gridData); buttonsComposite.setLayout(new RowLayout(SWT.HORIZONTAL)); filesystem = new Button(buttonsComposite, SWT.PUSH); filesystem.setLayoutData(new RowData()); filesystem.setText(UtilitiesNLS.UI_FileChooser_Filesystem); filesystem.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { FileDialog fileDialog = new FileDialog(getShell(), SWT.OPEN); fileDialog.setFilterExtensions(extensionFilter); fileDialog.setFilterPath(pathWidget.getText()); String returnedPath = fileDialog.open(); if (returnedPath != null) { pathWidget.setText(returnedPath); } } public void widgetDefaultSelected(SelectionEvent e) { //do nothing } }); workspace = new Button(buttonsComposite, SWT.PUSH); workspace.setLayoutData(new RowData()); workspace.setText(UtilitiesNLS.UI_FileChooser_Workspace); workspace.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), new WorkbenchLabelProvider(), new WorkbenchContentProvider()); dialog.setTitle(UtilitiesNLS.UI_FileChooser_Dialog_Title); dialog.setMessage(UtilitiesNLS.UI_FileChooser_Dialog_Message); // set the input depending whether the container exists if (container != null) { // the container exists, set it as the limit dialog.setInput(container); } else { // the container does not exists, set the workspace as the limit dialog.setInput(ResourcesPlugin.getWorkspace().getRoot()); } dialog.setComparator(new ResourceComparator(ResourceComparator.NAME)); //filter extensions dialog.addFilter(new ViewerFilter() { @Override public boolean select(Viewer viewer, Object parentElement, Object element) { boolean filtered = false; if ((extensionFilter != null) && (element instanceof IFile)) { IFile file = (IFile) element; int i = 0; while ((i < extensionFilter.length) && !filtered) { String fileExtensionToShow = extensionFilter[i].substring(extensionFilter[i] .lastIndexOf(".") + 1); String fileExtension = file.getFileExtension(); if ((fileExtension != null) && !fileExtension.equals(fileExtensionToShow)) //$NON-NLS-1$ { filtered = true; } i++; } } return !filtered; } }); //user can select only one FILE dialog.setValidator(new ISelectionStatusValidator() { public IStatus validate(Object[] selection) { IStatus valid = new Status(IStatus.ERROR, CommonPlugin.PLUGIN_ID, ""); //$NON-NLS-1$ if (selection.length == 1) { if (selection[0] instanceof IFile) { valid = new Status(IStatus.OK, CommonPlugin.PLUGIN_ID, ""); //$NON-NLS-1$ } } return valid; } }); if (dialog.open() == IDialogConstants.OK_ID) { IResource resource = (IResource) dialog.getFirstResult(); pathWidget.setText(resource.getLocation().toOSString()); } } public void widgetDefaultSelected(SelectionEvent e) { //do nothing } }); } /* * (non-Javadoc) * @see org.eclipse.swt.widgets.Control#setEnabled(boolean) */ @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); if (fileLabel != null) { fileLabel.setEnabled(enabled); } workspace.setEnabled(enabled); filesystem.setEnabled(enabled); pathWidget.setEnabled(enabled); } /** * * @return the text with the path of the file selected */ public String getText() { return pathWidget.getText(); } /* * (non-Javadoc) * @see org.eclipse.swt.widgets.FileDialog#setFilterExtensions(String[]) */ public void setFilterExtensions(String[] filter) { extensionFilter = filter; } public void setText(String text) { pathWidget.setText(text); } /** * Add modify text listener * @param modifyListener */ public void addModifyListener(ModifyListener modifyListener) { pathWidget.addModifyListener(modifyListener); } /** * Sets the container. * @param container */ public void setContainer(IContainer container) { this.container = container; } }