/*******************************************************************************
* 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.seam.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.jboss.tools.seam.core.ISeamComponent;
import org.jboss.tools.seam.core.ISeamProject;
import org.jboss.tools.seam.core.SeamCorePlugin;
import org.jboss.tools.seam.core.SeamCoreMessages;
import org.jboss.tools.seam.ui.SeamGuiPlugin;
import org.jboss.tools.seam.ui.SeamUiImages;
import org.jboss.tools.seam.ui.views.SeamReferencedFilter;
/**
* @author Daniel Azarov
*
*/
public class OpenSeamComponentDialog extends FilteredItemsSelectionDialog {
private static final String FILE_NAME = "OpenSeamComponentHistory.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$
public OpenSeamComponentDialog(Shell shell) {
super(shell);
setSelectionHistory(new SeamComponentSelectionHistory());
setListLabelProvider(new SeamComponentLabelProvider());
setDetailsLabelProvider(new SeamComponentLabelProvider());
XMLMemento memento = loadMemento();
if (memento != null)
getSelectionHistory().load(memento);
}
public void startSearch() {
applyFilter();
}
@Override
public void okPressed() {
// TODO Auto-generated method stub
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 SeamComponentFilter();
}
protected void fillContentProvider(AbstractContentProvider contentProvider,
ItemsFilter itemsFilter, IProgressMonitor progressMonitor)
throws CoreException {
progressMonitor.subTask(SeamCoreMessages.OPEN_SEAM_COMPONENT_DIALOG_WAIT);
try {
Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_BUILD, null);
} catch (InterruptedException e) {
// do nothing
}
IProject[] projects = ResourcesPlugin.getWorkspace().getRoot()
.getProjects();
progressMonitor.beginTask(
SeamCoreMessages.OPEN_SEAM_COMPONENT_DIALOG_LOADING,
projects.length);
for (int i = 0; i < projects.length; i++) {
IProject project = projects[i];
progressMonitor.subTask(project.getName());
ISeamProject seamProject = SeamCorePlugin.getSeamProject(project,
true);
if (seamProject != null) {
ISeamComponent[] iter = seamProject.getComponents();
for (ISeamComponent component: iter) {
if (SeamReferencedFilter
.isComponentDeclaredInThisProject(component))
contentProvider.add(new SeamComponentWrapper(component
.getName(), project.getName(), component),
itemsFilter);
}
}
progressMonitor.worked(1);
}
progressMonitor.done();
}
private static XMLMemento loadMemento() {
XMLMemento memento = null;
IPath stateLocation = SeamGuiPlugin.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) {
SeamCorePlugin.getPluginLog().logError(ex);
} catch (WorkbenchException ex) {
SeamCorePlugin.getPluginLog().logError(ex);
} finally {
try {
reader.close();
} catch (IOException ex) {
SeamCorePlugin.getPluginLog().logError(ex);
}
}
}
return memento;
}
private static void saveMemento(XMLMemento xmlMemento) {
IPath stateLocation = SeamGuiPlugin.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) {
SeamCorePlugin.getPluginLog().logError(ex);
} finally {
try {
writer.close();
} catch (IOException ex) {
SeamCorePlugin.getPluginLog().logError(ex);
}
}
}
protected IDialogSettings getDialogSettings() {
return new DialogSettings(
SeamCoreMessages.OPEN_SEAM_COMPONENT_DIALOG_NAME);
}
public String getElementName(Object item) {
if (item instanceof SeamComponentWrapper) {
SeamComponentWrapper componentWrapper = (SeamComponentWrapper) item;
return componentWrapper.getComponentName();
}
return null;
}
protected Comparator<SeamComponentWrapper> getItemsComparator() {
return new SeamComponentComparator();
}
protected IStatus validateItem(Object item) {
return new Status(getSelectedItems().size() >= 0?IStatus.OK:IStatus.ERROR,SeamGuiPlugin.PLUGIN_ID,null);
}
public class SeamComponentComparator implements
Comparator<SeamComponentWrapper> {
public int compare(SeamComponentWrapper left, SeamComponentWrapper right) {
return left.getComponentName().compareTo(right.getComponentName());
}
}
public class SeamComponentFilter extends ItemsFilter {
public boolean isConsistentItem(Object item) {
return true;
}
public boolean matchItem(Object item) {
if (item instanceof SeamComponentWrapper) {
SeamComponentWrapper componentWrapper = (SeamComponentWrapper) item;
boolean result = patternMatcher.matches(componentWrapper
.getComponentName());
if (!result) {
String pattern = patternMatcher.getPattern();
if (pattern.indexOf(".") < 0) {
int lastIndex = componentWrapper.getComponentName()
.lastIndexOf(".");
if (lastIndex >= 0
&& (lastIndex + 1) < componentWrapper
.getComponentName().length())
return patternMatcher.matches(componentWrapper
.getComponentName()
.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 SeamComponentWrapper(componentName, projectName);
}
@Override
protected void storeItemToMemento(Object item, IMemento memento) {
SeamComponentWrapper componentWrapper = (SeamComponentWrapper) item;
XMLMemento mem = (XMLMemento) memento;
mem.putString(PROJECT_NAME, componentWrapper.getProjectName());
mem.putString(COMPONENT_NAME, componentWrapper.getComponentName());
}
public void save(IMemento memento) {
super.save(memento);
if (!(memento instanceof XMLMemento))
return;
XMLMemento xmlMemento = (XMLMemento) memento;
saveMemento(xmlMemento);
}
}
public class SeamComponentLabelProvider implements ILabelProvider {
public Image getImage(Object element) {
return SeamUiImages.COMPONENT_IMAGE;
}
public String getText(Object element) {
if (element instanceof SeamComponentWrapper) {
SeamComponentWrapper componentWrapper = (SeamComponentWrapper) element;
return componentWrapper.getComponentName() + SEPARATOR
+ componentWrapper.getProjectName(); //$NON-NLS-1$
}
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 SeamComponentWrapper {
private String componentName;
private String projectName;
private ISeamComponent component;
public SeamComponentWrapper(String componentName, String projectName) {
this.componentName = componentName;
this.projectName = projectName;
}
public SeamComponentWrapper(String componentName, String projectName,
ISeamComponent component) {
this(componentName, projectName);
this.component = component;
}
public String getComponentName() {
return componentName;
}
public String getProjectName() {
return projectName;
}
public ISeamComponent getComponent() {
if (component == null) {
IProject project = ResourcesPlugin.getWorkspace().getRoot()
.getProject(projectName);
if (project != null) {
ISeamProject seamProject = SeamCorePlugin.getSeamProject(
project, true);
if (seamProject != null) {
ISeamComponent component = seamProject
.getComponent(componentName);
return component;
}
}
return null;
}
return component;
}
}
public static void validateHistory(ISeamProject seamProject) {
String seamProjectName = seamProject.getProject().getName();
XMLMemento memento = loadMemento();
if (memento != null) {
XMLMemento historyMemento = (XMLMemento) memento
.getChild(ROOT_NODE);
if (historyMemento == null) {
return;
}
IMemento[] mementoElements = historyMemento.getChildren(INFO_NODE);
for (int i = 0; i < mementoElements.length; ++i) {
IMemento mem = mementoElements[i];
String projectName = mem.getString(PROJECT_NAME);
if (projectName == null) {
mem.putString(DELETED, YES);
continue;
}
if (projectName.equals(seamProjectName)) {
String componentName = mem.getString(COMPONENT_NAME);
if (componentName == null) {
mem.putString(DELETED, YES);
continue;
}
IProject project = ResourcesPlugin.getWorkspace().getRoot()
.getProject(projectName);
if (project != null) {
ISeamProject cSeamProject = SeamCorePlugin
.getSeamProject(project, true);
if (cSeamProject != null) {
ISeamComponent component = cSeamProject
.getComponent(componentName);
if (component == null)
mem.putString(DELETED, YES);
else
mem.putString(DELETED, NO);
} else
mem.putString(DELETED, YES);
} else
mem.putString(DELETED, YES);
}
}
saveMemento(memento);
}
}
}