/******************************************************************************* * Copyright (c) 2008 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.smooks.configuration.editors.javabean12; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Label; import org.eclipse.swt.widgets.Text; import org.jboss.tools.smooks.configuration.editors.utils.JavaTypeFieldDialog; import org.jboss.tools.smooks.configuration.editors.utils.ProjectClassLoader; /** * @author Dart * */ public class JavaBeanSelectionWizardPage extends WizardPage { private String beanID = null; private String beanClass = null; private IJavaProject project; private String collectionClass = null; private boolean isArray = false; private boolean isCollection = false; private JavaBeanModel javaBeanModel = null; private Button arrayButton; private Button collectionClassBrowseButton; private Text colllectionClassText; public JavaBeanSelectionWizardPage(String pageName, String title, ImageDescriptor titleImage, IJavaProject project) { super(pageName, title, titleImage); this.project = project; this.setTitle(Messages.JavaBeanSelectionWizardPage_WizardTitle); this.setDescription(Messages.JavaBeanSelectionWizardPage_WizardDes); } public JavaBeanSelectionWizardPage(String pageName, IJavaProject project) { super(pageName); this.project = project; this.setTitle(Messages.JavaBeanSelectionWizardPage_WizardTitle); this.setDescription(Messages.JavaBeanSelectionWizardPage_WizardDes); } public List<JavaBeanModel> getJavaBeanModelList() { if (getJavaBeanModel() != null) { List<JavaBeanModel> list = new ArrayList<JavaBeanModel>(); list.add(javaBeanModel); return list; } return Collections.emptyList(); } /** * @return the javaBeanModel */ public JavaBeanModel getJavaBeanModel() { return javaBeanModel; } /* * (non-Javadoc) * * @see * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets * .Composite) */ public void createControl(Composite parent) { Composite mainComposite = new Composite(parent, SWT.NONE); GridData gd = new GridData(GridData.FILL_BOTH); GridLayout gl = new GridLayout(); gl.numColumns = 2; mainComposite.setLayout(gl); mainComposite.setLayoutData(gd); // createBeanIDControls(mainComposite); createBeanClassControls(mainComposite); createBeanTypeControls(mainComposite); Label seperator = new Label(mainComposite, SWT.HORIZONTAL | SWT.SEPARATOR); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; gd.heightHint = 18; seperator.setLayoutData(gd); setControl(mainComposite); this.setPageComplete(false); } private void createBeanTypeControls(Composite mainComposite) { GridData gd = new GridData(GridData.FILL_HORIZONTAL); Label beanTypeLabel = new Label(mainComposite, SWT.NONE); beanTypeLabel.setText(Messages.JavaBeanSelectionWizardPage_BeanTypeLabel); Composite composite = new Composite(mainComposite, SWT.NONE); gd = new GridData(GridData.FILL_HORIZONTAL); composite.setLayoutData(gd); GridLayout gl = new GridLayout(); gl.numColumns = 2; gl.marginHeight = 0; gl.marginWidth = 0; gl.makeColumnsEqualWidth = false; composite.setLayout(gl); arrayButton = new Button(composite, SWT.CHECK); arrayButton.setText(Messages.JavaBeanSelectionWizardPage_ArrayCheckBoxLabel); final Button collectionButton = new Button(composite, SWT.CHECK); collectionButton.setText(Messages.JavaBeanSelectionWizardPage_CollectionLabel); Label beanClassLabel = new Label(mainComposite, SWT.NONE); beanClassLabel.setText(Messages.JavaBeanSelectionWizardPage_CollectionClassLabel); Composite beanClassComposite = new Composite(mainComposite, SWT.NONE); GridLayout gl1 = new GridLayout(); gl1.numColumns = 2; gl1.marginHeight = 0; gl1.marginWidth = 0; gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; beanClassComposite.setLayoutData(gd); beanClassComposite.setLayout(gl); colllectionClassText = new Text(beanClassComposite, SWT.BORDER); gd = new GridData(GridData.FILL_HORIZONTAL); colllectionClassText.setLayoutData(gd); colllectionClassText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { Text t = (Text) e.getSource(); collectionClass = t.getText(); refreshJavaBeanModel(); updateWizardPageStatus(); } }); colllectionClassText.setEnabled(false); beanClassComposite.setLayoutData(gd); collectionClassBrowseButton = new Button(beanClassComposite, SWT.NONE); collectionClassBrowseButton.setText(Messages.JavaBeanSelectionWizardPage_BrowseButtonLabel); collectionClassBrowseButton.addSelectionListener(new SelectionAdapter() { /* * (non-Javadoc) * * @see * org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse * .swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { String classString = JavaTypeFieldDialog.openJavaTypeDialog(getShell(), project); colllectionClassText.setText(classString); } }); collectionClassBrowseButton.setEnabled(false); arrayButton.addSelectionListener(new SelectionAdapter() { /* * (non-Javadoc) * * @see * org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse * .swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { Button button = (Button) e.getSource(); if (button.getSelection()) { isArray = true; collectionButton.setSelection(false); isCollection = false; collectionClassBrowseButton.setEnabled(false); colllectionClassText.setEnabled(false); } else { isArray = false; } refreshJavaBeanModel(); updateWizardPageStatus(); } }); collectionButton.addSelectionListener(new SelectionAdapter() { /* * (non-Javadoc) * * @see * org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse * .swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { Button button = (Button) e.getSource(); if (button.getSelection()) { isCollection = true; arrayButton.setSelection(false); isArray = false; collectionClassBrowseButton.setEnabled(true); colllectionClassText.setEnabled(true); } else { isCollection = false; collectionClassBrowseButton.setEnabled(false); colllectionClassText.setEnabled(false); } updateWizardPageStatus(); } }); collectionButton.setVisible(false); beanClassComposite.setVisible(false); beanClassLabel.setVisible(false); } protected void refreshJavaBeanModel() { if (beanClass == null || "".equals(beanClass.trim())) { //$NON-NLS-1$ } else { try { ProjectClassLoader loader = new ProjectClassLoader(project); javaBeanModel = null; isCollection = isCollectionClass(beanClass); isCollection = false; if (isCollection) { if (collectionClass != null) { Class<?> clazz = loader.loadClass(beanClass); Class<?> cclazz = loader.loadClass(collectionClass); javaBeanModel = JavaBeanModelFactory.getJavaBeanModelWithLazyLoad(clazz); javaBeanModel.setComponentClass(cclazz); } else { } } else { Class<?> clazz = loader.loadClass(beanClass); if (isArray) { Object arrayInstance = Array.newInstance(clazz, 0); clazz = arrayInstance.getClass(); } javaBeanModel = JavaBeanModelFactory.getJavaBeanModelWithLazyLoad(clazz); } if (javaBeanModel != null) { if (beanID != null) { javaBeanModel.setName(beanID); } } else { } } catch (JavaModelException e1) { } catch (ClassNotFoundException e1) { } } } private void createBeanClassControls(Composite mainComposite) { Label beanClassLabel = new Label(mainComposite, SWT.NONE); beanClassLabel.setText(Messages.JavaBeanSelectionWizardPage_BeanClassLabel); Composite beanClassComposite = new Composite(mainComposite, SWT.NONE); GridLayout gl = new GridLayout(); gl.numColumns = 2; gl.marginHeight = 0; gl.marginWidth = 0; beanClassComposite.setLayout(gl); final Text beanClassText = new Text(beanClassComposite, SWT.BORDER); GridData gd = new GridData(GridData.FILL_HORIZONTAL); beanClassText.setLayoutData(gd); beanClassText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { Text t = (Text) e.getSource(); arrayButton.setEnabled(true); beanClass = t.getText(); if (beanClass != null) { beanClass = beanClass.trim(); } isCollection = isCollectionClass(beanClass); // if (isCollection) { // isArray = false; // arrayButton.setSelection(false); // arrayButton.setEnabled(false); // collectionClassBrowseButton.setEnabled(true); // colllectionClassText.setEnabled(true); // } else { // collectionClassBrowseButton.setEnabled(false); // colllectionClassText.setEnabled(false); // colllectionClassText.setText(""); // } refreshJavaBeanModel(); updateWizardPageStatus(); } }); beanClassComposite.setLayoutData(gd); Button javaTypeBrowseButton = new Button(beanClassComposite, SWT.NONE); javaTypeBrowseButton.setText(Messages.JavaBeanSelectionWizardPage_BrowseButtonLabel); javaTypeBrowseButton.addSelectionListener(new SelectionAdapter() { /* * (non-Javadoc) * * @see * org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse * .swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { String classString = JavaTypeFieldDialog.openJavaTypeDialog(getShell(), project); beanClassText.setText(classString); } }); } private boolean isCollectionClass(String classString) { if (project != null) { try { ProjectClassLoader loader = new ProjectClassLoader(project); Class<?> clazz = loader.loadClass(classString); if (Collection.class.isAssignableFrom(clazz)) { return true; } } catch (Throwable t) { } } return false; } // private void createBeanIDControls(Composite mainComposite) { // Label beanIDLabel = new Label(mainComposite, SWT.NONE); // beanIDLabel.setText("Bean ID :"); // // Text beanIDText = new Text(mainComposite, SWT.BORDER); // GridData gd = new GridData(GridData.FILL_HORIZONTAL); // beanIDText.setLayoutData(gd); // beanIDText.addModifyListener(new ModifyListener() { // // public void modifyText(ModifyEvent e) { // Text t = (Text) e.getSource(); // beanID = t.getText(); // updateWizardPageStatus(); // } // // }); // } protected void updateWizardPageStatus() { String error = null; if (beanClass == null || "".equals(beanClass.trim())) { //$NON-NLS-1$ error = Messages.JavaBeanSelectionWizardPage_BeanClassEmptyErrorMessage; } else { try { beanClass = beanClass.trim(); ProjectClassLoader loader = new ProjectClassLoader(project); loader.loadClass(beanClass); } catch (JavaModelException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { error = Messages.JavaBeanSelectionWizardPage_CantFindClass1 + beanClass + Messages.JavaBeanSelectionWizardPage_QuoteChar; //$NON-NLS-2$ //$NON-NLS-1$ //$NON-NLS-1$ //$NON-NLS-1$ //$NON-NLS-1$ //$NON-NLS-1$ } } if (isCollection) { if (collectionClass == null || "".equals(collectionClass.trim())) { //$NON-NLS-1$ error = Messages.JavaBeanSelectionWizardPage_CollectionComponentClassEmptyErrorMessage; } else { try { ProjectClassLoader loader = new ProjectClassLoader(project); loader.loadClass(collectionClass); } catch (JavaModelException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { error = Messages.JavaBeanSelectionWizardPage_CantFindClass1 + beanClass; } } } this.setErrorMessage(error); this.setPageComplete(error == null); } }