//+------------------------------------------------------------------+ //| Window.mqh | //| Copyright 2015, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ // #include "Element.mqh" #include #include #include #include //--- Indents for buttons from the right edge of the window #define CLOSE_BUTTON_OFFSET (20) #define ROLL_BUTTON_OFFSET (36) #define TOOLTIP_BUTTON_OFFSET (53) //+------------------------------------------------------------------+ //| Class for creating a form for controls | //+------------------------------------------------------------------+ class CWindow { private: CChart m_chart; //--- Objects for creating a form CChartObjectRectLabel m_bg; CChartObjectRectLabel m_caption_bg; CChartObjectBmpLabel m_icon; CChartObjectLabel m_label; CChartObjectBmpLabel m_button_tooltip; CChartObjectBmpLabel m_button_unroll; CChartObjectBmpLabel m_button_rollup; CChartObjectBmpLabel m_button_close; //--- Identifier of the last control int m_last_id; //--- Possibility to move a window on the chart bool m_movable; //--- Status of a minimized window bool m_is_minimized; //--- Window type ENUM_WINDOW_TYPE m_window_type; //--- Mode of a set height of the sub-window (for indicators) bool m_height_subwindow_mode; //--- Mode of minimizing the form in the indicator sub-window bool m_rollup_subwindow_mode; //--- Height of the indicator sub-window int m_subwindow_height; //--- Properties of the background int m_bg_zorder; color m_bg_color; int m_bg_full_height; //--- Properties of the header int m_caption_zorder; string m_caption_text; int m_caption_height; color m_caption_bg_color; color m_caption_bg_color_hover; color m_caption_bg_color_off; color m_caption_color_bg_array[]; //--- Properties of buttons int m_button_zorder; //--- Color of the form frame (background, header) color m_border_color; //--- Form label string m_icon_file; //--- Presence of the button for the mode of displaying tooltips bool m_tooltips_button; //--- Chart sizes int m_chart_width; int m_chart_height; //--- For identifying the boundaries of the capture area in the window header int m_right_limit; //--- Variables, connected with the displacement int m_prev_x; // Fixed point when clicking int m_prev_y; // Fixed point when clicking int m_size_fixing_x; // Distance from the X scroll to the fixed point int m_size_fixing_y; // Distance from the Y scroll to the fixed point //--- State of the mouse button considering the place where it was clicked ENUM_WMOUSE_STATE m_clamping_area_mouse; //--- public: CWindow(); ~CWindow(); //--- Methods for creating a window bool CreateWindow(const long chart_id,const int window,const string caption_text,const int x,const int y); //--- private: bool CreateBackground(void); bool CreateCaption(void); bool CreateIcon(void); bool CreateLabel(void); bool CreateButtonClose(void); bool CreateButtonRollUp(void); bool CreateButtonUnroll(void); bool CreateButtonTooltip(void); //--- Changing the color of the form objects void ChangeObjectsColor(void); public: //--- Methods for storing and obtaining the id of the last created control void LastId(const int id) { m_last_id=id; } int LastId(void) const { return(m_last_id); } //--- Window type ENUM_WINDOW_TYPE WindowType(void) const { return(m_window_type); } void WindowType(const ENUM_WINDOW_TYPE flag) { m_window_type=flag; } //--- Default label string DefaultIcon(void); //--- (1) custom label of the window, (2) use button for reference, (3) limitation of the capture area of the header void IconFile(const string file_path) { m_icon_file=file_path; } void UseTooltipsButton(void) { m_tooltips_button=true; } void RightLimit(const int value) { m_right_limit=value; } //--- Possibility of moving the window bool Movable(void) const { return(m_movable); } void Movable(const bool flag) { m_movable=flag; } //--- Status of a minimized window bool IsMinimized(void) const { return(m_is_minimized); } void IsMinimized(const bool flag) { m_is_minimized=flag; } //--- Properties of the header void CaptionText(const string text); string CaptionText(void) const { return(m_caption_text); } void CaptionHeight(const int height) { m_caption_height=height; } int CaptionHeight(void) const { return(m_caption_height); } void CaptionBgColor(const color clr) { m_caption_bg_color=clr; } color CaptionBgColor(void) const { return(m_caption_bg_color); } void CaptionBgColorHover(const color clr) { m_caption_bg_color_hover=clr; } color CaptionBgColorHover(void) const { return(m_caption_bg_color_hover); } void CaptionBgColorOff(const color clr) { m_caption_bg_color_off=clr; } //--- Window properties void WindowBgColor(const color clr) { m_bg_color=clr; } color WindowBgColor(void) { return(m_bg_color); } void WindowBorderColor(const color clr) { m_border_color=clr; } color WindowBorderColor(void) { return(m_border_color); } //--- Mode of minimizing the indicator sub-window void RollUpSubwindowMode(const bool flag,const bool height_mode); //--- Managing sizes void ChangeWindowWidth(const int width); void ChangeSubwindowHeight(const int height); //--- Obtaining the chart sizes void SetWindowProperties(void); //--- Conversion of the Y coordinate into a relative one int YToRelative(const int y); //--- Checking the cursor in the area of the header bool CursorInsideCaption(const int x,const int y); //--- Zeroing variables void ZeroPanelVariables(void); //--- Verifying the state of the left button of the mouse void CheckMouseButtonState(const int x,const int y,const string state); //--- Verifying the mouse focus void CheckMouseFocus(const int x,const int y,const int subwin); //--- Setting the chart mode void SetChartState(const int subwindow_number); //--- Updating the form coordinates void UpdateWindowXY(const int x,const int y); //--- Closing the window bool CloseWindow(const string pressed_object); //--- Changing the window state bool ChangeWindowState(const string pressed_object); //--- Methods for (1) minimizing and (2) maximizing the window void RollUp(void); void Unroll(void); //--- public: //--- Chart event handler virtual void OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam); //--- Timer virtual void OnEventTimer(void); //--- Moving the control virtual void Moving(const int x,const int y); //--- Displaying, hiding, resetting, deleting virtual void Show(void); virtual void Hide(void); virtual void Reset(void); virtual void Delete(void); //--- Setting, resetting priorities for the left mouse click virtual void SetZorders(void); virtual void ResetZorders(void); }; //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CWindow::CWindow(void) : m_last_id(0), m_subwindow_height(0), m_rollup_subwindow_mode(false), m_height_subwindow_mode(false), m_movable(false), m_is_minimized(false), m_tooltips_button(false), m_window_type(W_MAIN), m_icon_file(""), m_right_limit(0), m_clamping_area_mouse(NOT_PRESSED), m_caption_height(20), m_caption_bg_color(C'88,157,255'), m_caption_bg_color_off(clrSilver), m_caption_bg_color_hover(C'118,177,255'), m_bg_color(C'15,15,15'), m_border_color(clrLightGray) { //--- Store the name of the control class in the base class //--- Set a strict sequence of priorities m_bg_zorder =0; m_caption_zorder =1; m_button_zorder =2; //--- Obtain the ID of the current chart m_chart.Attach(); //--- Obtain the sizes of the chart window SetWindowProperties(); } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CWindow::~CWindow() { m_chart.Detach(); } //+------------------------------------------------------------------+ //| Chart event handler | //+------------------------------------------------------------------+ void CWindow::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam) { //--- Handling events of the cursor movements if(id==CHARTEVENT_MOUSE_MOVE) { int x =(int)lparam; // Coordinate of the X-axis int y =(int)dparam; // Coordinate of the Y-axis int subwin =WRONG_VALUE; // Window number, in which the cursor is located datetime time =NULL; // Time corresponding to the X coordinate double level =0.0; // Level (price) corresponding to the Y coordinate int rel_y =0; // For estimation of the relative Y coordinate //--- Obtain the location of the cursor if(!::ChartXYToTimePrice(m_chart_id,x,y,subwin,time,level)) return; //--- Obtain the relative Y coordinate rel_y=YToRelative(y); //--- Verify and store the state of the mouse button CheckMouseButtonState(x,rel_y,sparam); //--- Verifying the mouse focus CheckMouseFocus(x,rel_y,subwin); //--- Set the state of the chart SetChartState(subwin); //--- If the management is delegated to the window, identify its location if(m_clamping_area_mouse==PRESSED_INSIDE_HEADER) { //--- Updating window coordinates UpdateWindowXY(x,rel_y); } //--- return; } //--- Handling event of clicking on the object if(id==CHARTEVENT_OBJECT_CLICK) { //--- Close window CloseWindow(sparam); //--- Minimize/Maximize window ChangeWindowState(sparam); return; } //--- Event of changing the chart properties if(id==CHARTEVENT_CHART_CHANGE) { //--- If the button is released if(m_clamping_area_mouse==NOT_PRESSED) { //--- Obtain the sizes of the chart window SetWindowProperties(); //--- Adjustment of coordinates UpdateWindowXY(m_x,m_y); } return; } } //+------------------------------------------------------------------+ //| Timer | //+------------------------------------------------------------------+ void CWindow::OnEventTimer(void) { //--- Changing the color of the form objects ChangeObjectsColor(); } //+------------------------------------------------------------------+ //| Creates a form for controls | //+------------------------------------------------------------------+ bool CWindow::CreateWindow(const long chart_id,const int subwin,const string caption_text,const int x,const int y) { //--- Initialization of variables m_chart_id =chart_id; m_subwin =subwin; m_caption_text =caption_text; m_x =x; m_y =y; m_bg_full_height =m_y_size; //--- Creating all objects of the window if(!CreateBackground()) return(false); if(!CreateCaption()) return(false); if(!CreateLabel()) return(false); if(!CreateIcon()) return(false); if(!CreateButtonClose()) return(false); if(!CreateButtonRollUp()) return(false); if(!CreateButtonUnroll()) return(false); if(!CreateButtonTooltip()) return(false); //--- If this program is an indicator if(CElement::ProgramType()==PROGRAM_INDICATOR) { //--- If the mode of a set height of the sub-window is set if(m_height_subwindow_mode) { m_subwindow_height=m_bg_full_height+3; ChangeSubwindowHeight(m_subwindow_height); } } //--- Hide the window, if it is a dialog window if(m_window_type==W_DIALOG) Hide(); //--- return(true); } //+------------------------------------------------------------------+ //| Creates the window background | //+------------------------------------------------------------------+ bool CWindow::CreateBackground(void) { //--- Formation of the object name string name=CElement::ProgramName()+"_window_bg_"+(string)CElement::Id(); //--- Size of the window depends of its state (minimized/maximized) int y_size=0; if(m_is_minimized) { y_size=m_caption_height; CElement::YSize(m_caption_height); } else { y_size=m_bg_full_height; CElement::YSize(m_bg_full_height); } //--- Set the window background if(!m_bg.Create(m_chart_id,name,m_subwin,m_x,m_y,m_x_size,y_size)) return(false); //--- Set properties m_bg.BackColor(m_bg_color); m_bg.Color(m_border_color); m_bg.BorderType(BORDER_FLAT); m_bg.Corner(m_corner); m_bg.Selectable(false); m_bg.Z_Order(m_bg_zorder); m_bg.Tooltip("\n"); //--- Store the object pointer CElement::AddToArray(m_bg); return(true); } //+------------------------------------------------------------------+ //| Creates the window header | //+------------------------------------------------------------------+ bool CWindow::CreateCaption(void) { //--- Formation of the object name string name=CElement::ProgramName()+"_window_caption_"+(string)CElement::Id(); //--- Set the window header if(!m_caption_bg.Create(m_chart_id,name,m_subwin,m_x,m_y,m_x_size,m_caption_height)) return(false); //--- Set properties m_caption_bg.BackColor(m_caption_bg_color); m_caption_bg.Color(m_border_color); m_caption_bg.BorderType(BORDER_FLAT); m_caption_bg.Corner(m_corner); m_caption_bg.Selectable(false); m_caption_bg.Z_Order(m_caption_zorder); m_caption_bg.Tooltip("\n"); //--- Store coordinates m_caption_bg.X(m_x); m_caption_bg.Y(m_y); //--- Store sizes (in object) m_caption_bg.XSize(m_caption_bg.X_Size()); m_caption_bg.YSize(m_caption_bg.Y_Size()); //--- Initializing the array gradient CElement::InitColorArray(m_caption_bg_color,m_caption_bg_color_hover,m_caption_color_bg_array); //--- Store the object pointer CElement::AddToArray(m_caption_bg); return(true); } //+------------------------------------------------------------------+ //| Creates the program label | //+------------------------------------------------------------------+ //--- Icons (by default) symbolizing the program type #resource "\\Images\\EasyAndFastGUI\\Icons\\bmp16\\advisor.bmp" #resource "\\Images\\EasyAndFastGUI\\Icons\\bmp16\\indicator.bmp" #resource "\\Images\\EasyAndFastGUI\\Icons\\bmp16\\script.bmp" //--- bool CWindow::CreateIcon(void) { string name=CElement::ProgramName()+"_window_icon_"+(string)CElement::Id(); //--- Object coordinates int x=m_x+5; int y=m_y+2; //--- Set the window label if(!m_icon.Create(m_chart_id,name,m_subwin,x,y)) return(false); //--- Default label, if not specified by the user if(m_icon_file=="") m_icon_file=DefaultIcon(); //--- Set properties m_icon.BmpFileOn("::"+m_icon_file); m_icon.BmpFileOff("::"+m_icon_file); m_icon.Corner(m_corner); m_icon.Selectable(false); m_icon.Z_Order(m_button_zorder); m_icon.Tooltip("\n"); //--- Store coordinates m_icon.X(x); m_icon.Y(y); //--- Indents from the edge point m_icon.XGap(x-m_x); m_icon.YGap(y-m_y); //--- Store the sizes m_icon.XSize(m_icon.X_Size()); m_icon.YSize(m_icon.Y_Size()); //--- Store the object pointer CElement::AddToArray(m_icon); return(true); } //+------------------------------------------------------------------+ //| Creates the text label of the header | //+------------------------------------------------------------------+ bool CWindow::CreateLabel(void) { string name=CElement::ProgramName()+"_window_label_"+(string)CElement::Id(); //--- Object coordinates int x=m_x+24; int y=m_y+4; //--- Set the window label if(!m_label.Create(m_chart_id,name,m_subwin,x,y)) return(false); //--- Set properties m_label.Description(m_caption_text); m_label.Font(FONT); m_label.FontSize(FONT_SIZE); m_label.Color(clrBlack); m_label.Corner(m_corner); m_label.Selectable(false); m_label.Z_Order(m_button_zorder); m_label.Tooltip("\n"); //--- Store coordinates m_label.X(x); m_label.Y(y); //--- Indents from the edge point m_label.XGap(x-m_x); m_label.YGap(y-m_y); //--- Store the sizes m_label.XSize(m_label.X_Size()); m_label.YSize(m_label.Y_Size()); //--- Store the object pointer CElement::AddToArray(m_label); return(true); } //+------------------------------------------------------------------+ //| Creates the button for closing the program | //+------------------------------------------------------------------+ #resource "\\Images\\EasyAndFastGUI\\Controls\\Close_red.bmp" #resource "\\Images\\EasyAndFastGUI\\Controls\\Close_black.bmp" //--- bool CWindow::CreateButtonClose(void) { //--- If the program type is "script", leave if(CElement::ProgramType()==PROGRAM_SCRIPT) return(true); //--- Formation of the object name string name=CElement::ProgramName()+"_window_close_"+(string)CElement::Id(); //--- Object coordinates int x=m_x+m_x_size-CLOSE_BUTTON_OFFSET; int y=m_y+2; //--- Increase the capture area m_right_limit+=20; //--- Set a button if(!m_button_close.Create(m_chart_id,name,m_subwin,x,y)) return(false); //--- Set properties m_button_close.BmpFileOn("::Images\\EasyAndFastGUI\\Controls\\Close_red.bmp"); m_button_close.BmpFileOff("::Images\\EasyAndFastGUI\\Controls\\Close_black.bmp"); m_button_close.Corner(m_corner); m_button_close.Selectable(false); m_button_close.Z_Order(m_button_zorder); m_button_close.Tooltip("Close"); //--- Store coordinates m_button_close.X(x); m_button_close.Y(y); //--- Indents from the edge point m_button_close.XGap(x-m_x); m_button_close.YGap(y-m_y); //--- Store the sizes m_button_close.XSize(m_button_close.X_Size()); m_button_close.YSize(m_button_close.Y_Size()); //--- Store the object pointer CElement::AddToArray(m_button_close); return(true); } //+------------------------------------------------------------------+ //| Creates the button for minimizing the window | //+------------------------------------------------------------------+ #resource "\\Images\\EasyAndFastGUI\\Controls\\DropOn_black.bmp" #resource "\\Images\\EasyAndFastGUI\\Controls\\DropOn_white.bmp" //--- bool CWindow::CreateButtonRollUp(void) { //--- If the program type is "script", leave if(CElement::ProgramType()==PROGRAM_SCRIPT) return(true); //--- This button is not required, if the window is a dialog window if(m_window_type==W_DIALOG) return(true); //--- Formation of the object name string name=CElement::ProgramName()+"_window_rollup_"+(string)CElement::Id(); //--- Object coordinates int x=m_x+m_x_size-ROLL_BUTTON_OFFSET; int y=m_y+3; //--- Increase the capture area, if the window is maximized if(!m_is_minimized) m_right_limit+=20; //--- Set a button if(!m_button_rollup.Create(m_chart_id,name,m_subwin,x,y)) return(false); //--- Set properties m_button_rollup.BmpFileOn("::Images\\EasyAndFastGUI\\Controls\\DropOn_white.bmp"); m_button_rollup.BmpFileOff("::Images\\EasyAndFastGUI\\Controls\\DropOn_black.bmp"); m_button_rollup.Corner(m_corner); m_button_rollup.Selectable(false); m_button_rollup.Z_Order(m_button_zorder); m_button_rollup.Tooltip("Roll Up"); //--- Store coordinates m_button_rollup.X(x); m_button_rollup.Y(y); //--- Indents from the edge point m_button_rollup.XGap(x-m_x); m_button_rollup.YGap(y-m_y); //--- Store sizes (in object) m_button_rollup.XSize(m_button_rollup.X_Size()); m_button_rollup.YSize(m_button_rollup.Y_Size()); //--- Hide the object if(m_is_minimized) m_button_rollup.Timeframes(OBJ_NO_PERIODS); //--- Add objects to the group array CElement::AddToArray(m_button_rollup); return(true); } //+------------------------------------------------------------------+ //| Creates the button for maximizing window | //+------------------------------------------------------------------+ #resource "\\Images\\EasyAndFastGUI\\Controls\\DropOff_black.bmp" #resource "\\Images\\EasyAndFastGUI\\Controls\\DropOff_white.bmp" //--- bool CWindow::CreateButtonUnroll(void) { //--- If the program type is "script", leave if(PROGRAM_TYPE==PROGRAM_SCRIPT) return(true); //--- This button is not required, if the window is a dialog window if(m_window_type==W_DIALOG) return(true); //--- Formation of the object name string name=CElement::ProgramName()+"_window_unroll_"+(string)CElement::Id(); //--- Object coordinates int x=m_x+m_x_size-ROLL_BUTTON_OFFSET; int y=m_y+3; //--- Increase capture area, if the window is minimized if(m_is_minimized) m_right_limit+=20; //--- Set a button if(!m_button_unroll.Create(m_chart_id,name,m_subwin,x,y)) return(false); //--- Set properties m_button_unroll.BmpFileOn("::Images\\EasyAndFastGUI\\Controls\\DropOff_white.bmp"); m_button_unroll.BmpFileOff("::Images\\EasyAndFastGUI\\Controls\\DropOff_black.bmp"); m_button_unroll.Corner(m_corner); m_button_unroll.Selectable(false); m_button_unroll.Z_Order(m_button_zorder); m_button_unroll.Tooltip("Unroll"); //--- Store coordinates m_button_unroll.X(x); m_button_unroll.Y(y); //--- Indents from the edge point m_button_unroll.XGap(x-m_x); m_button_unroll.YGap(y-m_y); //--- Store sizes (in object) m_button_unroll.XSize(m_button_unroll.X_Size()); m_button_unroll.YSize(m_button_unroll.Y_Size()); //--- Add objects to the group array CElement::AddToArray(m_button_unroll); //--- Hide the object if(!m_is_minimized) m_button_unroll.Timeframes(OBJ_NO_PERIODS); //--- return(true); } //+------------------------------------------------------------------+ //| Creates the tooltip button | //+------------------------------------------------------------------+ #resource "\\Images\\EasyAndFastGUI\\Controls\\Help_dark.bmp" #resource "\\Images\\EasyAndFastGUI\\Controls\\Help_light.bmp" //--- bool CWindow::CreateButtonTooltip(void) { //--- If the program type is "script", leave if(PROGRAM_TYPE==PROGRAM_SCRIPT) return(true); //--- This button is not required, if the window is a dialog window if(m_window_type==W_DIALOG) return(true); //--- Leave, if this button is not required if(!m_tooltips_button) return(true); //--- Formation of the object name string name=CElement::ProgramName()+"_window_tooltip_"+(string)CElement::Id(); //--- Object coordinates int x=m_x+m_x_size-TOOLTIP_BUTTON_OFFSET; int y=m_y+2; //--- Increase the capture area m_right_limit+=20; //--- Set a button if(!m_button_tooltip.Create(m_chart_id,name,m_subwin,x,y)) return(false); //--- Set properties m_button_tooltip.BmpFileOn("::Images\\EasyAndFastGUI\\Controls\\Help_light.bmp"); m_button_tooltip.BmpFileOff("::Images\\EasyAndFastGUI\\Controls\\Help_dark.bmp"); m_button_tooltip.Corner(m_corner); m_button_tooltip.Selectable(false); m_button_tooltip.Z_Order(m_button_zorder); m_button_tooltip.Tooltip("Tooltips"); //--- Store coordinates m_button_tooltip.X(x); m_button_tooltip.Y(y); //--- Indents from the edge point m_button_tooltip.XGap(x-m_x); m_button_tooltip.YGap(y-m_y); //--- Store sizes (in object) m_button_tooltip.XSize(m_button_tooltip.X_Size()); m_button_tooltip.YSize(m_button_tooltip.Y_Size()); //--- Add objects to the group array CElement::AddToArray(m_button_tooltip); return(true); } //+------------------------------------------------------------------+ //| Edits the header text | //+------------------------------------------------------------------+ void CWindow::CaptionText(const string text) { m_caption_text=text; m_label.Description(text); } //+------------------------------------------------------------------+ //| Identifying the default label | //+------------------------------------------------------------------+ string CWindow::DefaultIcon(void) { string path="Images\\EasyAndFastGUI\\Icons\\bmp16\\advisor.bmp"; //--- switch(CElement::ProgramType()) { case PROGRAM_SCRIPT: { path="Images\\EasyAndFastGUI\\Icons\\bmp16\\script.bmp"; break; } case PROGRAM_EXPERT: { path="Images\\EasyAndFastGUI\\Icons\\bmp16\\advisor.bmp"; break; } case PROGRAM_INDICATOR: { path="Images\\EasyAndFastGUI\\Icons\\bmp16\\indicator.bmp"; break; } } //--- return(path); } //+------------------------------------------------------------------+ //| Mode of minimizing the indicator sub-window | //+------------------------------------------------------------------+ void CWindow::RollUpSubwindowMode(const bool rollup_mode=false,const bool height_mode=false) { if(CElement::m_program_type!=PROGRAM_INDICATOR) return; //--- m_rollup_subwindow_mode =rollup_mode; m_height_subwindow_mode =height_mode; //--- if(m_height_subwindow_mode) ChangeSubwindowHeight(m_subwindow_height); } //+------------------------------------------------------------------+ //| Changes the height of the indicator sub-window | //+------------------------------------------------------------------+ void CWindow::ChangeSubwindowHeight(const int height) { if(CElement::m_subwin<=0 || CElement::m_program_type!=PROGRAM_INDICATOR) return; //--- if(height>0) ::IndicatorSetInteger(INDICATOR_HEIGHT,height); } //+------------------------------------------------------------------+ //| Changes the width of the window | //+------------------------------------------------------------------+ void CWindow::ChangeWindowWidth(const int width) { //--- If the width has not changed, leave if(width==m_bg.XSize()) return; //--- Update the width for the background and the header CElement::XSize(width); m_bg.XSize(width); m_bg.X_Size(width); m_caption_bg.XSize(width); m_caption_bg.X_Size(width); //--- Update coordinates and indents for all buttons: //--- Closing button int x=CElement::X2()-CLOSE_BUTTON_OFFSET; m_button_close.X(x); m_button_close.XGap(x-m_x); m_button_close.X_Distance(x); //--- Maximizing button x=CElement::X2()-ROLL_BUTTON_OFFSET; m_button_unroll.X(x); m_button_unroll.XGap(x-m_x); m_button_unroll.X_Distance(x); //--- Minimizing button m_button_rollup.X(x); m_button_rollup.XGap(x-m_x); m_button_rollup.X_Distance(x); //--- Tooltip button (if enabled) if(m_tooltips_button) { x=CElement::X2()-TOOLTIP_BUTTON_OFFSET; m_button_tooltip.X(x); m_button_tooltip.XGap(x-m_x); m_button_tooltip.X_Distance(x); } } //+------------------------------------------------------------------+ //| Obtaining chart sizes | //+------------------------------------------------------------------+ void CWindow::SetWindowProperties(void) { //--- Obtain width and height of the chart window m_chart_width =m_chart.WidthInPixels(); m_chart_height =m_chart.HeightInPixels(m_subwin); } //+------------------------------------------------------------------+ //| Converts the Y coordinate into a relative one | //+------------------------------------------------------------------+ int CWindow::YToRelative(const int y) { //--- Obtain the distance from the top of the chart to the indicator sub-window int chart_y_distance=m_chart.SubwindowY(m_subwin); //--- Convert the Y coordinate into a relative one return(y-chart_y_distance); } //+------------------------------------------------------------------+ //| Verifying the location of cursor in the area of title sub-window | //+------------------------------------------------------------------+ bool CWindow::CursorInsideCaption(const int x,const int y) { return(x>m_x && xm_y && ym_x && xm_y && ym_button_close.X() && xm_button_close.Y() && ym_button_rollup.X() && xm_button_rollup.Y() && ym_button_unroll.X() && xm_button_unroll.Y() && y=0 && limit_right=0) { new_y_point =y+m_size_fixing_y; new_x_point =x+m_size_fixing_x; } //--- If the boundaries of the chart were exceeded else { if(limit_bottom>m_chart_height) // > downwards { new_y_point =m_chart_height-m_caption_height; new_x_point =x+m_size_fixing_x; } if(limit_top<0) // > upwards { new_y_point =0; new_x_point =x+m_size_fixing_x; } if(limit_right>m_chart_width) // > right { new_x_point =m_chart_width-m_x_size; new_y_point =y+m_size_fixing_y; } if(limit_left<0) // > left { new_x_point =0; new_y_point =y+m_size_fixing_y; } } //--- Update coordinates, if there was a displacement if(new_x_point>0 || new_y_point>0) { //--- Update the coordinates of the form m_x =(new_x_point<=0)? 1 : new_x_point; m_y =(new_y_point<=0)? 1 : new_y_point; //--- if(new_x_point>0) m_x=(m_x>m_chart_width-m_x_size-1) ? m_chart_width-m_x_size-1 : m_x; if(new_y_point>0) m_y=(m_y>m_chart_height-m_caption_height-1) ? m_chart_height-m_caption_height-2 : m_y; //--- Zero the fixed points m_prev_x=0; m_prev_y=0; } } //+------------------------------------------------------------------+ //| Displacement of the window | //+------------------------------------------------------------------+ void CWindow::Moving(const int x,const int y) { //--- Storing coordinates in variables m_bg.X(x); m_bg.Y(y); m_caption_bg.X(x); m_caption_bg.Y(y); m_icon.X(x+m_icon.XGap()); m_icon.Y(y+m_icon.YGap()); m_label.X(x+m_label.XGap()); m_label.Y(y+m_label.YGap()); m_button_close.X(x+m_button_close.XGap()); m_button_close.Y(y+m_button_close.YGap()); m_button_unroll.X(x+m_button_unroll.XGap()); m_button_unroll.Y(y+m_button_unroll.YGap()); m_button_rollup.X(x+m_button_rollup.XGap()); m_button_rollup.Y(y+m_button_rollup.YGap()); m_button_tooltip.X(x+m_button_tooltip.XGap()); m_button_tooltip.Y(y+m_button_tooltip.YGap()); //--- Updating coordinates of graphical objects m_bg.X_Distance(m_bg.X()); m_bg.Y_Distance(m_bg.Y()); m_caption_bg.X_Distance(m_caption_bg.X()); m_caption_bg.Y_Distance(m_caption_bg.Y()); m_icon.X_Distance(m_icon.X()); m_icon.Y_Distance(m_icon.Y()); m_label.X_Distance(m_label.X()); m_label.Y_Distance(m_label.Y()); m_button_close.X_Distance(m_button_close.X()); m_button_close.Y_Distance(m_button_close.Y()); m_button_unroll.X_Distance(m_button_unroll.X()); m_button_unroll.Y_Distance(m_button_unroll.Y()); m_button_rollup.X_Distance(m_button_rollup.X()); m_button_rollup.Y_Distance(m_button_rollup.Y()); m_button_tooltip.X_Distance(m_button_tooltip.X()); m_button_tooltip.Y_Distance(m_button_tooltip.Y()); } //+------------------------------------------------------------------+ //| Deleting | //+------------------------------------------------------------------+ void CWindow::Delete(void) { //--- Zeroing variables m_right_limit=0; //--- Deleting objects m_bg.Delete(); m_caption_bg.Delete(); m_icon.Delete(); m_label.Delete(); m_button_close.Delete(); m_button_rollup.Delete(); m_button_unroll.Delete(); m_button_tooltip.Delete(); //--- Emptying the object array CElement::FreeObjectsArray(); //--- Zeroing the focus of the control CElement::MouseFocus(false); } //+------------------------------------------------------------------+ //| Changing of object color when hovering the cursor over it | //+------------------------------------------------------------------+ void CWindow::ChangeObjectsColor(void) { //--- Changing icons in the buttons m_button_close.State(m_button_close.MouseFocus()); m_button_rollup.State(m_button_rollup.MouseFocus()); m_button_unroll.State(m_button_unroll.MouseFocus()); //--- Changing the color in the header CElement::ChangeObjectColor(m_caption_bg.Name(),CElement::MouseFocus(),OBJPROP_BGCOLOR, m_caption_bg_color,m_caption_bg_color_hover,m_caption_color_bg_array); } //+------------------------------------------------------------------+ //| Hides window | //+------------------------------------------------------------------+ void CWindow::Hide(void) { //--- Hide all objects for(int i=0; i The program was deleted from the chart by your decision!"); //--- Deleting Expert from the chart ::ExpertRemove(); return(true); } } //--- If the program is of the "Indicator" type else if(CElement::ProgramType()==PROGRAM_INDICATOR) { //--- Deleting indicator from the chart if(::ChartIndicatorDelete(m_chart_id,m_subwin,CElement::ProgramName())) { ::Print(__FUNCTION__," > The program was deleted from the chart by your decision!"); return(true); } } } //--- If this is a dialog window else if(m_window_type==W_DIALOG) { } //--- return(false); } //+------------------------------------------------------------------+ //| Check for the event of minimizing/maximizing the window | //+------------------------------------------------------------------+ bool CWindow::ChangeWindowState(const string pressed_object) { //--- If the button "Minimize the window" was pressed if(pressed_object==m_button_rollup.Name()) { RollUp(); return(true); } //--- If the button "Maximize the window" was pressed if(pressed_object==m_button_unroll.Name()) { Unroll(); return(true); } //--- return(false); } //+------------------------------------------------------------------+ //| Minimizes the window | //+------------------------------------------------------------------+ void CWindow::RollUp(void) { //--- Change the button m_button_rollup.Timeframes(OBJ_NO_PERIODS); m_button_unroll.Timeframes(OBJ_ALL_PERIODS); //--- Set and store the size m_bg.Y_Size(m_caption_height); CElement::YSize(m_caption_height); //--- Disable the button m_button_unroll.MouseFocus(false); m_button_unroll.State(false); //--- State of the form "Minimized" m_is_minimized=true; //--- If this is an indicator with a set height and with the mode of minimizing the sub-window, // set the size of the indicator sub-window if(m_height_subwindow_mode) if(m_rollup_subwindow_mode) ChangeSubwindowHeight(m_caption_height+3); } //+------------------------------------------------------------------+ //| Maximizes the window | //+------------------------------------------------------------------+ void CWindow::Unroll(void) { //--- Change the button m_button_unroll.Timeframes(OBJ_NO_PERIODS); m_button_rollup.Timeframes(OBJ_ALL_PERIODS); //--- Set and store the size m_bg.Y_Size(m_bg_full_height); CElement::YSize(m_bg_full_height); //--- Disable the button m_button_rollup.MouseFocus(false); m_button_rollup.State(false); //--- State of the form "Maximized" m_is_minimized=false; //--- If this is an indicator with a set height and with the mode of minimizing the sub-window, // set the size of the indicator sub-window if(m_height_subwindow_mode) if(m_rollup_subwindow_mode) ChangeSubwindowHeight(m_subwindow_height); } //+------------------------------------------------------------------+