/******************************************************************************* * 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.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.dialogs.DialogSettings; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IMemento; import org.eclipse.ui.WorkbenchException; import org.eclipse.ui.XMLMemento; import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog; import org.eclipse.ui.dialogs.SearchPattern; import org.jboss.tools.cdi.core.CDICorePlugin; import org.jboss.tools.cdi.core.CDIImages; import org.jboss.tools.cdi.core.ICDIAnnotation; import org.jboss.tools.cdi.core.ICDIProject; import org.jboss.tools.cdi.ui.CDIUIPlugin; import org.jboss.tools.common.ui.widget.editor.ListFieldEditor.ListFieldEditorProvider; /** * @author Viacheslav Kabanovich * */ public class SelectCDIAnnotationDialog extends FilteredItemsSelectionDialog { private static final String FILE_NAME = "SelectCDIAnnotationHistory.xml"; //$NON-NLS-1$ private static final String ROOT_NODE = "historyRootNode"; //$NON-NLS-1$ private static final String INFO_NODE = "infoNode"; //$NON-NLS-1$ private static final String PROJECT_NAME = "ProjectName"; //$NON-NLS-1$ private static final String COMPONENT_NAME = "ComponentName"; //$NON-NLS-1$ private static final String DELETED = "Deleted"; //$NON-NLS-1$ private static final String SEPARATOR = " - "; //$NON-NLS-1$ private static final String YES = "yes"; //$NON-NLS-1$ private static final String NO = "no"; //$NON-NLS-1$ ListFieldEditorProvider<ICDIAnnotation> provider = null; public SelectCDIAnnotationDialog(Shell shell, boolean multi) { super(shell, multi); setSelectionHistory(new SeamComponentSelectionHistory()); setListLabelProvider(new CDIAnnotationLabelProvider()); setDetailsLabelProvider(new CDIAnnotationLabelProvider()); XMLMemento memento = loadMemento(); if (memento != null) getSelectionHistory().load(memento); } public void setProvider(ListFieldEditorProvider<ICDIAnnotation> provider) { this.provider = provider; } public void startSearch() { applyFilter(); } @Override public void okPressed() { super.okPressed(); } public void stopSearchAndShowResults() { refresh(); List list = getSelectedItems().toList(); Collections.sort(list,getItemsComparator()); setResult(list); } protected Control createExtendedContentArea(Composite parent) { return null; } protected ItemsFilter createFilter() { return new CDIAnnotionFilter(); } protected void fillContentProvider(AbstractContentProvider contentProvider, ItemsFilter itemsFilter, IProgressMonitor progressMonitor) throws CoreException { progressMonitor.subTask("Wait"); try { Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_BUILD, null); } catch (InterruptedException e) { // do nothing } if(provider != null) { ICDIAnnotation[] as = provider.getSelectableObjects(); for (ICDIAnnotation component: as) { IProject project = component.getCDIProject().getNature().getProject(); contentProvider.add(new CDIAnnotationWrapper( component.getSourceType().getFullyQualifiedName(), project.getName(), component), itemsFilter); } progressMonitor.worked(1); } progressMonitor.done(); } private static XMLMemento loadMemento() { XMLMemento memento = null; IPath stateLocation = CDIUIPlugin.getDefault().getStateLocation() .append(FILE_NAME); File file = new File(stateLocation.toOSString()); if (file.exists()) { FileReader reader = null; try { reader = new FileReader(file); memento = XMLMemento.createReadRoot(reader); } catch (IOException ex) { CDIUIPlugin.getDefault().logError(ex); } catch (WorkbenchException ex) { CDIUIPlugin.getDefault().logError(ex); } finally { try { reader.close(); } catch (IOException ex) { CDIUIPlugin.getDefault().logError(ex); } } } return memento; } private static void saveMemento(XMLMemento xmlMemento) { IPath stateLocation = CDIUIPlugin.getDefault().getStateLocation() .append(FILE_NAME); File file = new File(stateLocation.toOSString()); FileWriter writer = null; try { writer = new FileWriter(file); xmlMemento.save(writer); } catch (IOException ex) { CDIUIPlugin.getDefault().logError(ex); } finally { try { writer.close(); } catch (IOException ex) { CDIUIPlugin.getDefault().logError(ex); } } } protected IDialogSettings getDialogSettings() { return new DialogSettings("OPEN_CDI_COMPONENT_DIALOG_NAME"); //TODO } public String getElementName(Object item) { if (item instanceof CDIAnnotationWrapper) { CDIAnnotationWrapper componentWrapper = (CDIAnnotationWrapper) item; return componentWrapper.getComponentName(); } return null; } protected Comparator<CDIAnnotationWrapper> getItemsComparator() { return new CDIAnnotationComparator(); } protected IStatus validateItem(Object item) { return new Status(getSelectedItems().size() >= 0?IStatus.OK:IStatus.ERROR,CDIUIPlugin.PLUGIN_ID,null); } public class CDIAnnotationComparator implements Comparator<CDIAnnotationWrapper> { public int compare(CDIAnnotationWrapper left, CDIAnnotationWrapper right) { return left.getComponentName().compareTo(right.getComponentName()); } } public class CDIAnnotionFilter extends ItemsFilter { public CDIAnnotionFilter() { if(patternMatcher != null && patternMatcher.getPattern() == null || patternMatcher.getPattern().length() == 0) { patternMatcher.setPattern("*"); } } public CDIAnnotionFilter(SearchPattern searchPattern) { super(searchPattern); } public boolean isConsistentItem(Object item) { return true; } public boolean matchItem(Object item) { if (item instanceof CDIAnnotationWrapper) { CDIAnnotationWrapper componentWrapper = (CDIAnnotationWrapper) item; String qName = componentWrapper.getComponentName(); boolean result = patternMatcher.matches(qName); if (!result) { String pattern = patternMatcher.getPattern(); if (pattern.indexOf(".") < 0) { int lastIndex = qName.lastIndexOf("."); if (lastIndex >= 0 && (lastIndex + 1) < qName.length()) return patternMatcher.matches(qName.substring(lastIndex + 1)); } } return result; } return false; } } public class SeamComponentSelectionHistory extends SelectionHistory { public SeamComponentSelectionHistory() { super(); } protected Object restoreItemFromMemento(IMemento memento) { XMLMemento mem = (XMLMemento) memento; String projectName = mem.getString(PROJECT_NAME); if (projectName == null) return null; String componentName = mem.getString(COMPONENT_NAME); if (componentName == null) return null; String componentDeleted = mem.getString(DELETED); if (componentDeleted != null && YES.equals(componentDeleted)) return null; return new CDIAnnotationWrapper(componentName, projectName); } @Override protected void storeItemToMemento(Object item, IMemento memento) { // CDIAnnotationWrapper a = (CDIAnnotationWrapper) item; // XMLMemento mem = (XMLMemento) memento; // mem.putString(PROJECT_NAME, a.getProjectName()); // mem.putString(COMPONENT_NAME, a.getComponentName()); } public void save(IMemento memento) { super.save(memento); if (!(memento instanceof XMLMemento)) return; XMLMemento xmlMemento = (XMLMemento) memento; saveMemento(xmlMemento); } } public class CDIAnnotationLabelProvider implements ILabelProvider { public Image getImage(Object element) { if (element instanceof CDIAnnotationWrapper) { return CDIImages.getImageByElement(((CDIAnnotationWrapper) element).getComponent()); } return null; } public String getText(Object element) { if (element instanceof CDIAnnotationWrapper) { CDIAnnotationWrapper a = (CDIAnnotationWrapper) element; return a.getComponentName() + SEPARATOR + a.getProjectName(); } return null; } public void addListener(ILabelProviderListener listener) { } public void dispose() { } public boolean isLabelProperty(Object element, String property) { return false; } public void removeListener(ILabelProviderListener listener) { } } public class CDIAnnotationWrapper { private String componentName; private String projectName; private ICDIAnnotation component; public CDIAnnotationWrapper(String componentName, String projectName) { this.componentName = componentName; this.projectName = projectName; } public CDIAnnotationWrapper(String componentName, String projectName, ICDIAnnotation component) { this(componentName, projectName); this.component = component; } public String getComponentName() { return componentName; } public String getProjectName() { return projectName; } public ICDIAnnotation getComponent() { if (component == null) { IProject project = ResourcesPlugin.getWorkspace().getRoot() .getProject(projectName); if (project != null) { ICDIProject cdiProject = CDICorePlugin.getCDIProject(project, true); if (cdiProject != null) { ICDIAnnotation component = cdiProject.getInterceptorBinding(componentName); if(component == null) cdiProject.getStereotype(componentName); //TODO return component; } } return null; } return component; } public boolean equals(Object o) { if(o instanceof CDIAnnotationWrapper) { CDIAnnotationWrapper other = (CDIAnnotationWrapper)o; return componentName.equals(other.componentName) && projectName.equals(other.projectName); } return false; } } }