Package org.erlide.wrangler.refactoring.ui

Source Code of org.erlide.wrangler.refactoring.ui.RefactoringHandler

/*******************************************************************************
* Copyright (c) 2010 György Orosz.
* 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:
*     György Orosz - initial API and implementation
******************************************************************************/
package org.erlide.wrangler.refactoring.ui;

import java.util.ArrayList;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.texteditor.ITextEditor;
import org.erlide.engine.ErlangEngine;
import org.erlide.engine.model.erlang.IErlFunctionClause;
import org.erlide.runtime.rpc.RpcResult;
import org.erlide.util.ErlLogger;
import org.erlide.util.erlang.OtpErlang;
import org.erlide.wrangler.refactoring.backend.RefactoringState;
import org.erlide.wrangler.refactoring.backend.internal.GenFunRefactoringMessage;
import org.erlide.wrangler.refactoring.backend.internal.GenFunRefactoringMessage.GenFunReturnParameterName;
import org.erlide.wrangler.refactoring.backend.internal.WranglerBackendManager;
import org.erlide.wrangler.refactoring.core.CostumWorkflowRefactoringWithPositionsSelection;
import org.erlide.wrangler.refactoring.core.WranglerRefactoring;
import org.erlide.wrangler.refactoring.core.internal.ApplyAdhocElemRefactoring;
import org.erlide.wrangler.refactoring.core.internal.ApplyUserElementaryRefactoring;
import org.erlide.wrangler.refactoring.core.internal.EqcFsmStateDataToRecordRefactoring;
import org.erlide.wrangler.refactoring.core.internal.EqcStatemStateDataToRecordRefactoring;
import org.erlide.wrangler.refactoring.core.internal.ExtractFunctionRefactoring;
import org.erlide.wrangler.refactoring.core.internal.FoldAgainstMacro;
import org.erlide.wrangler.refactoring.core.internal.FoldLocalExpressionRefactoring;
import org.erlide.wrangler.refactoring.core.internal.FoldRemoteExpressionRefactoring;
import org.erlide.wrangler.refactoring.core.internal.FunctionToProcessRefactoring;
import org.erlide.wrangler.refactoring.core.internal.GenFsmStateDataToRecordRefactoring;
import org.erlide.wrangler.refactoring.core.internal.GeneraliseFunctionRefactoring;
import org.erlide.wrangler.refactoring.core.internal.GeneraliseFunctionRefactoring.State;
import org.erlide.wrangler.refactoring.core.internal.IntroduceLetRefactoring;
import org.erlide.wrangler.refactoring.core.internal.IntroduceMacroRefactoring;
import org.erlide.wrangler.refactoring.core.internal.IntroduceNewVariableRefactoring;
import org.erlide.wrangler.refactoring.core.internal.MergeForAllRefactoring;
import org.erlide.wrangler.refactoring.core.internal.MergeLetRefactoring;
import org.erlide.wrangler.refactoring.core.internal.MoveFunctionRefactoring;
import org.erlide.wrangler.refactoring.core.internal.NormalizeRecordExpression;
import org.erlide.wrangler.refactoring.core.internal.PartitionExportsRefactoring;
import org.erlide.wrangler.refactoring.core.internal.RenameFunctionRefactoring;
import org.erlide.wrangler.refactoring.core.internal.RenameModuleRefactoring;
import org.erlide.wrangler.refactoring.core.internal.RenameProcessRefactoring;
import org.erlide.wrangler.refactoring.core.internal.RenameVariableRefactoring;
import org.erlide.wrangler.refactoring.core.internal.TupleFunctionParametersRefactoring;
import org.erlide.wrangler.refactoring.core.internal.UnfoldFunctionApplicationRefactoring;
import org.erlide.wrangler.refactoring.exception.WranglerException;
import org.erlide.wrangler.refactoring.selection.IErlMemberSelection;
import org.erlide.wrangler.refactoring.ui.validator.AtomValidator;
import org.erlide.wrangler.refactoring.ui.validator.IValidator;
import org.erlide.wrangler.refactoring.ui.validator.ModuleNameValidator;
import org.erlide.wrangler.refactoring.ui.validator.NonEmptyStringValidator;
import org.erlide.wrangler.refactoring.ui.validator.NormalDoulbeValidator;
import org.erlide.wrangler.refactoring.ui.validator.VariableNameValidator;
import org.erlide.wrangler.refactoring.ui.warning.WarningViewManager;
import org.erlide.wrangler.refactoring.ui.wizard.DefaultWranglerRefactoringWizard;
import org.erlide.wrangler.refactoring.ui.wizardpages.ComboInputPage;
import org.erlide.wrangler.refactoring.ui.wizardpages.CostumworkFlowInputPage;
import org.erlide.wrangler.refactoring.ui.wizardpages.RecordDataInputPage;
import org.erlide.wrangler.refactoring.ui.wizardpages.SelectionInputPage;
import org.erlide.wrangler.refactoring.ui.wizardpages.SimpleInputPage;
import org.erlide.wrangler.refactoring.ui.wizardpages.UserRefacInputPage;
import org.erlide.wrangler.refactoring.ui.wizardpages.WranglerPage;
import org.erlide.wrangler.refactoring.util.GlobalParameters;
import org.erlide.wrangler.refactoring.util.WranglerUtils;

