Sample Wizard

The WizardController makes it possible to write event-driven wizards. Furthermore it eases the creation of dialog elements. You can integrate the WizardController by means of the useWizardController procedure which is part of the wizardLib.tcl file. For details about how the WizardController works, please look into the wizardController.tcl file.

The following example is a simple wizard for editing the title of a file. For handling events, the WizardController calls procedures whose names it composes of the page name and the user's action (identified by the name of the button clicked). For clarity, the components of these procedure names are colored.

if {[app get appName] ne "CM"} {
   return
}

namespace eval ::enterTitle {

   useWizardController


   proc initRender {paramList args} {
        variable objId
        set objId $args
        return
   }


   proc handleInitPage {buttonName} {
        variable objId
        if {![obj withId $objId get isEdited]} {
            return [renderErrorPage "The file does not have a draft version." "Error"]
        }
        if {[whoami] ne [obj withId $objId editedContent get editor]} {
            return [renderErrorPage "You are not the editor of the file." "Error"]
        }
        return [renderEnterTitlePage]
   }


   proc handleCancelAction {pageName} {
        return ""
   }


   proc renderEnterTitlePage {} {
        set content [::layout::textField contentTitle Titel "New title"]
        return [renderPage -title "Set title" -buttons [list ok cancel]\ 
            "enterTitle" $content]
   }


   proc handleEnterTitleOkPageAction {} {
        variable objId
        obj withId $objId editedContent set title [getParam contentTitle]
        addNpsRefresh $objId
        return [renderSuccessPage]
   }


   proc renderSuccessPage {} {
        set content "<p>The title has been set.</p>"
        return [renderPage -title "Thank you very much!" -buttons [list ok] "success" $content]
   }


   proc handleSuccessOkPageAction {} {
        return ""
   }


   # Output any page of this wizard
   proc renderPage {args} {
       variable objId 
       return [eval [list npsPage -affectedNodes [list $objId]] $args]
   }
}