Code: Select all
Global MyTableW2=DesktopScaledX(2)
Global MyTableW4=DesktopScaledX(4)
Global MyTableW7=DesktopScaledX(7)
Global MyTableW8=DesktopScaledX(8)
Global MyTableW10=DesktopScaledX(10)
Global MyTableW12=DesktopScaledX(12)
Global MyTableW14=DesktopScaledX(14)
Global MyTableW16=DesktopScaledX(16)
Global MyTableW20=DesktopScaledX(20)
Global MyTableH2=DesktopScaledY(2)
Global MyTableH4=DesktopScaledY(4)
Global MyTableH6=DesktopScaledY(6)
Global MyTableH7=DesktopScaledY(7)
Global MyTableH8=DesktopScaledY(8)
Global MyTableH10=DesktopScaledY(10)
Global MyTableH12=DesktopScaledY(12)
Global MyTableH14=DesktopScaledY(14)
Global MyTableH16=DesktopScaledY(16)
Global MyTableSortImageAsc=CreateImage(#PB_Any,MyTableW16,MyTableH16,32,#PB_Image_Transparent)
Global MyTableSortImageDesc=CreateImage(#PB_Any,MyTableW16,MyTableH16,32,#PB_Image_Transparent)
Global MyTableImagePlus=CreateImage(#PB_Any,MyTableW16,MyTableH16,32,#PB_Image_Transparent)
Global MyTableImageMinus=CreateImage(#PB_Any,MyTableW16,MyTableH16,32,#PB_Image_Transparent)
Global MyTableImageCheckBox=CreateImage(#PB_Any,MyTableW16,MyTableH16,32,#PB_Image_Transparent)
Global MyTableImageCheckBoxChecked=CreateImage(#PB_Any,MyTableW16,MyTableH16,32,#PB_Image_Transparent)
Global MyTableImagePlusArrow=CreateImage(#PB_Any,MyTableW16,MyTableH16,32,#PB_Image_Transparent)
Global MyTableImageMinusArrow=CreateImage(#PB_Any,MyTableW16,MyTableH16,32,#PB_Image_Transparent)
StartDrawing(ImageOutput(MyTableSortImageAsc))
DrawingMode(#PB_2DDrawing_AlphaBlend)
LineXY(MyTableW2,MyTableH8,MyTableW8,MyTableH2,RGBA(0,0,0,255))
LineXY(MyTableW8,MyTableH2,MyTableW14,MyTableH8,RGBA(0,0,0,255))
LineXY(MyTableW2,MyTableH8,MyTableW14,MyTableH8,RGBA(0,0,0,255))
StopDrawing()
StartDrawing(ImageOutput(MyTableSortImageDesc))
DrawingMode(#PB_2DDrawing_AlphaBlend)
LineXY(MyTableW2,MyTableH8,MyTableW8,MyTableH14,RGBA(0,0,0,255))
LineXY(MyTableW8,MyTableH14,MyTableW14,MyTableH8,RGBA(0,0,0,255))
LineXY(MyTableW2,MyTableH8,MyTableW14,MyTableH8,RGBA(0,0,0,255))
StopDrawing()
StartDrawing(ImageOutput(MyTableImagePlus))
DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_AlphaBlend)
Box(MyTableW2,MyTableH2,MyTableW12,MyTableH12,RGBA(0,0,0,255))
LineXY(MyTableW4,MyTableH7,MyTableW10,MyTableH7,RGBA(0,0,0,255))
LineXY(MyTableW7,MyTableH4,MyTableW7,MyTableH10,RGBA(0,0,0,255))
StopDrawing()
StartDrawing(ImageOutput(MyTableImageMinus))
DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_AlphaBlend)
Box(MyTableW2,MyTableH2,MyTableW12,MyTableH12,RGBA(0,0,0,255))
LineXY(MyTableW4,MyTableH7,MyTableW10,MyTableH7,RGBA(0,0,0,255))
StopDrawing()
StartDrawing(ImageOutput(MyTableImageCheckBox))
DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_AlphaBlend)
Box(MyTableW2,MyTableH2,MyTableW12,MyTableH12,RGBA(0,0,0,255))
StopDrawing()
StartDrawing(ImageOutput(MyTableImageCheckBoxChecked))
DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_AlphaBlend)
Box(MyTableW2,MyTableH2,MyTableW12,MyTableH12,RGBA(0,0,0,255))
LineXY(MyTableW4,MyTableH4,MyTableW12,MyTableH12,RGBA(0,0,0,255))
LineXY(MyTableW4,MyTableH12,MyTableW12,MyTableH4,RGBA(0,0,0,255))
StopDrawing()
StartDrawing(ImageOutput(MyTableImagePlusArrow))
DrawingMode(#PB_2DDrawing_AlphaBlend)
LineXY(MyTableW8,MyTableH4,MyTableW12,MyTableH8,RGBA(0,0,0,255))
LineXY(MyTableW8,MyTableH12,MyTableW12,MyTableH8,RGBA(0,0,0,255))
StopDrawing()
StartDrawing(ImageOutput(MyTableImageMinusArrow))
DrawingMode(#PB_2DDrawing_AlphaBlend)
LineXY(MyTableW4,MyTableH6,MyTableW8,MyTableH10,RGBA(0,0,0,255))
LineXY(MyTableW8,MyTableH10,MyTableW12,MyTableH6,RGBA(0,0,0,255))
StopDrawing()
Enumeration _mytable_type
#MYTABLE_TYPE_NONE
#MYTABLE_TYPE_TABLE
#MYTABLE_TYPE_ROW
#MYTABLE_TYPE_COL
#MYTABLE_TYPE_CELL
EndEnumeration
Structure _strMyTableAObject
type.i
EndStructure
Structure strMyTableAObject Extends _strMyTableAObject
brow.b
*data
image.i
sclaedimage.i
calcwidth.i
calcheight.i
dirty.b
textwidth.i
textheight.i
*table.strMyTableTable
EndStructure
Structure strMyTableCell Extends strMyTableAObject
text.s
value.d
checked.b
*row.strMyTableRow
*col.strMyTableCol
startx.i
starty.i
formula.s
EndStructure
Structure strMyTableRow Extends strMyTableAObject
List cells.strMyTableCell()
List rows.strMyTableRow()
id.q
checked.b
expanded.b
sort.s
dsort.d
level.i
EndStructure
Enumeration _menu_evt
#MYTABLE_NONE
#MYTABLE_RETURN
#MYTABLE_ESC
EndEnumeration
EnumerationBinary _MyTableColumnFlags
#MYTABLE_COLUMN_FLAGS_LEFT
#MYTABLE_COLUMN_FLAGS_RIGHT
#MYTABLE_COLUMN_FLAGS_CENTER
#MYTABLE_COLUMN_FLAGS_TEXT
#MYTABLE_COLUMN_FLAGS_INTEGER
#MYTABLE_COLUMN_FLAGS_DATE
#MYTABLE_COLUMN_FLAGS_DATE_TIME
#MYTABLE_COLUMN_FLAGS_TIME
#MYTABLE_COLUMN_FLAGS_TIME_LONG
#MYTABLE_COLUMN_FLAGS_DOUBLE
#MYTABLE_COLUMN_FLAGS_BOOLEAN
#MYTABLE_COLUMN_FLAGS_EDITABLE
#MYTABLE_COLUMN_FLAGS_IMAGE
#MYTABLE_COLUMN_FLAGS_TOP
#MYTABLE_COLUMN_FLAGS_MIDDLE
#MYTABLE_COLUMN_FLAGS_BOTTOM
#MYTABLE_COLUMN_FLAGS_RESIZEABLE
EndEnumeration
#MYTABLE_COLUMN_FLAGS_DEFAULT = #MYTABLE_COLUMN_FLAGS_LEFT|#MYTABLE_COLUMN_FLAGS_TEXT
#MYTABLE_COLUMN_FLAGS_DEFAULT_DATE = #MYTABLE_COLUMN_FLAGS_DATE|#MYTABLE_COLUMN_FLAGS_DATE_TIME
#MYTABLE_COLUMN_FLAGS_DEFAULT_TIME = #MYTABLE_COLUMN_FLAGS_TIME|#MYTABLE_COLUMN_FLAGS_TIME_LONG
#MYTABLE_COLUMN_FLAGS_DEFAULT_DATE_TIME = #MYTABLE_COLUMN_FLAGS_DEFAULT_DATE|#MYTABLE_COLUMN_FLAGS_DEFAULT_TIME
Structure strMyTableCol Extends strMyTableAObject
id.q
text.s
width.i
sort.i
flags.i
format.s
EndStructure
EnumerationBinary _MyTableTableFlags
#MYTABLE_TABLE_FLAGS_GRID
#MYTABLE_TABLE_FLAGS_HIERARCHICAL
#MYTABLE_TABLE_FLAGS_HIERARCHICAL_ARROW
#MYTABLE_TABLE_FLAGS_LAST_STRETCH
#MYTABLE_TABLE_FLAGS_NO_HEADER
#MYTABLE_TABLE_FLAGS_FULL_ROW_SELECT
#MYTABLE_TABLE_FLAGS_CHECKBOX
#MYTABLE_TABLE_FLAGS_STOP_DRAWING
#MYTABLE_TABLE_FLAGS_MULTISELECT
#MYTABLE_TABLE_FLAGS_CALLBACK
#MYTABLE_TABLE_FLAGS_ROW_RESIZEABLE
EndEnumeration
#MYTABLE_TABLE_FLAGS_DEFAULT=#MYTABLE_TABLE_FLAGS_GRID
Prototype MyTableProtoEventRowSelected(canvas,*row.strMyTableRow)
Prototype MyTableProtoEventCellSelected(canvas,*cell.strMyTableCell)
Prototype MyTableProtoEventRowChecked(canvas,*row.strMyTableRow)
Prototype MyTableProtoEventCellChecked(canvas,*cell.strMyTableCell)
Prototype MyTableProtoEventCellChangedText(canvas,*cell.strMyTableCell,old.s)
Prototype MyTableProtoEventCellChangedValue(canvas,*cell.strMyTableCell,old.d)
Prototype MyTableProtoEventCallback(canvas,*row.strMyTableRow)
Structure strMyTableTable Extends _strMyTableAObject
window.i
canvas.i
vscroll.i
hscroll.i
List rows.strMyTableRow()
Map rowsById.i()
List cols.strMyTableCol()
Map colsById.i()
flags.i
redraw.b
dirty.b
lastw.i
lasth.i
lastRowid.q
lastColid.q
rowheight.i
headerheight.i
bvs.b
bhs.b
Map selected.b()
List expRows.i()
editorgadget.i
editorwindow.i
menu.i
evtRowSelect.MyTableProtoEventRowSelected
evtCellSelect.MyTableProtoEventCellSelected
evtRowChecked.MyTableProtoEventRowChecked
evtCellChecked.MyTableProtoEventCellChecked
evtCellChangedText.MyTableProtoEventCellChangedText
evtCellChangedValue.MyTableProtoEventCellChangedValue
evtCallback.MyTableProtoEventCallback
selectedbackground.q
background.q
backgroundfixed.q
headerbackground1.q
headerbackground2.q
headerbackgroundfixed.q
forecolor.q
headerforecolor.q
selectedforecolor.q
font.i
fixedcolumns.i
resizecol.b
oldx.i
*colResize.strMyTableCol
*data
EndStructure
Declare MyTableRegisterEvents(canvas,
evtRowSelect.MyTableProtoEventRowSelected,
evtCellSelect.MyTableProtoEventCellSelected,
evtRowChecked.MyTableProtoEventRowChecked,
evtCellChecked.MyTableProtoEventCellChecked,
evtCellChangedText.MyTableProtoEventCellChangedText,
evtCellChangedValue.MyTableProtoEventCellChangedValue,
evtCallback.MyTableProtoEventCallback)
Declare _MyTableRedraw(*this.strMyTableTable)
Declare _MyTableRecalc(*this.strMyTableTable)
Declare _MyTableClearMaps(*this.strMyTableTable)
Declare _MyTableSort(*this.strMyTableTable,col.i)
Declare _MyTableResize(*this.strMyTableTable)
Declare _MyTableRecalcExp(*this.strMyTableTable,*row.strMyTableRow,w)
Declare _MyTableRegister(window,canvas,hscroll,vscroll,flags.i=#MYTABLE_TABLE_FLAGS_DEFAULT,callback.MyTableProtoEventCallback=0)
Declare _MyTableRowExpand(*row.strMyTableRow,expanded.b)
Declare _MyTableDrawText(x,y,text.s,color.q)
Declare _MyTableDrawHeader(*this.strMyTableTable,*col.strMyTableCol,bx.i,fixed.b)
Declare _MyTableDrawRow(*this.strMyTableTable,*row.strMyTableRow,w.i,bx.i,by.i,fixed.b,fullrowselect.b,grid.b,hierarchical.b,checkboxes.b)
Declare _MyTableEditCell(*cell.strMyTableCell)
Declare _MyTableStopEditCell(*this.strMyTableTable)
Declare _MyTableTextHeight(text.s)
Declare _MyTableTextWidth(text.s)
Declare MyTableEvtResize()
Declare MyTableEvtDialogResize()
Declare MyTableEvtScroll()
Declare MyTableEvtMouseDown()
Declare MyTableEvtMouseUp()
Declare MyTableEvtMouseMove()
Declare MyTableEvtDouble()
Declare MyTableEvtKeyDown()
Declare MyTableEvtReturn()
Declare MyTableEvtEsc()
Declare MyTableEvtLostFocus()
Declare MyTableRegister(window,canvas,hscroll,vscroll,flags.i=#MYTABLE_TABLE_FLAGS_DEFAULT,callback.MyTableProtoEventCallback=0)
Declare MyTableRegisterDialog(window,canvas,hscroll,vscroll,flags.i=#MYTABLE_TABLE_FLAGS_DEFAULT,callback.MyTableProtoEventCallback=0)
Declare MyTableUnRegister(canvas)
Declare MyTableSetTableFlags(canvas,flags.i)
Declare MyTableSetTableRowHeight(canvas,flags.i)
Declare MyTableSetTableSelectedRow(canvas,row.i)
Declare MyTableSetTableSelectedRowById(canvas,rowid.i)
Declare MyTableSetTableSelectedCell(canvas,row.i,col.i)
Declare MyTableSetTableData(canvas,*data)
Declare MyTableSetTableFixedColumns(canvas,columns.i)
Declare MyTableGetTableFlags(canvas)
Declare MyTableGetTableRowHeight(canvas)
Declare MyTableGetTableSelectedRow(canvas)
Declare MyTableGetTableSelectedCell(canvas)
Declare MyTableRedraw(canvas,redraw.b)
Declare MyTableGetTableData(canvas)
Declare MyTableGetTableFixedColumns(canvas)
Declare.q MyTableAddColumn(canvas,text.s,width.i,flags.i=#MYTABLE_COLUMN_FLAGS_DEFAULT,image.i=0,*data=0,sort.i=0)
Declare MyTableRemoveColumn(canvas,column.i)
Declare MyTableSetColumnText(canvas,column.i,text.s)
Declare MyTableSetColumnWidth(canvas,column.i,width.i)
Declare MyTableSetColumnFlags(canvas,column.i,flags.i)
Declare MyTableSetColumnImage(canvas,column.i,image.i)
Declare MyTableSetColumnData(canvas,column.i,*data)
Declare MyTableSetColumnSort(canvas,column.i,sort.i)
Declare.s MyTableGetColumnText(canvas,column.i)
Declare MyTableGetColumnWidth(canvas,column.i)
Declare MyTableGetColumnFlags(canvas,column.i)
Declare MyTableGetColumnImage(canvas,column.i)
Declare MyTableGetColumnData(canvas,column.i)
Declare MyTableGetColumnSort(canvas,column.i)
Declare MyTableAutosizeColumn(canvas,col.i)
Declare.q MyTableAddRow(canvas,text.s,sep.s="|",id.q=#PB_Ignore,image.i=0,*data=0,checked.b=#False,expanded.b=#False,parentid.q=0)
Declare MyTableRemoveRow(canvas,row.i)
Declare MyTableAddDirtyRow(canvas,rows.i,parentid.q=0)
Declare MyTableClearRows(canvas)
Declare MyTableSetRowImage(canvas,row.i,image.i)
Declare MyTableSetRowData(canvas,row.i,*data)
Declare MyTableSetRowChecked(canvas,row.i,checked.b)
Declare MyTableSetRowExpanded(canvas,row.i,expanded.b)
Declare MyTableGetRowImage(canvas,row.i)
Declare MyTableGetRowDirty(canvas,row.i)
Declare MyTableGetRowData(canvas,row.i)
Declare.b MyTableGetRowChecked(canvas,row.i)
Declare.b MyTableGetRowExpanded(canvas,row.i)
Declare MyTableGetRowCount(canvas)
Declare MyTableSetCellText(canvas,row.i,col.i,text.s)
Declare MyTableSetCellValue(canvas,row.i,col.i,value.d)
Declare MyTableSetCellChecked(canvas,row.i,col.i,checked.b)
Declare MyTableSetCellData(canvas,row.i,col.i,*data)
Declare MyTableSetCellImage(canvas,row.i,col.i,image.i)
Declare.s MyTableGetCellText(canvas,row.i,col.i)
Declare.d MyTableGetCellValue(canvas,row.i,col.i)
Declare MyTableGetCellChecked(canvas,row.i,col.i)
Declare MyTableGetCellData(canvas,row.i,col.i)
Declare MyTableGetCellImage(canvas,row.i,col.i)
Declare MyTableSetSelectedbackground(canvas,color.q)
Declare MyTableSetBackground(canvas,color.q)
Declare MyTableSetBackgroundFixedColumns(canvas,color.q)
Declare MyTableSetHeaderbackground1(canvas,color.q)
Declare MyTableSetHeaderbackground2(canvas,color.q)
Declare MyTableSetHeaderbackgroundFixedColumns(canvas,color.q)
Declare MyTableSetForecolor(canvas,color.q)
Declare MyTableSetHeaderforecolor(canvas,color.q)
Declare MyTableSetSelectedforecolor(canvas,color.q)
Declare.q MyTableGetSelectedbackground(canvas)
Declare.q MyTableGetBackground(canvas)
Declare.q MyTableGetBackgroundFixedColumns(canvas)
Declare.q MyTableGetHeaderbackground1(canvas)
Declare.q MyTableGetHeaderbackground2(canvas)
Declare.q MyTableGetHeaderbackgroundFixedColumns(canvas)
Declare.q MyTableGetForecolor(canvas)
Declare.q MyTableGetHeaderforecolor(canvas)
Declare.q MyTableGetSelectedforecolor(canvas)
Procedure _MyTableStopEditCell(*this.strMyTableTable)
If *this
If IsWindow(*this\editorwindow)
Protected *cell.strMyTableCell=GetGadgetData(*this\editorgadget)
If *cell
Protected *col.strMyTableCol=0
Protected *row.strMyTableRow=0
If *cell
*col=*cell\col
*row=*cell\row
Protected s.s=GetGadgetText(*this\editorgadget)
Protected sold.s=*cell\text
If s<>*cell\text
*cell\dirty=#True
*cell\textwidth=0
*cell\textheight=0
*cell\text=s
If *this\evtCellChangedText
*this\evtCellChangedText(*this\canvas,*cell,sold)
EndIf
If Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_DOUBLE)
*cell\value=ValD(s)
EndIf
If Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_INTEGER)
*cell\value=ValD(s)
EndIf
If Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_DEFAULT_DATE_TIME)
*cell\value=ParseDate(*col\format,s)
EndIf
*this\dirty=#True
_MyTableRedraw(*this)
EndIf
RemoveKeyboardShortcut(*this\editorwindow,#PB_Shortcut_Return)
RemoveKeyboardShortcut(*this\editorwindow,#PB_Shortcut_Escape)
CloseWindow(*this\editorwindow)
*this\editorwindow=0
EndIf
EndIf
EndIf
EndIf
EndProcedure
Procedure _MyTableEditCell(*cell.strMyTableCell)
If *cell
Protected *col.strMyTableCol=*cell\col
Protected *row.strMyTableRow=*cell\row
Protected *this.strMyTableTable=*cell\table
If Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_EDITABLE)
If Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_BOOLEAN)
*cell\checked=Bool(*cell\checked=#False)
*cell\value=*cell\checked
*cell\text=Str(*cell\checked)
*cell\textwidth=0
*cell\textheight=0
*cell\dirty=#True
*this\dirty=#True
If *this\evtCellChecked
*this\evtCellChecked(*this\canvas,*cell)
EndIf
_MyTableRedraw(*this)
Else
If IsWindow(*this\editorwindow)
CloseWindow(*this\editorwindow)
EndIf
*this\editorwindow=OpenWindow(#PB_Any,
DesktopUnscaledX(*cell\startx+2)+WindowX(*this\window,#PB_Window_InnerCoordinate)+GadgetX(*this\canvas,#PB_Gadget_WindowCoordinate),
DesktopUnscaledY(*cell\starty+2)+WindowY(*this\window,#PB_Window_InnerCoordinate)+GadgetY(*this\canvas,#PB_Gadget_WindowCoordinate),
DesktopUnscaledX(*col\calcwidth),
DesktopUnscaledY(*row\calcheight),
"",
#PB_Window_BorderLess,
GadgetID(*this\canvas))
*this\editorgadget=EditorGadget(#PB_Any,
0,
0,
WindowWidth(*this\editorwindow),
WindowHeight(*this\editorwindow),
#PB_Editor_WordWrap)
SetGadgetText(*this\editorgadget,*cell\text)
HideGadget(*this\editorgadget,#False)
SetActiveGadget(*this\editorgadget)
SetGadgetData(*this\editorgadget,*cell)
SetWindowData(*this\editorwindow,*cell)
AddKeyboardShortcut(*this\editorwindow,#PB_Shortcut_Return,#MYTABLE_RETURN)
AddKeyboardShortcut(*this\editorwindow,#PB_Shortcut_Escape,#MYTABLE_ESC)
BindMenuEvent(*this\menu,#MYTABLE_RETURN,@MyTableEvtReturn())
BindMenuEvent(*this\menu,#MYTABLE_ESC,@MyTableEvtEsc())
BindGadgetEvent(*this\editorgadget,@MyTableEvtLostFocus(),#PB_EventType_LostFocus)
EndIf
EndIf
EndIf
EndProcedure
Procedure _MyTableTextHeight(text.s)
ProcedureReturn TextHeight(text) * (CountString(text,#CRLF$)+1)
EndProcedure
Procedure _MyTableTextWidth(text.s)
Protected result.i=0
If FindString(text,#CRLF$)
Protected c=CountString(text,#CRLF$)+1
Protected idx=0
For idx=1 To c
Protected v=TextWidth(StringField(text,idx,#CRLF$))
If v>result
result=v
EndIf
Next
Else
result=TextWidth(text)
EndIf
ProcedureReturn result
EndProcedure
Procedure _MyTableDrawText(x,y,text.s,color.q)
If FindString(text,#CRLF$)
Protected c=CountString(text,#CRLF$)+1
Protected i=0
Protected yc=0
For i=1 To c
Protected line.s=StringField(text,i,#CRLF$)
DrawText(x,y+yc,line,color)
If line=""
yc+_MyTableTextHeight("Q")
Else
yc+_MyTableTextHeight(line)
EndIf
Next
Else
DrawText(x,y,text,color)
EndIf
EndProcedure
Procedure _MyTableRowExpand(*row.strMyTableRow,expanded.b)
*row\expanded=expanded
ForEach *row\rows()
_MyTableRowExpand(*row\rows(),expanded)
Next
EndProcedure
Procedure _MyTableDrawRow(*this.strMyTableTable,*row.strMyTableRow,w,bx.i,by.i,fixed.b,fullrowselect.b,grid.b,hierarchical.b,checkboxes.b)
If Bool(*this\flags & #MYTABLE_TABLE_FLAGS_CALLBACK) And *row\dirty And *this\evtCallback
*this\evtCallback(*this\canvas,*row)
*row\dirty=#False
EndIf
Protected idx=0
Protected firstcol.b=#True
ForEach *row\cells()
Protected *cell.strMyTableCell=*row\cells()
Protected *col.strMyTableCol=SelectElement(*this\cols(),idx):idx+1
If idx>*this\fixedcolumns And fixed
Break
EndIf
If *cell\textheight=0
If Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_BOOLEAN)
*cell\textheight=MyTableW20
Else
*cell\textheight=_MyTableTextHeight(*cell\text)
EndIf
EndIf
If *cell\textwidth=0
If Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_BOOLEAN)
*cell\textwidth=MyTableW20
Else
*cell\textwidth=_MyTableTextWidth(*cell\text)
EndIf
EndIf
Protected selected.b=#False
If fixed
Box(bx,by,*col\calcwidth,*row\calcheight,*this\backgroundfixed)
EndIf
If (fullrowselect And *this\selected(Str(*row))=#True) Or *this\selected(Str(*cell))=#True
Box(bx,by,*col\calcwidth,*row\calcheight,*this\selectedbackground)
selected=#True
EndIf
*cell\startx=bx
*cell\starty=by
DrawingMode(#PB_2DDrawing_Outlined)
If grid
Box(bx,by,*col\calcwidth,*row\calcheight,*this\headerbackground2)
EndIf
Protected foi.i=0
Protected coi.i=0
Protected cob.i=0
Protected valw=0
If Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_MIDDLE)
valw=*row\calcheight/2-*cell\textheight/2
ElseIf Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_BOTTOM)
valw=*row\calcheight-*cell\textheight
Else
valw=MyTableH2
EndIf
If firstcol And hierarchical
foi=MyTableW20 * (*row\level+1)
If ListSize(*row\rows())>0
If *row\expanded
If Bool(*this\flags & #MYTABLE_TABLE_FLAGS_HIERARCHICAL_ARROW)
DrawAlphaImage(ImageID(MyTableImageMinusArrow),bx+foi-MyTableW20,by+valw)
Else
DrawAlphaImage(ImageID(MyTableImageMinus),bx+foi-MyTableW20,by+valw)
EndIf
Else
If Bool(*this\flags & #MYTABLE_TABLE_FLAGS_HIERARCHICAL_ARROW)
DrawAlphaImage(ImageID(MyTableImagePlusArrow),bx+foi-MyTableW20,by+valw)
Else
DrawAlphaImage(ImageID(MyTableImagePlus),bx+foi-MyTableW20,by+valw)
EndIf
EndIf
EndIf
EndIf
If firstcol And checkboxes
coi=MyTableW20
If *row\checked
DrawAlphaImage(ImageID(MyTableImageCheckBoxChecked),bx+foi,by+valw)
Else
DrawAlphaImage(ImageID(MyTableImageCheckBox),bx+foi,by+valw)
EndIf
EndIf
If firstcol And IsImage(*row\sclaedimage)
cob+MyTableW20
DrawAlphaImage(ImageID(*row\sclaedimage),bx+foi+coi,by+valw)
EndIf
ClipOutput(bx,by,*col\calcwidth,*row\calcheight)
DrawingMode(#PB_2DDrawing_Transparent)
If Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_IMAGE)
If IsImage(*cell\image)
If Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_CENTER)
DrawAlphaImage(ImageID(*cell\image),bx+MyTableW2+*col\calcwidth/2-*cell\textwidth/2,by+valw)
ElseIf Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_RIGHT)
DrawAlphaImage(ImageID(*cell\image),bx+*col\calcwidth-*cell\textwidth-MyTableW4,by+valw)
Else
DrawAlphaImage(ImageID(*cell\image),bx+MyTableW2+foi,by+valw)
EndIf
EndIf
ElseIf Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_BOOLEAN)
Protected img=0
If *cell\checked
img=MyTableImageCheckBoxChecked
Else
img=MyTableImageCheckBox
EndIf
If Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_CENTER)
DrawAlphaImage(ImageID(img),bx+MyTableW2+*col\calcwidth/2-*cell\textwidth/2,by+valw)
ElseIf Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_RIGHT)
DrawAlphaImage(ImageID(img),bx+*col\calcwidth-*cell\textwidth-MyTableW4,by+valw)
Else
DrawAlphaImage(ImageID(img),bx+MyTableW2+foi,by+valw)
EndIf
Else
Protected color=*this\forecolor
If selected
color=*this\selectedforecolor
EndIf
If Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_CENTER)
_MyTableDrawText(bx+MyTableW2+*col\calcwidth/2-*cell\textwidth/2,by+valw,*cell\text,color)
ElseIf Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_RIGHT)
_MyTableDrawText(bx+*col\calcwidth-*cell\textwidth-MyTableW4,by+valw,*cell\text,color)
Else
_MyTableDrawText(bx+MyTableW2+foi+coi+cob,by+valw,*cell\text,color)
EndIf
EndIf
DrawingMode(#PB_2DDrawing_AlphaClip)
UnclipOutput()
bx+*col\calcwidth
If bx>=w
Break
EndIf
firstcol=#False
Next
ProcedureReturn *row\calcheight
EndProcedure
Procedure _MyTableDrawHeader(*this.strMyTableTable,*col.strMyTableCol,bx.i,fixed.b)
If *col\textwidth=0
*col\textwidth=_MyTableTextWidth(*col\text)
EndIf
If *col\textheight=0
*col\textheight=_MyTableTextHeight(*col\text)
EndIf
Protected soi.i=0
If *col\sort
soi=MyTableW20
EndIf
Box(bx,0,*col\calcwidth,*col\calcheight,*this\headerbackground1)
If fixed
Box(bx,0,*col\calcwidth-MyTableW2,*col\calcheight-MyTableH2,*this\headerbackgroundfixed)
Else
Box(bx,0,*col\calcwidth-MyTableW2,*col\calcheight-MyTableH2,*this\headerbackground2)
EndIf
ClipOutput(bx,0,*col\calcwidth,*col\calcheight)
DrawingMode(#PB_2DDrawing_Transparent)
If Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_CENTER)
_MyTableDrawText(bx+MyTableW2+*col\calcwidth/2-*col\textwidth/2-soi,0,*col\text,*this\headerforecolor)
ElseIf Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_RIGHT)
_MyTableDrawText(bx+*col\calcwidth-*col\textwidth-MyTableW4-soi,0,*col\text,*this\headerforecolor)
Else
_MyTableDrawText(bx+MyTableW2,0,*col\text,*this\headerforecolor)
EndIf
DrawingMode(#PB_2DDrawing_AlphaClip)
UnclipOutput()
Select *col\sort
Case -1
DrawAlphaImage(ImageID(MyTableSortImageDesc),bx+*col\calcwidth-soi,0)
Case 1
DrawAlphaImage(ImageID(MyTableSortImageAsc),bx+*col\calcwidth-soi,0)
EndSelect
ProcedureReturn *col\calcwidth
EndProcedure
Procedure _MyTableRedraw(*this.strMyTableTable)
If *this
With *this
If \redraw And \dirty
_MyTableClearMaps(*this)
Protected grid.b=Bool(\flags & #MYTABLE_TABLE_FLAGS_GRID)
Protected hierarchical.b=Bool(Bool(*this\flags & #MYTABLE_TABLE_FLAGS_HIERARCHICAL) Or Bool(*this\flags & #MYTABLE_TABLE_FLAGS_HIERARCHICAL_ARROW))
Protected laststretch.b=Bool(\flags & #MYTABLE_TABLE_FLAGS_LAST_STRETCH)
Protected noheader.b=Bool(\flags & #MYTABLE_TABLE_FLAGS_NO_HEADER)
Protected fullrowselect.b=Bool(\flags & #MYTABLE_TABLE_FLAGS_FULL_ROW_SELECT Or ListSize(*this\cols())=1)
Protected checkboxes.b=Bool(\flags & #MYTABLE_TABLE_FLAGS_CHECKBOX)
Protected idx=0
Protected w=GadgetWidth(\canvas)
Protected h=GadgetHeight(\canvas)
If \bhs
h-GadgetHeight(\hscroll)
EndIf
If \bvs
w-GadgetWidth(\vscroll)
EndIf
w=DesktopScaledX(w)
h=DesktopScaledY(h)
StartDrawing(CanvasOutput(\canvas))
DrawingMode(#PB_2DDrawing_AlphaClip)
DrawingFont(\font)
Box(0,0,OutputWidth(),OutputHeight(),\background)
Protected bx=-GetGadgetState(\hscroll)
Protected by=0
Protected firstcol.b=#True
If Not noheader
ForEach \cols()
Protected *col.strMyTableCol=\cols()
bx+_MyTableDrawHeader(*this,*col,bx,#False)
firstcol=#False
If bx>=w
Break
EndIf
Next
If *this\fixedcolumns>0
bx=0
firstcol=#True
For idx=1 To *this\fixedcolumns
*col=SelectElement(\cols(),idx-1)
bx+_MyTableDrawHeader(*this,*col,bx,#True)
firstcol=#False
Next
EndIf
by=DesktopScaledY(\headerheight)
EndIf
Protected c=ListSize(\expRows())-1
Protected i=0
For i=GetGadgetState(\vscroll) To c
SelectElement(\expRows(),i)
Protected *row.strMyTableRow=\expRows()
bx=-GetGadgetState(\hscroll)
by+_MyTableDrawRow(*this,*row,w,bx,by,#False,fullrowselect,grid,hierarchical,checkboxes)
If by>=h
Break
EndIf
Next
If *this\fixedcolumns>0
by=DesktopScaledY(\headerheight)
For i=GetGadgetState(\vscroll) To c
SelectElement(\expRows(),i)
*row=\expRows()
by+_MyTableDrawRow(*this,*row,w,0,by,#True,fullrowselect,grid,hierarchical,checkboxes)
If by>=h
Break
EndIf
Next
EndIf
StopDrawing()
\dirty=#False
EndIf
EndWith
EndIf
EndProcedure
Procedure _MyTableRecalcExp(*this.strMyTableTable,*parent.strMyTableRow,w)
ForEach *parent\rows()
Protected *row.strMyTableRow=*parent\rows()
AddElement(*this\expRows()):*this\expRows()=*row
If *row\dirty
*row\calcheight=DesktopScaledY(*this\rowheight)
*row\calcwidth=w
*row\dirty=#False
EndIf
If *row\expanded
_MyTableRecalcExp(*this,*row,w)
EndIf
Next
EndProcedure
Procedure _MyTableClearMaps(*this.strMyTableTable)
If *this
ForEach *this\selected()
If Not *this\selected()
DeleteMapElement(*this\selected())
EndIf
Next
EndIf
EndProcedure
Procedure _MyTableRecalc(*this.strMyTableTable)
If *this
If *this\dirty And *this\redraw
_MyTableClearMaps(*this)
With *this
Protected laststretch.b=Bool(\flags & #MYTABLE_TABLE_FLAGS_LAST_STRETCH)
Protected noheader.b=Bool(\flags & #MYTABLE_TABLE_FLAGS_NO_HEADER)
Protected callback.b=Bool(\flags & #MYTABLE_TABLE_FLAGS_CALLBACK)
Protected hierarchical.b=Bool(Bool(*this\flags & #MYTABLE_TABLE_FLAGS_HIERARCHICAL) Or Bool(*this\flags & #MYTABLE_TABLE_FLAGS_HIERARCHICAL_ARROW))
Protected *lastCol.strMyTableCol=0
Protected w=0
Protected idx=0
ForEach \cols()
Protected *col.strMyTableCol=\cols()
*lastCol=*col
If *col\dirty
*col\calcheight=DesktopScaledY(\headerheight)
*col\calcwidth=DesktopScaledX(*col\width)
*col\dirty=#False
EndIf
w+*col\calcwidth
Next
ClearList(*this\expRows())
ForEach \rows()
Protected *row.strMyTableRow=\rows()
AddElement(*this\expRows()):*this\expRows()=*row
If *row\dirty
*row\calcheight=DesktopScaledY(\rowheight)
*row\calcwidth=w
If Not callback
*row\dirty=#False
EndIf
EndIf
If *row\expanded And hierarchical
_MyTableRecalcExp(*this,*row,w)
EndIf
Next
If w>\lastw
SetGadgetAttribute(\hscroll,#PB_ScrollBar_Maximum,w-\lastw)
EndIf
\bhs=Bool(w>\lastw)
HideGadget(\hscroll,Bool(w<=\lastw))
If Not \bhs
SetGadgetState(\hscroll,0)
EndIf
Protected h=ListSize(\expRows())
If \bhs
h-(GadgetHeight(\canvas)-GadgetHeight(\hscroll))/\rowheight
Else
h-GadgetHeight(\canvas)/\rowheight
EndIf
If Not noheader
h+1
EndIf
\bvs=Bool(h>0)
HideGadget(\vscroll,Bool(h<=0))
SetGadgetAttribute(\vscroll,#PB_ScrollBar_Maximum,h)
If laststretch And *col
*col\calcheight=DesktopScaledY(\headerheight)
*col\calcwidth=DesktopScaledX(GadgetWidth(\canvas))
If \bvs
*col\calcwidth-DesktopScaledX(GadgetWidth(\vscroll))
EndIf
*col\dirty=#True
EndIf
EndWith
_MyTableRedraw(*this)
EndIf
EndIf
EndProcedure
Procedure _MyTableSort(*this.strMyTableTable,col.i)
If *this
Protected *col.strMyTableCol=SelectElement(*this\cols(),col)
Protected bdsort.b=Bool(Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_BOOLEAN) Or
Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_DEFAULT_DATE_TIME) Or
Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_INTEGER) Or
Bool(*col\flags & #MYTABLE_COLUMN_FLAGS_DOUBLE))
ForEach *this\rows()
Protected *row.strMyTableRow=*this\rows()
SelectElement(*row\cells(),col)
If bdsort
*row\dsort=*row\cells()\value
Else
*row\sort=*row\cells()\text
EndIf
Next
Select *this\cols()\sort
Case -1
*this\cols()\sort=0
SortStructuredList(*this\rows(),#PB_Sort_Ascending,OffsetOf(strMyTableRow\id),TypeOf(strMyTableRow\id))
Case 0
*this\cols()\sort=1
If bdsort
SortStructuredList(*this\rows(),#PB_Sort_Ascending,OffsetOf(strMyTableRow\dsort),TypeOf(strMyTableRow\dsort))
Else
SortStructuredList(*this\rows(),#PB_Sort_Ascending,OffsetOf(strMyTableRow\sort),TypeOf(strMyTableRow\sort))
EndIf
Case 1
*this\cols()\sort=-1
If bdsort
SortStructuredList(*this\rows(),#PB_Sort_Descending,OffsetOf(strMyTableRow\dsort),TypeOf(strMyTableRow\dsort))
Else
SortStructuredList(*this\rows(),#PB_Sort_Descending,OffsetOf(strMyTableRow\sort),TypeOf(strMyTableRow\sort))
EndIf
EndSelect
EndIf
EndProcedure
Procedure _MyTableResize(*this.strMyTableTable)
If *this
With *this
Protected w=GadgetWidth(\canvas)
Protected h=GadgetHeight(\canvas)
If w<>\lastw Or h<>\lasth Or \dirty
\lasth=h
\lastw=w
ResizeGadget(\vscroll,
\lastw-GadgetWidth(\vscroll),
#PB_Ignore,
#PB_Ignore,
\lasth-GadgetHeight(\hscroll))
ResizeGadget(\hscroll,
#PB_Ignore,
\lasth-GadgetHeight(\hscroll),
\lastw-GadgetWidth(\vscroll),
#PB_Ignore)
\dirty=#True
_MyTableRecalc(*this)
EndIf
EndWith
EndIf
EndProcedure
Procedure _MyTableAddDirtyRow(*this.strMyTableTable,*row.strMyTableRow)
*row\dirty=#True
*row\table=*this
*this\lastRowid+1
*row\id=*this\lastRowid
*row\type=#MYTABLE_TYPE_ROW
Protected i
For i=1 To ListSize(*this\cols())
Protected *cell.strMyTableCell=AddElement(*row\cells())
*cell\row=*row
*cell\table=*this
*cell\type=#MYTABLE_TYPE_CELL
*cell\col=SelectElement(*this\cols(),i-1)
Next
EndProcedure