class BarPane : public ParentCtrl { public: virtual void LeftDown(Point pt, dword keyflags); virtual void MouseMove(Point p, dword); private: struct Item { Ctrl *ctrl; int gapsize; }; Array item; Vector breakpos; bool horz; Ctrl *phelpctrl; int vmargin, hmargin; bool menu; int& HoVe(Size& sz) { return horz ? sz.cx : sz.cy; } int& VeHo(Size& sz) { return horz ? sz.cy : sz.cx; } int& HoVe(bool horz, Size& sz) const { return horz ? sz.cx : sz.cy; } int& VeHo(bool horz, Size& sz) const { return horz ? sz.cy : sz.cx; } public: Callback WhenLeftClick; void PaintBar(Draw& w, const SeparatorCtrl::Style& ss, const Value& pane, const Value& iconbar = Null, int iconsz = 0); void IClear(); void Clear(); bool IsEmpty() const { return item.IsEmpty(); } void Add(Ctrl *ctrl, int gapsize); void AddBreak() { Add(NULL, Null); } void AddGap(int gapsize) { Add(NULL, gapsize); } void Margin(int v, int h) { vmargin = v; hmargin = h; } Size Repos(bool horz, int maxsize); Size GetPaneSize(bool _horz, int maxsize) const; int GetCount() const { return breakpos.GetCount() + 1; } void SubMenu() { menu = true; } BarPane(); virtual ~BarPane(); }; class Bar : public Ctrl { public: struct Item { virtual Item& Text(const char *text); virtual Item& Key(dword key); virtual Item& Repeat(bool repeat = true); virtual Item& Image(const class Image& img); virtual Item& Check(bool check); virtual Item& Radio(bool check); virtual Item& Enable(bool _enable = true); virtual Item& Tip(const char *tip); virtual Item& Help(const char *help); virtual Item& Topic(const char *topic); virtual Item& Description(const char *desc); virtual void FinalSync(); Item& Label(const char *text); Item& RightLabel(const char *text); Item& Key(KeyInfo& (*key)()); Item(); virtual ~Item(); }; protected: virtual Item& AddItem(Callback cb) = 0; virtual Item& AddSubMenu(Callback1 proc) = 0; virtual void AddCtrl(Ctrl *ctrl, int gapsize) = 0; virtual void AddCtrl(Ctrl *ctrl, Size sz) = 0; class ScanKeys; public: virtual bool IsEmpty() const = 0; virtual void Separator() = 0; static Item& NilItem(); static bool Scan(Callback1 proc, dword key); void Break(); void Gap(int size = 8); void GapRight() { Gap(INT_MAX); } void AddNC(Ctrl& ctrl); void Add(Ctrl& ctrl) { AddCtrl(&ctrl, ctrl.GetMinSize()); } void Add(Ctrl& ctrl, Size sz) { AddCtrl(&ctrl, sz); } void Add(Ctrl& ctrl, int cx, int cy = 0) { AddCtrl(&ctrl, Size(cx, cy)); } void Add(bool en, Ctrl& ctrl) { Add(ctrl); ctrl.Enable(en); } void Add(bool en, Ctrl& ctrl, Size sz) { Add(ctrl, sz); ctrl.Enable(en); } void Add(bool en, Ctrl& ctrl, int cx, int cy = 0) { Add(ctrl, cx, cy); ctrl.Enable(en); } Item& Add(bool enable, const char *text, const UPP::Image& image, Callback callback); Item& Add(bool enable, KeyInfo& (*key)(), const UPP::Image& image, Callback callback); Item& Add(const char *text, const UPP::Image& image, Callback callback); Item& Add(const String& text, const UPP::Image& image, Callback callback); Item& Add(KeyInfo& (*key)(), const UPP::Image& image, Callback callback); Item& Add(bool enable, const char *text, Callback callback); Item& Add(bool enable, KeyInfo& (*key)(), Callback callback); Item& Add(const char *text, Callback callback); Item& Add(KeyInfo& (*key)(), Callback callback); void MenuSeparator(); void MenuBreak(); void MenuGap(int size = 8); void MenuGapRight() { MenuGap(INT_MAX); } void AddMenu(Ctrl& ctrl); void AddMenu(Ctrl& ctrl, Size sz); void AddMenu(Ctrl& ctrl, int cx, int cy = 0) { AddMenu(ctrl, Size(cx, cy)); } Item& AddMenu(bool enable, const char *text, const UPP::Image& image, Callback callback); Item& AddMenu(bool enable, KeyInfo& (*key)(), const UPP::Image& image, Callback callback); Item& AddMenu(const char *text, const UPP::Image& image, Callback callback); Item& AddMenu(const String& t, const UPP::Image& m, Callback c) { return AddMenu(t, m, c); } Item& AddMenu(KeyInfo& (*key)(), const UPP::Image& m, Callback c); Item& Add(bool enable, const char *text, Callback1 proc); Item& Add(const char *text, Callback1 proc); Item& Add(bool enable, const char *text, const UPP::Image& image, Callback1 proc); Item& Add(const char *text, const UPP::Image& image, Callback1 proc); void ToolSeparator(); void ToolBreak(); void ToolGap(int size = 8); void ToolGapRight() { ToolGap(INT_MAX); } void AddTool(Ctrl& ctrl); void AddTool(Ctrl& ctrl, Size sz); void AddTool(Ctrl& ctrl, int cx, int cy = 0) { AddTool(ctrl, Size(cx, cy)); } Item& Add(const UPP::Image& image, Callback callback); Item& Add(bool enable, const UPP::Image& image, Callback callback); virtual void AddKey(dword key, Callback cb); void AddKey(KeyInfo& (*key)(), Callback cb); virtual bool IsMenuBar() const { return false; } virtual bool IsToolBar() const { return false; } virtual bool IsScanKeys() const { return false; } virtual bool IsScanHelp() const { return false; } typedef Bar CLASSNAME; Bar(); virtual ~Bar(); }; class BarCtrl : public Bar, public CtrlFrame { public: virtual void Layout(); virtual void FrameLayout(Rect& r); virtual void FrameAddSize(Size& sz); virtual void FrameAdd(Ctrl& ctrl); virtual void FrameRemove(); virtual bool IsEmpty() const; virtual void Separator(); protected: virtual void AddCtrl(Ctrl *ctrl, int gapsize); virtual void AddCtrl(Ctrl *ctrl, Size sz); private: class SizeCtrl : public ParentCtrl { public: virtual Size GetMinSize() const; private: Size size; public: void SetSize(Size sz) { size = sz; } SizeCtrl() { NoWantFocus(); } }; int sii; Array separator; int zii; Array sizer; int align; protected: BarPane pane; int ssize; int wrap; int lsepm, rsepm; const SeparatorCtrl::Style *sepstyle; void SyncBar(); void IClear(); void IFinish(); void Clear(); virtual Value GetBackground() const; friend class BarPane; public: Callback1 WhenHelp; Callback WhenLeftClick; static BarCtrl *GetBarCtrlParent(Ctrl *child); static void SendHelpLine(Ctrl *q); static void ClearHelpLine(Ctrl *q); enum { BAR_LEFT, BAR_RIGHT, BAR_TOP, BAR_BOTTOM }; void PaintBar(Draw& w, const SeparatorCtrl::Style& ss, const Value& pane, const Value& iconbar = Null, int iconsz = 0); BarCtrl& Align(int align); BarCtrl& Top() { return Align(BAR_TOP); } BarCtrl& Bottom() { return Align(BAR_BOTTOM); } BarCtrl& Left() { return Align(BAR_LEFT); } BarCtrl& Right() { return Align(BAR_RIGHT); } int GetAlign() const { return align; } BarCtrl& Wrap(int q = 1) { wrap = q; SyncBar(); return *this; } BarCtrl& NoWrap() { return Wrap(-1); } typedef BarCtrl CLASSNAME; BarCtrl(); virtual ~BarCtrl(); }; class MenuItemBase; CtrlFrame& MenuFrame(); class MenuBar : public BarCtrl { public: virtual void LeftDown(Point, dword); virtual bool Key(dword key, int count); virtual bool HotKey(dword key); virtual void ChildGotFocus(); virtual void ChildLostFocus(); virtual void Deactivate(); virtual void CancelMode(); virtual void Paint(Draw& w); virtual bool IsMenuBar() const { return true; } protected: virtual Item& AddItem(Callback cb); virtual Item& AddSubMenu(Callback1 proc); virtual Value GetBackground() const; public: struct Style : ChStyle