# Module: EMFunctions
# Tcl version: 7.3 (Tcl/Tk/XF)
# Tk version: 3.6
# XF version: $__lastrelease$
#

# module contents
global moduleList
global autoLoadList
set moduleList(EMFunctions) { EMBackwardCharacter EMBackwardWord EMBeginFile EMBeginLine EMCopyRegion EMDeleteNextChar EMDeleteNextWord EMDeletePrevChar EMDeletePrevWord EMEndFile EMEndLine EMForwardCharacter EMForwardWord EMGotoMark EMHandleTab EMKill EMKillRegion EMNewLine EMNewLineAndIndent EMNextLine EMNextPage EMNop EMOpenLine EMPrevLine EMPrevPage EMPutSelection EMRefresh EMRemoveMark EMScrollLine EMScrollLineBack EMSelfInsert EMSetMark EMSwap EMTextBind EMTransposeCharacters EMYank}
set autoLoadList(EMFunctions) {0}

# procedures to show toplevel windows


# User defined procedures


# Procedure: EMBackwardCharacter
proc EMBackwardCharacter { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  $W mark set insert insert-1c
  $W yview -pickplace insert
}


# Procedure: EMBackwardWord
proc EMBackwardWord { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  set cur [$W index insert]
  $W mark set insert "insert wordstart"
  if {[$W index insert] == $cur} {
    $W mark set insert insert-1c
    $W mark set insert "insert wordstart"
  }
  $W yview -pickplace insert
}


# Procedure: EMBeginFile
proc EMBeginFile { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  $W mark set insert 1.0
  $W yview -pickplace insert
}


# Procedure: EMBeginLine
proc EMBeginLine { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  $W mark set insert "insert linestart"
  $W yview -pickplace insert
}


# Procedure: EMCopyRegion
proc EMCopyRegion { W} {
  global EMMark
  if {$EMMark != {}} {
    if {[$W compare insert < $EMMark]} {
      set newcut [$W get insert $EMMark]
    } else {
      set newcut [$W get $EMMark insert]
    }
    global {EMCutBufferFlag}
    global {EMCutBuffer}
    if {$EMCutBufferFlag == 0} {
      set EMCutBuffer "$newcut"
      set EMCutBufferFlag 1
    } else {
      set EMCutBuffer "$EMCutBuffer$newcut"
    }
  }
}


# Procedure: EMDeleteNextChar
proc EMDeleteNextChar { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  $W delete insert insert+1c
  $W yview -pickplace insert
}


# Procedure: EMDeleteNextWord
proc EMDeleteNextWord { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  $W delete insert "insert wordend"
  $W yview -pickplace insert
}


# Procedure: EMDeletePrevChar
proc EMDeletePrevChar { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  tk_textBackspace $W
  $W yview -pickplace insert
}


# Procedure: EMDeletePrevWord
proc EMDeletePrevWord { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  $W delete insert "insert wordstart"
  $W yview -pickplace insert
}


# Procedure: EMEndFile
proc EMEndFile { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  $W mark set insert end
  $W yview -pickplace insert
}


# Procedure: EMEndLine
proc EMEndLine { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  $W mark set insert "insert lineend"
  $W yview -pickplace insert
}


# Procedure: EMForwardCharacter
proc EMForwardCharacter { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  $W mark set insert insert+1c
  $W yview -pickplace insert
}


# Procedure: EMForwardWord
proc EMForwardWord { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  set cur [$W index insert]
  $W mark set insert "insert wordend"
  if {[$W index insert] == $cur} {
    $W mark set insert insert+1c
    $W mark set insert "insert wordend"
  }
  $W yview -pickplace insert
}


# Procedure: EMGotoMark
proc EMGotoMark { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  global EMMark
  if {$EMMark != {}} {
    $W mark set insert $EMMark
    $W yview -pickplace insert
  }
}


# Procedure: EMHandleTab
proc EMHandleTab { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  $W insert insert \t
  $W yview -pickplace insert
}


