EasyAndFastMod/Controls/DropCalendar.mqh

317 lines
27 KiB
MQL5
Raw Permalink Normal View History

2026-01-15 07:23:17 -05:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| DropCalendar.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#include "..\Element.mqh"
#include "Calendar.mqh"
//+------------------------------------------------------------------+
//| ;0AA 4;O A>740=8O 2K?040NI53> :0;5=40@O |
//+------------------------------------------------------------------+
class CDropCalendar : public CElement
{
private:
//--- 1J5:BK 8 M;5<5=BK 4;O A>740=8O M;5<5=B0
CTextEdit m_date_box;
CButton m_drop_button;
CCalendar m_calendar;
//---
public:
CDropCalendar(void);
~CDropCalendar(void);
//--- 5B>4K 4;O A>740=8O 2K?040NI53> :0;5=40@O
bool CreateDropCalendar(const string text,const int x_gap,const int y_gap);
//---
private:
void InitializeProperties(const string text,const int x_gap,const int y_gap);
bool CreateDateBox(void);
bool CreateDropButton(void);
bool CreateCalendar(void);
//---
public:
//--- >72@0I05B C:070B5;8 =0 M;5<5=BK
CTextEdit *GetTextEditPointer(void) { return(::GetPointer(m_date_box)); }
CButton *GetDropButtonPointer(void) { return(::GetPointer(m_drop_button)); }
CCalendar *GetCalendarPointer(void) { return(::GetPointer(m_calendar)); }
//--- (1) #AB0=>28BL (2K45;8BL) 8 (2) ?>;CG8BL 2K45;5==CN 40BC
void SelectedDate(const datetime date);
datetime SelectedDate(void) { return(m_calendar.SelectedDate()); }
//--- 7<5=5=85 A>AB>O=8O 2848<>AB8 :0;5=40@O =0 ?@>B82>?>;>6=>5
void ChangeComboBoxCalendarState(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);
//--- 8AC5B M;5<5=B
virtual void Draw(void);
//---
private:
//--- 1@01>B:0 =060B8O =0 :=>?:C :><1>-1>:A0
bool OnClickButton(const string pressed_object,const int id,const int index);
//--- @>25@:0 =060B>9 ;52>9 :=>?:8 <KH8 =04 :=>?:>9 :><1>-1>:A0
void CheckPressedOverButton(void);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CDropCalendar::CDropCalendar(void)
{
//--- !>E@0=8< 8<O :;0AA0 M;5<5=B0 2 107>2>< :;0AA5
CElementBase::ClassName(CLASS_NAME);
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CDropCalendar::~CDropCalendar(void)
{
}
//+------------------------------------------------------------------+
//| 1@01>BG8: A>1KB89 |
//+------------------------------------------------------------------+
void CDropCalendar::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
//--- 1@01>B:0 A>1KB8O ?5@5<5I5=8O :C@A>@0
if(id==CHARTEVENT_MOUSE_MOVE)
{
//--- @>25@:0 =060B>9 ;52>9 :=>?:8 <KH8 =04 :=>?:>9 :><1>-1>:A0
CheckPressedOverButton();
return;
}
//--- 1@01>B:0 A>1KB8O 2K1>@0 =>2>9 40BK 2 :0;5=40@5
if(id==CHARTEVENT_CUSTOM+ON_CHANGE_DATE)
{
//--- K9B8, 5A;8 845=B8D8:0B>@K M;5<5=B>2 =5 A>2?040NB
if(lparam!=CElementBase::Id())
return;
//--- #AB0=>28< =>2CN 40BC 2 ?>;5 :><1>-1>:A0
m_date_box.SetValue(::TimeToString((datetime)dparam,TIME_DATE),false);
m_date_box.GetTextBoxPointer().Update(true);
return;
}
//--- 1@01>B:0 A>1KB8O =060B8O =0 :=>?:5
if(id==CHARTEVENT_CUSTOM+ON_CLICK_BUTTON)
{
if(OnClickButton(sparam,(uint)lparam,(uint)dparam))
return;
//---
return;
}
}
//+------------------------------------------------------------------+
//| !>740QB 2K?040NI89 :0;5=40@L |
//+------------------------------------------------------------------+
bool CDropCalendar::CreateDropCalendar(const string text,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);
//--- =8F80;870F8O A2>9AB2
InitializeProperties(text,x_gap,y_gap);
//--- !>740=85 M;5<5=B0
if(!CreateDateBox())
return(false);
if(!CreateDropButton())
return(false);
if(!CreateCalendar())
return(false);
//--- !:@KBL :0;5=40@L
m_calendar.Hide();
//--- B>1@078BL 2K45;5==CN 40BC 2 :0;5=40@5
m_date_box.SetValue(::TimeToString((datetime)m_calendar.SelectedDate(),TIME_DATE));
return(true);
}
//+------------------------------------------------------------------+
//| =8F80;870F8O A2>9AB2 |
//+------------------------------------------------------------------+
void CDropCalendar::InitializeProperties(const string text,const int x_gap,const int y_gap)
{
m_x =CElement::CalculateX(x_gap);
m_y =CElement::CalculateY(y_gap);
m_label_text =text;
//--- &25B0 ?> C<>;G0=8N
m_back_color =(m_back_color!=clrNONE)? m_back_color : m_main.BackColor();
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 : 4;
//--- BABC?K >B :@09=59 B>G:8
CElementBase::XGap(x_gap);
CElementBase::YGap(y_gap);
//--- @8>@8B5B, :0: C 3;02=>3> M;5<5=B0, B0: :0: M;5<5=B =5 8<55B A2>59 >1;0AB8 4;O =060B8O
CElement::Z_Order(m_main.Z_Order());
}
//+------------------------------------------------------------------+
//| !>740QB ?>;5 22>40 40BK |
//+------------------------------------------------------------------+
bool CDropCalendar::CreateDateBox(void)
{
//--- !>E@0=8< C:070B5;L =0 @>48B5;LA:89 M;5<5=B
m_date_box.MainPointer(this);
//--- !2>9AB20
m_date_box.Index(0);
m_date_box.NamePart("drop_calendar");
m_date_box.XSize(m_x_size);
m_date_box.YSize(m_y_size);
m_date_box.LabelXGap(m_label_x_gap);
m_date_box.LabelYGap(m_label_y_gap);
m_date_box.Font(CElement::Font());
m_date_box.FontSize(CElement::FontSize());
m_date_box.GetTextBoxPointer().XSize(95);
m_date_box.GetTextBoxPointer().TextYOffset(5);
m_date_box.GetTextBoxPointer().ReadOnlyMode(true);
m_date_box.GetTextBoxPointer().NamePart("date_box");
m_date_box.GetTextBoxPointer().AnchorRightWindowSide(true);
//--- #AB0=>28< >1J5:B
if(!m_date_box.CreateTextEdit(m_label_text,0,0))
return(false);
//--- >1028BL M;5<5=B 2 <0AA82
CElement::AddToArray(m_date_box);
return(true);
}
//+------------------------------------------------------------------+
//| !>740QB :=>?:C :><1>-1>:A0 |
//+------------------------------------------------------------------+
bool CDropCalendar::CreateDropButton(void)
{
//--- !>E@0=8< C:070B5;L =0 @>48B5;LA:89 M;5<5=B
m_drop_button.MainPointer(m_date_box);
//--- 07<5@K
int x_size=28;
//--- >>@48=0BK
int x=x_size,y=0;
//--- BABC?K 4;O :0@B8=:8
int icon_x_gap =(m_drop_button.IconXGap()<1)? 4 : m_drop_button.IconXGap();
int icon_y_gap =(m_drop_button.IconYGap()<1)? 2 : m_drop_button.IconYGap();
//--- !2>9AB20
m_drop_button.NamePart("drop_button");
m_drop_button.TwoState(true);
m_drop_button.XSize(x_size);
m_drop_button.YSize(m_y_size);
m_drop_button.IconXGap(icon_x_gap);
m_drop_button.IconYGap(icon_y_gap);
m_drop_button.AnchorRightWindowSide(true);
m_drop_button.IconFile(RESOURCE_CALENDAR_DROP_OFF);
m_drop_button.IconFileLocked(RESOURCE_CALENDAR_DROP_LOCKED);
m_drop_button.CElement::IconFilePressed(RESOURCE_CALENDAR_DROP_ON);
m_drop_button.CElement::IconFilePressedLocked(RESOURCE_CALENDAR_DROP_LOCKED);
//--- !>74048< M;5<5=B C?@02;5=8O
if(!m_drop_button.CreateButton("",x,y))
return(false);
//--- #AB0=>28BL ?@8>@8B5B
m_drop_button.Z_Order(m_date_box.GetTextBoxPointer().Z_Order()+1);
//--- >1028BL M;5<5=B 2 <0AA82
CElement::AddToArray(m_drop_button);
return(true);
}
//+------------------------------------------------------------------+
//| !>740QB A?8A>: |
//+------------------------------------------------------------------+
bool CDropCalendar::CreateCalendar(void)
{
//--- !>E@0=8< C:070B5;L =0 3;02=K9 M;5<5=B
m_calendar.MainPointer(m_date_box);
//--- >>@48=0BK
int x =m_date_box.GetTextBoxPointer().XGap();
int y =m_y_size;
//--- !2>9AB20
m_calendar.IsDropdown(true);
m_calendar.AnchorRightWindowSide(true);
//--- !>74048< M;5<5=B C?@02;5=8O
if(!m_calendar.CreateCalendar(x,y))
return(false);
//--- >1028BL M;5<5=B 2 <0AA82
CElement::AddToArray(m_calendar);
return(true);
}
//+------------------------------------------------------------------+
//| #AB0=>2:0 =>2>9 40BK 2 :0;5=40@L |
//+------------------------------------------------------------------+
void CDropCalendar::SelectedDate(const datetime date)
{
//--- #AB0=>28< 8 70?><=8< 40BC
m_calendar.SelectedDate(date);
//--- B>1@078< 40BC 2 ?>;5 22>40 :><1>-1>:A0
m_date_box.LabelText(::TimeToString(date,TIME_DATE));
}
//+------------------------------------------------------------------+
//| 7<5=5=85 A>AB>O=8O 2848<>AB8 :0;5=40@O =0 ?@>B82>?>;>6=>5 |
//+------------------------------------------------------------------+
void CDropCalendar::ChangeComboBoxCalendarState(void)
{
//--- A;8 :0;5=40@L >B:@KB, A?@OG5< 53>
if(m_calendar.IsVisible())
{
m_calendar.Hide();
//--- B?@028< A>>1I5=85 =0 >?@545;5=85 4>ABC?=KE M;5<5=B>2
::EventChartCustom(m_chart_id,ON_SET_AVAILABLE,CElementBase::Id(),1,"");
//--- 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,"");
}
//--- A;8 :0;5=40@L A:@KB, >B:@>5< 53>
else
{
m_calendar.Show();
m_calendar.GetComboBoxPointer().Show();
m_calendar.GetComboBoxPointer().GetButtonPointer().Show();
//--- B?@028< A>>1I5=85 =0 >?@545;5=85 4>ABC?=KE M;5<5=B>2
::EventChartCustom(m_chart_id,ON_SET_AVAILABLE,CElementBase::Id(),0,"");
//--- 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,"");
}
}
//+------------------------------------------------------------------+
//| 060B85 =0 :=>?:C :><1>-1>:A0 |
//+------------------------------------------------------------------+
bool CDropCalendar::OnClickButton(const string pressed_object,const int id,const int index)
{
//--- K945<, 5A;8 =060B85 1K;> =5 =0 MB>< M;5<5=B5
if(!m_drop_button.CheckElementName(pressed_object))
return(false);
//--- K9B8, 5A;8 7=0G5=8O =5 A>2?040NB
if(id!=m_drop_button.Id() || index!=m_drop_button.Index())
return(false);
//--- 7<5=8BL A>AB>O=85 2848<>AB8 :0;5=40@O =0 ?@>B82>?>;>6=>5
ChangeComboBoxCalendarState();
//--- B?@028< A>>1I5=85 >1 MB><
::EventChartCustom(m_chart_id,ON_CLICK_COMBOBOX_BUTTON,CElementBase::Id(),0,"");
return(true);
}
//+------------------------------------------------------------------+
//| @>25@:0 =060B>9 ;52>9 :=>?:8 <KH8 =04 :=>?:>9 |
//+------------------------------------------------------------------+
void CDropCalendar::CheckPressedOverButton(void)
{
//--- K9B8, 5A;8 (1) ;520O :=>?:0 <KH8 8;8 (2) :=>?:0 2K7>20 :0;5=40@O >B60BK
if(!m_mouse.LeftButtonState() || !m_drop_button.IsPressed())
return;
//--- A;8 =5B D>:CA0 =0 M;5<5=B5
if(!CElementBase::MouseFocus())
{
//--- K9B8, 5A;8 D>:CA =0 :0;5=40@5
if(m_calendar.MouseFocus())
return;
//--- K9B8, 5A;8 ?>;>A0 ?@>:@CB:8 A?8A:0 <5AOF52 :0;5=40@O 2 459AB288
if(m_calendar.GetComboBoxPointer().GetScrollVPointer().State())
return;
//--- !:@KBL :0;5=40@L 8 A1@>A8BL F25B0 >1J5:B>2
m_calendar.Hide();
m_drop_button.IsPressed(false);
m_drop_button.Update(true);
//--- B?@028< A>>1I5=85 =0 >?@545;5=85 4>ABC?=KE M;5<5=B>2
::EventChartCustom(m_chart_id,ON_SET_AVAILABLE,CElementBase::Id(),1,"");
//--- 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,"");
}
}
//+------------------------------------------------------------------+
//| 8AC5B M;5<5=B |
//+------------------------------------------------------------------+
void CDropCalendar::Draw(void)
{
//--- 0@8A>20BL D>=
DrawBackground();
//--- 0@8A>20BL B5:AB
CElement::DrawText();
}
//+------------------------------------------------------------------+