/*******************************************************************************
* Copyright (c) 2010 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.cdi.ui.wizard;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.IBuffer;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.ISourceRange;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.internal.corext.codemanipulation.StubUtility;
import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
import org.eclipse.jdt.ui.wizards.NewAnnotationWizardPage;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
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.ui.PlatformUI;
import org.jboss.tools.cdi.core.CDIConstants;
import org.jboss.tools.cdi.core.CDICoreMessages;
import org.jboss.tools.cdi.core.CDICoreNature;
import org.jboss.tools.cdi.core.CDICorePlugin;
import org.jboss.tools.cdi.core.CDIImages;
import org.jboss.tools.cdi.core.ICDIProject;
import org.jboss.tools.cdi.ui.CDIUIMessages;
import org.jboss.tools.common.ui.widget.editor.CheckBoxFieldEditor;
import org.jboss.tools.common.ui.widget.editor.CompositeEditor;
import org.jboss.tools.common.ui.widget.editor.IFieldEditor;
import org.jboss.tools.common.ui.widget.editor.IFieldEditorFactory;
import org.jboss.tools.common.ui.widget.editor.ITaggedFieldEditor;
import org.jboss.tools.common.ui.widget.editor.LabelFieldEditor;
/**
*
* @author Viacheslav Kabanovich
*
*/
public abstract class NewCDIAnnotationWizardPage extends NewAnnotationWizardPage {
protected CheckBoxEditorWrapper inherited = null;
protected IFieldEditor target = null;
public NewCDIAnnotationWizardPage() {
setImageDescriptor(CDIImages.getImageDescriptor(CDIImages.CDI_ANNOTATION_IMAGE));
}
protected void createTypeMembers(IType newType, final ImportsManager imports, IProgressMonitor monitor) throws CoreException {
ISourceRange range = newType.getSourceRange();
IBuffer buf = newType.getCompilationUnit().getBuffer();
String lineDelimiter = StubUtility.getLineDelimiterUsed(newType.getJavaProject());
StringBuffer sb = new StringBuffer();
addAnnotations(imports, sb, lineDelimiter);
buf.replace(range.getOffset(), 0, sb.toString());
}
protected abstract void addAnnotations(ImportsManager imports, StringBuffer sb, String lineDelimiter);
protected void addTargetAnnotation(ImportsManager imports, StringBuffer sb, String lineDelimiter, String[] targets) {
if(targets.length == 0) {
return;
}
imports.addImport("java.lang.annotation.Target");
StringBuffer list = new StringBuffer();
for (int i = 0; i < targets.length; i++) {
imports.addImport("static java.lang.annotation.ElementType." + targets[i]);
if(i > 0) list.append(", ");
list.append(targets[i]);
}
sb.append("@Target( {" + list.toString() + "} )").append(lineDelimiter);
}
static void addAnnotation(String typeName, ImportsManager imports, StringBuffer sb, String lineDelimiter) {
int i = typeName.lastIndexOf('.');
String name = typeName.substring(i + 1);
imports.addImport(typeName);
sb.append("@").append(name).append(lineDelimiter);
}
protected void addInheritedAnnotation(ImportsManager imports, StringBuffer sb, String lineDelimiter) {
if(inherited != null && inherited.composite.getValue() == Boolean.TRUE) {
addAnnotation(CDIConstants.INHERITED_ANNOTATION_TYPE_NAME, imports, sb, lineDelimiter);
}
}
protected void addRetentionAnnotation(ImportsManager imports, StringBuffer sb, String lineDelimiter) {
imports.addImport(CDIConstants.RETENTION_ANNOTATION_TYPE_NAME);
imports.addImport("static java.lang.annotation.RetentionPolicy.RUNTIME");
sb.append("@Retention(RUNTIME)").append(lineDelimiter);
}
protected void addDocumentedAnnotation(ImportsManager imports, StringBuffer sb, String lineDelimiter) {
addAnnotation("java.lang.annotation.Documented", imports, sb, lineDelimiter);
}
public void createControl(Composite parent) {
initializeDialogUnits(parent);
Composite composite= new Composite(parent, SWT.NONE);
int nColumns= 4;
GridLayout layout= new GridLayout();
layout.numColumns= nColumns;
composite.setLayout(layout);
createContainerControls(composite, nColumns);
createPackageControls(composite, nColumns);
// createEnclosingTypeControls(composite, nColumns);
createSeparator(composite, nColumns);
createTypeNameControls(composite, nColumns);
// createModifierControls(composite, nColumns);
createCustomFields(composite);
createCommentControls(composite, nColumns);
enableCommentControl(true);
setControl(composite);
Dialog.applyDialogFont(composite);
PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IJavaHelpContextIds.NEW_ANNOTATION_WIZARD_PAGE);
}
protected abstract void createCustomFields(Composite composite);
protected CheckBoxEditorWrapper createCheckBoxField(Composite composite, String name, String label, boolean defaultValue) {
CheckBoxEditorWrapper wrapper = new CheckBoxEditorWrapper();
wrapper.checkBox = new CheckBoxFieldEditor(name,label,Boolean.valueOf(defaultValue));
CompositeEditor editor = new CompositeEditor(name,label, defaultValue);
editor.addFieldEditors(new IFieldEditor[]{new LabelFieldEditor(name,""), wrapper.checkBox});
wrapper.composite = editor;
wrapper.composite.doFillIntoGrid(composite);
((Button)wrapper.checkBox.getCheckBoxControl()).setText(label);
return wrapper;
}
protected void createInheritedField(Composite composite, boolean defaultValue) {
String label = "Add @Inherited";
inherited = createCheckBoxField(composite, "isInherited", label, defaultValue);
}
protected void createTargetField(Composite composite, List<String> values) {
target = createComboField("Target", CDIUIMessages.FIELD_EDITOR_TARGET_LABEL, composite, values);
}
protected ITaggedFieldEditor createComboField(String name, String label, Composite composite, List<String> values) {
ITaggedFieldEditor result = IFieldEditorFactory.INSTANCE.createComboEditor(name, label, values, values.get(0));
((CompositeEditor)result).addFieldEditors(new IFieldEditor[]{new LabelFieldEditor(name, "")});
result.doFillIntoGrid(composite);
Combo combo = (Combo)result.getEditorControls()[1];
Object layoutData = combo.getLayoutData();
if(layoutData instanceof GridData) {
((GridData)layoutData).horizontalAlignment = GridData.FILL;
}
return result;
}
protected String[] getTargets() {
if(target == null) {
return new String[]{"TYPE", "METHOD", "PARAMETER", "FIELD"};
}
String value = (String)target.getValue();
String[] vs = value.length() == 0 ? new String[0] : value.split(",");
for (int i = 0; i < vs.length; i++) vs[i] = vs[i].trim();
return vs;
}
public void setInherited(boolean b) {
if(inherited != null) {
inherited.composite.setValue(b);
}
}
public void setTarget(String s) {
if(target != null) {
((CompositeEditor)target).setValue(s);
}
}
static ICDIProject getCDIProject(IJavaProject jp) {
CDICoreNature n = getCDINatureWithProgress(jp.getProject());
return n == null ? null : n.getDelegate();
}
public static CDICoreNature getCDINatureWithProgress(final IProject project){
final CDICoreNature cdiNature = CDICorePlugin.getCDI(project, false);
if(cdiNature != null && !cdiNature.isStorageResolved()){
try{
PlatformUI.getWorkbench().getProgressService().run(false, false, new IRunnableWithProgress(){
public void run(IProgressMonitor monitor)
throws InvocationTargetException, InterruptedException {
monitor.beginTask(CDICoreMessages.CDI_UTIL_BUILD_CDI_MODEL, 10);
monitor.worked(3);
cdiNature.resolve();
monitor.worked(7);
}
});
}catch(InterruptedException ie){
CDICorePlugin.getDefault().logError(ie);
}catch(InvocationTargetException ite){
CDICorePlugin.getDefault().logError(ite);
}
}
return cdiNature;
}
}