blob: 772387e7cc382dcaaaa6971b9871155960799b55 [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2012, 2012 SAP AG.
* 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:
* SAP AG - initial API, implementation and documentation
*
* </copyright>
*/
package org.eclipse.graphiti.tools.newprojectwizard.internal;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.ui.IJavaElementSearchConstants;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.pde.ui.templates.BaseOptionTemplateSection;
import org.eclipse.pde.ui.templates.StringOption;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
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.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.SelectionDialog;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleReference;
/**
* An option that realizes a group.
*/
public class SelectTypeOption extends StringOption {
private GroupOption groupOption;
private Text text;
private Label labelControl;
private boolean ignoreListener;
private Button buttonControl;
private int fStyle;
private String bundleName = null;
private final static int F_DEFAULT_STYLE = SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY;
/**
* The constructor.
*
* @param section
* the parent section
* @param name
* the unique option name
* @param label
* the translatable label of the option
* @param groupOption
*/
public SelectTypeOption(BaseOptionTemplateSection section, String name, String label, GroupOption groupOption) {
super(section, name, label);
fStyle = F_DEFAULT_STYLE;
setRequired(true);
setEnabled(false);
this.groupOption = groupOption;
}
/**
* A utility version of the <samp>getValue() </samp> method that converts
* the current value into the String object.
*
* @return the string version of the current value.
*/
public String getText() {
if (getValue() != null)
return getValue().toString();
return null;
}
/**
* A utility version of the <samp>setValue </samp> method that accepts
* String objects.
*
* @param newText
* the new text value of the option
* @see #setValue(Object)
*/
public void setText(String newText) {
setValue(newText);
}
/**
* Implements the superclass method by passing the string value of the new
* value to the widget
*
* @param value
* the new option value
*/
public void setValue(Object value) {
super.setValue(value);
if (text != null) {
ignoreListener = true;
String textValue = getText();
text.setText(textValue != null ? textValue : ""); //$NON-NLS-1$
ignoreListener = false;
}
}
/**
* Creates the string option control.
*
* @param parent
* parent composite of the string option widget
* @param span
* the number of columns that the widget should span
*/
public void createControl(Composite parent, int span) {
Composite composite = new Composite(groupOption.getGroup(), SWT.NONE);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = span;
composite.setLayoutData(gd);
composite.setLayout(new GridLayout(3, false));
labelControl = createLabel(composite, 1);
labelControl.setEnabled(isEnabled());
text = new Text(composite, fStyle);
if (getValue() != null)
text.setText(getValue().toString());
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 1;
text.setLayoutData(gd);
text.setEnabled(isEnabled());
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
if (ignoreListener)
return;
SelectTypeOption.super.setValue(text.getText());
getSection().validateOptions(SelectTypeOption.this);
}
});
buttonControl = new Button(composite, SWT.PUSH);
buttonControl.setText(Messages.SelectTypeOption_BrowseButton);
buttonControl.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
Shell parent = Display.getCurrent().getActiveShell();
SelectionDialog dialog = null;
try {
dialog = JavaUI.createTypeDialog(parent, PlatformUI.getWorkbench().getProgressService(),
SearchEngine.createWorkspaceScope(),
IJavaElementSearchConstants.CONSIDER_CLASSES_AND_INTERFACES, false);
} catch (JavaModelException jme) {
MessageDialog.openError(parent, "Could not open type selection dialog", jme.getMessage()); //$NON-NLS-1$
return;
}
dialog.setTitle(Messages.SelectTypeOption_TitleSelectDomainObject);
dialog.setMessage(Messages.SelectTypeOption_DescriptionSelectDomainObject);
if (dialog.open() == Dialog.OK) {
Object[] result = dialog.getResult();
if (result != null && result.length > 0 && result[0] instanceof IType) {
IType type = (IType) result[0];
Bundle containingBundle = null;
// Search for the first bundle that can resolve the
// desired class
Bundle[] bundles = Activator.getDefault().getBundle().getBundleContext().getBundles();
for (Bundle bundle : bundles) {
try {
Class<?> loadClass = bundle.loadClass(type.getFullyQualifiedName());
// Use the class loader of the class to identify
// the containing bundle
ClassLoader classLoader = loadClass.getClassLoader();
if (classLoader instanceof BundleReference) {
containingBundle = ((BundleReference) classLoader).getBundle();
setBundleName(containingBundle.getSymbolicName());
text.setText(type.getFullyQualifiedName());
return;
}
} catch (ClassNotFoundException cnfe) {
// Simply ignore
}
}
// Search for a Java source file in the workspace
ICompilationUnit compilationUnit = type.getCompilationUnit();
if (compilationUnit != null) {
IResource resource = null;
try {
resource = compilationUnit.getCorrespondingResource();
} catch (JavaModelException e1) {
// Simply ignore
}
if (resource != null && resource.exists()) {
IProject project = resource.getProject();
if (project != null && project.exists()) {
// Use project name as bundle name (should
// fit in most cases
setBundleName(project.getName());
text.setText(type.getFullyQualifiedName());
return;
}
}
}
text.setText(type.getFullyQualifiedName());
// Nothing found
MessageDialog
.openError(parent,
"No Bundle found", //$NON-NLS-1$
"The class '" + type.getFullyQualifiedName() //$NON-NLS-1$
+ "' could not be resolved within an installed plugin or as a Java source file in the workspace."); //$NON-NLS-1$
return;
}
}
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
buttonControl.setEnabled(isEnabled());
}
/**
* A string option is empty if its text field contains no text.
*
* @return true if there is no text in the text field.
*/
public boolean isEmpty() {
return getValue() == null || getValue().toString().length() == 0;
}
/**
* Implements the superclass method by passing the enabled state to the
* option's widget.
*
* @param enabled
*/
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
if (labelControl != null) {
labelControl.setEnabled(enabled);
text.setEnabled(enabled);
buttonControl.setEnabled(enabled);
}
}
public String getBundleName() {
return bundleName;
}
public void setBundleName(String bundleName) {
this.bundleName = bundleName;
}
}