/* * Copyright 2011 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "DebuggerViews.h" DebuggerCommandsView::DebuggerCommandsView() { fBGColor = 0xFFBBBBBB; fTopIndex = 0; fHighlight = 0; fResizing = false; SkPaint p; p.setTextSize(SkIntToScalar(SKDEBUGGER_TEXTSIZE)); fSpacing = p.getFontSpacing(); fCentered = false; fRange = (int)(this->height()/fSpacing) - 1; } DebuggerCommandsView::~DebuggerCommandsView() { fList.deleteAll(); } bool DebuggerCommandsView::onEvent(const SkEvent& evt) { if (evt.isType(SKDEBUGGER_COMMANDTYPE)) { *fList.append() = new SkString(evt.findString(SKDEBUGGER_ATOM)); this->inval(NULL); return true; } return this->INHERITED::onEvent(evt); } void DebuggerCommandsView::onSizeChange() { fRange = (int)(this->height()/fSpacing); this->INHERITED::onSizeChange(); } void DebuggerCommandsView::alignCenter() { if (!fCentered || fHighlight < fRange/2 || fHighlight > (fList.count() - fRange/2)) { return; } else { if (fHighlight > (fTopIndex + fRange/2)) fTopIndex += fHighlight - (fTopIndex + fRange/2); if (fHighlight < (fTopIndex + fRange/2)) fTopIndex -= (fTopIndex + fRange/2) - fHighlight; } } int DebuggerCommandsView::nextItem() { if (fHighlight < fList.count() - 1) ++fHighlight; if (fHighlight < fTopIndex || fHighlight > (fTopIndex + fRange)) fTopIndex = fHighlight; if (fHighlight == (fTopIndex + fRange)) ++fTopIndex; this->alignCenter(); this->inval(NULL); return fHighlight; } int DebuggerCommandsView::prevItem() { if (fHighlight > 0) --fHighlight; if (fHighlight < fTopIndex || fHighlight > (fTopIndex + fRange)) fTopIndex = fHighlight; this->alignCenter(); this->inval(NULL); return fHighlight; } int DebuggerCommandsView::scrollUp() { if (fTopIndex > 0) --fTopIndex; this->inval(NULL); return fHighlight; } int DebuggerCommandsView::scrollDown() { if (fTopIndex < (fList.count() - 1)) ++fTopIndex; this->inval(NULL); return fHighlight; } void DebuggerCommandsView::highlight(int index) { SkASSERT(index >= 0 && index < fList.count()); if (fHighlight != index) { fHighlight = index; this->alignCenter(); this->inval(NULL); } } int DebuggerCommandsView::selectHighlight(int ypos) { int i = (int)(ypos/fSpacing) + fTopIndex; if (i >= fList.count()) { i = fList.count() - 1; } if (fHighlight != i) { fHighlight = i; this->alignCenter(); this->inval(NULL); } return fHighlight; } void DebuggerCommandsView::toggleCentered() { fCentered = !fCentered; this->alignCenter(); this->inval(NULL); } void DebuggerCommandsView::onDraw(SkCanvas* canvas) { canvas->drawColor(fBGColor); SkPaint p; p.setTextSize(SkIntToScalar(SKDEBUGGER_TEXTSIZE)); p.setAntiAlias(true); //draw highlight int selected = fHighlight - fTopIndex; SkRect r = {0, fSpacing * selected, this->width(), fSpacing * (selected+1)}; p.setColor(SKDEBUGGER_HIGHLIGHTCOLOR); canvas->drawRect(r, p); int endIndex = fTopIndex + fRange; if (endIndex > fList.count()) endIndex = fList.count(); p.setColor(SKDEBUGGER_TEXTCOLOR); int pos; for (int i = fTopIndex; i < endIndex; ++i) { pos = i - fTopIndex; canvas->drawText(fList[i]->c_str(), fList[i]->size(), 0, fSpacing - 2 + fSpacing * pos, p); } p.setColor(SKDEBUGGER_RESIZEBARCOLOR); r = SkRect::MakeXYWH(this->width() - SKDEBUGGER_RESIZEBARSIZE, 0, SKDEBUGGER_RESIZEBARSIZE, this->height()); canvas->drawRect(r, p); }