Here's what I now have. When you have time, see if the flicker is reduced for you.
Code: Select all
; *************************************************************
; Title: Sparkies EditorGadget with line numbers"
; Author: Spakie
; Start Date: December 24, 2004 9:50 AM
; Version 0.23B: December 28, 2004 8:45 PM
; License: Free to use, optimize, and modify at will :)
; *************************************************************
#SES_EMULATESYSEDIT = 1
#SCF_ALL = 4
#PFM_NUMBERINGSTART = $8000
#PFM_NUMBERINGSTYLE = $2000
#PFM_NUMBERINGTAB = $4000
Enumeration
#MainWin
EndEnumeration
Enumeration
#StatusBar
#MainMenu
#EditorPopup
EndEnumeration
Enumeration
#LineNumbers
#Editor
#Lines_Conatiner
EndEnumeration
; --> For our Select All popup menu command
editSel.CHARRANGE
; --> Main window callback procedure
Procedure.l myWindowCallback(hwnd, msg, wparam, lparam)
Shared previousItems
result = #PB_ProcessPureBasicEvents
Select msg
Case #WM_COMMAND
If lparam = GadgetID(#Editor)
Select wparam >>16&$FFFF
Case #EN_VSCROLL
; --> Keep linenumbers in sync with EditorGadget scrolling up or down (clicking scroll buttons)
SendMessage_(GadgetID(#Editor), #EM_GETSCROLLPOS, 0, @egOne.POINT)
; --> Keep numbers from scrolling left
egOne\x = 0
SendMessage_(GadgetID(#LineNumbers), #EM_SETSCROLLPOS, 0, egOne)
Case #EN_UPDATE
SendMessage_(GadgetID(#Editor), #EM_SETCHARFORMAT, #SCF_ALL, @egFormat)
; --> Keep linenumbers in sync with EditorGadget scrolling up or down (dragging scroll thumb)
SendMessage_(GadgetID(#Editor), #EM_GETSCROLLPOS, 0, @egOne.POINT)
; --> Keep numbers from scrolling left
egOne\x = 0
SendMessage_(GadgetID(#LineNumbers), #EM_SETSCROLLPOS, 0, egOne)
Case #EN_CHANGE
; --> Keep linenumbers in sync with EditorGadget adding or removing items
currentLine = SendMessage_(GadgetID(#Editor), #EM_LINEFROMCHAR, -1, 0)+1
lnItems = CountGadgetItems(#LineNumbers)
egItems = CountGadgetItems(#Editor)
; --> For now I just clear the entire number list when items are
; --> added or removed. >>>>>>>>>>>>> Causes slight flicker so find a better way! <<<<<<<<<<<<<<
If egItems > lnItems
For i = lnItems+1 To egItems
AddGadgetItem(#LineNumbers, i, RSet(Str(i), 4, "0"))
Next i
EndIf
If egItems < lnItems
For i = lnItems To egItems Step -1
RemoveGadgetItem(#LineNumbers, i)
Next i
; --> Remove the last CR/LF left behind by RemoveGadgetItem
; --> Readonly off for linenumbers
SendMessage_(GadgetID(#LineNumbers), #EM_SETREADONLY, 0, 0)
SendMessage_(GadgetID(#LineNumbers), #WM_KEYDOWN, #VK_BACK, 0)
SendMessage_(GadgetID(#LineNumbers), #WM_KEYUP, #VK_BACK, 0)
; --> Readonly for linenumbers
SendMessage_(GadgetID(#LineNumbers), #EM_SETREADONLY, 1, 0)
EndIf
; --> Keep linenumbers in sync with EditorGadget scrolling up or down (dragging scroll thumb)
SendMessage_(GadgetID(#Editor), #EM_GETSCROLLPOS, 0, @egOne.POINT)
; --> Keep numbers from scrolling left
egOne\x = 0
SendMessage_(GadgetID(#LineNumbers), #EM_SETSCROLLPOS, 0, egOne)
previousItems = egItems
Debug CountGadgetItems(#LineNumbers)
Debug CountGadgetItems(#Editor)
EndSelect
EndIf
EndSelect
ProcedureReturn result
EndProcedure
; --> Open a file procedure
Procedure openTheFile()
oFile$ = OpenFileRequester("Select a File", "c:\", "Text file (.txt) | *.txt", 0)
If FileSize(oFile$) > 0 And FileSize(oFile$) < 65535
If ReadFile(0, oFile$)
ClearGadgetItemList(#LineNumbers)
ClearGadgetItemList(#Editor)
While Eof(0) = 0
egText$ + ReadString() + Chr(13)
Wend
AddGadgetItem(#Editor, -1, egText$)
CloseFile(0)
Else
MessageRequester("Error", "Could not open file: " + oFile$, #MB_ICONERROR)
EndIf
Else
MessageRequester("Error", "File not found: " + oFile$, #MB_ICONERROR)
EndIf
EndProcedure
; --> Main window and gadgets
If OpenWindow(#MainWin, 0, 0, 700, 500, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "EditorGadget w/Line Numbers") And CreateGadgetList(WindowID(0))
SetWindowCallback(@myWindowCallback())
CreateStatusBar(#StatusBar, WindowID(#MainWin))
; --> Main menu
CreateMenu(#MainMenu, WindowID(#MainWin))
MenuTitle("&File")
MenuItem(101, "&Open" + Chr(9 ) + "Ctrl+O")
MenuItem(102, "&Save")
MenuItem(103, "S&ave as")
MenuItem(104, "&Quit" + Chr(9) + "Ctrl+Q")
MenuTitle("&Edit")
MenuItem(111, "&Undo" + Chr(9 ) + "Ctrl+z")
MenuBar()
MenuItem(112, "&Cut" + Chr(9 ) + "Ctrl+X")
MenuItem(113, "C&opy" + Chr(9 ) + "Ctrl+C")
MenuItem(114, "&Paste" + Chr(9 ) + "Ctrl+V")
MenuBar()
MenuItem(115, "Select &All" + Chr(9 ) + "Ctrl+A")
AddKeyboardShortcut(#MainWin, #PB_Shortcut_Control | #PB_Shortcut_O, 101)
; disabled AddKeyboardShortcut(#MainWin, #PB_Shortcut_Control | #PB_Shortcut_S, 102)
; disabled AddKeyboardShortcut(#MainWin, #PB_Shortcut_Control | #PB_Shortcut_A, 103)
AddKeyboardShortcut(#MainWin, #PB_Shortcut_Control | #PB_Shortcut_Q, 104)
; --> Disable save and save as for now
DisableMenuItem(102, 1)
DisableMenuItem(103, 1)
; --> Put Linenumbers in a narrow conatiner to hide scrollbars
ContainerGadget(#Lines_Conatiner, 0, 0, 50, 460)
EditorGadget(#LineNumbers, 3, 3, 75, 454)
AddGadgetItem(#LineNumbers, -1, "0001")
; --> Set background color for numbers
SendMessage_(GadgetID(#LineNumbers), #EM_SETBKGNDCOLOR, 0, RGB(248, 248, 220))
; --> readonly for linenumbers
SendMessage_(GadgetID(#LineNumbers), #EM_SETREADONLY, 1, 0)
CloseGadgetList()
EditorGadget(#Editor, 50, 3, 647, 454)
; --> Draft mode forces plain text
SendMessage_(GadgetID(#Editor), #EM_SETEDITSTYLE , #SES_EMULATESYSEDIT, #SES_EMULATESYSEDIT)
; --> Set Editor to 64K text limit
SendMessage_(GadgetID(#Editor), #EM_SETLIMITTEXT, 0, 0)
; --> Set background color for Editorgadget
SendMessage_(GadgetID(#Editor), #EM_SETBKGNDCOLOR, 0, RGB(228, 228, 200))
; --> Set #EN_UPDATE, #EN_CHANGE and #EN_SCROLL event catching for EditorGadget
SendMessage_(GadgetID(#Editor), #EM_SETEVENTMASK, 0, #ENM_UPDATE | #ENM_CHANGE | #ENM_SCROLL | #ENM_KEYEVENTS)
; --> CHARFORMAT structure used for basic text formatting
egFormat.CHARFORMAT
egFormat\cbSize = SizeOf(CHARFORMAT)
; --> we'll set our formatting members to change SIZE
egFormat\dwMask = #CFM_SIZE | #CFM_COLOR
; --> I'll use 12pt type (yHeight is twips 1/1440 of an inch | 1/20 of printer point)
egFormat\yHeight = 12*20
; --> send info to both EditorGadgets
egFormat\crTextColor = RGB(0, 80, 0)
SendMessage_(GadgetID(#LineNumbers), #EM_SETCHARFORMAT, #SCF_ALL, @egFormat)
egFormat\crTextColor = RGB(0, 0, 80)
SendMessage_(GadgetID(#Editor), #EM_SETCHARFORMAT, #SCF_ALL, @egFormat)
; --> Create a popup menu for EditorGadget
CreatePopupMenu(#EditorPopup)
MenuItem(201, "&Undo")
MenuBar()
MenuItem(202, "&Cut")
MenuItem(203, "C&opy")
MenuItem(204, "&Paste")
MenuBar()
MenuItem(205, "Select &All")
; --> Main loop
Repeat
event = WaitWindowEvent()
; --> Keep focus out of linenumbers
If EventGadgetID() = #LineNumbers
ActivateGadget(#Editor)
EndIf
Select event
Case #WM_RBUTTONDOWN
xPos = WindowMouseX()
yPos = WindowMouseY()
If xPos >= GadgetX(#Editor)+2 And xPos <= (GadgetX(#Editor)+ GadgetWidth(#Editor)-4)
If yPos >= GadgetY(#Editor)+2 And yPos <= (GadgetY(#Editor)+ GadgetHeight(#Editor)-4)
If Len(GetGadgetText(#Editor)) < 1
DisableMenuItem(201,1)
DisableMenuItem(202,1)
DisableMenuItem(203,1)
DisableMenuItem(205,1)
DisableMenuItem(206,1)
Else
DisableMenuItem(201,0)
DisableMenuItem(202,0)
DisableMenuItem(203,0)
DisableMenuItem(205,0)
DisableMenuItem(206,0)
EndIf
DisplayPopupMenu(#EditorPopup,WindowID(),xPos, yPos)
EndIf
EndIf
Case #PB_EventMenu
Select EventMenuID()
; --> Main menu items 101 - 199
Case 101
openTheFile()
Case 102
Debug "Save disabled"
Case 103
Debug "Save as disabled"
Case 104
CloseWindow(#MainWin)
Case 111
SendMessage_(GadgetID(#Editor), #WM_UNDO, 0, 0)
Case 112
SendMessage_(GadgetID(#Editor), #WM_CUT, 0, 0)
Case 113
SendMessage_(GadgetID(#Editor), #WM_COPY, 0, 0)
SendMessage_(GadgetID(#Editor), #EM_SETSEL, -1, 0)
ActivateGadget(#Editor)
Case 114
; >>>>>> Still need to check for proper format do disable paste command as necessary <<<<<<
SendMessage_(GadgetID(#Editor), #WM_PASTE, 0, 0)
Case 115
editSel\cpMin = 0
editSel\cpMax = -1
SendMessage_(GadgetID(#Editor), #EM_EXSETSEL, 0, @editSel)
; --> Popup menu items 201 - 299
Case 201
SendMessage_(GadgetID(#Editor), #WM_UNDO, 0, 0)
Case 202
SendMessage_(GadgetID(#Editor), #WM_CUT, 0, 0)
Case 203
SendMessage_(GadgetID(#Editor), #WM_COPY, 0, 0)
SendMessage_(GadgetID(#Editor), #EM_SETSEL, -1, 0);
ActivateGadget(#Editor)
Case 204
; >>>>>> Still need to check for proper format do disable paste command as necessary <<<<<<
SendMessage_(GadgetID(#Editor), #WM_PASTE, 0, 0)
Case 205
editSel\cpMin = 0
editSel\cpMax = -1
SendMessage_(GadgetID(#Editor), #EM_EXSETSEL, 0, @editSel)
EndSelect
EndSelect
Until event = #PB_Event_CloseWindow
EndIf
End