/******************************************************************************* * Copyright (c) 2000, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are 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: * IBM Corporation - initial API and implementation * Exadel, Inc. * Red Hat, Inc. *******************************************************************************/ package org.jboss.tools.cdi.ui.wizard.xpl; import java.text.MessageFormat; import java.util.ArrayList; import java.util.HashSet; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.jobs.IJobManager; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.draw2d.ColorConstants; import org.eclipse.jdt.core.Flags; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IColorProvider; 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.jface.wizard.WizardDialog; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; 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.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.Image; 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.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.SearchPattern; import org.jboss.tools.cdi.core.CDIConstants; import org.jboss.tools.cdi.core.CDICorePlugin; import org.jboss.tools.cdi.core.CDIImages; import org.jboss.tools.cdi.core.IBean; import org.jboss.tools.cdi.core.IInjectionPoint; import org.jboss.tools.cdi.core.IQualifier; import org.jboss.tools.cdi.core.IQualifierDeclaration; 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.cdi.ui.CDIUIPlugin; import org.jboss.tools.cdi.ui.wizard.AbstractModifyInjectionPointWizard; import org.jboss.tools.cdi.ui.wizard.AddQualifiersToBeanWizardPage; import org.jboss.tools.cdi.ui.wizard.NewQualifierCreationWizard; public class AddQualifiersToBeanComposite extends Composite { private static Font font; private IInjectionPoint injectionPoint; private IBean selectedBean; private java.util.List<IBean> beans; private AddQualifiersToBeanWizardPage page; private Text pattern; // original qualifiers on the bean without declarations it means they can not be deleted from bean private ArrayList<ValuedQualifier> originalQualifiers = new ArrayList<ValuedQualifier>(); // qualifiers available to be added to the bean private ArrayList<ValuedQualifier> qualifiers = new ArrayList<ValuedQualifier>(); // original qualifiers on the bean with declaration + currently added qualifiers on the bean private ArrayList<ValuedQualifier> deployed = new ArrayList<ValuedQualifier>(); private TableViewer availableTableViewer; private TableViewer deployedTableViewer; private Button add, addAll; private Button remove, editQualifierValue, removeAll; private Label nLabel; protected boolean isComplete = false; private boolean hasDefaultQualifier = false; private ValuedQualifier defaultQualifier, namedQualifier; private ILabelProvider labelProvider = new QualifiersListLabelProvider(); public AddQualifiersToBeanComposite(Composite parent, AddQualifiersToBeanWizardPage page) { super(parent, SWT.NONE); this.page = page; this.injectionPoint = ((AbstractModifyInjectionPointWizard)page.getWizard()).getInjectionPoint(); this.selectedBean = ((AbstractModifyInjectionPointWizard)page.getWizard()).getSelectedBean(); this.beans = ((AbstractModifyInjectionPointWizard)page.getWizard()).getBeans(); createControl(); if(selectedBean != null) init(); page.setDeployedQualifiers(getDeployedQualifiers()); } public void init(){ this.selectedBean = ((AbstractModifyInjectionPointWizard)page.getWizard()).getSelectedBean(); String beanName = CDIMarkerResolutionUtils.getELName(selectedBean); originalQualifiers.clear(); deployed.clear(); for(IQualifier q : selectedBean.getQualifiers()){ IQualifierDeclaration declaration = CDIMarkerResolutionUtils.findQualifierDeclaration(selectedBean, q); if(declaration != null){ //String value = CDIMarkerResolutionUtils.findQualifierValue(bean, declaration); ValuedQualifier vq = new ValuedQualifier(q, declaration); deployed.add(vq); }else{ originalQualifiers.add(new ValuedQualifier(q)); } } defaultQualifier = new ValuedQualifier(selectedBean.getCDIProject().getQualifier(CDIConstants.DEFAULT_QUALIFIER_TYPE_NAME)); namedQualifier = new ValuedQualifier(selectedBean.getCDIProject().getQualifier(CDIConstants.NAMED_QUALIFIER_TYPE_NAME)); namedQualifier.setValue("value", beanName); for(ValuedQualifier q : originalQualifiers){ if(q.equals(defaultQualifier)){ hasDefaultQualifier = true; break; } } ArrayList<ValuedQualifier> total = new ArrayList<ValuedQualifier>(); total.addAll(originalQualifiers); total.addAll(deployed); deployedTableViewer.setInput(total); qualifiers.clear(); loadAvailableQualifiers(); availableTableViewer.setInput(qualifiers); if(nLabel != null) nLabel.setText(MessageFormat.format(CDIUIMessages.ADD_QUALIFIERS_TO_BEAN_WIZARD_MESSAGE, new Object[]{selectedBean.getElementName(), injectionPoint.getElementName()})); refresh(); } private ValuedQualifier loadAvailableQualifiers(){ String beanName = CDIMarkerResolutionUtils.getELName(selectedBean); ValuedQualifier lastQualifier = null; String beanTypeName = selectedBean.getBeanClass().getFullyQualifiedName(); String beanPackage = beanTypeName.substring(0,beanTypeName.lastIndexOf(CDIMarkerResolutionUtils.DOT)); IJavaProject beanJavaProject = selectedBean.getBeanClass().getJavaProject(); String injectionPointTypeName = injectionPoint.getClassBean().getBeanClass().getFullyQualifiedName(); String injectionPointPackage = injectionPointTypeName.substring(0,injectionPointTypeName.lastIndexOf(CDIMarkerResolutionUtils.DOT)); IJavaProject injectionPointJavaProject = injectionPoint.getBean().getBeanClass().getJavaProject(); boolean samePackage = beanPackage.equals(injectionPointPackage); IQualifier[] qs = selectedBean.getCDIProject().getQualifiers(); for(IQualifier q : qs){ ValuedQualifier vq = new ValuedQualifier(q); if(!contains(originalQualifiers, vq) && !contains(qualifiers, vq) && !contains(deployed, vq)){ try{ boolean isPublic = Flags.isPublic(q.getSourceType().getFlags()); String qualifierTypeName = q.getSourceType().getFullyQualifiedName(); String qualifierPackage = qualifierTypeName.substring(0,qualifierTypeName.lastIndexOf(CDIMarkerResolutionUtils.DOT)); if((isPublic || (samePackage && injectionPointPackage.equals(qualifierPackage))) ){ if(beanJavaProject.findType(qualifierTypeName) != null && injectionPointJavaProject.findType(qualifierTypeName) != null){ if(q.getSourceType().getFullyQualifiedName().equals(CDIConstants.NAMED_QUALIFIER_TYPE_NAME)) vq.setValue("value", beanName); qualifiers.add(vq); availableTableViewer.add(vq); lastQualifier = vq; } } } catch (JavaModelException ex) { CDIUIPlugin.getDefault().logError(ex); } } } return lastQualifier; } private boolean contains(ArrayList<ValuedQualifier> qualifiers, ValuedQualifier qualifier){ for(ValuedQualifier q : qualifiers){ if(q.equals(qualifier)) return true; } return false; } public void refresh() { Display.getDefault().syncExec(new Runnable() { @Override public void run() { if (availableTableViewer == null || availableTableViewer.getControl().isDisposed()) return; availableTableViewer.refresh(); deployedTableViewer.refresh(); setEnablement(); } }); } public boolean checkBeans(){ ArrayList<ValuedQualifier> total = new ArrayList<ValuedQualifier>(); total.addAll(originalQualifiers); total.addAll(deployed); HashSet<ValuedQualifier> qfs = new HashSet<ValuedQualifier>(total); for(IBean b: beans){ if(b.equals(selectedBean)) continue; if(CDIMarkerResolutionUtils.checkValuedQualifiers(selectedBean, b, qfs)) return false; } return true; } protected void createControl() { GridLayout layout = new GridLayout(); layout.horizontalSpacing = 4; layout.verticalSpacing = 10; layout.numColumns = 3; setLayout(layout); setFont(getParent().getFont()); Display display = getDisplay(); FontData[] fd = getFont().getFontData(); int size2 = fd.length; for (int i = 0; i < size2; i++) fd[i].setStyle(SWT.ITALIC); font = new Font(display, fd); addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { font.dispose(); } }); nLabel = new Label(this, SWT.NONE); GridData data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING); data.horizontalSpan = 3; nLabel.setLayoutData(data); if(selectedBean != null) nLabel.setText(MessageFormat.format(CDIUIMessages.ADD_QUALIFIERS_TO_BEAN_WIZARD_MESSAGE, new Object[]{selectedBean.getElementName(), injectionPoint.getElementName()})); Label label = new Label(this, SWT.NONE); label.setText(CDIUIMessages.ADD_QUALIFIERS_TO_BEAN_WIZARD_ENTER_QUALIFIER_NAME); label.setLayoutData(data); pattern = new Text(this, SWT.BORDER); data = new GridData(GridData.FILL_HORIZONTAL); pattern.setLayoutData(data); pattern.addModifyListener(new ModifyListener(){ @Override public void modifyText(ModifyEvent e){ availableTableViewer.refresh(); } }); pattern.setFocus(); label = new Label(this, SWT.NONE); label.setText(""); label = new Label(this, SWT.NONE); label.setText(""); label = new Label(this, SWT.NONE); label.setText(CDIUIMessages.ADD_QUALIFIERS_TO_BEAN_WIZARD_AVAILABLE); label = new Label(this, SWT.NONE); label.setText(""); label = new Label(this, SWT.NONE); label.setText(CDIUIMessages.ADD_QUALIFIERS_TO_BEAN_WIZARD_IN_BEAN); Table availableTable = new Table(this, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); data = new GridData(GridData.FILL_BOTH); data.heightHint = 200; data.widthHint = 150; availableTable.setLayoutData(data); availableTableViewer = new TableViewer(availableTable); availableTableViewer.setLabelProvider(labelProvider); IContentProvider contentProvider = new QualifiersListContentProvider(); availableTableViewer.setContentProvider(contentProvider); availableTableViewer.setComparator(new ViewerComparator() { @Override public int compare(Viewer viewer, Object o1, Object o2) { if (o1 instanceof IQualifier && o2 instanceof IQualifier) { IQualifier q1 = (IQualifier) o1; IQualifier q2 = (IQualifier) o2; return (q1.getSourceType().getElementName().compareToIgnoreCase(q2.getSourceType().getElementName())); } return super.compare(viewer, o1, o2); } }); availableTableViewer.setInput(qualifiers); availableTableViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { setEnablement(); } }); availableTableViewer.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { setEnablement(); if (add.isEnabled()) add(false); } }); availableTableViewer.addFilter(new QualifierFilter()); Composite comp = new Composite(this, SWT.NONE); data = new GridData(GridData.FILL_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL); data.widthHint = 120; comp.setLayoutData(data); layout = new GridLayout(); layout.marginWidth = 5; layout.marginHeight = 25; layout.verticalSpacing = 20; comp.setLayout(layout); add = new Button(comp, SWT.PUSH); add.setText(CDIUIMessages.ADD_QUALIFIERS_TO_BEAN_WIZARD_ADD); add.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); add.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { add(false); } }); remove = new Button(comp, SWT.PUSH); remove.setText(CDIUIMessages.ADD_QUALIFIERS_TO_BEAN_WIZARD_REMOVE); remove.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); remove.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { remove(false); } }); label = new Label(comp, SWT.NONE); label.setText(""); addAll = new Button(comp, SWT.PUSH); addAll.setText(CDIUIMessages.ADD_QUALIFIERS_TO_BEAN_WIZARD_ADD_ALL); addAll.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); addAll.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { add(true); } }); removeAll = new Button(comp, SWT.PUSH); removeAll.setText(CDIUIMessages.ADD_QUALIFIERS_TO_BEAN_WIZARD_REMOVE_ALL); removeAll.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); removeAll.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { remove(true); } }); Table deployedTable = new Table(this, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); data = new GridData(GridData.FILL_BOTH); data.widthHint = 150; deployedTable.setLayoutData(data); deployedTableViewer = new TableViewer(deployedTable); deployedTableViewer.setLabelProvider(labelProvider); deployedTableViewer.setContentProvider(contentProvider); deployedTableViewer.setComparator(new ViewerComparator() { @Override public int compare(Viewer viewer, Object o1, Object o2) { if (o1 instanceof IQualifier && o2 instanceof IQualifier) { IQualifier q1 = (IQualifier) o1; IQualifier q2 = (IQualifier) o2; return (q1.getSourceType().getElementName().compareToIgnoreCase(q2.getSourceType().getElementName())); } return super.compare(viewer, o1, o2); } }); deployedTableViewer.setInput(originalQualifiers); deployedTableViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { setEnablement(); } }); deployedTableViewer.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { setEnablement(); if (remove.isEnabled()) remove(false); } }); final Button createQualifier = new Button(this, SWT.PUSH); createQualifier.setText(CDIUIMessages.ADD_QUALIFIERS_TO_BEAN_WIZARD_CREATE_NEW_QUALIFIER); createQualifier.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { final IJobManager manager= Job.getJobManager(); // reload qualifiers if (Display.getCurrent() != null) { BusyIndicator.showWhile(Display.getCurrent(), new Runnable(){ @Override public void run(){ NewQualifierCreationWizard wizard = new NewQualifierCreationWizard(); StructuredSelection selection = new StructuredSelection(new Object[]{selectedBean.getBeanClass()}); wizard.init(PlatformUI.getWorkbench(), selection); WizardDialog dialog = new WizardDialog(getShell(), wizard); int status = dialog.open(); if(status == WizardDialog.OK){ manager.endRule(ResourcesPlugin.getWorkspace().getRoot()); try { Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_BUILD, null); } catch (OperationCanceledException e) { CDICorePlugin.getDefault().logError(e); } catch (InterruptedException e) { CDICorePlugin.getDefault().logError(e); } loadAvailableQualifiers(); manager.beginRule(ResourcesPlugin.getWorkspace().getRoot(), null); } } }); } } }); label = new Label(this, SWT.NONE); label.setText(""); editQualifierValue = new Button(this, SWT.PUSH); editQualifierValue.setText(CDIUIMessages.ADD_QUALIFIERS_TO_BEAN_WIZARD_EDIT_QUALIFIER_VALUE); editQualifierValue.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { ValuedQualifier[] vq = getDeployedSelection(); ValueDialog d = new ValueDialog(getShell(), vq[0].getStringValue()); int result = d.open(); if(result == MessageDialog.OK){ vq[0].setValue("value", d.getValue()); } } }); Dialog.applyDialogFont(this); } protected ValuedQualifier[] getAvailableSelection() { IStructuredSelection sel = (IStructuredSelection) availableTableViewer.getSelection(); if (sel.isEmpty()) return new ValuedQualifier[0]; ValuedQualifier[] mss = new ValuedQualifier[sel.size()]; System.arraycopy(sel.toArray(), 0, mss, 0, sel.size()); return mss; } protected ValuedQualifier[] getDeployedSelection() { IStructuredSelection sel = (IStructuredSelection) deployedTableViewer.getSelection(); if (sel.isEmpty()) return new ValuedQualifier[0]; ValuedQualifier[] mss = new ValuedQualifier[sel.size()]; System.arraycopy(sel.toArray(), 0, mss, 0, sel.size()); return mss; } protected void setEnablement() { isComplete = true; ValuedQualifier[] ms = getAvailableSelection(); if (ms == null || ms.length == 0) { add.setEnabled(false); } else { boolean enabled = false; for (int i = 0; i < ms.length; i++) { ValuedQualifier qualifier = ms[i]; if (qualifier != null) { if (contains(qualifiers, qualifier)) { enabled = true; }else{ enabled = false; break; } } } add.setEnabled(enabled); } addAll.setEnabled(qualifiers.size() > 0); ms = getDeployedSelection(); if (ms == null || ms.length == 0) { remove.setEnabled(false); editQualifierValue.setEnabled(false); } else { boolean enabled = false; for (int i = 0; i < ms.length; i++) { ValuedQualifier qualifier = ms[i]; if (qualifier != null && contains(deployed, qualifier)) { enabled = true; } else{ enabled = false; break; } } remove.setEnabled(enabled); if(enabled && ms.length == 1 && isEditEnabled(ms[0])){ editQualifierValue.setEnabled(true); }else{ editQualifierValue.setEnabled(false); } } removeAll.setEnabled(deployed.size() > 0); // check uniqueness of qualifiers isComplete = checkBeans(); if(isComplete) page.setMessage(""); else page.setMessage(NLS.bind(CDIUIMessages.ADD_QUALIFIERS_TO_BEAN_WIZARD_SET_IS_NOT_UNIQUE, selectedBean.getElementName(), injectionPoint.getElementName()), IMessageProvider.ERROR); page.setPageComplete(isComplete); } private boolean isEditEnabled(ValuedQualifier valuedQualifier){ return valuedQualifier.isEditable(); } protected void add(boolean all) { if (all) { ValuedQualifier[] qualifiers2 = new ValuedQualifier[qualifiers.size()]; qualifiers.toArray(qualifiers2); moveAll(qualifiers2, true); } else moveAll(getAvailableSelection(), true); } protected void remove(boolean all) { if (all) { ArrayList<ValuedQualifier> list = new ArrayList<ValuedQualifier>(); list.addAll(deployed); ValuedQualifier[] qualifiers2 = new ValuedQualifier[list.size()]; list.toArray(qualifiers2); moveAll(qualifiers2, false); } else moveAll(getDeployedSelection(), false); } protected void moveAll(ValuedQualifier[] mods, boolean add2) { ArrayList<ValuedQualifier> list = new ArrayList<ValuedQualifier>(); for (ValuedQualifier qualifier: mods) { if (!contains(list, qualifier)) list.add(qualifier); } for (ValuedQualifier qualifier: list) { if (add2) { qualifiers.remove(qualifier); deployed.add(qualifier); availableTableViewer.remove(qualifier); deployedTableViewer.add(qualifier); } else { qualifiers.add(qualifier); deployed.remove(qualifier); availableTableViewer.add(qualifier); deployedTableViewer.remove(qualifier); } } if(hasDefaultQualifier){ if(deployed.isEmpty() || (namedQualifier != null && deployed.size() == 1 && deployed.contains(namedQualifier))) { if(!originalQualifiers.contains(defaultQualifier)){ originalQualifiers.add(defaultQualifier); deployedTableViewer.add(defaultQualifier); } }else{ if(originalQualifiers.contains(defaultQualifier)){ originalQualifiers.remove(defaultQualifier); deployedTableViewer.remove(defaultQualifier); } } } setEnablement(); page.setDeployedQualifiers(getDeployedQualifiers()); } public ArrayList<ValuedQualifier> getQualifiersToRemove() { ArrayList<ValuedQualifier> list = new ArrayList<ValuedQualifier>(); for (ValuedQualifier qualifier: originalQualifiers) { if (!contains(deployed, qualifier)) list.add(qualifier); } return list; } public ArrayList<ValuedQualifier> getQualifiersToAdd() { ArrayList<ValuedQualifier> list = new ArrayList<ValuedQualifier>(); for (ValuedQualifier qualifier: deployed) { if (!contains(originalQualifiers, qualifier)) list.add(qualifier); } return list; } public boolean isComplete() { return isComplete; } public ArrayList<ValuedQualifier> getDeployedQualifiers(){ ArrayList<ValuedQualifier> total = new ArrayList<ValuedQualifier>(); total.addAll(originalQualifiers); total.addAll(deployed); return total; } public void deploy(ValuedQualifier qualifier){ ValuedQualifier[] qualifiers = new ValuedQualifier[]{qualifier}; moveAll(qualifiers, true); } public void remove(ValuedQualifier qualifier){ ValuedQualifier[] qualifiers = new ValuedQualifier[]{qualifier}; moveAll(qualifiers, false); } public ArrayList<IQualifier> getAvailableQualifiers(){ ArrayList<IQualifier> result = new ArrayList<IQualifier>(); for(ValuedQualifier vq : qualifiers){ result.add(vq.getQualifier()); } return result; } class QualifiersListLabelProvider implements ILabelProvider, IColorProvider{ @Override public void addListener(ILabelProviderListener listener) { } @Override public void dispose() { } @Override public boolean isLabelProperty(Object element, String property) { return true; } @Override public void removeListener(ILabelProviderListener listener) { } @Override public Image getImage(Object element) { if(element instanceof ValuedQualifier){ return CDIImages.getImageByElement(((ValuedQualifier) element).getQualifier()); } return null; } @Override public String getText(Object element) { if(element instanceof ValuedQualifier){ ValuedQualifier vq = (ValuedQualifier)element; String qualifierTypeName = vq.getQualifier().getSourceType().getFullyQualifiedName(); String qualifierPackage = qualifierTypeName.substring(0,qualifierTypeName.lastIndexOf(CDIMarkerResolutionUtils.DOT)); String name = vq.getQualifier().getSourceType().getElementName(); return name+" - "+qualifierPackage; } return ""; } @Override public Color getForeground(Object element) { if(element instanceof ValuedQualifier){ if(contains(originalQualifiers, (ValuedQualifier)element)) return ColorConstants.lightGray; } return ColorConstants.black; } @Override public Color getBackground(Object element) { return null; } } class QualifiersListContentProvider 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[]{}; } } public class QualifierFilter 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 ValuedQualifier) { String qualifierTypeName = ((ValuedQualifier)element).getQualifier().getSourceType().getFullyQualifiedName(); if(pattern.getText().isEmpty()) patternMatcher.setPattern("*"); else patternMatcher.setPattern(pattern.getText()); boolean result = patternMatcher.matches(qualifierTypeName); if (!result) { String pattern = patternMatcher.getPattern(); if (pattern.indexOf(".") < 0) { int lastIndex = qualifierTypeName.lastIndexOf("."); if (lastIndex >= 0 && (lastIndex + 1) < qualifierTypeName.length()) return patternMatcher.matches(qualifierTypeName.substring(lastIndex + 1)); } } return result; } return false; } } static class ValueDialog extends MessageDialog{ String value; Text text; public ValueDialog(Shell shell, String value) { super(shell, "Edit Qualifier Annotation Value", null, "", MessageDialog.NONE, new String[]{"OK", "Cancel"}, 0); this.value = value; } @Override protected Control createCustomArea(Composite parent) { Composite composite = new Composite(parent, 0); GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.marginHeight = 5; layout.marginWidth = 5; layout.horizontalSpacing = 5; layout.verticalSpacing = 5; composite.setLayout(layout); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); Label label = new Label(composite, SWT.NONE); label.setText("Qualifier annotation value:"); text = new Text(composite, SWT.BORDER); GridData data = new GridData(GridData.FILL_HORIZONTAL); text.setLayoutData(data); text.setText(value); text.addModifyListener(new ModifyListener(){ @Override public void modifyText(ModifyEvent e) { value = text.getText(); } }); return composite; } public String getValue(){ return value; } } }