1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 7ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com 8b1b7f707907b8c63b955cd2aef1cc454623e3656tfarina@chromium.org#include "OverView.h" 9b1b7f707907b8c63b955cd2aef1cc454623e3656tfarina@chromium.org 1034245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com#include "SampleCode.h" 11ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com 1234245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com#include "SkCanvas.h" 1334245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com#include "SkView.h" 1434245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com 15ab13167410206c5371508101949213d46e8dded9commit-bot@chromium.orgstatic const int N = 8; 16ab13167410206c5371508101949213d46e8dded9commit-bot@chromium.orgstatic const SkScalar kWidth = SkIntToScalar(640); 17ab13167410206c5371508101949213d46e8dded9commit-bot@chromium.orgstatic const SkScalar kHeight = SkIntToScalar(480); 18ab13167410206c5371508101949213d46e8dded9commit-bot@chromium.orgstatic const char gIsOverview[] = "is-overview"; 1934245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com 2034245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.comclass OverView : public SkView { 2134245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.compublic: 2248dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com OverView(int count, const SkViewFactory* factories[]); 2334245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com virtual ~OverView(); 2434245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com 25ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.comprotected: 26ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com // Overridden from SkEventSink: 27ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com virtual bool onEvent(const SkEvent&) SK_OVERRIDE; 28ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com virtual bool onQuery(SkEvent* evt) SK_OVERRIDE { 2934245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com if (SampleCode::TitleQ(*evt)) { 3034245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com SampleCode::TitleR(evt, "Overview"); 3134245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com return true; 3234245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com } 33ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com if (evt->isType(gIsOverview)) { 34ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com return true; 35ef7bdfac618f60e9edc9f42cd4661d563937e6d8yangsu@google.com } 3634245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com return this->INHERITED::onQuery(evt); 3734245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com } 3834245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com 39ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com 40ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com // Overridden from SkView: 41ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com virtual void onSizeChange() SK_OVERRIDE; 42ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 43ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com canvas->drawColor(SK_ColorLTGRAY); 44ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com } 45ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com 46ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com virtual SkCanvas* beforeChildren(SkCanvas*) SK_OVERRIDE; 47ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com 4872708fa18d23ff9d97b90c98a4ead6717045c8c6reed@google.com virtual bool onSendClickToChildren(SkScalar x, SkScalar y, unsigned modi) SK_OVERRIDE { 49e72fee513a5f903d6aa17066d2f3b79ac31f05dereed@android.com return false; 50e72fee513a5f903d6aa17066d2f3b79ac31f05dereed@android.com } 51e72fee513a5f903d6aa17066d2f3b79ac31f05dereed@android.com 5272708fa18d23ff9d97b90c98a4ead6717045c8c6reed@google.com virtual Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) SK_OVERRIDE { 53ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com int ix = (int)(SkScalarDiv(x * N, kWidth)); 54ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com int iy = (int)(SkScalarDiv(y * N, kHeight)); 5534245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com if (ix >= 0 && iy >= 0) { 5634245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com SkEvent evt("set-curr-index"); 5734245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com evt.setFast32(iy * N + ix); 5834245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com this->sendEventToParents(evt); 5934245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com } 6034245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com return NULL; 6134245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com } 6234245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com 6334245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.comprivate: 64ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com int fCount; 65ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com const SkViewFactory** fFactories; 6634245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com 6734245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com typedef SkView INHERITED; 6834245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com}; 6934245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com 7048dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comSkView* create_overview(int count, const SkViewFactory* factories[]) { 7134245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com return SkNEW_ARGS(OverView, (count, factories)); 72ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com} 73ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com 74ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.combool is_overview(SkView* view) { 75ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com SkEvent isOverview(gIsOverview); 76ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com return view->doQuery(&isOverview); 77ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com} 7834245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com 7948dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comOverView::OverView(int count, const SkViewFactory* factories[]) { 8034245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com fCount = count; 8134245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com fFactories = factories; 8234245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com} 8334245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com 8434245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.comOverView::~OverView() { 8534245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com} 8634245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com 8734245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.combool OverView::onEvent(const SkEvent& evt) { 8834245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com return this->INHERITED::onEvent(evt); 8934245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com} 9034245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com 9134245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.comvoid OverView::onSizeChange() { 9234245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com this->detachAllChildren(); 93ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com 9434245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com SkScalar locX = 0; 9534245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com SkScalar locY = 0; 9634245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com for (int i = 0; i < fCount; i++) { 9748dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com SkView* view = (*fFactories[i])(); 9834245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com view->setVisibleP(true); 9934245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com this->attachChildToBack(view)->unref(); 10034245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com view->setLoc(locX, locY); 101ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com view->setSize(kWidth, kHeight); 102ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com locX += kWidth; 10334245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com if ((i % N) == N - 1) { 104ab9e2c6fc8ea08b167f2a68abd93772ea07f0edbbsalomon@google.com locY += kHeight; 10534245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com locX = 0; 10634245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com } 10734245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com } 10834245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com} 10934245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com 11034245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.comSkCanvas* OverView::beforeChildren(SkCanvas* canvas) { 11134245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com canvas->scale(SK_Scalar1 / N, SK_Scalar1 / N); 11234245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com return canvas; 11334245c7871f6339de8cc2be8fb1090ca3cba54efreed@android.com} 114