# Procedure: EMKill
proc EMKill { W} {
  if {[$W compare insert == "insert lineend"]} {
    set newcut [$W get insert "insert lineend +1c"]
    $W delete insert "insert lineend +1c"
  } else {
    set newcut [$W get insert "insert lineend"]
    $W delete insert "insert lineend"
  }
  global {EMCutBufferFlag}
  global {EMCutBuffer}
  if {$EMCutBufferFlag == 0} {
    set EMCutBuffer "$newcut"
    set EMCutBufferFlag 1
  } else {
    set EMCutBuffer "$EMCutBuffer$newcut"
  }
  $W yview -pickplace insert
}


# Procedure: EMKillRegion
proc EMKillRegion { W} {
  global EMMark
  if {$EMMark != {}} {
    if {[$W compare insert < $EMMark]} {
      set newcut [$W get insert $EMMark]
      $W delete insert $EMMark
    } else {
      set newcut [$W get $EMMark insert]
      $W delete $EMMark insert
    }
    global {EMCutBufferFlag}
    global {EMCutBuffer}
    if {$EMCutBufferFlag == 0} {
      set EMCutBuffer "$newcut"
      set EMCutBufferFlag 1
    } else {
      set EMCutBuffer "$EMCutBuffer$newcut"
    }
  }
  $W yview -pickplace insert
}


# Procedure: EMNewLine
proc EMNewLine { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  $W inser insert \n
  $W yview -pickplace insert
}


# Procedure: EMNewLineAndIndent
proc EMNewLineAndIndent { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  set index [$W index "insert linestart"]
  for {set i 0} {[$W get "$index+$i c"] == " " ||  [$W get "$index+$i c"] == "\t"} {incr i} {}
  set prefix [$W get $index "$index+$i c"]
  $W insert insert "\n$prefix"  
  $W yview -pickplace insert
}


# Procedure: EMNextLine
proc EMNextLine { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  $W mark set insert insert+1l
  $W yview -pickplace insert
}


# Procedure: EMNextPage
proc EMNextPage { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  set counter [lindex [$W config -height] 4]
  while {$counter > 0} {
    $W mark set insert insert+1l
    incr counter -1
  }
  $W yview -pickplace insert
}


# Procedure: EMNop
proc EMNop { W} {

}


# Procedure: EMOpenLine
proc EMOpenLine { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  $W inser insert \n
  $W mark set insert insert-1c
  $W yview -pickplace insert
}


# Procedure: EMPrevLine
proc EMPrevLine { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  $W mark set insert insert-1l
  $W yview -pickplace insert
}


# Procedure: EMPrevPage
proc EMPrevPage { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  set counter [lindex [$W config -height] 4]
  while {$counter > 0} {
    $W mark set insert insert-1l
    incr counter -1
  }
  $W yview -pickplace insert
}


# Procedure: EMPutSelection
proc EMPutSelection { W} {
  $W insert insert "[GetSelection]"
  $W yview -pickplace insert
}


# Procedure: EMRefresh
proc EMRefresh { W} {
  $W yview -pickplace insert
}


# Procedure: EMRemoveMark
proc EMRemoveMark { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  global EMMark
  set EMMark {}
}


# Procedure: EMScrollLine
proc EMScrollLine { W} {
  $W yview @0,0+1l
}


# Procedure: EMScrollLineBack
proc EMScrollLineBack { W} {
  $W yview @0,0-1l
}


# Procedure: EMSelfInsert
proc EMSelfInsert { W K} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  if {$K != ""} {
    $W inser insert $K
    $W yview -pickplace insert
  }
}


# Procedure: EMSetMark
proc EMSetMark { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  global EMMark
  set EMMark [$W index insert]
}


# Procedure: EMSwap
proc EMSwap { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  global EMMark
  if {$EMMark != {}} {
    set temp [$W index insert]
    $W mark set insert $EMMark
    set $EMMark $temp
    $W yview -pickplace insert
  }
}


