itemview.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #include "itemview.h"
  2. #include "tvision/include/tvision/ttypes.h"
  3. TPalette &TItemViewer::getPalette() const {
  4. static TPalette palette(cpTestView, sizeof(cpTestView) - 1);
  5. return palette;
  6. }
  7. const int maxLineLength = 256;
  8. const char *const TItemViewer::name = "TItemViewer";
  9. extern char text[100];
  10. void TItemViewer::handleEvent(TEvent &event) {
  11. TScroller::handleEvent(event);
  12. switch (event.what) {
  13. case evKeyDown:
  14. switch (event.keyDown.keyCode) {
  15. case kbDown:
  16. if (selectedLine < fileLines->getCount() - 1)
  17. selectedLine++;
  18. clearEvent(event);
  19. break;
  20. case kbUp:
  21. if (selectedLine > 0)
  22. selectedLine--;
  23. clearEvent(event);
  24. break;
  25. }
  26. break;
  27. case evMouseDown:
  28. TPoint mouse = makeLocal(event.mouse.where);
  29. int i = findSel(mouse);
  30. if (i != -1)
  31. selectedLine = i;
  32. clearEvent(event);
  33. break;
  34. }
  35. sprintf(text, "%s: %d", fileName, selectedLine);
  36. TProgram::application->statusLine->update();
  37. draw();
  38. TProgram::application->statusLine->draw();
  39. }
  40. int TItemViewer::findSel(TPoint p) {
  41. TRect r = getExtent();
  42. if (!r.contains(p))
  43. return -1;
  44. else {
  45. int s = p.y - 2;
  46. if (s >= fileLines->getCount())
  47. return -1;
  48. else
  49. return s;
  50. }
  51. }
  52. TItemViewer::TItemViewer(const TRect &bounds, TScrollBar *aHScrollBar,
  53. TScrollBar *aVScrollBar, const ViewedColumn &col)
  54. : TScroller(bounds, aHScrollBar, aVScrollBar) {
  55. if (col == ViewedColumn::Categories)
  56. growMode = gfGrowHiX | gfGrowHiY;
  57. else
  58. growMode = gfGrowHiY;
  59. isValid = True;
  60. fileLines = new TItemCollection(5, 5);
  61. switch (col) {
  62. case ViewedColumn::Items:
  63. fileName = newStr("Items");
  64. break;
  65. case ViewedColumn::Categories:
  66. fileName = newStr("Categories");
  67. break;
  68. case ViewedColumn::Weights:
  69. fileName = newStr("Weights");
  70. break;
  71. }
  72. fileLines->insert(newStr("1"));
  73. fileLines->insert(newStr("2"));
  74. fileLines->insert(newStr("3"));
  75. fileLines->insert(newStr("4"));
  76. fileLines->insert(newStr("5"));
  77. fileLines->insert(newStr("6"));
  78. fileLines->insert(newStr("7"));
  79. }
  80. TItemViewer::~TItemViewer() { destroy(fileLines); }
  81. void TItemViewer::draw() {
  82. TDrawBuffer b;
  83. char *p;
  84. TAttrPair cNormal = getColor(1);
  85. TAttrPair cFrame = getColor(3);
  86. TAttrPair cSelected = getColor(2);
  87. TAttrPair cHeader = getColor(4);
  88. if (getState(sfFocused)) {
  89. setStyle(cHeader[0], slBold);
  90. setStyle(cFrame[0], slBold);
  91. }
  92. // Header
  93. b.moveChar(0, ' ', cNormal, size.x);
  94. b.moveChar(size.x - 1, BOX_SINGLE_VERTICAL, cFrame, 1);
  95. b.moveStr(0, fileName, getState(sfFocused) ? cHeader : cFrame);
  96. writeBuf(0, 0, (short)size.x, 1, b);
  97. // Line
  98. b.moveChar(0, ' ', cFrame, size.x);
  99. char line[128] = {0};
  100. memset(line, BOX_SINGLE_HORIZONTAL, size.x - 1);
  101. b.moveStr(0, line, cFrame);
  102. b.moveChar(size.x - 1, BOX_CROSS_SINGLE, cFrame, 1);
  103. writeBuf(0, 1, (short)size.x, 1, b);
  104. for (short i = 0; i < size.y; i++) {
  105. b.moveChar(0, ' ', cFrame, size.x);
  106. b.moveChar(size.x - 1, BOX_SINGLE_VERTICAL, cFrame, 1);
  107. if (delta.y + i < fileLines->getCount()) {
  108. p = (char *)(fileLines->at(delta.y + i));
  109. if (p)
  110. b.moveStr(0, p, i == selectedLine ? cSelected : cNormal);
  111. }
  112. writeBuf(0, i + 2, (short)size.x, 1, b);
  113. }
  114. }
  115. void TItemViewer::scrollDraw() {
  116. TScroller::scrollDraw();
  117. draw();
  118. }
  119. void TItemViewer::setState(ushort aState, Boolean enable) {
  120. TScroller::setState(aState, enable);
  121. if (enable && (aState & sfExposed))
  122. setLimit(limit.x, limit.y);
  123. }
  124. Boolean TItemViewer::valid(ushort) const { return isValid; }
  125. void *TItemViewer::read(ipstream &is) {
  126. char *fName = NULL;
  127. TScroller::read(is);
  128. delete fName;
  129. return this;
  130. }
  131. void TItemViewer::write(opstream &os) {
  132. TScroller::write(os);
  133. os.writeString(fileName);
  134. }
  135. TStreamable *TItemViewer::build() { return new TItemViewer(streamableInit); }
  136. TStreamableClass RItemView(TItemViewer::name, TItemViewer::build,
  137. __DELTA(TItemViewer));