require 'fox16'
include Fox
class CustomTableItem < FXTableItem
def drawContent(table, dc, x, y, w, h)
puts "in drawContent()"
hg = table.horizontalGridShown?
vg = table.verticalGridShown?
ml = table.marginLeft + (vg ? 1 : 0)
mt = table.marginTop + (hg ? 1 : 0)
mr = table.marginRight
mb = table.marginBottom
font = dc.font
lbl = text
icn = icon
# Text width and height
beg, tw, th = 0, 0, 0
begin
_end = beg;
_end += 1 while _end < lbl.length && lbl[_end].chr != '\n'
t = font.getTextWidth(lbl[beg..._end])
tw = t if t > tw
th += font.fontHeight
beg = _end + 1
end while _end < lbl.length
# Icon size
iw, ih = 0, 0
unless icn.nil?
iw = icn.width
ih = icn.height
end
# Icon-text spacing
s = 0
s = 4 if (iw > 0 && tw > 0)
# Fix x coordinate
if justify & LEFT == 1
case iconPosition
when BEFORE
ix = x + ml
tx = ix + iw + s
when AFTER
tx = x + ml
ix = tx + tw + s
else
ix = x + ml
tx = x + ml
end
elsif justify & RIGHT == 1
case iconPosition
when BEFORE
tx = x + w - mr - tw
ix = tx - iw - s
when AFTER
ix = x + w - mr - iw
tx = ix - tw - s
else
ix = x + w - mr - iw
tx = x + w - mr - tw
end
else
case iconPosition
when BEFORE
ix = x + (ml + w - mr)/2 - (tw + iw + s)/2
tx = ix + iw + s
when AFTER
tx = x + (ml + w - mr)/2 - (tw + iw + s)/2
ix = tx + tw + s
else
ix = x + (ml + w - mr)/2 - iw/2
tx = x + (ml + w - mr)/2 -tw/2
end
end
# Fix y coordinate
if justify & TOP == 1
case iconPosition
when ABOVE
iy = y + mt
ty = iy + ih
when BELOW
ty = y + mt
iy = ty + th
else
iy = y + mt
ty = y + mt
end
elsif justify & BOTTOM == 1
case iconPosition
when ABOVE
ty = y + h - mb - th
iy = ty - ih
when BELOW
iy = y + h - mb - ih
ty = iy - th
else
iy = y + h - mb - ih
ty = y + h - mb - th
end
else
case iconPosition
when ABOVE
iy = y + (mt + h - mb)/2 - (th + ih)/2
ty = iy + ih
when BELOW
ty = y + (mt + h - mb)/2 - (th + ih)/2
iy = ty + th
else
iy = y + (mt + h - mb)/2 - ih/2
ty = y + (mt + h - mb)/2 - th/2
end
end
# Paint icon
dc.drawIcon(icn, ix, iy) unless icn.nil?
# Text color
if selected?
dc.foreground = table.selTextColor
else
dc.foreground = table.textColor
end
puts "dc.foreground = (#{FXREDVAL(dc.foreground)}, #{FXGREENVAL(dc.foreground)}, #{FXBLUEVAL(dc.foreground)})"
# Draw text
yy = ty + font.fontAscent
beg = 0
begin
_end = beg
_end += 1 while _end < lbl.length && lbl[_end].chr != '\n'
if justify & LEFT == 1
xx = tx
elsif justify & RIGHT == 1
xx = tx + tw - font.getTextWidth(lbl[beg..._end])
else
xx = tx + (tw - font.getTextWidth(lbl[beg..._end]))/2
end
dc.drawText(xx, yy, lbl[beg..._end])
yy += font.fontHeight
beg = _end + 1
end while _end < lbl.length
end
end
class CustomTable < FXTable
def createItem *parameters
CustomTableItem.new *parameters
end
end
app = FXApp.new
main = FXMainWindow.new app, 'Test'
table = CustomTable.new main
table.setTableSize 2, 2
table.visibleRows = 2
table.visibleColumns = 2
table.setItemText 0, 0, 'one'
table.setItemText 0, 1, 'two'
table.setItemText 1, 0, 'three'
table.setItemText 1, 1, 'four'
app.create
main.show PLACEMENT_SCREEN
app.run