665 lines
20 KiB
C++
665 lines
20 KiB
C++
// fwidget.h
|
|
// class FWidget
|
|
|
|
#ifndef _FWIDGET_H
|
|
#define _FWIDGET_H
|
|
|
|
#include "fterm.h"
|
|
|
|
// widget flags
|
|
#define SHADOW 0x00000001
|
|
#define TRANS_SHADOW 0x00000002
|
|
#define ACTIVE 0x00000004
|
|
#define FOCUS 0x00000008
|
|
#define SCROLLABLE 0x00000010
|
|
#define RESIZEABLE 0x00000020
|
|
#define MODAL 0x00000040
|
|
#define FLAT 0x00000080
|
|
#define NO_UNDERLINE 0x00000100
|
|
|
|
class FStatusBar;
|
|
|
|
//----------------------------------------------------------------------
|
|
// class FWidget
|
|
//----------------------------------------------------------------------
|
|
|
|
#pragma pack(push)
|
|
#pragma pack(1)
|
|
|
|
class FWidget : public FObject, public FTerm
|
|
{
|
|
public:
|
|
typedef std::vector<FWidget*> widgetList;
|
|
static widgetList* window_list;
|
|
static widgetList* close_widget;
|
|
|
|
typedef void (*FCallback)(FWidget*, void*);
|
|
typedef void (FWidget::*FMemberCallback)(FWidget*, void*);
|
|
typedef void* data_ptr;
|
|
|
|
struct callback_data
|
|
{
|
|
FString cb_signal;
|
|
FCallback cb_handler;
|
|
data_ptr data;
|
|
};
|
|
|
|
typedef std::vector<callback_data> CallbackObjects;
|
|
CallbackObjects callbackObjects;
|
|
|
|
struct member_callback_data
|
|
{
|
|
FString cb_signal;
|
|
FWidget* cb_instance;
|
|
FMemberCallback cb_handler;
|
|
data_ptr data;
|
|
};
|
|
|
|
typedef std::vector<member_callback_data> MemberCallbackObjects;
|
|
MemberCallbackObjects memberCallbackObjects;
|
|
|
|
struct accelerator
|
|
{
|
|
int key;
|
|
FWidget* object;
|
|
};
|
|
|
|
typedef std::vector<accelerator> Accelerators;
|
|
Accelerators* accelerator_list;
|
|
|
|
static struct widget_colors
|
|
{
|
|
uChar term_fg;
|
|
uChar term_bg;
|
|
uChar list_fg;
|
|
uChar list_bg;
|
|
uChar selected_list_fg;
|
|
uChar selected_list_bg;
|
|
uChar current_element_focus_fg;
|
|
uChar current_element_focus_bg;
|
|
uChar current_element_fg;
|
|
uChar current_element_bg;
|
|
uChar current_inc_search_element_fg;
|
|
uChar selected_current_element_fg;
|
|
uChar selected_current_element_bg;
|
|
uChar label_fg;
|
|
uChar label_bg;
|
|
uChar label_inactive_fg;
|
|
uChar label_inactive_bg;
|
|
uChar label_hotkey_fg;
|
|
uChar label_hotkey_bg;
|
|
uChar label_emphasis_fg;
|
|
uChar label_ellipsis_fg;
|
|
uChar inputfield_active_focus_fg;
|
|
uChar inputfield_active_focus_bg;
|
|
uChar inputfield_active_fg;
|
|
uChar inputfield_active_bg;
|
|
uChar inputfield_inactive_fg;
|
|
uChar inputfield_inactive_bg;
|
|
uChar dialog_fg;
|
|
uChar dialog_emphasis_fg;
|
|
uChar dialog_bg;
|
|
uChar error_box_fg;
|
|
uChar error_box_emphasis_fg;
|
|
uChar error_box_bg;
|
|
uChar shadow_fg;
|
|
uChar shadow_bg;
|
|
uChar toggle_button_active_focus_fg;
|
|
uChar toggle_button_active_focus_bg;
|
|
uChar toggle_button_active_fg;
|
|
uChar toggle_button_active_bg;
|
|
uChar toggle_button_inactive_fg;
|
|
uChar toggle_button_inactive_bg;
|
|
uChar button_active_focus_fg;
|
|
uChar button_active_focus_bg;
|
|
uChar button_active_fg;
|
|
uChar button_active_bg;
|
|
uChar button_inactive_fg;
|
|
uChar button_inactive_bg;
|
|
uChar button_hotkey_fg;
|
|
uChar titlebar_active_fg;
|
|
uChar titlebar_active_bg;
|
|
uChar titlebar_inactive_fg;
|
|
uChar titlebar_inactive_bg;
|
|
uChar titlebar_button_fg;
|
|
uChar titlebar_button_bg;
|
|
uChar statusbar_fg;
|
|
uChar statusbar_bg;
|
|
uChar statusbar_hotkey_fg;
|
|
uChar statusbar_hotkey_bg;
|
|
uChar statusbar_separator_fg;
|
|
uChar statusbar_active_fg;
|
|
uChar statusbar_active_bg;
|
|
uChar statusbar_active_hotkey_fg;
|
|
uChar statusbar_active_hotkey_bg;
|
|
uChar scrollbar_fg;
|
|
uChar scrollbar_bg;
|
|
uChar scrollbar_button_fg;
|
|
uChar scrollbar_button_bg;
|
|
uChar progressbar_fg;
|
|
uChar progressbar_bg;
|
|
} wc;
|
|
// widget_colors wc;
|
|
|
|
struct dbl_line_mask
|
|
{
|
|
std::vector<bool> top;
|
|
std::vector<bool> right;
|
|
std::vector<bool> bottom;
|
|
std::vector<bool> left;
|
|
} double_flatline_mask;
|
|
|
|
protected:
|
|
int xpos;
|
|
int ypos;
|
|
int width;
|
|
int height;
|
|
int xmin;
|
|
int ymin;
|
|
int xmax;
|
|
int ymax;
|
|
int top_padding;
|
|
int left_padding;
|
|
int bottom_padding;
|
|
int right_padding;
|
|
int client_xmin;
|
|
int client_ymin;
|
|
int client_xmax;
|
|
int client_ymax;
|
|
FPoint shadow;
|
|
FRect adjustWidgetSizeShadow;
|
|
FRect adjustWidgetSizeGlobalShadow;
|
|
bool ignore_padding;
|
|
bool window_object;
|
|
int flags;
|
|
int foregroundColor;
|
|
int backgroundColor;
|
|
static uInt modal_dialogs;
|
|
|
|
private:
|
|
bool enable;
|
|
bool visible;
|
|
bool shown;
|
|
bool focus;
|
|
bool focusable;
|
|
bool visibleCursor;
|
|
FPoint widgetCursorPosition;
|
|
FRect widgetSize;
|
|
FRect adjustWidgetSize;
|
|
FRect adjustWidgetSizeGlobal;
|
|
FString statusbar_message;
|
|
|
|
static FStatusBar* statusbar;
|
|
static FWidget* show_root_widget;
|
|
static FWidget* redraw_root_widget;
|
|
friend class FApplication;
|
|
friend class FToggleButton;
|
|
|
|
private:
|
|
FWidget (const FWidget&);
|
|
FWidget& operator = (const FWidget&);
|
|
void init();
|
|
void finish();
|
|
void processDestroy();
|
|
virtual void draw();
|
|
static void setColorTheme();
|
|
|
|
protected:
|
|
virtual void adjustSize();
|
|
virtual void setStatusBar (FStatusBar*);
|
|
// Event handlers
|
|
bool event (FEvent*);
|
|
virtual void onKeyPress (FKeyEvent*);
|
|
virtual void onKeyUp (FKeyEvent*);
|
|
virtual void onKeyDown (FKeyEvent*);
|
|
virtual void onMouseDown (FMouseEvent*);
|
|
virtual void onMouseUp (FMouseEvent*);
|
|
virtual void onMouseDoubleClick (FMouseEvent*);
|
|
virtual void onWheel (FWheelEvent*);
|
|
virtual void onMouseMove (FMouseEvent*);
|
|
virtual void onFocusIn (FFocusEvent*);
|
|
virtual void onFocusOut (FFocusEvent*);
|
|
virtual void onAccel (FAccelEvent*);
|
|
virtual void onResize (FResizeEvent*);
|
|
virtual void onShow (FShowEvent*);
|
|
virtual void onHide (FHideEvent*);
|
|
virtual void onClose (FCloseEvent*);
|
|
virtual bool focusNextChild (void);
|
|
virtual bool focusPrevChild (void);
|
|
|
|
public:
|
|
explicit FWidget (FWidget* parent=0); // constructor
|
|
~FWidget(); // destructor
|
|
|
|
const char* getClassName() const;
|
|
FWidget* getRootWidget() const;
|
|
static FWidget* getMainWidget();
|
|
static void setMainWidget (FWidget*);
|
|
static FWidget* childWidgetAt (FWidget*, const FPoint&);
|
|
static FWidget* childWidgetAt (FWidget*, int, int);
|
|
virtual FWidget* getFocusWidget() const;
|
|
virtual void setFocusWidget(FWidget*);
|
|
static FWidget* getClickedWidget();
|
|
static void setClickedWidget(FWidget*);
|
|
int numOfFocusableChildren();
|
|
FWidget* parentWidget() const;
|
|
bool isRootWidget() const;
|
|
bool isWindow() const;
|
|
virtual bool close();
|
|
|
|
static FStatusBar* statusBar();
|
|
void setStatusbarMessage (FString);
|
|
void clearStatusbarMessage();
|
|
FString getStatusbarMessage();
|
|
|
|
void addCallback (FString, FCallback, void*);
|
|
void addCallback (FString, FWidget*, FMemberCallback, void*);
|
|
void delCallback (FCallback);
|
|
void delCallback (FWidget*);
|
|
void emitCallback (FString);
|
|
|
|
void addAccelerator (int key);
|
|
void addAccelerator (int, FWidget*);
|
|
void delAccelerator (FWidget*);
|
|
|
|
virtual void redraw();
|
|
virtual void resize();
|
|
virtual void show();
|
|
virtual void hide();
|
|
bool setVisible();
|
|
bool isVisible() const;
|
|
bool isShown() const;
|
|
|
|
virtual bool setEnable(bool);
|
|
virtual bool setEnable();
|
|
virtual bool unsetEnable();
|
|
virtual bool setDisable();
|
|
bool isEnabled() const;
|
|
|
|
virtual bool setVisibleCursor(bool);
|
|
virtual bool setVisibleCursor();
|
|
virtual bool unsetVisibleCursor();
|
|
bool hasVisibleCursor() const;
|
|
|
|
virtual bool focusFirstChild (void);
|
|
virtual bool focusLastChild (void);
|
|
virtual bool setFocus(bool);
|
|
virtual bool setFocus();
|
|
virtual bool unsetFocus();
|
|
bool hasFocus() const;
|
|
bool acceptFocus() const;
|
|
void setFocusable();
|
|
void unsetFocusable();
|
|
|
|
bool ignorePadding(bool);
|
|
bool ignorePadding();
|
|
bool acceptPadding();
|
|
|
|
int getForegroundColor() const;
|
|
int getBackgroundColor() const;
|
|
int getX() const;
|
|
int getY() const;
|
|
int getGlobalX() const;
|
|
int getGlobalY() const;
|
|
const FPoint getGlobalPos() const;
|
|
int getWidth() const;
|
|
int getHeight() const;
|
|
int getTopPadding() const;
|
|
int getLeftPadding() const;
|
|
int getBottomPadding() const;
|
|
int getRightPadding() const;
|
|
int getClientWidth() const;
|
|
int getClientHeight() const;
|
|
const FPoint& getShadow() const;
|
|
const FRect& getGeometry() const;
|
|
const FRect& getGeometryShadow() const;
|
|
const FRect& getGeometryGlobal() const;
|
|
const FRect& getGeometryGlobalShadow() const;
|
|
FPoint globalToLocalPos(const FPoint&);
|
|
void setForegroundColor (int);
|
|
void setBackgroundColor (int);
|
|
void setX (int, bool adjust=true);
|
|
void setY (int, bool adjust=true);
|
|
void setWidth (int, bool adjust=true);
|
|
void setHeight (int, bool adjust=true);
|
|
void setTopPadding (int, bool adjust=true);
|
|
void setLeftPadding (int, bool adjust=true);
|
|
void setBottomPadding (int, bool adjust=true);
|
|
void setRightPadding (int, bool adjust=true);
|
|
void getTermGeometry();
|
|
void setTermGeometry (int, int);
|
|
virtual void setGeometry (const FRect&, bool adjust=true);
|
|
virtual void setGeometry (int, int, int, int, bool adjust=true);
|
|
virtual void move (const FPoint&);
|
|
virtual void move (int x, int y);
|
|
int getFlags() const;
|
|
|
|
bool setCursor();
|
|
FPoint getCursorPos();
|
|
bool setCursorPos (const FPoint&);
|
|
bool setCursorPos (register int, register int);
|
|
void unsetCursorPos();
|
|
|
|
static void gotoxy (const FPoint&);
|
|
static void gotoxy (register int, register int);
|
|
void clrscr();
|
|
|
|
static bool setBold(register bool);
|
|
static bool setBold();
|
|
static bool unsetBold();
|
|
static bool isBold();
|
|
|
|
static bool setReverse(register bool);
|
|
static bool setReverse();
|
|
static bool unsetReverse();
|
|
static bool isReverse();
|
|
|
|
static bool setUnderline(register bool);
|
|
static bool setUnderline();
|
|
static bool unsetUnderline();
|
|
static bool isUnderline();
|
|
|
|
void drawShadow();
|
|
void clearShadow();
|
|
void drawFlatBorder();
|
|
void clearFlatBorder();
|
|
void setDoubleFlatLine(int, bool bit=true);
|
|
void unsetDoubleFlatLine(int);
|
|
std::vector<bool>& doubleFlatLine_ref(int);
|
|
virtual void drawBorder();
|
|
|
|
static void quit();
|
|
};
|
|
|
|
#pragma pack(pop)
|
|
|
|
//----------------------------------------------------------------------
|
|
inline const char* FWidget::getClassName() const
|
|
{ return "FWidget"; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline FWidget* FWidget::parentWidget() const
|
|
{ return static_cast<FWidget*>(parent()); }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::isRootWidget() const
|
|
{ return (! hasParent()); }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline void FWidget::setStatusbarMessage(FString msg)
|
|
{ statusbar_message = msg; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline void FWidget::clearStatusbarMessage()
|
|
{ statusbar_message.clear(); }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline FString FWidget::getStatusbarMessage()
|
|
{ return statusbar_message; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::setVisible()
|
|
{ return visible = true; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::isVisible() const
|
|
{ return visible; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::isShown() const
|
|
{ return shown; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::isWindow() const
|
|
{ return window_object; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::setEnable()
|
|
{ return setEnable(true); }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::unsetEnable()
|
|
{ return setEnable(false); }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::setDisable()
|
|
{ return setEnable(false); }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::isEnabled() const
|
|
{ return enable; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::setVisibleCursor()
|
|
{ return setVisibleCursor(true); }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::unsetVisibleCursor()
|
|
{ return setVisibleCursor(false); }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::hasVisibleCursor() const
|
|
{ return visibleCursor; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::setFocus()
|
|
{ return setFocus(true); }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::unsetFocus()
|
|
{ return setFocus(false); }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::hasFocus() const
|
|
{ return focus; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::acceptFocus() const
|
|
{ return focusable; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::ignorePadding (bool on)
|
|
{ return ignore_padding = on; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::ignorePadding()
|
|
{ return ignore_padding = true; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::acceptPadding()
|
|
{ return ignore_padding = false; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline void FWidget::setFocusable()
|
|
{ focusable = true; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline void FWidget::unsetFocusable()
|
|
{ focusable = false; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline int FWidget::getForegroundColor() const
|
|
{ return foregroundColor; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline int FWidget::getBackgroundColor() const
|
|
{ return backgroundColor; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline int FWidget::getX() const
|
|
{ return xpos; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline int FWidget::getY() const
|
|
{ return ypos; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline int FWidget::getGlobalX() const
|
|
{ return xpos+xmin-1; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline int FWidget::getGlobalY() const
|
|
{ return ypos+ymin-1; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline const FPoint FWidget::getGlobalPos() const
|
|
{ return FPoint(xpos+xmin-1, ypos+ymin-1); }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline int FWidget::getWidth() const
|
|
{ return width; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline int FWidget::getHeight() const
|
|
{ return height; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline int FWidget::getTopPadding() const
|
|
{ return top_padding; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline int FWidget::getLeftPadding() const
|
|
{ return left_padding; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline int FWidget::getBottomPadding() const
|
|
{ return bottom_padding; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline int FWidget::getRightPadding() const
|
|
{ return right_padding; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline int FWidget::getClientWidth() const
|
|
{ return client_xmax-client_xmin+1; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline int FWidget::getClientHeight() const
|
|
{ return client_ymax-client_ymin+1; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline const FPoint& FWidget::getShadow() const
|
|
{ return shadow; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline const FRect& FWidget::getGeometry() const
|
|
{ return adjustWidgetSize; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline const FRect& FWidget::getGeometryShadow() const
|
|
{ return adjustWidgetSizeShadow; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline const FRect& FWidget::getGeometryGlobal() const
|
|
{ return adjustWidgetSizeGlobal; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline const FRect& FWidget::getGeometryGlobalShadow() const
|
|
{ return adjustWidgetSizeGlobalShadow; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline int FWidget::getFlags() const
|
|
{ return flags; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline FPoint FWidget::getCursorPos()
|
|
{ return widgetCursorPosition; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::setBold()
|
|
{ return setBold(true); }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::unsetBold()
|
|
{ return setBold(false); }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::isBold()
|
|
{ return bold; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::setReverse()
|
|
{ return setReverse(true); }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::unsetReverse()
|
|
{ return setReverse(false); }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::isReverse()
|
|
{ return reverse; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::setUnderline()
|
|
{ return setUnderline(true); }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::unsetUnderline()
|
|
{ return setUnderline(false); }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline bool FWidget::isUnderline()
|
|
{ return underline; }
|
|
|
|
//----------------------------------------------------------------------
|
|
inline void FWidget::unsetDoubleFlatLine(int side)
|
|
{ setDoubleFlatLine(side, false); }
|
|
|
|
|
|
// NewFont elements
|
|
//----------------------------------------------------------------------
|
|
const wchar_t NF_Drive[5] =
|
|
{
|
|
fc::NF_shadow_box_left,
|
|
fc::NF_shadow_box_middle,
|
|
fc::NF_shadow_box_hdd,
|
|
fc::NF_shadow_box_right,
|
|
'\0'
|
|
};
|
|
const wchar_t NF_CD_ROM[5] =
|
|
{
|
|
fc::NF_shadow_box_left,
|
|
fc::NF_shadow_box_middle,
|
|
fc::NF_shadow_box_cd,
|
|
fc::NF_shadow_box_right,
|
|
'\0'
|
|
};
|
|
const wchar_t NF_Net_Drive[5] =
|
|
{
|
|
fc::NF_shadow_box_left,
|
|
fc::NF_shadow_box_middle,
|
|
fc::NF_shadow_box_net,
|
|
fc::NF_shadow_box_right,
|
|
'\0'
|
|
};
|
|
const wchar_t CHECKBOX[4] =
|
|
{
|
|
fc::NF_shadow_box_left,
|
|
fc::NF_shadow_box_middle,
|
|
fc::NF_shadow_box_right,
|
|
'\0'
|
|
};
|
|
const wchar_t CHECKBOX_ON[4] =
|
|
{
|
|
fc::NF_shadow_box_left,
|
|
fc::NF_shadow_box_checked,
|
|
fc::NF_shadow_box_right,
|
|
'\0'
|
|
};
|
|
const wchar_t RADIO_BUTTON[4] =
|
|
{
|
|
fc::NF_radio_button1,
|
|
fc::NF_radio_button2,
|
|
fc::NF_radio_button3,
|
|
'\0'
|
|
};
|
|
const wchar_t CHECKED_RADIO_BUTTON[4] =
|
|
{
|
|
fc::NF_radio_button1,
|
|
fc::NF_radio_button2_checked,
|
|
fc::NF_radio_button3,
|
|
'\0'
|
|
};
|
|
|
|
#endif // _FWIDGET_H
|