import com.ericsson.otp.erlang.OtpErlangList;
import com.ericsson.otp.erlang.OtpErlangLong;
import com.ericsson.otp.erlang.OtpErlangObject;
import com.ericsson.otp.erlang.OtpErlangRangeException;
import com.ericsson.otp.erlang.OtpErlangTuple;

/**
* Handles refactoring commands
*
* @author Gyorgy Orosz
* @version %I%, %G%
*/
public class RefactoringHandler extends AbstractHandler {

    @Override
    public Object execute(final ExecutionEvent event) throws ExecutionException {
        try {
            GlobalParameters.setSelection(PlatformUI.getWorkbench()
                    .getActiveWorkbenchWindow().getActivePage().getSelection());
        } catch (final WranglerException e1) {

            MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow()
                    .getShell(), "Error", e1.getMessage());
            return null;
        }

        if (!checkForDirtyEditors()) {
            return null;
        }

        DefaultWranglerRefactoringWizard wizard = null;
        WranglerRefactoring refactoring = null;
        final String actionId = event.getCommand().getId();

        final ArrayList<WranglerPage> pages = new ArrayList<WranglerPage>();

        // apply ad hoc refactoring
        if (actionId.equals("org.erlide.wrangler.refactoring.adhoc")) {
            final InputDialog dialog = getModuleInput("Apply ad hoc refactoring",
                    "Please type the gen_refac module name!");

            dialog.open();

            if (dialog.getReturnCode() == Window.CANCEL) {
                return null;
            }

            final String callbackModule = dialog.getValue();

            pages.add(new UserRefacInputPage("Apply ad hoc refactoring",
                    "Please type input arguments for this refactoring",
                    "Arguments should not be empty!", new NonEmptyStringValidator()));
            refactoring = new ApplyAdhocElemRefactoring();

            ((ApplyAdhocElemRefactoring) refactoring)
                    .setCallbackModuleName(callbackModule);

            if (!((ApplyAdhocElemRefactoring) refactoring).fetchParPrompts()) {
                MessageDialog.openError(PlatformUI.getWorkbench()
                        .getActiveWorkbenchWindow().getShell(),
                        "Elementary refactoring error", "Can not load callback module");
                return null;
            }

            // apply user-defined refactoring
        } else if (actionId.equals("org.erlide.wrangler.refactoring.gen_refac")) {
            final String callbackModule = event
                    .getParameter("org.erlide.wrangler.refactoring.gen_refac.callback");
            final String name = event
                    .getParameter("org.erlide.wrangler.refactoring.gen_refac.name");

            pages.add(new UserRefacInputPage(name,
                    "Please type input arguments for this refactoring",
                    "Arguments should not be empty!", new NonEmptyStringValidator()));
            refactoring = new ApplyUserElementaryRefactoring(name, callbackModule);

            if (!((ApplyUserElementaryRefactoring) refactoring).fetchParPrompts()) {
                MessageDialog.openError(PlatformUI.getWorkbench()
                        .getActiveWorkbenchWindow().getShell(), "Refactoring error",
                        "Can not find callback module");
                return null;
            }

            // run rename variable refactoring
        } else if (actionId.equals("org.erlide.wrangler.refactoring.renamevariable")) {
            refactoring = new RenameVariableRefactoring();
            final SimpleInputPage page = new SimpleInputPage("Rename variable",
                    "Please type the new variable name!", "New variable name:",
                    "New name must be a valid Erlang variable name!",
                    new VariableNameValidator());
            page.setInput(refactoring.getDefaultValue());
            pages.add(page);

            // introduce new variable refactoring
        } else if (actionId
                .equals("org.erlide.wrangler.refactoring.introducenewvariable")) {
            pages.add(new SimpleInputPage("Introduce new variable",
                    "Please type the new variable name!", "New variable name:",
                    "New name must be a valid Erlang variable name!",
                    new VariableNameValidator()));
            refactoring = new IntroduceNewVariableRefactoring();

            // run rename function refactoring
        } else if (actionId.equals("org.erlide.wrangler.refactoring.renamefunction")) {
            refactoring = new RenameFunctionRefactoring();
            final CostumworkFlowInputPage page = new CostumworkFlowInputPage(
                    "Rename function", "Please type the new function name!",
                    "New function name:", "New name must be a valid Erlang atom!",
                    new AtomValidator());
            page.setInput(refactoring.getDefaultValue());
            pages.add(page);

            // run extract function refactoring
        } else if (actionId.equals("org.erlide.wrangler.refactoring.extractfunction")) {
            pages.add(new CostumworkFlowInputPage("Extract function",
                    "Please type a function name!", "Function name:",
                    "Function name must be a valid Erlang atom!", new AtomValidator()));
            refactoring = new ExtractFunctionRefactoring();

            // run rename module refactoring
        } else if (actionId.equals("org.erlide.wrangler.refactoring.renamemodule")) {
            final boolean answer = MessageDialog
                    .openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow()
                            .getShell(), "Warning!",
                            "The requested operation cannot be undone. Would you like to continue?");

