blob: bef058d4cbc09a299bcb09b1ec04657ff4169484 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2009 David A Carlson.
* 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:
* David A Carlson (XMLmodeling.com) - initial API and implementation
*
* $Id$
*******************************************************************************/
package org.eclipse.mdht.uml.ui.navigator.internal.actions;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.mdht.uml.common.ui.saveable.ModelDocument;
import org.eclipse.mdht.uml.common.ui.saveable.ModelManager;
import org.eclipse.mdht.uml.ui.navigator.internal.l10n.Messages;
import org.eclipse.mdht.uml.ui.navigator.internal.plugin.Logger;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.Package;
/**
*
*/
public class CloseModelAction extends Action {
private Element modelElement;
private ISelectionProvider provider;
/**
* Construct this Action with the given page.
*
* @param p
* The page to use as context to open the editor.
* @param selectionProvider
* The selection provider
*/
public CloseModelAction(IWorkbenchPage p, ISelectionProvider selectionProvider) {
setText(Messages.CloseModelAction_label);
provider = selectionProvider;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.Action#isEnabled()
*/
@Override
public boolean isEnabled() {
ISelection selection = provider.getSelection();
if (!selection.isEmpty() && ((IStructuredSelection) selection).size() == 1) {
Object selected = ((IStructuredSelection) selection).getFirstElement();
if (selected instanceof IAdaptable) {
selected = ((IAdaptable) selected).getAdapter(Element.class);
}
if (selected instanceof Package) {
modelElement = (Element) selected;
return true;
}
}
return false;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.Action#run()
*/
@Override
public void run() {
closeModel(getResource());
}
protected Resource getResource() {
return modelElement.eResource();
}
protected static void closeModel(Resource resource) {
try {
ModelDocument saveable = ModelManager.getManager().getModelDocument(resource);
if (saveable != null) {
if (saveable.isDirty()) {
String fileName = resource.getURI().lastSegment();
String message = NLS.bind(Messages.CloseModelAction_dialogMessage, fileName);
// Yes, No, Cancel
MessageDialog dialog = new MessageDialog(
Display.getDefault().getActiveShell(), Messages.CloseModelAction_dialogTitle, null, // accept
message, MessageDialog.QUESTION,
new String[] {
IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL, IDialogConstants.CANCEL_LABEL },
0); // yes is the default
int result = dialog.open();
if (2 == result) {
// Cancel
return;
}
if (0 == result) {
// Yes
saveable.doSave(new NullProgressMonitor());
}
}
// if not canceled, the resource is closed
saveable.doClose(new NullProgressMonitor());
return;
}
// if saveable not found, the resource is unloaded
resource.unload();
} catch (Exception e) {
String message = NLS.bind(Messages.CloseModelAction_errorMessage, new String[] { e.getLocalizedMessage() });
Logger.logException(message, e);
MessageDialog.openError(
Display.getDefault().getActiveShell(), Messages.CloseModelAction_errorTitle, message);
}
}
}