/*******************************************************************************
* Copyright (c) 2004, 2010 BREDEX GmbH.
* 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:
* BREDEX GmbH - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.jubula.client.ui.rcp.handlers;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.window.Window;
import org.eclipse.jubula.client.archive.businessprocess.ProjectBP;
import org.eclipse.jubula.client.core.events.DataEventDispatcher;
import org.eclipse.jubula.client.core.events.DataEventDispatcher.ProjectState;
import org.eclipse.jubula.client.core.model.ProjectVersion;
import org.eclipse.jubula.client.core.persistence.GeneralStorage;
import org.eclipse.jubula.client.core.persistence.PMException;
import org.eclipse.jubula.client.core.persistence.PMSaveException;
import org.eclipse.jubula.client.core.persistence.ProjectPM;
import org.eclipse.jubula.client.ui.constants.ContextHelpIds;
import org.eclipse.jubula.client.ui.constants.IconConstants;
import org.eclipse.jubula.client.ui.handlers.AbstractHandler;
import org.eclipse.jubula.client.ui.rcp.Plugin;
import org.eclipse.jubula.client.ui.rcp.controllers.PMExceptionHandler;
import org.eclipse.jubula.client.ui.rcp.dialogs.VersionDialog;
import org.eclipse.jubula.client.ui.rcp.i18n.Messages;
import org.eclipse.jubula.client.ui.rcp.utils.Utils;
import org.eclipse.jubula.client.ui.utils.DialogUtils;
import org.eclipse.jubula.client.ui.utils.ErrorHandlingUtil;
import org.eclipse.jubula.tools.internal.exception.ProjectDeletedException;
import org.eclipse.jubula.tools.internal.messagehandling.MessageIDs;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.progress.IProgressService;
/**
* @author BREDEX GmbH
* @created Jun 29, 2007
*/
@SuppressWarnings("synthetic-access")
public class CreateNewProjectVersionHandler extends AbstractHandler {
/**
* call this if the "save as" has ended to update the GUI.
*/
private void fireReady() {
DataEventDispatcher ded = DataEventDispatcher.getInstance();
ded.fireProjectLoadedListener(new NullProgressMonitor());
ded.fireProjectStateChanged(ProjectState.opened);
}
/**
* @param projectVersion the new version
* @return new WorkerThread
*/
private IRunnableWithProgress createOperation(
ProjectVersion projectVersion) {
return new ProjectBP.NewVersionOperation(
GeneralStorage.getInstance().getProject(),
projectVersion);
}
/**
* Opens the dialog to change the project name
* @return the dialog, or <code>null</code> if an error prevents the dialog
* from opening
*/
private VersionDialog openVersionDialog() {
ProjectVersion actualVersion = new ProjectVersion(1, 0, null);
try {
GeneralStorage.getInstance().validateProjectExists(
GeneralStorage.getInstance().getProject());
actualVersion = GeneralStorage.getInstance()
.getProject().getProjectVersion();
} catch (ProjectDeletedException e) {
PMExceptionHandler
.handleProjectDeletedException();
return null;
}
VersionDialog dialog = new VersionDialog(
getActiveShell(),
Messages.CreateNewProjectVersionActionTitle,
actualVersion,
Messages.CreateNewProjectVersionActionMessage,
IconConstants.BIG_PROJECT_STRING,
Messages.CreateNewProjectVersionActionShellTitle) {
/**
* {@inheritDoc}
*/
protected boolean isInputAllowed() {
ProjectVersion version = getFieldVersion();
if (ProjectPM.doesProjectVersionExist(
GeneralStorage.getInstance().getProject().getGuid(),
version.getMajorNumber(),
version.getMinorNumber(),
version.getMicroNumber(),
version.getVersionQualifier())) {
setErrorMessage(Messages.
CreateNewProjectVersionActionDoubleVersion);
return false;
}
return true;
}
/**
* {@inheritDoc}
*/
protected void okPressed() {
ProjectVersion version = getFieldVersion();
if (ProjectPM.doesProjectVersionExist(
GeneralStorage.getInstance().getProject().getGuid(),
version.getMajorNumber(),
version.getMinorNumber(),
version.getMicroNumber(),
version.getVersionQualifier())) {
ErrorHandlingUtil.createMessageDialog(
MessageIDs.E_PROJECTVERSION_ALREADY_EXISTS,
new Object[]{
getProjectVersion()},
null);
return;
}
super.okPressed();
}
};
dialog.setHelpAvailable(true);
dialog.create();
DialogUtils.setWidgetNameForModalDialog(dialog);
Plugin.getHelpSystem().setHelp(dialog.getShell(),
ContextHelpIds.DIALOG_PROJECT_CREATENEWVERSION);
dialog.open();
return dialog;
}
/**
* {@inheritDoc}
*/
public Object executeImpl(ExecutionEvent event) {
Plugin.startLongRunning(Messages.SaveProjectAsActionWaitWhileSaving);
VersionDialog dialog = openVersionDialog();
if (dialog != null && dialog.getReturnCode() == Window.OK) {
ProjectVersion version = dialog.getProjectVersion();
IRunnableWithProgress op = createOperation(version);
try {
IProgressService progressService =
PlatformUI.getWorkbench().getProgressService();
progressService.busyCursorWhile(op);
fireReady();
} catch (InvocationTargetException e) {
Throwable targetException = e.getTargetException();
if (targetException instanceof PMSaveException) {
PMExceptionHandler.handlePMExceptionForMasterSession(
new PMSaveException(targetException.getMessage(),
MessageIDs.E_CREATE_NEW_VERSION_FAILED));
} else if (targetException instanceof PMException) {
PMExceptionHandler.handlePMExceptionForMasterSession(
(PMException) targetException);
} else if (targetException instanceof ProjectDeletedException) {
PMExceptionHandler.handleProjectDeletedException();
}
} catch (InterruptedException e) {
// Operation was canceled.
// We have to clear the GUI because all of
// the save work was done in the Master Session, which has been
// rolled back.
Utils.clearClient();
}
} else {
Plugin.stopLongRunning();
}
return null;
}
}