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