/*
    3D C++ Toolkit (TDT)
    Window Class
    Copyright (c) 2008
    John Ryland
*/
#ifndef WINDOW_H
#define WINDOW_H


#include <TDT/event.h>


namespace TDT
{


class Window
{
public:
    Window();
    virtual ~Window();

    /* Properties */
    const char *windowTitle() const { return mWindowTitle; }
    const char *windowIconText() const { return mWindowIconText; }
    int x() const { return mX; }
    int y() const { return mY; }
    int width() const { return mWidth; }
    int height() const { return mHeight; }
    bool isVisible() const { return mVisible; }
    bool isMinimized() const { return mMinimized; }
    bool isMaximized() const { return mMaximized; }
    bool isFullScreen() const { return mFullScreen; }
    int winId() const { return mWinId; }
    int cursor() const { return mCursor; }

    /* Gains access to the window buffer */
    void *backingStore() { return mBackingStore; }

    /* Commands */
    void setWindowTitle(const char *title);
    void setWindowIconText(const char *iconText);
    void move(int x, int y);
    void resize(int width, int height);
    void setGeometry(int x, int y, int width, int height);
    void show();
    void hide();
    void setVisible(bool visible);
    void showNormal();
    void showMinimized();
    void showMaximized();
    void showFullScreen();
    void setCursor(int cursor);
    void repaint();

    /* Events */
    virtual bool event(Event ev);

    virtual void paintEvent();
    virtual void showEvent();
    virtual void hideEvent();
    virtual void closeEvent();
    //virtual void moveEvent(int x, int y);
    virtual void resizeEvent(int width, int height);
    virtual void keyPressEvent(int key, int x, int y);
    virtual void keyReleaseEvent(int key, int x, int y);
    virtual void mousePressEvent(int button, int x, int y);
    virtual void mouseReleaseEvent(int button, int x, int y);
    virtual void mouseMoveEvent(int x, int y);
    virtual void focusInEvent();
    virtual void focusOutEvent();
    virtual void idleEvent();
    virtual void timerEvent(int timerId);
    virtual void overlayDisplayedEvent();

/*
    Possibly overlooked functions:

    virtual void mouseDoubleClickEvent(QMouseEvent *);
    virtual void wheelEvent(QWheelEvent *);
    virtual void enterEvent(QEvent *);
    virtual void leaveEvent(QEvent *);
    virtual void moveEvent(QMoveEvent *);
    virtual void closeEvent(QCloseEvent *);
    virtual void contextMenuEvent(QContextMenuEvent *);
    virtual void tabletEvent(QTabletEvent *);
    virtual void actionEvent(QActionEvent *);

    virtual void dragEnterEvent(QDragEnterEvent *);
    virtual void dragMoveEvent(QDragMoveEvent *);
    virtual void dragLeaveEvent(QDragLeaveEvent *);
    virtual void dropEvent(QDropEvent *);
*/

private:
    void init(int x, int y, int w, int h);
    void saveGeometry();
    int mX, mY, mWidth, mHeight, mWinId;
    int mRestoreX, mRestoreY, mRestoreWidth, mRestoreHeight;
    int mCursor;
    bool mVisible, mMinimized, mMaximized, mFullScreen;
    const char *mWindowTitle;
    const char *mWindowIconText;
    void *mBackingStore;
};


};


#endif // WINDOW_H

