Fossil

Hex Artifact Content
Login

Artifact 5d3d6d51dc6e05b06e5449299c0e2fbbfc754885fd08070fea232457c764d871:


0000: 23 20 54 68 65 20 22 64 69 66 66 20 2d 2d 74 6b  # The "diff --tk
0010: 22 20 63 6f 6d 6d 61 6e 64 20 6f 75 74 70 75 74  " command output
0020: 73 20 70 72 65 70 65 6e 64 73 20 61 20 22 73 65  s prepends a "se
0030: 74 20 66 6f 73 73 69 6c 63 6d 64 20 7b 2e 2e 2e  t fossilcmd {...
0040: 7d 22 20 6c 69 6e 65 0a 23 20 74 6f 20 74 68 69  }" line.# to thi
0050: 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 75 6e  s file, then run
0060: 73 20 74 68 69 73 20 66 69 6c 65 20 75 73 69 6e  s this file usin
0070: 67 20 22 74 63 6c 73 68 22 20 69 6e 20 6f 72 64  g "tclsh" in ord
0080: 65 72 20 74 6f 20 64 69 73 70 6c 61 79 20 74 68  er to display th
0090: 65 0a 23 20 67 72 61 70 68 69 63 61 6c 20 64 69  e.# graphical di
00a0: 66 66 20 69 6e 20 61 20 73 65 70 61 72 61 74 65  ff in a separate
00b0: 20 77 69 6e 64 6f 77 2e 20 20 41 20 74 79 70 69   window.  A typi
00c0: 63 61 6c 20 22 73 65 74 20 66 6f 73 73 69 6c 63  cal "set fossilc
00d0: 6d 64 22 20 6c 69 6e 65 0a 23 20 6c 6f 6f 6b 73  md" line.# looks
00e0: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 23 0a 23 20   like this:.#.# 
00f0: 20 20 20 20 73 65 74 20 66 6f 73 73 69 6c 63 6d      set fossilcm
0100: 64 20 7b 7c 20 22 2e 2f 66 6f 73 73 69 6c 22 20  d {| "./fossil" 
0110: 64 69 66 66 20 2d 2d 74 63 6c 20 2d 69 20 2d 76  diff --tcl -i -v
0120: 7d 0a 23 0a 23 20 54 68 69 73 20 68 65 61 64 65  }.#.# This heade
0130: 72 20 63 6f 6d 6d 65 6e 74 20 69 73 20 73 74 72  r comment is str
0140: 69 70 70 65 64 20 6f 66 66 20 62 79 20 74 68 65  ipped off by the
0150: 20 22 6d 6b 62 75 69 6c 74 69 6e 2e 63 22 20 70   "mkbuiltin.c" p
0160: 72 6f 67 72 61 6d 2e 0a 23 0a 73 65 74 20 70 72  rogram..#.set pr
0170: 6f 67 20 7b 0a 70 61 63 6b 61 67 65 20 72 65 71  og {.package req
0180: 75 69 72 65 20 54 6b 0a 0a 61 72 72 61 79 20 73  uire Tk..array s
0190: 65 74 20 43 46 47 5f 6c 69 67 68 74 20 7b 0a 20  et CFG_light {. 
01a0: 20 54 49 54 4c 45 20 20 20 20 20 20 7b 46 6f 73   TITLE      {Fos
01b0: 73 69 6c 20 44 69 66 66 7d 0a 20 20 4c 4e 5f 43  sil Diff}.  LN_C
01c0: 4f 4c 5f 42 47 20 20 23 64 64 64 64 64 64 0a 20  OL_BG  #dddddd. 
01d0: 20 4c 4e 5f 43 4f 4c 5f 46 47 20 20 23 34 34 34   LN_COL_FG  #444
01e0: 34 34 34 0a 20 20 54 58 54 5f 43 4f 4c 5f 42 47  444.  TXT_COL_BG
01f0: 20 23 66 66 66 66 66 66 0a 20 20 54 58 54 5f 43   #ffffff.  TXT_C
0200: 4f 4c 5f 46 47 20 23 30 30 30 30 30 30 0a 20 20  OL_FG #000000.  
0210: 4d 4b 52 5f 43 4f 4c 5f 42 47 20 23 34 34 34 34  MKR_COL_BG #4444
0220: 34 34 0a 20 20 4d 4b 52 5f 43 4f 4c 5f 46 47 20  44.  MKR_COL_FG 
0230: 23 64 64 64 64 64 64 0a 20 20 43 48 4e 47 5f 42  #dddddd.  CHNG_B
0240: 47 20 20 20 20 23 64 30 64 30 66 66 0a 20 20 41  G    #d0d0ff.  A
0250: 44 44 5f 42 47 20 20 20 20 20 23 63 30 66 66 63  DD_BG     #c0ffc
0260: 30 0a 20 20 52 4d 5f 42 47 20 20 20 20 20 20 23  0.  RM_BG      #
0270: 66 66 63 30 63 30 0a 20 20 48 52 5f 46 47 20 20  ffc0c0.  HR_FG  
0280: 20 20 20 20 23 34 34 34 34 34 34 0a 20 20 48 52      #444444.  HR
0290: 5f 50 41 44 5f 54 4f 50 20 34 0a 20 20 48 52 5f  _PAD_TOP 4.  HR_
02a0: 50 41 44 5f 42 54 4d 20 38 0a 20 20 46 4e 5f 42  PAD_BTM 8.  FN_B
02b0: 47 20 20 20 20 20 20 23 34 34 34 34 34 34 0a 20  G      #444444. 
02c0: 20 46 4e 5f 46 47 20 20 20 20 20 20 23 66 66 66   FN_FG      #fff
02d0: 66 66 66 0a 20 20 46 4e 5f 50 41 44 20 20 20 20  fff.  FN_PAD    
02e0: 20 35 0a 20 20 45 52 52 5f 46 47 20 20 20 20 20   5.  ERR_FG     
02f0: 23 65 65 30 30 30 30 0a 20 20 50 41 44 58 20 20  #ee0000.  PADX  
0300: 20 20 20 20 20 35 0a 20 20 57 49 44 54 48 20 20       5.  WIDTH  
0310: 20 20 20 20 38 30 0a 20 20 48 45 49 47 48 54 20      80.  HEIGHT 
0320: 20 20 20 20 34 35 0a 20 20 4c 42 5f 48 45 49 47      45.  LB_HEIG
0330: 48 54 20 20 32 35 0a 7d 0a 0a 61 72 72 61 79 20  HT  25.}..array 
0340: 73 65 74 20 43 46 47 5f 64 61 72 6b 20 7b 0a 20  set CFG_dark {. 
0350: 20 54 49 54 4c 45 20 20 20 20 20 20 7b 46 6f 73   TITLE      {Fos
0360: 73 69 6c 20 44 69 66 66 7d 0a 20 20 4c 4e 5f 43  sil Diff}.  LN_C
0370: 4f 4c 5f 42 47 20 20 23 64 64 64 64 64 64 0a 20  OL_BG  #dddddd. 
0380: 20 4c 4e 5f 43 4f 4c 5f 46 47 20 20 23 34 34 34   LN_COL_FG  #444
0390: 34 34 34 0a 20 20 54 58 54 5f 43 4f 4c 5f 42 47  444.  TXT_COL_BG
03a0: 20 23 33 66 33 66 33 66 0a 20 20 54 58 54 5f 43   #3f3f3f.  TXT_C
03b0: 4f 4c 5f 46 47 20 23 64 63 64 63 63 63 0a 20 20  OL_FG #dcdccc.  
03c0: 4d 4b 52 5f 43 4f 4c 5f 42 47 20 23 34 34 34 34  MKR_COL_BG #4444
03d0: 34 34 0a 20 20 4d 4b 52 5f 43 4f 4c 5f 46 47 20  44.  MKR_COL_FG 
03e0: 23 64 64 64 64 64 64 0a 20 20 43 48 4e 47 5f 42  #dddddd.  CHNG_B
03f0: 47 20 20 20 20 23 36 61 36 61 66 63 0a 20 20 41  G    #6a6afc.  A
0400: 44 44 5f 42 47 20 20 20 20 20 23 35 37 39 33 34  DD_BG     #57934
0410: 63 0a 20 20 52 4d 5f 42 47 20 20 20 20 20 20 23  c.  RM_BG      #
0420: 65 66 36 37 36 37 0a 20 20 48 52 5f 46 47 20 20  ef6767.  HR_FG  
0430: 20 20 20 20 23 34 34 34 34 34 34 0a 20 20 48 52      #444444.  HR
0440: 5f 50 41 44 5f 54 4f 50 20 34 0a 20 20 48 52 5f  _PAD_TOP 4.  HR_
0450: 50 41 44 5f 42 54 4d 20 38 0a 20 20 46 4e 5f 42  PAD_BTM 8.  FN_B
0460: 47 20 20 20 20 20 20 23 35 65 35 65 35 65 0a 20  G      #5e5e5e. 
0470: 20 46 4e 5f 46 47 20 20 20 20 20 20 23 66 66 66   FN_FG      #fff
0480: 66 66 66 0a 20 20 46 4e 5f 50 41 44 20 20 20 20  fff.  FN_PAD    
0490: 20 35 0a 20 20 45 52 52 5f 46 47 20 20 20 20 20   5.  ERR_FG     
04a0: 23 65 65 30 30 30 30 0a 20 20 50 41 44 58 20 20  #ee0000.  PADX  
04b0: 20 20 20 20 20 35 0a 20 20 57 49 44 54 48 20 20       5.  WIDTH  
04c0: 20 20 20 20 38 30 0a 20 20 48 45 49 47 48 54 20      80.  HEIGHT 
04d0: 20 20 20 20 34 35 0a 20 20 4c 42 5f 48 45 49 47      45.  LB_HEIG
04e0: 48 54 20 20 32 35 0a 7d 0a 0a 61 72 72 61 79 20  HT  25.}..array 
04f0: 73 65 74 20 43 46 47 5f 61 72 72 20 7b 0a 20 20  set CFG_arr {.  
0500: 30 20 20 20 20 20 20 20 20 20 20 43 46 47 5f 6c  0          CFG_l
0510: 69 67 68 74 0a 20 20 31 20 20 20 20 20 20 20 20  ight.  1        
0520: 20 20 43 46 47 5f 64 61 72 6b 0a 7d 0a 0a 61 72    CFG_dark.}..ar
0530: 72 61 79 20 73 65 74 20 43 46 47 20 5b 61 72 72  ray set CFG [arr
0540: 61 79 20 67 65 74 20 24 43 46 47 5f 61 72 72 28  ay get $CFG_arr(
0550: 24 64 61 72 6b 6d 6f 64 65 29 5d 0a 0a 69 66 20  $darkmode)]..if 
0560: 7b 21 5b 6e 61 6d 65 73 70 61 63 65 20 65 78 69  {![namespace exi
0570: 73 74 73 20 74 74 6b 5d 7d 20 7b 0a 20 20 69 6e  sts ttk]} {.  in
0580: 74 65 72 70 20 61 6c 69 61 73 20 7b 7d 20 3a 3a  terp alias {} ::
0590: 74 74 6b 3a 3a 73 63 72 6f 6c 6c 62 61 72 20 7b  ttk::scrollbar {
05a0: 7d 20 3a 3a 73 63 72 6f 6c 6c 62 61 72 0a 20 20  } ::scrollbar.  
05b0: 69 6e 74 65 72 70 20 61 6c 69 61 73 20 7b 7d 20  interp alias {} 
05c0: 3a 3a 74 74 6b 3a 3a 6d 65 6e 75 62 75 74 74 6f  ::ttk::menubutto
05d0: 6e 20 7b 7d 20 3a 3a 6d 65 6e 75 62 75 74 74 6f  n {} ::menubutto
05e0: 6e 0a 7d 0a 0a 70 72 6f 63 20 64 65 68 74 6d 6c  n.}..proc dehtml
05f0: 20 7b 78 7d 20 7b 0a 20 20 73 65 74 20 78 20 5b   {x} {.  set x [
0600: 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 3c 5b 5e  regsub -all {<[^
0610: 3e 5d 2a 3e 7d 20 24 78 20 7b 7d 5d 0a 20 20 72  >]*>} $x {}].  r
0620: 65 74 75 72 6e 20 5b 73 74 72 69 6e 67 20 6d 61  eturn [string ma
0630: 70 20 7b 26 61 6d 70 3b 20 26 20 26 6c 74 3b 20  p {&amp; & &lt; 
0640: 3c 20 26 67 74 3b 20 3e 20 26 23 33 39 3b 20 27  < &gt; > &#39; '
0650: 20 26 71 75 6f 74 3b 20 5c 22 7d 20 24 78 5d 0a   &quot; \"} $x].
0660: 7d 0a 0a 70 72 6f 63 20 63 6f 6c 73 20 7b 7d 20  }..proc cols {} 
0670: 7b 0a 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74  {.  return [list
0680: 20 2e 6c 6e 41 20 2e 74 78 74 41 20 2e 6d 6b 72   .lnA .txtA .mkr
0690: 20 2e 6c 6e 42 20 2e 74 78 74 42 5d 0a 7d 0a 0a   .lnB .txtB].}..
06a0: 70 72 6f 63 20 63 6f 6c 54 79 70 65 20 7b 63 7d  proc colType {c}
06b0: 20 7b 0a 20 20 72 65 67 65 78 70 20 7b 5b 61 2d   {.  regexp {[a-
06c0: 7a 5d 2b 7d 20 24 63 20 74 79 70 65 0a 20 20 72  z]+} $c type.  r
06d0: 65 74 75 72 6e 20 24 74 79 70 65 0a 7d 0a 0a 70  eturn $type.}..p
06e0: 72 6f 63 20 67 65 74 4c 69 6e 65 20 7b 64 69 66  roc getLine {dif
06f0: 66 74 78 74 20 4e 20 69 69 76 61 72 7d 20 7b 0a  ftxt N iivar} {.
0700: 20 20 75 70 76 61 72 20 24 69 69 76 61 72 20 69    upvar $iivar i
0710: 69 0a 20 20 69 66 20 7b 24 69 69 3e 3d 24 4e 7d  i.  if {$ii>=$N}
0720: 20 7b 72 65 74 75 72 6e 20 2d 31 7d 0a 20 20 73   {return -1}.  s
0730: 65 74 20 78 20 5b 6c 69 6e 64 65 78 20 24 64 69  et x [lindex $di
0740: 66 66 74 78 74 20 24 69 69 5d 0a 20 20 69 6e 63  fftxt $ii].  inc
0750: 72 20 69 69 0a 20 20 72 65 74 75 72 6e 20 24 78  r ii.  return $x
0760: 0a 7d 0a 0a 70 72 6f 63 20 72 65 61 64 44 69 66  .}..proc readDif
0770: 66 73 20 7b 66 6f 73 73 69 6c 63 6d 64 7d 20 7b  fs {fossilcmd} {
0780: 0a 20 20 67 6c 6f 62 61 6c 20 64 69 66 66 74 78  .  global difftx
0790: 74 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65  t.  if {![info e
07a0: 78 69 73 74 73 20 64 69 66 66 74 78 74 5d 7d 20  xists difftxt]} 
07b0: 7b 0a 20 20 20 20 73 65 74 20 69 6e 20 5b 6f 70  {.    set in [op
07c0: 65 6e 20 24 66 6f 73 73 69 6c 63 6d 64 20 72 5d  en $fossilcmd r]
07d0: 0a 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65 20  .    fconfigure 
07e0: 24 69 6e 20 2d 65 6e 63 6f 64 69 6e 67 20 75 74  $in -encoding ut
07f0: 66 2d 38 0a 20 20 20 20 73 65 74 20 64 69 66 66  f-8.    set diff
0800: 74 78 74 20 5b 73 70 6c 69 74 20 5b 72 65 61 64  txt [split [read
0810: 20 24 69 6e 5d 20 5c 6e 5d 0a 20 20 20 20 63 6c   $in] \n].    cl
0820: 6f 73 65 20 24 69 6e 0a 20 20 7d 0a 20 20 73 65  ose $in.  }.  se
0830: 74 20 4e 20 5b 6c 6c 65 6e 67 74 68 20 24 64 69  t N [llength $di
0840: 66 66 74 78 74 5d 0a 20 20 73 65 74 20 69 69 20  fftxt].  set ii 
0850: 30 0a 20 20 73 65 74 20 6e 44 69 66 66 73 20 30  0.  set nDiffs 0
0860: 0a 20 20 73 65 74 20 6e 31 20 30 0a 20 20 73 65  .  set n1 0.  se
0870: 74 20 6e 32 20 30 20 20 0a 20 20 61 72 72 61 79  t n2 0  .  array
0880: 20 73 65 74 20 77 69 64 74 68 73 20 7b 74 78 74   set widths {txt
0890: 20 33 20 6c 6e 20 33 20 6d 6b 72 20 31 7d 0a 20   3 ln 3 mkr 1}. 
08a0: 20 0a 20 20 0a 20 20 73 65 74 20 66 72 6f 6d 49   .  .  set fromI
08b0: 6e 64 65 78 20 5b 6c 73 65 61 72 63 68 20 2d 67  ndex [lsearch -g
08c0: 6c 6f 62 20 24 66 6f 73 73 69 6c 63 6d 64 20 2a  lob $fossilcmd *
08d0: 2d 66 72 6f 6d 5d 0a 20 20 73 65 74 20 74 6f 49  -from].  set toI
08e0: 6e 64 65 78 20 5b 6c 73 65 61 72 63 68 20 2d 67  ndex [lsearch -g
08f0: 6c 6f 62 20 24 66 6f 73 73 69 6c 63 6d 64 20 2a  lob $fossilcmd *
0900: 2d 74 6f 5d 0a 20 20 73 65 74 20 62 72 61 6e 63  -to].  set branc
0910: 68 49 6e 64 65 78 20 5b 6c 73 65 61 72 63 68 20  hIndex [lsearch 
0920: 2d 67 6c 6f 62 20 24 66 6f 73 73 69 6c 63 6d 64  -glob $fossilcmd
0930: 20 2a 2d 62 72 61 6e 63 68 5d 0a 20 20 73 65 74   *-branch].  set
0940: 20 63 68 65 63 6b 69 6e 49 6e 64 65 78 20 5b 6c   checkinIndex [l
0950: 73 65 61 72 63 68 20 2d 67 6c 6f 62 20 24 66 6f  search -glob $fo
0960: 73 73 69 6c 63 6d 64 20 2a 2d 63 68 65 63 6b 69  ssilcmd *-checki
0970: 6e 5d 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67  n].  if {[string
0980: 20 6d 61 74 63 68 20 2a 3f 2d 2d 65 78 74 65 72   match *?--exter
0990: 6e 61 6c 2d 62 61 73 65 6c 69 6e 65 2a 20 24 66  nal-baseline* $f
09a0: 6f 73 73 69 6c 63 6d 64 5d 7d 20 7b 0a 20 20 20  ossilcmd]} {.   
09b0: 20 73 65 74 20 66 41 20 7b 65 78 74 65 72 6e 61   set fA {externa
09c0: 6c 20 62 61 73 65 6c 69 6e 65 7d 0a 20 20 7d 20  l baseline}.  } 
09d0: 65 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 20 66  else {.    set f
09e0: 41 20 7b 62 61 73 65 20 63 68 65 63 6b 2d 69 6e  A {base check-in
09f0: 7d 0a 20 20 7d 0a 20 20 73 65 74 20 66 42 20 7b  }.  }.  set fB {
0a00: 63 75 72 72 65 6e 74 20 63 68 65 63 6b 2d 6f 75  current check-ou
0a10: 74 7d 0a 20 20 69 66 20 7b 24 66 72 6f 6d 49 6e  t}.  if {$fromIn
0a20: 64 65 78 20 3e 20 2d 31 7d 20 7b 73 65 74 20 66  dex > -1} {set f
0a30: 41 20 5b 6c 69 6e 64 65 78 20 24 66 6f 73 73 69  A [lindex $fossi
0a40: 6c 63 6d 64 20 24 66 72 6f 6d 49 6e 64 65 78 2b  lcmd $fromIndex+
0a50: 31 5d 7d 0a 20 20 69 66 20 7b 24 74 6f 49 6e 64  1]}.  if {$toInd
0a60: 65 78 20 3e 20 2d 31 7d 20 7b 73 65 74 20 66 42  ex > -1} {set fB
0a70: 20 5b 6c 69 6e 64 65 78 20 24 66 6f 73 73 69 6c   [lindex $fossil
0a80: 63 6d 64 20 24 74 6f 49 6e 64 65 78 2b 31 5d 7d  cmd $toIndex+1]}
0a90: 0a 20 20 69 66 20 7b 24 62 72 61 6e 63 68 49 6e  .  if {$branchIn
0aa0: 64 65 78 20 3e 20 2d 31 7d 20 7b 73 65 74 20 66  dex > -1} {set f
0ab0: 41 20 22 62 72 61 6e 63 68 20 70 6f 69 6e 74 22  A "branch point"
0ac0: 3b 20 73 65 74 20 66 42 20 22 6c 65 61 66 20 6f  ; set fB "leaf o
0ad0: 66 20 62 72 61 6e 63 68 20 27 5b 6c 69 6e 64 65  f branch '[linde
0ae0: 78 20 24 66 6f 73 73 69 6c 63 6d 64 20 24 62 72  x $fossilcmd $br
0af0: 61 6e 63 68 49 6e 64 65 78 2b 31 5d 27 22 7d 0a  anchIndex+1]'"}.
0b00: 20 20 69 66 20 7b 24 63 68 65 63 6b 69 6e 49 6e    if {$checkinIn
0b10: 64 65 78 20 3e 20 2d 31 7d 20 7b 73 65 74 20 66  dex > -1} {set f
0b20: 41 20 22 70 72 69 6d 61 72 79 20 70 61 72 65 6e  A "primary paren
0b30: 74 22 3b 20 73 65 74 20 66 42 20 5b 6c 69 6e 64  t"; set fB [lind
0b40: 65 78 20 24 66 6f 73 73 69 6c 63 6d 64 20 24 63  ex $fossilcmd $c
0b50: 68 65 63 6b 69 6e 49 6e 64 65 78 2b 31 5d 7d 0a  heckinIndex+1]}.
0b60: 20 20 0a 20 20 0a 20 20 77 68 69 6c 65 20 7b 5b    .  .  while {[
0b70: 73 65 74 20 6c 69 6e 65 20 5b 67 65 74 4c 69 6e  set line [getLin
0b80: 65 20 24 64 69 66 66 74 78 74 20 24 4e 20 69 69  e $difftxt $N ii
0b90: 5d 5d 20 21 3d 20 2d 31 7d 20 7b 0a 20 20 20 20  ]] != -1} {.    
0ba0: 73 77 69 74 63 68 20 2d 2d 20 5b 6c 69 6e 64 65  switch -- [linde
0bb0: 78 20 24 6c 69 6e 65 20 30 5d 20 7b 0a 20 20 20  x $line 0] {.   
0bc0: 20 20 20 46 49 4c 45 20 7b 0a 20 20 20 20 20 20     FILE {.      
0bd0: 20 20 69 6e 63 72 20 6e 44 69 66 66 73 0a 20 20    incr nDiffs.  
0be0: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 77 78        foreach wx
0bf0: 20 5b 6c 69 73 74 20 5b 73 74 72 69 6e 67 20 6c   [list [string l
0c00: 65 6e 67 74 68 20 24 6e 31 5d 20 5b 73 74 72 69  ength $n1] [stri
0c10: 6e 67 20 6c 65 6e 67 74 68 20 24 6e 32 5d 5d 20  ng length $n2]] 
0c20: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  {.          if {
0c30: 24 77 78 3e 24 77 69 64 74 68 73 28 6c 6e 29 7d  $wx>$widths(ln)}
0c40: 20 7b 73 65 74 20 77 69 64 74 68 73 28 6c 6e 29   {set widths(ln)
0c50: 20 24 77 78 7d 0a 20 20 20 20 20 20 20 20 7d 0a   $wx}.        }.
0c60: 20 20 20 20 20 20 20 20 2e 6c 6e 41 20 69 6e 73          .lnA ins
0c70: 65 72 74 20 65 6e 64 20 5c 6e 20 66 6e 20 5c 6e  ert end \n fn \n
0c80: 20 2d 0a 20 20 20 20 20 20 20 20 2e 74 78 74 41   -.        .txtA
0c90: 20 69 6e 73 65 72 74 20 65 6e 64 20 22 5b 6c 69   insert end "[li
0ca0: 6e 64 65 78 20 24 6c 69 6e 65 20 31 5d 20 28 24  ndex $line 1] ($
0cb0: 66 41 29 5c 6e 22 20 66 6e 20 5c 6e 20 2d 0a 20  fA)\n" fn \n -. 
0cc0: 20 20 20 20 20 20 20 2e 6d 6b 72 20 69 6e 73 65         .mkr inse
0cd0: 72 74 20 65 6e 64 20 5c 6e 20 66 6e 20 5c 6e 20  rt end \n fn \n 
0ce0: 2d 0a 20 20 20 20 20 20 20 20 2e 6c 6e 42 20 69  -.        .lnB i
0cf0: 6e 73 65 72 74 20 65 6e 64 20 5c 6e 20 66 6e 20  nsert end \n fn 
0d00: 5c 6e 20 2d 0a 20 20 20 20 20 20 20 20 2e 74 78  \n -.        .tx
0d10: 74 42 20 69 6e 73 65 72 74 20 65 6e 64 20 22 5b  tB insert end "[
0d20: 6c 69 6e 64 65 78 20 24 6c 69 6e 65 20 32 5d 20  lindex $line 2] 
0d30: 28 24 66 42 29 5c 6e 22 20 66 6e 20 5c 6e 20 2d  ($fB)\n" fn \n -
0d40: 0a 20 20 20 20 20 20 20 20 2e 77 66 69 6c 65 73  .        .wfiles
0d50: 2e 6c 62 20 69 6e 73 65 72 74 20 65 6e 64 20 5b  .lb insert end [
0d60: 6c 69 6e 64 65 78 20 24 6c 69 6e 65 20 32 5d 0a  lindex $line 2].
0d70: 20 20 20 20 20 20 20 20 73 65 74 20 6e 31 20 30          set n1 0
0d80: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 32 20  .        set n2 
0d90: 30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  0.      }.      
0da0: 53 4b 49 50 20 7b 0a 20 20 20 20 20 20 20 20 73  SKIP {.        s
0db0: 65 74 20 6e 20 5b 6c 69 6e 64 65 78 20 24 6c 69  et n [lindex $li
0dc0: 6e 65 20 31 5d 0a 20 20 20 20 20 20 20 20 69 6e  ne 1].        in
0dd0: 63 72 20 6e 31 20 24 6e 0a 20 20 20 20 20 20 20  cr n1 $n.       
0de0: 20 69 6e 63 72 20 6e 32 20 24 6e 0a 20 20 20 20   incr n2 $n.    
0df0: 20 20 20 20 2e 6c 6e 41 20 69 6e 73 65 72 74 20      .lnA insert 
0e00: 65 6e 64 20 2e 2e 2e 5c 6e 20 68 72 6c 6e 0a 20  end ...\n hrln. 
0e10: 20 20 20 20 20 20 20 2e 74 78 74 41 20 69 6e 73         .txtA ins
0e20: 65 72 74 20 65 6e 64 20 5b 73 74 72 69 6e 67 20  ert end [string 
0e30: 72 65 70 65 61 74 20 2e 20 33 30 5d 5c 6e 20 68  repeat . 30]\n h
0e40: 72 74 78 74 0a 20 20 20 20 20 20 20 20 2e 6d 6b  rtxt.        .mk
0e50: 72 20 69 6e 73 65 72 74 20 65 6e 64 20 5c 6e 20  r insert end \n 
0e60: 68 72 6c 6e 0a 20 20 20 20 20 20 20 20 2e 6c 6e  hrln.        .ln
0e70: 42 20 69 6e 73 65 72 74 20 65 6e 64 20 2e 2e 2e  B insert end ...
0e80: 5c 6e 20 68 72 6c 6e 0a 20 20 20 20 20 20 20 20  \n hrln.        
0e90: 2e 74 78 74 42 20 69 6e 73 65 72 74 20 65 6e 64  .txtB insert end
0ea0: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
0eb0: 2e 20 33 30 5d 5c 6e 20 68 72 74 78 74 0a 20 20  . 30]\n hrtxt.  
0ec0: 20 20 20 20 7d 0a 20 20 20 20 20 20 43 4f 4d 20      }.      COM 
0ed0: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 78 20  {.        set x 
0ee0: 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 20 31 5d  [lindex $line 1]
0ef0: 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20 6e 31  .        incr n1
0f00: 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20 6e 32  .        incr n2
0f10: 0a 20 20 20 20 20 20 20 20 2e 6c 6e 41 20 69 6e  .        .lnA in
0f20: 73 65 72 74 20 65 6e 64 20 24 6e 31 5c 6e 20 2d  sert end $n1\n -
0f30: 0a 20 20 20 20 20 20 20 20 2e 74 78 74 41 20 69  .        .txtA i
0f40: 6e 73 65 72 74 20 65 6e 64 20 24 78 5c 6e 20 2d  nsert end $x\n -
0f50: 0a 20 20 20 20 20 20 20 20 2e 6d 6b 72 20 69 6e  .        .mkr in
0f60: 73 65 72 74 20 65 6e 64 20 5c 6e 20 2d 0a 20 20  sert end \n -.  
0f70: 20 20 20 20 20 20 2e 6c 6e 42 20 69 6e 73 65 72        .lnB inser
0f80: 74 20 65 6e 64 20 24 6e 32 5c 6e 20 2d 0a 20 20  t end $n2\n -.  
0f90: 20 20 20 20 20 20 2e 74 78 74 42 20 69 6e 73 65        .txtB inse
0fa0: 72 74 20 65 6e 64 20 24 78 5c 6e 20 2d 0a 20 20  rt end $x\n -.  
0fb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4e 53 20      }.      INS 
0fc0: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 78 20  {.        set x 
0fd0: 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 20 31 5d  [lindex $line 1]
0fe0: 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20 6e 32  .        incr n2
0ff0: 0a 20 20 20 20 20 20 20 20 2e 6c 6e 41 20 69 6e  .        .lnA in
1000: 73 65 72 74 20 65 6e 64 20 5c 6e 20 2d 0a 20 20  sert end \n -.  
1010: 20 20 20 20 20 20 2e 74 78 74 41 20 69 6e 73 65        .txtA inse
1020: 72 74 20 65 6e 64 20 5c 6e 20 2d 0a 20 20 20 20  rt end \n -.    
1030: 20 20 20 20 2e 6d 6b 72 20 69 6e 73 65 72 74 20      .mkr insert 
1040: 65 6e 64 20 3e 5c 6e 20 2d 0a 20 20 20 20 20 20  end >\n -.      
1050: 20 20 2e 6c 6e 42 20 69 6e 73 65 72 74 20 65 6e    .lnB insert en
1060: 64 20 24 6e 32 5c 6e 20 2d 0a 20 20 20 20 20 20  d $n2\n -.      
1070: 20 20 2e 74 78 74 42 20 69 6e 73 65 72 74 20 65    .txtB insert e
1080: 6e 64 20 24 78 20 61 64 64 20 5c 6e 20 2d 0a 20  nd $x add \n -. 
1090: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 44 45 4c       }.      DEL
10a0: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 78   {.        set x
10b0: 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 20 31   [lindex $line 1
10c0: 5d 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20 6e  ].        incr n
10d0: 31 0a 20 20 20 20 20 20 20 20 2e 6c 6e 41 20 69  1.        .lnA i
10e0: 6e 73 65 72 74 20 65 6e 64 20 24 6e 31 5c 6e 20  nsert end $n1\n 
10f0: 2d 0a 20 20 20 20 20 20 20 20 2e 74 78 74 41 20  -.        .txtA 
1100: 69 6e 73 65 72 74 20 65 6e 64 20 24 78 20 72 6d  insert end $x rm
1110: 20 5c 6e 20 2d 0a 20 20 20 20 20 20 20 20 2e 6d   \n -.        .m
1120: 6b 72 20 69 6e 73 65 72 74 20 65 6e 64 20 3c 5c  kr insert end <\
1130: 6e 20 2d 0a 20 20 20 20 20 20 20 20 2e 6c 6e 42  n -.        .lnB
1140: 20 69 6e 73 65 72 74 20 65 6e 64 20 5c 6e 20 2d   insert end \n -
1150: 0a 20 20 20 20 20 20 20 20 2e 74 78 74 42 20 69  .        .txtB i
1160: 6e 73 65 72 74 20 65 6e 64 20 5c 6e 20 2d 0a 20  nsert end \n -. 
1170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 45 44 49       }.      EDI
1180: 54 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 63 72  T {.        incr
1190: 20 6e 31 0a 20 20 20 20 20 20 20 20 69 6e 63 72   n1.        incr
11a0: 20 6e 32 0a 20 20 20 20 20 20 20 20 2e 6c 6e 41   n2.        .lnA
11b0: 20 69 6e 73 65 72 74 20 65 6e 64 20 24 6e 31 5c   insert end $n1\
11c0: 6e 20 2d 0a 20 20 20 20 20 20 20 20 2e 6c 6e 42  n -.        .lnB
11d0: 20 69 6e 73 65 72 74 20 65 6e 64 20 24 6e 32 5c   insert end $n2\
11e0: 6e 20 2d 0a 20 20 20 20 20 20 20 20 2e 6d 6b 72  n -.        .mkr
11f0: 20 69 6e 73 65 72 74 20 65 6e 64 20 7c 5c 6e 20   insert end |\n 
1200: 2d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 6e  -.        set nn
1210: 20 5b 6c 6c 65 6e 67 74 68 20 24 6c 69 6e 65 5d   [llength $line]
1220: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65  .        for {se
1230: 74 20 69 20 31 7d 20 7b 24 69 3c 24 6e 6e 7d 20  t i 1} {$i<$nn} 
1240: 7b 69 6e 63 72 20 69 20 33 7d 20 7b 0a 20 20 20  {incr i 3} {.   
1250: 20 20 20 20 20 20 20 73 65 74 20 78 20 5b 6c 69         set x [li
1260: 6e 64 65 78 20 24 6c 69 6e 65 20 24 69 5d 0a 20  ndex $line $i]. 
1270: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 78 20           if {$x 
1280: 6e 65 20 22 22 7d 20 7b 0a 20 20 20 20 20 20 20  ne ""} {.       
1290: 20 20 20 20 20 2e 74 78 74 41 20 69 6e 73 65 72       .txtA inser
12a0: 74 20 65 6e 64 20 24 78 20 2d 0a 20 20 20 20 20  t end $x -.     
12b0: 20 20 20 20 20 20 20 2e 74 78 74 42 20 69 6e 73         .txtB ins
12c0: 65 72 74 20 65 6e 64 20 24 78 20 2d 0a 20 20 20  ert end $x -.   
12d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12e0: 20 20 20 69 66 20 7b 24 69 2b 32 3c 24 6e 6e 7d     if {$i+2<$nn}
12f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
1300: 65 74 20 78 31 20 5b 6c 69 6e 64 65 78 20 24 6c  et x1 [lindex $l
1310: 69 6e 65 20 5b 65 78 70 72 20 7b 24 69 2b 31 7d  ine [expr {$i+1}
1320: 5d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ]].            s
1330: 65 74 20 78 32 20 5b 6c 69 6e 64 65 78 20 24 6c  et x2 [lindex $l
1340: 69 6e 65 20 5b 65 78 70 72 20 7b 24 69 2b 32 7d  ine [expr {$i+2}
1350: 5d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ]].            i
1360: 66 20 7b 22 24 78 31 22 20 65 71 20 22 22 7d 20  f {"$x1" eq ""} 
1370: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1380: 2e 74 78 74 42 20 69 6e 73 65 72 74 20 65 6e 64  .txtB insert end
1390: 20 24 78 32 20 61 64 64 0a 20 20 20 20 20 20 20   $x2 add.       
13a0: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 22       } elseif {"
13b0: 24 78 32 22 20 65 71 20 22 22 7d 20 7b 0a 20 20  $x2" eq ""} {.  
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 2e 74 78 74              .txt
13d0: 41 20 69 6e 73 65 72 74 20 65 6e 64 20 24 78 31  A insert end $x1
13e0: 20 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20   rm.            
13f0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
1400: 20 20 20 20 20 20 20 2e 74 78 74 41 20 69 6e 73         .txtA ins
1410: 65 72 74 20 65 6e 64 20 24 78 31 20 63 68 6e 67  ert end $x1 chng
1420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2e  .              .
1430: 74 78 74 42 20 69 6e 73 65 72 74 20 65 6e 64 20  txtB insert end 
1440: 24 78 32 20 63 68 6e 67 0a 20 20 20 20 20 20 20  $x2 chng.       
1450: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1460: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1470: 20 20 20 20 20 2e 74 78 74 41 20 69 6e 73 65 72       .txtA inser
1480: 74 20 65 6e 64 20 5c 6e 20 2d 0a 20 20 20 20 20  t end \n -.     
1490: 20 20 20 2e 74 78 74 42 20 69 6e 73 65 72 74 20     .txtB insert 
14a0: 65 6e 64 20 5c 6e 20 2d 0a 20 20 20 20 20 20 7d  end \n -.      }
14b0: 0a 20 20 20 20 20 20 22 22 20 7b 0a 20 20 20 20  .      "" {.    
14c0: 20 20 20 20 66 6f 72 65 61 63 68 20 77 78 20 5b      foreach wx [
14d0: 6c 69 73 74 20 5b 73 74 72 69 6e 67 20 6c 65 6e  list [string len
14e0: 67 74 68 20 24 6e 31 5d 20 5b 73 74 72 69 6e 67  gth $n1] [string
14f0: 20 6c 65 6e 67 74 68 20 24 6e 32 5d 5d 20 7b 0a   length $n2]] {.
1500: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 77            if {$w
1510: 78 3e 24 77 69 64 74 68 73 28 6c 6e 29 7d 20 7b  x>$widths(ln)} {
1520: 73 65 74 20 77 69 64 74 68 73 28 6c 6e 29 20 24  set widths(ln) $
1530: 77 78 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  wx}.        }.  
1540: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61      }.      defa
1550: 75 6c 74 20 7b 0a 20 20 20 20 20 20 20 20 2e 6c  ult {.        .l
1560: 6e 41 20 69 6e 73 65 72 74 20 65 6e 64 20 5c 6e  nA insert end \n
1570: 20 2d 0a 20 20 20 20 20 20 20 20 2e 74 78 74 41   -.        .txtA
1580: 20 69 6e 73 65 72 74 20 65 6e 64 20 24 6c 69 6e   insert end $lin
1590: 65 5c 6e 20 65 72 72 0a 20 20 20 20 20 20 20 20  e\n err.        
15a0: 2e 6d 6b 72 20 69 6e 73 65 72 74 20 65 6e 64 20  .mkr insert end 
15b0: 5c 6e 20 2d 0a 20 20 20 20 20 20 20 20 2e 6c 6e  \n -.        .ln
15c0: 42 20 69 6e 73 65 72 74 20 65 6e 64 20 5c 6e 20  B insert end \n 
15d0: 2d 0a 20 20 20 20 20 20 20 20 2e 74 78 74 42 20  -.        .txtB 
15e0: 69 6e 73 65 72 74 20 65 6e 64 20 24 6c 69 6e 65  insert end $line
15f0: 5c 6e 20 65 72 72 0a 20 20 20 20 20 20 7d 0a 20  \n err.      }. 
1600: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 6f 72 65     }.  }..  fore
1610: 61 63 68 20 63 20 5b 63 6f 6c 73 5d 20 7b 0a 20  ach c [cols] {. 
1620: 20 20 20 73 65 74 20 74 79 70 65 20 5b 63 6f 6c     set type [col
1630: 54 79 70 65 20 24 63 5d 0a 20 20 20 20 69 66 20  Type $c].    if 
1640: 7b 24 74 79 70 65 20 6e 65 20 22 74 78 74 22 7d  {$type ne "txt"}
1650: 20 7b 0a 20 20 20 20 20 20 24 63 20 63 6f 6e 66   {.      $c conf
1660: 69 67 20 2d 77 69 64 74 68 20 24 77 69 64 74 68  ig -width $width
1670: 73 28 24 74 79 70 65 29 0a 20 20 20 20 7d 0a 20  s($type).    }. 
1680: 20 20 20 24 63 20 63 6f 6e 66 69 67 20 2d 73 74     $c config -st
1690: 61 74 65 20 64 69 73 61 62 6c 65 64 0a 20 20 7d  ate disabled.  }
16a0: 0a 20 20 69 66 20 7b 24 6e 44 69 66 66 73 20 3c  .  if {$nDiffs <
16b0: 3d 20 5b 2e 77 66 69 6c 65 73 2e 6c 62 20 63 67  = [.wfiles.lb cg
16c0: 65 74 20 2d 68 65 69 67 68 74 5d 7d 20 7b 0a 20  et -height]} {. 
16d0: 20 20 20 2e 77 66 69 6c 65 73 2e 6c 62 20 63 6f     .wfiles.lb co
16e0: 6e 66 69 67 20 2d 68 65 69 67 68 74 20 24 6e 44  nfig -height $nD
16f0: 69 66 66 73 0a 20 20 20 20 67 72 69 64 20 72 65  iffs.    grid re
1700: 6d 6f 76 65 20 2e 77 66 69 6c 65 73 2e 73 62 0a  move .wfiles.sb.
1710: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 24 6e    }..  return $n
1720: 44 69 66 66 73 0a 7d 0a 0a 70 72 6f 63 20 76 69  Diffs.}..proc vi
1730: 65 77 44 69 66 66 20 7b 69 64 78 7d 20 7b 0a 20  ewDiff {idx} {. 
1740: 20 2e 74 78 74 41 20 79 76 69 65 77 20 24 69 64   .txtA yview $id
1750: 78 0a 20 20 2e 74 78 74 41 20 78 76 69 65 77 20  x.  .txtA xview 
1760: 6d 6f 76 65 74 6f 20 30 0a 7d 0a 0a 70 72 6f 63  moveto 0.}..proc
1770: 20 63 79 63 6c 65 44 69 66 66 73 20 7b 7b 72 65   cycleDiffs {{re
1780: 76 65 72 73 65 20 30 7d 7d 20 7b 0a 20 20 69 66  verse 0}} {.  if
1790: 20 7b 24 72 65 76 65 72 73 65 7d 20 7b 0a 20 20   {$reverse} {.  
17a0: 20 20 73 65 74 20 72 61 6e 67 65 20 5b 2e 74 78    set range [.tx
17b0: 74 41 20 74 61 67 20 70 72 65 76 72 61 6e 67 65  tA tag prevrange
17c0: 20 66 6e 20 40 30 2c 30 20 31 2e 30 5d 0a 20 20   fn @0,0 1.0].  
17d0: 20 20 69 66 20 7b 24 72 61 6e 67 65 20 65 71 20    if {$range eq 
17e0: 22 22 7d 20 7b 0a 20 20 20 20 20 20 76 69 65 77  ""} {.      view
17f0: 44 69 66 66 20 7b 66 6e 2e 6c 61 73 74 20 2d 31  Diff {fn.last -1
1800: 63 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  c}.    } else {.
1810: 20 20 20 20 20 20 76 69 65 77 44 69 66 66 20 5b        viewDiff [
1820: 6c 69 6e 64 65 78 20 24 72 61 6e 67 65 20 30 5d  lindex $range 0]
1830: 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20  .    }.  } else 
1840: 7b 0a 20 20 20 20 73 65 74 20 72 61 6e 67 65 20  {.    set range 
1850: 5b 2e 74 78 74 41 20 74 61 67 20 6e 65 78 74 72  [.txtA tag nextr
1860: 61 6e 67 65 20 66 6e 20 7b 40 30 2c 30 20 2b 31  ange fn {@0,0 +1
1870: 63 7d 20 65 6e 64 5d 0a 20 20 20 20 69 66 20 7b  c} end].    if {
1880: 24 72 61 6e 67 65 20 65 71 20 22 22 20 7c 7c 20  $range eq "" || 
1890: 5b 6c 69 6e 64 65 78 20 5b 2e 74 78 74 41 20 79  [lindex [.txtA y
18a0: 76 69 65 77 5d 20 31 5d 20 3d 3d 20 31 7d 20 7b  view] 1] == 1} {
18b0: 0a 20 20 20 20 20 20 76 69 65 77 44 69 66 66 20  .      viewDiff 
18c0: 66 6e 2e 66 69 72 73 74 0a 20 20 20 20 7d 20 65  fn.first.    } e
18d0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 76 69 65 77  lse {.      view
18e0: 44 69 66 66 20 5b 6c 69 6e 64 65 78 20 24 72 61  Diff [lindex $ra
18f0: 6e 67 65 20 30 5d 0a 20 20 20 20 7d 0a 20 20 7d  nge 0].    }.  }
1900: 0a 7d 0a 0a 70 72 6f 63 20 78 76 69 73 20 7b 63  .}..proc xvis {c
1910: 6f 6c 7d 20 7b 0a 20 20 73 65 74 20 76 69 65 77  ol} {.  set view
1920: 20 5b 24 63 6f 6c 20 78 76 69 65 77 5d 0a 20 20   [$col xview].  
1930: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b 6c  return [expr {[l
1940: 69 6e 64 65 78 20 24 76 69 65 77 20 31 5d 2d 5b  index $view 1]-[
1950: 6c 69 6e 64 65 78 20 24 76 69 65 77 20 30 5d 7d  lindex $view 0]}
1960: 5d 0a 7d 0a 0a 70 72 6f 63 20 73 63 72 6f 6c 6c  ].}..proc scroll
1970: 2d 78 20 7b 61 72 67 73 7d 20 7b 0a 20 20 73 65  -x {args} {.  se
1980: 74 20 63 20 2e 74 78 74 5b 65 78 70 72 20 7b 5b  t c .txt[expr {[
1990: 78 76 69 73 20 2e 74 78 74 41 5d 20 3c 20 5b 78  xvis .txtA] < [x
19a0: 76 69 73 20 2e 74 78 74 42 5d 20 3f 20 22 41 22  vis .txtB] ? "A"
19b0: 20 3a 20 22 42 22 7d 5d 0a 20 20 65 76 61 6c 20   : "B"}].  eval 
19c0: 24 63 20 78 76 69 65 77 20 24 61 72 67 73 0a 7d  $c xview $args.}
19d0: 0a 0a 69 6e 74 65 72 70 20 61 6c 69 61 73 20 7b  ..interp alias {
19e0: 7d 20 73 63 72 6f 6c 6c 2d 79 20 7b 7d 20 2e 74  } scroll-y {} .t
19f0: 78 74 41 20 79 76 69 65 77 0a 0a 70 72 6f 63 20  xtA yview..proc 
1a00: 6e 6f 6f 70 20 7b 61 72 67 73 7d 20 7b 7d 0a 0a  noop {args} {}..
1a10: 70 72 6f 63 20 65 6e 61 62 6c 65 53 79 6e 63 20  proc enableSync 
1a20: 7b 61 78 69 73 7d 20 7b 0a 20 20 75 70 64 61 74  {axis} {.  updat
1a30: 65 20 69 64 6c 65 74 61 73 6b 73 0a 20 20 69 6e  e idletasks.  in
1a40: 74 65 72 70 20 61 6c 69 61 73 20 7b 7d 20 73 79  terp alias {} sy
1a50: 6e 63 2d 24 61 78 69 73 20 7b 7d 0a 20 20 72 65  nc-$axis {}.  re
1a60: 6e 61 6d 65 20 5f 73 79 6e 63 2d 24 61 78 69 73  name _sync-$axis
1a70: 20 73 79 6e 63 2d 24 61 78 69 73 0a 7d 0a 0a 70   sync-$axis.}..p
1a80: 72 6f 63 20 64 69 73 61 62 6c 65 53 79 6e 63 20  roc disableSync 
1a90: 7b 61 78 69 73 7d 20 7b 0a 20 20 72 65 6e 61 6d  {axis} {.  renam
1aa0: 65 20 73 79 6e 63 2d 24 61 78 69 73 20 5f 73 79  e sync-$axis _sy
1ab0: 6e 63 2d 24 61 78 69 73 0a 20 20 69 6e 74 65 72  nc-$axis.  inter
1ac0: 70 20 61 6c 69 61 73 20 7b 7d 20 73 79 6e 63 2d  p alias {} sync-
1ad0: 24 61 78 69 73 20 7b 7d 20 6e 6f 6f 70 0a 7d 0a  $axis {} noop.}.
1ae0: 0a 70 72 6f 63 20 73 79 6e 63 2d 78 20 7b 63 6f  .proc sync-x {co
1af0: 6c 20 66 69 72 73 74 20 6c 61 73 74 7d 20 7b 0a  l first last} {.
1b00: 20 20 64 69 73 61 62 6c 65 53 79 6e 63 20 78 0a    disableSync x.
1b10: 20 20 24 63 6f 6c 20 78 76 69 65 77 20 6d 6f 76    $col xview mov
1b20: 65 74 6f 20 5b 65 78 70 72 20 7b 24 66 69 72 73  eto [expr {$firs
1b30: 74 2a 5b 78 76 69 73 20 24 63 6f 6c 5d 2f 28 24  t*[xvis $col]/($
1b40: 6c 61 73 74 2d 24 66 69 72 73 74 29 7d 5d 0a 20  last-$first)}]. 
1b50: 20 66 6f 72 65 61 63 68 20 73 69 64 65 20 7b 41   foreach side {A
1b60: 20 42 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 62   B} {.    set sb
1b70: 20 2e 73 62 78 24 73 69 64 65 0a 20 20 20 20 73   .sbx$side.    s
1b80: 65 74 20 78 76 69 65 77 20 5b 2e 74 78 74 24 73  et xview [.txt$s
1b90: 69 64 65 20 78 76 69 65 77 5d 0a 20 20 20 20 69  ide xview].    i
1ba0: 66 20 7b 5b 6c 69 6e 64 65 78 20 24 78 76 69 65  f {[lindex $xvie
1bb0: 77 20 30 5d 20 3e 20 30 20 7c 7c 20 5b 6c 69 6e  w 0] > 0 || [lin
1bc0: 64 65 78 20 24 78 76 69 65 77 20 31 5d 20 3c 20  dex $xview 1] < 
1bd0: 31 7d 20 7b 0a 20 20 20 20 20 20 67 72 69 64 20  1} {.      grid 
1be0: 24 73 62 0a 20 20 20 20 20 20 65 76 61 6c 20 24  $sb.      eval $
1bf0: 73 62 20 73 65 74 20 24 78 76 69 65 77 0a 20 20  sb set $xview.  
1c00: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1c10: 20 67 72 69 64 20 72 65 6d 6f 76 65 20 24 73 62   grid remove $sb
1c20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 65 6e 61  .    }.  }.  ena
1c30: 62 6c 65 53 79 6e 63 20 78 0a 7d 0a 0a 70 72 6f  bleSync x.}..pro
1c40: 63 20 73 79 6e 63 2d 79 20 7b 66 69 72 73 74 20  c sync-y {first 
1c50: 6c 61 73 74 7d 20 7b 0a 20 20 64 69 73 61 62 6c  last} {.  disabl
1c60: 65 53 79 6e 63 20 79 0a 20 20 66 6f 72 65 61 63  eSync y.  foreac
1c70: 68 20 63 20 5b 63 6f 6c 73 5d 20 7b 0a 20 20 20  h c [cols] {.   
1c80: 20 24 63 20 79 76 69 65 77 20 6d 6f 76 65 74 6f   $c yview moveto
1c90: 20 24 66 69 72 73 74 0a 20 20 7d 0a 20 20 69 66   $first.  }.  if
1ca0: 20 7b 24 66 69 72 73 74 20 3e 20 30 20 7c 7c 20   {$first > 0 || 
1cb0: 24 6c 61 73 74 20 3c 20 31 7d 20 7b 0a 20 20 20  $last < 1} {.   
1cc0: 20 67 72 69 64 20 2e 73 62 79 0a 20 20 20 20 2e   grid .sby.    .
1cd0: 73 62 79 20 73 65 74 20 24 66 69 72 73 74 20 24  sby set $first $
1ce0: 6c 61 73 74 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  last.  } else {.
1cf0: 20 20 20 20 67 72 69 64 20 72 65 6d 6f 76 65 20      grid remove 
1d00: 2e 73 62 79 0a 20 20 7d 0a 20 20 65 6e 61 62 6c  .sby.  }.  enabl
1d10: 65 53 79 6e 63 20 79 0a 7d 0a 0a 77 6d 20 77 69  eSync y.}..wm wi
1d20: 74 68 64 72 61 77 20 2e 0a 77 6d 20 74 69 74 6c  thdraw ..wm titl
1d30: 65 20 2e 20 24 43 46 47 28 54 49 54 4c 45 29 0a  e . $CFG(TITLE).
1d40: 77 6d 20 69 63 6f 6e 6e 61 6d 65 20 2e 20 24 43  wm iconname . $C
1d50: 46 47 28 54 49 54 4c 45 29 0a 23 20 4b 65 79 73  FG(TITLE).# Keys
1d60: 74 72 6f 6b 65 20 62 69 6e 64 69 6e 67 73 20 66  troke bindings f
1d70: 6f 72 20 6f 6e 20 74 68 65 20 74 6f 70 2d 6c 65  or on the top-le
1d80: 76 65 6c 20 77 69 6e 64 6f 77 20 66 6f 72 20 6e  vel window for n
1d90: 61 76 69 67 61 74 69 6f 6e 20 61 6e 64 0a 23 20  avigation and.# 
1da0: 63 6f 6e 74 72 6f 6c 20 61 6c 73 6f 20 66 69 72  control also fir
1db0: 65 20 77 68 65 6e 20 74 68 6f 73 65 20 73 61 6d  e when those sam
1dc0: 65 20 6b 65 79 73 74 72 6f 6b 65 73 20 61 72 65  e keystrokes are
1dd0: 20 70 72 65 73 73 65 64 20 69 6e 20 74 68 65 0a   pressed in the.
1de0: 23 20 53 65 61 72 63 68 20 65 6e 74 72 79 20 62  # Search entry b
1df0: 6f 78 2e 20 20 44 69 73 61 62 6c 65 20 74 68 65  ox.  Disable the
1e00: 6d 2c 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  m, to prevent th
1e10: 65 20 64 69 66 66 20 73 63 72 65 65 6e 20 66 72  e diff screen fr
1e20: 6f 6d 0a 23 20 64 69 73 61 70 70 65 61 72 69 6e  om.# disappearin
1e30: 67 20 61 62 72 75 70 74 6c 79 20 61 6e 64 20 75  g abruptly and u
1e40: 6e 65 78 70 65 63 74 65 64 6c 79 20 77 68 65 6e  nexpectedly when
1e50: 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 22   searching for "
1e60: 71 22 2e 0a 23 0a 62 69 6e 64 20 2e 20 3c 43 6f  q"..#.bind . <Co
1e70: 6e 74 72 6f 6c 2d 71 3e 20 65 78 69 74 0a 62 69  ntrol-q> exit.bi
1e80: 6e 64 20 2e 20 3c 43 6f 6e 74 72 6f 6c 2d 70 3e  nd . <Control-p>
1e90: 20 7b 63 61 74 63 68 20 73 65 61 72 63 68 50 72   {catch searchPr
1ea0: 65 76 3b 20 62 72 65 61 6b 7d 0a 62 69 6e 64 20  ev; break}.bind 
1eb0: 2e 20 3c 43 6f 6e 74 72 6f 6c 2d 6e 3e 20 7b 63  . <Control-n> {c
1ec0: 61 74 63 68 20 73 65 61 72 63 68 4e 65 78 74 3b  atch searchNext;
1ed0: 20 62 72 65 61 6b 7d 0a 62 69 6e 64 20 2e 20 3c   break}.bind . <
1ee0: 45 73 63 61 70 65 3e 3c 45 73 63 61 70 65 3e 20  Escape><Escape> 
1ef0: 65 78 69 74 0a 62 69 6e 64 20 2e 20 3c 44 65 73  exit.bind . <Des
1f00: 74 72 6f 79 3e 20 7b 61 66 74 65 72 20 30 20 65  troy> {after 0 e
1f10: 78 69 74 7d 0a 62 69 6e 64 20 2e 20 3c 54 61 62  xit}.bind . <Tab
1f20: 3e 20 7b 63 79 63 6c 65 44 69 66 66 73 3b 20 62  > {cycleDiffs; b
1f30: 72 65 61 6b 7d 0a 62 69 6e 64 20 2e 20 3c 3c 50  reak}.bind . <<P
1f40: 72 65 76 57 69 6e 64 6f 77 3e 3e 20 7b 63 79 63  revWindow>> {cyc
1f50: 6c 65 44 69 66 66 73 20 31 3b 20 62 72 65 61 6b  leDiffs 1; break
1f60: 7d 0a 62 69 6e 64 20 2e 20 3c 43 6f 6e 74 72 6f  }.bind . <Contro
1f70: 6c 2d 66 3e 20 7b 73 65 61 72 63 68 4f 6e 4f 66  l-f> {searchOnOf
1f80: 66 3b 20 62 72 65 61 6b 7d 0a 62 69 6e 64 20 2e  f; break}.bind .
1f90: 20 3c 43 6f 6e 74 72 6f 6c 2d 67 3e 20 7b 63 61   <Control-g> {ca
1fa0: 74 63 68 20 73 65 61 72 63 68 4e 65 78 74 3b 20  tch searchNext; 
1fb0: 62 72 65 61 6b 7d 0a 62 69 6e 64 20 2e 20 3c 52  break}.bind . <R
1fc0: 65 74 75 72 6e 3e 20 7b 0a 20 20 65 76 65 6e 74  eturn> {.  event
1fd0: 20 67 65 6e 65 72 61 74 65 20 2e 62 62 2e 66 69   generate .bb.fi
1fe0: 6c 65 73 20 3c 31 3e 0a 20 20 65 76 65 6e 74 20  les <1>.  event 
1ff0: 67 65 6e 65 72 61 74 65 20 2e 62 62 2e 66 69 6c  generate .bb.fil
2000: 65 73 20 3c 42 75 74 74 6f 6e 52 65 6c 65 61 73  es <ButtonReleas
2010: 65 2d 31 3e 0a 20 20 62 72 65 61 6b 0a 7d 0a 66  e-1>.  break.}.f
2020: 6f 72 65 61 63 68 20 7b 6b 65 79 20 61 78 69 73  oreach {key axis
2030: 20 61 72 67 73 7d 20 7b 0a 20 20 55 70 20 20 20   args} {.  Up   
2040: 20 79 20 7b 73 63 72 6f 6c 6c 20 2d 35 20 75 6e   y {scroll -5 un
2050: 69 74 73 7d 0a 20 20 6b 20 20 20 20 20 79 20 7b  its}.  k     y {
2060: 73 63 72 6f 6c 6c 20 2d 35 20 75 6e 69 74 73 7d  scroll -5 units}
2070: 0a 20 20 44 6f 77 6e 20 20 79 20 7b 73 63 72 6f  .  Down  y {scro
2080: 6c 6c 20 35 20 75 6e 69 74 73 7d 0a 20 20 6a 20  ll 5 units}.  j 
2090: 20 20 20 20 79 20 7b 73 63 72 6f 6c 6c 20 35 20      y {scroll 5 
20a0: 75 6e 69 74 73 7d 0a 20 20 4c 65 66 74 20 20 78  units}.  Left  x
20b0: 20 7b 73 63 72 6f 6c 6c 20 2d 35 20 75 6e 69 74   {scroll -5 unit
20c0: 73 7d 0a 20 20 68 20 20 20 20 20 78 20 7b 73 63  s}.  h     x {sc
20d0: 72 6f 6c 6c 20 2d 35 20 75 6e 69 74 73 7d 0a 20  roll -5 units}. 
20e0: 20 52 69 67 68 74 20 78 20 7b 73 63 72 6f 6c 6c   Right x {scroll
20f0: 20 35 20 75 6e 69 74 73 7d 0a 20 20 6c 20 20 20   5 units}.  l   
2100: 20 20 78 20 7b 73 63 72 6f 6c 6c 20 35 20 75 6e    x {scroll 5 un
2110: 69 74 73 7d 0a 20 20 50 72 69 6f 72 20 79 20 7b  its}.  Prior y {
2120: 73 63 72 6f 6c 6c 20 2d 31 20 70 61 67 65 7d 0a  scroll -1 page}.
2130: 20 20 62 20 20 20 20 20 79 20 7b 73 63 72 6f 6c    b     y {scrol
2140: 6c 20 2d 31 20 70 61 67 65 7d 0a 20 20 4e 65 78  l -1 page}.  Nex
2150: 74 20 20 79 20 7b 73 63 72 6f 6c 6c 20 31 20 70  t  y {scroll 1 p
2160: 61 67 65 7d 0a 20 20 73 70 61 63 65 20 79 20 7b  age}.  space y {
2170: 73 63 72 6f 6c 6c 20 31 20 70 61 67 65 7d 0a 20  scroll 1 page}. 
2180: 20 48 6f 6d 65 20 20 79 20 7b 6d 6f 76 65 74 6f   Home  y {moveto
2190: 20 30 7d 0a 20 20 67 20 20 20 20 20 79 20 7b 6d   0}.  g     y {m
21a0: 6f 76 65 74 6f 20 30 7d 0a 20 20 45 6e 64 20 20  oveto 0}.  End  
21b0: 20 79 20 7b 6d 6f 76 65 74 6f 20 31 7d 0a 7d 20   y {moveto 1}.} 
21c0: 7b 0a 20 20 62 69 6e 64 20 2e 20 3c 24 6b 65 79  {.  bind . <$key
21d0: 3e 20 22 73 63 72 6f 6c 6c 2d 24 61 78 69 73 20  > "scroll-$axis 
21e0: 24 61 72 67 73 3b 20 62 72 65 61 6b 22 0a 20 20  $args; break".  
21f0: 62 69 6e 64 20 2e 20 3c 53 68 69 66 74 2d 24 6b  bind . <Shift-$k
2200: 65 79 3e 20 63 6f 6e 74 69 6e 75 65 0a 7d 0a 0a  ey> continue.}..
2210: 66 72 61 6d 65 20 2e 62 62 0a 3a 3a 74 74 6b 3a  frame .bb.::ttk:
2220: 3a 6d 65 6e 75 62 75 74 74 6f 6e 20 2e 62 62 2e  :menubutton .bb.
2230: 66 69 6c 65 73 20 2d 74 65 78 74 20 22 46 69 6c  files -text "Fil
2240: 65 73 22 0a 69 66 20 7b 5b 74 6b 20 77 69 6e 64  es".if {[tk wind
2250: 6f 77 69 6e 67 73 79 73 74 65 6d 5d 20 65 71 20  owingsystem] eq 
2260: 22 77 69 6e 33 32 22 7d 20 7b 0a 20 20 3a 3a 74  "win32"} {.  ::t
2270: 74 6b 3a 3a 73 74 79 6c 65 20 74 68 65 6d 65 20  tk::style theme 
2280: 75 73 65 20 77 69 6e 6e 61 74 69 76 65 0a 20 20  use winnative.  
2290: 2e 62 62 2e 66 69 6c 65 73 20 63 6f 6e 66 69 67  .bb.files config
22a0: 75 72 65 20 2d 70 61 64 64 69 6e 67 20 7b 32 30  ure -padding {20
22b0: 20 31 20 31 30 20 32 7d 0a 7d 0a 74 6f 70 6c 65   1 10 2}.}.tople
22c0: 76 65 6c 20 2e 77 66 69 6c 65 73 0a 77 6d 20 77  vel .wfiles.wm w
22d0: 69 74 68 64 72 61 77 20 2e 77 66 69 6c 65 73 0a  ithdraw .wfiles.
22e0: 75 70 64 61 74 65 20 69 64 6c 65 74 61 73 6b 73  update idletasks
22f0: 0a 77 6d 20 74 72 61 6e 73 69 65 6e 74 20 2e 77  .wm transient .w
2300: 66 69 6c 65 73 20 2e 0a 77 6d 20 6f 76 65 72 72  files ..wm overr
2310: 69 64 65 72 65 64 69 72 65 63 74 20 2e 77 66 69  ideredirect .wfi
2320: 6c 65 73 20 31 0a 6c 69 73 74 62 6f 78 20 2e 77  les 1.listbox .w
2330: 66 69 6c 65 73 2e 6c 62 20 2d 77 69 64 74 68 20  files.lb -width 
2340: 30 20 2d 68 65 69 67 68 74 20 24 43 46 47 28 4c  0 -height $CFG(L
2350: 42 5f 48 45 49 47 48 54 29 20 2d 61 63 74 69 76  B_HEIGHT) -activ
2360: 65 73 74 79 6c 65 20 6e 6f 6e 65 20 5c 0a 20 20  estyle none \.  
2370: 2d 79 73 63 72 6f 6c 6c 20 7b 2e 77 66 69 6c 65  -yscroll {.wfile
2380: 73 2e 73 62 20 73 65 74 7d 0a 3a 3a 74 74 6b 3a  s.sb set}.::ttk:
2390: 3a 73 63 72 6f 6c 6c 62 61 72 20 2e 77 66 69 6c  :scrollbar .wfil
23a0: 65 73 2e 73 62 20 2d 63 6f 6d 6d 61 6e 64 20 7b  es.sb -command {
23b0: 2e 77 66 69 6c 65 73 2e 6c 62 20 79 76 69 65 77  .wfiles.lb yview
23c0: 7d 0a 67 72 69 64 20 2e 77 66 69 6c 65 73 2e 6c  }.grid .wfiles.l
23d0: 62 20 2e 77 66 69 6c 65 73 2e 73 62 20 2d 73 74  b .wfiles.sb -st
23e0: 69 63 6b 79 20 6e 73 0a 62 69 6e 64 20 2e 62 62  icky ns.bind .bb
23f0: 2e 66 69 6c 65 73 20 3c 31 3e 20 7b 0a 20 20 73  .files <1> {.  s
2400: 65 74 20 78 20 5b 77 69 6e 66 6f 20 72 6f 6f 74  et x [winfo root
2410: 78 20 25 57 5d 0a 20 20 73 65 74 20 79 20 5b 65  x %W].  set y [e
2420: 78 70 72 20 7b 5b 77 69 6e 66 6f 20 72 6f 6f 74  xpr {[winfo root
2430: 79 20 25 57 5d 2b 5b 77 69 6e 66 6f 20 68 65 69  y %W]+[winfo hei
2440: 67 68 74 20 25 57 5d 7d 5d 0a 20 20 77 6d 20 67  ght %W]}].  wm g
2450: 65 6f 6d 65 74 72 79 20 2e 77 66 69 6c 65 73 20  eometry .wfiles 
2460: 2b 24 78 2b 24 79 0a 20 20 77 6d 20 64 65 69 63  +$x+$y.  wm deic
2470: 6f 6e 69 66 79 20 2e 77 66 69 6c 65 73 0a 20 20  onify .wfiles.  
2480: 66 6f 63 75 73 20 2e 77 66 69 6c 65 73 2e 6c 62  focus .wfiles.lb
2490: 0a 7d 0a 62 69 6e 64 20 2e 77 66 69 6c 65 73 20  .}.bind .wfiles 
24a0: 3c 46 6f 63 75 73 4f 75 74 3e 20 7b 77 6d 20 77  <FocusOut> {wm w
24b0: 69 74 68 64 72 61 77 20 2e 77 66 69 6c 65 73 7d  ithdraw .wfiles}
24c0: 0a 62 69 6e 64 20 2e 77 66 69 6c 65 73 20 3c 45  .bind .wfiles <E
24d0: 73 63 61 70 65 3e 20 7b 66 6f 63 75 73 20 2e 7d  scape> {focus .}
24e0: 0a 66 6f 72 65 61 63 68 20 65 76 74 20 7b 31 20  .foreach evt {1 
24f0: 52 65 74 75 72 6e 7d 20 7b 0a 20 20 62 69 6e 64  Return} {.  bind
2500: 20 2e 77 66 69 6c 65 73 2e 6c 62 20 3c 24 65 76   .wfiles.lb <$ev
2510: 74 3e 20 7b 0a 20 20 20 20 63 61 74 63 68 20 7b  t> {.    catch {
2520: 0a 20 20 20 20 20 20 73 65 74 20 69 64 78 20 5b  .      set idx [
2530: 6c 69 6e 64 65 78 20 5b 2e 74 78 74 41 20 74 61  lindex [.txtA ta
2540: 67 20 72 61 6e 67 65 73 20 66 6e 5d 20 5b 65 78  g ranges fn] [ex
2550: 70 72 20 7b 5b 25 57 20 63 75 72 73 65 6c 65 63  pr {[%W curselec
2560: 74 69 6f 6e 5d 2a 32 7d 5d 5d 0a 20 20 20 20 20  tion]*2}]].     
2570: 20 76 69 65 77 44 69 66 66 20 24 69 64 78 0a 20   viewDiff $idx. 
2580: 20 20 20 7d 0a 20 20 20 20 66 6f 63 75 73 20 2e     }.    focus .
2590: 0a 20 20 20 20 62 72 65 61 6b 0a 20 20 7d 0a 7d  .    break.  }.}
25a0: 0a 62 69 6e 64 20 2e 77 66 69 6c 65 73 2e 6c 62  .bind .wfiles.lb
25b0: 20 3c 4d 6f 74 69 6f 6e 3e 20 7b 0a 20 20 25 57   <Motion> {.  %W
25c0: 20 73 65 6c 65 63 74 69 6f 6e 20 63 6c 65 61 72   selection clear
25d0: 20 30 20 65 6e 64 0a 20 20 25 57 20 73 65 6c 65   0 end.  %W sele
25e0: 63 74 69 6f 6e 20 73 65 74 20 40 25 78 2c 25 79  ction set @%x,%y
25f0: 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 73 69 64  .}..foreach {sid
2600: 65 20 73 79 6e 63 43 6f 6c 7d 20 7b 41 20 2e 74  e syncCol} {A .t
2610: 78 74 42 20 42 20 2e 74 78 74 41 7d 20 7b 0a 20  xtB B .txtA} {. 
2620: 20 73 65 74 20 6c 6e 20 2e 6c 6e 24 73 69 64 65   set ln .ln$side
2630: 0a 20 20 74 65 78 74 20 24 6c 6e 0a 20 20 24 6c  .  text $ln.  $l
2640: 6e 20 74 61 67 20 63 6f 6e 66 69 67 20 2d 20 2d  n tag config - -
2650: 6a 75 73 74 69 66 79 20 72 69 67 68 74 0a 0a 20  justify right.. 
2660: 20 73 65 74 20 74 78 74 20 2e 74 78 74 24 73 69   set txt .txt$si
2670: 64 65 0a 20 20 74 65 78 74 20 24 74 78 74 20 2d  de.  text $txt -
2680: 77 69 64 74 68 20 24 43 46 47 28 57 49 44 54 48  width $CFG(WIDTH
2690: 29 20 2d 68 65 69 67 68 74 20 24 43 46 47 28 48  ) -height $CFG(H
26a0: 45 49 47 48 54 29 20 2d 77 72 61 70 20 6e 6f 6e  EIGHT) -wrap non
26b0: 65 20 5c 0a 20 20 20 20 2d 78 73 63 72 6f 6c 6c  e \.    -xscroll
26c0: 20 22 73 79 6e 63 2d 78 20 24 73 79 6e 63 43 6f   "sync-x $syncCo
26d0: 6c 22 0a 20 20 63 61 74 63 68 20 7b 24 74 78 74  l".  catch {$txt
26e0: 20 63 6f 6e 66 69 67 20 2d 74 61 62 73 74 79 6c   config -tabstyl
26f0: 65 20 77 6f 72 64 70 72 6f 63 65 73 73 6f 72 7d  e wordprocessor}
2700: 20 3b 23 20 52 65 71 75 69 72 65 64 20 66 6f 72   ;# Required for
2710: 20 54 6b 3e 3d 38 2e 35 0a 20 20 66 6f 72 65 61   Tk>=8.5.  forea
2720: 63 68 20 74 61 67 20 7b 61 64 64 20 72 6d 20 63  ch tag {add rm c
2730: 68 6e 67 7d 20 7b 0a 20 20 20 20 24 74 78 74 20  hng} {.    $txt 
2740: 74 61 67 20 63 6f 6e 66 69 67 20 24 74 61 67 20  tag config $tag 
2750: 2d 62 61 63 6b 67 72 6f 75 6e 64 20 24 43 46 47  -background $CFG
2760: 28 5b 73 74 72 69 6e 67 20 74 6f 75 70 70 65 72  ([string toupper
2770: 20 24 74 61 67 5d 5f 42 47 29 0a 20 20 20 20 24   $tag]_BG).    $
2780: 74 78 74 20 74 61 67 20 6c 6f 77 65 72 20 24 74  txt tag lower $t
2790: 61 67 0a 20 20 7d 0a 20 20 24 74 78 74 20 74 61  ag.  }.  $txt ta
27a0: 67 20 63 6f 6e 66 69 67 20 66 6e 20 2d 62 61 63  g config fn -bac
27b0: 6b 67 72 6f 75 6e 64 20 24 43 46 47 28 46 4e 5f  kground $CFG(FN_
27c0: 42 47 29 20 2d 66 6f 72 65 67 72 6f 75 6e 64 20  BG) -foreground 
27d0: 24 43 46 47 28 46 4e 5f 46 47 29 20 5c 0a 20 20  $CFG(FN_FG) \.  
27e0: 20 20 2d 6a 75 73 74 69 66 79 20 63 65 6e 74 65    -justify cente
27f0: 72 0a 20 20 24 74 78 74 20 74 61 67 20 63 6f 6e  r.  $txt tag con
2800: 66 69 67 20 65 72 72 20 2d 66 6f 72 65 67 72 6f  fig err -foregro
2810: 75 6e 64 20 24 43 46 47 28 45 52 52 5f 46 47 29  und $CFG(ERR_FG)
2820: 0a 7d 0a 74 65 78 74 20 2e 6d 6b 72 0a 0a 66 6f  .}.text .mkr..fo
2830: 72 65 61 63 68 20 63 20 5b 63 6f 6c 73 5d 20 7b  reach c [cols] {
2840: 0a 20 20 73 65 74 20 6b 65 79 50 72 65 66 69 78  .  set keyPrefix
2850: 20 5b 73 74 72 69 6e 67 20 74 6f 75 70 70 65 72   [string toupper
2860: 20 5b 63 6f 6c 54 79 70 65 20 24 63 5d 5d 5f 43   [colType $c]]_C
2870: 4f 4c 5f 0a 20 20 69 66 20 7b 5b 74 6b 20 77 69  OL_.  if {[tk wi
2880: 6e 64 6f 77 69 6e 67 73 79 73 74 65 6d 5d 20 65  ndowingsystem] e
2890: 71 20 22 77 69 6e 33 32 22 7d 20 7b 24 63 20 63  q "win32"} {$c c
28a0: 6f 6e 66 69 67 20 2d 66 6f 6e 74 20 7b 63 6f 75  onfig -font {cou
28b0: 72 69 65 72 20 39 7d 7d 0a 20 20 24 63 20 63 6f  rier 9}}.  $c co
28c0: 6e 66 69 67 20 2d 62 67 20 24 43 46 47 28 24 7b  nfig -bg $CFG(${
28d0: 6b 65 79 50 72 65 66 69 78 7d 42 47 29 20 2d 66  keyPrefix}BG) -f
28e0: 67 20 24 43 46 47 28 24 7b 6b 65 79 50 72 65 66  g $CFG(${keyPref
28f0: 69 78 7d 46 47 29 20 2d 62 6f 72 64 65 72 77 69  ix}FG) -borderwi
2900: 64 74 68 20 30 20 5c 0a 20 20 20 20 2d 70 61 64  dth 0 \.    -pad
2910: 78 20 24 43 46 47 28 50 41 44 58 29 20 2d 79 73  x $CFG(PADX) -ys
2920: 63 72 6f 6c 6c 20 73 79 6e 63 2d 79 0a 20 20 24  croll sync-y.  $
2930: 63 20 74 61 67 20 63 6f 6e 66 69 67 20 68 72 6c  c tag config hrl
2940: 6e 20 2d 73 70 61 63 69 6e 67 31 20 24 43 46 47  n -spacing1 $CFG
2950: 28 48 52 5f 50 41 44 5f 54 4f 50 29 20 2d 73 70  (HR_PAD_TOP) -sp
2960: 61 63 69 6e 67 33 20 24 43 46 47 28 48 52 5f 50  acing3 $CFG(HR_P
2970: 41 44 5f 42 54 4d 29 20 5c 0a 20 20 20 20 20 2d  AD_BTM) \.     -
2980: 66 6f 72 65 67 72 6f 75 6e 64 20 24 43 46 47 28  foreground $CFG(
2990: 48 52 5f 46 47 29 20 2d 6a 75 73 74 69 66 79 20  HR_FG) -justify 
29a0: 72 69 67 68 74 0a 20 20 24 63 20 74 61 67 20 63  right.  $c tag c
29b0: 6f 6e 66 69 67 20 68 72 74 78 74 20 20 2d 73 70  onfig hrtxt  -sp
29c0: 61 63 69 6e 67 31 20 24 43 46 47 28 48 52 5f 50  acing1 $CFG(HR_P
29d0: 41 44 5f 54 4f 50 29 20 2d 73 70 61 63 69 6e 67  AD_TOP) -spacing
29e0: 33 20 24 43 46 47 28 48 52 5f 50 41 44 5f 42 54  3 $CFG(HR_PAD_BT
29f0: 4d 29 20 5c 0a 20 20 20 20 20 2d 66 6f 72 65 67  M) \.     -foreg
2a00: 72 6f 75 6e 64 20 24 43 46 47 28 48 52 5f 46 47  round $CFG(HR_FG
2a10: 29 20 2d 6a 75 73 74 69 66 79 20 63 65 6e 74 65  ) -justify cente
2a20: 72 0a 20 20 24 63 20 74 61 67 20 63 6f 6e 66 69  r.  $c tag confi
2a30: 67 20 66 6e 20 2d 73 70 61 63 69 6e 67 31 20 24  g fn -spacing1 $
2a40: 43 46 47 28 46 4e 5f 50 41 44 29 20 2d 73 70 61  CFG(FN_PAD) -spa
2a50: 63 69 6e 67 33 20 24 43 46 47 28 46 4e 5f 50 41  cing3 $CFG(FN_PA
2a60: 44 29 0a 20 20 62 69 6e 64 74 61 67 73 20 24 63  D).  bindtags $c
2a70: 20 22 2e 20 24 63 20 54 65 78 74 20 61 6c 6c 22   ". $c Text all"
2a80: 0a 20 20 62 69 6e 64 20 24 63 20 3c 31 3e 20 7b  .  bind $c <1> {
2a90: 66 6f 63 75 73 20 25 57 7d 0a 7d 0a 0a 3a 3a 74  focus %W}.}..::t
2aa0: 74 6b 3a 3a 73 63 72 6f 6c 6c 62 61 72 20 2e 73  tk::scrollbar .s
2ab0: 62 79 20 2d 63 6f 6d 6d 61 6e 64 20 7b 2e 74 78  by -command {.tx
2ac0: 74 41 20 79 76 69 65 77 7d 20 2d 6f 72 69 65 6e  tA yview} -orien
2ad0: 74 20 76 65 72 74 69 63 61 6c 0a 3a 3a 74 74 6b  t vertical.::ttk
2ae0: 3a 3a 73 63 72 6f 6c 6c 62 61 72 20 2e 73 62 78  ::scrollbar .sbx
2af0: 41 20 2d 63 6f 6d 6d 61 6e 64 20 7b 2e 74 78 74  A -command {.txt
2b00: 41 20 78 76 69 65 77 7d 20 2d 6f 72 69 65 6e 74  A xview} -orient
2b10: 20 68 6f 72 69 7a 6f 6e 74 61 6c 0a 3a 3a 74 74   horizontal.::tt
2b20: 6b 3a 3a 73 63 72 6f 6c 6c 62 61 72 20 2e 73 62  k::scrollbar .sb
2b30: 78 42 20 2d 63 6f 6d 6d 61 6e 64 20 7b 2e 74 78  xB -command {.tx
2b40: 74 42 20 78 76 69 65 77 7d 20 2d 6f 72 69 65 6e  tB xview} -orien
2b50: 74 20 68 6f 72 69 7a 6f 6e 74 61 6c 0a 66 72 61  t horizontal.fra
2b60: 6d 65 20 2e 73 70 61 63 65 72 0a 0a 69 66 20 7b  me .spacer..if {
2b70: 5b 72 65 61 64 44 69 66 66 73 20 24 66 6f 73 73  [readDiffs $foss
2b80: 69 6c 63 6d 64 5d 20 3d 3d 20 30 7d 20 7b 0a 20  ilcmd] == 0} {. 
2b90: 20 74 6b 5f 6d 65 73 73 61 67 65 42 6f 78 20 2d   tk_messageBox -
2ba0: 74 79 70 65 20 6f 6b 20 2d 74 69 74 6c 65 20 24  type ok -title $
2bb0: 43 46 47 28 54 49 54 4c 45 29 20 2d 6d 65 73 73  CFG(TITLE) -mess
2bc0: 61 67 65 20 22 4e 6f 20 63 68 61 6e 67 65 73 22  age "No changes"
2bd0: 0a 20 20 65 78 69 74 0a 7d 0a 75 70 64 61 74 65  .  exit.}.update
2be0: 20 69 64 6c 65 74 61 73 6b 73 0a 0a 70 72 6f 63   idletasks..proc
2bf0: 20 73 61 76 65 44 69 66 66 20 7b 7d 20 7b 0a 20   saveDiff {} {. 
2c00: 20 73 65 74 20 66 6e 20 5b 74 6b 5f 67 65 74 53   set fn [tk_getS
2c10: 61 76 65 46 69 6c 65 5d 0a 20 20 69 66 20 7b 24  aveFile].  if {$
2c20: 66 6e 3d 3d 22 22 7d 20 72 65 74 75 72 6e 0a 20  fn==""} return. 
2c30: 20 73 65 74 20 6f 75 74 20 5b 6f 70 65 6e 20 24   set out [open $
2c40: 66 6e 20 77 62 5d 0a 20 20 70 75 74 73 20 24 6f  fn wb].  puts $o
2c50: 75 74 20 22 23 21 2f 75 73 72 2f 62 69 6e 2f 74  ut "#!/usr/bin/t
2c60: 63 6c 73 68 5c 6e 23 5c 6e 23 20 52 75 6e 20 74  clsh\n#\n# Run t
2c70: 68 69 73 20 73 63 72 69 70 74 20 75 73 69 6e 67  his script using
2c80: 20 27 74 63 6c 73 68 27 20 6f 72 20 27 77 69 73   'tclsh' or 'wis
2c90: 68 27 22 0a 20 20 70 75 74 73 20 24 6f 75 74 20  h'".  puts $out 
2ca0: 22 23 20 74 6f 20 73 65 65 20 74 68 65 20 67 72  "# to see the gr
2cb0: 61 70 68 69 63 61 6c 20 64 69 66 66 2e 5c 6e 23  aphical diff.\n#
2cc0: 22 0a 20 20 70 75 74 73 20 24 6f 75 74 20 22 73  ".  puts $out "s
2cd0: 65 74 20 66 6f 73 73 69 6c 63 6d 64 20 7b 7d 22  et fossilcmd {}"
2ce0: 0a 20 20 70 75 74 73 20 24 6f 75 74 20 22 73 65  .  puts $out "se
2cf0: 74 20 70 72 6f 67 20 5b 6c 69 73 74 20 24 3a 3a  t prog [list $::
2d00: 70 72 6f 67 5d 22 0a 20 20 70 75 74 73 20 24 6f  prog]".  puts $o
2d10: 75 74 20 22 73 65 74 20 64 69 66 66 74 78 74 20  ut "set difftxt 
2d20: 5c 31 37 33 22 0a 20 20 66 6f 72 65 61 63 68 20  \173".  foreach 
2d30: 65 20 24 3a 3a 64 69 66 66 74 78 74 20 7b 70 75  e $::difftxt {pu
2d40: 74 73 20 24 6f 75 74 20 5b 6c 69 73 74 20 24 65  ts $out [list $e
2d50: 5d 7d 0a 20 20 70 75 74 73 20 24 6f 75 74 20 22  ]}.  puts $out "
2d60: 5c 31 37 35 22 0a 20 20 70 75 74 73 20 24 6f 75  \175".  puts $ou
2d70: 74 20 22 65 76 61 6c 20 5c 24 70 72 6f 67 22 0a  t "eval \$prog".
2d80: 20 20 63 6c 6f 73 65 20 24 6f 75 74 0a 7d 0a 70    close $out.}.p
2d90: 72 6f 63 20 69 6e 76 65 72 74 44 69 66 66 20 7b  roc invertDiff {
2da0: 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 43 46 47  } {.  global CFG
2db0: 0a 20 20 61 72 72 61 79 20 73 65 74 20 78 20 5b  .  array set x [
2dc0: 67 72 69 64 20 69 6e 66 6f 20 2e 74 78 74 41 5d  grid info .txtA]
2dd0: 0a 20 20 69 66 20 7b 24 78 28 2d 63 6f 6c 75 6d  .  if {$x(-colum
2de0: 6e 29 3d 3d 31 7d 20 7b 0a 20 20 20 20 67 72 69  n)==1} {.    gri
2df0: 64 20 63 6f 6e 66 69 67 20 2e 6c 6e 42 20 2d 63  d config .lnB -c
2e00: 6f 6c 75 6d 6e 20 30 0a 20 20 20 20 67 72 69 64  olumn 0.    grid
2e10: 20 63 6f 6e 66 69 67 20 2e 74 78 74 42 20 2d 63   config .txtB -c
2e20: 6f 6c 75 6d 6e 20 31 0a 20 20 20 20 2e 74 78 74  olumn 1.    .txt
2e30: 42 20 74 61 67 20 63 6f 6e 66 69 67 20 61 64 64  B tag config add
2e40: 20 2d 62 61 63 6b 67 72 6f 75 6e 64 20 24 43 46   -background $CF
2e50: 47 28 52 4d 5f 42 47 29 0a 20 20 20 20 67 72 69  G(RM_BG).    gri
2e60: 64 20 63 6f 6e 66 69 67 20 2e 6c 6e 41 20 2d 63  d config .lnA -c
2e70: 6f 6c 75 6d 6e 20 33 0a 20 20 20 20 67 72 69 64  olumn 3.    grid
2e80: 20 63 6f 6e 66 69 67 20 2e 74 78 74 41 20 2d 63   config .txtA -c
2e90: 6f 6c 75 6d 6e 20 34 0a 20 20 20 20 2e 74 78 74  olumn 4.    .txt
2ea0: 41 20 74 61 67 20 63 6f 6e 66 69 67 20 72 6d 20  A tag config rm 
2eb0: 2d 62 61 63 6b 67 72 6f 75 6e 64 20 24 43 46 47  -background $CFG
2ec0: 28 41 44 44 5f 42 47 29 0a 20 20 20 20 2e 62 62  (ADD_BG).    .bb
2ed0: 2e 69 6e 76 65 72 74 20 63 6f 6e 66 69 67 20 2d  .invert config -
2ee0: 74 65 78 74 20 55 6e 69 6e 76 65 72 74 0a 20 20  text Uninvert.  
2ef0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 67 72 69  } else {.    gri
2f00: 64 20 63 6f 6e 66 69 67 20 2e 6c 6e 41 20 2d 63  d config .lnA -c
2f10: 6f 6c 75 6d 6e 20 30 0a 20 20 20 20 67 72 69 64  olumn 0.    grid
2f20: 20 63 6f 6e 66 69 67 20 2e 74 78 74 41 20 2d 63   config .txtA -c
2f30: 6f 6c 75 6d 6e 20 31 0a 20 20 20 20 2e 74 78 74  olumn 1.    .txt
2f40: 41 20 74 61 67 20 63 6f 6e 66 69 67 20 72 6d 20  A tag config rm 
2f50: 2d 62 61 63 6b 67 72 6f 75 6e 64 20 24 43 46 47  -background $CFG
2f60: 28 52 4d 5f 42 47 29 0a 20 20 20 20 67 72 69 64  (RM_BG).    grid
2f70: 20 63 6f 6e 66 69 67 20 2e 6c 6e 42 20 2d 63 6f   config .lnB -co
2f80: 6c 75 6d 6e 20 33 0a 20 20 20 20 67 72 69 64 20  lumn 3.    grid 
2f90: 63 6f 6e 66 69 67 20 2e 74 78 74 42 20 2d 63 6f  config .txtB -co
2fa0: 6c 75 6d 6e 20 34 0a 20 20 20 20 2e 74 78 74 42  lumn 4.    .txtB
2fb0: 20 74 61 67 20 63 6f 6e 66 69 67 20 61 64 64 20   tag config add 
2fc0: 2d 62 61 63 6b 67 72 6f 75 6e 64 20 24 43 46 47  -background $CFG
2fd0: 28 41 44 44 5f 42 47 29 0a 20 20 20 20 2e 62 62  (ADD_BG).    .bb
2fe0: 2e 69 6e 76 65 72 74 20 63 6f 6e 66 69 67 20 2d  .invert config -
2ff0: 74 65 78 74 20 49 6e 76 65 72 74 0a 20 20 7d 0a  text Invert.  }.
3000: 20 20 2e 6d 6b 72 20 63 6f 6e 66 69 67 20 2d 73    .mkr config -s
3010: 74 61 74 65 20 6e 6f 72 6d 61 6c 0a 20 20 73 65  tate normal.  se
3020: 74 20 63 6c 74 20 5b 2e 6d 6b 72 20 73 65 61 72  t clt [.mkr sear
3030: 63 68 20 2d 61 6c 6c 20 3c 20 31 2e 30 20 65 6e  ch -all < 1.0 en
3040: 64 5d 0a 20 20 73 65 74 20 63 67 74 20 5b 2e 6d  d].  set cgt [.m
3050: 6b 72 20 73 65 61 72 63 68 20 2d 61 6c 6c 20 3e  kr search -all >
3060: 20 31 2e 30 20 65 6e 64 5d 0a 20 20 66 6f 72 65   1.0 end].  fore
3070: 61 63 68 20 63 20 24 63 6c 74 20 7b 2e 6d 6b 72  ach c $clt {.mkr
3080: 20 72 65 70 6c 61 63 65 20 24 63 20 22 24 63 20   replace $c "$c 
3090: 2b 31 20 63 68 61 72 73 22 20 3e 7d 0a 20 20 66  +1 chars" >}.  f
30a0: 6f 72 65 61 63 68 20 63 20 24 63 67 74 20 7b 2e  oreach c $cgt {.
30b0: 6d 6b 72 20 72 65 70 6c 61 63 65 20 24 63 20 22  mkr replace $c "
30c0: 24 63 20 2b 31 20 63 68 61 72 73 22 20 3c 7d 0a  $c +1 chars" <}.
30d0: 20 20 2e 6d 6b 72 20 63 6f 6e 66 69 67 20 2d 73    .mkr config -s
30e0: 74 61 74 65 20 64 69 73 61 62 6c 65 64 0a 7d 0a  tate disabled.}.
30f0: 70 72 6f 63 20 73 65 61 72 63 68 4f 6e 4f 66 66  proc searchOnOff
3100: 20 7b 7d 20 7b 0a 20 20 69 66 20 7b 5b 69 6e 66   {} {.  if {[inf
3110: 6f 20 65 78 69 73 74 73 20 3a 3a 73 65 61 72 63  o exists ::searc
3120: 68 5d 7d 20 7b 0a 20 20 20 20 75 6e 73 65 74 20  h]} {.    unset 
3130: 3a 3a 73 65 61 72 63 68 0a 20 20 20 20 2e 74 78  ::search.    .tx
3140: 74 41 20 74 61 67 20 72 65 6d 6f 76 65 20 73 65  tA tag remove se
3150: 61 72 63 68 20 31 2e 30 20 65 6e 64 0a 20 20 20  arch 1.0 end.   
3160: 20 2e 74 78 74 42 20 74 61 67 20 72 65 6d 6f 76   .txtB tag remov
3170: 65 20 73 65 61 72 63 68 20 31 2e 30 20 65 6e 64  e search 1.0 end
3180: 0a 20 20 20 20 70 61 63 6b 20 66 6f 72 67 65 74  .    pack forget
3190: 20 2e 62 62 2e 73 66 72 61 6d 65 0a 20 20 20 20   .bb.sframe.    
31a0: 66 6f 63 75 73 20 2e 0a 20 20 7d 20 65 6c 73 65  focus ..  } else
31b0: 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 73 65 61   {.    set ::sea
31c0: 72 63 68 20 2e 74 78 74 41 0a 20 20 20 20 69 66  rch .txtA.    if
31d0: 20 7b 21 5b 77 69 6e 66 6f 20 65 78 69 73 74 73   {![winfo exists
31e0: 20 2e 62 62 2e 73 66 72 61 6d 65 5d 7d 20 7b 0a   .bb.sframe]} {.
31f0: 20 20 20 20 20 20 66 72 61 6d 65 20 2e 62 62 2e        frame .bb.
3200: 73 66 72 61 6d 65 0a 20 20 20 20 20 20 3a 3a 74  sframe.      ::t
3210: 74 6b 3a 3a 65 6e 74 72 79 20 2e 62 62 2e 73 66  tk::entry .bb.sf
3220: 72 61 6d 65 2e 65 20 2d 77 69 64 74 68 20 31 30  rame.e -width 10
3230: 0a 20 20 20 20 20 20 70 61 63 6b 20 2e 62 62 2e  .      pack .bb.
3240: 73 66 72 61 6d 65 2e 65 20 2d 73 69 64 65 20 6c  sframe.e -side l
3250: 65 66 74 20 2d 66 69 6c 6c 20 79 20 2d 65 78 70  eft -fill y -exp
3260: 61 6e 64 20 31 0a 20 20 20 20 20 20 62 69 6e 64  and 1.      bind
3270: 20 2e 62 62 2e 73 66 72 61 6d 65 2e 65 20 3c 52   .bb.sframe.e <R
3280: 65 74 75 72 6e 3e 20 7b 73 65 61 72 63 68 4e 65  eturn> {searchNe
3290: 78 74 3b 20 62 72 65 61 6b 7d 0a 20 20 20 20 20  xt; break}.     
32a0: 20 3a 3a 74 74 6b 3a 3a 62 75 74 74 6f 6e 20 2e   ::ttk::button .
32b0: 62 62 2e 73 66 72 61 6d 65 2e 6e 78 20 2d 74 65  bb.sframe.nx -te
32c0: 78 74 20 5c 75 32 31 39 33 20 2d 77 69 64 74 68  xt \u2193 -width
32d0: 20 31 20 2d 63 6f 6d 6d 61 6e 64 20 73 65 61 72   1 -command sear
32e0: 63 68 4e 65 78 74 0a 20 20 20 20 20 20 3a 3a 74  chNext.      ::t
32f0: 74 6b 3a 3a 62 75 74 74 6f 6e 20 2e 62 62 2e 73  tk::button .bb.s
3300: 66 72 61 6d 65 2e 70 76 20 2d 74 65 78 74 20 5c  frame.pv -text \
3310: 75 32 31 39 31 20 2d 77 69 64 74 68 20 31 20 2d  u2191 -width 1 -
3320: 63 6f 6d 6d 61 6e 64 20 73 65 61 72 63 68 50 72  command searchPr
3330: 65 76 0a 20 20 20 20 20 20 74 6b 5f 6f 70 74 69  ev.      tk_opti
3340: 6f 6e 4d 65 6e 75 20 2e 62 62 2e 73 66 72 61 6d  onMenu .bb.sfram
3350: 65 2e 74 79 70 20 3a 3a 73 65 61 72 63 68 5f 74  e.typ ::search_t
3360: 79 70 65 20 5c 0a 20 20 20 20 20 20 20 20 20 20  ype \.          
3370: 20 45 78 61 63 74 20 7b 4e 6f 20 43 61 73 65 7d   Exact {No Case}
3380: 20 7b 52 65 67 45 78 70 7d 20 7b 57 68 6f 6c 65   {RegExp} {Whole
3390: 20 57 6f 72 64 7d 0a 20 20 20 20 20 20 2e 62 62   Word}.      .bb
33a0: 2e 73 66 72 61 6d 65 2e 74 79 70 20 63 6f 6e 66  .sframe.typ conf
33b0: 69 67 20 2d 77 69 64 74 68 20 31 30 0a 20 20 20  ig -width 10.   
33c0: 20 20 20 73 65 74 20 3a 3a 73 65 61 72 63 68 5f     set ::search_
33d0: 74 79 70 65 20 45 78 61 63 74 0a 20 20 20 20 20  type Exact.     
33e0: 20 70 61 63 6b 20 2e 62 62 2e 73 66 72 61 6d 65   pack .bb.sframe
33f0: 2e 6e 78 20 2e 62 62 2e 73 66 72 61 6d 65 2e 70  .nx .bb.sframe.p
3400: 76 20 2e 62 62 2e 73 66 72 61 6d 65 2e 74 79 70  v .bb.sframe.typ
3410: 20 2d 73 69 64 65 20 6c 65 66 74 0a 20 20 20 20   -side left.    
3420: 7d 0a 20 20 20 20 70 61 63 6b 20 2e 62 62 2e 73  }.    pack .bb.s
3430: 66 72 61 6d 65 20 2d 73 69 64 65 20 6c 65 66 74  frame -side left
3440: 0a 20 20 20 20 61 66 74 65 72 20 69 64 6c 65 20  .    after idle 
3450: 7b 66 6f 63 75 73 20 2e 62 62 2e 73 66 72 61 6d  {focus .bb.sfram
3460: 65 2e 65 7d 0a 20 20 7d 0a 7d 0a 70 72 6f 63 20  e.e}.  }.}.proc 
3470: 73 65 61 72 63 68 4e 65 78 74 20 7b 7d 20 7b 73  searchNext {} {s
3480: 65 61 72 63 68 53 74 65 70 20 2d 66 6f 72 77 61  earchStep -forwa
3490: 72 64 73 20 2b 31 20 31 2e 30 20 65 6e 64 7d 0a  rds +1 1.0 end}.
34a0: 70 72 6f 63 20 73 65 61 72 63 68 50 72 65 76 20  proc searchPrev 
34b0: 7b 7d 20 7b 73 65 61 72 63 68 53 74 65 70 20 2d  {} {searchStep -
34c0: 62 61 63 6b 77 61 72 64 73 20 2d 31 20 65 6e 64  backwards -1 end
34d0: 20 31 2e 30 7d 0a 70 72 6f 63 20 73 65 61 72 63   1.0}.proc searc
34e0: 68 53 74 65 70 20 7b 64 69 72 65 63 74 69 6f 6e  hStep {direction
34f0: 20 69 6e 63 72 20 73 74 61 72 74 20 73 74 6f 70   incr start stop
3500: 7d 20 7b 0a 20 20 73 65 74 20 70 61 74 74 65 72  } {.  set patter
3510: 6e 20 5b 2e 62 62 2e 73 66 72 61 6d 65 2e 65 20  n [.bb.sframe.e 
3520: 67 65 74 5d 0a 20 20 69 66 20 7b 24 70 61 74 74  get].  if {$patt
3530: 65 72 6e 3d 3d 22 22 7d 20 72 65 74 75 72 6e 0a  ern==""} return.
3540: 20 20 73 65 74 20 63 6f 75 6e 74 20 30 0a 20 20    set count 0.  
3550: 73 65 74 20 77 20 24 3a 3a 73 65 61 72 63 68 0a  set w $::search.
3560: 20 20 69 66 20 7b 22 24 77 22 3d 3d 22 2e 74 78    if {"$w"==".tx
3570: 74 41 22 7d 20 7b 73 65 74 20 6f 74 68 65 72 20  tA"} {set other 
3580: 2e 74 78 74 42 7d 20 7b 73 65 74 20 6f 74 68 65  .txtB} {set othe
3590: 72 20 2e 74 78 74 41 7d 0a 20 20 69 66 20 7b 5b  r .txtA}.  if {[
35a0: 6c 73 65 61 72 63 68 20 5b 24 77 20 6d 61 72 6b  lsearch [$w mark
35b0: 20 6e 61 6d 65 73 5d 20 73 65 61 72 63 68 5d 3c   names] search]<
35c0: 30 7d 20 7b 0a 20 20 20 20 24 77 20 6d 61 72 6b  0} {.    $w mark
35d0: 20 73 65 74 20 73 65 61 72 63 68 20 24 73 74 61   set search $sta
35e0: 72 74 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 20  rt.  }.  switch 
35f0: 24 3a 3a 73 65 61 72 63 68 5f 74 79 70 65 20 7b  $::search_type {
3600: 0a 20 20 20 20 45 78 61 63 74 20 20 20 20 20 20  .    Exact      
3610: 20 20 7b 73 65 74 20 73 74 20 2d 65 78 61 63 74    {set st -exact
3620: 7d 0a 20 20 20 20 7b 4e 6f 20 43 61 73 65 7d 20  }.    {No Case} 
3630: 20 20 20 7b 73 65 74 20 73 74 20 2d 6e 6f 63 61     {set st -noca
3640: 73 65 7d 0a 20 20 20 20 7b 52 65 67 45 78 70 7d  se}.    {RegExp}
3650: 20 20 20 20 20 7b 73 65 74 20 73 74 20 2d 72 65       {set st -re
3660: 67 65 78 70 7d 0a 20 20 20 20 7b 57 68 6f 6c 65  gexp}.    {Whole
3670: 20 57 6f 72 64 7d 20 7b 73 65 74 20 73 74 20 2d   Word} {set st -
3680: 72 65 67 65 78 70 3b 20 73 65 74 20 70 61 74 74  regexp; set patt
3690: 65 72 6e 20 5c 5c 79 24 70 61 74 74 65 72 6e 5c  ern \\y$pattern\
36a0: 5c 79 7d 0a 20 20 7d 0a 20 20 73 65 74 20 69 64  \y}.  }.  set id
36b0: 78 20 5b 24 77 20 73 65 61 72 63 68 20 2d 63 6f  x [$w search -co
36c0: 75 6e 74 20 63 6f 75 6e 74 20 24 64 69 72 65 63  unt count $direc
36d0: 74 69 6f 6e 20 24 73 74 20 2d 2d 20 5c 0a 20 20  tion $st -- \.  
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 24 70 61 74              $pat
36f0: 74 65 72 6e 20 22 73 65 61 72 63 68 20 24 69 6e  tern "search $in
3700: 63 72 20 63 68 61 72 73 22 20 24 73 74 6f 70 5d  cr chars" $stop]
3710: 0a 20 20 69 66 20 7b 22 24 69 64 78 22 3d 3d 22  .  if {"$idx"=="
3720: 22 7d 20 7b 0a 20 20 20 20 73 65 74 20 69 64 78  "} {.    set idx
3730: 20 5b 24 6f 74 68 65 72 20 73 65 61 72 63 68 20   [$other search 
3740: 2d 63 6f 75 6e 74 20 63 6f 75 6e 74 20 24 64 69  -count count $di
3750: 72 65 63 74 69 6f 6e 20 24 73 74 20 2d 2d 20 24  rection $st -- $
3760: 70 61 74 74 65 72 6e 20 24 73 74 61 72 74 20 24  pattern $start $
3770: 73 74 6f 70 5d 0a 20 20 20 20 69 66 20 7b 22 24  stop].    if {"$
3780: 69 64 78 22 21 3d 22 22 7d 20 7b 0a 20 20 20 20  idx"!=""} {.    
3790: 20 20 73 65 74 20 74 68 69 73 20 24 77 0a 20 20    set this $w.  
37a0: 20 20 20 20 73 65 74 20 77 20 24 6f 74 68 65 72      set w $other
37b0: 0a 20 20 20 20 20 20 73 65 74 20 6f 74 68 65 72  .      set other
37c0: 20 24 74 68 69 73 0a 20 20 20 20 7d 20 65 6c 73   $this.    } els
37d0: 65 20 7b 0a 20 20 20 20 20 20 73 65 74 20 69 64  e {.      set id
37e0: 78 20 5b 24 77 20 73 65 61 72 63 68 20 2d 63 6f  x [$w search -co
37f0: 75 6e 74 20 63 6f 75 6e 74 20 24 64 69 72 65 63  unt count $direc
3800: 74 69 6f 6e 20 24 73 74 20 2d 2d 20 24 70 61 74  tion $st -- $pat
3810: 74 65 72 6e 20 24 73 74 61 72 74 20 24 73 74 6f  tern $start $sto
3820: 70 5d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 24  p].    }.  }.  $
3830: 77 20 74 61 67 20 72 65 6d 6f 76 65 20 73 65 61  w tag remove sea
3840: 72 63 68 20 31 2e 30 20 65 6e 64 0a 20 20 24 77  rch 1.0 end.  $w
3850: 20 6d 61 72 6b 20 75 6e 73 65 74 20 73 65 61 72   mark unset sear
3860: 63 68 0a 20 20 24 6f 74 68 65 72 20 74 61 67 20  ch.  $other tag 
3870: 72 65 6d 6f 76 65 20 73 65 61 72 63 68 20 31 2e  remove search 1.
3880: 30 20 65 6e 64 0a 20 20 24 6f 74 68 65 72 20 6d  0 end.  $other m
3890: 61 72 6b 20 75 6e 73 65 74 20 73 65 61 72 63 68  ark unset search
38a0: 0a 20 20 69 66 20 7b 22 24 69 64 78 22 21 3d 22  .  if {"$idx"!="
38b0: 22 7d 20 7b 0a 20 20 20 20 24 77 20 6d 61 72 6b  "} {.    $w mark
38c0: 20 73 65 74 20 73 65 61 72 63 68 20 24 69 64 78   set search $idx
38d0: 0a 20 20 20 20 24 77 20 79 76 69 65 77 20 2d 70  .    $w yview -p
38e0: 69 63 6b 70 6c 61 63 65 20 24 69 64 78 0a 20 20  ickplace $idx.  
38f0: 20 20 24 77 20 74 61 67 20 61 64 64 20 73 65 61    $w tag add sea
3900: 72 63 68 20 73 65 61 72 63 68 20 22 24 69 64 78  rch search "$idx
3910: 20 2b 24 63 6f 75 6e 74 20 63 68 61 72 73 22 0a   +$count chars".
3920: 20 20 20 20 24 77 20 74 61 67 20 63 6f 6e 66 69      $w tag confi
3930: 67 20 73 65 61 72 63 68 20 2d 62 61 63 6b 67 72  g search -backgr
3940: 6f 75 6e 64 20 7b 23 66 63 63 30 30 30 7d 0a 20  ound {#fcc000}. 
3950: 20 7d 0a 20 20 73 65 74 20 3a 3a 73 65 61 72 63   }.  set ::searc
3960: 68 20 24 77 0a 7d 0a 3a 3a 74 74 6b 3a 3a 62 75  h $w.}.::ttk::bu
3970: 74 74 6f 6e 20 2e 62 62 2e 71 75 69 74 20 2d 74  tton .bb.quit -t
3980: 65 78 74 20 7b 51 75 69 74 7d 20 2d 63 6f 6d 6d  ext {Quit} -comm
3990: 61 6e 64 20 65 78 69 74 0a 3a 3a 74 74 6b 3a 3a  and exit.::ttk::
39a0: 62 75 74 74 6f 6e 20 2e 62 62 2e 69 6e 76 65 72  button .bb.inver
39b0: 74 20 2d 74 65 78 74 20 7b 49 6e 76 65 72 74 7d  t -text {Invert}
39c0: 20 2d 63 6f 6d 6d 61 6e 64 20 69 6e 76 65 72 74   -command invert
39d0: 44 69 66 66 0a 3a 3a 74 74 6b 3a 3a 62 75 74 74  Diff.::ttk::butt
39e0: 6f 6e 20 2e 62 62 2e 73 61 76 65 20 2d 74 65 78  on .bb.save -tex
39f0: 74 20 7b 53 61 76 65 20 41 73 2e 2e 2e 7d 20 2d  t {Save As...} -
3a00: 63 6f 6d 6d 61 6e 64 20 73 61 76 65 44 69 66 66  command saveDiff
3a10: 0a 3a 3a 74 74 6b 3a 3a 62 75 74 74 6f 6e 20 2e  .::ttk::button .
3a20: 62 62 2e 73 65 61 72 63 68 20 2d 74 65 78 74 20  bb.search -text 
3a30: 7b 53 65 61 72 63 68 7d 20 2d 63 6f 6d 6d 61 6e  {Search} -comman
3a40: 64 20 73 65 61 72 63 68 4f 6e 4f 66 66 0a 70 61  d searchOnOff.pa
3a50: 63 6b 20 2e 62 62 2e 71 75 69 74 20 2e 62 62 2e  ck .bb.quit .bb.
3a60: 69 6e 76 65 72 74 20 2d 73 69 64 65 20 6c 65 66  invert -side lef
3a70: 74 0a 69 66 20 7b 24 66 6f 73 73 69 6c 63 6d 64  t.if {$fossilcmd
3a80: 21 3d 22 22 7d 20 7b 70 61 63 6b 20 2e 62 62 2e  !=""} {pack .bb.
3a90: 73 61 76 65 20 2d 73 69 64 65 20 6c 65 66 74 7d  save -side left}
3aa0: 0a 70 61 63 6b 20 2e 62 62 2e 66 69 6c 65 73 20  .pack .bb.files 
3ab0: 2e 62 62 2e 73 65 61 72 63 68 20 2d 73 69 64 65  .bb.search -side
3ac0: 20 6c 65 66 74 0a 67 72 69 64 20 72 6f 77 63 6f   left.grid rowco
3ad0: 6e 66 69 67 75 72 65 20 2e 20 31 20 2d 77 65 69  nfigure . 1 -wei
3ae0: 67 68 74 20 31 0a 67 72 69 64 20 63 6f 6c 75 6d  ght 1.grid colum
3af0: 6e 63 6f 6e 66 69 67 75 72 65 20 2e 20 31 20 2d  nconfigure . 1 -
3b00: 77 65 69 67 68 74 20 31 0a 67 72 69 64 20 63 6f  weight 1.grid co
3b10: 6c 75 6d 6e 63 6f 6e 66 69 67 75 72 65 20 2e 20  lumnconfigure . 
3b20: 34 20 2d 77 65 69 67 68 74 20 31 0a 67 72 69 64  4 -weight 1.grid
3b30: 20 2e 62 62 20 2d 72 6f 77 20 30 20 2d 63 6f 6c   .bb -row 0 -col
3b40: 75 6d 6e 73 70 61 6e 20 36 0a 65 76 61 6c 20 67  umnspan 6.eval g
3b50: 72 69 64 20 5b 63 6f 6c 73 5d 20 2d 72 6f 77 20  rid [cols] -row 
3b60: 31 20 2d 73 74 69 63 6b 79 20 6e 73 65 77 0a 67  1 -sticky nsew.g
3b70: 72 69 64 20 2e 73 62 79 20 2d 72 6f 77 20 31 20  rid .sby -row 1 
3b80: 2d 63 6f 6c 75 6d 6e 20 35 20 2d 73 74 69 63 6b  -column 5 -stick
3b90: 79 20 6e 73 0a 67 72 69 64 20 2e 73 62 78 41 20  y ns.grid .sbxA 
3ba0: 2d 72 6f 77 20 32 20 2d 63 6f 6c 75 6d 6e 73 70  -row 2 -columnsp
3bb0: 61 6e 20 32 20 2d 73 74 69 63 6b 79 20 65 77 0a  an 2 -sticky ew.
3bc0: 67 72 69 64 20 2e 73 70 61 63 65 72 20 2d 72 6f  grid .spacer -ro
3bd0: 77 20 32 20 2d 63 6f 6c 75 6d 6e 20 32 0a 67 72  w 2 -column 2.gr
3be0: 69 64 20 2e 73 62 78 42 20 2d 72 6f 77 20 32 20  id .sbxB -row 2 
3bf0: 2d 63 6f 6c 75 6d 6e 20 33 20 2d 63 6f 6c 75 6d  -column 3 -colum
3c00: 6e 73 70 61 6e 20 32 20 2d 73 74 69 63 6b 79 20  nspan 2 -sticky 
3c10: 65 77 0a 0a 2e 73 70 61 63 65 72 20 63 6f 6e 66  ew...spacer conf
3c20: 69 67 20 2d 68 65 69 67 68 74 20 5b 77 69 6e 66  ig -height [winf
3c30: 6f 20 68 65 69 67 68 74 20 2e 73 62 78 41 5d 0a  o height .sbxA].
3c40: 77 6d 20 64 65 69 63 6f 6e 69 66 79 20 2e 0a 7d  wm deiconify ..}
3c50: 0a 65 76 61 6c 20 24 70 72 6f 67 0a              .eval $prog.