summaryrefslogtreecommitdiff
path: root/src/plugins/common/src/com/motorola/studio/android/wizards/elements/FileChooser.java
diff options
context:
space:
mode:
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.java305
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;
+ }
+
+}