blob: bf771b16e9f32468fe19311ffb59467e8864018a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 Oracle Corporation.
* 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:
* Gerry Kessler - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsf.ui.internal.classpath;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
import org.eclipse.jst.jsf.ui.internal.Messages;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
/**
* Dialog for creating or editing a JSF Library or Implementation.
* <br>
* If the selection passed in init is not null then the item will be edit mode.
*
* @author Gerry Kessler - Oracle
*/
public class JSFLibraryWizard extends Wizard implements INewWizard {
/**
* Implementation libaries to be included
*/
public final static int IMPLS = 1;
/**
* Non-Implementation libaries to be included
*/
public final static int NONIMPLS = 2;
private JSFLibraryEditControl jsfLibraryEditControl;
private boolean isNew = false;
private boolean modified = false;
private JSFLibrary curLibrary;
private JSFLibrary workingCopyLibrary;
private JSFLibraryWizardPage page;
private boolean _impls;
private boolean _nonimpls;
private List<IProject> _projectsWithV1JSFLibraries = new ArrayList<IProject>();
/**
* Constructor
* see IMPLS
* see NONIMPLS
* @param libTypes
*/
public JSFLibraryWizard(int libTypes) {
super();
if ((libTypes & IMPLS) == IMPLS)
_impls = true;
if ((libTypes & NONIMPLS) == NONIMPLS)
_nonimpls = true;
}
/**
* Constructor. List will include all JSF Libraries.
*/
public JSFLibraryWizard() {
super();
_impls = true;
_nonimpls = true;
}
private boolean isImplsOnly(){
if (_impls && ! _nonimpls)
return true;
return false;
}
private boolean isNonImplsOnly(){
if (_nonimpls && ! _impls)
return true;
return false;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
*/
public void init(IWorkbench workbench, IStructuredSelection selection)
{
initV1LibrariesList();
if (selection != null
&& selection.getFirstElement() instanceof JSFLibrary) {
curLibrary = (JSFLibrary) selection.getFirstElement();
workingCopyLibrary = curLibrary.getWorkingCopy();
} else {
isNew = true;
workingCopyLibrary = JSFLibraryRegistryFactory.eINSTANCE.createJSFLibrary();
}
if (isImplsOnly()) {
setWindowTitle(Messages.JSFLibraryWizard_CreateImplementation);
} else {
setWindowTitle(isNew ? Messages.JSFLibraryWizard_CreateJSFLibrary : Messages.JSFLibraryWizard_EditJSFLibrary);
}
}
private void initV1LibrariesList()
{
final IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
// loop through the workspace and look for projects that are still using the V1 way
// of doing JSF libraries
for (int i = 0; i < projects.length; i++)
{
final IProject project = projects[i];
if (JSFLibraryRegistryUtil.doesProjectHaveV1JSFLibraries(project))
{
_projectsWithV1JSFLibraries.add(project);
}
}
}
/**
* Updates the JSF Library instance with the values from the working copy and
* persists the registry.
*
* If editing a library reference, referencing java models will be updated.
*
* @see org.eclipse.jface.wizard.Wizard#performFinish()
*/
public boolean performFinish()
{
// on init, if we detected any projects with old library
// refs, we need to warn the user
if (!isNew && // can ignore new libraries, since old projects can't possibly have dependencies on them
_projectsWithV1JSFLibraries.size() > 0)
{
String projectNames = ""; //$NON-NLS-1$
for (Iterator<IProject> it = _projectsWithV1JSFLibraries.iterator(); it.hasNext();)
{
IProject project = it.next();
projectNames += project.getName() + ","; //$NON-NLS-1$
}
// trim trailing comma
if (projectNames.length() > 0)
{
projectNames = projectNames.substring(0, projectNames.length()-1);
}
final String messageText = MessageFormat.format(Messages.JSFLibraryWizard_V1JSFLibrary_DialogMessage,
new Object[] {projectNames});
MessageDialogWithToggle dialog =
WarningMessageDialogWithToggle.openOkCancelConfirm
(getShell(), Messages.JSFLibraryWizard_V1JSFLibrary_DialogTitle, messageText, Messages.JSFLibraryWizard_JSFLibraryWizard_DontShowThisAgain_CheckBoxLabel, false, null, null);
if (dialog.getReturnCode() != IDialogConstants.OK_ID)
{
// abort if the user doesn't really want to commit this change
return false;
}
// if user accepted and asked not be warned again, clear the
// the project properties.
if (dialog.getToggleState())
{
JSFLibraryRegistryUtil.removeV1JSFLibraryProperty(_projectsWithV1JSFLibraries);
}
}
final String name = jsfLibraryEditControl.getJSFLibraryName();
final boolean isDeployed = jsfLibraryEditControl.getIsDeployed();
final boolean isImplementation = jsfLibraryEditControl.getIsImplementation();
final JSFVersion version = jsfLibraryEditControl.getJSFVersion();
workingCopyLibrary.setName(name);
workingCopyLibrary.setDeployed(isDeployed);
workingCopyLibrary.setImplementation(isImplementation);
workingCopyLibrary.setJSFVersion(version);
final String originalID = curLibrary != null ? curLibrary.getID() :workingCopyLibrary.getID();
if (isNew){
JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().addJSFLibrary(workingCopyLibrary);
}
else {
curLibrary.updateValues(workingCopyLibrary);
try {
JSFLibraryRegistryUtil.rebindClasspathContainerEntries(originalID, workingCopyLibrary.getID(), null);
} catch (JavaModelException e) {
JSFUiPlugin.log(IStatus.ERROR, "Exception while updating JSF Library containers", e); //$NON-NLS-1$
}
}
JSFLibraryRegistryUtil.getInstance().saveJSFLibraryRegistry();
return true;
}
/* (non-Javadoc)
* @see org.eclipse.jface.wizard.Wizard#addPages()
*/
public void addPages() {
page = new JSFLibraryWizardPage(Messages.JSFLibraryWizard_JSFLibrary);
super.addPage(page);
page.setWizard(this);
}
/**
* @return the JSFLibrary being modified by this wizard
*/
public JSFLibrary getJSFLibrary() {
return workingCopyLibrary;
}
private class JSFLibraryWizardPage extends WizardPage {
/**
* @param pageName
*/
protected JSFLibraryWizardPage(String pageName) {
super(pageName);
setDescription(isImplsOnly()
? Messages.JSFLibraryWizard_IMPLS_ONLY_DESC
: Messages.JSFLibraryWizard_DESCRIPTION);
setTitle(Messages.JSFLibraryWizard_JSFLibrary);
}
/* (non-Javadoc)
* @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
*/
public boolean isPageComplete() {
if (modified == false) {
return false;
}
return super.isPageComplete();
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl(Composite parent) {
initializeDialogUnits(parent);
jsfLibraryEditControl = new JSFLibraryEditControl(workingCopyLibrary, parent);
jsfLibraryEditControl.setImplOnly(isImplsOnly());
jsfLibraryEditControl.setNonImplOnly(isNonImplsOnly());
jsfLibraryEditControl.setLayout(new GridLayout(2, false));
jsfLibraryEditControl.setLayoutData(new GridData(GridData.FILL_BOTH));
jsfLibraryEditControl.addValidationListener(new JSFLibraryValidationListener(){
public void notifyValidation(JSFLibraryValidationEvent e) {
setErrorMessage(e.getMessage());
modified = true;
setPageComplete(getErrorMessage()==null);
}
});
setControl(jsfLibraryEditControl);
setPageComplete(false);
}
}
}