blob: e0f0d78df84a204ee069c9a81c2e8274bc35e1be [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 Code 9 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:
* Code 9 Corporation - initial API and implementation
* Chris Aniszczyk <caniszczyk@gmail.com>
* Rafael Oliveira Nobrega <rafael.oliveira@gmail.com> - bug 242028
*******************************************************************************/
package org.eclipse.pde.internal.ds.ui.editor.dialogs;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.ui.IJavaElementSearchConstants;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.pde.internal.ds.core.IDSConstants;
import org.eclipse.pde.internal.ds.core.IDSReference;
import org.eclipse.pde.internal.ds.ui.Activator;
import org.eclipse.pde.internal.ds.ui.Messages;
import org.eclipse.pde.internal.ds.ui.SWTUtil;
import org.eclipse.pde.internal.ds.ui.editor.FormEntryAdapter;
import org.eclipse.pde.internal.ds.ui.editor.FormLayoutFactory;
import org.eclipse.pde.internal.ds.ui.editor.sections.DSReferenceSection;
import org.eclipse.pde.internal.ds.ui.parts.ComboPart;
import org.eclipse.pde.internal.ds.ui.parts.FormEntry;
import org.eclipse.pde.internal.ds.ui.wizards.DSNewClassCreationWizard;
import org.eclipse.pde.internal.ui.editor.PDEFormEditor;
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.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.SelectionDialog;
import org.eclipse.ui.forms.FormDialog;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.FormToolkit;
public class DSEditReferenceDialog extends FormDialog {
private IDSReference fReference;
private FormEntry fNameEntry;
private FormEntry fInterfaceEntry;
private FormEntry fBindEntry;
private FormEntry fUnBindEntry;
private FormEntry fTargetEntry;
private ComboPart fCardinality;
private Label fLabelCardinality;
private ComboPart fPolicy;
private Label fLabelPolicy;
private DSReferenceSection fReferenceSection;
public DSEditReferenceDialog(Shell parentShell, IDSReference reference,
DSReferenceSection referenceSection) {
super(parentShell);
fReference = reference;
fReferenceSection = referenceSection;
}
protected void createFormContent(IManagedForm mform) {
mform.getForm().setText(Messages.DSEditReferenceDialog_dialog_title);
Composite container = mform.getForm().getBody();
container.setLayout(new GridLayout());
container.setLayoutData(new GridData(GridData.FILL_BOTH));
FormToolkit toolkit = mform.getToolkit();
toolkit.decorateFormHeading(mform.getForm().getForm());
Composite entryContainer = toolkit.createComposite(container);
entryContainer.setLayout(FormLayoutFactory.createSectionClientGridLayout(
false, 3));
entryContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
// Attribute: name
fNameEntry = new FormEntry(entryContainer, toolkit,
Messages.DSReferenceDetails_nameEntry, SWT.NONE);
// Attribute: Interface
fInterfaceEntry = new FormEntry(entryContainer, toolkit,
Messages.DSReferenceDetails_interfaceEntry,
Messages.DSReferenceDetails_browse, false, 0);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
gd.horizontalIndent = 3;
// Attribute: Cardinality
addCardinalityEntry(toolkit, entryContainer, gd);
// Attribute: Policy
addPolicyEntry(toolkit, entryContainer, gd);
// Attribute: Target
fTargetEntry = new FormEntry(entryContainer, toolkit,
Messages.DSReferenceDetails_targetEntry, SWT.NONE);
// Attribute: Bind
fBindEntry = new FormEntry(entryContainer, toolkit,
Messages.DSReferenceDetails_bindEntry, SWT.NONE);
// Attribute: UnBind
fUnBindEntry = new FormEntry(entryContainer, toolkit,
Messages.DSReferenceDetails_unbindEntry, SWT.NONE);
// Update Fields with fReference`s attributes values
updateFields();
setInterfaceEntryListeners();
}
private void addCardinalityEntry(FormToolkit toolkit, Composite container3,
GridData gd) {
fLabelCardinality = toolkit.createLabel(container3,
Messages.DSReferenceDetails_cardinalityLabel, SWT.WRAP);
fLabelCardinality.setForeground(toolkit.getColors().getForeground());
fCardinality = new ComboPart();
fCardinality.createControl(container3, toolkit, SWT.READ_ONLY);
String[] itemsCard = new String[] {
IDSConstants.VALUE_REFERENCE_CARDINALITY_ZERO_ONE,
IDSConstants.VALUE_REFERENCE_CARDINALITY_ZERO_N,
IDSConstants.VALUE_REFERENCE_CARDINALITY_ONE_ONE,
IDSConstants.VALUE_REFERENCE_CARDINALITY_ONE_N };
fCardinality.setItems(itemsCard);
fCardinality.getControl().setLayoutData(gd);
}
private void addPolicyEntry(FormToolkit toolkit, Composite container3,
GridData gd) {
fLabelPolicy = toolkit.createLabel(container3,
Messages.DSReferenceDetails_policeLabel, SWT.WRAP);
fLabelPolicy.setForeground(toolkit.getColors().getForeground());
fPolicy = new ComboPart();
fPolicy.createControl(container3, toolkit, SWT.READ_ONLY);
String[] itemsPolicy = new String[] {
IDSConstants.VALUE_REFERENCE_POLICY_STATIC,
IDSConstants.VALUE_REFERENCE_POLICY_DYNAMIC };
fPolicy.setItems(itemsPolicy);
fPolicy.getControl().setLayoutData(gd);
}
public boolean isHelpAvailable() {
return false;
}
protected void buttonPressed(int buttonId) {
switch (buttonId) {
case 0:
handleOKPressed();
break;
}
super.buttonPressed(buttonId);
}
private void handleOKPressed() {
if (!fNameEntry.getValue().equals("")) { //$NON-NLS-1$
if (!fNameEntry.getValue().equals(fReference.getReferenceName())) {
fReference.setReferenceName(fNameEntry.getValue());
}
}
if (!fInterfaceEntry.getValue().equals("")) { //$NON-NLS-1$
if (!fInterfaceEntry.getValue().equals(
fReference.getReferenceInterface())) {
fReference.setReferenceInterface(fInterfaceEntry.getValue());
}
}
if (!fBindEntry.getValue().equals("")) { //$NON-NLS-1$
if (!fBindEntry.getValue().equals(fReference.getReferenceBind())) {
fReference.setReferenceBind(fBindEntry.getValue());
}
}
if (!fUnBindEntry.getValue().equals("")) { //$NON-NLS-1$
if (!fUnBindEntry.getValue()
.equals(fReference.getReferenceUnbind())) {
fReference.setReferenceUnbind(fUnBindEntry.getValue());
}
}
if (!fTargetEntry.getValue().equals("")) { //$NON-NLS-1$
if (!fTargetEntry.getValue()
.equals(fReference.getReferenceTarget())) {
fReference.setReferenceTarget(fTargetEntry.getValue());
}
}
if (fCardinality.getSelection() != null) {
if (!fCardinality.getSelection().equals(
fReference.getReferenceCardinality())) {
fReference.setReferenceCardinality(fCardinality.getSelection());
}
}
if (fPolicy.getSelection() != null) {
if (!fPolicy.getSelection().equals(fReference.getReferencePolicy())) {
fReference.setReferencePolicy(fPolicy.getSelection());
}
}
}
private void updateFields() {
if (fReference == null) {
return;
}
if (fReference.getReferenceName() == null) {
fNameEntry.setValue(""); //$NON-NLS-1$
} else {
// Attribute: name
fNameEntry.setValue(fReference.getReferenceName(), true);
}
fNameEntry.setEditable(true);
if (fReference.getReferenceInterface() == null) {
fInterfaceEntry.setValue(""); //$NON-NLS-1$
} else {
// Attribute: Interface
fInterfaceEntry.setValue(fReference.getReferenceInterface(), true);
}
fInterfaceEntry.setEditable(true);
// Attribute: Target
fTargetEntry.setValue(fReference.getReferenceTarget(), true);
fTargetEntry.setEditable(true);
// Attribute: Bind
fBindEntry.setValue(fReference.getReferenceBind(), true);
fBindEntry.setEditable(true);
// Attribute: Unbind
fUnBindEntry.setValue(fReference.getReferenceUnbind(), true);
fUnBindEntry.setEditable(true);
// Attribute: Cardinality
if (fReference.getReferenceCardinality() != null)
fCardinality.setText(fReference.getReferenceCardinality());
// Attribute: Policy
if (fReference.getReferencePolicy() != null)
fPolicy.setText(fReference.getReferencePolicy());
}
public void setInterfaceEntryListeners() {
// Attribute: Interface
fInterfaceEntry.setFormEntryListener(new FormEntryAdapter(
this.fReferenceSection) {
public void textValueChanged(FormEntry entry) {
// no op due to OK Button
}
public void textDirty(FormEntry entry) {
// no op due to OK Button
}
public void linkActivated(HyperlinkEvent e) {
String value = fInterfaceEntry.getValue();
value = handleLinkActivated(value, false);
if (value != null)
fInterfaceEntry.setValue(value);
}
public void browseButtonSelected(FormEntry entry) {
doOpenSelectionDialog(
IJavaElementSearchConstants.CONSIDER_CLASSES_AND_INTERFACES,
fInterfaceEntry);
}
});
}
private String handleLinkActivated(String value, boolean isInter) {
IProject project = getProject();
try {
if (project != null && project.hasNature(JavaCore.NATURE_ID)) {
IJavaProject javaProject = JavaCore.create(project);
IJavaElement element = javaProject.findType(value.replace('$',
'.'));
if (element != null)
JavaUI.openInEditor(element);
else {
// TODO create our own wizard for reuse here
DSNewClassCreationWizard wizard = new DSNewClassCreationWizard(
project, isInter, value);
WizardDialog dialog = new WizardDialog(Activator
.getActiveWorkbenchShell(), wizard);
dialog.create();
SWTUtil.setDialogSize(dialog, 400, 500);
if (dialog.open() == Window.OK) {
return wizard.getQualifiedName();
}
}
}
} catch (PartInitException e1) {
} catch (CoreException e1) {
}
return null;
}
private IProject getProject() {
PDEFormEditor editor = (PDEFormEditor) this.fReferenceSection.getPage()
.getEditor();
return editor.getCommonProject();
}
private void doOpenSelectionDialog(int scopeType, FormEntry entry) {
try {
String filter = entry.getValue();
filter = filter.substring(filter.lastIndexOf(".") + 1); //$NON-NLS-1$
SelectionDialog dialog = JavaUI.createTypeDialog(Activator
.getActiveWorkbenchShell(), PlatformUI.getWorkbench()
.getProgressService(), SearchEngine.createWorkspaceScope(),
scopeType, false, filter);
dialog.setTitle(Messages.DSReferenceDetails_selectType);
if (dialog.open() == Window.OK) {
IType type = (IType) dialog.getResult()[0];
entry.setValue(type.getFullyQualifiedName('$'));
entry.commit();
}
} catch (CoreException e) {
}
}
}