blob: e00d16de51ab4f69d30ba2b0566ea6a348a9c662 [file] [log] [blame]
yangsu@google.coma8a42e22011-06-16 20:49:55 +00001#include "SkDebuggerViews.h"
2
3SkCommandListView::SkCommandListView() {
4 fBGColor = 0xFFBBBBBB;
5 fTopIndex = 0;
6 fHighlight = 0;
7
8 SkPaint p;
9 p.setTextSize(SkIntToScalar(SkDebugger_TextSize));
10 fSpacing = p.getFontSpacing();
11 fCentered = false;
12 fRange = (int)(this->height()/fSpacing) - 1;
13}
14
15bool SkCommandListView::onEvent(const SkEvent& evt) {
16 if (evt.isType(SkDebugger_CommandType)) {
17 SkString msg(evt.findString(SkDebugger_Atom));
18 fList.push_back(msg);
19 this->inval(NULL);
20 return true;
21 }
22 return this->INHERITED::onEvent(evt);
23}
24
25void SkCommandListView::onSizeChange() {
26 fRange = (int)(this->height()/fSpacing) - 1;
27 this->INHERITED::onSizeChange();
28}
29
30void SkCommandListView::reinit() {
31 fList.clear();
32 fTopIndex = 0;
33 fHighlight = 0;
34}
35
36void SkCommandListView::alignCenter() {
37 if (!fCentered || fHighlight < fRange/2 || fHighlight > (fList.size() - fRange/2))
38 return;
39 else {
40 if (fHighlight > (fTopIndex + fRange/2)) {
41 fTopIndex += fHighlight - (fTopIndex + fRange/2);
42 }
43 if (fHighlight < (fTopIndex + fRange/2)) {
44 fTopIndex -= (fTopIndex + fRange/2) - fHighlight;
45 }
46 }
47}
48
49int SkCommandListView::nextItem() {
50 if (fHighlight < fList.size() - 1)
51 ++fHighlight;
52 if (fHighlight < fTopIndex || fHighlight > (fTopIndex + fRange)) {
53 fTopIndex = fHighlight;
54 }
55 if (fHighlight == (fTopIndex + fRange)) {
56 ++fTopIndex;
57 }
58 this->alignCenter();
59 this->inval(NULL);
60 return fHighlight;
61}
62
63int SkCommandListView::prevItem() {
64 if (fHighlight > 0)
65 --fHighlight;
66 if (fHighlight < fTopIndex || fHighlight > (fTopIndex + fRange)) {
67 fTopIndex = fHighlight;
68 }
69 this->alignCenter();
70 this->inval(NULL);
71 return fHighlight;
72}
73
74int SkCommandListView::scrollUp() {
75 if (fTopIndex > 0)
76 --fTopIndex;
77 this->inval(NULL);
78 return fHighlight;
79}
80
81int SkCommandListView::scrollDown() {
82 if (fTopIndex < (fList.size() - 1))
83 ++fTopIndex;
84 this->inval(NULL);
85 return fHighlight;
86}
87
88void SkCommandListView::highlight(int index) {
89 SkASSERT(index >= 0 && index < fList.size());
90 if (fHighlight != index) {
91 fHighlight = index;
92 this->alignCenter();
93 this->inval(NULL);
94 }
95}
96
97int SkCommandListView::selectHighlight(int ypos) {
98 int i = (int)(ypos/fSpacing) + fTopIndex;
99 if (i >= fList.size()) {
100 i = fList.size() - 1;
101 }
102 if (fHighlight != i) {
103 fHighlight = i;
104 this->alignCenter();
105 this->inval(NULL);
106 }
107 return fHighlight;
108}
109
110void SkCommandListView::toggleCentered() {
111 fCentered = !fCentered;
112 this->alignCenter();
113 this->inval(NULL);
114}
115
116void SkCommandListView::onDraw(SkCanvas* canvas) {
117 canvas->drawColor(fBGColor);
118
119 SkPaint p;
120 p.setTextSize(SkIntToScalar(SkDebugger_TextSize));
121 p.setAntiAlias(true);
122
123 //draw highlight
124 int selected = fHighlight - fTopIndex;
125 SkRect r = {0, fSpacing * selected, this->width(), fSpacing * (selected+1)};
126 p.setColor(0x880033DD);
127 canvas->drawRect(r, p);
128
129 int endIndex = fTopIndex + fRange;
130 if (endIndex > fList.size())
131 endIndex = fList.size();
132
133 p.setColor(0xFF000000);
134 int pos;
135 for (int i = fTopIndex; i < endIndex; ++i) {
136 pos = i - fTopIndex;
137 canvas->drawText(fList[i].c_str(), fList[i].size(),
138 0, fSpacing - 2 + fSpacing * pos, p);
139 }
140 this->INHERITED::onDraw(canvas);
141}