/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.ui.attribute.editor;
import java.util.ArrayList;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchWizard;
import org.jboss.tools.common.meta.XAttribute;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.filesystems.FileSystemsHelper;
import org.jboss.tools.common.model.plugin.ModelPlugin;
import org.jboss.tools.common.model.ui.IValueChangeListener;
import org.jboss.tools.common.model.ui.IValueProvider;
import org.jboss.tools.common.model.ui.ModelUIPlugin;
import org.jboss.tools.common.model.ui.attribute.adapter.DefaultValueAdapter;
import org.jboss.tools.common.model.ui.attribute.adapter.IModelPropertyEditorAdapter;
import org.jboss.tools.common.model.ui.widgets.IWidgetSettings;
import org.jboss.tools.common.model.ui.wizards.INewClassWizard;
import org.jboss.tools.common.model.ui.wizards.INewClassWizardFactory;
import org.jboss.tools.common.model.ui.wizards.NewClassWizard;
import org.jboss.tools.common.model.ui.wizards.NewTypeWizardAdapter;
import org.jboss.tools.common.model.util.AccessibleJava;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
import org.jboss.tools.common.model.util.ModelFeatureFactory;
import org.jboss.tools.common.model.util.XModelObjectUtil;
public class JavaHyperlinkLineFieldEditor extends StringButtonFieldEditorEx
implements JavaHyperlinkCueLabelProvider.JavaClassHolder {
// private final static String CANNOT_OPEN_SOURCE_JAVA_PROJECT_FAILED = "JavaHyperlinkLineFieldEditor.CannotOpenJavaSource";
// private final static String CANNOT_FIND_SOURCE = "JavaHyperlinkLineFieldEditor.CannotFindSource";
private IProject project;
private String publicId;
private String xPath;
AccessibleJava.IContextPackageProvider cpp = null;
public JavaHyperlinkLineFieldEditor() {
super();
}
public JavaHyperlinkLineFieldEditor(IWidgetSettings settings) {
super(settings);
}
public void setContextPackageProvider(AccessibleJava.IContextPackageProvider cpp) {
this.cpp = cpp;
}
// IPropertyFieldEditor
public void setPropertyEditor(IPropertyEditor propertyEditor) {
super.setPropertyEditor(propertyEditor);
if (propertyEditor!=null) {
valueProvider = (IValueProvider)propertyEditor.getAdapter(IValueProvider.class);
// GET Java Project Name!
if (valueProvider instanceof DefaultValueAdapter) {
if (((DefaultValueAdapter)valueProvider).getModel()!=null) {
XModelObject xmo = FileSystemsHelper.getFileSystems(((DefaultValueAdapter)valueProvider).getModel());
if (xmo!=null) {
IProject project = (IProject)xmo.getModel().getProperties().get("project"); //$NON-NLS-1$
if (project!=null) {
this.project = project;
}
}
xmo = ((DefaultValueAdapter)valueProvider).getModelObject();
if (xmo!=null) {
// get publicId
publicId = XModelObjectUtil.getDocumentPublicID(xmo);
}
XAttribute attr = ((DefaultValueAdapter)valueProvider).getAttribute();
if (attr!=null) {
// get xPath
xPath = XModelObjectUtil.getXMLLocalPath(attr);
AccessibleJava.IContextPackageProvider cpp = getPackageProvider();
if(cpp != null) {
setContextPackageProvider(cpp);
}
}
}
}
valueProvider.addValueChangeListener(this);
valueChangeListener = (IValueChangeListener)propertyEditor.getAdapter(IValueChangeListener.class);
if(project != null) {
setLabelAction(new OpenJavaEditorAction());
setChangeButtonText(JFaceResources.getString("openBrowse")); //$NON-NLS-1$
}
}
}
// private String getSuperClass(String publicId, String xPath) {
// return MetaClassTemplateHelper.instance.getSuperClassName(project, publicId, xPath);
// }
// private String[] getInterfaces(String publicId, String xPath) {
// return MetaClassTemplateHelper.instance.getInterfacesName(project, publicId, xPath);
// }
class OpenJavaEditorAction extends Action {
public void run() {
String text = JavaHyperlinkLineFieldEditor.this.getTextField().getText();
JavaAdapter javaAdapter = JavaAdapter.getInstance();
javaAdapter.init(project, publicId, xPath, text);
IJavaElement javaElement = javaAdapter.getJavaElement();
if (javaElement==null) {
NewTypeWizardAdapter wizardAdapter = new NewTypeWizardAdapter(project);
wizardAdapter.setRawClassName(javaAdapter.getClassName());
wizardAdapter.setRawPackageName(javaAdapter.getPackageName());
String superClassName = javaAdapter.getSuperClass();
String[] interfacesName = javaAdapter.getInterfacees();
wizardAdapter.setRawSuperClassName(superClassName);
if (interfacesName!=null && interfacesName.length>0) {
for (int i=0;i<interfacesName.length;++i) {
wizardAdapter.addRawInterfaceName(interfacesName[i]);
}
}
INewClassWizard wizard = null;
XAttribute a = ((DefaultValueAdapter)getPropertyEditor().getInput()).getAttribute();
if(a != null) {
String cls = a.getProperty("newWizardClass");
if(cls != null && cls.length() > 0) {
wizard = (INewClassWizard)ModelFeatureFactory.getInstance().createFeatureInstance(cls);
} else {
cls = a.getProperty("newWizardClassFactory");
if(cls != null && cls.length() > 0) {
INewClassWizardFactory factory = (INewClassWizardFactory)ModelFeatureFactory.getInstance().createFeatureInstance(cls);
wizard = factory.createWizard(((DefaultValueAdapter)getPropertyEditor().getInput()).getModelObject(), a);
}
}
}
if(wizard == null) {
wizard = new NewClassWizard();
}
if(wizard instanceof IWorkbenchWizard) {
((IWorkbenchWizard)wizard).init(ModelUIPlugin.getDefault().getWorkbench(), new StructuredSelection());
}
wizard.setAdapter(wizardAdapter);
WizardDialog dialog = new WizardDialog(ModelUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell(), wizard);
dialog.create();
int result = dialog.open();
if (result == WizardDialog.OK) {
String newValue = wizard.getQualifiedClassName();
JavaHyperlinkLineFieldEditor.this.valueProvider.setValue(newValue);
if(wizard.getContainer() != null) {
wizard.performFinish();
}
}
if(dialog.getShell() != null && !dialog.getShell().isDisposed()) {
dialog.close();
}
} else {
try {
JavaUI.openInEditor(javaElement);
} catch (CoreException e) {
ModelUIPlugin.getPluginLog().logError(e);
}
}
}
}
public IProject getProject() {
return project;
}
public void setProject(IProject project) {
this.project = project;
}
protected void valueChanged() {
super.valueChanged();
if (getTextField()!=null) {
String text = getTextField().getText();
if ((text!=null)&&(text.length()>0)) {
if (getLabelAction()!=null) {
getLabelAction().setEnabled(Boolean.TRUE.booleanValue());
return;
}
}
}
if (getLabelAction()!=null) {
getLabelAction().setEnabled(Boolean.TRUE.booleanValue());
}
}
protected Control createTextChangeControl(Composite parent) {
Control control = super.createTextChangeControl(parent);
if (getLabelAction()!=null) {
getLabelAction().setEnabled(Boolean.TRUE.booleanValue());
}
return control;
}
public Control createTextControl(Composite parent) {
Control control = super.createTextControl(parent);
Text text = getTextField();
text.setData("JavaHyperlinkLineFieldEditor", this); //$NON-NLS-1$
return control;
}
boolean classExists;
String textCache = null;
long timeStamp = -1;
public boolean canCreateClass() {
String text = (getTextField() != null) ? getTextField().getText()
: (valueProvider != null) ? valueProvider.getStringValue(true) : null;
if(text == null) return false;
if(text.length() == 0) return true;
for (int i = 0; i < text.length(); i++) {
char ch = text.charAt(i);
if(ch != '.' && !Character.isJavaIdentifierPart(ch)) return false;
}
return true;
}
public boolean classExists() {
String text = (getTextField() != null) ? getTextField().getText()
: (valueProvider != null) ? valueProvider.getStringValue(true) : null;
if(text == null || text.length() == 0) return false;
JavaAdapter javaAdapter = JavaAdapter.getInstance();
if(text.equals(textCache) && timeStamp == javaAdapter.lastTimeChange) {
return classExists;
}
javaAdapter.init(project, publicId, xPath, text);
timeStamp = javaAdapter.lastTimeChange;
textCache = text;
return classExists = (javaAdapter.getJavaElement() != null);
}
protected String getHyperlinkLableToolTip() {
return classExists() ? "Open" : "Create";
}
private AccessibleJava.IContextPackageProvider getPackageProvider() {
IModelPropertyEditorAdapter adapter = (IModelPropertyEditorAdapter)propertyEditor.getInput();
XAttribute a = adapter.getAttribute();
if(a == null) return null;
String cls = a.getProperty("contextPackageProvider"); //$NON-NLS-1$
if(cls == null || cls.length() == 0) return null;
try {
AccessibleJava.IContextPackageProvider o = (AccessibleJava.IContextPackageProvider)ModelFeatureFactory.getInstance().createFeatureInstance(cls);
if(o != null) o.setObject(((DefaultValueAdapter)adapter).getModelObject());
return o;
} catch (ClassCastException e) {
ModelUIPlugin.getPluginLog().logError(e);
}
return null;
}
private IJavaSearchScope getScope(String javaProjectName) {
IJavaElement[] elements = new IJavaElement[0];
if(javaProjectName != null) {
IPath path = new Path(javaProjectName);
IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
IProject proj = res.getProject();
IJavaProject jproject = JavaCore.create(proj);
IPackageFragmentRoot fCurrRoot = jproject.getPackageFragmentRoot(res);
elements = new IJavaElement[] { fCurrRoot.getJavaProject() };
} else {
IProject[] ps = ModelPlugin.getWorkspace().getRoot().getProjects();
ArrayList<IJavaElement> l = new ArrayList<IJavaElement>();
for (int i = 0; i < ps.length; i++) {
if(EclipseResourceUtil.getJavaProject(ps[i]) != null) l.add(JavaCore.create(ps[i]));
}
elements = l.toArray(new IJavaElement[0]);
}
return SearchEngine.createJavaSearchScope(elements);
}
public Object callExternal(Shell shell) {
if(propertyEditor instanceof JavaEclipseChoicerEditor) {
return ((JavaEclipseChoicerEditor)propertyEditor).callExternal(shell);
}
return null;
}
}