EasyAndFastMod/Controls/Tabs.mqh

610 lines
47 KiB
MQL5
Raw Permalink Normal View History

2026-01-15 07:23:17 -05:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| Tabs.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#include "..\Element.mqh"
#include "ButtonsGroup.mqh"
//+------------------------------------------------------------------+
//| ;0AA 4;O A>740=8O 2:;04>: |
//+------------------------------------------------------------------+
class CTabs : public CElement
{
private:
//--- -:75<?;O@K 4;O A>740=8O M;5<5=B0
CButtonsGroup m_tabs;
//--- !B@C:BC@0 A2>9AB2 8 <0AA82>2 M;5<5=B>2 70:@5?;Q==KE 70 :064>9 2:;04:>9
struct TElements
{
CElement *elements[];
};
TElements m_tab[];
//--- >78F8>=8@>20=85 2:;04>:
ENUM_TABS_POSITION m_position_mode;
//--- 07<5@ 2:;04>: >A8 Y
int m_tab_y_size;
//--- =45:A 2K45;5==>9 2:;04:8
int m_selected_tab;
//---
public:
CTabs(void);
~CTabs(void);
//--- 5B>4K 4;O A>740=8O 2:;04>:
bool CreateTabs(const int x_gap,const int y_gap);
//---
private:
void InitializeProperties(const int x_gap,const int y_gap);
bool CreateCanvas(void);
bool CreateButtons(void);
//---
public:
//--- >72@0I05B C:070B5;L =0 3@C??C :=>?>:
CButtonsGroup *GetButtonsGroupPointer(void) { return(::GetPointer(m_tabs)); }
//--- (1) 2>72@0I05B :>;8G5AB2> 2:;04>:,
// (2) CAB0=02;8205B/?>;CG05B @0A?>;>65=85 2:;04>: (A25@EC/A=87C/A;520/A?@020), (3) CAB0=02;8205B @07<5@ 2:;04>: ?> >A8 Y
int TabsTotal(void) const { return(m_tabs.ButtonsTotal()); }
void PositionMode(const ENUM_TABS_POSITION mode) { m_position_mode=mode; }
ENUM_TABS_POSITION PositionMode(void) const { return(m_position_mode); }
void TabsYSize(const int y_size);
//--- (1) !>E@0=O5B 8 (2) 2>72@0I05B 8=45:A 2K45;5==>9 2:;04:8
void SelectedTab(const int index) { m_selected_tab=index; }
int SelectedTab(void) const { return(m_selected_tab); }
//--- #AB0=02;8205B B5:AB ?> C:070==><C 8=45:AC
void Text(const uint index,const string text);
//--- K45;O5B C:070==CN 2:;04:C
void SelectTab(const int index);
//--- >102;O5B 2:;04:C
void AddTab(const string tab_text="",const int tab_width=50);
//--- >102;O5B M;5<5=B 2 <0AA82 2:;04:8
void AddToElementsArray(const int tab_index,CElement &object);
//--- >:070BL M;5<5=BK B>;L:> 2K45;5==>9 2:;04:8
void ShowTabElements(void);
//---
public:
//--- 1@01>BG8: A>1KB89 3@0D8:0
virtual void OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
//--- #?@02;5=85
virtual void Show(void);
virtual void Hide(void);
virtual void Delete(void);
//--- 8AC5B M;5<5=B
virtual void Draw(void);
//--- 1=>2;O5B M;5<5=B 4;O >B>1@065=8O ?>A;54=8E 87<5=5=89
virtual void Update(void);
//---
private:
//--- 1@01>B:0 =060B8O =0 2:;04:5
bool OnClickTab(const int id,const int index);
//--- (8@8=0 2A5E 2:;04>:
int SumWidthTabs(void);
//--- @>25@:0 8=45:A0 2K45;5==>9 2:;04:8
void CheckTabIndex();
//--- 7<5=8BL H8@8=C ?> ?@02><C :@0N >:=0
virtual void ChangeWidthByRightWindowSide(void);
//--- 7<5=8BL 2KA>BC ?> =86=5<C :@0N >:=0
virtual void ChangeHeightByBottomWindowSide(void);
//--- 8AC5B D>= >1;0AB8 M;5<5=B>2
void DrawMainArea(void);
//--- 8AC5B <5B:C 2:;04:8
void DrawPatch();
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CTabs::CTabs(void) : m_tab_y_size(22),
m_position_mode(TABS_TOP),
m_selected_tab(WRONG_VALUE)
{
//--- !>E@0=8< 8<O :;0AA0 M;5<5=B0 2 107>2>< :;0AA5
CElementBase::ClassName(CLASS_NAME);
//--- KA>B0 2:;04>:
m_tabs.ButtonYSize(m_tab_y_size);
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CTabs::~CTabs(void)
{
}
//+------------------------------------------------------------------+
//| 1@01>BG8: A>1KB8O 3@0D8:0 |
//+------------------------------------------------------------------+
void CTabs::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
//--- 1@01>B:0 A>1KB8O =060B8O ;52>9 :=>?:8 <KH8 =0 >1J5:B5
if(id==CHARTEVENT_CUSTOM+ON_CLICK_GROUP_BUTTON)
{
//--- 060B85 =0 2:;04:5
if(OnClickTab((int)lparam,(int)dparam))
return;
//---
return;
}
}
//+------------------------------------------------------------------+
//| !>740QB M;5<5=B ":;04:8" |
//+------------------------------------------------------------------+
bool CTabs::CreateTabs(const int x_gap,const int y_gap)
{
//--- K9B8, 5A;8 =5B C:070B5;O =0 3;02=K9 M;5<5=B
if(!CElement::CheckMainPointer())
return(false);
//--- A;8 =5B =8 >4=>9 2:;04:8 2 3@C??5, A>>1I8BL >1 MB><
if(TabsTotal()<1)
{
::Print(__FUNCTION__," > K7>2 MB>3> <5B>40 =C6=> >ACI5AB2;OBL, "
":>340 2 3@C??5 5ABL E>BO 1K >4=0 2:;04:0! >A?>;L7C9B5AL <5B>4>< CTabs::AddTab()");
return(false);
}
//--- =8F80;870F8O A2>9AB2
InitializeProperties(x_gap,y_gap);
//--- !>740=85 M;5<5=B0
if(!CreateButtons())
return(false);
if(!CreateCanvas())
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| =8F80;870F8O A2>9AB2 |
//+------------------------------------------------------------------+
void CTabs::InitializeProperties(const int x_gap,const int y_gap)
{
m_x =CElement::CalculateX(x_gap);
m_y =CElement::CalculateY(y_gap);
m_x_size =(m_x_size<1 || m_auto_xresize_mode)? m_main.X2()-m_x-m_auto_xresize_right_offset : m_x_size;
m_y_size =(m_y_size<1 || m_auto_yresize_mode)? m_main.Y2()-m_y-m_auto_yresize_bottom_offset : m_y_size;
//--- &25B D>=0 ?> C<>;G0=8N
m_back_color =(m_back_color!=clrNONE)? m_back_color : clrWhiteSmoke;
m_back_color_hover =(m_back_color_hover!=clrNONE)? m_back_color_hover : C'229,241,251';
m_back_color_pressed =(m_back_color_pressed!=clrNONE)? m_back_color_pressed : clrWhite;
//--- &25B @0<:8 ?> C<>;G0=8N
m_border_color =(m_border_color!=clrNONE)? m_border_color : C'217,217,217';
m_border_color_hover =(m_border_color_hover!=clrNONE)? m_border_color_hover : m_border_color;
m_border_color_pressed =(m_border_color_pressed!=clrNONE)? m_border_color_pressed : m_border_color;
//--- BABC?K 8 F25B B5:AB>2>9 <5B:8
m_label_color =(m_label_color!=clrNONE)? m_label_color : clrBlack;
m_label_x_gap =(m_label_x_gap!=WRONG_VALUE)? m_label_x_gap : 0;
m_label_y_gap =(m_label_y_gap!=WRONG_VALUE)? m_label_y_gap : 0;
//--- BABC?K >B :@09=59 B>G:8
CElementBase::XGap(x_gap);
CElementBase::YGap(y_gap);
//--- @8>@8B5B, :0: C @>48B5;O
CElement::Z_Order(m_main.Z_Order());
}
//+------------------------------------------------------------------+
//| !>740QB >1J5:B 4;O @8A>20=8O |
//+------------------------------------------------------------------+
bool CTabs::CreateCanvas(void)
{
//--- $>@<8@>20=85 8<5=8 >1J5:B0
string name=CElementBase::ElementName("tabs");
//--- !>740=85 >1J5:B0
if(!CElement::CreateCanvas(name,m_x,m_y,m_x_size,m_y_size))
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| !>740QB 3@C??C :=>?>: |
//+------------------------------------------------------------------+
bool CTabs::CreateButtons(void)
{
int x=0,y=0;
//--- >;CG8< :>;8G5AB2> 2:;04>:
int tabs_total=TabsTotal();
//--- A;8 =5B =8 >4=>9 2:;04:8 2 3@C??5, A>>1I8BL >1 MB>< 8 2K9B8
if(tabs_total<1)
{
::Print(__FUNCTION__," > K7>2 MB>3> <5B>40 =C6=> >ACI5AB2;OBL, "
":>340 2 3@C??5 5ABL E>BO 1K >4=0 2:;04:0! >A?>;L7C9B5AL <5B>4>< CTabs::AddTabs()");
return(false);
}
//--- !>E@0=8< C:070B5;L =0 3;02=K9 M;5<5=B
m_tabs.MainPointer(this);
//--- 0AGQB :>>@48=0B >B=>A8B5;L=> ?>78F8>=8@>20=8O 2:;04>:
if(m_position_mode==TABS_TOP)
{
y=-m_tab_y_size+1;
}
else if(m_position_mode==TABS_BOTTOM)
{
y=1;
m_tabs.AnchorBottomWindowSide(true);
}
else if(m_position_mode==TABS_RIGHT)
{
x=1;
m_tabs.AnchorRightWindowSide(true);
}
else if(m_position_mode==TABS_LEFT)
{
x=-SumWidthTabs()+1;
}
//--- @>25@:0 8=45:A0 2K45;5==>9 2:;04:8
CheckTabIndex();
//--- !2>9AB20
m_tabs.NamePart("tab");
m_tabs.RadioButtonsMode(true);
m_tabs.IsCenterText(CElement::IsCenterText());
//--- !>740BL 3@C??C :=>?>:
if(!m_tabs.CreateButtonsGroup(x,y))
return(false);
//--- >1028BL M;5<5=B 2 <0AA82
CElement::AddToArray(m_tabs);
//---
for(int i=0; i<tabs_total; i++)
{
m_tabs.GetButtonPointer(i).LabelYGap(2);
m_tabs.GetButtonPointer(i).BackColor(m_back_color);
m_tabs.GetButtonPointer(i).BackColorHover(m_back_color_hover);
m_tabs.GetButtonPointer(i).BackColorPressed(m_back_color_pressed);
m_tabs.GetButtonPointer(i).BorderColor(m_border_color);
m_tabs.GetButtonPointer(i).BorderColorHover(m_border_color);
m_tabs.GetButtonPointer(i).BorderColorPressed(m_border_color);
m_tabs.GetButtonPointer(i).BorderColorLocked(m_border_color);
}
//---
m_back_color=m_back_color_pressed;
//--- K45;8BL :=>?:C
m_tabs.SelectButton(m_selected_tab);
return(true);
}
//+------------------------------------------------------------------+
//| #AB0=02;8205B 2KA>BC 2:;04>: |
//+------------------------------------------------------------------+
void CTabs::TabsYSize(const int y_size)
{
m_tab_y_size=y_size;
m_tabs.ButtonYSize(y_size);
}
//+------------------------------------------------------------------+
//| #AB0=02;8205B B5:AB 2:;04:8 |
//+------------------------------------------------------------------+
void CTabs::Text(const uint index,const string text)
{
//--- >;CG8< :>;8G5AB2> 2:;04>:
uint tabs_total=TabsTotal();
//--- K9B8, 5A;8 =5B =8 >4=>9 2:;04:8 2 3@C??5
if(tabs_total<1)
return;
//--- !:>@@5:B8@>20BL 7=0G5=85 8=45:A0, 5A;8 2KE>48B 87 480?07>=0
uint correct_index=(index>=tabs_total)? tabs_total-1 : index;
//--- #AB0=>28BL B5:AB
m_tabs.GetButtonPointer(correct_index).LabelText(text);
}
//+------------------------------------------------------------------+
//| K45;O5B 2:;04:C |
//+------------------------------------------------------------------+
void CTabs::SelectTab(const int index)
{
//--- >;CG8< :>;8G5AB2> 2:;04>:
uint tabs_total=TabsTotal();
for(uint i=0; i<tabs_total; i++)
{
//--- A;8 2K1@0=0 MB0 2:;04:0
if(index==i)
{
//--- !>E@0=8BL 8=45:A 2K45;5==>9 2:;04:8
SelectedTab(index);
//---
m_tabs.SelectButton(index);
}
}
//--- >:070BL M;5<5=BK B>;L:> 2K45;5==>9 2:;04:8
ShowTabElements();
}
//+------------------------------------------------------------------+
//| >102;O5B 2:;04:C |
//+------------------------------------------------------------------+
void CTabs::AddTab(const string tab_text,const int tab_width)
{
//--- 575@2=>5 :>;8G5AB2>
int reserve=10;
//--- #AB0=>28BL @07<5@ <0AA820< 2:;04>:
int array_size=::ArraySize(m_tab);
::ArrayResize(m_tab,array_size+1,reserve);
//--- >>@48=0BK
int x=0,y=0;
if(array_size>0)
{
if(m_position_mode==TABS_TOP || m_position_mode==TABS_BOTTOM)
{
x=SumWidthTabs()-1;
}
else
y=((array_size*m_tab_y_size)+m_tab_y_size)-m_tab_y_size-array_size;
}
//--- >1028BL :=>?:C 2 3@C??C
m_tabs.AddButton(x,y,tab_text,tab_width,m_back_color,m_back_color_hover,m_back_color_pressed);
}
//+------------------------------------------------------------------+
//| >102;O5B M;5<5=B 2 <0AA82 C:070==>9 2:;04:8 |
//+------------------------------------------------------------------+
void CTabs::AddToElementsArray(const int tab_index,CElement &object)
{
//--- @>25@:0 =0 2KE>4 87 480?07>=0
int array_size=::ArraySize(m_tab);
if(array_size<1 || tab_index<0 || tab_index>=array_size)
return;
//--- >1028< C:070B5;L ?5@540==>3> M;5<5=B0 2 <0AA82 C:070==>9 2:;04:8
int size=::ArraySize(m_tab[tab_index].elements);
::ArrayResize(m_tab[tab_index].elements,size+1);
m_tab[tab_index].elements[size]=::GetPointer(object);
}
//+------------------------------------------------------------------+
//| >:07K205B M;5<5=BK B>;L:> 2K45;5==>9 2:;04:8 |
//+------------------------------------------------------------------+
void CTabs::ShowTabElements(void)
{
//--- K9B8, 5A;8 2:;04:8 A:@KBK
if(!CElementBase::IsVisible())
return;
//--- @>25@:0 8=45:A0 2K45;5==>9 2:;04:8
CheckTabIndex();
//---
uint tabs_total=TabsTotal();
for(uint i=0; i<tabs_total; i++)
{
//--- >;CG8< :>;8G5AB2> M;5<5=B>2 ?@8A>548=Q==KE : 2:;04:5
int tab_elements_total=::ArraySize(m_tab[i].elements);
//--- A;8 2K45;5=0 MB0 2:;04:0
if(i==m_selected_tab)
{
//--- >:070BL M;5<5=BK 2:;04:8
for(int j=0; j<tab_elements_total; j++)
{
//--- >:070BL M;5<5=BK
CElement *el=m_tab[i].elements[j];
el.Reset();
//--- A;8 MB>B M;5<5=B ':;04:8', B> ?>:070BL M;5<5=BK >B:@KB>9
CTabs *tb=dynamic_cast<CTabs*>(el);
if(tb!=NULL)
tb.ShowTabElements();
}
}
//--- !:@KBL M;5<5=BK =50:B82=KE 2:;04>:
else
{
for(int j=0; j<tab_elements_total; j++)
m_tab[i].elements[j].Hide();
}
}
//--- B?@028BL A>>1I5=85 >1 MB><
::EventChartCustom(m_chart_id,ON_CLICK_TAB,CElementBase::Id(),m_selected_tab,"");
}
//+------------------------------------------------------------------+
//| >:070BL |
//+------------------------------------------------------------------+
void CTabs::Show(void)
{
//--- K9B8, 5A;8 M;5<5=B C65 2848<
if(CElementBase::IsVisible())
return;
//--- !>AB>O=85 2848<>AB8
CElementBase::IsVisible(true);
//--- 1=>28BL ?>;>65=85 >1J5:B>2
Moving();
//--- >:070BL M;5<5=BK
int elements_total=ElementsTotal();
for(int i=0; i<elements_total; i++)
{
if(!m_elements[i].IsDropdown())
m_elements[i].Show();
}
//--- >:070BL >1J5:B (4>;65= 1KBL A25@EC 3@C??K :=>?>:)
::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS);
}
//+------------------------------------------------------------------+
//| !:@KBL |
//+------------------------------------------------------------------+
void CTabs::Hide(void)
{
//--- K9B8, 5A;8 M;5<5=B C65 A:@KB
if(!CElementBase::IsVisible())
return;
//--- !:@KBL >1J5:B
::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_TIMEFRAMES,OBJ_NO_PERIODS);
//--- !>AB>O=85 2848<>AB8
CElementBase::IsVisible(false);
CElementBase::MouseFocus(false);
//--- !:@KBL M;5<5=BK
int elements_total=ElementsTotal();
for(int i=0; i<elements_total; i++)
m_elements[i].Hide();
//--- !:@KBL M;5<5=BK 2:;04>:
int tabs_total=TabsTotal();
for(int i=0; i<tabs_total; i++)
{
int tab_elements_total=::ArraySize(m_tab[i].elements);
for(int t=0; t<tab_elements_total; t++)
m_tab[i].elements[t].Hide();
}
}
//+------------------------------------------------------------------+
//| #40;5=85 |
//+------------------------------------------------------------------+
void CTabs::Delete(void)
{
CElement::Delete();
//--- A2>1>645=85 <0AA82>2 M;5<5=B0
uint tabs_total=TabsTotal();
for(uint i=0; i<tabs_total; i++)
::ArrayFree(m_tab[i].elements);
//---
::ArrayFree(m_tab);
m_back_color=clrNONE;
}
//+------------------------------------------------------------------+
//| 060B85 =0 2:;04:C 2 3@C??5 |
//+------------------------------------------------------------------+
bool CTabs::OnClickTab(const int id,const int index)
{
//--- K9B8, 5A;8 (1) 845=B8D8:0B>@K =5 A>2?040NB 8;8 (2) M;5<5=B 701;>:8@>20=
if(id!=CElementBase::Id() || CElementBase::IsLocked())
return(false);
//--- K9B8, 5A;8 8=45:A =5 A>2?0405B
if(index!=m_tabs.SelectedButtonIndex())
return(true);
//--- !>E@0=8BL 8=45:A 2K45;5==>9 2:;04:8
SelectedTab(index);
//--- 5@5@8A>20BL M;5<5=B
::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_TIMEFRAMES,OBJ_NO_PERIODS);
CElement::Update(true);
::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS);
//--- >:070BL M;5<5=BK B>;L:> 2K45;5==>9 2:;04:8
ShowTabElements();
//--- B?@028< A>>1I5=85 >1 87<5=5=88 2 3@0D8G5A:>< 8=B5@D59A5
::EventChartCustom(m_chart_id,ON_CHANGE_GUI,CElementBase::Id(),0.0,"");
return(true);
}
//+------------------------------------------------------------------+
//| 1I0O H8@8=0 2A5E 2:;04>: |
//+------------------------------------------------------------------+
int CTabs::SumWidthTabs(void)
{
int width=0;
//--- A;8 ?>78F8>=8@>20=85 2:;04>: A?@020 8;8 A;520, 25@=CBL H8@8=C ?5@2>9 2:;04:8
if(m_position_mode==TABS_LEFT || m_position_mode==TABS_RIGHT)
return(m_tabs.GetButtonPointer(0).XSize());
//--- !C<<8@C5< H8@8=C 2A5E 2:;04>:
int tabs_total=m_tabs.ButtonsTotal();
for(int i=0; i<tabs_total; i++)
{
width=width+m_tabs.GetButtonPointer(i).XSize();
}
//--- ! CGQB>< =0A;>5=8O =0 >48= ?8:A5;L
width=width-(tabs_total-1);
return(width);
}
//+------------------------------------------------------------------+
//| @>25@:0 8=45:A0 2K45;5==>9 2:;04:8 |
//+------------------------------------------------------------------+
void CTabs::CheckTabIndex(void)
{
//--- @>25@:0 =0 2KE>4 87 480?07>=0
int array_size=::ArraySize(m_tab);
if(m_selected_tab<0)
m_selected_tab=0;
if(m_selected_tab>=array_size)
m_selected_tab=array_size-1;
}
//+------------------------------------------------------------------+
//| 7<5=8BL H8@8=C ?> ?@02><C :@0N D>@<K |
//+------------------------------------------------------------------+
void CTabs::ChangeWidthByRightWindowSide(void)
{
//--- K9B8, 5A;8 2:;NG5= @568< ?@82O7:8 : ?@02>9 G0AB8 >:=0
if(m_anchor_right_window_side)
return;
//--- 07<5@K
int x_size=0;
//--- 0AAG8B0BL 8 CAB0=>28BL =>2K9 @07<5@ D>=C M;5<5=B0
x_size=m_main.X2()-m_canvas.X()-m_auto_xresize_right_offset;
//--- 5 87<5=OBL @07<5@, 5A;8 <5=LH5 CAB0=>2;5==>3> >3@0=8G5=8O
if(x_size == m_x_size)
return;
//---
CElementBase::XSize(x_size);
m_canvas.XSize(x_size);
m_canvas.Resize(x_size,m_y_size);
//--- 5@5@8A>20BL M;5<5=B
Draw();
//--- 1=>28BL ?>;>65=85 >1J5:B>2
Moving();
}
//+------------------------------------------------------------------+
//| 7<5=8BL 2KA>BC ?> =86=5<C :@0N >:=0 |
//+------------------------------------------------------------------+
void CTabs::ChangeHeightByBottomWindowSide(void)
{
//--- K9B8, 5A;8 2:;NG5= @568< ?@82O7:8 : =86=59 G0AB8 >:=0
if(m_anchor_bottom_window_side)
return;
//--- 07<5@K
int y_size=0;
//--- 0AAG8B0BL 8 CAB0=>28BL =>2K9 @07<5@ D>=C M;5<5=B0
y_size=m_main.Y2()-m_canvas.Y()-m_auto_yresize_bottom_offset;
//--- 5 87<5=OBL @07<5@, 5A;8 <5=LH5 CAB0=>2;5==>3> >3@0=8G5=8O
if(y_size==m_y_size)
return;
//---
CElementBase::YSize(y_size);
m_canvas.YSize(y_size);
m_canvas.Resize(m_x_size,y_size);
//--- 5@5@8A>20BL M;5<5=B
Draw();
//--- 1=>28BL ?>;>65=85 >1J5:B>2
Moving();
}
//+------------------------------------------------------------------+
//| 8AC5B M;5<5=B |
//+------------------------------------------------------------------+
void CTabs::Draw(void)
{
//--- 0@8A>20BL D>=
CElement::DrawBackground();
//--- 0@8A>20BL @0<:C
CElement::DrawBorder();
//--- 0@8A>20BL <5B:C 2K45;5==>9 2:;04:8
DrawPatch();
}
//+------------------------------------------------------------------+
//| 8AC5B <5B:C 2:;04:8 |
//+------------------------------------------------------------------+
void CTabs::DrawPatch(void)
{
//--- >>@48=0BK
int x1 =0,x2 =0;
int y1 =0,y2 =0;
//---
if(m_position_mode==TABS_TOP)
{
x1 =m_tabs.GetButtonPointer(m_selected_tab).XGap()+1;
x2 =x1+m_tabs.GetButtonPointer(m_selected_tab).XSize()-3;
}
else if(m_position_mode==TABS_BOTTOM)
{
x1 =m_tabs.GetButtonPointer(m_selected_tab).XGap()+1;
x2 =x1+m_tabs.GetButtonPointer(m_selected_tab).XSize()-3;
y1 =YSize()-1;
y2 =y1;
}
else if(m_position_mode==TABS_LEFT)
{
y1 =m_tabs.GetButtonPointer(m_selected_tab).YGap()+1;
y2 =y1+m_tabs.GetButtonPointer(m_selected_tab).YSize()-3;
}
else if(m_position_mode==TABS_RIGHT)
{
x1 =XSize()-1;
x2 =x1;
y1 =m_tabs.GetButtonPointer(m_selected_tab).YGap()+1;
y2 =y1+m_tabs.GetButtonPointer(m_selected_tab).YSize()-3;
}
//--- ?@545;8< F25B 4;O ;8=88
color clr=m_back_color;
if(m_tabs.GetButtonPointer(m_selected_tab).CElementBase::IsLocked())
clr=m_tabs.GetButtonPointer(m_selected_tab).BackColorLocked();
//--- 8AC5< ;8=8N
m_canvas.Line(x1,y1,x2,y2,::ColorToARGB(clr,m_alpha));
}
//+------------------------------------------------------------------+
//| 1=>2;5=85 M;5<5=B0 |
//+------------------------------------------------------------------+
void CTabs::Update(void)
{
//--- 0@8A>20BL D>=
CElement::Update(true);
//--- 0@8A>20BL :=>?:8
int tabs_total=TabsTotal();
for(int i=0; i<tabs_total; i++)
m_tabs.GetButtonPointer(i).Update(true);
}
//+------------------------------------------------------------------+