h1. Sirius - Provide custom save dialog

h2. Goals

Sirius uses the same _Save Dialog_ for any operation that implies to the end-user whether changes made on session should be saved or discarded (when closing a session through the @CloseUISessionCommand@, when controlling resources...).

Developer may need to extend this save dialog to propose other choices to the end-user.

h2. Customize Sirius save dialogs

h3. The @ISaveDialogExtension@ interface

This interface allows to:
* Customize the choices given to the end-user when a save dialog opens (for example default is _Save_ and _Discard_)
* Add additional behavior according to the choice made by user.
 
* @boolean isSaveDialogFor(Object objectToSave)@ : allows to indicates whether this extension should be applied (condition on the Session for example)
* @Collection<String> getButtons();@ : returns a collection of String corresponding to the available choices for a save dialog (do no override CANCEL, this will be added automatically if possible)
* @int reactToValue(Object objectToSave, int userChoice);@ : defines the behavior to apply when faced to the given user choice.

h3. Provide your @ISaveDialogExtension@ using the @org.eclipse.sirius.common.ui.savedialogextension@ extension point

Please refer to this extension point documentation  for more details.

h2. Example

bc.. 
package myPackage;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import org.eclipse.sirius.business.api.session.Session;
import org.eclipse.ui.ISaveablePart2;

public class CustomSaveDialogExtension {

    public boolean isSaveDialogFor(Object objectToSave) {
        // This save dialog is active if
        // - the saved element is a session
        return (objectToSave instanceof Session)
        // - the session ID is "SaveSession"
                && "SaveSession".equals(((Session) objectToSave).getID());
    }

    public Collection<String> getButtons() {
        return new ArrayList<String>(Arrays.asList("Save", "Make something special", "Discard"));
    }

    public int reactToValue(Object objectToSave, int temporaryResult) {
        Session session = (Session) objectToSave;
        int returnedValue = ISaveablePart2.YES;

        switch (temporaryResult) {
        // Case 0 : "Save"
        case 0:
            // we will return ISaveablePart2.YES => the session will be saved
            // normally
            break;
        // Case 1 : "Make something special"
        case 1:
            makeSomethingSpecial(session);
            // we will return CANCEL => nothing else willl be done
            returnedValue = ISaveablePart2.CANCEL;
            break;
        // Case 2 : "Discard"
        case 2:
            // we return NO => changes will be discarded
            returnedValue = ISaveablePart2.NO;
            break;
        // Default : "CANCEL" or any other
        default:
            returnedValue = ISaveablePart2.CANCEL;
            break;

        }
        return returnedValue;
    }
}

