PageRenderTime 38ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/examples/mail/MailList.py

http://pyjamas.googlecode.com/
Python | 155 lines | 133 code | 14 blank | 8 comment | 8 complexity | 53f217e829ca7c6ed9e87c19437bbf03 MD5 | raw file
Possible License(s): LGPL-2.1, Apache-2.0
  1. from ui import ClickListener, Composite, FlexTable, HTML, HorizontalPanel, SourcesTableEvents, TableListener, Widget, Label, HasAlignment
  2. from MailItems import MailItems
  3. from Logger import Logger
  4. class MailList(Composite):
  5. VISIBLE_EMAIL_COUNT = 10
  6. def __init__(self, mailObject):
  7. self.countLabel = HTML()
  8. self.newerButton = HTML("<a href='javascript:;'>&lt; newer</a>", True)
  9. self.olderButton = HTML("<a href='javascript:;'>older &gt;</a>", True)
  10. self.startIndex = 0
  11. self.selectedRow = -1
  12. self.table = FlexTable()
  13. self.navBar = HorizontalPanel()
  14. self.mailObject = mailObject
  15. # Setup the table.
  16. self.table.setCellSpacing(0)
  17. self.table.setCellPadding(2)
  18. self.table.setWidth("100%")
  19. # Hook up events.
  20. self.table.addTableListener(self)
  21. self.newerButton.addClickListener(self)
  22. self.olderButton.addClickListener(self)
  23. # Create the 'navigation' bar at the upper-right.
  24. innerNavBar = HorizontalPanel()
  25. innerNavBar.setStyleName("mail-ListNavBar")
  26. innerNavBar.setSpacing(8)
  27. innerNavBar.add(self.newerButton)
  28. innerNavBar.add(self.countLabel)
  29. innerNavBar.add(self.olderButton)
  30. self.navBar.setHorizontalAlignment(HasAlignment.ALIGN_RIGHT)
  31. self.navBar.add(innerNavBar)
  32. self.navBar.setWidth("100%")
  33. self.initWidget(self.table)
  34. self.setStyleName("mail-List")
  35. self.initTable()
  36. self.update()
  37. def onCellClicked(self, sender, row, cell):
  38. # Select the row that was clicked (-1 to account for header row).
  39. if (row > 0):
  40. self.selectRow(row - 1)
  41. def onClick(self, sender):
  42. if (sender == self.olderButton):
  43. # Move forward a page.
  44. self.startIndex = self.startIndex + MailList.VISIBLE_EMAIL_COUNT
  45. if (self.startIndex >= MailItems().getMailItemCount()):
  46. self.startIndex = self.startIndex - MailList.VISIBLE_EMAIL_COUNT
  47. else:
  48. self.styleRow(self.selectedRow, False)
  49. self.selectedRow = -1
  50. self.update()
  51. elif (sender == self.newerButton):
  52. # Move back a page.
  53. self.startIndex = self.startIndex - MailList.VISIBLE_EMAIL_COUNT
  54. if (self.startIndex < 0):
  55. self.startIndex = 0
  56. else:
  57. self.styleRow(self.selectedRow, False)
  58. self.selectedRow = -1
  59. self.update()
  60. def initTable(self):
  61. # Create the header row.
  62. self.table.setText(0, 0, "sender")
  63. self.table.setText(0, 1, "email")
  64. self.table.setText(0, 2, "subject")
  65. self.table.setWidget(0, 3, self.navBar)
  66. self.table.getRowFormatter().setStyleName(0, "mail-ListHeader")
  67. # Initialize the rest of the rows.
  68. i = 0
  69. while i < MailList.VISIBLE_EMAIL_COUNT:
  70. self.table.setText(i + 1, 0, "")
  71. self.table.setText(i + 1, 1, "")
  72. self.table.setText(i + 1, 2, "")
  73. self.table.getCellFormatter().setWordWrap(i + 1, 0, False)
  74. self.table.getCellFormatter().setWordWrap(i + 1, 1, False)
  75. self.table.getCellFormatter().setWordWrap(i + 1, 2, False)
  76. self.table.getFlexCellFormatter().setColSpan(i + 1, 2, 2)
  77. i = i + 1
  78. def selectRow(self, row):
  79. # When a row (other than the first one, which is used as a header) is
  80. # selected, display its associated MailItem.
  81. item = MailItems().getMailItem(self.startIndex + row)
  82. if (item == None):
  83. return
  84. self.styleRow(self.selectedRow, False)
  85. self.styleRow(row, True)
  86. item.read = True
  87. self.selectedRow = row
  88. self.mailObject.get().displayItem(item)
  89. def styleRow(self, row, selected):
  90. if (row != -1):
  91. if (selected):
  92. self.table.getRowFormatter().addStyleName(row + 1, "mail-SelectedRow")
  93. else:
  94. self.table.getRowFormatter().removeStyleName(row + 1, "mail-SelectedRow")
  95. def update(self):
  96. # Update the older/newer buttons & label.
  97. count = MailItems().getMailItemCount()
  98. max = self.startIndex + MailList.VISIBLE_EMAIL_COUNT
  99. if (max > count):
  100. max = count
  101. self.newerButton.setVisible(self.startIndex != 0)
  102. self.olderButton.setVisible(self.startIndex + MailList.VISIBLE_EMAIL_COUNT < count)
  103. startIndexPlusOne = self.startIndex + 1
  104. self.countLabel.setText("" + startIndexPlusOne + " - " + max + " of " + count)
  105. # Show the selected emails.
  106. i = 0
  107. while (i < MailList.VISIBLE_EMAIL_COUNT):
  108. # Don't read past the end.
  109. if (self.startIndex + i >= MailItems().getMailItemCount()):
  110. break
  111. item = MailItems().getMailItem(self.startIndex + i)
  112. # Add a row to the table, then set each of its columns to the
  113. # email's sender and subject values.
  114. self.table.setText(i + 1, 0, item.sender)
  115. self.table.setText(i + 1, 1, item.email)
  116. self.table.setText(i + 1, 2, item.subject)
  117. i = i + 1
  118. # Clear any remaining slots.
  119. while (i < MailList.VISIBLE_EMAIL_COUNT):
  120. self.table.setHTML(i + 1, 0, "&nbsp;")
  121. self.table.setHTML(i + 1, 1, "&nbsp;")
  122. self.table.setHTML(i + 1, 2, "&nbsp;")
  123. i = i + 1
  124. # Select the first row if none is selected.
  125. if (self.selectedRow == -1):
  126. self.selectRow(0)