###############################################################################
##                                                                           ##
##  Copyright (c) 2012 Gerald W. Lester                                      ##
##  All rights reserved.                                                     ##
##                                                                           ##
##  Redistribution and use in source and binary forms, with or without       ##
##  modification, are permitted provided that the following conditions       ##
##  are met:                                                                 ##
##                                                                           ##
##    * Redistributions of source code must retain the above copyright       ##
##      notice, this list of conditions and the following disclaimer.        ##
##    * Redistributions in binary form must reproduce the above              ##
##      copyright notice, this list of conditions and the following          ##
##      disclaimer in the documentation and/or other materials provided      ##
##      with the distribution.                                               ##
##    * Neither the name of the Visiprise Software, Inc nor the names        ##
##      of its contributors may be used to endorse or promote products       ##
##      derived from this software without specific prior written            ##
##      permission.                                                          ##
##                                                                           ##
##  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS      ##
##  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT        ##
##  LIMITED  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS       ##
##  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE           ##
##  COPYRIGHT OWNER OR  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,     ##
##  INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,    ##
##  BUT NOT LIMITED TO,  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;        ##
##  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER         ##
##  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT       ##
##  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR  OTHERWISE) ARISING IN       ##
##  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF  ADVISED OF THE         ##
##  POSSIBILITY OF SUCH DAMAGE.                                              ##
##                                                                           ##
###############################################################################

###########################################################################
#
# Procedure Header - as this procedure is modified, please be sure
#                           that you update this header block. Thanks.
#
# Procedure Name :
#
# Description : Get the type cross reference information for a service.
#
# Arguments :
#       mode            - Client|Server
#
# Returns : Nothing
#
# Side-Effects : None
#
# Exception Conditions : None
#
# Pre-requisite Conditions : None
#
# Original Author : Gerald W. Lester
#
###########################################################################
proc BuildMainWindow {} {
    ::log::log debug [info level 0]
    variable windows

    set windows(Main) .
    set windows(MainNotebook) .nb
    set windows(Mainmenu) .menuBar

    ##
    ## Configure the main window
    ##
    menu $windows(Mainmenu)
    $windows(Main) configure -menu $windows(Mainmenu)
    wm title $windows(Main) {Ballet Hysell Data Manager}
    wm protocol $windows(Main) WM_DELETE_WINDOW ExitApplication
    wm maxsize $windows(Main) [winfo screenwidth $windows(Main)] [winfo screenheight $windows(Main)]

    tk appname {Hysell}

    ##
    ## Build the main menu
    ##
    BuildMainMenu $windows(Main) $windows(Mainmenu)

    ##
    ## Build the notebook
    ##
    ttk::notebook $windows(MainNotebook)
    bind $windows(MainNotebook) <<NotebookTabChanged>>  {
        set systemInfo(CurrentTab) [%W select]
    }
    BuildAudtionTab $windows(MainNotebook)
    BuildCostumeTab $windows(MainNotebook)
    BuildPerformerTab $windows(MainNotebook)
    BuildShowTab $windows(MainNotebook)
    $windows(MainNotebook) add $windows(MainShowTab) \
        -state normal \
        -sticky nsew \
        -text {Show View} \
        -underline 0
    $windows(MainNotebook) add $windows(MainAuditionTab) \
        -state normal \
        -sticky nsew \
        -text {Audition View} \
        -underline 0
    $windows(MainNotebook) add $windows(MainPerformerTab) \
        -state normal \
        -sticky nsew \
        -text {Performer View} \
        -underline 0
    $windows(MainNotebook) add $windows(MainCostumeTab) \
        -state normal \
        -sticky nsew \
        -text {Costume View} \
        -underline 0

    ##
    ## Define resize behavior
    ##
    grid configure $windows(MainNotebook) -sticky nsew
    grid columnconfigure $windows(Main) $windows(MainNotebook) -weight 1
    grid rowconfigure $windows(Main) $windows(MainNotebook) -weight 1

    return
}


