/examples/dynamictable/DynaTableWidget.py

http://pyjamas.googlecode.com/ · Python · 139 lines · 103 code · 36 blank · 0 comment · 11 complexity · 9cc39e3449ff1ee78ac2d237d4fbf1c5 MD5 · raw file

  1. from ui import Composite, DockPanel, HTML, HorizontalPanel, DockPanel, HasAlignment, Button, Grid
  2. class NavBar(Composite):
  3. def __init__(self, owner):
  4. self.owner = owner
  5. self.bar = DockPanel()
  6. self.gotoFirst = Button("<<", self)
  7. self.gotoNext = Button(">", self)
  8. self.gotoPrev = Button("<", self)
  9. self.status = HTML()
  10. self.initWidget(self.bar)
  11. self.bar.setStyleName("navbar")
  12. self.status.setStyleName("status")
  13. buttons = HorizontalPanel()
  14. buttons.add(self.gotoFirst)
  15. buttons.add(self.gotoPrev)
  16. buttons.add(self.gotoNext)
  17. self.bar.add(buttons, DockPanel.EAST)
  18. self.bar.setCellHorizontalAlignment(buttons, HasAlignment.ALIGN_RIGHT)
  19. self.bar.add(self.status, DockPanel.CENTER)
  20. self.bar.setVerticalAlignment(HasAlignment.ALIGN_MIDDLE)
  21. self.bar.setCellHorizontalAlignment(self.status, HasAlignment.ALIGN_RIGHT)
  22. self.bar.setCellVerticalAlignment(self.status, HasAlignment.ALIGN_MIDDLE)
  23. self.bar.setCellWidth(self.status, "100%")
  24. self.gotoPrev.setEnabled(False)
  25. self.gotoFirst.setEnabled(False)
  26. def onClick(self, sender):
  27. if sender == self.gotoNext:
  28. self.owner.startRow += self.owner.getDataRowCount()
  29. self.owner.refresh()
  30. elif sender == self.gotoPrev:
  31. self.owner.startRow -= self.owner.getDataRowCount()
  32. if self.owner.startRow < 0:
  33. self.owner.startRow = 0
  34. self.owner.refresh()
  35. elif sender == self.gotoFirst:
  36. self.owner.startRow = 0
  37. self.owner.refresh()
  38. class RowDataAcceptorImpl:
  39. def __init__(self, owner):
  40. self.owner = owner
  41. def accept(self, startRow, data):
  42. destRowCount = self.owner.getDataRowCount()
  43. destColCount = self.owner.grid.getCellCount(0)
  44. srcRowIndex = 0
  45. srcRowCount = len(data)
  46. destRowIndex = 1
  47. while srcRowIndex < srcRowCount:
  48. srcRowData = data[srcRowIndex]
  49. for srcColIndex in range(destColCount):
  50. cellHTML = srcRowData[srcColIndex]
  51. self.owner.grid.setText(destRowIndex, srcColIndex, cellHTML)
  52. srcRowIndex += 1
  53. destRowIndex += 1
  54. isLastPage = False
  55. while destRowIndex < destRowCount + 1:
  56. isLastPage = True
  57. for destColIndex in range(destColCount):
  58. self.owner.grid.clearCell(destRowIndex, destColIndex)
  59. destRowIndex += 1
  60. self.owner.navbar.gotoNext.setEnabled(not isLastPage)
  61. self.owner.navbar.gotoFirst.setEnabled(startRow > 0)
  62. self.owner.navbar.gotoPrev.setEnabled(startRow > 0)
  63. self.owner.setStatusText(str(startRow + 1) + " - " + str(startRow + srcRowCount))
  64. def failed(self, message):
  65. msg = "Failed to access data"
  66. if message:
  67. msg += ": " + message
  68. self.owner.setStatusText(msg)
  69. class DynaTableWidget(Composite):
  70. def __init__(self, provider, columns, columnStyles, rowCount):
  71. Composite.__init__(self)
  72. self.acceptor = RowDataAcceptorImpl(self)
  73. self.outer = DockPanel()
  74. self.startRow = 0
  75. self.grid = Grid()
  76. self.navbar = NavBar(self)
  77. self.provider = provider
  78. self.initWidget(self.outer)
  79. self.grid.setStyleName("table")
  80. self.outer.add(self.navbar, DockPanel.NORTH)
  81. self.outer.add(self.grid, DockPanel.CENTER)
  82. self.initTable(columns, columnStyles, rowCount)
  83. self.setStyleName("DynaTable-DynaTableWidget")
  84. def initTable(self, columns, columnStyles, rowCount):
  85. self.grid.resize(rowCount + 1, len(columns))
  86. for i in range(len(columns)):
  87. self.grid.setText(0, i, columns[i])
  88. if columnStyles:
  89. self.grid.cellFormatter.setStyleName(0, i, columnStyles[i] + "header")
  90. def setStatusText(self, text):
  91. self.navbar.status.setText(text)
  92. def clearStatusText(self, text):
  93. self.navbar.status.setHTML("&nbsp;")
  94. def refresh(self):
  95. self.navbar.gotoFirst.setEnabled(False)
  96. self.navbar.gotoPrev.setEnabled(False)
  97. self.navbar.gotoNext.setEnabled(False)
  98. self.setStatusText("Please wait...")
  99. self.provider.updateRowData(self.startRow, self.grid.getRowCount() - 1, self.acceptor)
  100. def setRowCount(self, rows):
  101. self.grid.resizeRows(rows)
  102. def getDataRowCount(self):
  103. return self.grid.getRowCount() - 1