/*
 * 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 "OverView.h"

#include "SampleCode.h"

#include "SkCanvas.h"
#include "SkView.h"

namespace {

const int N = 8;
const SkScalar kWidth = SkIntToScalar(640);
const SkScalar kHeight = SkIntToScalar(480);
const char gIsOverview[] = "is-overview";

}  // namespace

class OverView : public SkView {
public:
    OverView(int count, const SkViewFactory* factories[]);
    virtual ~OverView();

protected:
    // Overridden from SkEventSink:
    virtual bool onEvent(const SkEvent&) SK_OVERRIDE;
    virtual bool onQuery(SkEvent* evt) SK_OVERRIDE {
        if (SampleCode::TitleQ(*evt)) {
            SampleCode::TitleR(evt, "Overview");
            return true;
        }
        if (evt->isType(gIsOverview)) {
            return true;
        }
        return this->INHERITED::onQuery(evt);
    }


    // Overridden from SkView:
    virtual void onSizeChange() SK_OVERRIDE;
    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
        canvas->drawColor(SK_ColorLTGRAY);
    }

    virtual SkCanvas* beforeChildren(SkCanvas*) SK_OVERRIDE;

    virtual bool onSendClickToChildren(SkScalar x, SkScalar y) SK_OVERRIDE {
        return false;
    }

    virtual Click* onFindClickHandler(SkScalar x, SkScalar y) SK_OVERRIDE {
        int ix = (int)(SkScalarDiv(x * N, kWidth));
        int iy = (int)(SkScalarDiv(y * N, kHeight));
        if (ix >= 0 && iy >= 0) {
            SkEvent evt("set-curr-index");
            evt.setFast32(iy * N + ix);
            this->sendEventToParents(evt);
        }
        return NULL;
    }

private:
    int fCount;
    const SkViewFactory** fFactories;

    typedef SkView INHERITED;
};

SkView* create_overview(int count, const SkViewFactory* factories[]) {
    return SkNEW_ARGS(OverView, (count, factories));
}

bool is_overview(SkView* view) {
    SkEvent isOverview(gIsOverview);
    return view->doQuery(&isOverview);
}

OverView::OverView(int count, const SkViewFactory* factories[]) {
    fCount = count;
    fFactories = factories;
}

OverView::~OverView() {
}

bool OverView::onEvent(const SkEvent& evt) {
    return this->INHERITED::onEvent(evt);
}

void OverView::onSizeChange() {
    this->detachAllChildren();

    SkScalar locX = 0;
    SkScalar locY = 0;
    for (int i = 0; i < fCount; i++) {
        SkView* view = (*fFactories[i])();
        view->setVisibleP(true);
        this->attachChildToBack(view)->unref();
        view->setLoc(locX, locY);
        view->setSize(kWidth, kHeight);
        locX += kWidth;
        if ((i % N) == N - 1) {
            locY += kHeight;
            locX = 0;
        }
    }
}

SkCanvas* OverView::beforeChildren(SkCanvas* canvas) {
    canvas->scale(SK_Scalar1 / N, SK_Scalar1 / N);
    return canvas;
}
