| /** |
| * <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; |
| } |
| } |