there is on eissue concerning the editingmode.
Maybe a kind of bug.
In my efforts to incorporate a keyboardcontrolling to a ListIconGadget
a stumbled on this.
Editing with DEL-KEY does not update the TEXT in the callback at once
like other editinputs do.
This is a little bit annoying because i have to manage the editstate when exiting
the editmode with up or down arrow to switch to the next field.
I need the correct edited value to write it immediately into a database when changed
(left and right-arrow are not considered)
Here some code to test. Arrowing up and down in editmode does work.
The recognition of changed values (when up or down) depends on the last editinput.
DEL is not recognized.
Leaving the EditMode with ENTER is ok in this case.
Code:
;
; List
EnableExplicit
Enumeration ;window
#win
EndEnumeration
Enumeration ;gadgets
#b_Get
#b_Quit
#Li
EndEnumeration
Enumeration ;shortcuts menu
#sk_down
#sk_up
EndEnumeration
Global.l celly, cellx, cellheight, celltop, cellleft, cellmaxrow, celledited, celleditmode
Global.s celltextedit, celltext
Procedure LvFilterCallback(LV.l, Filterstring.s, Column.l, Event.l) ; simple search example
Protected itemNumber.l, I.l
If Filterstring
itemNumber = -1
If IsGadget(LV)
For I = 0 To CountGadgetItems(LV) - 1
If FindString(UCase(GetGadgetItemText(LV, I, Column)), UCase(FilterString),0)
itemNumber = I
Break
EndIf
Next
If itemNumber <> -1 ; if string found, scroll to row
PureLVSORT_ScrollToRow(LV, itemNumber)
PureCOLOR_SetCellColor(LV, itemnumber,Column,#Blue,$FFDEAD)
EndIf
EndIf
EndIf
EndProcedure
Procedure.l LvEditCallback(Event.l, ListIconNumber.l, Column.l, Row.l, Text.s)
Select Event
Case #PureLVSORT_EditStart
Debug "Edit Start"
celltext=GetGadgetItemText(ListIconNumber,row,column)
Debug "edt_start :"+celltext
celleditmode=1
; Return : - 0 to enable stringgadget (default)
; - *string to enable a spingadget [the string holds the choice items (separator = '|']
Case #PureLVSORT_EditText
Debug "Edit Text"
celltextedit=text
celledited+1
Debug "edt_edit :"+celltextedit
;Debug "im callback "+celltextedit
; ; Return : - 0 to keep the text (default)
; ; - *string to change the text [the string holds the changed text]
Case #PureLVSORT_EditEnd
Debug "Edit End"
If celledited
If celltext<>celltextedit
Debug "-----------------"
Debug " down before :"+celltext
Debug " down after:"+celltextedit
Debug " Ok can be written"
Debug "-----------------"
EndIf
celledited=0
celltextedit=""
celltext=""
celleditmode=0
EndIf
Case #PureLVSORT_EditEscape
Debug "Edit ESC"
celleditmode=0
EndSelect
EndProcedure
Procedure reload()
Define cols=5,c, r, rows=10 , i , tmp.s, out.s
HideGadget(#Li,1)
ClearGadgetItems(#Li)
While GetGadgetItemText(#Li, -1); , 0)
RemoveGadgetColumn(#Li,0)
Wend
RemoveGadgetColumn(#Li,0)
For c=0 To cols
tmp="Column "+Str(c)
AddGadgetColumn(#li,c,tmp,20)
Next c
tmp=""
For r=0 To rows
For c=0 To cols
For i=1 To 5
tmp+Chr(Random(25)+97)
Next i
out+tmp+Chr(10)
tmp=""
Next c
AddGadgetItem(#Li,-1,out)
out=""
Next r
PureLVSORT_SelectGadgetToSort(#Li,#PureLVSORT_ShowClickedHeader_No)
PureLVSORT_DefineFilterCallback(@LvFilterCallback())
PureLVSORT_SetFilterTimeOut(100)
PureLVSORT_SetFilter(#Li)
For c=0 To 10
PureLVSORT_SetColumnWidth(#Li,c,#PureLVSORT_UseHeader)
Next c
PureLVSORT_SetFilter(#Li)
PureLVSORT_SetFilterTimeOut(25)
PureLVSORT_DefineFilterCallback(@LvFilterCallback())
For c=0 To 10-1
PureLVSORT_MakeColumnEditable(#Li,c,#True)
Next c
PureLVSORT_SetEditingCallback(@LvEditCallback())
PureLVSORT_SetEditingColors(RGB(255,222,192),#PureCOLOR_SystemColor)
HideGadget(#Li,0)
cellmaxrow=CountGadgetItems(#Li)-1
EndProcedure
Procedure LvMouseClick(GId.i, *vP.Point)
Define vID=GadgetID(GId)
Protected pLVH.LVHITTESTINFO
GetCursorPos_ (*vP) ;wo ist Maus
MapWindowPoints_(0, vID, *vP, 1)
pLVH\pt\x = *vP\x
pLVH\pt\y = *vP\y
SendMessage_(vID, #LVM_SUBITEMHITTEST, 0, pLVH)
*vP\y = pLVH\iItem ;row ab 0
*vP\x = pLVH\iSubItem ;col ab 0
celly=*vP\y
cellx=*vP\x
; --- Ergänzung
Protected rec.RECT , i
SendMessage_(vid, #LVM_GETSUBITEMRECT, *vp\y, rec)
rec\left=0
rec\right=rec\left+GetGadgetItemAttribute(GId,-1,#PB_ListIcon_ColumnWidth,0)
If *vP\x >0
For i=1 To *vP\x
rec\left+GetGadgetItemAttribute(GId,-1,#PB_ListIcon_ColumnWidth, i-1)
rec\right=rec\left+GetGadgetItemAttribute(GId,-1,#PB_ListIcon_ColumnWidth,i)
Next
EndIf
cellheight= rec\bottom-rec\top
celltop = rec\top+1
cellleft = rec\left+1
EndProcedure
ExamineDesktops()
;window, gadgets
Define.l dw=DesktopWidth(0)
Define.l dh=DesktopHeight(0)
Define.l wx,ww,wy,wh
Define.l c
Define p.Point
;events
Define.l event,eventtype,gadget,Menu
Define.l quit
ww=500
wh=500
wx=100;dw/2-ww/2
wy=100;dh/2-wh/2
OpenWindow(#win,wx,wy,ww,wh,"Schaumerma",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget)
ButtonGadget(#b_Get,0,0,50,20,"reload")
ListIconGadget(#Li,0,20,ww,wh-20,"this",20,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
HideGadget(#Li,1)
AddKeyboardShortcut(#Win,#PB_Shortcut_Down,#sk_down)
AddKeyboardShortcut(#Win,#PB_Shortcut_Up,#sk_up)
reload()
Define.s Info.s= "Enter Editingmode by doubleclicking (L) one field."+#CRLF$
Info+"Typing on the keyboard will change the TEXT in the Callback accordingly"+#CRLF$
Info+"Only DEL has some kind of ''delay''"+#CRLF$+#CRLF$
Info+" Run in IDE with debug on"
MessageRequester("",Info)
Repeat
event=WaitWindowEvent()
eventtype=EventType()
menu=EventMenu()
gadget=EventGadget()
Select event
Case #PB_Event_Gadget
Select gadget
Case #b_get
reload()
Case #Li
Select eventtype
Case #PB_EventType_LeftDoubleClick
LvMouseClick(#Li, p)
Debug "Mouse celltop "+Str(celltop)
Debug "Mouse cellheight "+Str(cellheight)
Debug "Mouse Col "+Str(cellx)
Debug "Mouse Row "+Str(celly)
EndSelect
EndSelect
Case #PB_Event_Menu
Select menu
Case #sk_down
;one down
If celleditmode
If celledited
If celltext<>celltextedit
Debug "-----------------"
Debug " down before :"+celltext
Debug " down after:"+celltextedit
Debug " Ok can be written"
Debug "-----------------"
EndIf
celledited=0
celltextedit=""
celltext=""
EndIf
If celly <= cellmaxrow-1
celltop+cellheight
celly+1
Debug "celltop "+Str(celltop)+" cellheight "+Str(cellheight)+" Col "+Str(cellx)+" Row "+Str(celly)
PostMessage_(GadgetID(#Li), #WM_LBUTTONDBLCLK, 0, cellleft| (celltop <<16)) ;<---- double click on x = 12 y = 42 (mouse coordinates)
EndIf
EndIf
Case #sk_up
;up one up
If celleditmode
If celledited
If celltext<>celltextedit
Debug "-----------------"
Debug " down before :"+celltext
Debug " down after:"+celltextedit
Debug " Ok can be written"
Debug "-----------------"
EndIf
celledited=0
celltextedit=""
celltext=""
EndIf
If celly >=0+1
celltop-cellheight
celly-1
Debug "celltop "+Str(celltop)+" cellheight "+Str(cellheight)+" Col "+Str(cellx)+" Row "+Str(celly)
PostMessage_(GadgetID(#Li), #WM_LBUTTONDBLCLK, 0, cellleft| (celltop <<16)) ;<---- double click on x = 12 y = 42 (mouse coordinates)
EndIf
EndIf
EndSelect
Case #PB_Event_CloseWindow
quit+1
EndSelect
Until quit
End