org.eclipse.mdht.uml.ui.navigator.internal.actions.CloseModelAction.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.mdht.uml.ui.navigator.internal.actions.CloseModelAction.java

Source

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