# Procedure: EMTextBind
proc EMTextBind { W args} {
  bind $W <Any-Key>   {EMSelfInsert %W %A}
  bind $W <Left>      {EMBackwardCharacter %W}
  bind $W <Right>     {EMForwardCharacter %W}
  bind $W <Up>        {EMPrevLine %W}
  bind $W <Down>      {EMNextLine %W}
  bind $W <Delete>    {EMDeletePrevChar %W}
  bind $W <Control-a> {EMBeginLine %W}
  bind $W <Control-b> {EMBackwardCharacter %W}
  bind $W <Control-c> {EMNop %W}
  bind $W <Control-d> {EMDeleteNextChar %W}
  bind $W <Control-e> {EMEndLine %W}
  bind $W <Control-f> {EMForwardCharacter %W}
  bind $W <Control-g> {EMNop %W}
  bind $W <Control-h> {EMDeletePrevChar %W}
  bind $W <Control-i> {EMHandleTab %W}
  bind $W <Control-j> {EMNewLineAndIndent %W}
  bind $W <Control-k> {EMKill %W}
  bind $W <Control-l> {EMRefresh %W}
  bind $W <Control-m> {EMNewLine %W}
  bind $W <Return>    {EMNewLine %W}
  bind $W <Control-n> {EMNextLine %W}
  bind $W <Control-o> {EMOpenLine %W}
  bind $W <Control-p> {EMPrevLine %W}
  bind $W <Control-q> {EMNop %W}
  bind $W <Control-r> {EMNop %W}
  bind $W <Control-s> {EMNop %W}
  bind $W <Control-t> {EMTransposeCharacters %W}
  bind $W <Control-u> {EMNop %W}
  bind $W <Control-v> {EMNextPage %W}
  bind $W <Control-w> {EMKillRegion %W}
  bind $W <Control-x> {EMRemoveMark %W}
  bind $W <Control-y> {EMYank %W}
  bind $W <Control-z> {EMScrollLine %W}

  bind $W <Meta-a>    {EMNop %W}
  bind $W <Meta-b>    {EMBackwardWord %W}
  bind $W <Meta-c>    {EMNop %W}
  bind $W <Meta-d>    {EMDeleteNextWord %W}
  bind $W <Meta-e>    {EMNop %W}
  bind $W <Meta-f>    {EMForwardWord %W}
  bind $W <Meta-g>    {EMNop %W}
  bind $W <Meta-h>    {EMDeletePrevWord %W}
  bind $W <Meta-i>    {EMNop %W}
  bind $W <Meta-j>    {EMNop %W}
  bind $W <Meta-k>    {EMNop %W}
  bind $W <Meta-l>    {EMNop %W}
  bind $W <Meta-m>    {EMNop %W}
  bind $W <Meta-n>    {EMNop %W}
  bind $W <Meta-o>    {EMNop %W}
  bind $W <Meta-p>    {EMNop %W}
  bind $W <Meta-q>    {EMNop %W}
  bind $W <Meta-r>    {EMNop %W}
  bind $W <Meta-s>    {EMNop %W}
  bind $W <Meta-t>    {EMNop %W}
  bind $W <Meta-u>    {EMNop %W}
  bind $W <Meta-v>    {EMPrevPage %W}
  bind $W <Meta-w>    {EMCopyRegion %W}
  bind $W <Meta-x>    {EMNop %W}
  bind $W <Meta-y>    {EMNop %W}
  bind $W <Meta-z>    {EMScrollLineBack %W}

  bind $W <Meta-space> {EMSetMark %W}
  bind $W <Meta-Control-g> {EMGotoMark %W}
  bind $W <Meta-Escape> {EMSwap %W}

  bind $W <ButtonRelease-2> {EMPutSelection %W}

  foreach ibind $args {
    if {[catch [list bind $W [lindex $ibind 0] [lindex $ibind 1]] result] != 0} {
	tkerror "$result"
    }
  }
}


# Procedure: EMTransposeCharacters
proc EMTransposeCharacters { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  set temp [$W get insert insert+1c]
  $W delete insert insert+1c
  $W insert insert-1c $temp
  $W yview -pickplace insert
}


# Procedure: EMYank
proc EMYank { W} {
  global {EMCutBufferFlag}
  set {EMCutBufferFlag} {0}
  global {EMCutBuffer}
  $W inser insert "$EMCutBuffer"
  $W yview -pickplace insert
}


# Internal procedures

# eof
#

