/*******************************************************************************
* 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.text.MessageFormat;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.internal.ui.dialogs.FilteredTypesSelectionDialog;
import org.eclipse.jdt.ui.dialogs.ITypeInfoFilterExtension;
import org.eclipse.jdt.ui.dialogs.ITypeInfoRequestor;
import org.eclipse.jdt.ui.dialogs.TypeSelectionExtension;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog;
import org.jboss.tools.common.meta.key.WizardKeys;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.ui.IValueProvider;
import org.jboss.tools.common.model.ui.ModelUIPlugin;
import org.jboss.tools.common.model.ui.attribute.IValueFilter;
import org.jboss.tools.common.model.ui.attribute.adapter.DefaultValueAdapter;
import org.jboss.tools.common.model.ui.widgets.IWidgetSettings;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
public class JavaEclipseChoicerEditor extends ValueEditor {
protected JavaHyperlinkCellEditor cellEditor;
//protected JavaChoicerFieldEditor fieldEditor;
protected JavaHyperlinkLineFieldEditor fieldEditor;
public JavaEclipseChoicerEditor() {}
public JavaEclipseChoicerEditor(IWidgetSettings settings) {
super(settings);
}
public void dispose() {
super.dispose();
if (cellEditor!=null) cellEditor.dispose();
cellEditor = null;
if (fieldEditor!=null) fieldEditor.dispose();
fieldEditor = null;
}
public boolean isGreedyEditor() {
return false;
}
protected CellEditor createCellEditor(Composite parent) {
// cellEditor = new DialogCellEditorEx(parent, SWT.NONE);
cellEditor = new JavaHyperlinkCellEditor(parent, SWT.NONE);
cellEditor.setPropertyEditor(this);
return cellEditor;
}
protected ExtendedFieldEditor createFieldEditor(Composite parent) {
fieldEditor = new JavaHyperlinkLineFieldEditor(settings);
return fieldEditor;
}
public String getChangeButtonName() {
return JFaceResources.getString("openBrowse"); //$NON-NLS-1$
}
public boolean callsExternal() {
return true;
}
public Object callExternal(Shell shell) {
IJavaProject jp = null;
DefaultValueAdapter adapter = (DefaultValueAdapter)getInput();
XModelObject o = adapter.getModelObject();
if(o != null) {
IProject p = EclipseResourceUtil.getProject(o);
if(p != null) {
jp = EclipseResourceUtil.getJavaProject(p);
}
}
String title = MessageFormat.format("Select {0}", getAttributeName());
if(adapter != null && adapter.getAttribute() != null) {
String key = "" + adapter.getAttribute().getModelEntity().getName() + "." + adapter.getAttribute().getName().replace(' ', '_') + ".edit"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
String t = WizardKeys.getLabelText(key);
if(t != null) {
title = t;
} else {
title = MessageFormat.format("Select {0}",
WizardKeys.getAttributeDisplayName(adapter.getAttribute(), true));
}
}
FilteredTypesSelectionDialog dialog = new FilteredTypesSelectionDialog(
shell,
false,
ModelUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow(),
jp == null ? SearchEngine.createWorkspaceScope()
: SearchEngine.createJavaSearchScope(new IJavaElement[]{jp}),
IJavaSearchConstants.TYPE, createTypeSelectionExtension());
dialog.setTitle(title);
IValueProvider valueProvider = (IValueProvider)adapter.getAdapter(IValueProvider.class);
String v = valueProvider.getStringValue(true);
dialog.setInitialPattern(v);
int status = dialog.open();
if(status == FilteredItemsSelectionDialog.OK) {
Object result = dialog.getFirstResult();
if(result instanceof IType) {
return ((IType)result).getFullyQualifiedName('.');
}
}
return null;
}
TypeSelectionExtension createTypeSelectionExtension() {
final ITypeInfoFilterExtension filter = createFilterExtension();
if(filter == null) return null;
return new TypeSelectionExtension() {
public ITypeInfoFilterExtension getFilterExtension() {
return filter;
}
};
}
ITypeInfoFilterExtension createFilterExtension() {
if(getInput() instanceof IAdaptable) {
IValueFilter filter = (IValueFilter)((IAdaptable)getInput()).getAdapter(IValueFilter.class);
if(filter != null) {
return new FilterExtension(filter);
}
}
return null;
}
class FilterExtension implements ITypeInfoFilterExtension {
IValueFilter filter;
public FilterExtension(IValueFilter filter) {
this.filter = filter;
}
public boolean select(ITypeInfoRequestor typeInfoRequestor) {
String pkg = typeInfoRequestor.getPackageName();
String cls = typeInfoRequestor.getTypeName();
String q = pkg == null || pkg.length() == 0 ? cls : pkg + "." + cls;
return filter.accept(q);
}
}
}