diff options
Diffstat (limited to 'src/plugins/common/src/com/motorola/studio/android/wizards/elements/FileChooser.java')
-rw-r--r-- | src/plugins/common/src/com/motorola/studio/android/wizards/elements/FileChooser.java | 305 |
1 files changed, 305 insertions, 0 deletions
diff --git a/src/plugins/common/src/com/motorola/studio/android/wizards/elements/FileChooser.java b/src/plugins/common/src/com/motorola/studio/android/wizards/elements/FileChooser.java new file mode 100644 index 0000000..566c2b0 --- /dev/null +++ b/src/plugins/common/src/com/motorola/studio/android/wizards/elements/FileChooser.java @@ -0,0 +1,305 @@ +/* +* 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; + } + +} |