# Program: xf
# Description: handle menubutton widgets
#
# $Header: Menubutton[2.3] Wed Mar 10 11:59:02 1993 garfield@garfield frozen $

global xfDefaultConf
set xfDefaultConf(menubutton) 4

##########
# Procedure: XFAdd.Menubutton
# Description: add a menubutton
# Arguments: xfW - the widget
#            xfName - a optional name
#            xfType - add or config
# Returns: none
# Sideeffects: none
##########
proc XFAdd.Menubutton {xfW xfName xfType} {
  global xfStatus

  XFEditSetStatus "Inserting Menubutton..."
  set xfName [XFMiscGetUniqueName $xfName menubutton]
  if {"$xfStatus(path)" == "."} {
    if {"$xfType" == "add"} {
      menubutton .$xfName \
        -text "$xfName" \
        -menu .$xfName.m
    } {
      menubutton .$xfName
    }
    menu .$xfName.m

    XFMiscPositionWidget .$xfName
    XFMiscBindWidgetTree .$xfName
  } {
    if {"$xfType" == "add"} {
      menubutton $xfStatus(path).$xfName \
        -text "$xfName" \
        -menu $xfStatus(path).$xfName.m
    } {
      menubutton $xfStatus(path).$xfName
    }
    menu $xfStatus(path).$xfName.m

    XFMiscPositionWidget $xfStatus(path).$xfName
    XFMiscBindWidgetTree $xfStatus(path).$xfName
  }

  incr xfStatus(elementCounter)
  XFEditSetPath $xfStatus(path)
  XFEditSetStatus "Inserting Menubutton...done"
}

##########
# Procedure: XFConfig.Menubutton4
# Description: configure a menubutton
# Arguments: xfW - the widget
#            xfType - config type (add config)
#            xfClass - the class we configure
#            xfLeader - the leading window
# Returns: none
# Sideeffects: none
##########
proc XFConfig.Menubutton4 {xfW xfType xfClass {xfLeader ""}} {
  global xfStatus

  if {"$xfType" == "add"} {
    set xfName menubutton$xfStatus(elementCounter)
  } {
    set xfName [XFMiscPathName $xfW]
  }
  XFEditSetStatus "Calling parameter setting for Menubutton..."

  # build widget structure
  XFTmpltToplevel .xf${xfClass}Config4 400x440 \
    "Menubutton parameters:[XFMiscPathTail $xfW]" $xfLeader

  XFElementInit $xfW .xf${xfClass}Config4 $xfType $xfClass \
    XFMenubuttonSetMenubutton4 parameters $xfName 4
  XFElementColor $xfW .xf${xfClass}Config4 $xfType $xfClass bg \
    background Background "Background" XFMenubuttonSetMenubutton4
  XFElementBitmap $xfW .xf${xfClass}Config4 $xfType $xfClass \
    XFMenubuttonSetMenubutton4
  XFElementFont $xfW .xf${xfClass}Config4 $xfType $xfClass \
    XFMenubuttonSetMenubutton4
  XFElementColor $xfW .xf${xfClass}Config4 $xfType $xfClass fg \
    foreground Foreground "Foreground" XFMenubuttonSetMenubutton4
  XFElementText $xfW .xf${xfClass}Config4 $xfType $xfClass text text Text \
    "Label" XFMenubuttonSetMenubutton4 $xfName
  XFElementText $xfW .xf${xfClass}Config4 $xfType $xfClass menu menu Menu \
    "Name of menu" XFMenubuttonSetMenubutton4
  XFElementSize $xfW .xf${xfClass}Config4 $xfType $xfClass \
    XFMenubuttonSetMenubutton4
  XFElementTextVariable $xfW .xf${xfClass}Config4 $xfType $xfClass \
    XFMenubuttonSetMenubutton4
  XFElementScale $xfW .xf${xfClass}Config4 $xfType $xfClass underline \
    underline Underline "Underline" "Underline" 150 \
      XFMenubuttonSetMenubutton4
  .xf${xfClass}Config4.params1.params2.underline.underline configure \
    -from -1

  if {"$xfType" == "add"} {
    .xf${xfClass}Config4.params1.params2.menu.menu insert 0 \
      "$xfStatus(path)$xfName.m"
    .xf${xfClass}Config4.params1.params2.underline.underline set -1
  } {
    .xf${xfClass}Config4.params1.params2.underline.underline set \
      [lindex [$xfW config -underline] 4]

    button .xf${xfClass}Config4.additional.menu \
      -text {Menu} \
      -command "
        XFMenubuttonSetMenubutton4 $xfW 1 $xfClass
        XFProcConfParametersDefault \
          \[.xf${xfClass}Config4.params1.params2.menu.menu get\] \
            .xf${xfClass}Config4"
    pack before .xf${xfClass}Config4.additional.params \
                .xf${xfClass}Config4.additional.menu {left fill expand}
  }

  # save current parameter
  XFElementSave $xfW $xfClass {background bitmap font foreground height menu text textvariable underline width}

  # packing
  pack append .xf${xfClass}Config4.params1 \
              .xf${xfClass}Config4.params1.params2 {left fill expand}
  pack append .xf${xfClass}Config4 \
              .xf${xfClass}Config4.pathname {top fill frame center} \
              .xf${xfClass}Config4.leave {bottom fill} \
              .xf${xfClass}Config4.additional {bottom fill} \
              .xf${xfClass}Config4.params1 {top fill expand}

  XFBindFormConnect .xf${xfClass}Config4.params1.params2 \
    "XFMenubuttonSetMenubutton4 $xfW 0 $xfClass"

  XFEditSetStatus "Calling parameter setting for Menubutton...done"
}

