# Text widget goto by line number module.
# Rick Smereka, Copyright (C) 2004-2005.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, get a copy via the Internet at
# http://gnu.org/copyleft/gpl.html or write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
# MA 02111-1307 USA

# You can contact the author via email at rsmereka@future-lab.com

# Initial tcl version. Feb/2004, Rick Smereka
global line

proc gotodialog {tw} {
    # Goto line modal dialog box. Returns nothing.
   global line
   set dlg .gotodialog
   toplevel $dlg
   wm group $dlg $tw
   wm title $dlg "Goto"
   wm resizable $dlg 0 0
   wm transient $dlg $tw
   grab $dlg

   set frm $dlg.where
   frame $frm
   label $frm.label -text "Line number:" -anchor w
   set line [lineno $tw [$tw index insert]]
   entry $frm.gotowhat -textvariable line -width 5
   pack $frm.label $frm.gotowhat -side left

   set frm $dlg.but
   frame $frm
   button $frm.go -text "Go" -command "gotogo $tw" -default active
   button $frm.cancel -text "Cancel" -command "gotocancel $tw"
   pack $frm.go -fill x -side left -expand 1
   pack $frm.cancel -fill x -side left -expand 1
   pack $dlg.where $dlg.but -padx 10 -pady 12 -anchor w
   bind $dlg <Key-Return> "$dlg.but.go invoke"
   bind $dlg <Key-Escape> "$dlg.but.cancel invoke"
   focus $dlg.where.gotowhat
}

proc gotogo {tw} {
   # Perform goto. Returns nothing.
   global line
   
   if {[gotoline $tw $line]} {
      .gotodialog.but.cancel invoke
   } else {
      set line [lineno $tw [$tw index insert]]
      focus .gotodialog.where.gotowhat
   }
}

proc gotocancel {tw} {
   # Cancel goto line dialog. Returns nothing.
   focus $tw
   after idle {destroy .gotodialog}
}

