	pro edit_event, ev

widget_control, ev.id, get_uval = uv
widget_control, ev.top, get_uval = ID
widget_control, ID.Menubase, get_uval = text

widget_control, ID.TimeLabel, set_val = strmid(systime(), 11, 5)

IF TAG_NAMES(ev, /STRUCTURE_NAME) EQ 'WIDGET_TIMER' THEN return

	CASE uv OF

'Done': widget_control, ev.top, /dest

'Save As':	begin

file = pickfile(filt=ID.Filt, /write, file = ID.File, path = subdir(ID.File))
if file eq '' then return

openw, lun, file, /get
for j=0, n_elements(text)-1 do printf, lun, text(j)
free_lun, lun

name = (name_extract(file))(0)

widget_control, ID.Label, set_val = 'File '+name+' saved at '+strmid(systime(), 11, 5)

	end

'Save':	begin

if ID.File eq '' then return

openw, lun, ID.file, /get
for j=0, n_elements(text)-1 do printf, lun, text(j)
free_lun, lun

name = (name_extract(ID.file))(0)

widget_control, ID.Label, set_val = 'File '+name+' saved at '+strmid(systime(), 11, 5)

	end


'Open':	begin

file = pickfile(filt=ID.Filt, /read)
if file eq '' then return

ID.File = file

text = readform(file)

widget_control, ID.Text, set_val = text

name = (name_extract(ID.file))(0)

widget_control, ID.Label, set_val = 'File: '+name
widget_control,  ID.Edit, sens = 1
	end

'Text':	begin

;KBRD_FOCUS_EVENTS, TEXT_ALL_EVENTS, TEXT_EDITABLE, TEXT_NUMBER,
;TEXT_OFFSET_TO_XY, TEXT_SELECT, TEXT_TOP_LINE, TEXT_XY_TO_OFFSET.


widget_control, ev.id, get_val = text
number = widget_info(ev.id, /text_number)

Ntext = n_elements(text)

Len = long(total(strlen(text) + 1, /cum))

NLine = (where(Len gt ev.offset))(0)
if NLine eq -1 then Nline = Ntext
Ncolumn = ev.offset-Len(NLine-1>0) > 0
if Nline eq 0 then Ncolumn = ev.offset

widget_control, ID.Line_number, set_val = $
	string(Nline, Ncolumn, format = '("Line: ", i5, ",  Column: ", i5)')

widget_control,  ID.Edit, sens = 1

	end

'Find':	begin

xinput, frag, tit = 'Enter search substring'

Ntext = n_elements(text)

	for j = 0, Ntext-1 do begin
if j eq 0 then bytetext = [byte(text(j))] else bytetext = [bytetext, byte(text(j))]
	endfor

bytetext = byte(text)

;help, bytetext
bytetext = reform(bytetext, n_elements(bytetext))

bytetext = bytetext(where(bytetext ne 0))

bytefrag = byte(frag)

Length = n_elements(bytefrag)

ind = where(bytetext eq bytefrag(0))


Ntext = n_elements(text)

Len = long(total(strlen(text) + 1, /cum))

;NLine = (where(Len gt ev.offset))(0)
;if NLine eq -1 then Nline = Ntext

	if ind(0) lt 0 then a = widget_message(/info, 'Not found') else begin

nind = n_elements(ind)

	for j=0, nind-1 do begin

if equiv(bytefrag, bytetext(ind(j):ind(j)+Length-1)) then begin

Nline = (where(Len gt ind(j)))(0)

widget_control, ID. Text, set_text_select = [ind(j)+NLine, Length]


;widget_control, ID. Text, set_text_select = [ind(j), Length]


print, string(bytetext(ind(j):ind(j)+Length-1))

return
endif

	endfor

	endelse

	end

'Wrap':	begin

if ev.select eq 1 then text = short_string(text, ID.Length)
widget_control, ID. Text, set_val = text
	end

'Length': begin

widget_control, ID.Length_Input, get_val = tmp

ID.Length = fix(tmp(0))

widget_control, ID.Length_Input, set_val = strtrim(ID.Length,2)

	end

	ELSE:

	ENDCASE

	if uv ne 'Done' then begin
widget_control, ev.top, set_uval = ID
widget_control, ID.Menubase, set_uval = text
	endif

	end


	pro edit

ID = {Menubase:0L, Text:0L, file:'', filt: './*', Label:0L, TimeLabel:0L, $
	Line_number:0L, Edit:0L, Find:0L, Wrap:0, Length_Input:0L, Length:80}

text = ''

; widget_info:
;KBRD_FOCUS_EVENTS, TEXT_ALL_EVENTS, TEXT_EDITABLE, TEXT_NUMBER,
;TEXT_OFFSET_TO_XY, TEXT_SELECT, TEXT_TOP_LINE, TEXT_XY_TO_OFFSET.


font = '-b&h-lucida bright-demibold-r-normal--14-140-72-72-p-84-iso8859-1'
font = '-adobe-courier-bold-r-normal--14-140-75-75-m-90-iso8859-1'

if strlowcase(strmid(!version.OS, 0, 3)) eq 'win' then font = ''

mainbase = widget_base(/colu, tit = 'Text editor')

ID.Menubase = widget_base(mainbase, /row)

button = widget_button(ID.Menubase, val = 'Done', uval = 'Done')
button = widget_button(ID.Menubase, val = 'File', /menu)
	button1 = widget_button(button, val = 'Open', uval = 'Open')
	button1 = widget_button(button, val = 'Save', uval = 'Save')
	button1 = widget_button(button, val = 'Save As', uval = 'Save As')

nonexcl_base = widget_base(ID.Menubase, /row, /nonexcl)

button = widget_button(nonexcl_base, val = 'Wrap', uval = 'Wrap')

ID.Length_Input = widget_text(ID.Menubase, /edit, xsiz = 5, ysiz = 1, /fra, $
	val = strtrim(ID.Length,2), uval = 'Length')


ID.Edit = widget_button(ID.Menubase, val = 'Edit', /menu)
	button1 = widget_button(ID.Edit, val = 'Find', uval = 'Find')

ID.Find = widget_text(ID.Menubase, /edit, /fra, xs = 20, ys = 1, uval = 'Find_Input')

ID.Label = widget_label(ID.Menubase, val = 'No file', /dynam, /frame)

ID.TimeLabel = widget_label(ID.Menubase, val = strmid(systime(), 11, 5),  /frame)

device, get_scr = scr

ID.Text = widget_text(mainbase, /edit, /fra, xs = 100, ys = 40, uval = 'Text', /scroll, $
	/all_eve, font = font) ;, /KBRD_FOCUS_EVENTS)

ID.Line_number = widget_Label(mainbase, /dynam, /frame)

widget_control, mainbase, /real

widget_control,  mainbase, set_uval = ID, timer =60.
widget_control,  ID.Menubase, set_uval = text
widget_control,  ID.Text, /input
widget_control,  ID.Edit, sens = 0

xmanager, 'edit', mainbase, /no_block

	end