/*
 * Program: canvas
 *
 * Author: Robert Roebling
 *
 * Copyright: (C) 1998, Robert Roebling
 *
 */
// For compilers that support precompilation, includes "wx/wx.h".

#ifndef __test_H__
#define __test_H__

#if defined(__GNUG__) && !defined(__APPLE__)
    #pragma interface "test.cpp"
#endif

#ifndef WX_PRECOMP
    #include "wx/wx.h"
#endif

#include <wx/image.h>
#include <wx/file.h>
#include <wx/timer.h>
#include <wx/log.h>
#include <wx/splitter.h>

#include "wx/canvas/canvas.h"
#include "wx/canvas/polygon.h"

class MyCanvas;

// derived classes
class MywxCanvasObjectRef: public wxCanvasObjectRef
{
    DECLARE_DYNAMIC_CLASS(MywxCanvasObjectRef)

public:
    MywxCanvasObjectRef();
    MywxCanvasObjectRef(double x, double y, wxCanvasObjectGroup* group);
    ~MywxCanvasObjectRef();

    void OnMouseEvent(wxMouseEvent &event);

private:
    DECLARE_EVENT_TABLE()
};


class MyEventHandler: public wxEvtHandler
{
public:
    MyEventHandler();

    void OnMouseEvent(wxMouseEvent &event);

private:

    DECLARE_EVENT_TABLE()
};


class MySplitterWindow : public wxSplitterWindow
{
public:
  MySplitterWindow(wxFrame *parent, wxWindowID id)
    : wxSplitterWindow(parent, id, wxDefaultPosition, wxDefaultSize, wxSP_3D )
  {
    m_frame = parent;
  }

  virtual bool OnSashPositionChange(int newSashPosition)
  {
    if ( !wxSplitterWindow::OnSashPositionChange(newSashPosition) )
      return FALSE;

    wxString str;
    str.Printf( _T("Sash position = %d"), newSashPosition);
    m_frame->SetStatusText(str);

    return TRUE;
  }

  void SetStatusText(const wxString& str ){m_frame->SetStatusText(str);}

private:
  wxFrame *m_frame;
};


// MyFrame
const int ID_ABOUT = 109;

// MyFrame
class MyFrame: public wxFrame
{
public:
    MyFrame(wxFrame* frame, const wxString& title, const wxPoint& pos, const wxSize& size);
    virtual ~MyFrame();

    // Menu commands
    void SplitHorizontal(wxCommandEvent& event);
    void SplitVertical(wxCommandEvent& event);
    void Unsplit(wxCommandEvent& event);
    void SetMinSize(wxCommandEvent& event);
    void Quit(wxCommandEvent& event);

    // Menu command update functions
    void UpdateUIHorizontal(wxUpdateUIEvent& event);
    void UpdateUIVertical(wxUpdateUIEvent& event);
    void UpdateUIUnsplit(wxUpdateUIEvent& event);

    void OnAbout( wxCommandEvent &event );
    void OnNewFrame( wxCommandEvent &event );
    void OnQuit( wxCommandEvent &event );
    void OnTimer( wxTimerEvent &event );

    wxCanvasObject   *m_sm1;
    wxCanvasObject   *m_sm2;
    wxCanvasObject   *m_sm3;
    wxCanvasObject   *m_sm4;

    MywxCanvasObjectRef *m_ref;
    MywxCanvasObjectRef *m_ref2;

    wxTimer          *m_timer;
    wxTextCtrl       *m_log;

    wxBitmap gs_bmp36_mono;

private:

    void UpdatePosition();

    wxMenu*    fileMenu;
    wxMenuBar*  menuBar;
    MyCanvas*  m_canvas1;
    MyCanvas*  m_canvas2;
    MySplitterWindow* m_splitter;

    wxCanvasAdmin m_canvasadmin;

    wxCanvasObjectGroup* m_datatree;

    DECLARE_EVENT_TABLE()

    MyEventHandler* m_eventhandler;
};

// ID for the menu commands
enum
{
  SPLIT_QUIT,
  SPLIT_HORIZONTAL,
  SPLIT_VERTICAL,
  SPLIT_UNSPLIT,
  SPLIT_SETMINSIZE
};

// Window ids
#define SPLITTER_WINDOW     100
#define SPLITTER_FRAME      101
#define CANVAS1             102
#define CANVAS2             103

class MyCanvas: public wxVectorCanvas
{
public:
    MyCanvas( wxCanvasAdmin* admin, MySplitterWindow *parent, wxWindowID id = -1,
        const wxPoint& pos = wxDefaultPosition,
        const wxSize& size = wxDefaultSize,
        long style = wxScrolledWindowStyle );

    void OnMouseEvent(wxMouseEvent& event);

private:

    //mouse position used for displaying it in the statusbar
    int          m_mouse_x;
    //mouse position used for displaying it in the statusbar
    int          m_mouse_y;
    //mouse position used for displaying it in the statusbar
    double       m_mouse_worldx;
    //mouse position used for displaying it in the statusbar
    double       m_mouse_worldy;

    //mouse position used for zooming
    double       m_zoom_x1;
    //mouse position used for zooming
    double       m_zoom_y1;
    //mouse position used for zooming
    double       m_zoom_x2;
    //mouse position used for zooming
    double       m_zoom_y2;

    //declare events
    DECLARE_EVENT_TABLE()

    //parent of the canvas
    MySplitterWindow *m_parent;
};

// MyApp

class MyApp: public wxApp
{
public:
    virtual bool OnInit();

    const wxString& GetFontPath() const { return m_fontpath; }

private:
    wxString m_fontpath;
};

#endif
