/******************************************************************************* * Copyright (c) 2007 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.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.search.IJavaSearchScope; import org.eclipse.jdt.internal.corext.util.JavaModelUtil; import org.eclipse.jdt.internal.ui.search.JavaSearchScopeFactory; import org.eclipse.jdt.ui.IJavaElementSearchConstants; import org.eclipse.jdt.ui.JavaUI; import org.eclipse.jface.operation.IRunnableContext; import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.FillLayout; 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.TableColumn; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.dialogs.SelectionDialog; import org.jboss.tools.smooks.configuration.SmooksConfigurationActivator; import org.jboss.tools.smooks.configuration.editors.GraphicsConstants; import org.jboss.tools.smooks.configuration.editors.utils.ProjectClassLoader; /** * @author Dart Peng * * @CreateTime Jul 22, 2008 */ public class JavaBeanModelLoadComposite extends Composite implements SelectionListener { private List<JavaBeanModel> javabeanList = new ArrayList<JavaBeanModel>(); protected Text classText; // private Button classBrowseButton; protected String classFullName; protected boolean loadAtomic; protected IJavaProject javaProject; protected IRunnableContext runnableContext; protected JavaBeanModel currentRootJavaBeanModel = null; protected JavaBeanModel returnJavaBeanModel = null; private List<IJavaBeanSelectionListener> selectionListenerList = new ArrayList<IJavaBeanSelectionListener>(); protected ProjectClassLoader loader = null; private TableViewer listViewer; public JavaBeanModelLoadComposite(Composite parent, int style, IRunnableContext runnableContext, IJavaProject project, boolean loadJavapropertiesAtomic) throws Exception { super(parent, style); loadAtomic = loadJavapropertiesAtomic; this.runnableContext = runnableContext; if (this.runnableContext == null) { this.runnableContext = SmooksConfigurationActivator.getDefault().getWorkbench() .getActiveWorkbenchWindow(); // this.runnableContext = new // ProgressMonitorDialog(parent.getShell()); if (this.runnableContext == null) throw new Exception("Init error"); //$NON-NLS-1$ } if (project != null) { javaProject = project; loader = new ProjectClassLoader(javaProject); } createCompositeContent(); } public JavaBeanModelLoadComposite(Composite parent, int style, IRunnableContext runnableContext, IJavaProject project) throws Exception { this(parent, style, runnableContext, project, true); } public List<JavaBeanModel> getJavabeanList() { return javabeanList; } public void addJavaBeanSelectionListener(IJavaBeanSelectionListener listener) { this.selectionListenerList.add(listener); } public void removeJavaBeanSelectionListener(IJavaBeanSelectionListener listener) { this.selectionListenerList.remove(listener); } public void setJavabeanList(List<JavaBeanModel> javabeanList) { this.javabeanList = javabeanList; } protected Control createCompositeContent() { Composite parent = this; parent.setLayout(new FillLayout()); Composite com = new Composite(parent, SWT.NULL); GridLayout layout = new GridLayout(); layout.numColumns = 2; com.setLayout(layout); Label classLabel = new Label(com, SWT.NULL); classLabel.setText("Class : "); //$NON-NLS-1$ GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; classLabel.setLayoutData(gd); Composite listViewerComposite = new Composite(com, SWT.NONE); GridLayout listLayout = new GridLayout(); listLayout.numColumns = 2; listViewerComposite.setLayout(listLayout); gd = new GridData(GridData.FILL_BOTH); gd.horizontalSpan = 2; listViewerComposite.setLayoutData(gd); listViewer = new TableViewer(listViewerComposite, SWT.BORDER |SWT.FULL_SELECTION); TableColumn nameColumn = new TableColumn(listViewer.getTable(), SWT.NONE); nameColumn.setText("Class"); //$NON-NLS-1$ TableColumn isArrayColumn = new TableColumn(listViewer.getTable(), SWT.NONE); isArrayColumn.setText("Is Array"); //$NON-NLS-1$ // TableColumn isListColumn = new TableColumn(listViewer.getTable(), SWT.NONE); // isListColumn.setText("List"); nameColumn.setWidth(400); isArrayColumn.setWidth(60); // isListColumn.setWidth(60); listViewer.getTable().setHeaderVisible(true); gd = new GridData(GridData.FILL_BOTH); listViewer.getTable().addMouseListener(new ColumnSelectionListener()); listViewer.getControl().setLayoutData(gd); listViewer.setContentProvider(new IStructuredContentProvider() { public Object[] getElements(Object inputElement) { if (inputElement instanceof List) { return ((List<?>) inputElement).toArray(); } return new Object[] {}; } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } }); listViewer.setLabelProvider(new BeanViewerLabelProvider()); listViewer.setInput(javabeanList); Composite buttonArea = new Composite(listViewerComposite, SWT.NONE); gd = new GridData(GridData.FILL_VERTICAL); buttonArea.setLayoutData(gd); GridLayout buttonAreaLayout = new GridLayout(); buttonArea.setLayout(buttonAreaLayout); Button addButton = new Button(buttonArea, SWT.NONE); addButton.setText("Add"); //$NON-NLS-1$ gd = new GridData(GridData.FILL_HORIZONTAL); addButton.setLayoutData(gd); addButton.addSelectionListener(this); Button removeButton = new Button(buttonArea, SWT.NONE); removeButton.setText("Remove"); //$NON-NLS-1$ gd = new GridData(GridData.FILL_HORIZONTAL); removeButton.setLayoutData(gd); removeButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { IStructuredSelection selection = (IStructuredSelection) listViewer.getSelection(); if (selection.isEmpty()) return; javabeanList.removeAll(selection.toList()); listViewer.refresh(); } }); return com; } public ProjectClassLoader getProjectClassLoader() { if (loader == null) { try { loader = new ProjectClassLoader(javaProject); } catch (Exception e) { } } return loader; } public void widgetDefaultSelected(SelectionEvent arg0) { this.widgetSelected(arg0); } public void widgetSelected(SelectionEvent arg0) { IJavaSearchScope scope = null; if (javaProject == null) { scope = JavaSearchScopeFactory.getInstance().createWorkspaceScope(true); } else { String[] requiredProjects = null; try { requiredProjects = javaProject.getRequiredProjectNames(); } catch (Exception e) { } if (requiredProjects == null) { requiredProjects = new String[] { javaProject.getElementName() }; } else { String[] temp = new String[requiredProjects.length + 1]; temp[0] = javaProject.getElementName(); System.arraycopy(requiredProjects, 0, temp, 1, requiredProjects.length); requiredProjects = temp; } scope = JavaSearchScopeFactory.getInstance().createJavaProjectSearchScope(requiredProjects, true); } SelectionDialog dialog; Throwable exception = null; try { dialog = JavaUI.createTypeDialog(this.getShell(), runnableContext, scope, IJavaElementSearchConstants.CONSIDER_CLASSES_AND_INTERFACES, false); dialog.setMessage("Search Java Class"); //$NON-NLS-1$ dialog.setTitle("Search"); //$NON-NLS-1$ if (dialog.open() == Window.OK) { Object[] results = dialog.getResult(); if (results.length > 0) { Object result = results[0]; String packageFullName = JavaModelUtil.getTypeContainerName((IType) result); String className = null; if (packageFullName == null || packageFullName.length() <= 0) { className = ((IType) result).getElementName(); } else { className = packageFullName + "." //$NON-NLS-1$ + ((IType) result).getElementName(); } if (className != null) { ClassLoader l = this.getProjectClassLoader(); if (l != null) { Class clazz = l.loadClass(className); if (clazz != null) { JavaBeanModel model = JavaBeanModelFactory .getJavaBeanModelWithLazyLoad(clazz); javabeanList.add(model); listViewer.refresh(); } } } } } } catch (Throwable e) { exception = e; } for (Iterator<IJavaBeanSelectionListener> iterator = this.selectionListenerList.iterator(); iterator .hasNext();) { IJavaBeanSelectionListener l = (IJavaBeanSelectionListener) iterator.next(); if (exception != null) { l.exceptionOccur(new Exception(exception)); } else { l.exceptionOccur(null); } } } private class BeanViewerCellModifyer implements ICellModifier { public boolean canModify(Object element, String property) { if (property.equals("name")) //$NON-NLS-1$ return false; return true; } public Object getValue(Object element, String property) { if (element instanceof JavaBeanModel) { if (property.equals("array")) { //$NON-NLS-1$ return ((JavaBeanModel) element).isArray(); } if (property.equals("list")) { //$NON-NLS-1$ return ((JavaBeanModel) element).isList(); } } return Boolean.TRUE; } public void modify(Object element, String property, Object value) { } } private class BeanViewerLabelProvider extends LabelProvider implements ITableLabelProvider { public Image getColumnImage(Object element, int columnIndex) { if (element instanceof JavaBeanModel) { boolean isArray = "array".equals(((JavaBeanModel) element).getExtendProperty("many")); //$NON-NLS-1$ //$NON-NLS-2$ boolean isList = "list".equals(((JavaBeanModel) element).getExtendProperty("many")); //$NON-NLS-1$ //$NON-NLS-2$ switch (columnIndex) { case 0: if (isArray) { return SmooksConfigurationActivator.getDefault().getImageRegistry().get( GraphicsConstants.IMAGE_JAVA_ARRAY); } if (isList) { return SmooksConfigurationActivator.getDefault().getImageRegistry().get( GraphicsConstants.IMAGE_JAVA_COLLECTION); } return SmooksConfigurationActivator.getDefault().getImageRegistry().get( GraphicsConstants.IMAGE_JAVA_OBJECT); case 1: if (isArray) { return SmooksConfigurationActivator.getDefault().getImageRegistry().get( GraphicsConstants.IMAGE_CHECKBOX_CHECK); } else { return SmooksConfigurationActivator.getDefault().getImageRegistry().get( GraphicsConstants.IMAGE_CHECKBOX_UNCHECK); } case 2: if (isList) { return SmooksConfigurationActivator.getDefault().getImageRegistry().get( GraphicsConstants.IMAGE_CHECKBOX_CHECK); } else { return SmooksConfigurationActivator.getDefault().getImageRegistry().get( GraphicsConstants.IMAGE_CHECKBOX_UNCHECK); } } } return null; } public String getColumnText(Object element, int columnIndex) { if (element instanceof JavaBeanModel) { switch (columnIndex) { case 0: return ((JavaBeanModel) element).getBeanClassString(); case 1: return null; case 2: return null; } } return null; } } public class ColumnSelectionListener implements MouseListener { public void widgetSelected(SelectionEvent e) { } public void widgetDefaultSelected(SelectionEvent e) { } public void mouseDoubleClick(MouseEvent e) { } public void mouseDown(MouseEvent e) { if (!(e.button == 1)) return; ViewerCell cell = listViewer.getCell(new Point(e.x, e.y)); if (cell != null) { Object element = cell.getElement(); if (element instanceof JavaBeanModel) { if (cell.getColumnIndex() == 1) { String many = ((JavaBeanModel) element).getExtendProperty("many"); //$NON-NLS-1$ if ("array".equals(many)) { //$NON-NLS-1$ ((JavaBeanModel) element).addExtendProperty("many", ""); //$NON-NLS-1$ //$NON-NLS-2$ } else { ((JavaBeanModel) element).addExtendProperty("many", "array"); //$NON-NLS-1$ //$NON-NLS-2$ } } if (cell.getColumnIndex() == 2) { String many = ((JavaBeanModel) element).getExtendProperty("many"); //$NON-NLS-1$ if ("list".equals(many)) { //$NON-NLS-1$ ((JavaBeanModel) element).addExtendProperty("many", ""); //$NON-NLS-1$ //$NON-NLS-2$ } else { ((JavaBeanModel) element).addExtendProperty("many", "list"); //$NON-NLS-1$ //$NON-NLS-2$ } } try { listViewer.refresh(element); } catch (Exception e1) { } } } } public void mouseUp(MouseEvent e) { } } }