/******************************************************************************* * Copyright (c) 2010 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.cdi.ui.wizard; import java.util.ArrayList; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.ltk.core.refactoring.participants.ProcessorBasedRefactoring; import org.eclipse.ltk.ui.refactoring.UserInputWizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.dialogs.SearchPattern; import org.jboss.tools.cdi.core.CDIImages; import org.jboss.tools.cdi.core.IBean; import org.jboss.tools.cdi.core.IQualifier; import org.jboss.tools.cdi.internal.core.refactoring.CDIMarkerResolutionUtils; import org.jboss.tools.cdi.internal.core.refactoring.ValuedQualifier; import org.jboss.tools.cdi.ui.CDIUIMessages; import org.jboss.tools.common.model.ui.ModelUIImages; public class SelectBeanWizard extends AbstractModifyInjectionPointWizard{ private SelectBeanWizardPage selectBeanPage; private AddQualifiersToBeanWizardPage addQualifiersPage; private Text pattern; public SelectBeanWizard(ProcessorBasedRefactoring refactoring){ super(refactoring); setWindowTitle(CDIUIMessages.SELECT_BEAN_WIZARD_TITLE); setDefaultPageImageDescriptor(ModelUIImages.getImageDescriptor(ModelUIImages.WIZARD_DEFAULT)); } @Override public void addUserInputPages() { selectBeanPage = new SelectBeanWizardPage(""); addPage(selectBeanPage); addQualifiersPage = new AddQualifiersToBeanWizardPage(""); addPage(addQualifiersPage); } public java.util.List<ValuedQualifier> getDeployedQualifiers(){ return addQualifiersPage.getDeployedQualifiers(); } public java.util.List<IQualifier> getAvailableQualifiers(){ return addQualifiersPage.getAvailableQualifiers(); } public void init(){ addQualifiersPage.init(); } public void deploy(ValuedQualifier qualifier){ addQualifiersPage.deploy(qualifier); } public boolean checkBeans(){ return addQualifiersPage.checkBeans(); } class SelectBeanWizardPage extends UserInputWizardPage{ TableViewer tableViewer; protected SelectBeanWizardPage(String pageName) { super(pageName); setTitle(CDIUIMessages.SELECT_BEAN_TITLE); setPageComplete(false); } @Override public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.horizontalSpacing = 4; layout.verticalSpacing = 10; layout.numColumns = 1; composite.setLayout(layout); composite.setFont(composite.getParent().getFont()); Label label = new Label(composite, SWT.NONE); label.setText(CDIUIMessages.SELECT_BEAN_WIZARD_ENTER_BEAN_NAME); pattern = new Text(composite, SWT.BORDER); GridData data = new GridData(GridData.FILL_HORIZONTAL); pattern.setLayoutData(data); pattern.addModifyListener(new ModifyListener(){ @Override public void modifyText(ModifyEvent e){ tableViewer.refresh(); } }); label = new Label(composite, SWT.NONE); label.setText(CDIUIMessages.SELECT_BEAN_WIZARD_SELECT_BEAN); Table availableList = new Table(composite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); data = new GridData(GridData.FILL_BOTH); data.heightHint = 200; data.widthHint = 150; availableList.setLayoutData(data); tableViewer = new TableViewer(availableList); final ILabelProvider labelProvider = new BeanListLabelProvider(); tableViewer.setLabelProvider(labelProvider); IContentProvider contentProvider = new BeanListContentProvider(); tableViewer.setContentProvider(contentProvider); tableViewer.setComparator(new ViewerComparator() { @Override public int compare(Viewer viewer, Object o1, Object o2) { if (o1 instanceof IBean && o2 instanceof IBean) { IBean b1 = (IBean) o1; IBean b2 = (IBean) o2; return labelProvider.getText(b1).compareToIgnoreCase(labelProvider.getText(b2)); } return super.compare(viewer, o1, o2); } }); tableViewer.setInput(getBeans()); tableViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { IBean bean = getSelection(); if(bean != null){ setSelectedBean(bean); addQualifiersPage.init(); addQualifiersPage.setDeployedQualifiers(addQualifiersPage.getDeployedQualifiers()); setPageComplete(true); }else setPageComplete(false); } }); tableViewer.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { } }); tableViewer.addFilter(new BeanFilter()); setControl(composite); } public void setDefaultSelection(){ if(getBeans().size() > 0){ IBean defaultBean = (IBean)tableViewer.getTable().getItem(0).getData(); tableViewer.setSelection(new StructuredSelection(defaultBean)); tableViewer.getTable().select(0); setSelectedBean(defaultBean); addQualifiersPage.init(); addQualifiersPage.setDeployedQualifiers(addQualifiersPage.getDeployedQualifiers()); setPageComplete(true); } } protected IBean getSelection() { IStructuredSelection sel = (IStructuredSelection) tableViewer.getSelection(); if (sel.isEmpty()) return null; return (IBean)sel.getFirstElement(); } } public class BeanFilter extends ViewerFilter { SearchPattern patternMatcher = new SearchPattern(); public boolean isConsistentItem(Object item) { return true; } @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (element instanceof IBean) { String beanTypeName = ((IBean)element).getBeanClass().getFullyQualifiedName(); if(pattern.getText().isEmpty()) patternMatcher.setPattern("*"); else patternMatcher.setPattern(pattern.getText()); boolean result = patternMatcher.matches(beanTypeName); if (!result) { String pattern = patternMatcher.getPattern(); if (pattern.indexOf(".") < 0) { int lastIndex = beanTypeName.lastIndexOf("."); if (lastIndex >= 0 && (lastIndex + 1) < beanTypeName.length()) return patternMatcher.matches(beanTypeName.substring(lastIndex + 1)); } } return result; } return false; } } class BeanListLabelProvider implements ILabelProvider{ @Override public void addListener(ILabelProviderListener listener) { } @Override public void dispose() { } @Override public boolean isLabelProperty(Object element, String property) { return false; } @Override public void removeListener(ILabelProviderListener listener) { } @Override public Image getImage(Object element) { if(element instanceof IBean){ return CDIImages.getImageByElement((IBean)element); } return null; } @Override public String getText(Object element) { if(element instanceof IBean){ IBean bean = (IBean)element; String beanTypeName = bean.getBeanClass().getFullyQualifiedName(); String beanPackage = beanTypeName.substring(0,beanTypeName.lastIndexOf(CDIMarkerResolutionUtils.DOT)); String name = bean.getElementName(); return name+" - "+beanPackage; } return ""; } } class BeanListContentProvider implements IStructuredContentProvider{ @Override public void dispose() { } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } @Override public Object[] getElements(Object inputElement) { if(inputElement instanceof ArrayList){ return ((ArrayList)inputElement).toArray(); } return new Object[]{}; } } @Override public void createPageControls(Composite pageContainer) { super.createPageControls(pageContainer); selectBeanPage.setDefaultSelection(); } }