Code archives/BlitzPlus Gui/Text editor
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Text editor for Blitz+. I dropped this project. It works but I have no use for it at this moment. | |||||
; Blue text editor by Crom Design 2004 ; ; Blue ; ; Note - The data array can not be accessed directly without using the line pointer function bluelinenum(num) ; This is becourse large text files (1gb) and so on tend to be a bottleneck on the processor while ; editing... (Not implemented yet in this version but will be in later versions unless I find a better method) ; ; Current Implementations : ;Ctrl + Page Down ;Alt+F4 ;Data array adjusts to size of text file. ;Mouse press aligns cursor (single/multi line) ;Line numbering (optional and dynamic) / Buffered ;Del ;Commandline file loading (limited to 40 lines 72 chars wide) ;Mouse Line Select ;Backspace ;Home ;End ;Ctrl + Cursor Right ;Ctrl + Cursor Left ;Shift + Cursor Right ;Shift + Cursor Left ;Shift + Ctrl + Cursor Right ;Shift + Ctrl + Cursor Left ;Page Up ;Page Down ;Ctrl + Home ;Ctrl + End ;Cursor Up ;Cursor Down ;Enter/Return ;Ctrl + C (Single line) ;Ctrl + V (Single Line) ;Loadtext ;Insert/Overwrite ;Insert/Overwrite cursor ;Single line Tab insert (non structured) ;Adjusts to startup resolution ; not finished : ; Bugs!!! : ; Fix addition to cursor on line mouse exit ; Fix Mouse line/row selection (line gets reset to zero, check collision) ; ; Special Edit (vertical Selection) ; Shift + Tab ; Internal Tab handling ; Multiple Line Select ; Tab Multiple Lines ; Shift + Tab multiple Lines + optimalization ; Ctrl + C (Multi line) ; Ctrl + V (Multi line) ; Ctrl + X (Single Line/Multi line) ; Italic/Bold/Underline ; Enter + Splitline ; Mouse to Character collision ; Mouse Selection Automation ; Text Folding ; Folding interface + Hotkeys ; Colored Text ; Inline Icons ; Popup menu ; Auto Completion (list or shaded preview) ; Current Line expand to Visual console ; Horizontal and Vertical Scrollbars ; Data structure optimalization ; Config file based Parsing system ; Save Text ; Sorting routines ; Find/Replace core routines ; Double click keys (Ctrl/shift/Alt) ; Font support ; Dynamic multiple font support ; Inline Images or Ontop Images ; Edit Statistics ; Text Statistics ; Image Buffering ; Global ww = 800 Global wh = 600 ; active line colors Global bluevisualsactive = True Global blueactiveliner = 20 Global blueactivelineg = 100 Global blueactivelineb = 180 Global blueactivelinefr = 240 Global blueactivelinefg = 240 Global blueactivelinefb = 240 Global blueactivelinesr = 190 Global blueactivelinesg = 130 Global blueactivelinesb = 90 ; txt area background color Global bluebackcolorr = 0 Global bluebackcolorg = 76 Global bluebackcolorb = 150 ; txt area main color Global bluetextcolorr = 240 Global bluetextcolorg = 240 Global bluetextcolorb = 240 ; line numbering colors Global bluelinenumberbr = 0 ; line numbering background colors Global bluelinenumberbg =60 Global bluelinenumberbb = 120 ; line numbers Global bluelinenumbertr = 180 Global bluelinenumbertg = 180 Global bluelinenumbertb = 180 ;Global editor interactive controllers Global bluepagedownscroll Global bluepageupscroll Global bluectrlpagedownscroll Global bluectrlpageupscroll Global linecounter = 0 Const bluedefaulttabsize = 4 Global blueinsertmode = False Global bluelinenumberwidth = 32 Global bluelinenumbervisible = True ; Line numbers Disable Enable Global bluelinenumberimagebuffer = CreateImage(bluelinenumberwidth,wh) Global bluelinenumberupdate = True ; false means do not redraw the line number bar Global bluecursorcolorr = 255 Global bluecursorcolorg = 255 Global bluecursorcolorb = 255 Global blueinsertcursorcolorr = 255 Global blueinsertcursorcolorg = 255 Global blueinsertcursorcolorb = 255 Global bluelinecopybuffer$ ="" ;line edit return commands Const bluecloseapp = -99 Const bluepageup = -100 Const bluepagedown = -101 Const bluectrlend = -102 Const bluectrlhome = -103 Global bluenumlines = 140 ; max num of lines Const bluepointers = 64 Dim blue$(bluenumlines,bluepointers) Const blueactive = 0 Const bluec = 1 Const bluecursortimer = 2 Const bluecursortimerdelay = 3 Const blueshowcursor = 4 Const bluecursorpos = 5 Const blueselstart = 6 Const blueselend = 7 Const blueselactive = 8 Const blueinvselstart = 9 Const blueinvselactive = 10 Const blueshiftactive = 11 Const bluectrlactive = 12 Const bluecopybuffer = 13 Const bluec_back = 14 Const bluec_front = 15 Const bluehastab = 16 Const bluehascolor = 17 Const bluehasunderline = 18 Const bluehasbold = 19 Const bluehasitalic = 20 Const bluehasicon = 21 Const bluehasmultiplefonts = 22 Const bluetabmodifier = 23 Const blueabsfontheight = 24 ;Cursor mouse interaction Global bluecursorx = 0 Global bluecursory = 0 Global bluecursorupdate = False ;buffering Global bluelinenumimagebuffer = CreateImage(bluelinenumberwidth,32) bufferlinenumbers ; make one image buffer ; Ask for mode ;If FileType("back.bmp") <> 1 Then RuntimeError "cannot find back.bmp" Global backimage = CreateImage(ww,wh) ;Global backimage = LoadImage("back.bmp") ;MaskImage backimage,0,0,0 Const blue_tab = 9 Global mx Global my Global bluelinewidth = 72 ; Blue Core gadgets Global lineareawin Global lineareacan Global backcan root$ = CurrentDir() file$ = root$ + "welcome.txt" ;If FileType(file$) = 1 Then blueloadtext(root$+"welcome.txt") ;If FileType(file$) = 1 Then blueloadtext(root$+"edit.bb") If FileType(CommandLine()) = 1 Then blueloadtext(CommandLine()) ; a>AAAArewrjewrjlewkjr - < < readmakebackdata blue_ed(ww,wh,Desktop()) End Function blue_ed(w,h,parent) ; main edit loop cx = GadgetWidth(parent)/2-w/2 cy = GadgetHeight(parent)/2-h/2 Local win = CreateWindow("Blue - Beta version march2004 - Crom Design",cx,cy,w,h,parent,1) Local can = CreateCanvas(0,0,w,h,win) lineareawin = CreateWindow("",0,0,w,32,win,32) backcan = CreateCanvas(0,0,w,32,lineareawin) : SetBuffer CanvasBuffer(backcan) : ClsColor blueactiveliner,blueactivelineg,blueactivelineb:Cls Local canvasoffsety = ClientHeight(can)-ClientHeight(win)-2 ; Fix for XP and Standard Windows interface ;RuntimeError canvasoffsety Local we ;event Local prevline = 0 ; make global Local scrolldown = False Local scrollup = False Local cursorontop = False Local cursoronbottom = False SetBuffer CanvasBuffer(can) ClsColor bluebackcolorr,bluebackcolorg,bluebackcolorb:Cls tm = CreateTimer(30) SetBuffer CanvasBuffer(can) Cls Color 240,240,240 DrawImage backimage,GadgetWidth(can)/2-ImageWidth(backimage)/2,0 drawblue(can,linecounter) FlipCanvas(can) ma = 0 fh = FontHeight() While we<>$803 we = WaitEvent() Select we Case $101 ;- Key down Case $102 ;- Key up If EventData() = 1 Then Exit Case $103 ;- Key stroke Case $201 ;- Mouse down Case $202 ;- Mouse up ;ma = (EventY()/fh)+linecounter Case $203 ;- Mouse move mx = EventX():my = EventY() Case $204 ;- Mouse wheel Case $205 ;- Mouse enter Case $206 ;- Mouse leave Case $401 ;- Gadget action Case $801 ;- Window move ;SetGadgetShape win,GadgetX(parent)+20,GadgetY(parent+22),GadgetWidth(win),GadgetHeight(win) Case $802 ;- Window size Case $803 ;- Window close Case $804 ;- Window activate Case $1001 ;- Menu event Case $2001 ;- App suspend Case $2002 ;- App resume Case $2003 ;- App Display Change Case $2004 ;- App Begin Modal Case $2005 ;- App End Modal Case $4001 ;- Timer tick ; Editor active If ma > -1 Then prevline = ma DebugLog (ma-linecounter)*fh ma = blueline(win,blue(ma,bluec),ma,(ma-linecounter)*fh+canvasoffsety) SetBuffer CanvasBuffer(can) ;SetGadgetText win,"Maxlines : " + bluenumlines + " ma : " + ma + " prevline : " + prevline + " linecounter : " + linecounter ; Line feedback handler Select ma ; trap/translate global commands Case bluecloseapp End Case bluepageup st = prevline - linecounter tp = bluemaxvislines(can)-1 If prevline - tp > 0 Then If st = tp Then ; bottom up ma = linecounter Else ; top up If linecounter - tp-1 > 0 Then linecounter = linecounter - (tp-1) If st = 0 Then ; if on top of page ma = linecounter-1 Else ; if in the middle ma = linecounter End If End If End If Else ; if near top then set to top ma = 0 : linecounter = 0 End If Case bluepagedown ; ma = linecounter sval = 10;bluectrlpagedownscroll st = prevline - linecounter tp = bluemaxvislines(can)-1 If prevline + tp < bluenumlines-tp Then If st = tp Then ; bottom down If bluecontrolispressed() Then ; if control ma = prevline + sval + 1 linecounter = linecounter + sval+1 Else ma = prevline + tp + 1 linecounter = prevline - 1 EndIf Else ; top down If linecounter + tp-1 < bluenumlines Then If st = 0 Then ; if on bottom of page If bluecontrolispressed() Then ; if control ma = prevline + sval Else ma = tp + st If linecounter > 0 Then linecounter = linecounter + st : ma = linecounter + tp End If Else ; if in the middle If bluecontrolispressed() Then ; if control is pressed ;linecounter = prevline ma = prevline + sval;tp Else ; if not linecounter = prevline ma = prevline + tp End If End If End If End If Else ; if near bottom then set bottom to top ma = bluenumlines : linecounter = bluenumlines-tp End If Case bluectrlhome ma = 0 linecounter = 0 bluelinenumberupdate = True Case bluectrlend ma = bluenumlines linecounter = bluenumlines+1 - bluemaxvislines(can) ;DebugLog ma ;DebugLog linecounter bluelinenumberupdate = True End Select ; Bounding If ma>bluenumlines Then ma = bluenumlines ; Text single line scrolling If ma>-1 Then If ma-linecounter => bluemaxvislines(can) And ma>prevline And ma< bluenumlines+1 Then ; down cursoronbottom = True ma = bluemaxvislines(can) + linecounter linecounter = linecounter + 1 scrolldown= True : scrollup = False End If If ma < prevline And linecounter > 0 And cursorontop = True Then ; up linecounter = linecounter - 1 If linecounter < 0 Then linecounter = 0 scrollup = True : scrolldown = False End If If scrolldown = True Then bluelinenumberupdate = True If scrollup = True Then bluelinenumberupdate = True If ma = -1 And scrolldown = True Then ma = bluenumlines : scrolldown = False If ma =< linecounter Then cursorontop = True Else cursorontop = False If ma-linecounter => bluemaxvislines(can) Then cursoronbottom = True Else cursoronbottom = False End If If ma = -1 Then ma = prevline SetBuffer CanvasBuffer(can) Cls ; Background image DrawImage backimage,GadgetWidth(can)/2-ImageWidth(backimage)/2,0 ; Draw the text drawblue(can,linecounter) FlipCanvas(can) End If End Select Wend End Function Function bluemaxvislines(can) ; return max vis lines on screen a = ((GadgetHeight(can)-13) / FontHeight()-3) If a > bluenumlines Then a = bluenumlines+1 Return a End Function Function linewidth(num) ; core l = Len(blue(num,bluec)) End Function Function drawblue(can,start) ; draw the text ; ms = MilliSecs() fh = FontHeight() ch = bluemaxvislines(can) cnt = start y = 0 ;set default color Color bluetextcolorr,bluetextcolorg,bluetextcolorb While y < ch If cnt=<bluenumlines bluedrawtext(x,y*fh,cnt,can) ;Rect x,y*fh,x+32,y+fh ; line numbering ; If blue(cnt,bluehastab) Then ; bluetexttab x,y*fh,blue(cnt,bluec) ; Else ; Text x,y*fh,blue(cnt,bluec) ; End If End If cnt=cnt+1 y=y+1 Wend If bluelinenumbervisible = True Then DrawBlock bluelinenumberimagebuffer,x,0 bluelinenumberupdate = False ;RuntimeError MilliSecs()-ms End Function Function bluedrawtext(x,y,num,can = 0, norules = False) Local hastab If norules = False Then If bluelinenumbervisible = True Then mod1 = blueLinenumberwidth End If If blue(num,bluehastab) = True Then hastab = True If can > 0 Then drawlinenumbering(x,y,num,can) End If If hastab = True Then bluetexttab x+mod1,y,blue(num,bluec) Else Text x+mod1,y,blue(num,bluec) End If End Function Function drawlinenumbering(x,y,num,can) If can = 0 Then Return If bluelinenumberupdate = False Then Return If bluelinenumbervisible = False Then Return SetBuffer ImageBuffer(bluelinenumberimagebuffer) ro = ColorRed() go = ColorGreen() bo = ColorBlue If Int(blue(num,blueabsfontheight)) = 0 Then fh = FontHeight() Else fh = blue(num,blueabsfontheight) Local tempthing = bluelinenumimagebuffer;CreateImage(bluelinenumberwidth,fh) ;SetBuffer ImageBuffer(bluelinenumberimagebuffer) ; Buffer this ; shaded color adjustement If bluevisualsactive = True Then ; DrawBlock tempthing,x,y+1 Else Color bluelinenumberbr,bluelinenumberbg,bluelinenumberbb Rect x,y+1,x+bluelinenumberwidth,y+fh+1,True ; line numbering End If ; Draw the line number Color bluelinenumbertr,bluelinenumbertg,bluelinenumbertb Text x-3,y,bluerightalign(num,4) Color ro,go,bo SetBuffer CanvasBuffer(can) End Function Function bluetexttab(x,y,a$) ;RuntimeError a$ For i=1 To Len(a$) cc$ = Mid(a$,i,1) Select Asc(cc) Case 9 For ii=1 To bluedefaulttabsize x = x + StringWidth("a") Next Default Text x,y,cc End Select fw = StringWidth(Mid(a$,i,1)) x=x+fw Next End Function Function bluelinenum(num) ; core ; Structural optimalization system goes here ; Return num ; return pointer to data End Function Function bluereadline$(num) ; return the line number num = bluelinenum(num) ; core Return blue(num,bluec) End Function Function bluewriteLine(num,in$) ; Write to the line number with in$ num = bluelinenum(num) ; core blue(num,bluec) = in$ End Function Function blueline(ms,def$="",num,offset_y);; ; edit single line - core num = bluelinenum(num) ; optimalization ;offset_y=offset_y+24 offset_y=offset_y;+GadgetY(ms) offset_x = 2 width_mod = 0 height_mod = 0 ; If bluelinenumbervisible = True Then offset_x = bluelinenumberwidth + 3 width_mod = bluelinenumberwidth + 3 End If ; Local wwidth = GadgetWidth(ms)-7 Local wheight = FontHeight() ;Local win = CreateWindow("",GadgetX(ms)+offset_x,GadgetY(ms)+offset_y,wwidth-width_mod,wheight,ms,32) Local win = lineareawin ;Local can = CreateCanvas(GadgetX(ms)+offset_x,GadgetY(ms)+offset_y,wwidth-width_mod,wheight,lineareawin) Local can = CreateCanvas(0,0,wwidth-width_mod,wheight,lineareawin) ;SetGadgetShape win,GadgetX(ms)+offset_x,GadgetY(ms)+offset_y,wwidth-width_mod,wheight SetGadgetShape win,GadgetX(ms)+offset_x,GadgetY(ms)+offset_y,wwidth-width_mod,wheight ; align text window to parent window!! SetGadgetShape can,0,0,wwidth-width_mod,wheight ;ActivateWindow win ;Local can = lineareacan ;SetGadgetShape can,0,0,wwidth,wheight SetBuffer CanvasBuffer(can) HideGadget backcan Local r = blueactiveliner Local g = blueactivelineg Local b = blueactivelineb Local fr = blueactivelinefr Local fg = blueactivelinefg Local fb = blueactivelinefb Local sr = blueactivelinesr Local sg = blueactivelinesg Local sb = blueactivelinesb ClsColor r,g,b:Cls FlipCanvas(can) ;RuntimeError "er" Local c$ = def$ Local cursortimer = MilliSecs()+1000 Local cursortimerdelay = 1000 Local showcursor = True ;oboe = Int(blue(num,bluecursorpos)) + ( bluelinenumberwidth / fontwidth() ) Local cursorpos = blue(num,bluecursorpos) cursorpos = bluemousecursorupdate() ;cursorpos = (bluecursorx - (bluelinenumberwidth/fontwidth())) Local selstart = blue(num,blueselstart) Local selend = blue(num,blueselend) Local selactive = blue(num,blueselactive) Local invselstart = blue(num,blueinvselstart) Local invselactive = False Local shiftactive = False Local ctrlactive = False Local altactive = False Local copybuffer$ = bluelinecopybuffer;blue(num,bluecopybuffer) c$ = def$ Local c_back$ = Right(c$,Len(c$)-cursorpos);blue(num,bluec_back) Local c_front$ = Left(c$,cursorpos);blue(num,bluec_front) Local MousX = 0 Local MousY = 0 Local exitline = -1 Local exitwithreturn = False Local exitwithcursup = False Local exitwithcursdown = False Local functionkeys[12] ; 1 --- 12 Local maxtextlen = (GadgetWidth(can)/StringWidth("a"))-1 ;RuntimeError c$ ;Local c_back$ = "" Local timer = CreateTimer(60) While we<>$803 we = WaitEvent() Select we Case $101 ;- Key down ; 54 r-shft, 42 - l-shft ; 157- rctrl, 29 - lctrl, 184-ralt,56-lalt ed = EventData() Select ed Case 54 ; rshift If selactive = False Then selactive = True : selstart = cursorpos : invselstart = cursorpos : sellen = 0 : shiftactive = True Case 42 ;lshift If selactive = False Then selactive = True : selstart = cursorpos : invselstart = cursorpos : sellen = 0: shiftactive = True Case 157 ; rctrl ctrlactive = True Case 29 ; lctrl ctrlactive = True Case 184 ; l alt altactive = True Case 56 ; r alt altactive = True End Select Case $102 ;- Key up ed = EventData() Select ed Case 54 : shiftactive = False Case 42 : shiftactive = False Case 29 : ctrlactive = False Case 184: ctrlactive = False End Select ;If EventData() = 1 Then Exit Case $103 ;- Key stroke (EDIT) ed = EventData():If ed = 13 Then we = $803 showcursor = True : cursortimer = MilliSecs() + cursortimerdelay ;backspa = 8 , 32 = space, 63273 ; homr ; ;63276 - pageup, 63277 pagedown ;RuntimeError ed Select ed Case 63276 ; Page up we = $803 exitline = bluepageup Case 63277 ; Page down we = $803 exitline = bluepagedown Case 9 ; Tab If shiftenabled = True Then End If If altenabled = True Then End If If ctrlenabled = True Then End If If shiftenabled = False And altenabled = False And ctrlenabled = False Then c_front = c_front + String(Chr(32),bluedefaulttabsize) cursorpos = cursorpos + bluedefaulttabsize ;store tab locations here End If Case 63271 ; Insert If blueinsertmode = True Then blueinsertmode = False Else blueinsertmode = True Case 63239 ; F4 If altactive = True Then we = $803 exitline = bluecloseapp End If Case 63272 ;del If selactive = False And shiftactive = False Then If Len(c_back$) > 0 c_back$ = Right(c_back$,Len(c_back$)-1) EndIf Else c_front$ = Left(c$,selstart) c_back$ = Right(c$,Len(c$)-selend) selactive = False : invselactive = False cursorpos = selstart If Len(c_back$) + Len(c_front$) = 0 Then cursorpos = 0 End If Case 63273 ; home If ctrlactive = False Then cursorpos = 0 c_front$ = Left(c$,cursorpos) c_back$ = Right(c$,Len(c$)-cursorpos) If shiftactive = False Then selactive = False Else ;Ctrl + home exitline = bluectrlhome we=$803 End If Case 63275 ; end If ctrlactive = False Then cursorpos = Len(c$) c_front$ = Left(c$,cursorpos) c_back$ = Right(c$,Len(c$)-cursorpos) If shiftactive = False Then selactive = False Else ;CTRL + End exitline = bluectrlend we=$803 End If Case 8 ; backspace ;If Len(c$) > 0 c$ = Left(c$,Len(c$)-2) c_front$ = Left(c_front$,Len(c_front$) - 1) If cursorpos > 0 Then cursorpos = cursorpos - 1 If shiftactive = False Then selactive = False Case 13 ; enter exitline = num + 1 exitwithreturn = True we = $803 Case 27 ; escape we = $803 Case 63232 ; curs up If num > 0 Then exitwithcursup = True exitline = num - 1 If cursorpos > Len(blue(exitline,bluec)) Then blue(exitline,bluecursorpos) = Len(blue(exitline,bluec)) Else blue(exitline,bluecursorpos) = cursorpos End If we = $803 End If Case 63233 ; curs down If num < bluenumlines Then exitwithcursdown = True exitline = num + 1 If cursorpos > Len(blue(num,bluec)) Then blue(exitline,bluecursorpos) = Len(blue(exitline,bluec)) Else blue(exitline,bluecursorpos) = cursorpos End If we = $803 Else we = $803 exitline = num End If Case 63235 ; cursright If ctrlactive = True Then If shiftactive = False Then selactive = False z = movecursorright(c$,cursorpos+1) ;DebugLog z If z =0 Then z=Len(c$) cursorpos = z c_front$ = Left(c$,cursorpos) c_back$ = Right(c$,Len(c$) - cursorpos) Else If cursorpos < Len(c$) Then cursorpos = cursorpos + 1 c_front$ = Left(c$,cursorpos) c_back$ = Right(c$,Len(c$)-cursorpos) If shiftactive = False Then selactive = False End If Case 63234 ; curs left If ctrlactive = True Then If shiftactive = False Then selactive = False z = movecursorleft(c$,cursorpos-1) If z <0 Then z=0 cursorpos = z c_front$ = Left(c$,cursorpos) c_back$ = Right(c$,Len(c$) - cursorpos) Else If cursorpos > 0 Then cursorpos = cursorpos - 1 c_front$ = Left(c$,cursorpos) c_back$ = Right(c$,Len(c$)-cursorpos) If shiftactive = False Then selactive = False End If Default ; all other keys If ctrlactive=False And altactive = False If blueinsertmode = False Then ; Regular type without Insert If cursorpos < maxtextlen And Len(c$) < maxtextlen c_front$ = c_front$ + Chr(ed) cursorpos = cursorpos + 1 selactive = False End If Else If cursorpos < maxtextlen ; Regular type with insert c_front$ = c_front$ + Chr(ed) c_back$ = Right(c_back$,Len(c_back$)-1) cursorpos = cursorpos + 1 selactive = False End If End If If shiftactive = False Then selactive = False End If End Select ; ;RuntimeError ; CTRL things If ctrlactive = True Then Select ed Case 22 ; Ctrl + v ; paste ; bluelinewidth If copybuffer$<> "" Then ; Single line copy paste!! If Len(copybuffer$) + Len(c$) < bluelinewidth Then If selactive = True Then c$ = c_front$ + c_back$ c$ = bluereplacelineselection(c$,copybuffer$,selstart,selend) cursorpos = (cursorpos - sellen) + Len(copybuffer$) c_front$ = Left(c$,cursorpos) c_back$ = Right(c$,Len(c$)-cursorpos) selactive = False Else c_front$ = c_front$ + copybuffer$ cursorpos = cursorpos + Len(copybuffer) End If End If End If Case 3 ; CTRL + C If selactive = True Then copybuffer$ = Mid(c$,selstart+1,sellen) DebugLog copybuffer$ End If Default End Select EndIf c$ = c_front$ + c_back$ Case $201 ;- Mouse down ; Position cursor bluecursorx = EventX() / Fontwidth() If obluecursorx <> bluecursorx Then DebugLog bluecursorx cursorpos = bluecursorx c_front$ = Left(c$,cursorpos) c_back$ = Right(c$,Len(c$)-cursorpos) mup = False Case $202 ;- Mouse up mup = True nl = EventY() / FontHeight() + linecounter ;DebugLog "Exit val : " + nl + " : : " + num If nl <> 0 Then cursorpos = bluecursorx : bluecursorupdate = True If moc = False Then we = $803 Case $203 ;- Mouse move mousx = EventX() mousy = EventY() Case $204 ;- Mouse wheel Case $205 ;- Mouse enter If EventSource() = can moc=True End If Case $206 ;- Mouse leave If EventSource() = can moc=False End If Case $401 ;- Gadget action Case $801 ;- Window move SetGadgetShape win,GadgetX(ms)+offset_x,GadgetY(ms)+offset_y,wwidth-width_mod,wheight ; align text window to parent window!! SetGadgetShape can,0,0,wwidth-width_mod,wheight Case $802 ;- Window size Case $803 ;- Window close If EventSource() = ms Then End Case $804 ;- Window activate Case $1001 ;- Menu event Case $2001 ;- App suspend Case $2002 ;- App resume SetGadgetShape win,GadgetX(ms)+offset_x,GadgetY(ms)+offset_y,wwidth-width_mod,wheight ; align text window to parent window!! SetGadgetShape can,0,0,wwidth-width_mod,wheight Case $2003 ;- App Display Change Case $2004 ;- App Begin Modal Case $2005 ;- App End Modal Case $4001 ;- Timer tick SetBuffer CanvasBuffer(can) Cls ; quick hack to fix control handling If KeyDown(29) = True Or KeyDown(157) = True Then ctrlactive = True Else ctrlactive = False; lctrl If KeyDown(42) = True Or KeyDown(54) = True Then shiftactive = True Else shiftactive = False ; lshift ;editline highlight Color r+10,g+10,b+10 ; Set line higlight color Line 0,0,GadgetWidth(can),0 ; draw higlight line Color r,g,b Line 0,GadgetHeight(can)-1,GadgetWidth(can),GadgetHeight(can)-1 Color r-10,g-10,b-10 seldraw = False If selactive = True And sellen <>0 ;And selstart<>cursorpos Then Color sr,sg,sb Rect StringWidth(Left(c$,selstart)),0,StringWidth(Mid$(c$,selstart+1,sellen)),FontHeight() seldraw = True End If blue(num,bluec) = c$ Color fr,fg,fb:bluedrawtext 0,-1,num,can,True ;Color 0,0,0 ;Rect 0,0,30,10,True ;Color fr,fg,fb:Text 0,-1,c$ If cursortimer < MilliSecs() Then cursortimer = MilliSecs() + cursortimerdelay If showcursor = True Then showcursor = False Else showcursor = True End If sellen = selend-selstart selend = cursorpos If selactive=True And sellen = 0 And selreset = False Then ;DebugLog"er" invselactive = False invselstart = cursorpos selend = cursorpos selstart = cursorpos selreset = True ElseIf sellen <> 0 selreset = False End If If sellen < 0 And invselactive = False And selactive = True Then invselactive = True ElseIf invselactive=True And sellen < 0 Then ; hit home with inversed sel;ection invselactive = False selstart = invselstart End If If invselactive = True Then selend = invselstart selstart = cursorpos sellen = invselstart-(cursorpos-1) End If ; drawcursor (yikes!) If showcursor = True Then bluedrawcursor( StringWidth(Left(c$,cursorpos))+(StringWidth(String(" ",bluecursorposx(num)))), FontHeight()-2,StringWidth("a"),blueinsertmode) ; Line 0,220+3,200,220+3 y ; Text 0,220,c_front$ + "|" + c_back ; Text 0,240,"string len : " + Len(c$) ; If selactive = True Then Text 0,250,"sellen : " + sellen + " brr : " + Mid(c$,selstart+1,sellen) ; Text 0,260,"invselactive:" +invselactive+" invselstart:"+invselstart ; Text 0,280,"seldraw:"+seldraw + " selactive:"+selactive ; Text 0,300,"selstart:" + selstart + " cursorpos:" + cursorpos ; Text 0,320,"selend:"+selend+" sellen:"+sellen ; Text 0,340,"ctrlactive:"+ctrlactive FlipCanvas(can) End Select Wend ; store changes blue(num,blueactive) = 0 blue(num,bluec) = c$ blue(num,bluecursortimer) = cursortimer blue(num,bluecursortimerdelay) = cursortimerdelay blue(num,blueshowcursor) = showcursor blue(num,bluecursorpos) = cursorpos blue(num,blueselstart) = selstart blue(num,blueselend) = selend blue(num,blueselactive) = selactive blue(num,blueinvselstart) = invselstart blue(num,blueinvselactive) = invselactive blue(num,blueshiftactive) = shiftactive blue(num,bluectrlactive) = ctrlactive ;blue(num,bluecopybuffer) = copybuffer$ bluelinecopybuffer$ = copybuffer$ ShowGadget backcan FreeGadget can If exitline <-50 Then Return exitline If exitwithcursup = True Then Return exitline If exitwithcursdown = True Then Return exitline If exitwithreturn= True Then Return exitline If mup = True Then Return nl Return -1 End Function Function bluemousecursorupdate() ; core ; Update the cursor with the activities of the mouse pointer ; trigger flag gets inverted! If bluecursorupdate = True Then cursorpos = bluecursorx- (bluelinenumberwidth/fontwidth()) bluecursorupdate = False End If Return cursorpos End Function Function bluereplacelineselection$(in$,repl$,st,nd) ; core a$ = Left(in$,st) b$ = Right(in$,Len(in$)-nd) Return a$+repl$+b$ End Function Function bluedrawcursor(x,y,w,t) ; t = 0 = regular 1 = insert Select t Case 0 ; Regular cursor Color bluecursorcolorr,bluecursorcolorg,bluecursorcolorb Rect x,y-FontHeight(),2,FontHeight(),True Case 1 ; Insert Cursor Color blueinsertcursorcolorr,blueinsertcursorcolorg,blueinsertcursorcolorb Rect x,y,w,2,True End Select End Function Function bluecursorposx(num) ;DebugLog blue(num,bluetabmodifier) Return blue(num,bluetabmodifier) End Function Function movecursorleft(c$,cursorpos) z = instrleft(c$," ",cursorpos) While Mid(c$,z) = " " z=z-1 If z<1 Then Exit Wend Return z-1 End Function Function movecursorright(c$,cursorpos) z = Instr(c$," ",cursorpos) While Mid(c$,z) = " " z=z+1 If z>Len(c$) Then Exit Wend Return z End Function Function instrleft(c$,f$,pos) If f$="" Then Return 0 If Len(c$) = 0 Then Return 0 If pos<0 Or pos>Len(c$) Then Return 0 pos2 = 1 While pos2 <> 0 q = Instr(c$,f$,pos2) ;If Confirm(q+"|"+pos2) Then End If q>pos Then Exit If q = 0 Then Exit pos2 = q+1 Wend Return pos2-1 End Function Function bluerightalign$(in$,tlen) If tlen =<0 Then Return While Len(in$) < tlen in$=" " + in$ : Wend Return in$ End Function Function bluecountchar(num,in$) ; char Input ascii ; ms = MilliSecs() pos = 1 While pos > 0 ; timeout after 2000 millisecs()!!! q = Instr(blue(num,bluec),in$,pos) num2 = num2 + 1 If q = 0 Then Exit pos = q+1 Wend Return num2-1 End Function Function blueloadtext(in$) ; load text If FileType(in$) <> 1 Then RuntimeError in$ cnt = 0 f = ReadFile(in$) ; count lines While Eof(f) = False a$ = ReadLine(f) cnt=cnt + 1 Wend CloseFile(f) bluenumlines = cnt :redimblue(bluenumlines) : cnt = 0 ; redimension blue data array f = ReadFile(in$) ; Load the text (capped at linewidth) While Eof(f) = False And cnt < bluenumlines a$ = Left(ReadLine(f),bluelinewidth) a$ = Replace(a$,Chr(9),String(Chr(32),bluedefaulttabsize)) ;If Asc(a$) = Chr(9) Then a$ = String(Chr(32),bluedefaulttabsize) blue(cnt,bluec) = a$ cnt=cnt+1 Wend CloseFile(f) End Function Function redimblue(num) Dim blue$(num,bluepointers) End Function ; Function bufferlinenumbers() ; make a image that gets blocked into the background of the linenumbers - run after linenumber change Local tempthing = bluelinenumimagebuffer SetBuffer ImageBuffer(tempthing) ra# = bluelinenumberbr ga# = bluelinenumberbg ba# = bluelinenumberbb mod1# = ra/ImageWidth(tempthing) mod2# = ga/ImageWidth(tempthing) mod3# = ba/ImageWidth(tempthing) For x1=0 To ImageWidth(tempthing)-2 Color cnta#,cntb#,cntc# cnta# = cnta + mod1# cntb# = cntb + mod2# cntc# = cntc + mod3# Line x1,0,x1,ImageHeight(tempthing) Next Color cnta#/2,cntb#/2,cntc#/2 Line x1,0,x1,ImageHeight(tempthing) End Function ; Function design_docs() ; ; Tabs are stored as chr code 9. Drawing these on the screen is check by seing if a tab is present in the array hastab flag ; the tabflag bluehastab needs to be cleared in the lines datafield when tabs are removed. ; Currently rethinking if I should use regular spaces and store the tab data seperatly.... ; ; Line numbering is buffered in a image. this has 3 times the height size and only rebuilds when a flag is set ; ; The mouse 2 text cursor x position needs alignment with the text area offset. Line numbering ect. The regular cursor positioning ; is done inside the line edit section. Outside code needs to take this into account seing the line edit uses Zero as it most left ; offset. ; ; End Function Function bluecontrolispressed() If KeyDown(29) Then Return True If KeyDown(157) Then Return True Return False End Function Function readmakebackdata() ; SetBuffer ImageBuffer(backimage) ClsColor 0,76,150 Cls ; Local ab[265] Restore bi For y = 0 To 15 For x = 0 To 15 ; Read a ab[cnt] = a ; cnt=cnt+1 Next:Next ; cnt=0 ; For y=0 To 15 For x=0 To 15 ; a = ab[cnt] ; Select a Case 1 blockbackimage(x * 48 , y * 32 , 1) Case 2 blockbackimage(x * 48 , y * 32 , 2) Case 3 blockbackimage(x * 48 , y * 32 , 3) End Select ; cnt=cnt+1 Next:Next ; End Function Function blockbackimage(x,y,c#) ;i mage GetColor x , y a1# = ( ColorRed() / 1.0577) + c b1# = ( ColorGreen() / 1.0577) + c c1# = ( ColorBlue() / 1.0577) + c ; ; If c < 3 Then Color a1 , b1 , c1 Oval x - 48 / 2 , y - 48 / 2 , 64, 64 , True End If If c = 3 Color 155,155,255 ;DebugLog a1 Color a1,100,200 Rect x - 48 / 2 , y - 48 / 2 , 32, 32 , True End If ; ; End Function .bi Data 1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1 Data 2,2,0,2,2,2,0,2,0,2,2,2,0,2,0,2 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 1,0,3,3,3,0,0,0,0,0,3,0,0,3,0,0 Data 1,0,1,3,0,0,3,3,0,3,0,3,3,3,3,3 Data 1,0,0,3,0,0,3,0,0,0,3,0,0,2,3,0 Data 1,0,0,3,0,0,3,3,0,0,3,0,0,0,3,0 Data 1,0,1,3,0,0,3,0,0,0,3,1,0,1,3,1 Data 1,2,0,3,0,0,3,3,0,3,1,3,0,0,3,0 Data 0,0,0,1,0,0,0,0,2,0,1,0,0,2,0,0 Data 0,2,1,0,0,2,0,0,2,2,1,0,2,0,0,3 Data 3,0,1,0,0,0,2,3,0,2,0,1,0,0,3,0 Data 0,3,1,0,3,0,0,2,3,0,2,1,0,3,0,3 Data 2,2,3,2,2,3,2,2,2,3,2,2,3,2,3,3 Data 1,1,1,3,1,1,3,1,1,1,3,3,1,3,3,3 Data 1,1,1,1,3,1,1,3,1,1,3,1,3,3,3,3 |
Comments
None.
Code Archives Forum