
/*
 * 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 "SkView.h"
#include "SkColor.h"
#include "SkBitmap.h"
#include "SkCanvas.h"
#include "SkGPipe.h"
#include "SkPaint.h"

#include "SkDebugDumper.h"

#define SKDEBUGGER_COMMANDTYPE  "SKDEBUGGER_COMMAND"
#define SKDEBUGGER_STATETYPE    "SKDEBUGGER_STATE"

#define SKDEBUGGER_ATOM         "SKDEBUGGER_ATOM"
#define SKDEBUGGER_MATRIX       "SKDEBUGGER_MATRIX"
#define SKDEBUGGER_CLIP         "SKDEBUGGER_CLIP"
#define SKDEBUGGER_PAINTINFO    "SKDEBUGGER_PAINTINFO"
#define SKDEBUGGER_PAINT        "SKDEBUGGER_PAINT"

#define SKDEBUGGER_TEXTSIZE         14
#define CMD_WIDTH                   200
#define INFO_HEIGHT                 150.0
#define SKDEBUGGER_HIGHLIGHTCOLOR   0xFF113399
#define SKDEBUGGER_TEXTCOLOR        0xFF000000
#define SKDEBUGGER_RESIZEBARCOLOR   0xFF333333
#define SKDEBUGGER_RESIZEBARSIZE    5

/*
 * Debugger - Info Panel
 */
class DebuggerStateView : public SkView {
public:
    DebuggerStateView();
    
protected:
    virtual bool onEvent(const SkEvent& evt);
    virtual void onDraw(SkCanvas* canvas);
private:
    SkColor     fBGColor;
    SkPaint     fPaint;
    SkString    fMatrix;
    SkString    fPaintInfo;
    SkString    fClip;
    bool        fResizing;
    typedef SkView INHERITED;
};

/*
 * Debugger - Commands List
 */
class DebuggerCommandsView : public SkView {
public:
    DebuggerCommandsView();
    ~DebuggerCommandsView();
    int nextItem();
    int prevItem();
    int scrollUp();
    int scrollDown();
    void highlight(int index);
    int  selectHighlight(int ypos);
    void toggleCentered();
    
protected:
    virtual bool onEvent(const SkEvent& evt);
    virtual void onSizeChange();
    virtual void onDraw(SkCanvas* canvas);
private:
    void        init();
    void        alignCenter();
    SkColor     fBGColor;
    int         fTopIndex;
    int         fHighlight;
    SkScalar    fSpacing;
    int         fRange;
    bool        fResizing;
    bool        fCentered;
    SkTDArray<SkString*> fList;
    typedef SkView INHERITED;
};


static void* PaintProc(void* ptr, bool doRef) {
    SkPaint* p = (SkPaint*) ptr;
    
    if (doRef) {
        return new SkPaint(*p);
    }
    else {
        delete p;
        return NULL;
    }
    
}

