###########################################################################
###########################################################################
# entry.tcl - commandes d'edition, d'annulation et de sauvegarde d'etat pour
# les entries
###########################################################################
###########################################################################

package provide xentry 2.0

######################################################################
# te:entry:cmd:cut - delete the selection and copy it to CUTBUFFER
######################################################################

proc te:entry:cmd:cut {e} {
  global CUTBUFFER OLD_SELECTION
  
  catch {set CUTBUFFER [selection get]; set OLD_SELECTION [selection get]}
  if {"x[selection own]" == "x$e"} then {te:entry:cmd:save_checkpoint $e}
  if {"x[selection own]" != "x"} then {
     [selection own] delete sel.first sel.last
  }
  xentry_UpdateCursorSize $e
}

######################################################################
# te:entry:cmd:copy - copy the selection into CUTBUFFER
######################################################################

proc te:entry:cmd:copy {} {
  global CUTBUFFER OLD_SELECTION
  catch {set CUTBUFFER [selection get]}
  catch {set OLD_SELECTION [selection get]}
}

######################################################################
# te:entry:cmd:paste - insert CUTBUFFER
######################################################################

proc te:entry:cmd:paste {e} {
  global CUTBUFFER
  te:entry:cmd:save_checkpoint $e
  # te:clear_selection $e
  te:eb:delete_selection $e
  $e insert insert $CUTBUFFER
  xentry_UpdateCursorSize $e
}

######################################################################
# te:entry:cmd:xpaste - insert X selection
######################################################################

proc te:entry:cmd:xpaste {e} {
  te:entry:cmd:save_checkpoint $e
  set selection [te:selection_if_any]
  global OLD_SELECTION
  if {"x$selection" == "x"} {
     $e insert insert $OLD_SELECTION
  } else {
     $e insert insert $selection
     set OLD_SELECTION $selection
  }
   xentry_UpdateCursorSize $e
}

######################################################################
# te:entry:cmd:save_checkpoint - save current state in undo ring
######################################################################

proc te:entry:cmd:save_checkpoint {e} {
  global CKPT_ENTRY CKPT_STATE_ENTRY EDITPREFS ENTRY_UNDOPTR
  
  if ![info exists ENTRY_UNDOPTR($e)] {set ENTRY_UNDOPTR($e) 0}
  if $EDITPREFS(undoable) {
    set CKPT_ENTRY($e,$ENTRY_UNDOPTR($e)) [$e get]
    set CKPT_STATE_ENTRY($e,$ENTRY_UNDOPTR($e)) [te:entry:get_state $e]
    incr ENTRY_UNDOPTR($e)
    set old [expr {$ENTRY_UNDOPTR($e) - 50}]
    catch {
      unset CKPT_ENTRY($e,$old)			;# forget a previous checkpoint
      unset CKPT_STATE_ENTRY($e,$old)
    }
  }
}

##############################################################################
# te:entry:cmd:undo - restore from saved state (moving backwards in undo ring)
##############################################################################

proc te:entry:cmd:undo {e} {
  global CKPT_ENTRY CKPT_STATE_ENTRY EDITPREFS ENTRY_UNDOPTR
  if ![info exists ENTRY_UNDOPTR($e)] {set ENTRY_UNDOPTR($e) 0}
  if $EDITPREFS(undoable) {
    set CKPT_ENTRY($e,$ENTRY_UNDOPTR($e)) [$e get]
    set CKPT_STATE_ENTRY($e,$ENTRY_UNDOPTR($e)) [te:entry:get_state $e]
    incr ENTRY_UNDOPTR($e) -1
    if {![info exists CKPT_ENTRY($e,$ENTRY_UNDOPTR($e))]} {
      incr ENTRY_UNDOPTR($e)
      te:alert -text "No more undo information available for entry."
    } else {
      $e delete 0 end
      $e insert end $CKPT_ENTRY($e,$ENTRY_UNDOPTR($e))
      te:entry:set_state $e $CKPT_STATE_ENTRY($e,$ENTRY_UNDOPTR($e))
      $e view 0
    }
  }
}

#############################################################################
# te:entry:cmd:redo - restore from saved state (moving forwards in undo ring)
#############################################################################

proc te:entry:cmd:redo {e} {
  global CKPT_ENTRY CKPT_STATE_ENTRY EDITPREFS ENTRY_UNDOPTR

  if ![info exists ENTRY_UNDOPTR($e)] {set ENTRY_UNDOPTR($e) 0}
  if $EDITPREFS(undoable) {
    set CKPT_ENTRY($e,$ENTRY_UNDOPTR($e)) [$e get]
    set CKPT_STATE_ENTRY($e,$ENTRY_UNDOPTR($e)) [te:entry:get_state $e]
    incr ENTRY_UNDOPTR($e)
    if {![info exists CKPT_ENTRY($e,$ENTRY_UNDOPTR($e))]} {
      incr ENTRY_UNDOPTR($e) -1
      te:alert -text "No more redo information available for entry."
    } else {
      $e delete 0 end
      $e insert end $CKPT_ENTRY($e,$ENTRY_UNDOPTR($e))
      te:entry:set_state $e $CKPT_STATE_ENTRY($e,$ENTRY_UNDOPTR($e))
      $e view 0
    }
  } 
}



########################################################################
# te:entry:cmd:backspace - do whatever backspace does for entries
#
# 
# Rajout de   catch "$e delete sel.first sel.last"
proc te:entry:cmd:backspace {e} {
  te:entry:cmd:save_checkpoint $e
  catch "$e delete sel.first sel.last"
  if {"x[selection own]" == "x$e"} {
    # te:clear_selection $e
    te:eb:delete_selection $e
  } else {
    te:eb:delete_left $e
  }
}

######################################################################
# jedit:get_state ?t? - return non-text content of a text widget

proc te:entry:get_state {e} {
  set sel1 {}
  set sel2 {}
  set ins [$e index insert]
  catch {set sel1 [$e index sel.first]; set sel2 [$e index sel.last]}
  return [list $sel1 $sel2 $ins]
}

######################################################################
# te:entry:set_state t state - set non-text content of a file
### DOCUMENT "state"

proc te:entry:set_state { {e} {state} } {
  set sel1 [lindex $state 0]
  set sel2 [lindex $state 1]
  set ins  [lindex $state 2]
  if {"x$sel1" != "x"} then {
    $e select from $sel1
    $e select to $sel2
  }  
  $e icursor $ins
  $e view insert
  xentry_UpdateCursorSize $e
}


###########################################################################
# te:entry_select_all - sélectionne entièrement l'entry $e

proc te:entry:select_all {e} {

 $e select from 0
 $e select to end
 
}