##########
# Procedure: XFSaveSpecial.Menubutton
# Description: save menubutton
# Arguments: xfW - the widget
# Returns: none
# Sideeffects: none
##########
proc XFSaveSpecial.Menubutton {xfW} {
  global xfMisc

  # create keyboard traversal code
  if {[lindex [$xfW config -underline] 4] != -1} {
    if {[llength $xfMisc(menuBarTraversalList)] == 0} {
      set xfTmpParent [winfo parent $xfW]
      while {"$xfTmpParent" != "." &&
             "[winfo class $xfTmpParent]" != "Frame"} {
        set xfTmpParent [winfo parent $xfTmpParent]
      }
      if {"[winfo class $xfTmpParent]" == "Frame"} {
        set xfMisc(menuBarTraversalList) $xfTmpParent
        lappend xfMisc(menuBarTraversalList) $xfW
      }
    } {
      lappend xfMisc(menuBarTraversalList) $xfW
    }
  }
  return ""
}

##########
# Procedure: XFMenubuttonSetMenubutton4
# Description: set menubutton parameters
# Arguments: xfW - the widget
#            xfType - the type of setting (1 = set always, 0 = set
#                     only if permanent apply is on)
#            xfClass - the class we configure
#            xfParam1 - ignored parameter
# Returns: none
# Sideeffects: none
##########
proc XFMenubuttonSetMenubutton4 {xfW xfType xfClass {xfParam1 ""}} {
  global tkVersion
  global xfConf
  global xfMisc

  if {$xfType == 0 && !$xfConf(applyParameters)} {
    return
  }
  if {"[info commands $xfW]" == ""} {
    return
  }
  XFMiscSetSymbolicName $xfW \
    [.xf${xfClass}Config4.params1.params2.symname.symname get]

  XFMiscSetResource $xfW background \
    [.xf${xfClass}Config4.params1.params2.bg.bg get]
  XFMiscSetResource $xfW bitmap \
    [.xf${xfClass}Config4.params1.params2.bitmap.bitmap get]
  XFMiscSetResource $xfW font \
    [.xf${xfClass}Config4.params1.params2.font.font get]
  XFMiscSetResource $xfW foreground \
    [.xf${xfClass}Config4.params1.params2.fg.fg get]
  XFMiscSetResource $xfW height \
    [.xf${xfClass}Config4.params1.params2.size.size2.size2 get]
  XFMiscSetResource $xfW menu \
    [.xf${xfClass}Config4.params1.params2.menu.menu get]
  XFMiscSetResource $xfW text \
    [.xf${xfClass}Config4.params1.params2.text.text get]
  XFMiscSetResource $xfW textvariable \
    [.xf${xfClass}Config4.params1.params2.textvar.textvar get]
  XFMiscSetResource $xfW underline \
    [.xf${xfClass}Config4.params1.params2.underline.underline get]
  XFMiscSetResource $xfW width \
    [.xf${xfClass}Config4.params1.params2.size.size1.size1 get]

  set xfTmpMenuBarTraversalList ""
  if {[lindex [$xfW config -underline] 4] != -1} {
    set xfTmpParent [winfo parent $xfW]
    while {"$xfTmpParent" != "." &&
           "[winfo class $xfTmpParent]" != "Frame"} {
      set xfTmpParent [winfo parent $xfTmpParent]
    }
    if {"[winfo class $xfTmpParent]" == "Frame"} {
      set xfTmpMenuBarTraversalList $xfTmpParent
    }
    foreach xfElement [winfo children $xfTmpParent] {
      if {"[winfo class $xfElement]" == "Menubutton"} {
        if {[lindex [$xfElement config -underline] 4] != -1} {
          lappend xfTmpMenuBarTraversalList $xfElement
        }
      }
    }
    if {$tkVersion >= 3.0} {
      eval tk_menuBar $xfTmpMenuBarTraversalList
    } {
      eval tk_menu $xfTmpMenuBarTraversalList
    }
  }
}

# eof

