blob: 96d553a4cec4be1fc0cd27fbfd822d6f1134816f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2017 TwelveTone LLC 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:
* Steven Spungin <steven@spungin.tv> - initial API and implementation, Bug 424730
*******************************************************************************/
package org.eclipse.e4.tools.emf.ui.internal.common.resourcelocator.dialogs;
import java.net.URL;
import java.util.ArrayList;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceProxyVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.e4.tools.emf.ui.internal.common.resourcelocator.Messages;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
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.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
public class ProjectFolderPickerDialog extends TitleAreaDialog {
private TreeViewer viewer;
private IProject project;
private String srcPath;
private String value;
protected ProjectFolderPickerDialog(Shell parentShell, IProject project, String srcPath) {
super(parentShell);
this.project = project;
this.srcPath = srcPath;
}
static class ProjectContentProvider implements ITreeContentProvider {
private IProject project;
public ProjectContentProvider() {
}
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
this.project = (IProject) newInput;
}
@Override
public Object[] getElements(Object inputElement) {
return new Object[] { project.getName() };
}
@Override
public Object[] getChildren(final Object parentElement) {
if (parentElement instanceof String) {
return getChildren(project);
}
final IResource resource = (IResource) parentElement;
final ArrayList<Object> list = new ArrayList<>();
IResourceProxyVisitor visitor = proxy -> {
if (proxy.getType() == IResource.FOLDER && proxy.requestResource().getParent() == resource) {
if (proxy.requestResource().equals(resource) == false) {
list.add(proxy.requestResource());
}
}
return true;
};
try {
resource.accept(visitor, IResource.DEPTH_ONE);
} catch (CoreException e) {
e.printStackTrace();
}
return list.toArray(new Object[0]);
}
@Override
public Object getParent(Object element) {
IResource resource = (IResource) element;
return resource.getParent();
}
Boolean found = false;
@Override
public boolean hasChildren(Object element) {
if (element instanceof String) {
return true;
}
final IResource resource = (IResource) element;
try {
found = false;
resource.accept(proxy -> {
if (proxy.getType() == IResource.FOLDER && proxy.requestResource().equals(resource) == false) {
found = true;
return false;
}
return true;
}, IResource.DEPTH_ONE);
} catch (CoreException e) {
e.printStackTrace();
}
return found;
}
}
static class ProjectLabelProvider extends ColumnLabelProvider {
@Override
public String getText(Object element) {
if (element instanceof String) {
return element.toString();
}
IResource resource = (IResource) element;
return resource.getName();
}
@Override
public Image getImage(Object element) {
try {
if (element instanceof String) {
return new Image(Display.getDefault(), new URL(Messages.ProjectFolderPickerDialog_0).openStream());
}
return new Image(Display.getDefault(), new URL("platform:/plugin/org.eclipse.ui.ide/icons/full/obj16/folder.png").openStream()); //$NON-NLS-1$
} catch (Exception e) {
return super.getImage(element);
}
}
}
@Override
protected boolean isResizable() {
return true;
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
super.createButtonsForButtonBar(parent);
Button button = new Button(parent, SWT.PUSH);
button.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
button.setText(Messages.ProjectFolderPickerDialog_useSourceDirectory);
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
value = Path.fromOSString(srcPath).removeLastSegments(1).toOSString();
ProjectFolderPickerDialog.super.okPressed();
}
});
button.moveAbove(getButton(IDialogConstants.CANCEL_ID));
((GridLayout) parent.getLayout()).numColumns = 3;
}
@Override
protected void okPressed() {
Object selected = ((IStructuredSelection) viewer.getSelection()).getFirstElement();
if (selected == null || selected instanceof String) {
value = ""; //$NON-NLS-1$
} else {
IResource resource = (IResource) selected;
value = resource.getFullPath().removeFirstSegments(1).toOSString();
}
super.okPressed();
}
@Override
protected Control createDialogArea(Composite parent) {
// TODO Auto-generated method stub
Composite ret = (Composite) super.createDialogArea(parent);
viewer = new TreeViewer(ret);
viewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
viewer.setContentProvider(new ProjectContentProvider());
viewer.setLabelProvider(new ProjectLabelProvider());
viewer.setInput(project);
viewer.expandToLevel(2);
viewer.addDoubleClickListener(event -> okPressed());
if (srcPath != null) {
IPath path = Path.fromOSString(srcPath);
Composite compPath = new Composite(ret, SWT.NONE);
compPath.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
compPath.setLayout(new GridLayout(2, false));
Label label = new Label(compPath, SWT.NONE);
label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
label.setText(Messages.ProjectFolderPickerDialog_sourceResourceName);
Label label2 = new Label(compPath, SWT.NONE);
label2.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
label2.setText(path.lastSegment());
Label label3 = new Label(compPath, SWT.NONE);
label3.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
label3.setText(Messages.ProjectFolderPickerDialog_sourceResourceDirectory);
Label lblResourcePath = new Label(compPath, SWT.NONE);
lblResourcePath.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
lblResourcePath.setText(path.removeLastSegments(1).toOSString());
}
String message = Messages.ProjectFolderPickerDialog_6;
getShell().setText(message);
setTitle(message);
setMessage(message);
return ret;
}
public String getValue() {
return value;
}
}