###########################################################################
#
# Procedure Header - as this procedure is modified, please be sure
#                           that you update this header block. Thanks.
#
# Procedure Name : BuildMainMenu
#
# Description : Build the menu for the main window.
#
# Arguments :
#       top         - Main window
#       menuWidget  - Menu widget for main window
#
# Returns : Nothing
#
# Side-Effects : None
#
# Exception Conditions : None
#
# Pre-requisite Conditions : None
#
# Original Author : Gerald W. Lester
#
###########################################################################
proc BuildMainMenu {top menuWidget} {
    ::log::log debug [info level 0]
    variable windows

    ##
    ## Add in File menu
    ##
    $menuWidget add cascade \
        -label {File} \
        -underline 0 \
        -menu $menuWidget.file
    menu $menuWidget.file
    $menuWidget.file add cascade \
        -label {Reports} \
        -underline 0 \
        -menu $menuWidget.file.report
    menu $menuWidget.file.report -postcommand [list BuildReportMenu $menuWidget.file.report]
    $menuWidget.file add separator
    $menuWidget.file add command \
        -label {Exit} \
        -underline 1 \
        -command [list after 1 ExitApplication]

    ##
    ## Add in track menu
    ##
    $menuWidget add cascade \
        -label {Settings} \
        -underline 0 \
        -menu $menuWidget.filter
    menu $menuWidget.filter
    $menuWidget.filter add cascade \
        -label {Export Controls} \
        -underline 1 \
        -menu $menuWidget.filter.export
    menu $menuWidget.filter.export
    $menuWidget.filter.export add checkbutton \
        -label {Selected Records} \
        -underline 10 \
        -offvalue 0 \
        -onvalue 1 \
        -variable systemInfo(ExportSelected)
    $menuWidget.filter.export add checkbutton \
        -label {Active Records} \
        -underline 1 \
        -offvalue 0 \
        -onvalue 1 \
        -variable systemInfo(ExportActive)
    $menuWidget.filter.export add checkbutton \
        -label {Reporting Records} \
        -underline 1 \
        -offvalue 0 \
        -onvalue 1 \
        -variable systemInfo(ExportReport)
    $menuWidget.filter.export add checkbutton \
        -label {Selected Show} \
        -underline 10 \
        -offvalue 0 \
        -onvalue 1 \
        -variable systemInfo(ExportShow)
    $menuWidget.filter add cascade \
        -label {Performer} \
        -underline 1 \
        -menu $menuWidget.filter.performer
    menu $menuWidget.filter.performer
    $menuWidget.filter.performer add checkbutton \
        -label {Selected Show Only} \
        -underline 10 \
        -offvalue 0 \
        -onvalue 1 \
        -command PopulatePerformers \
        -variable systemInfo(PerformerTracksShow)
    $menuWidget.filter.performer add checkbutton \
        -label {Selected Costume Only} \
        -underline 10 \
        -offvalue 0 \
        -onvalue 1 \
        -command PopulatePerformers \
        -variable systemInfo(PerformerTracksCostume)
    $menuWidget.filter.performer add checkbutton \
        -label {Active Records Only} \
        -underline 1 \
        -offvalue 0 \
        -onvalue 1 \
        -command PopulatePerformers \
        -variable systemInfo(PerformerFilterOnActive)
    $menuWidget.filter.performer add checkbutton \
        -label {Reporting Records Only} \
        -underline 1 \
        -offvalue 0 \
        -onvalue 1 \
        -command PopulatePerformers \
        -variable systemInfo(PerformerFilterOnReport)

    ##
    ## Add in Tools menu
    ##
    $menuWidget add cascade \
        -label {Tools} \
        -underline 0 \
        -menu $menuWidget.tools
    menu $menuWidget.tools
    $menuWidget.tools add command \
        -label {Costume Entry Screen} \
        -command DisplayCostumeEntryGui
    $menuWidget.tools add cascade \
        -label {Audition Entry Screen} \
        -menu $menuWidget.tools.audition
    menu $menuWidget.tools.audition
    $menuWidget.tools.audition add command \
        -label {Audition Entry Screen} \
        -command DisplayAuditionEntryGui
    $menuWidget.tools.audition add checkbutton \
        -label [::msgcat::mc EnterAuditionNumber] \
        -underline 1 \
        -offvalue N \
        -onvalue Y \
        -variable systemInfo(EnterAuditionNumber) \
        -command [list AdjustAuto systemInfo(EnterAuditionNumber) .auditionEntryGui.top.ent_auditionnumber]
    $menuWidget.tools add cascade \
        -label {Mass Update} \
        -underline 0 \
        -menu $menuWidget.tools.massupdate
    menu $menuWidget.tools.massupdate
    $menuWidget.tools.massupdate add checkbutton \
        -label {Enabled} \
        -underline 1 \
        -offvalue 0 \
        -onvalue 1 \
        -command ToggleMassupdateMode \
        -variable MassUpdate(Enabled)
    $menuWidget.tools.massupdate add separator
    $menuWidget.tools.massupdate add command \
        -label {Select All} \
        -state disabled \
        -command [list SelectCurrentView All]
    bind $top <Control-A> [list $menuWidget.tools.massupdate invoke {Select All}]
    bind $top <Control-a> [list $menuWidget.tools.massupdate invoke {Select All}]
    bind $top <Command-A> [list $menuWidget.tools.massupdate invoke {Select All}]
    bind $top <Command-a> [list $menuWidget.tools.massupdate invoke {Select All}]
    $menuWidget.tools.massupdate add command \
        -label {Select None} \
        -state disabled \
        -command [list SelectCurrentView None]
    bind $top <Control-N> [list $menuWidget.tools.massupdate invoke {Select None}]
    bind $top <Control-n> [list $menuWidget.tools.massupdate invoke {Select None}]
    bind $top <Command-N> [list $menuWidget.tools.massupdate invoke {Select None}]
    bind $top <Command-n> [list $menuWidget.tools.massupdate invoke {Select None}]
    $menuWidget.tools.massupdate add separator
    $menuWidget.tools.massupdate add command \
        -label {Mark Active} \
        -state disabled \
        -command [list MarkActive Y]
    $menuWidget.tools.massupdate add command \
        -label {Mark Inactive} \
        -state disabled \
        -command [list MarkActive N]
    $menuWidget.tools.massupdate add separator
    $menuWidget.tools.massupdate add command \
        -label {Mark In Report} \
        -state disabled \
        -command [list MarkInReport Y]
    $menuWidget.tools.massupdate add command \
        -label {Mark Not In Report} \
        -state disabled \
        -command [list MarkInReport N]
    $menuWidget.tools.massupdate add separator
    $menuWidget.tools.massupdate add command \
        -label {Mark In Show} \
        -state disabled \
        -command [list MarkInShow Y]
    $menuWidget.tools.massupdate add command \
        -label {Mark Not In Show} \
        -state disabled \
        -command [list MarkInShow N]
    $menuWidget.tools add separator
    $menuWidget.tools add command \
        -label {Copy Family Information} \
        -state disabled \
        -command {CopyFamilyInfo $windows(performerDetailedArrayName)}
    $menuWidget.tools add separator
    menu $menuWidget.tools.tables
    $menuWidget.tools add command \
        -label {Report Maintenance} \
        -command {ExportListMaintenance}
    $menuWidget.tools add cascade \
        -label {Table Maintenance} \
        -menu $menuWidget.tools.tables
    $menuWidget.tools.tables add command \
        -label {Shows} \
        -command {TableMaintenace Show}
    $menuWidget.tools.tables add command \
        -label {Costumes} \
        -command {TableMaintenace characters}
    $menuWidget.tools.tables add command \
        -label {Performers} \
        -command {TableMaintenace Performers}

    ##
    ## Add in Help menu
    ##
    $menuWidget add cascade \
        -label {Help} \
        -underline 0 \
        -menu $menuWidget.help
    menu $menuWidget.help


    return;
}
