/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/

package org.apache.taverna.workbench.file.impl.hooks;

import org.apache.taverna.workbench.ShutdownSPI;
import org.apache.taverna.workbench.edits.EditManager;
import org.apache.taverna.workbench.file.FileManager;
import org.apache.taverna.workbench.file.impl.actions.CloseAllWorkflowsAction;

/**
 * Close open workflows (and ask the user if she wants to save changes) on
 * shutdown.
 * 
 * @author Stian Soiland-Reyes
 */
public class CloseWorkflowsOnShutdown implements ShutdownSPI {
	private CloseAllWorkflowsAction closeAllWorkflowsAction;

	public CloseWorkflowsOnShutdown(EditManager editManager,
			FileManager fileManager) {
		closeAllWorkflowsAction = new CloseAllWorkflowsAction(editManager,
				fileManager);
	}

	@Override
	public int positionHint() {
		/*
		 * Quite early, we don't want to do various clean-up in case the user
		 * clicks Cancel
		 */
		return 50;
	}

	@Override
	public boolean shutdown() {
		return closeAllWorkflowsAction.closeAllWorkflows(null);
	}
}
