diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/views/animated/SkListView.cpp | 902 |
1 files changed, 0 insertions, 902 deletions
diff --git a/src/views/animated/SkListView.cpp b/src/views/animated/SkListView.cpp deleted file mode 100644 index ec9d2ee7b0..0000000000 --- a/src/views/animated/SkListView.cpp +++ /dev/null @@ -1,902 +0,0 @@ - -/* - * 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 "SkWidget.h" -#include "SkCanvas.h" -#include "SkEvent.h" -#include "SkKey.h" -#include "SkParsePaint.h" -#include "SkSystemEventTypes.h" - -#if 0 - -SkEvent* SkListSource::getEvent(int index) -{ - return NULL; -} - -#include "SkOSFile.h" - -class SkDirListSource : public SkListSource { -public: - SkDirListSource(const char path[], const char suffix[], const char target[]) - : fPath(path), fSuffix(suffix), fTarget(target) - { - fCount = -1; - } - virtual int countRows() - { - if (fCount < 0) - { - fCount = 0; - fIter.reset(fPath.c_str(), fSuffix.c_str()); - while (fIter.next(NULL)) - fCount += 1; - fIter.reset(fPath.c_str(), fSuffix.c_str()); - fIndex = 0; - } - return fCount; - } - virtual void getRow(int index, SkString* left, SkString* right) - { - (void)this->countRows(); - SkASSERT((unsigned)index < (unsigned)fCount); - - if (fIndex > index) - { - fIter.reset(fPath.c_str(), fSuffix.c_str()); - fIndex = 0; - } - - while (fIndex < index) - { - fIter.next(NULL); - fIndex += 1; - } - - if (fIter.next(left)) - { - if (left) - left->remove(left->size() - fSuffix.size(), fSuffix.size()); - } - else - { - if (left) - left->reset(); - } - if (right) // only set to ">" if we know we're on a sub-directory - right->reset(); - - fIndex += 1; - } - virtual SkEvent* getEvent(int index) - { - SkASSERT((unsigned)index < (unsigned)fCount); - - SkEvent* evt = new SkEvent(); - SkString label; - - this->getRow(index, &label, NULL); - evt->setString("name", label.c_str()); - - int c = fPath.c_str()[fPath.size() - 1]; - if (c != '/' && c != '\\') - label.prepend("/"); - label.prepend(fPath); - label.append(fSuffix); - evt->setString("path", label.c_str()); - evt->setS32("index", index); - evt->setS32("duration", 22); - evt->setType(fTarget); - return evt; - } - -private: - SkString fPath, fSuffix; - SkString fTarget; - SkOSFile::Iter fIter; - int fCount; - int fIndex; -}; - -SkListSource* SkListSource::CreateFromDir(const char path[], const char suffix[], const char target[]) -{ - return new SkDirListSource(path, suffix, target); -} - -////////////////////////////////////////////////////////////////// - -class SkDOMListSource : public SkListSource { -public: - enum Type { - kUnknown_Type, - kDir_Type, - kToggle_Type - }; - struct ItemRec { - SkString fLabel; - SkString fTail, fAltTail; - SkString fTarget; - Type fType; - }; - - SkDOMListSource(const SkDOM& dom, const SkDOM::Node* node) : fDirTail(">") - { - const SkDOM::Node* child = dom.getFirstChild(node, "item"); - int count = 0; - - while (child) - { - count += 1; - child = dom.getNextSibling(child, "item"); - } - - fCount = count; - fList = NULL; - if (count) - { - ItemRec* rec = fList = new ItemRec[count]; - - child = dom.getFirstChild(node, "item"); - while (child) - { - rec->fLabel.set(dom.findAttr(child, "label")); - rec->fTail.set(dom.findAttr(child, "tail")); - rec->fAltTail.set(dom.findAttr(child, "alt-tail")); - rec->fTarget.set(dom.findAttr(child, "target")); - rec->fType = kUnknown_Type; - - int index = dom.findList(child, "type", "dir,toggle"); - if (index >= 0) - rec->fType = (Type)(index + 1); - - child = dom.getNextSibling(child, "item"); - rec += 1; - } - } - } - virtual ~SkDOMListSource() - { - delete[] fList; - } - virtual int countRows() - { - return fCount; - } - virtual void getRow(int index, SkString* left, SkString* right) - { - SkASSERT((unsigned)index < (unsigned)fCount); - - if (left) - *left = fList[index].fLabel; - if (right) - *right = fList[index].fType == kDir_Type ? fDirTail : fList[index].fTail; - } - virtual SkEvent* getEvent(int index) - { - SkASSERT((unsigned)index < (unsigned)fCount); - - if (fList[index].fType == kDir_Type) - { - SkEvent* evt = new SkEvent(); - evt->setType(fList[index].fTarget); - evt->setFast32(index); - return evt; - } - if (fList[index].fType == kToggle_Type) - fList[index].fTail.swap(fList[index].fAltTail); - - return NULL; - } - -private: - int fCount; - ItemRec* fList; - SkString fDirTail; -}; - -SkListSource* SkListSource::CreateFromDOM(const SkDOM& dom, const SkDOM::Node* node) -{ - return new SkDOMListSource(dom, node); -} - -////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////// - -SkListView::SkListView(U32 flags) : SkWidgetView(flags) -{ - fSource = NULL; - fScrollIndex = 0; - fCurrIndex = -1; - fRowHeight = SkIntToScalar(16); - fVisibleRowCount = 0; - fStrCache = NULL; - - fPaint[kBG_Attr].setColor(0); - fPaint[kNormalText_Attr].setTextSize(SkIntToScalar(14)); - fPaint[kHiliteText_Attr].setTextSize(SkIntToScalar(14)); - fPaint[kHiliteText_Attr].setColor(SK_ColorWHITE); - fPaint[kHiliteCell_Attr].setColor(SK_ColorBLUE); -} - -SkListView::~SkListView() -{ - delete[] fStrCache; - fSource->safeUnref(); -} - -void SkListView::setRowHeight(SkScalar height) -{ - SkASSERT(height >= 0); - - if (fRowHeight != height) - { - fRowHeight = height; - this->inval(NULL); - this->onSizeChange(); - } -} - -void SkListView::setSelection(int index) -{ - if (fCurrIndex != index) - { - this->invalSelection(); - fCurrIndex = index; - this->invalSelection(); - this->ensureSelectionIsVisible(); - - { - SkEvent evt; - evt.setType("listview-selection"); - evt.setFast32(index); - this->sendEventToParents(evt); - } - } -} - -void SkListView::moveSelectionUp() -{ - if (fSource) - { - int index = fCurrIndex; - if (index < 0) // no selection - index = fSource->countRows() - 1; - else - index = SkMax32(index - 1, 0); - this->setSelection(index); - } -} - -void SkListView::moveSelectionDown() -{ - if (fSource) - { - int index = fCurrIndex; - if (index < 0) // no selection - index = 0; - else - index = SkMin32(index + 1, fSource->countRows() - 1); - this->setSelection(index); - } -} - -void SkListView::invalSelection() -{ - SkRect r; - if (this->getRowRect(fCurrIndex, &r)) - this->inval(&r); -} - -void SkListView::ensureSelectionIsVisible() -{ - if (fSource == NULL) - return; - - if ((unsigned)fCurrIndex < (unsigned)fSource->countRows()) - { - int index = this->logicalToVisualIndex(fCurrIndex); - - if ((unsigned)index >= (unsigned)fVisibleRowCount) // need to scroll - { - if (index < 0) // too high - fScrollIndex = fCurrIndex; - else - fScrollIndex = fCurrIndex - fVisibleRowCount + 1; - SkASSERT((unsigned)fScrollIndex < (unsigned)fSource->countRows()); - - this->dirtyStrCache(); - this->inval(NULL); - } - } -} - -bool SkListView::getRowRect(int index, SkRect* r) const -{ - SkASSERT(r); - index = this->logicalToVisualIndex(index); - if (index >= 0) - { - SkScalar top = index * fRowHeight; - - if (top < this->height()) - { - if (r) - r->set(0, top, this->width(), top + fRowHeight); - return true; - } - } - return false; -} - -SkPaint& SkListView::paint(Attr attr) -{ - SkASSERT((unsigned)attr < kAttrCount); - return fPaint[attr]; -} - -SkListSource* SkListView::setListSource(SkListSource* src) -{ - if (fSource != src) - { - SkRefCnt_SafeAssign(fSource, src); - this->dirtyStrCache(); - this->ensureSelectionIsVisible(); - this->inval(NULL); - } - return src; -} - -void SkListView::onDraw(SkCanvas* canvas) -{ - this->INHERITED::onDraw(canvas); - - canvas->drawPaint(fPaint[kBG_Attr]); - - int visibleCount = SkMin32(fVisibleRowCount, fSource->countRows() - fScrollIndex); - if (visibleCount == 0) - return; - - this->ensureStrCache(visibleCount); - int currIndex = this->logicalToVisualIndex(fCurrIndex); - - if ((unsigned)currIndex < (unsigned)visibleCount) - { - SkAutoCanvasRestore restore(canvas, true); - SkRect r; - - canvas->translate(0, currIndex * fRowHeight); - (void)this->getRowRect(fScrollIndex, &r); - canvas->drawRect(r, fPaint[kHiliteCell_Attr]); - } - - SkPaint* p; - SkScalar y, x = SkIntToScalar(6); - SkScalar rite = this->width() - x; - - { - SkScalar ascent, descent; - fPaint[kNormalText_Attr].measureText(0, NULL, &ascent, &descent); - y = SkScalarHalf(fRowHeight - descent + ascent) - ascent; - } - - for (int i = 0; i < visibleCount; i++) - { - if (i == currIndex) - p = &fPaint[kHiliteText_Attr]; - else - p = &fPaint[kNormalText_Attr]; - - p->setTextAlign(SkPaint::kLeft_Align); - canvas->drawText(fStrCache[i].c_str(), fStrCache[i].size(), x, y, *p); - p->setTextAlign(SkPaint::kRight_Align); - canvas->drawText(fStrCache[i + visibleCount].c_str(), fStrCache[i + visibleCount].size(), rite, y, *p); - canvas->translate(0, fRowHeight); - } -} - -void SkListView::onSizeChange() -{ - SkScalar count = SkScalarDiv(this->height(), fRowHeight); - int n = SkScalarFloor(count); - - // only want to show rows that are mostly visible - if (n == 0 || count - SkIntToScalar(n) > SK_Scalar1*75/100) - n += 1; - - if (fVisibleRowCount != n) - { - fVisibleRowCount = n; - this->ensureSelectionIsVisible(); - this->dirtyStrCache(); - } -} - -void SkListView::dirtyStrCache() -{ - if (fStrCache) - { - delete[] fStrCache; - fStrCache = NULL; - } -} - -void SkListView::ensureStrCache(int count) -{ - if (fStrCache == NULL) - { - fStrCache = new SkString[count << 1]; - - if (fSource) - for (int i = 0; i < count; i++) - fSource->getRow(i + fScrollIndex, &fStrCache[i], &fStrCache[i + count]); - } -} - -bool SkListView::onEvent(const SkEvent& evt) -{ - if (evt.isType(SK_EventType_Key)) - { - switch (evt.getFast32()) { - case kUp_SkKey: - this->moveSelectionUp(); - return true; - case kDown_SkKey: - this->moveSelectionDown(); - return true; - case kRight_SkKey: - case kOK_SkKey: - if (fSource && fCurrIndex >= 0) - { - SkEvent* evt = fSource->getEvent(fCurrIndex); - if (evt) - { - SkView* view = this->sendEventToParents(*evt); - delete evt; - return view != NULL; - } - else // hack to make toggle work - { - this->dirtyStrCache(); - this->inval(NULL); - } - } - break; - } - } - return this->INHERITED::onEvent(evt); -} - -void SkListView::onInflate(const SkDOM& dom, const SkDOM::Node* node) -{ - this->INHERITED::onInflate(dom, node); - - SkScalar x; - const SkDOM::Node* child; - - if (dom.findScalar(node, "row-height", &x)) - this->setRowHeight(x); - - if ((child = dom.getFirstChild(node, "hilite-paint")) != NULL) - SkPaint_Inflate(&this->paint(kHiliteCell_Attr), dom, child); - - // look for a listsource - { - SkListSource* src = NULL; - - if ((child = dom.getFirstChild(node, "file-listsource")) != NULL) - { - const char* path = dom.findAttr(child, "path"); - if (path) - src = SkListSource::CreateFromDir( path, - dom.findAttr(child, "filter"), - dom.findAttr(child, "target")); - } - else if ((child = dom.getFirstChild(node, "xml-listsource")) != NULL) - { - src = SkListSource::CreateFromDOM(dom, child); - } - - if (src) - { - this->setListSource(src)->unref(); - this->setSelection(0); - } - } -} - -/////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////// - -#include "SkImageDecoder.h" -#include "SkShader.h" - -class SkScrollBarView : public SkView { -public: - SkScrollBarView(const char bg[], const char fg[]) - { - fBGRef = SkBitmapRef::Decode(bg, true); - fFGRef = SkBitmapRef::Decode(fg, true); - - if (fBGRef) - this->setWidth(SkIntToScalar(fBGRef->bitmap().width())); - } - ~SkScrollBarView() - { - delete fBGRef; - delete fFGRef; - } -protected: - virtual void onDraw(SkCanvas* canvas) - { - if (fBGRef == NULL) return; - - SkPaint paint; - - SkShader* shader = SkShader::CreateBitmapShader(fBGRef->bitmap(), false, SkPaint::kNo_FilterType, SkShader::kClamp_TileMode); - paint.setShader(shader)->unref(); - - canvas->drawPaint(paint); - } -private: - SkBitmapRef* fBGRef, *fFGRef; -}; - -SkGridView::SkGridView(U32 flags) : SkWidgetView(flags) -{ - fSource = NULL; - fCurrIndex = -1; - fVisibleCount.set(0, 0); - - fPaint[kBG_Attr].setColor(SK_ColorWHITE); - fPaint[kHiliteCell_Attr].setColor(SK_ColorYELLOW); - fPaint[kHiliteCell_Attr].setStyle(SkPaint::kStroke_Style); - fPaint[kHiliteCell_Attr].setAntiAliasOn(true); - fPaint[kHiliteCell_Attr].setStrokeWidth(SK_Scalar1*3); - - fScrollBar = new SkScrollBarView("icons/scrollbarGrey.jpg", "icons/scrollbarBlue.jpg"); - this->attachChildToFront(fScrollBar)->unref(); - fScrollBar->setVisibleP(true); -} - -SkGridView::~SkGridView() -{ - fSource->safeUnref(); -} - -void SkGridView::getCellSize(SkPoint* size) const -{ - if (size) - *size = fCellSize; -} - -void SkGridView::setCellSize(SkScalar x, SkScalar y) -{ - SkASSERT(x >= 0 && y >= 0); - - if (!fCellSize.equals(x, y)) - { - fCellSize.set(x, y); - this->inval(NULL); - } -} - -void SkGridView::setSelection(int index) -{ - if (fCurrIndex != index) - { - this->invalSelection(); - fCurrIndex = index; - this->invalSelection(); - this->ensureSelectionIsVisible(); - - // this generates the click - { - SkEvent evt; - evt.setType("listview-selection"); - evt.setFast32(index); - this->sendEventToParents(evt); - } - } -} - -void SkGridView::moveSelectionUp() -{ - if (fSource) - { - int index = fCurrIndex; - if (index < 0) // no selection - index = fSource->countRows() - 1; - else - index = SkMax32(index - 1, 0); - this->setSelection(index); - } -} - -void SkGridView::moveSelectionDown() -{ - if (fSource) - { - int index = fCurrIndex; - if (index < 0) // no selection - index = 0; - else - index = SkMin32(index + 1, fSource->countRows() - 1); - this->setSelection(index); - } -} - -void SkGridView::invalSelection() -{ - SkRect r; - if (this->getCellRect(fCurrIndex, &r)) - { - SkScalar inset = 0; - if (fPaint[kHiliteCell_Attr].getStyle() != SkPaint::kFill_Style) - inset += fPaint[kHiliteCell_Attr].getStrokeWidth() / 2; - if (fPaint[kHiliteCell_Attr].isAntiAliasOn()) - inset += SK_Scalar1; - r.inset(-inset, -inset); - this->inval(&r); - } -} - -void SkGridView::ensureSelectionIsVisible() -{ - if (fSource == NULL) - return; -#if 0 - if ((unsigned)fCurrIndex < (unsigned)fSource->countRows()) - { - int index = this->logicalToVisualIndex(fCurrIndex); - - if ((unsigned)index >= (unsigned)fVisibleRowCount) // need to scroll - { - if (index < 0) // too high - fScrollIndex = fCurrIndex; - else - fScrollIndex = fCurrIndex - fVisibleRowCount + 1; - SkASSERT((unsigned)fScrollIndex < (unsigned)fSource->countRows()); - - this->dirtyStrCache(); - this->inval(NULL); - } - } -#endif -} - -bool SkGridView::getCellRect(int index, SkRect* r) const -{ - if (fVisibleCount.fY == 0) - return false; - - index = this->logicalToVisualIndex(index); - if (index >= 0) - { - SkRect bounds; - int row = index / fVisibleCount.fY; - int col = index % fVisibleCount.fY; - - bounds.set(0, 0, fCellSize.fX, fCellSize.fY); - bounds.offset(col * (fCellSize.fX + SkIntToScalar(col > 0)), - row * (fCellSize.fY + SkIntToScalar(row > 0))); - - if (bounds.fTop < this->height()) - { - if (r) - *r = bounds; - return true; - } - } - return false; -} - -SkPaint& SkGridView::paint(Attr attr) -{ - SkASSERT((unsigned)attr < kAttrCount); - return fPaint[attr]; -} - -SkListSource* SkGridView::setListSource(SkListSource* src) -{ - if (fSource != src) - { - SkRefCnt_SafeAssign(fSource, src); - // this->dirtyStrCache(); - this->ensureSelectionIsVisible(); - this->inval(NULL); - } - return src; -} - -#include "SkShader.h" - -static void copybits(SkCanvas* canvas, const SkBitmap& bm, const SkRect& dst, const SkPaint& paint) -{ - SkRect src; - SkMatrix matrix; - - src.set(0, 0, SkIntToScalar(bm.width()), SkIntToScalar(bm.height())); - if (matrix.setRectToRect(src, dst)) - { - SkPaint p(paint); - SkShader* shader = SkShader::CreateBitmapShader(bm, false, SkPaint::kNo_FilterType, SkShader::kClamp_TileMode); - p.setShader(shader)->unref(); - - shader->setLocalMatrix(matrix); - canvas->drawRect(dst, p); - } -} - -#include "SkImageDecoder.h" - -void SkGridView::onDraw(SkCanvas* canvas) -{ - this->INHERITED::onDraw(canvas); - - canvas->drawPaint(fPaint[kBG_Attr]); - - if (fSource == NULL) - return; - -#if 0 - int visibleCount = SkMin32(fVisibleRowCount, fSource->countRows() - fScrollIndex); - if (visibleCount == 0) - return; - - this->ensureStrCache(visibleCount); - int currIndex = this->logicalToVisualIndex(fCurrIndex); -#endif - - SkPaint p; - for (int i = 0; i < fSource->countRows(); i++) - { - bool forced = false; - SkEvent* evt = fSource->getEvent(i); - SkASSERT(evt); - SkString path(evt->findString("path")); - delete evt; - - SkBitmapRef* bmr = SkBitmapRef::Decode(path.c_str(), false); - if (bmr == NULL) - { - bmr = SkBitmapRef::Decode(path.c_str(), true); - if (bmr) - forced = true; - } - - if (bmr) - { - SkAutoTDelete<SkBitmapRef> autoRef(bmr); - SkRect r; - if (!this->getCellRect(i, &r)) - break; - copybits(canvas, bmr->bitmap(), r, p); - } - // only draw one forced bitmap at a time - if (forced) - { - this->inval(NULL); // could inval only the remaining visible cells... - break; - } - } - - // draw the hilite - { - SkRect r; - if (fCurrIndex >= 0 && this->getCellRect(fCurrIndex, &r)) - canvas->drawRect(r, fPaint[kHiliteCell_Attr]); - } -} - -static int check_count(int n, SkScalar s) -{ - // only want to show cells that are mostly visible - if (n == 0 || s - SkIntToScalar(n) > SK_Scalar1*75/100) - n += 1; - return n; -} - -void SkGridView::onSizeChange() -{ - fScrollBar->setHeight(this->height()); - fScrollBar->setLoc(this->locX() + this->width() - fScrollBar->width(), 0); - - if (fCellSize.equals(0, 0)) - { - fVisibleCount.set(0, 0); - return; - } - - SkScalar rows = SkScalarDiv(this->height(), fCellSize.fY); - SkScalar cols = SkScalarDiv(this->width(), fCellSize.fX); - int y = SkScalarFloor(rows); - int x = SkScalarFloor(cols); - - y = check_count(y, rows); - x = check_count(x, cols); - - if (!fVisibleCount.equals(x, y)) - { - fVisibleCount.set(x, y); - this->ensureSelectionIsVisible(); - // this->dirtyStrCache(); - } -} - -bool SkGridView::onEvent(const SkEvent& evt) -{ - if (evt.isType(SK_EventType_Key)) - { - switch (evt.getFast32()) { - case kUp_SkKey: - this->moveSelectionUp(); - return true; - case kDown_SkKey: - this->moveSelectionDown(); - return true; - case kRight_SkKey: - case kOK_SkKey: - if (fSource && fCurrIndex >= 0) - { - SkEvent* evt = fSource->getEvent(fCurrIndex); - if (evt) - { - // augment the event with our local rect - (void)this->getCellRect(fCurrIndex, (SkRect*)evt->setScalars("local-rect", 4, NULL)); - - SkView* view = this->sendEventToParents(*evt); - delete evt; - return view != NULL; - } - } - break; - } - } - return this->INHERITED::onEvent(evt); -} - -void SkGridView::onInflate(const SkDOM& dom, const SkDOM::Node* node) -{ - this->INHERITED::onInflate(dom, node); - - SkScalar x[2]; - const SkDOM::Node* child; - - if (dom.findScalars(node, "cell-size", x, 2)) - this->setCellSize(x[0], x[1]); - - if ((child = dom.getFirstChild(node, "hilite-paint")) != NULL) - SkPaint_Inflate(&this->paint(kHiliteCell_Attr), dom, child); - - // look for a listsource - { - SkListSource* src = NULL; - - if ((child = dom.getFirstChild(node, "file-listsource")) != NULL) - { - const char* path = dom.findAttr(child, "path"); - if (path) - src = SkListSource::CreateFromDir( path, - dom.findAttr(child, "filter"), - dom.findAttr(child, "target")); - } - else if ((child = dom.getFirstChild(node, "xml-listsource")) != NULL) - { - src = SkListSource::CreateFromDOM(dom, child); - } - - if (src) - { - this->setListSource(src)->unref(); - this->setSelection(0); - } - } - this->onSizeChange(); -} - -#endif |