/* * JBoss by Red Hat * Copyright 2006-2009, Red Hat Middleware, LLC, and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.ide.eclipse.freemarker.dialogs; import org.eclipse.core.resources.IResource; 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.JavaModelException; import org.eclipse.jdt.core.search.SearchEngine; import org.eclipse.jdt.ui.IJavaElementSearchConstants; import org.eclipse.jdt.ui.JavaUI; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.window.ApplicationWindow; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; 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.eclipse.swt.widgets.Text; import org.eclipse.ui.dialogs.SelectionDialog; import org.jboss.ide.eclipse.freemarker.Messages; import org.jboss.ide.eclipse.freemarker.configuration.ConfigurationManager; import org.jboss.ide.eclipse.freemarker.configuration.ContextValue; /** * @author <a href="mailto:joe@binamics.com">Joe Hudson</a> */ public class ContextValueDialog extends Dialog { private IResource resource; private ContextValue contextValue; private Text keyText; private Text valueText; private Text singleValueText; private Label singleLabel; private Button singleBrowse; public ContextValueDialog(Shell parentShell, ContextValue contextValue, IResource resource) { super(parentShell); this.resource = resource; this.contextValue = contextValue; } /** * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell) */ protected void configureShell(Shell newShell) { newShell.setText(Messages.ContextValueDialog_SHELL_CONTEXT_VALUE_CONFIG); super.configureShell(newShell); } protected Control createDialogArea(Composite parent) { Composite composite = new Composite(parent, SWT.NULL); composite.setLayout(new GridLayout(3, false)); Label label = new Label(composite, SWT.NULL); label.setText(Messages.ContextValueDialog_LABEL_NAME); keyText = new Text(composite, SWT.BORDER); if (null != contextValue) { keyText.setText(contextValue.name); keyText.setEnabled(false); } GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; gd.widthHint = 200; keyText.setLayoutData(gd); label = new Label(composite, SWT.NULL); label.setText(Messages.ContextValueDialog_LABEL_TYPE); valueText = new Text(composite, SWT.BORDER); valueText.setEnabled(false); valueText.setBackground(new Color(null, 255, 255, 255)); gd = new GridData(GridData.FILL_HORIZONTAL); gd.widthHint = 250; valueText.setLayoutData(gd); if (null != contextValue && null != contextValue.objClass) valueText.setText(contextValue.objClass.getName()); Button browse = new Button(composite, 8); browse.setText(Messages.ContextValueDialog_BUTTON_BROWSE); browse.addMouseListener(new MouseListener() { public void mouseDown(MouseEvent e) { try { IJavaProject javaProject = JavaCore.create(resource.getProject()); if(javaProject != null) { org.eclipse.jdt.core.search.IJavaSearchScope searchScope = SearchEngine.createJavaSearchScope(new IJavaElement[]{javaProject}); SelectionDialog sd = JavaUI.createTypeDialog(getShell(), new ApplicationWindow(getShell()), searchScope, IJavaElementSearchConstants.CONSIDER_CLASSES_AND_INTERFACES, false); sd.open(); Object objects[] = sd.getResult(); if(objects != null && objects.length > 0) { IType type = (IType)objects[0]; String fullyQualifiedName = type.getFullyQualifiedName('.'); valueText.setText(type.getFullyQualifiedName()); String[] interfaces = type.getSuperInterfaceNames(); boolean isList = false; if ("java.lang.Object".equals(fullyQualifiedName)) isList = true; //$NON-NLS-1$ else { for (int i=0; i<interfaces.length; i++) { if (interfaces[i].equals("java.util.Collection") || interfaces[i].equals("java.util.List") || interfaces[i].equals("java.util.Set")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ isList = true; break; } } } if (isList) { singleBrowse.setEnabled(true); singleLabel.setEnabled(true); singleValueText.setEnabled(true); } else { singleBrowse.setEnabled(false); singleLabel.setEnabled(false); singleValueText.setEnabled(false); singleValueText.setText(""); //$NON-NLS-1$ } } } else { MessageDialog.openError(getShell(), Messages.ContextValueDialog_JAVA_PROJECT_ERROR, Messages.ContextValueDialog_MUST_BE_JAVA_PROJECT); } } catch(JavaModelException _ex) { } } public void mouseDoubleClick(MouseEvent mouseevent) { } public void mouseUp(MouseEvent mouseevent) { } }); boolean enabled = false; if (null != contextValue && null != contextValue.singularClass) enabled = true; singleLabel = new Label(composite, SWT.NULL); singleLabel.setEnabled(enabled); singleLabel.setText(Messages.ContextValueDialog_LABEL_LIST_ENTRY_TYPE); singleValueText = new Text(composite, SWT.BORDER); singleValueText.setEnabled(enabled); singleValueText.setBackground(new Color(null, 255, 255, 255)); gd = new GridData(GridData.FILL_HORIZONTAL); gd.widthHint = 250; singleValueText.setLayoutData(gd); if (enabled) singleValueText.setText(contextValue.singularClass.getName()); singleBrowse = new Button(composite, 8); singleBrowse.setEnabled(enabled); singleBrowse.setText(Messages.ContextValueDialog_BUTTON_BROWSE); singleBrowse.addMouseListener(new MouseListener() { public void mouseDown(MouseEvent e) { try { IJavaProject javaProject = JavaCore.create(resource.getProject()); if(javaProject != null) { org.eclipse.jdt.core.search.IJavaSearchScope searchScope = SearchEngine.createJavaSearchScope(new IJavaElement[]{javaProject}); SelectionDialog sd = JavaUI.createTypeDialog(getShell(), new ApplicationWindow(getShell()), searchScope, IJavaElementSearchConstants.CONSIDER_CLASSES_AND_INTERFACES, false); sd.open(); Object objects[] = sd.getResult(); if(objects != null && objects.length > 0) { IType type = (IType)objects[0]; singleValueText.setText(type.getFullyQualifiedName()); } } else { MessageDialog.openError(getShell(), Messages.ContextValueDialog_JAVA_PROJECT_ERROR, Messages.ContextValueDialog_MUST_BE_JAVA_PROJECT); } } catch(JavaModelException _ex) { } } public void mouseDoubleClick(MouseEvent mouseevent) { } public void mouseUp(MouseEvent mouseevent) { } }); return parent; } protected void okPressed() { try { String name = keyText.getText().trim(); while (name.startsWith("$")) name = name.substring(1, name.length()); //$NON-NLS-1$ if (name.length() == 0) MessageDialog.openError(getShell(), Messages.ContextValueDialog_ERROR, Messages.ContextValueDialog_MUST_CHOOSE_REFERENCE); String className = valueText.getText().trim(); if (className.length() == 0) MessageDialog.openError(getShell(), Messages.ContextValueDialog_ERROR, Messages.ContextValueDialog_MUST_CHOOSE_CLASS); String singularClassName = singleValueText.getText().trim(); Class singularClass = null; if (null != singularClassName && singularClassName.trim().length() > 0) singularClass = ConfigurationManager.getInstance(resource.getProject()).getClass(singularClassName); if (className.length() == 0) singularClassName = null; contextValue = new ContextValue( name, ConfigurationManager.getInstance(resource.getProject()).getClass(className), singularClass); ConfigurationManager.getInstance(resource.getProject()).addContextValue(contextValue, resource); } catch (Exception e) { MessageDialog.openError(getShell(), Messages.ContextValueDialog_ERROR, e.getMessage()); } super.okPressed(); } }