            if (!answer) {
                return null;
            }

            refactoring = new RenameModuleRefactoring();
            final CostumworkFlowInputPage page = new CostumworkFlowInputPage(
                    "Rename module", "Please type the new module name!",
                    "New module name:", "New module name must be a valid Erlang atom!",
                    new AtomValidator());
            page.setInput(refactoring.getDefaultValue());
            pages.add(page);

            // run move function refactoring
        } else if (actionId.equals("org.erlide.wrangler.refactoring.movefunction")) {

            final IProject project = ErlangEngine.getInstance().getModelUtilService()
                    .getProject(GlobalParameters.getWranglerSelection().getErlElement())
                    .getWorkspaceProject();
            final ArrayList<String> moduleList = WranglerUtils.getModuleNames(project);
            final String moduleName = GlobalParameters.getWranglerSelection()
                    .getErlElement().getResource().getName();
            moduleList.remove(WranglerUtils.removeExtension(moduleName));

            pages.add(new ComboInputPage("Move function",
                    "Please select the destination module", "Destination module:",
                    moduleList));
            refactoring = new MoveFunctionRefactoring();

            // run fold expression against a local function
        } else if (actionId.equals("org.erlide.wrangler.refactoring.foldlocalexpression")) {

            refactoring = new FoldLocalExpressionRefactoring();

            pages.add(new SelectionInputPage("Fold expression",
                    "Please select expression which should be fold!",
                    "Select expressions which should be folded!",
                    (CostumWorkflowRefactoringWithPositionsSelection) refactoring));

            // run fold expression against a remote function
        } else {
            final Shell activeShell = PlatformUI.getWorkbench().getDisplay()
                    .getActiveShell();
            if (actionId.equals("org.erlide.wrangler.refactoring.foldremoteexpression")) {

                // must store the selection, because, the user through the
                // dialog
                // may change it
                final IErlMemberSelection sel = (IErlMemberSelection) GlobalParameters
                        .getWranglerSelection();

                final RemoteFunctionClauseDialog dialog = new RemoteFunctionClauseDialog(
                        activeShell, "Fold expression");

                dialog.open();
                dialog.resetSelection();

                if (dialog.isFinished()) {
                    final IErlFunctionClause functionClause = dialog.getFunctionClause();
                    refactoring = new FoldRemoteExpressionRefactoring(functionClause, sel);
                    pages.add(new SelectionInputPage("Fold expression",
                            "Please select expression which should be fold!",
                            "Select expressions which should be folded!",
                            (CostumWorkflowRefactoringWithPositionsSelection) refactoring));

                } else {
                    return null;
                }

                // run introduce macro refactoring
            } else if (actionId.equals("org.erlide.wrangler.refactoring.introducemacro")) {
                refactoring = new IntroduceMacroRefactoring();
                pages.add(new SimpleInputPage("Introduce macro definition",
                        "Please type the new macro name!", "New macro name:",
                        "Macro name cannot be empty!", new NonEmptyStringValidator()));
                // run rename process refactoring
            } else if (actionId.equals("org.erlide.wrangler.refactoring.renameprocess")) {
                refactoring = new RenameProcessRefactoring();
                pages.add(new SimpleInputPage("Rename process",
                        "Please type the new process name!", "New process name:",
                        "New process name must be an Erlang atom!", new AtomValidator()));

                // run function to process refactoring
            } else if (actionId
                    .equals("org.erlide.wrangler.refactoring.functiontoprocess")) {
                refactoring = new FunctionToProcessRefactoring();
                pages.add(new SimpleInputPage("Convert function to process",
                        "Please type the new process name!", "New process name:",
                        "New process name must be an Erlang atom!", new AtomValidator()));

                // run tuple function parameters refactoring
            } else if (actionId
                    .equals("org.erlide.wrangler.refactoring.tuplefunctonparameters")) {
                refactoring = new TupleFunctionParametersRefactoring();

                // run generalise function refactoring
            } else if (actionId.equals("org.erlide.wrangler.refactoring.generalise")) {
                /*
                 * pages.add(new CostumworkFlowInputPage("Generalise function",
                 * "Please type the new parameter name!", "New parameter name:",
                 * "New parameter name must be a valid Erlang variable name!",
                 * new VariableNameValidator()));
                 */
                try {
                    refactoring = runGenFunRefactoring(pages, activeShell);
                } catch (final OtpErlangRangeException e) {
                    ErlLogger.error(e);
                    return null;
                }

                if (refactoring == null) {
                    return null;
                }

                // fold against macro definition
            } else if (actionId
                    .equals("org.erlide.wrangler.refactoring.foldagainstmacro")) {
                refactoring = new FoldAgainstMacro();

                pages.add(new SelectionInputPage("Fold against macro definition",
                        "Please select expression which should be fold!",
                        "Select expressions which should be folded!",
                        (CostumWorkflowRefactoringWithPositionsSelection) refactoring));

                // normalize record expression
            } else if (actionId
                    .equals("org.erlide.wrangler.refactoring.normalizerecordexpression")) {
                final boolean showDefaultFields = MessageDialog.openQuestion(activeShell,
                        "Showing defaults", "Show record fields with default values?");
                refactoring = new NormalizeRecordExpression(showDefaultFields);
            } else if (actionId.equals("org.erlide.wrangler.refactoring.introducelet")) {

                pages.add(new CostumworkFlowInputPage("Introduce ?LET",
                        "Please type the pattern variable name!",
                        "Pattern variable name:",
                        "New name must be a valid Erlang atom!",
                        new VariableNameValidator()));
                refactoring = new IntroduceLetRefactoring();
            } else if (actionId.equals("org.erlide.wrangler.refactoring.mergelet")) {
                refactoring = new MergeLetRefactoring();
                pages.add(new SelectionInputPage("Merge ?LET expressions",
                        "Please select expressions which whould be merged!",
                        "Select expressions which should be merged",
                        (CostumWorkflowRefactoringWithPositionsSelection) refactoring));
            } else if (actionId.equals("org.erlide.wrangler.refactoring.mergeforall")) {
                refactoring = new MergeForAllRefactoring();
                pages.add(new SelectionInputPage("Merge ?FORALL expressions",
                        "Please select expressions which should be merged!",
                        "Select expressions which should be merged",
                        (CostumWorkflowRefactoringWithPositionsSelection) refactoring));

            } else if (actionId
                    .equals("org.erlide.wrangler.refactoring.eqc_statemtorecord")) {
                refactoring = new EqcStatemStateDataToRecordRefactoring();
                pages.add(new RecordDataInputPage("eqc_statem State Data To Record"));

            } else if (actionId.equals("org.erlide.wrangler.refactoring.eqc_fsmtorecord")) {
                refactoring = new EqcFsmStateDataToRecordRefactoring();
                pages.add(new RecordDataInputPage("eqc_fsm State Data To Record"));

            } else if (actionId.equals("org.erlide.wrangler.refactoring.gen_fsmtorecord")) {
                refactoring = new GenFsmStateDataToRecordRefactoring();
                pages.add(new RecordDataInputPage("gen_fsm State Data To Record"));

            } else if (actionId
                    .equals("org.erlide.wrangler.refactoring.unfoldfunctionapplication")) {
                refactoring = new UnfoldFunctionApplicationRefactoring();

            } else if (actionId
                    .equals("org.erlide.wrangler.refactoring.partitionexports")) {
                refactoring = new PartitionExportsRefactoring();
                final SimpleInputPage page = new SimpleInputPage("Partition exports",
                        "Please input the the distance treshould between 0.1 and 1.0",
                        "Distance treshold", "The value must be between 0.1 and 1.0",
                        new NormalDoulbeValidator());
                page.setInput("0.8");
                pages.add(page);
            } else {
                return null;
            }
        }

        refactoring.doBeforeRefactoring();
        // run the given refactoring's wizard
        wizard = new DefaultWranglerRefactoringWizard(refactoring,
                RefactoringWizard.DIALOG_BASED_USER_INTERFACE, pages);

        final Shell shell = new Shell();
        final RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(
                wizard);

        try {
            final int ret = op.run(shell, refactoring.getName());

            if (RefactoringStatus.OK == ret) {
                refactoring.doAfterRefactoring();
            }
        } catch (final Exception e) {
            ErlLogger.error(e);
        }

        checkWarningMessages();
        return null;

    }

    private InputDialog getModuleInput(final String name, final String mesg) {
        return new InputDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow()
                .getShell(), name, mesg, "", new IInputValidator() {

            public IValidator internalV = new ModuleNameValidator();

            @Override
            public String isValid(final String newText) {
                if (internalV.isValid(newText)) {
                    return null;
                }
                return "Please type a correct module name!";
            }
        });
    }

    private boolean checkForDirtyEditors() {
        final IEditorPart[] dirtyEditors = PlatformUI.getWorkbench()
                .getActiveWorkbenchWindow().getActivePage().getDirtyEditors();
        if (dirtyEditors.length > 0) {
            final Boolean answer = MessageDialog
                    .openQuestion(
                            PlatformUI.getWorkbench().getActiveWorkbenchWindow()
                                    .getShell(),
                            "Unsaved changes",
                            "For running Wrangler refactorings, all Erlang files need to be saved. Would you like to continue with saving files?");
            if (answer) {
                for (final IEditorPart ed : dirtyEditors) {
                    if (ed instanceof ITextEditor) {
                        final ITextEditor ted = (ITextEditor) ed;
                        final IFileEditorInput fei = (IFileEditorInput) ted
                                .getEditorInput();
                        if (WranglerUtils.isErlangFile(fei.getFile())) {
                            ed.doSave(null);
                        }

                    }
                }
                return true;
            }
        }
        return true;

    }

    /**
     * Checks whether there is any warning messages, if yes displays a view,
     * containg all of them.
     */
    protected void checkWarningMessages() {
        try {
            final RpcResult res = WranglerBackendManager.getRefactoringBackend()
                    .getLoggedInfo();

            if (res.isOk()) {
                final OtpErlangObject resobj = res.getValue();
                if (!resobj.equals(new OtpErlangList())) {
                    final OtpErlangList reslist = (OtpErlangList) resobj;
                    for (int i = 0; i < reslist.arity(); ++i) {
                        final OtpErlangTuple restuple = (OtpErlangTuple) reslist
                                .elementAt(i);
                        final String formattedString = formatWarningString(OtpErlang
                                .asString(restuple.elementAt(1)));
                        WarningViewManager.addWarningMessage(formattedString);
                    }
                }
            } else {
                ErlLogger.error("Wrangler logging error:" + res);
            }
        } catch (final Exception e) {
            ErlLogger.error(e);
        }

    }

    private String formatWarningString(final String stringValue) {
        try {
            String ret = stringValue.replaceAll("\\s=+\\s", "");
            ret = ret.replaceAll("WARNING:\\s*", "");
            ret = ret.replaceAll("((\\n)(\\n))", "\n");
            ret = ret.replaceAll("\\s+$", "");
            return ret;
        } catch (final Exception e) {
            ErlLogger.error(e);
            return stringValue;
        }
    }

    /**
     * Run the generalise function refactoring
     *
     * @param pages
     * @param activeShell
     * @return
     * @throws OtpErlangRangeException
     */
    protected WranglerRefactoring runGenFunRefactoring(
            final ArrayList<WranglerPage> pages, final Shell activeShell)
            throws OtpErlangRangeException {
        WranglerRefactoring refactoring = null;

        final IErlMemberSelection sel = (IErlMemberSelection) GlobalParameters
                .getWranglerSelection();

        // Ask the user about a new name
        final NewParameterNameInputDialog dialog = new NewParameterNameInputDialog(
                activeShell, "New parameter name");
        dialog.open();
        if (!dialog.isFinished()) {
            return null;
        }

        final String newParamName = dialog.getData();
        dialog.close();

        // call initial RPC
        final GenFunRefactoringMessage m = (GenFunRefactoringMessage) WranglerBackendManager
                .getRefactoringBackend().callWithParser(new GenFunRefactoringMessage(),
                        "generalise_eclipse", "sxxsxi", sel.getFilePath(),
                        sel.getSelectionRange().getStartPos(),
                        sel.getSelectionRange().getEndPos(), newParamName,
                        sel.getSearchPath(), GlobalParameters.getTabWidth());

        // Examine the result of the refactoring: 4 cases
        if (m.getRefactoringState() == RefactoringState.OK) {
            refactoring = new GeneraliseFunctionRefactoring(State.ok, m);

        } else if (m.getRefactoringState() == RefactoringState.MULTI_INSTANCES) {

            refactoring = new GeneraliseFunctionRefactoring(State.multi_instance, m);

            pages.add(new SelectionInputPage("Generalise expression",
                    "Please select which of them should be generalised!",
                    "Select one of them, which should be folded!",
                    (CostumWorkflowRefactoringWithPositionsSelection) refactoring));

        } else if (m.getRefactoringState() == RefactoringState.MORE_THAN_ONE_CLAUSE) {
            final boolean selectedClauseOnly = MessageDialog.openQuestion(activeShell,
                    "Multiple clauses",
                    "The function selected has multiple clauses, would you like"
                            + " to generalise the function clause selected only?");
            refactoring = new GeneraliseFunctionRefactoring(State.more_than_one_clause,
                    m, selectedClauseOnly);
            if (((OtpErlangList) m.getParameters().get(
                    GenFunReturnParameterName.dupsInClause)).arity() > 0) {
                pages.add(new SelectionInputPage("Generalise expression",
                        "Please select which of them should be generalised!",
                        "Select one of them, which should be folded!",
                        (CostumWorkflowRefactoringWithPositionsSelection) refactoring));
            }

        } else if (m.getRefactoringState() == RefactoringState.UNKNOWN_SIDE_EFFECT) {
            final boolean sideEffect = MessageDialog.openQuestion(activeShell,
                    "Side effect", "Does the expression selected has side effect?");

            final OtpErlangObject noOfClausesPar = m.getParameters().get(
                    GenFunReturnParameterName.noOfClauses);
            if (noOfClausesPar != null && ((OtpErlangLong) noOfClausesPar).intValue() > 1) {
                final boolean selectedClauseOnly = MessageDialog.openQuestion(
                        activeShell, "Multiple clauses",
                        "The function selected has multiple clauses, would you like"
                                + " to generalise the function clause selected only?");
                refactoring = new GeneraliseFunctionRefactoring(
                        State.unknown_side_effect, m, selectedClauseOnly, sideEffect);

                if (!selectedClauseOnly
                        && ((OtpErlangList) m.getParameters().get(
                                GenFunReturnParameterName.dupsInFun)).arity() > 0
                        || selectedClauseOnly
                        && ((OtpErlangList) m.getParameters().get(
                                GenFunReturnParameterName.dupsInClause)).arity() > 0) {
                    pages.add(new SelectionInputPage("Generalise expression",
                            "Please select which of them should be generalised!",
                            "Select one of them, which should be folded!",
                            (CostumWorkflowRefactoringWithPositionsSelection) refactoring));
                }

            } else {
                refactoring = new GeneraliseFunctionRefactoring(
                        State.unknown_side_effect, m, true, sideEffect);
                pages.add(new SelectionInputPage("Generalise expression",
                        "Please select which of them should be generalised!",
                        "Select one of them, which should be folded!",
                        (CostumWorkflowRefactoringWithPositionsSelection) refactoring));

            }

        } else if (m.getRefactoringState() == RefactoringState.ERROR) {
            refactoring = new GeneraliseFunctionRefactoring(State.error,
                    m.getMessageString());

        } else {
            // error?
            return null;
        }
        return refactoring;
    }

}
TOP

Related Classes of org.erlide.wrangler.refactoring.ui.RefactoringHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.