/******************************************************************************* | |
* 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); | |
} | |
} | |
} |