blob: afa72ff85df9af8e9029dffedbcf92554056b9e6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2012 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.ui.util.filedialog;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.part.DrillDownComposite;
public class FileSelectionGroup extends Composite {
// The listener to notify of events
private Listener listener;
private String message;
// Last selection made by user
private IResource selectedResource;
// handle on parts
private TreeViewer treeViewer;
// Filters
private ViewerFileFilter viewerFileFilter;
// private ViewerFileFilterMatcher viewerFileFilterMatcher
private String filterPatterns;
// sizing constants
private static final int SIZING_SELECTION_PANE_HEIGHT = 175;
private static final int SIZING_SELECTION_PANE_WIDTH = 200;
/**
* Creates a new instance of the widget.
*/
public FileSelectionGroup(
Composite parent,
Listener listener,
String message) {
this(parent, listener, message, null);
}
public FileSelectionGroup(
Composite parent,
Listener listener,
String message,
String filterPatterns) {
super(parent, SWT.NONE);
this.filterPatterns = filterPatterns;
this.listener = listener;
this.message = message;
this.setFont(parent.getFont());
createViewerFileFilter();
createContents();
}
/**
* Creates ViewerFileFilter using array of objects.
*/
public void createViewerFileFilter() {
if (filterPatterns != null) {
viewerFileFilter = new ViewerFileFilter(filterPatterns);
}
}
/**
* Creates the contents of the composite.
*/
public void createContents() {
GridLayout layout = new GridLayout();
layout.marginWidth = 0;
setLayout(layout);
setLayoutData(new GridData(GridData.FILL_BOTH));
Label label = new Label(this, SWT.WRAP);
label.setText(message != null ? message : ""); //$NON-NLS-1$
label.setFont(this.getFont());
createTreeViewer();
}
/**
* Returns a new drill down viewer for this dialog.
*/
protected void createTreeViewer() {
// Create drill down.
DrillDownComposite drillDown = new DrillDownComposite(this, SWT.BORDER);
GridData spec =
new GridData(
GridData.VERTICAL_ALIGN_FILL
| GridData.HORIZONTAL_ALIGN_FILL
| GridData.GRAB_HORIZONTAL
| GridData.GRAB_VERTICAL);
spec.widthHint = SIZING_SELECTION_PANE_WIDTH;
spec.heightHint = SIZING_SELECTION_PANE_HEIGHT;
drillDown.setLayoutData(spec);
// Create tree viewer inside drill down.
treeViewer = new TreeViewer(drillDown, SWT.NONE);
drillDown.setChildTree(treeViewer);
treeViewer.setContentProvider(new WorkbenchContentProvider());
treeViewer.setLabelProvider(new WorkbenchLabelProvider());
treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
resourceSelectionChanged((IResource) selection.getFirstElement());
// allow null
}
});
treeViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
ISelection selection = event.getSelection();
if (selection instanceof IStructuredSelection) {
Object item = ((IStructuredSelection) selection).getFirstElement();
if (treeViewer.getExpandedState(item))
treeViewer.collapseToLevel(item, 1);
else
treeViewer.expandToLevel(item, 1);
}
}
});
if (viewerFileFilter != null)
treeViewer.addFilter(viewerFileFilter);
// This has to be done after the viewer has been laid out
treeViewer.setInput(ResourcesPlugin.getWorkspace());
}
/**
* Returns the "full path" (i.e. first segment is project name) of the currently selected file.
*/
public IPath getResourceFullPath() {
if (selectedResource == null) return null;
return selectedResource.getFullPath();
}
public IResource getSelectedResource () {
return selectedResource;
}
/**
* Returns the tree viewer.
*/
public TreeViewer getTreeViewer() {
return treeViewer;
}
/**
* The file selection has changed in the
* tree view. Update the file name field
* value and notify all listeners.
*/
public void resourceSelectionChanged(IResource resource) {
selectedResource = resource;
// fire an event so the parent can update its controls
if (listener != null) {
Event changeEvent = new Event();
changeEvent.type = SWT.Selection;
changeEvent.widget = this;
listener.handleEvent(changeEvent);
}
}
/**
* Gives focus to one of the widgets in the group, as determined by the group.
*/
public void setInitialFocus() {
treeViewer.getTree().setFocus();
}
/**
* Sets the selected existing file.
*/
public void setSelectedResource(IResource resource) {
// https://issues.jboss.org/browse/JBIDE-8738
if (resource==null)
return;
selectedResource = resource;
//expand to and select the specified file
List itemsToExpand = new ArrayList();
IContainer parent = resource.getParent();
while (parent != null) {
itemsToExpand.add(0, parent);
parent = parent.getParent();
}
treeViewer.setExpandedElements(itemsToExpand.toArray());
treeViewer.setSelection(new StructuredSelection(resource), true);
}
}