#pragma once
#ifndef TW_INCLUDED
#define TW_INCLUDED
#include "traster.h"
#undef DVAPI
#undef DVVAR
#ifdef TWIN_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif
class TMouseEvent;
class TCursor;
class TDragDropListener;
//-------------------------------------------------------------
class DVAPI TGuiColor
{
int m_red, m_green, m_blue;
//mutable void* m_imp;
//bool m_isStock;
//int m_shade;
//TUINT32 *m_index;
//mutable bool m_allocated;
public:
//static const int m_maxShade;
TGuiColor(int r, int g, int b);
TGuiColor();
~TGuiColor();
//TGuiColor(const TGuiColor&);
//TGuiColor& operator=(const TGuiColor&);
// TUINT32 getIndex(int shade=0) const;
// TUINT32 getRGB(int shade=0) const;
int red() const { return m_red; }
int green() const { return m_green; }
int blue() const { return m_blue; }
void computeShade(int index, int &r, int &g, int &b) const;
//void* imp() const {return m_imp;}
//void imp(void* imp) const { m_imp = imp; }
//bool isStock() const { return m_isStock; }
protected:
void initStockColor();
};
//-------------------------------------------------------------
class TWidgetImp;
//class TTarget {};
//class TTimerTarget {};
class TWidget;
typedef std::vector<TWidget *> TWidgetList;
//-------------------------------------------------------------
class DVAPI TWidget
// : public TTarget, public TTimerTarget
{
public:
enum Alignment { BEGIN,
CENTER,
END };
enum FocusHandling { IGNORE_FOCUS,
STOP_FOCUS,
LISTEN_TO_FOCUS };
protected:
TRect m_placement;
int m_xoff, m_yoff;
bool m_mapped; // e' arrivato il MapNotify
bool m_hidden; // il widget non vuole mostrarsi
bool m_childrenChanged;
//TTimer *m_timer;
TWidget *m_parent, *m_sonKeeper;
std::string m_name, m_contextHelpReference;
std::wstring m_shortHelp, m_longHelp;
int m_cursorIdx;
TWidgetList *m_sons;
TWidgetImp *m_imp;
friend class TWidgetImp;
TGuiColor m_backgroundColor, m_foregroundColor;
bool m_popupMode, m_menuMode, m_fixedSize, m_fullColor, m_openGL;
bool m_enabled, m_menuRelated;
TDragDropListener *m_dragDropListener;
std::string m_fontName;
int m_fontSize;
int m_fontOrientation;
static TWidget *m_selectionOwner;
static TWidget *m_focusOwner;
// not implemented (cannot copy and assign widget)
private:
TWidget(const TWidget &);
TWidget &operator=(const TWidget &);
protected:
virtual void create();
virtual void setDecoration();
virtual void destroyImp();
void createSons();
public:
TWidget(TWidget *parent = 0, std::string name = "unnamed");
virtual ~TWidget();
//
// geometry
//
const TRect &getGeometry() const { return m_placement; }
TPoint getPosition() const { return m_placement.getP00(); }
virtual TPoint getHotSpot() const { return TPoint(0, 0); }
TDimension getSize() const { return m_placement.getSize(); }
TRect getBounds() const { return TRect(TPoint(), getSize()); }
int getLx() const { return m_placement.getLx(); }
int getLy() const { return m_placement.getLy(); }
inline void setPlacement(const TRect &rect) { m_placement = rect; }
inline void setGeometry(int x0, int y0, int x1, int y1)
{
setGeometry(TRect(x0, y0, x1, y1));
}
virtual void setGeometry(const TRect &rect);
void setGeometry(const TPoint &pos, const TDimension &size)
{
setGeometry(TRect(pos, size));
}
inline void setSize(int w, int h)
{
setGeometry(getPosition(), TDimension(w, h));
}
inline void setSize(const TDimension &size)
{
setSize(size.lx, size.ly);
}
inline void setPosition(int x, int y)
{
setGeometry(TPoint(x, y), getSize());
}
inline void setPosition(const TPoint &pt)
{
setGeometry(pt, getSize());
}
inline bool contains(int x, int y) const { return contains(TPoint(x, y)); }
inline bool contains(const TPoint &p) const { return m_placement.contains(p); }
TPoint getScreenPosition() const;
//
// name, parent & sons
//
inline TWidget *getParent() const { return m_parent; }
inline std::string getName() const { return m_name; }
virtual void setParent(TWidget *p);
virtual void addSon(TWidget *son);
virtual void removeSon(TWidget *son);
inline int getSonCount() const { return m_sons->size(); }
inline TWidget *getSon(int i) const { return i < 0 || i >= (int)(m_sons->size()) ? 0 : (*m_sons)[i]; }
//
// help messages
//
std::wstring getLongHelp() const;
std::wstring getShortHelp() const;
void setHelp(std::string shortHelp, std::string longHelp);
void setHelp(std::wstring shortHelp, std::wstring longHelp);
virtual std::string getContextHelpReference(const TPoint &)
{
return m_contextHelpReference;
}
void setContextHelpReference(std::string s)
{
m_contextHelpReference = s;
}
//void delegateHelpToParent();
virtual std::wstring getTooltipString(const TPoint &) { return getShortHelp(); }
//
// misc
//
inline bool isHidden() const { return m_hidden; }
inline bool isMapped() const { return m_mapped; }
void enable();
void disable();
inline bool isEnabled() const { return m_enabled; }
void show();
void hide();
// n.b. non chiamare map/unmap, ma show/hide
virtual void map();
virtual void unmap();
virtual void doModal();
virtual void undock();
virtual void dock(TWidget *parent);
virtual TWidget *findSubWidget(const TPoint &pt);
virtual void repaint();
void sendRepaint() { sendRepaint(getBounds()); }
void sendRepaint(const TRect &);
virtual void paste();
virtual void startDragAndDrop(std::string stringToDrop);
typedef unsigned int CursorIndex;
inline CursorIndex getCurrentCursor() { return m_cursorIdx; }
void changeCursor(CursorIndex new_cur);
TWidgetImp *getImp() { return m_imp; }
void startTimer(TINT32 period);
void stopTimer();
virtual void getSelection();
virtual void onFocusChange(bool on);
virtual bool getFocus() { return false; }
virtual void circulateFocus();
virtual void copyRegion(
const TPoint &dst,
const TPoint &src,
const TDimension &size);
//
// draw
//
void flush();
virtual void draw() {}
virtual void invalidate();
virtual void invalidate(const TRect &rect);
void getClipRect(TRect &rect);
virtual void clear();
virtual void drawText(const TPoint &p, std::string text);
virtual void drawText(const TPoint &p, std::wstring text);
virtual void drawText(const TRect &r, std::string text, Alignment alignment = CENTER);
virtual void drawText(const TRect &r, std::wstring text, Alignment alignment = CENTER);
virtual void drawMultiLineText(const TRect &r, std::string text);
virtual void drawMultiLineText(const TRect &r, std::wstring text);
virtual TDimension getTextSize(std::string text);
virtual TDimension getTextSize(std::wstring text);
virtual TDimension getTextSize(std::string text, std::string font, int fontSize);
virtual TDimension getTextSize(std::wstring text, std::string font, int fontSize);
inline void drawPoint(int x, int y) { drawLine(x, y, x, y); }
virtual void drawLine(const TPoint &p0, const TPoint &p1);
inline void drawLine(int x0, int y0, int x1, int y1)
{
drawLine(TPoint(x0, y0), TPoint(x1, y1));
}
virtual void drawVLine(const TPoint &p0, int length)
{
drawLine(p0, p0 + TPoint(0, length - 1));
}
virtual void drawHLine(const TPoint &p0, int length)
{
drawLine(p0, p0 + TPoint(length - 1, 0));
}
virtual void drawDottedLine(const TPoint &p0, const TPoint &p1);
inline void drawDottedLine(int x0, int y0, int x1, int y1)
{
drawDottedLine(TPoint(x0, y0), TPoint(x1, y1));
}
virtual void drawRect(const TRect &);
virtual void fillRect(const TRect &);
virtual void drawRect(int x0, int y0, int x1, int y1)
{
drawRect(TRect(x0, y0, x1, y1));
}
virtual void fillRect(int x0, int y0, int x1, int y1)
{
fillRect(TRect(x0, y0, x1, y1));
}
virtual void draw3DRect(const TRect &,
bool pressed = false, int border = 1);
virtual void fill3DRect(const TRect &,
bool pressed = false, int border = 1);
virtual void drawDottedRect(const TRect &);
virtual void drawDottedRect(int x0, int y0, int x1, int y1)
{
drawDottedRect(TRect(x0, y0, x1, y1));
}
virtual void fillPolygon(
const TGuiColor &fillColor,
const TGuiColor &borderColor,
const TPoint points[],
int pointCount);
virtual void clear(const TRect &);
virtual void drawImage(int index, const TPoint &);
virtual void setColor(const TGuiColor &, int shade = 0);
virtual void setBackgroundColor(const TGuiColor &);
TGuiColor getBackgroundColor() const { return m_backgroundColor; }
TGuiColor getForegroundColor() const { return m_foregroundColor; }
static const TGuiColor White;
static const TGuiColor Black;
virtual void rectwrite(const TRaster32P &, const TPoint &);
virtual void setFontSize(int size);
virtual void setFont(std::string name, int size = 0, int orientation = 0);
//
// events
//
virtual void enter(const TPoint &) {}
virtual void leave(const TPoint &) {}
virtual void mouseMove(const TMouseEvent &) {}
virtual void leftButtonDown(const TMouseEvent &) {}
virtual void leftButtonDrag(const TMouseEvent &) {}
virtual void leftButtonUp(const TMouseEvent &) {}
virtual void rightButtonDown(const TMouseEvent &) {}
virtual void rightButtonDrag(const TMouseEvent &) {}
virtual void rightButtonUp(const TMouseEvent &) {}
virtual void middleButtonDown(const TMouseEvent &) {}
virtual void middleButtonDrag(const TMouseEvent &) {}
virtual void middleButtonUp(const TMouseEvent &) {}
virtual void leftButtonDoubleClick(const TMouseEvent &) {}
virtual void middleButtonDoubleClick(const TMouseEvent &) {}
virtual void rightButtonDoubleClick(const TMouseEvent &) {}
virtual void mouseWheel(const TMouseEvent &, int wheel) {}
virtual void keyDown(int, TUINT32, const TPoint &) {}
virtual void configureNotify(const TDimension &) {}
virtual void onPaste(std::string) {}
// virtual void close() {unmap();}
virtual void onDrop(std::string) {}
virtual std::string getToolTip() { return ""; }
virtual void onTimer(int) {}
virtual void onChildrenChanged() {}
virtual bool onNcPaint(bool is_active, const TDimension &window_size, const TRect &caption_rect);
public:
static void setFocusOwner(TWidget *w);
static TWidget *getFocusOwner();
virtual FocusHandling getFocusHandling() const { return IGNORE_FOCUS; }
static void placeInteractively(TRect &);
// brutto brutto qui
virtual void maximize(TWidget *) {}
virtual bool isMaximized(TWidget *) { return false; }
//
// drag & drop
//
// virtual bool acceptDrop() {return false;}
void enableDropTarget(TDragDropListener *dragDropListener);
TDragDropListener *getDragDropListener() const { return m_dragDropListener; }
static void yield(); // processa tutti gli eventi in attesa
static void setMode(int mode);
// misc
TPoint getAbsolutePosition() const;
static TPoint getMouseAbsolutePosition();
TPoint getMouseRelativePosition() const;
// brutto. serve per filtrare gli eventi durante il menu event loop
bool isMenuRelated() const { return m_menuRelated; }
// se non altro e' brutto il nome
//NB: il nome e' brutto... ora questo e' anche sbagliato
static void processAllPendingMessages(); // questa processa solo i WM_PAINT
static void processAllPendingMessages2(); // questa processa tutto
// mah? serve a evitare il circuito invalidate() -> repaint(); chiama direttamente
// repaint() (creando l'opportuno GC su windows)
//void paintRegion(const TRect &rect);
static TDimension getScreenSize();
static void getScreenPlacement(std::vector<TRectI> &);
};
#endif