//+------------------------------------------------------------------+ //| MBookPanel.mqh | //| Copyright 2015, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, MetaQuotes Software Corp." #property link "http://www.mql5.com" #include "Node.mqh" #include "Events\EventChartEndEdit.mqh" #define MORE 1 #define LESS -1 #define EQUAL 0 //+------------------------------------------------------------------+ //| Тип отношения между элементами ElChart | //+------------------------------------------------------------------+ enum ENUM_SORT_EL_TYPE { SORT_EL_BY_X_COORD, // Элементы отсортированы по значению X-координаты, от меньшего к большему SORT_EL_BY_Y_COORD, // Элементы отсортированы по значению Y-координаты, от меньшего к большему }; //+------------------------------------------------------------------+ //| Базовый элемент графического элемента панели. Включает | //| наиболее распространенные свойства элемента. | //+------------------------------------------------------------------+ class CElChart : public CNode { private: ENUM_OBJECT m_obj_type; // Графический тип, лежащий в основе элемента long m_x; // X-координата точки привязки long m_y; // Y-координата точки привязки long m_height; // Длина элемента в пикселях long m_width; // Ширина элемента в пикселях string m_text; // Текст или надпись на элементе int m_text_size; // Размер шрифта элемента color m_text_color; // Цвет шрифта надписи элемента string m_text_font; // Название шрифта надписи bool m_read_only; // Режим только чтения ENUM_ALIGN_MODE m_align; // Тип выравнивания для OBJ_EDIT color m_bground_color; // Цвет фона элемента color m_border_color; // Цвет рамки элемента ENUM_BORDER_TYPE m_border_type; // Тип рамки элемента ENUM_BASE_CORNER m_corner; // Тип привязки графического объекта protected: virtual void OnXCoordChange(void); virtual void OnYCoordChange(void); virtual void OnWidthChange(void); virtual void OnHeightChange(void); public: CElChart(ENUM_OBJECT obj_type); virtual void Show(); virtual void Event(CEvent *event); /* Set methods */ void Text(string text); void TextSize(int size); void TextFont(string font); void TextColor(color clr); void ReadOnly(bool read_only); void Align(ENUM_ALIGN_MODE align); void BackgroundColor(color clr); void BorderColor(color clr); void BorderType(ENUM_BORDER_TYPE type); void XCoord(long x); void YCoord(long y); void Width(long width); void Height(long height); void Corner(ENUM_BASE_CORNER corner); /* Get methods */ string Text(void); int TextSize(void); color TextColor(void); string TextFont(void); bool ReadOnly(void); ENUM_ALIGN_MODE Align(void); color BackgroundColor(void); color BorderColor(void); ENUM_BORDER_TYPE BorderType(void); long XCoord(void)const; long YCoord(void)const; long Width(void); long Height(void); ENUM_BASE_CORNER Corner(void); ENUM_OBJECT TypeElement(void); virtual int Compare(const CObject *node,const int mode=0) const ; }; //+------------------------------------------------------------------+ //| Конструктор по-умолчанию | //+------------------------------------------------------------------+ CElChart::CElChart(ENUM_OBJECT obj_type) { m_obj_type=obj_type; XCoord(20); YCoord(20); Height(20); Width(120); Text(""); TextFont("Arial"); TextColor(clrBlack); TextSize(10); ReadOnly(true); BorderColor(clrBlack); BackgroundColor(clrWhite); BorderType(BORDER_FLAT); Align(ALIGN_LEFT); } //+------------------------------------------------------------------+ //| Возвращает значение сортировки в зависимости от режима | //+------------------------------------------------------------------+ int CElChart::Compare(const CObject *node,const int mode=0) const { const CElChart* chart = node; switch(mode) { case SORT_EL_BY_X_COORD: if(m_x > chart.XCoord()) return MORE; else if(m_x < chart.XCoord()) return LESS; return EQUAL; case SORT_EL_BY_Y_COORD: if(m_y > chart.YCoord()) return MORE; else if(m_y < chart.YCoord()) return LESS; return EQUAL; //default SORT_EL_BY_X_COORD default: if(m_x > chart.XCoord()) return MORE; else if(m_x < chart.XCoord()) return LESS; return EQUAL; } return(EQUAL); } //+------------------------------------------------------------------+ //| Создает элемент на графике и конфигурирует его основные свойства:| //| Тип элемента - TypeElement; | //| Привязка по оси X = XCoord() | //| Привязка по оси X = YCoord() | //| Ширина = Height() | //| Высота = Width() | //| Размер шрифта = FontSize() | //+------------------------------------------------------------------+ void CElChart::Show(void) { if(m_obj_type != OBJ_BITMAP_LABEL) ObjectCreate(ChartID(),m_name,m_obj_type,0,0,0); else { OnShow(); return; } XCoord(XCoord()); YCoord(YCoord()); Height(Height()); Width(Width()); if(m_obj_type==OBJ_EDIT) Align(Align()); Text(Text()); TextColor(TextColor()); TextSize(TextSize()); TextFont(TextFont()); ReadOnly(ReadOnly()); Corner(Corner()); BorderType(BorderType()); if(BorderType()==BORDER_FLAT) BorderColor(BorderColor()); BackgroundColor(BackgroundColor()); OnShow(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CElChart::Event(CEvent *event) { CNode::Event(event); if(event.EventType()==EVENT_CHART_END_EDIT) { CEventChartEndEdit *endEdit=event; if(endEdit.ObjectName()==Name()) m_text=ObjectGetString(ChartID(),Name(),OBJPROP_TEXT); } } //+------------------------------------------------------------------+ //| Устанавливает привязку элемента по оси X | //+------------------------------------------------------------------+ void CElChart::XCoord(long x) { m_x=x; if(IsShowed()) ObjectSetInteger(ChartID(),m_name,OBJPROP_XDISTANCE,m_x); OnXCoordChange(); } //+------------------------------------------------------------------+ //| Возвращает привязку элемента по оси X | //+------------------------------------------------------------------+ long CElChart::XCoord(void)const { return m_x; } //+------------------------------------------------------------------+ //| Устанавливает привязку элемента по оси Y | //+------------------------------------------------------------------+ void CElChart::YCoord(long y) { m_y=y; if(IsShowed()) ObjectSetInteger(ChartID(),m_name,OBJPROP_YDISTANCE,m_y); OnYCoordChange(); } //+------------------------------------------------------------------+ //| Возвращает привязку элемента по оси Y | //+------------------------------------------------------------------+ long CElChart::YCoord(void)const { return m_y; } //+------------------------------------------------------------------+ //| Устанавливает ширину элемента в пикселях | //+------------------------------------------------------------------+ void CElChart::Width(long width) { m_width=width; if(IsShowed()) ObjectSetInteger(ChartID(),m_name,OBJPROP_XSIZE,m_width); OnWidthChange(); } //+------------------------------------------------------------------+ //| Возвращает высоту элемента в пикселях | //+------------------------------------------------------------------+ long CElChart::Width(void) { return m_width; } //+------------------------------------------------------------------+ //| Устанавливает ширину элемента в пикселях | //+------------------------------------------------------------------+ void CElChart::Height(long height) { m_height=height; if(IsShowed()) ObjectSetInteger(ChartID(),m_name,OBJPROP_YSIZE,m_height); OnHeightChange(); } //+------------------------------------------------------------------+ //| Возвращает ширину элемента в пикселях | //+------------------------------------------------------------------+ long CElChart::Height(void) { return m_height; } //+------------------------------------------------------------------+ //| Устанавливает текст элемента | //+------------------------------------------------------------------+ void CElChart::Text(string text) { m_text=text; if(IsShowed()) { ObjectSetString(ChartID(),m_name,OBJPROP_TEXT,m_text); //ObjectSetString(ChartID(),m_name,OBJPROP_,m_text); } } //+------------------------------------------------------------------+ //| Возвращает текст элемента | //+------------------------------------------------------------------+ string CElChart::Text(void) { //if(IsShowed()) // m_text = ObjectGetString(ChartID(),m_name,OBJPROP_TEXT); return m_text; } //+------------------------------------------------------------------+ //| Устанавливает размер шрифта надписи элемента | //+------------------------------------------------------------------+ void CElChart::TextSize(int text_size) { m_text_size=text_size; if(IsShowed()) ObjectSetInteger(ChartID(),m_name,OBJPROP_FONTSIZE,m_text_size); } //+------------------------------------------------------------------+ //| Возвращает размер шрифта надписи элемента | //+------------------------------------------------------------------+ int CElChart::TextSize(void) { return m_text_size; } //+------------------------------------------------------------------+ //| Устанавливает цвет надписи элемента | //+------------------------------------------------------------------+ void CElChart::TextColor(color clr) { m_text_color=clr; if(IsShowed()) ObjectSetInteger(ChartID(),m_name,OBJPROP_COLOR,m_text_color); } //+------------------------------------------------------------------+ //| Возвращает цвет надписи элемента | //+------------------------------------------------------------------+ color CElChart::TextColor(void) { return m_text_color; } //+------------------------------------------------------------------+ //| Устанавливает текст элемента | //+------------------------------------------------------------------+ void CElChart::TextFont(string text_font) { m_text_font=text_font; if(IsShowed()) ObjectSetString(ChartID(),m_name,OBJPROP_FONT,m_text_font); } //+------------------------------------------------------------------+ //| Возвращает название шрифта. | //+------------------------------------------------------------------+ string CElChart::TextFont(void) { return m_text_font; } //+------------------------------------------------------------------+ //| Устанавливает цвет фона элемента | //+------------------------------------------------------------------+ void CElChart::BackgroundColor(color clr) { m_bground_color=clr; if(IsShowed()) ObjectSetInteger(ChartID(),m_name,OBJPROP_BGCOLOR,m_bground_color); } //+------------------------------------------------------------------+ //| Возвращает цвет фона элемента | //+------------------------------------------------------------------+ color CElChart::BackgroundColor(void) { return m_bground_color; } //+------------------------------------------------------------------+ //| Устанавливает цвет рамки элемента | //+------------------------------------------------------------------+ void CElChart::BorderColor(color clr) { m_border_color=clr; if(IsShowed()) ObjectSetInteger(ChartID(),m_name,OBJPROP_BORDER_COLOR,m_border_color); } //+------------------------------------------------------------------+ //| Возвращает цвет рамки элемента | //+------------------------------------------------------------------+ color CElChart::BorderColor(void) { return m_border_color; } //+------------------------------------------------------------------+ //| Устанавливает тип рамки элемента | //+------------------------------------------------------------------+ void CElChart::BorderType(ENUM_BORDER_TYPE type) { m_border_type=type; if(IsShowed()) ObjectSetInteger(ChartID(),m_name,OBJPROP_BORDER_TYPE,m_border_type); } //+------------------------------------------------------------------+ //| Возвращает тип рамки элемента | //+------------------------------------------------------------------+ ENUM_BORDER_TYPE CElChart::BorderType(void) { return m_border_type; } //+------------------------------------------------------------------+ //| Устанавливает или снимает режим только чтение | //+------------------------------------------------------------------+ void CElChart::ReadOnly(bool read_only) { if(m_obj_type==OBJ_EDIT) { m_read_only=read_only; if(IsShowed()) ObjectSetInteger(ChartID(),m_name,OBJPROP_READONLY,m_read_only); } } //+------------------------------------------------------------------+ //| Возвращает угол привязки графического объекта | //+------------------------------------------------------------------+ ENUM_BASE_CORNER CElChart::Corner(void) { return m_corner; } //+------------------------------------------------------------------+ //| Устанавливает угол привязки графического объекта | //+------------------------------------------------------------------+ void CElChart::Corner(ENUM_BASE_CORNER corner) { m_corner=corner; if(IsShowed()) ObjectSetInteger(ChartID(),m_name,OBJPROP_CORNER,corner); for(int i=0; i