/*******************************************************************************
* Copyright (c) 2012 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.ui.wizard.service;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.IType;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.jboss.tools.common.java.IParametedType;
import org.jboss.tools.common.java.ParametedType;
import org.jboss.tools.common.java.ParametedTypeFactory;
import org.jboss.tools.common.ui.CommonUIMessages;
import org.jboss.tools.common.ui.CommonUIPlugin;
import org.jboss.tools.common.ui.CommonUIImages;
import org.jboss.tools.common.ui.widget.editor.IFieldEditor;
import org.jboss.tools.common.ui.widget.editor.IFieldEditorFactory;
public class RegisterAsServiceDialog extends TitleAreaDialog {
IType type;
Map<String, IParametedType> types;
IFieldEditor serviceTypeSelector;
String result;
public RegisterAsServiceDialog(Shell parentShell, IType type) {
super(parentShell);
this.type = type;
initTypes();
setShellStyle(getShellStyle() | SWT.RESIZE);
List<String> serviceTypeNames = new ArrayList<String>(types.keySet());
String defaultValue = serviceTypeNames.isEmpty() ? "" : serviceTypeNames.get(0);
serviceTypeSelector = IFieldEditorFactory.INSTANCE.createComboEditor("serviceType", //$NON-NLS-1$
CommonUIMessages.REGISTER_AS_SERVICE_TYPE_LABEL, serviceTypeNames, defaultValue);
}
void initTypes() {
ParametedType parametedType = new ParametedTypeFactory().newParametedType(type);
Collection<IParametedType> ts = parametedType.getAllTypes();
Map<String, IParametedType> types = new TreeMap<String, IParametedType>();
for (IParametedType t: ts) {
if(t.getType() != null) {
String q = t.getType().getFullyQualifiedName();
types.put(q, t);
}
}
types.remove("java.lang.Object"); //$NON-NLS-1$
types.remove(type.getFullyQualifiedName());
this.types = types;
}
private final int DIALOG_WIDTH = 400;
private final int DIALOG_HEIGHT = 60;
protected Control createDialogArea(Composite parent) {
getShell().setText(CommonUIMessages.REGISTER_AS_SERVICE_TITLE);
setTitle(NLS.bind(CommonUIMessages.REGISTER_AS_SERVICE_SUB_TITLE, type.getFullyQualifiedName()));
setTitleImage(CommonUIImages.getInstance().getOrCreateImage(CommonUIImages.JAVA_SERVICE_PROVIDER_IMAGE)); // image is managed by registry
setMessage(CommonUIMessages.REGISTER_AS_SERVICE_MESSAGE);
if(types.isEmpty()) {
setErrorMessage(CommonUIMessages.REGISTER_AS_SERVICE_NO_TYPES_MESSAGE);
}
Composite composite = new Composite(parent, SWT.NONE);
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.marginHeight = 5;
gridLayout.marginWidth = 5;
gridLayout.horizontalSpacing = 10;
gridLayout.verticalSpacing = 0;
composite.setLayout(gridLayout);
Label dialogAreaSeparator = new Label(composite, SWT.HORIZONTAL | SWT.SEPARATOR);
dialogAreaSeparator.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
Control pageArea = createField(composite);
GridData gd = new GridData(SWT.FILL, SWT.BEGINNING, true, true);
pageArea.setLayoutData(gd);
dialogAreaSeparator = new Label(composite, SWT.HORIZONTAL | SWT.SEPARATOR);
dialogAreaSeparator.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
gd = new GridData(SWT.FILL, SWT.FILL, true, true);
gd.widthHint = DIALOG_WIDTH;
gd.heightHint = DIALOG_HEIGHT;
composite.setLayoutData(gd);
return composite;
}
Control createField(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout gridLayout = new GridLayout(2, false);
gridLayout.marginHeight = 10;
gridLayout.marginWidth = 0;
gridLayout.horizontalSpacing = 10;
gridLayout.verticalSpacing = 10;
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
composite.setLayoutData(gd);
composite.setLayout(gridLayout);
serviceTypeSelector.doFillIntoGrid(composite);
Object[] os = serviceTypeSelector.getEditorControls();
if(os.length == 2 && os[1] instanceof Combo) {
((Combo)os[1]).setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
}
serviceTypeSelector.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
validate();
}
});
return composite;
}
void validate() {
String serviceType = serviceTypeSelector.getValueAsString();
if(serviceType == null || serviceType.length() == 0) {
return;
}
IParametedType type = types.get(serviceType);
String warning = null;
if(type != null) {
IType t = type.getType();
try {
if(!t.isInterface() && !Flags.isAbstract(t.getFlags())) {
warning = CommonUIMessages.REGISTER_AS_SERVICE_NON_ABSTRACT_MESSAGE;
}
} catch (CoreException e) {
CommonUIPlugin.getDefault().logError(e);
}
}
String typeName = this.type.getFullyQualifiedName();
if(RegisterServiceUtil.isServiceRegistered(type.getType().getJavaProject().getProject(), typeName, serviceType)) {
getButton(IDialogConstants.OK_ID).setEnabled(false);
setErrorMessage(CommonUIMessages.REGISTER_AS_SERVICE_ALREADY_REGISTERED_MESSAGE);
} else {
getButton(IDialogConstants.OK_ID).setEnabled(true);
setErrorMessage(null);
if(warning != null) {
setMessage(warning, IMessageProvider.WARNING);
} else {
setMessage(CommonUIMessages.REGISTER_AS_SERVICE_MESSAGE);
}
}
}
protected Control createContents(Composite parent) {
Control c = super.createContents(parent);
if(types.isEmpty()) {
Button ok = getButton(IDialogConstants.OK_ID);
ok.setEnabled(false);
}
validate();
return c;
}
public void okPressed() {
result = serviceTypeSelector.getValueAsString();
super.okPressed();
}
public String getResult() {
return result;
}
public void setServiceType(String type) {
if(!types.containsKey(type)) {
throw new IllegalArgumentException(type);
}
serviceTypeSelector.setValue(type);
}
}