#ifndef SampleCode_DEFINED
#define SampleCode_DEFINED
#include "SkColor.h"
#include "SkEvent.h"
#include "SkKey.h"
#include "SkView.h"
#include "SkOSMenu.h"
class GrContext;
class SampleCode {
public:
    static bool KeyQ(const SkEvent&, SkKey* outKey);
    static bool CharQ(const SkEvent&, SkUnichar* outUni);
    static bool TitleQ(const SkEvent&);
    static void TitleR(SkEvent*, const char title[]);
    static bool RequestTitle(SkView* view, SkString* title);
    static bool PrefSizeQ(const SkEvent&);
    static void PrefSizeR(SkEvent*, SkScalar width, SkScalar height);
    static bool FastTextQ(const SkEvent&);
    static SkMSec GetAnimTime();
    static SkMSec GetAnimTimeDelta();
    static SkScalar GetAnimSecondsDelta();
    static SkScalar GetAnimScalar(SkScalar speedPerSec, SkScalar period = 0);
        static SkScalar GetAnimSinScalar(SkScalar amplitude,
                                     SkScalar periodInSec,
                                     SkScalar phaseInSec = 0);
};
class SkViewFactory : public SkRefCnt {
public:
    virtual SkView* operator() () const = 0;
};
typedef SkView* (*SkViewCreateFunc)();
class SkFuncViewFactory : public SkViewFactory {
public:
    SkFuncViewFactory(SkViewCreateFunc func);
    virtual SkView* operator() () const SK_OVERRIDE;
private:
    SkViewCreateFunc fCreateFunc;
};
namespace skiagm {
class GM;
}
typedef skiagm::GM* (*GMFactoryFunc)(void*);
class SkGMSampleViewFactory : public SkViewFactory {
public:
    SkGMSampleViewFactory(GMFactoryFunc func);
    virtual SkView* operator() () const SK_OVERRIDE;
private:
    GMFactoryFunc fFunc;
};
class SkViewRegister : public SkRefCnt {
public:
    explicit SkViewRegister(SkViewFactory*);
    explicit SkViewRegister(SkViewCreateFunc);
    explicit SkViewRegister(GMFactoryFunc);
    ~SkViewRegister() {
        fFact->unref();
    }
    static const SkViewRegister* Head() { return gHead; }
    SkViewRegister* next() const { return fChain; }
    const SkViewFactory*   factory() const { return fFact; }
private:
    SkViewFactory*  fFact;
    SkViewRegister* fChain;
    static SkViewRegister* gHead;
};
class SampleView : public SkView {
public:
    SampleView()
        : fPipeState(SkOSMenu::kOffState)
        , fBGColor(SK_ColorWHITE)
        , fRepeatCount(1)
    {}
    void setBGColor(SkColor color) { fBGColor = color; }
    static bool IsSampleView(SkView*);
    static bool SetRepeatDraw(SkView*, int count);
    static bool SetUsePipe(SkView*, SkOSMenu::TriState);
    
    virtual void requestMenu(SkOSMenu* menu) {}
    virtual void onTileSizeChanged(const SkSize& tileSize) {}
protected:
    virtual void onDrawBackground(SkCanvas*);
    virtual void onDrawContent(SkCanvas*) = 0;
        virtual bool onEvent(const SkEvent& evt);
    virtual bool onQuery(SkEvent* evt);
    virtual void draw(SkCanvas*);
    virtual void onDraw(SkCanvas*);
    SkOSMenu::TriState fPipeState;
    SkColor fBGColor;
private:
    int fRepeatCount;
    typedef SkView INHERITED;
};
#endif