blob: 735c808a59065ae0767c0f6f5a8b63c0fe2bfd46 [file] [log] [blame]
yangsu@google.comef7bdfa2011-08-12 14:27:47 +00001
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8#include "DebuggerViews.h"
9
10DebuggerCommandsView::DebuggerCommandsView() {
11 fBGColor = 0xFFBBBBBB;
12 fTopIndex = 0;
13 fHighlight = 0;
14 fResizing = false;
rmistry@google.comd6176b02012-08-23 18:14:13 +000015
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000016 SkPaint p;
17 p.setTextSize(SkIntToScalar(SKDEBUGGER_TEXTSIZE));
18 fSpacing = p.getFontSpacing();
19 fCentered = false;
20 fRange = (int)(this->height()/fSpacing) - 1;
21}
22
23DebuggerCommandsView::~DebuggerCommandsView() {
24 fList.deleteAll();
25}
26
27bool DebuggerCommandsView::onEvent(const SkEvent& evt) {
28 if (evt.isType(SKDEBUGGER_COMMANDTYPE)) {
29 *fList.append() = new SkString(evt.findString(SKDEBUGGER_ATOM));
30 this->inval(NULL);
31 return true;
32 }
33 return this->INHERITED::onEvent(evt);
34}
35
36void DebuggerCommandsView::onSizeChange() {
37 fRange = (int)(this->height()/fSpacing);
38 this->INHERITED::onSizeChange();
39}
40
41void DebuggerCommandsView::alignCenter() {
42 if (!fCentered || fHighlight < fRange/2 || fHighlight > (fList.count() - fRange/2)) {
43 return;
44 } else {
rmistry@google.comd6176b02012-08-23 18:14:13 +000045 if (fHighlight > (fTopIndex + fRange/2))
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000046 fTopIndex += fHighlight - (fTopIndex + fRange/2);
47 if (fHighlight < (fTopIndex + fRange/2))
48 fTopIndex -= (fTopIndex + fRange/2) - fHighlight;
49 }
50}
51
52int DebuggerCommandsView::nextItem() {
53 if (fHighlight < fList.count() - 1)
54 ++fHighlight;
55 if (fHighlight < fTopIndex || fHighlight > (fTopIndex + fRange))
56 fTopIndex = fHighlight;
57 if (fHighlight == (fTopIndex + fRange))
58 ++fTopIndex;
59 this->alignCenter();
60 this->inval(NULL);
61 return fHighlight;
62}
63
64int DebuggerCommandsView::prevItem() {
65 if (fHighlight > 0)
66 --fHighlight;
67 if (fHighlight < fTopIndex || fHighlight > (fTopIndex + fRange))
68 fTopIndex = fHighlight;
69 this->alignCenter();
70 this->inval(NULL);
71 return fHighlight;
72}
73
74int DebuggerCommandsView::scrollUp() {
75 if (fTopIndex > 0)
76 --fTopIndex;
77 this->inval(NULL);
78 return fHighlight;
79}
80
81int DebuggerCommandsView::scrollDown() {
82 if (fTopIndex < (fList.count() - 1))
83 ++fTopIndex;
84 this->inval(NULL);
85 return fHighlight;
86}
87
88void DebuggerCommandsView::highlight(int index) {
89 SkASSERT(index >= 0 && index < fList.count());
90 if (fHighlight != index) {
91 fHighlight = index;
92 this->alignCenter();
93 this->inval(NULL);
94 }
95}
96
97int DebuggerCommandsView::selectHighlight(int ypos) {
98 int i = (int)(ypos/fSpacing) + fTopIndex;
99 if (i >= fList.count()) {
100 i = fList.count() - 1;
101 }
102 if (fHighlight != i) {
103 fHighlight = i;
104 this->alignCenter();
105 this->inval(NULL);
106 }
107 return fHighlight;
108}
109
110void DebuggerCommandsView::toggleCentered() {
111 fCentered = !fCentered;
112 this->alignCenter();
113 this->inval(NULL);
114}
115
116void DebuggerCommandsView::onDraw(SkCanvas* canvas) {
117 canvas->drawColor(fBGColor);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000118
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000119 SkPaint p;
120 p.setTextSize(SkIntToScalar(SKDEBUGGER_TEXTSIZE));
121 p.setAntiAlias(true);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000122
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000123 //draw highlight
124 int selected = fHighlight - fTopIndex;
125 SkRect r = {0, fSpacing * selected, this->width(), fSpacing * (selected+1)};
126 p.setColor(SKDEBUGGER_HIGHLIGHTCOLOR);
127 canvas->drawRect(r, p);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000128
129 int endIndex = fTopIndex + fRange;
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000130 if (endIndex > fList.count())
131 endIndex = fList.count();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000132
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000133 p.setColor(SKDEBUGGER_TEXTCOLOR);
134 int pos;
135 for (int i = fTopIndex; i < endIndex; ++i) {
136 pos = i - fTopIndex;
rmistry@google.comd6176b02012-08-23 18:14:13 +0000137 canvas->drawText(fList[i]->c_str(), fList[i]->size(),
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000138 0, fSpacing - 2 + fSpacing * pos, p);
139 }
140 p.setColor(SKDEBUGGER_RESIZEBARCOLOR);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000141 r = SkRect::MakeXYWH(this->width() - SKDEBUGGER_RESIZEBARSIZE, 0,
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000142 SKDEBUGGER_RESIZEBARSIZE, this->height());
143 canvas->drawRect(r, p);
rmistry@google.combda03db2012-08-14 20:27:54 +0000144}
145