#include "SampleCode.h"
#include "SkView.h"
#include "SkCanvas.h"
#include "SkBlurMaskFilter.h"
#include "SkCamera.h"
#include "SkColorFilter.h"
#include "SkColorPriv.h"
#include "SkDevice.h"
#include "SkGradientShader.h"
#include "SkImageDecoder.h"
#include "SkInterpolator.h"
#include "SkMaskFilter.h"
#include "SkPath.h"
#include "SkRegion.h"
#include "SkShader.h"
#include "SkShaderExtras.h"
#include "SkTime.h"
#include "SkTypeface.h"
#include "SkUtils.h"
#include "SkKey.h"
#include "SkXfermode.h"
#include "SkDrawFilter.h"

#include "test.h"

class TestsView : public SkView {
public:
    skia::Test::Iter fIter;

	TestsView() {}

protected:
    // overrides from SkEventSink
    virtual bool onQuery(SkEvent* evt) {
        if (SampleCode::TitleQ(*evt)) {
            SampleCode::TitleR(evt, "Tests");
            return true;
        }
        return this->INHERITED::onQuery(evt);
    }
    
    void drawBG(SkCanvas* canvas) {
        canvas->drawColor(SK_ColorWHITE);
    }
    
    virtual void onDraw(SkCanvas* canvas) {
        this->drawBG(canvas);
        
        skia::Test* test = fIter.next();
        if (NULL == test) {
            fIter.reset();
            test = fIter.next();
        }
        
        SkIPoint    size;
        test->getSize(&size);
        
        SkBitmap    bitmap;
        bitmap.setConfig(SkBitmap::kARGB_8888_Config, size.fX, size.fY);
        bitmap.allocPixels();
        bitmap.eraseColor(0);
        
        SkCanvas c(bitmap);
        test->draw(&c);
        
        canvas->drawBitmap(bitmap, SkIntToScalar(10), SkIntToScalar(10), NULL);
        
        SkString str;
        test->getString(skia::Test::kTitle, &str);
        SkDebugf("--- %s\n", str.c_str());
        delete test;
    }
    
    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
        this->inval(NULL);
        
        return this->INHERITED::onFindClickHandler(x, y);
    }
    
    virtual bool onClick(Click* click) {
        this->inval(NULL);
        return this->INHERITED::onClick(click);
    }

	virtual bool handleKey(SkKey key) {
        this->inval(NULL);
        return true;
    }

private:
    typedef SkView INHERITED;
};

//////////////////////////////////////////////////////////////////////////////

static SkView* MyFactory() { return new TestsView; }
static SkViewRegister reg(MyFactory);

