Files
include/Control panel MCM.mqh
2025-02-07 19:17:11 +03:30

1587 lines
118 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//+------------------------------------------------------------------+
//| Control panel MCM.mq5 |
//| Copyright 2010, Lizar |
//| https://login.mql5.com/ru/users/Lizar |
//| Revision 2010.12.09 |
//+------------------------------------------------------------------+
enum ENUM_CHART_EVENT_SYMBOL
{
CHARTEVENT_NEWBAR_NO =0, // No events
CHARTEVENT_NEWBAR_M1 =0x00000001, // "New bar" event on M1 chart
CHARTEVENT_NEWBAR_M2 =0x00000002, // "New bar" event on M2 chart
CHARTEVENT_NEWBAR_M3 =0x00000004, // "New bar" event on M3 chart
CHARTEVENT_NEWBAR_M4 =0x00000008, // "New bar" event on M4 chart
CHARTEVENT_NEWBAR_M5 =0x00000010, // "New bar" event on M5 chart
CHARTEVENT_NEWBAR_M6 =0x00000020, // "New bar" event on M6 chart
CHARTEVENT_NEWBAR_M10=0x00000040, // "New bar" event on M10 chart
CHARTEVENT_NEWBAR_M12=0x00000080, // "New bar" event on M12 chart
CHARTEVENT_NEWBAR_M15=0x00000100, // "New bar" event on M15 chart
CHARTEVENT_NEWBAR_M20=0x00000200, // "New bar" event on M20 chart
CHARTEVENT_NEWBAR_M30=0x00000400, // "New bar" event on M30 chart
CHARTEVENT_NEWBAR_H1 =0x00000800, // "New bar" event on H1 chart
CHARTEVENT_NEWBAR_H2 =0x00001000, // "New bar" event on H2 chart
CHARTEVENT_NEWBAR_H3 =0x00002000, // "New bar" event on H3 chart
CHARTEVENT_NEWBAR_H4 =0x00004000, // "New bar" event on H4 chart
CHARTEVENT_NEWBAR_H6 =0x00008000, // "New bar" event on H6 chart
CHARTEVENT_NEWBAR_H8 =0x00010000, // "New bar" event on H8 chart
CHARTEVENT_NEWBAR_H12=0x00020000, // "New bar" event on H12 chart
CHARTEVENT_NEWBAR_D1 =0x00040000, // "New bar" event on D1 chart
CHARTEVENT_NEWBAR_W1 =0x00080000, // "New bar" event on W1 chart
CHARTEVENT_NEWBAR_MN1=0x00100000, // "New bar" event on MN chart
CHARTEVENT_TICK =0x00200000, // "New tick" event
CHARTEVENT_ALL =0xFFFFFFFF, // All events
};
string EventDescription(long event)
{
ENUM_CHART_EVENT_SYMBOL event_current=(ENUM_CHART_EVENT_SYMBOL)event;
switch(event_current)
{
case CHARTEVENT_NEWBAR_NO: return(" Initialization "); // Initialization
case CHARTEVENT_NEWBAR_M1: return(" M1 "); // "New bar" event on M1 chart
case CHARTEVENT_NEWBAR_M2: return(" M2 "); // "New bar" event on M2 chart
case CHARTEVENT_NEWBAR_M3: return(" M3 "); // "New bar" event on M3 chart
case CHARTEVENT_NEWBAR_M4: return(" M4 "); // "New bar" event on M4 chart
case CHARTEVENT_NEWBAR_M5: return(" M5 "); // "New bar" event on M5 chart
case CHARTEVENT_NEWBAR_M6: return(" M6 "); // "New bar" event on M6 chart
case CHARTEVENT_NEWBAR_M10:return(" M10 "); // "New bar" event on M10 chart
case CHARTEVENT_NEWBAR_M12:return(" M12 "); // "New bar" event on M12 chart
case CHARTEVENT_NEWBAR_M15:return(" M15 "); // "New bar" event on M15 chart
case CHARTEVENT_NEWBAR_M20:return(" M20 "); // "New bar" event on M20 chart
case CHARTEVENT_NEWBAR_M30:return(" M30 "); // "New bar" event on M30 chart
case CHARTEVENT_NEWBAR_H1: return(" H1 "); // "New bar" event on H1 chart
case CHARTEVENT_NEWBAR_H2: return(" H2 "); // "New bar" event on H2 chart
case CHARTEVENT_NEWBAR_H3: return(" H3 "); // "New bar" event on H3 chart
case CHARTEVENT_NEWBAR_H4: return(" H4 "); // "New bar" event on H4 chart
case CHARTEVENT_NEWBAR_H6: return(" H6 "); // "New bar" event on H6 chart
case CHARTEVENT_NEWBAR_H8: return(" H8 "); // "New bar" event on H8 chart
case CHARTEVENT_NEWBAR_H12:return(" H12 "); // "New bar" event on H12 chart
case CHARTEVENT_NEWBAR_D1: return(" D1 "); // "New bar" event on D1 chart
case CHARTEVENT_NEWBAR_W1: return(" W1 "); // "New bar" event on W1 chart
case CHARTEVENT_NEWBAR_MN1:return(" MN1 "); // "New bar" event on MN chart
case CHARTEVENT_TICK :return(" tick "); // "New tick" event
default: return(" Unknown event ");
}
return(" Unknown event ");
}
ENUM_TIMEFRAMES EventToPeriod(long event)
{
ENUM_CHART_EVENT_SYMBOL event_current=(ENUM_CHART_EVENT_SYMBOL)event;
switch(event_current)
{
case CHARTEVENT_NEWBAR_M1: return(PERIOD_M1);
case CHARTEVENT_NEWBAR_M2: return(PERIOD_M2);
case CHARTEVENT_NEWBAR_M3: return(PERIOD_M3);
case CHARTEVENT_NEWBAR_M4: return(PERIOD_M4);
case CHARTEVENT_NEWBAR_M5: return(PERIOD_M5);
case CHARTEVENT_NEWBAR_M6: return(PERIOD_M6);
case CHARTEVENT_NEWBAR_M10:return(PERIOD_M10);
case CHARTEVENT_NEWBAR_M12:return(PERIOD_M12);
case CHARTEVENT_NEWBAR_M15:return(PERIOD_M15);
case CHARTEVENT_NEWBAR_M20:return(PERIOD_M20);
case CHARTEVENT_NEWBAR_M30:return(PERIOD_M30);
case CHARTEVENT_NEWBAR_H1: return(PERIOD_H1);
case CHARTEVENT_NEWBAR_H2: return(PERIOD_H2);
case CHARTEVENT_NEWBAR_H3: return(PERIOD_H3);
case CHARTEVENT_NEWBAR_H4: return(PERIOD_H4);
case CHARTEVENT_NEWBAR_H6: return(PERIOD_H6);
case CHARTEVENT_NEWBAR_H8: return(PERIOD_H8);
case CHARTEVENT_NEWBAR_H12:return(PERIOD_H12);
case CHARTEVENT_NEWBAR_D1: return(PERIOD_D1);
case CHARTEVENT_NEWBAR_W1: return(PERIOD_W1);
case CHARTEVENT_NEWBAR_MN1:return(PERIOD_MN1);
default: return(PERIOD_CURRENT);
}
return(PERIOD_CURRENT);
}
#define MSG_CONTROL_PANEL_MCM "MCM Control panel for multicurrency mode "
#define MSG_EVENT "Waiting for event... "
#define MSG_SELECT_SYMBOL "Select symbols for multicurrency mode "
#define MSG_SYMBOL_CHANGE "The number of symbols in Market Watch has changed "
#define MSG_HELP "Help - brief information about program "
#define MSG_SYMBOL_PERIOD "Set symbol and period for the currenct chart "
#define MSG_ESTABLISH_EVENTS "Set event for selected symbol "
#include <ChartObjects\ChartObjectsTxtControls.mqh>
//+------------------------------------------------------------------+
//| Class CControlElement. |
//| Purpose: A set of functions for menu |
//+------------------------------------------------------------------+
class CControlElement : public CChartObjectButton
{
protected:
//---
int m_intparam;
uint m_uintparam;
//---
//--- Button parameters:
ENUM_BASE_CORNER m_corner; // corner
int m_coord_x; // X coordinate
int m_coord_y; // Y coordinate
//---
//--- Control panel parameters:
string m_description; // description
int m_size_x; // X size
int m_size_y; // Y size
int m_state; // status
int m_state_select; // is selected
int m_flag_visibility;
color m_col_bg; // background color
color m_col_font; // text color
color m_col_select;
string m_font; // font name
int m_size_font; // font size
ENUM_OBJECT m_type; // object type
//---
public:
void CControlElement();
bool CreateElement(
ENUM_OBJECT type, // object type
string name, // object name (button name)
string description, // description or button text
int coord_x, // X coordinate
int coord_y, // Y coordinate
int size_x, // X size
int size_y, // Y size
color col_bg, // background color
color col_font, // text color
color col_select,
string font="Segoe UI Semibold", // font name
int size_font=8, // font size
int state=0, // button status
long chart_id=0, // chart ID
int window=0, // chart window
ENUM_BASE_CORNER corner=CORNER_LEFT_LOWER // chart binding corner
);
bool DisplayElement();
bool Display(int coord_x, int coord_y, int size_x, int size_y);
bool CreateButton( // Creates a button
string name, // Button name
string description, // Description or button text
int coord_x, // X coordinate
int coord_y, // Y coordinate
int size_x, // X size
int size_y, // Y size
color col_bg, // background color
color col_font, // text color
string font="Segoe UI Semibold", // font name
int size_font=8, // font size
int state=0, // button status
long chart_id=0, // chart ID
int window=0, // chart window
ENUM_BASE_CORNER corner=CORNER_LEFT_LOWER // binding corner
);
bool DisplayButton(); // Show button
bool CreateEdit( // Creates an Edit
string name, // name
string text, // text
int coord_x, // X coordinate
int coord_y, // Y coordinate
int size_x, // X size
int size_y, // Y size
color col_bg, // background color
color col_font, // text color
string font="Segoe UI Semibold", // font name
int size_font=8, // font size
long chart_id=0, // chart ID
int window=0, // chart window
ENUM_BASE_CORNER corner=CORNER_LEFT_LOWER // binding corner
);
bool DisplayBackground();// Show background on the chart
bool CreateLabel( // Creates a Label
string name, // object name (text label)
int coord_x, // X coordinate
int coord_y, // Y coordinate
color col_font, // font color
string font="Segoe UI Semibold", // font name
int size_font=8, // font size
long chart_id=0, // chart ID
int window=0, // chart window
ENUM_BASE_CORNER corner=CORNER_LEFT_LOWER // binding color
);
bool DisplayLabel(); // Show label
int Type() const { return(m_type); }
bool Hide(); // Hide object
bool Coord_x(int coord_x);
int Coord_x() {return(m_coord_x);}
bool Coord_y(int coord_y);
int Coord_y() {return(m_coord_y);}
bool Descript(string description);
void StateElement(bool state) {m_state=state;}
void ColorElement(color col_font) {m_col_font=col_font; Color(col_font);}
bool StateElement() { return(m_state);}
void FlagVisibility(int flag) {m_flag_visibility=flag;}
int FlagVisibility() {return(m_flag_visibility);}
void ChangeStateSelect() {m_state_select=m_state;}
void ChangeState() {m_state=m_state_select;}
void IntParam(int param) {m_intparam=param;}
int IntParam() {return(m_intparam);}
void UIntParam(int param) {m_uintparam=param;}
int UIntParam() {return(m_uintparam);}
};
void CControlElement :: CControlElement()
{
m_intparam=-1;
m_uintparam=0;
//--- Chart paramters:
m_corner =CORNER_LEFT_LOWER; // binding corner
m_chart_id =ChartID(); // chart ID
m_window =0; // chart window
m_num_points=1; // number of anchor points of object
//--- Control element parameters:
m_state=false; // status
m_col_bg=(color)ChartGetInteger(m_chart_id,CHART_COLOR_BACKGROUND);
m_col_font=(color)ChartGetInteger(m_chart_id,CHART_COLOR_FOREGROUND);
m_flag_visibility=OBJ_ALL_PERIODS;
m_font="Segoe UI Semibold"; // font name
m_size_font=10; // font size
//---
}
bool CControlElement :: Descript(string description)
{
m_description=description;
if(!Description(description)) return(false);
return(true);
}
bool CControlElement :: Coord_x(int coord_x)
{
m_coord_x=coord_x;
if(!X_Distance(coord_x)) return(false);
return(true);
}
bool CControlElement :: Coord_y(int coord_y)
{
m_coord_y=coord_y;
if(!Y_Distance(coord_y)) return(false);
return(true);
}
//+------------------------------------------------------------------+
//| Show control element |
//| INPUT: no. |
//| OUTPUT: true - if successful |
//| false - if error |
//| REMARK: no. |
//+------------------------------------------------------------------+
bool CControlElement :: DisplayButton()
{
if(!Create(m_chart_id,m_name,m_window,m_coord_x,m_coord_y,m_size_x,m_size_y)) return(false); // Create button
if(!Description(m_description)) return(false); // description or button text
if(!BackColor (m_col_bg)) return(false); // background color
if(!Font(m_font)) return(false); // font name
if(!FontSize(m_size_font)) return(false); // font size
if(!Color(m_col_font)) return(false); // text color
if(!State(m_state)) return(false); // state
if(!Corner(m_corner)) return(false); // binding corner
return(true);
}
bool CControlElement :: DisplayElement()
{
if(!Create(m_chart_id,m_name,m_window,m_coord_x,m_coord_y,m_size_x,m_size_y)) return(false); // Create element
if(!Description(m_description)) return(false); // description of text
if(!BackColor (m_col_bg)) return(false); // background color
if(!Font(m_font)) return(false); // font name
if(!FontSize(m_size_font)) return(false); // font size
if(m_state) { if(!Color(m_col_select)) return(false); }// selected text color
else { if(!Color(m_col_font)) return(false); }// text color
if(!State(m_state)) return(false); // state
if(!Corner(m_corner)) return(false); // binding corner
if(!SetInteger(OBJPROP_READONLY,true)) return(false);
if(!Timeframes(m_flag_visibility)) return(false);
return(true);
}
bool CControlElement :: Display(int coord_x, int coord_y, int size_x, int size_y)
{
m_coord_x=coord_x;
m_coord_y=coord_y;
m_size_x=size_x;
m_size_y=size_y;
if(!DisplayElement()) return(false);
return(true);
}
bool CControlElement :: CreateElement(
ENUM_OBJECT type, // object type
string name, // object name
string description, // description of button text
int coord_x, // X coordinate
int coord_y, // Y coordinate
int size_x, // X size
int size_y, // Y size
color col_bg, // background color
color col_font, // text color
color col_select, // selected text color
string font="Segoe UI Semibold", // font name
int size_font=8, // font size
int state=0, // state
long chart_id=0, // chart ID
int window=0, // chart window
ENUM_BASE_CORNER corner=CORNER_LEFT_LOWER // binding corner
)
{
m_chart_id=chart_id; // chart ID
m_name=name; // object name
m_window=window; // chart window
m_num_points=1; // number of anchor points of object
//--- Button parameters:
m_corner=corner; // binding corner
m_coord_x=coord_x; // X coordinate
m_coord_y=coord_y; // Y coordinate
//---
//--- Button parameters:
m_type=type;
m_description=description; // description
m_size_x=size_x; // X size
m_size_y=size_y; // Y size
m_state=state; // state
m_col_bg=col_bg; // background color
m_col_font=col_font; // text color
m_col_select=col_select;
m_font=font; // font name
m_size_font=size_font; // font size
//---
return(true);
}
//+------------------------------------------------------------------+
//| Create a button |
//| INPUT: ... |
//| OUTPUT: true - if successful |
//| false - if error |
//| REMARK: no. |
//+------------------------------------------------------------------+
bool CControlElement :: CreateButton(
string name, // object name
string description, // description or text
int coord_x, // X coordinate
int coord_y, // Y coordinate
int size_x, // X size
int size_y, // Y size
color col_bg, // background color
color col_font, // text color
string font="Segoe UI Semibold", // font name
int size_font=8, // font size
int state=0, // state
long chart_id=0, // chart ID
int window=0, // chart window
ENUM_BASE_CORNER corner=CORNER_LEFT_LOWER // binding corner
)
{
m_chart_id=chart_id; // chart ID
m_name=name; // object name
m_window=window; // chart window
m_num_points=1; // number of anchor points of object
//--- Button parameters:
m_corner=corner; // binding corner
m_coord_x=coord_x; // X coordinate
m_coord_y=coord_y; // Y coordinate
//---
//--- Button parameters:
m_type=OBJ_BUTTON;
m_description=description; // object description or text
m_size_x=size_x; // X size
m_size_y=size_y; // Y size
m_state=state; // state
m_col_bg=col_bg; // background color
m_col_font=col_font; // text color
m_font=font; // font name
m_size_font=size_font; // font size
//---
if(!DisplayButton()) return(false);
return(true);
}
//+------------------------------------------------------------------+
//| Create an Edit |
//| INPUT: ... |
//| OUTPUT: true - if successful |
//| false - if error |
//| REMARK: no. |
//+------------------------------------------------------------------+
bool CControlElement :: CreateEdit(
string name, // object name
string text, // text
int coord_x, // X coordinate
int coord_y, // Y coordinate
int size_x, // X size
int size_y, // Y size
color col_bg, // background color
color col_font, // border color
string font="Segoe UI Semibold", // font name
int size_font=8, // font size
long chart_id=0, // chart id
int window=0, // chart window
ENUM_BASE_CORNER corner=CORNER_LEFT_LOWER // binding corner
)
{
m_chart_id=chart_id; // chart id
m_name=name; // name
m_description=text;
m_window=window; // chart window
m_num_points=1; // number of anchor points of object
//--- Parameters:
m_corner=corner; // binding corner
m_coord_x=coord_x; // X coordinate
m_coord_y=coord_y; // Y coordinate
//---
//--- Edit field parameters:
m_type=OBJ_EDIT;
m_size_x=size_x; // X size
m_size_y=size_y; // Y size
m_col_bg=col_bg; // background color
m_col_font=col_font; // border color
m_font=font; // font name
m_size_font=size_font; // font size
//---
return(true);
}
//+------------------------------------------------------------------+
//| Show Edit field |
//| INPUT: no. |
//| OUTPUT: true - if successful |
//| false - if error |
//| REMARK: no. |
//+------------------------------------------------------------------+
bool CControlElement :: DisplayBackground()
{
if(!Create(m_chart_id,m_name,m_window,m_coord_x,m_coord_y,m_size_x,m_size_y)) return(false); // Create edit
if(!BackColor (m_col_bg)) return(false); // background color
if(!Color(m_col_font)) return(false); // text color
if(!Corner(m_corner)) return(false); // binding corner
if(!Description(m_description)) return(false); // description
if(!Font(m_font)) return(false); // font name
if(!FontSize(m_size_font)) return(false); // font size
if(!SetInteger(OBJPROP_READONLY,true)) return(false);
return(true);
}
bool CControlElement :: CreateLabel(
string name, // object name
int coord_x, // X coordinate
int coord_y, // Y coordinate
color col_font, // text color
string font="Segoe UI Semibold", // font name
int size_font=8, // font size
long chart_id=0, // chart id
int window=0, // chart window
ENUM_BASE_CORNER corner=CORNER_LEFT_LOWER // binding corner
)
{
m_chart_id=chart_id; // chart id
m_name=name; // object name
m_window=window; // chart window
m_num_points=1; // number of anchor points of object
//--- label parameters:
m_corner=corner; // binding corner
m_coord_x=coord_x; // X coordinate
m_coord_y=coord_y; // Y coordinate
//---
//--- label parameters:
m_type=OBJ_LABEL;
m_col_font=col_font; // text color
m_font=font; // font name
m_size_font=size_font; // font size
//---
// if(!DisplayLabel()) return(false);
return(true);
}
//+------------------------------------------------------------------+
//| Show label |
//| INPUT: no. |
//| OUTPUT: true - if successful |
//| false - if error |
//| REMARK: no. |
//+------------------------------------------------------------------+
bool CControlElement :: DisplayLabel()
{
if(!Create(m_chart_id,m_name,m_window,m_coord_x,m_coord_y)) return(false); // Create label
if(!Font(m_font)) return(false); // font name
if(!Color(m_col_font)) return(false); // text color
if(!FontSize(m_size_font)) return(false); // font size
if(!Corner(m_corner)) return(false); // binding corner
return(true);
}
//+------------------------------------------------------------------+
//| Hide element |
//| The hidden element can be show using Display method |
//| Display() |
//| INPUT: no. |
//| OUTPUT: true - if successful |
//| false - if error |
//| REMARK: no. |
//+------------------------------------------------------------------+
bool CControlElement :: Hide()
{
if(!ObjectDelete(m_chart_id,m_name)) return(false);
return(true);
}
#include <Arrays\List.mqh>
class CMenuHorizontal : public CList
{
protected:
long m_chart_id;
string m_name[];
string m_description[];
int m_chart_width;
int m_size_x[];
int m_coord_y;
int m_coord_x;
int m_width;
int m_height;
int m_quantity_buttons;
bool m_flag_status_message;
bool m_flag_menu_horizontal;
public:
void CMenuHorizontal();
CObject *CreateElement(
string name, // object name
string description, // description or text
int coord_x, // X coordinate
int coord_y, // Y coordinate
int size_x, // X size
int size_y, // Y size
color col_bg, // background color
color col_font, // text color
string font="Segoe UI Semibold", // font name
int size_font=8, // font size
int state=0, // state
long chart_id=0, // chart id
int window=0, // chart window
ENUM_BASE_CORNER corner=CORNER_LEFT_LOWER // binding corner
);
bool Create(
string& name_buttom[],// button names
color col_bg, // background color
color col_font, // text color
string font="Segoe UI Semibold", // font name
int size_font=10, // font size
long chart_id=0, // chart id
int window=0, // chart window
ENUM_BASE_CORNER corner=CORNER_LEFT_LOWER // binding corner
);
bool Delete();
void StatusMessage(string Message);
bool GetFlagStatusMessage() {return(m_flag_status_message);}
bool GetFlagMenuHorizontal() {return(m_flag_menu_horizontal);}
int GetChartWidth() {return(m_chart_width);}
bool AlignmentCenter();
bool Shift_x(int shift=0);
bool Shift_y(int shift=0);
bool HideStatusMessage();
bool DisplayStatusMessage();
bool HideMenuHorizontal();
bool DisplayMenuHorizontal();
};
void CMenuHorizontal :: CMenuHorizontal()
{
m_flag_status_message=true;
m_flag_menu_horizontal=true;
}
bool CMenuHorizontal :: AlignmentCenter()
{
m_chart_width=(int)ChartGetInteger(m_chart_id,CHART_WIDTH_IN_PIXELS);
int menu_x=(m_chart_width>(m_width+5))?(m_chart_width-m_width)/2:5;
int shift=0;
if (m_coord_x!=menu_x)
{
shift=menu_x-m_coord_x;
m_coord_x=menu_x;
Shift_x(shift);
}
return(true);
}
bool CMenuHorizontal :: Shift_x(int shift=0)
{
int total=Total();
CControlElement *element;
for(int i=0;i<total;i++)
{
element=GetNodeAtIndex(i);
int coord_x=element.Coord_x();
if(!element.Coord_x(coord_x+shift)) return(false);
}
return(true);
}
bool CMenuHorizontal :: Shift_y(int shift=0)
{
int total=Total();
CControlElement *element;
for(int i=0;i<total;i++)
{
element=GetNodeAtIndex(i);
int coord_y=element.Coord_y();
if(!element.Coord_y(coord_y+shift)) return(false);
}
return(true);
}
CObject* CMenuHorizontal :: CreateElement(
string name, // object name
string description, // description or text
int coord_x, // X coordinate
int coord_y, // Y coordinate
int size_x, // X size
int size_y, // Y size
color col_bg, // background color
color col_font, // text color
string font="Segoe UI Semibold", // font name
int size_font=8, // font size
int state=0, // state
long chart_id=0, // chart id
int window=0, // chart window
ENUM_BASE_CORNER corner=CORNER_LEFT_LOWER // binding corner
)
{
CControlElement *button=new CControlElement;
if(!button.CreateButton(name,description,coord_x,coord_y,size_x,size_y,col_bg,col_font,font,size_font,state,chart_id,window,corner))
{
Print(__FUNCTION__," Error in creation of button ",GetLastError());
delete button;
button=NULL;
}
return(button);
}
bool CMenuHorizontal :: Create(
string& name_buttom[],// names
color col_bg, // background color
color col_font, // text color
string font="Segoe UI Semibold", // font color
int size_font=10, // font size
long chart_id=0, // chart id
int window=0, // chart window
ENUM_BASE_CORNER corner=CORNER_LEFT_LOWER // binding corner
)
{
//--- Menu colors:
if(col_bg==CLR_NONE) col_bg=(color)ChartGetInteger(chart_id,CHART_COLOR_BACKGROUND);
if(col_font==CLR_NONE) col_font=(color)ChartGetInteger(chart_id,CHART_COLOR_FOREGROUND);
m_chart_id=chart_id;
m_width=0;
m_height=(size_font+1)*2;
m_coord_y=m_height*2;
m_quantity_buttons=ArraySize(name_buttom);
ArrayResize(m_name,m_quantity_buttons);
ArrayResize(m_description,m_quantity_buttons);
ArrayResize(m_size_x,m_quantity_buttons);
for(int i=0; i<m_quantity_buttons; i++)
{
m_name[i]=name_buttom[i];
m_description[i]=name_buttom[i];
m_size_x[i]=StringLen(m_description[i])*size_font+2;
// Print(StringLen(m_description[i])," ",m_size_x[i]);
m_width+=m_size_x[i]+1;
}
int width_chart=(int)ChartGetInteger(chart_id,CHART_WIDTH_IN_PIXELS);
m_coord_x=(width_chart>(m_width+5))?(width_chart-m_width)/2:5;
CControlElement *background=new CControlElement;
if(!background.CreateEdit("background","",m_coord_x,m_coord_y-m_height-1,m_width,m_height-1,col_bg,col_bg,font,size_font))//col_font))
{
Print(__FUNCTION__," Erro in creation of menu backround ",GetLastError());
delete background;
return(false);
}
Add(background);
if(!background.DisplayBackground()) return(false);
for(int i=0,buttom_x=m_coord_x; i<m_quantity_buttons; i++)
{
CObject *button_object=CreateElement(m_name[i],m_description[i],buttom_x,m_coord_y,m_size_x[i],m_height,col_bg,col_font,font,size_font,0,chart_id,window,corner);
if(button_object==NULL) return(false);
Add(button_object);
buttom_x+=m_size_x[i]+1;
}
CControlElement *status_control_panel=new CControlElement;
if(!status_control_panel.CreateLabel("● "+MSG_CONTROL_PANEL_MCM,m_coord_x,m_coord_y-m_height-2,col_font,font,size_font,chart_id,window,corner))
{
Print(__FUNCTION__," Error in creation of text label ",GetLastError());
delete status_control_panel;
return(false);
}
Add(status_control_panel);
if(!status_control_panel.DisplayLabel()) return(false);
return(true);
}
bool CMenuHorizontal :: Delete()
{
Clear();
return(true);
}
void CMenuHorizontal :: StatusMessage(string Message)
{
CControlElement *message=GetLastNode();
message.Description(" ● "+Message);
ChartRedraw();
}
//+------------------------------------------------------------------+
//| Hide horizontal menu in the lower bottom corner |
//| INPUT: no. |
//| OUTPUT: true - if successful |
//| false - if error |
//| REMARK: no. |
//+------------------------------------------------------------------+
bool CMenuHorizontal :: HideMenuHorizontal()
{
m_flag_menu_horizontal=false;
CControlElement *element;
int total=Total();
for(int i=0;i<total;i++)
{
// if(i!=2)
if(i!=1 && i!=2)
{
element=GetNodeAtIndex(i);
if(!ObjectDelete(m_chart_id,element.Name())) return(false);
}
else if(i==2)
{
element=GetNodeAtIndex(i);
element.Descript("˃");
}
}
// element=GetNodeAtIndex(2);
// Shift_x(1-element.Coord_x());
Shift_x(1-m_coord_x);
if(GetFlagStatusMessage()) Shift_y(-m_height);
m_coord_x=1;
return(true);
}
//+------------------------------------------------------------------+
//| Show horizontal menu |
//| INPUT: no. |
//| OUTPUT: true - if successful |
//| false - if error |
//| REMARK: no. |
//+------------------------------------------------------------------+
bool CMenuHorizontal :: DisplayMenuHorizontal()
{
m_flag_menu_horizontal=true;
if(GetFlagStatusMessage()) Shift_y(m_height);
CControlElement *element;
int total=Total();
element=GetFirstNode();
if(!element.DisplayBackground()) return(false);
for(int i=1;i<total-1;i++)
{
if(i!=1 && i!=2)
{
element=GetNodeAtIndex(i);
if(!element.DisplayButton()) return(false);
}
else if(i==2)
{
element=GetNodeAtIndex(i);
element.Descript("˂");
}
}
element=GetLastNode();
if(!element.DisplayLabel()) return(false);
AlignmentCenter();
return(true);
}
//+------------------------------------------------------------------+
//| Hide status string |
//| The hidden status string can be shown using Display method |
//| Display() |
//| INPUT: no. |
//| OUTPUT: true - if successful |
//| false - if error |
//| REMARK: no. |
//+------------------------------------------------------------------+
bool CMenuHorizontal :: HideStatusMessage()
{
m_flag_status_message=false;
CControlElement *element;
element=GetFirstNode();
if(!ObjectDelete(m_chart_id,element.Name())) return(false);
element=GetLastNode();
if(!ObjectDelete(m_chart_id,element.Name())) return(false);
element=GetPrevNode();
element.Descript("˄");
Shift_y(-m_height);
return(true);
}
bool CMenuHorizontal :: DisplayStatusMessage()
{
m_flag_status_message=true;
CControlElement *element;
Shift_y(m_height);
element=GetFirstNode();
if(!element.DisplayBackground()) return(false);
element=GetLastNode();
if(!element.DisplayLabel()) return(false);
element=GetPrevNode();
element.Descript("˅");
return(true);
}
// Symbol events structure
struct stEventSymbol
{
string symbol; // Symbol
ENUM_CHART_EVENT_SYMBOL event; // Event flag
};
//+------------------------------------------------------------------+
//| MCM Control panel initalization method. |
//| It shoul be called from OnInit() function only. |
//| INPUT: no. |
//| OUTPUT: true - if successful |
//| false - if error |
//| REMARK: no. |
//+------------------------------------------------------------------+
#define INDICATOR_NAME "iControl panel MCM"
int _handle_control_panel=INVALID_HANDLE;
bool InitControlPanelMCM(color init_bg_color=Gray, // Menu background color
color init_font_color=Gainsboro,// Text color
color init_select_color=Yellow, // Selected text color
int init_font_size=10) // Font size
{
//--- check if it already exist
int window=-1;
window=ChartWindowFind(0,"Control panel MCM");
if(window!=-1)
{
Print(__FUNCTION__+" "+INDICATOR_NAME," already installed");
return(true);
}
//--- launch the iControl panel MCM.mq5 custom indicator
_handle_control_panel=iCustom(_Symbol,_Period,INDICATOR_NAME,init_bg_color,init_font_color,init_select_color,init_font_size);
if(_handle_control_panel==INVALID_HANDLE)
{ Print("Error in "+INDICATOR_NAME); return(false);}
bool Testing=((bool)MQL5InfoInteger(MQL5_TESTING) || (bool)MQL5InfoInteger(MQL5_OPTIMIZATION));
if(!Testing)
if(!ChartIndicatorAdd(ChartID(),0,_handle_control_panel))
{
Alert(__FUNCTION__," Error in attaching of MCM panel to the chart, error N: ",GetLastError());
return(false);
}
return(true);
}
//+------------------------------------------------------------------+
//| MCM Control panel deinitialization function |
//| It should be called from OnDeinit() function only |
//| INPUT: no. |
//| OUTPUT: true - if successful |
//| false - if error |
//| REMARK: no. |
//+------------------------------------------------------------------+
bool DeinitControlPanelMCM()
{
//--- Release iControl panel MCA.mq5
if(_handle_control_panel!=INVALID_HANDLE)
if(IndicatorRelease(_handle_control_panel)) Print("Deinitialization of MCM Control panel: Successful");
else
{
Print("Error in deinitialization of MCM Control Panel");
return(false);
}
// Print("Number of indicators ", ChartIndicatorsTotal(ChartID(),0));
// Print("Indicator name ", ChartIndicatorName(ChartID(),0,0)," ----- ","Control panel MCM");
//--- check if it already installed:
int window=-1;
window=ChartWindowFind(0,"Control panel MCM");
if(window!=-1)
{
if(!ChartIndicatorDelete(ChartID(),0,"Control panel MCM"))
{
Print(__FUNCTION__+" Error in detaching of "+INDICATOR_NAME+" from chart");
return(false);
}
Print(__FUNCTION__+": "+INDICATOR_NAME+" removed from chart");
return(true);
}
return(true);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class CVertical_scrolled_menus : public CList
{
protected:
long m_chart_id;
int m_window;
ENUM_BASE_CORNER m_corner;
string m_menu_name;
string m_name_save_buttom;
int m_menu_coord_y;
int m_menu_coord_x;
int m_menu_width;
int m_menu_height;
color m_menu_col_bg;
color m_menu_col_font;
color m_menu_col_select;
int m_size_font;
string m_font;
int m_width_scrolling_line;
bool m_save_buttom;
bool m_menu_visibility;
string m_element_text[];
int m_element_quantity;
int m_element_min;
int m_element_max;
int m_element_width;
int m_element_height;
int m_element_begin;
bool m_flag_status_message;
bool m_flag_menu_horizontal;
public:
void CVertical_scrolled_menus();
CObject* CreateElement(
string text, // text color
int coord_x, // X coordinate
int coord_y, // Y coordinate
color col_font, // text color
color col_select, // selected text color
string font="Segoe UI Semibold", // font name
int size_font=10, // font size
long chart_id=0, // chart ID
int window=0, // chart window
ENUM_BASE_CORNER corner=CORNER_LEFT_LOWER // binding corner
);
bool Create(
string name, // vertical menu color
string name_save_buttom, // "Save" button name
string& text_lebel[], // text of the labels
int coord_x, // X coordinate
int coord_y, // Y coordinate
color col_bg, // background color
color col_font, // text color
color col_select, // selected text color
string font="Segoe UI Semibold", // font name
int size_font=10, // font size
long chart_id=0, // chart id
int window=0, // chart window
ENUM_BASE_CORNER corner=CORNER_LEFT_LOWER // binding corner
);
bool CreateScrollingLine();
int SelectOneElement(string name);
int SelectMuchElement(string name);
int GetMenuWidth() {return(m_menu_width+m_width_scrolling_line);}
string Name() {return(m_menu_name);}
void Name(string name) {m_menu_name=name;}
bool Scrolling(string button_scroll);
bool Display(int coord_x,int coord_y);
bool Hide();
bool Visibility() {return(m_menu_visibility);}
bool ChangeState();
bool ChangeStateSelect();
void Quantity(int quantity) {m_element_quantity=quantity;}
bool SynchronizationTradingTools();
};
void CVertical_scrolled_menus :: CVertical_scrolled_menus()
{
m_chart_id=ChartID();
m_width_scrolling_line=4;
//--- Colors of menu:
m_menu_col_bg=(color)ChartGetInteger(m_chart_id,CHART_COLOR_BACKGROUND);
m_menu_col_font=(color)ChartGetInteger(m_chart_id,CHART_COLOR_FOREGROUND);
m_menu_col_select=m_menu_col_font;
m_menu_name="??????";
m_element_begin=0;
m_menu_visibility=false;
}
CObject* CVertical_scrolled_menus :: CreateElement(
string text, // text
int coord_x, // X coordinate
int coord_y, // Y coordinate
color col_font, // text color
color col_select, // selected color
string font="Segoe UI Semibold", // font name
int size_font=10, // font size
long chart_id=0, // chart id
int window=0, // chart window
ENUM_BASE_CORNER corner=CORNER_LEFT_LOWER // binding corner
)
{
CControlElement *lebel=new CControlElement;
if(!lebel.CreateElement(OBJ_LABEL,text,text,coord_x,coord_y,0,0,col_font,col_font,col_select,font,size_font,0,chart_id,window,corner))
{
Print(__FUNCTION__," Error in creation of text label ",GetLastError());
delete lebel;
lebel=NULL;
}
return(lebel);
}
bool CVertical_scrolled_menus :: Display(int coord_x,int coord_y)
{
bool result=true;
m_element_begin=0;
//--- Height
long height_chart;
result&=ChartGetInteger(m_chart_id,CHART_HEIGHT_IN_PIXELS,m_window,height_chart);
m_element_max=(int)((height_chart-coord_y)/m_element_height-3+m_save_buttom);
m_element_max=MathMin(m_element_quantity,m_element_max);
m_element_max=MathMax(m_element_min,m_element_max);
m_menu_height=(m_element_max+2-m_save_buttom)*m_element_height;
//---
m_width_scrolling_line=((m_element_quantity>m_element_max)?4:2)*m_size_font;
m_menu_coord_x=coord_x;
m_menu_coord_y=coord_y+m_menu_height+1;
CControlElement *element=GetFirstNode();
element.Display(m_menu_coord_x,m_menu_coord_y,m_menu_width+m_width_scrolling_line,m_menu_height);
element=GetNextNode();
element.Display(m_menu_coord_x+m_size_font/2, m_menu_coord_y, m_menu_width+m_size_font, m_element_height-2);
int element_quantity=ArraySize(m_element_text);
for(int i=0,lebel_y=m_menu_coord_y-m_element_height; i<m_element_quantity; i++)
{
element=GetNextNode();
element.Coord_x(m_menu_coord_x+m_size_font);
element.Coord_y(lebel_y);
if(i<m_element_max) element.Display(m_menu_coord_x+m_size_font,lebel_y,m_menu_width+m_width_scrolling_line,m_menu_height);
else element.Hide();
lebel_y-=m_element_height;
}
/* int element_quantity=ArraySize(m_element_text);
for(int i=0, j=0,lebel_y=m_menu_coord_y-m_element_height; i<element_quantity; i++)
{
element=GetNextNode();
string name=element.Name();
int visibility=element.FlagVisibility();
if(element.FlagVisibility()==OBJ_ALL_PERIODS)
{
element.Coord_x(m_menu_coord_x+m_size_font);
element.Coord_y(lebel_y);
if(j<m_element_max) element.Display(m_menu_coord_x+m_size_font,lebel_y,m_menu_width+m_width_scrolling_line,m_menu_height);
else element.Hide();
MoveToIndex(j+2);
lebel_y-=m_element_height;
j++;
}
}
*/
element=GetNodeAtIndex(element_quantity+2);
element.Display(m_menu_coord_x,m_menu_coord_y,m_menu_width+m_width_scrolling_line,m_element_height);
element=GetNextNode();
if(m_element_quantity>m_element_max) element.FlagVisibility(OBJ_ALL_PERIODS); else element.FlagVisibility(OBJ_NO_PERIODS);
element.Display(m_menu_coord_x+m_menu_width+m_width_scrolling_line-5-m_size_font-5,m_menu_coord_y-2*m_element_height,m_size_font+4,m_element_height*(m_element_max-2));
element=GetNextNode();
if(m_element_quantity>m_element_max) element.FlagVisibility(OBJ_ALL_PERIODS); else element.FlagVisibility(OBJ_NO_PERIODS);
element.Display(m_menu_coord_x+m_menu_width+m_width_scrolling_line-5-m_size_font-5,m_menu_coord_y-m_element_height-5,m_size_font+4,m_element_height-5);
element=GetNextNode();
if(m_element_quantity>m_element_max) element.FlagVisibility(OBJ_ALL_PERIODS); else element.FlagVisibility(OBJ_NO_PERIODS);
element.Display(m_menu_coord_x+m_menu_width+m_width_scrolling_line-5-m_size_font-5,m_menu_coord_y-m_element_height*(m_element_max),m_size_font+4,m_element_height-5);
element=GetNextNode();
if(m_save_buttom) element.FlagVisibility(OBJ_NO_PERIODS); else element.FlagVisibility(OBJ_ALL_PERIODS);
element.Display(m_menu_coord_x+1,m_menu_coord_y-m_element_height*(m_element_max+1),m_menu_width+m_width_scrolling_line-2,m_element_height-1);
m_menu_visibility=true;
return(true);
}
bool CVertical_scrolled_menus :: Hide()
{
CControlElement *element=GetFirstNode();
for(int i=0; i<Total(); i++)
{
element.Hide();
element=GetNextNode();
}
m_menu_visibility=false;
return(true);
}
bool CVertical_scrolled_menus :: ChangeStateSelect()
{
CControlElement *element=GetFirstNode();
for(int i=0; i<Total(); i++)
{
element.ChangeStateSelect();
element=GetNextNode();
}
return(true);
}
bool CVertical_scrolled_menus :: ChangeState()
{
CControlElement *element=GetFirstNode();
for(int i=0; i<Total(); i++)
{
element.ChangeState();
element=GetNextNode();
}
return(true);
}
bool CVertical_scrolled_menus :: Create(
string name, // name of the vertical menu
string name_save_buttom, // "save" button name, set "" if isn't necessary
string& text[], // menu button text
int coord_x, // X coordinate
int coord_y, // Y coordinate
color col_bg, // background color
color col_font, // text color
color col_select, // selected text color
string font="Segoe UI Semibold", // font name
int size_font=10, // font size
long chart_id=0, // chart id
int window=0, // char windowо
ENUM_BASE_CORNER corner=CORNER_LEFT_LOWER // binding corner
)
{
bool result=true;
//--- Menu colors:
// if(col_bg==CLR_NONE) result&=ChartGetInteger(chart_id,CHART_COLOR_BACKGROUND,m_menu_col_bg);
// else m_menu_col_bg=col_bg;
// if(col_font==CLR_NONE) result&=ChartGetInteger(chart_id,CHART_COLOR_FOREGROUND,m_menu_col_font);
// else m_menu_col_font=col_font;
if(col_bg!=CLR_NONE) m_menu_col_bg=col_bg;
if(col_font!=CLR_NONE) m_menu_col_font=col_font;
if(col_select!=CLR_NONE) m_menu_col_select=col_select;
//---
m_menu_name=name;
m_name_save_buttom=name_save_buttom;
m_chart_id=chart_id;
m_window=window;
m_corner=corner;
m_size_font=size_font;
m_font=font;
m_element_begin=0;
m_menu_width=0;
m_element_quantity=ArraySize(text);
if(ArrayResize(m_element_text,m_element_quantity)==-1) result=false;
m_save_buttom=(m_name_save_buttom=="");
//--- Menu height
long height_chart;
result&=ChartGetInteger(m_chart_id,CHART_HEIGHT_IN_PIXELS,m_window,height_chart);
m_element_height=m_size_font*2;
m_element_min=2;
m_element_max=(int)((height_chart-coord_y)/m_element_height-3+m_save_buttom);
m_element_max=MathMin(m_element_quantity,m_element_max);
m_element_max=MathMax(m_element_min,m_element_max);
m_menu_height=(m_element_max+2-m_save_buttom)*m_element_height;
//---
m_width_scrolling_line=((m_element_quantity>m_element_max)?m_width_scrolling_line:2)*m_size_font;
//--- Menu width
for(int i=0; i<m_element_quantity; i++)
{
m_element_text[i]=text[i];
m_element_width=(StringLen(m_element_text[i]))*(size_font);
m_menu_width=(m_menu_width>m_element_width)?m_menu_width:m_element_width;
}
//---
m_menu_coord_x=coord_x;
m_menu_coord_y=coord_y+m_menu_height+1;
CControlElement *element=new CControlElement;
if(!element.CreateElement(OBJ_EDIT,m_menu_name+"background_chart","",m_menu_coord_x,m_menu_coord_y,m_menu_width+m_width_scrolling_line,m_menu_height,m_menu_col_bg,m_menu_col_font,m_menu_col_select,font,size_font))
{
Print(__FUNCTION__," Error in creation of menu background ",GetLastError());
delete element;
return(false);
}
Add(element);
element=new CControlElement;
if(!element.CreateElement(OBJ_EDIT,m_menu_name+"select","",m_menu_coord_x+size_font/2, m_menu_coord_y, m_menu_width+size_font, m_element_height-2,m_menu_col_bg,m_menu_col_select,m_menu_col_select,font,size_font))
{
Print(__FUNCTION__," Error in creation of menu backround ",GetLastError());
delete element;
return(false);
}
Add(element);
for(int i=0,lebel_y=m_menu_coord_y-m_element_height; i<m_element_quantity; i++)
{
CObject *lebel=CreateElement(m_element_text[i],m_menu_coord_x+size_font,lebel_y,col_font,m_menu_col_select,font,size_font,chart_id,window,corner);
if(lebel==NULL) return(false);
Add(lebel);
lebel_y-=m_element_height;
}
element=new CControlElement;
if(!element.CreateElement(OBJ_EDIT,m_menu_name,m_menu_name,m_menu_coord_x,m_menu_coord_y,m_menu_width+m_width_scrolling_line,m_element_height,m_menu_col_bg,m_menu_col_font,m_menu_col_select,font,size_font))
{
Print(__FUNCTION__," Error in creation of menu item ",GetLastError());
delete element;
return(false);
}
Add(element);
CreateScrollingLine();
element=new CControlElement;
if(!element.CreateElement(OBJ_BUTTON,m_menu_name+"_button_save",m_name_save_buttom,m_menu_coord_x+1,m_menu_coord_y-m_element_height*(m_element_max+1),m_menu_width+m_width_scrolling_line-2,m_element_height-1,m_menu_col_bg,m_menu_col_font,m_menu_col_select,m_font,m_size_font,0,m_chart_id,m_window,m_corner))
{
Print(__FUNCTION__," Error in creation of menu button ",GetLastError());
delete element;
return(false);
}
Add(element);
if(m_save_buttom) element.FlagVisibility(OBJ_NO_PERIODS); else element.FlagVisibility(OBJ_ALL_PERIODS);
// Display(coord_x,coord_y);
return(true);
}
bool CVertical_scrolled_menus :: CreateScrollingLine()
{
CControlElement *scrolling_line=new CControlElement;
if(!scrolling_line.CreateElement(OBJ_BUTTON,m_menu_name+"scrolling_line"," ",m_menu_coord_x+m_menu_width+m_width_scrolling_line-5-m_size_font-5,m_menu_coord_y-2*m_element_height,m_size_font+4,m_element_height*(m_element_max-2),m_menu_col_bg,m_menu_col_font,m_menu_col_select,m_font,m_size_font,0,m_chart_id,m_window,m_corner))
{
Print(__FUNCTION__," Error in creation of menu button ",GetLastError());
delete scrolling_line;
return(false);
}
Add(scrolling_line);
if(m_element_quantity>m_element_max) scrolling_line.FlagVisibility(OBJ_ALL_PERIODS); else scrolling_line.FlagVisibility(OBJ_NO_PERIODS);
CControlElement *button_up=new CControlElement;
if(!button_up.CreateElement(OBJ_BUTTON,m_menu_name+"▲","▲",m_menu_coord_x+m_menu_width+m_width_scrolling_line-5-m_size_font-5,m_menu_coord_y-m_element_height-5,m_size_font+4,m_element_height-5,m_menu_col_bg,m_menu_col_font,m_menu_col_select,m_font,m_size_font,0,m_chart_id,m_window,m_corner))
{
Print(__FUNCTION__," Error in creation of menu button ",GetLastError());
delete button_up;
return(false);
}
Add(button_up);
if(m_element_quantity>m_element_max) button_up.FlagVisibility(OBJ_ALL_PERIODS); else button_up.FlagVisibility(OBJ_NO_PERIODS);
CControlElement *button_dn=new CControlElement;
if(!button_dn.CreateElement(OBJ_BUTTON,m_menu_name+"▼","▼",m_menu_coord_x+m_menu_width+m_width_scrolling_line-5-m_size_font-5,m_menu_coord_y-m_element_height*(m_element_max),m_size_font+4,m_element_height-5,m_menu_col_bg,m_menu_col_font,m_menu_col_select,m_font,m_size_font,0,m_chart_id,m_window,m_corner))
{
Print(__FUNCTION__," Error in creation of menu button ",GetLastError());
delete button_dn;
return(false);
}
Add(button_dn);
if(m_element_quantity>m_element_max) button_dn.FlagVisibility(OBJ_ALL_PERIODS); else button_dn.FlagVisibility(OBJ_NO_PERIODS);
return(true);
}
int CVertical_scrolled_menus :: SelectMuchElement(string name)
{
int prev_id_select=0;
CControlElement *element;
element=GetNodeAtIndex(1);
int coord_y=element.Coord_y()+1;
element.Coord_y(m_menu_coord_y);
for(int i=0;i<m_element_quantity;i++)
{
element=GetNodeAtIndex(i+2);
// if(name==m_element_text[i])
if(name==element.Name())
{
if(coord_y==element.Coord_y()) element.StateElement(element.StateElement()^true);
color cur_color=element.StateElement()? m_menu_col_select:m_menu_col_font;
element.Color(cur_color);
coord_y=element.Coord_y()-1;
element=GetNodeAtIndex(1);
element.Coord_y(coord_y);
element.Color(cur_color);
return(i);
}
}
return(-1);
}
int CVertical_scrolled_menus :: SelectOneElement(string name="")
{
int prev_id_select=0;
CControlElement *element;
element=GetNodeAtIndex(1);
element.Coord_y(m_menu_coord_y);
for(int i=0;i<m_element_quantity;i++)
{
element=GetNodeAtIndex(i+2);
if(element.StateElement())
{
prev_id_select=i+1;
if(name=="") name=element.Name();
break;
}
}
for(int i=0;i<m_element_quantity;i++)
{
element=GetNodeAtIndex(i+2);
// if(name==m_element_text[i])
if(name==element.Name())
{
element.StateElement(true);
element.Color(m_menu_col_select);
int coord_y=element.Coord_y()-1;
element=GetNodeAtIndex(1);
element.Coord_y(coord_y);
if(prev_id_select!=0 && prev_id_select!=i+1)
{
element=GetNodeAtIndex(prev_id_select+1);
element.StateElement(false);
element.Color(m_menu_col_font);
}
return(i);;
}
}
return(prev_id_select-1);
}
bool CVertical_scrolled_menus :: Scrolling(string button_scroll)
{
CControlElement *element;
if(button_scroll==m_menu_name+"scrolling_line")
{
element=GetNodeAtIndex(Total()-4);
element.State(false);
}
if(button_scroll==m_menu_name+"▲")
{
if(m_element_begin==0)
{
element=GetNodeAtIndex(Total()-2);
element.State(false);
element=GetPrevNode();
element.State(true);
return(true);
}
element=GetNodeAtIndex(m_element_begin+1);
element.Coord_y(m_menu_coord_y-m_element_height);
element.DisplayElement();
for(int i=0,lebel_y=m_menu_coord_y-2*m_element_height; i<m_element_max-1; i++)
{
element=GetNodeAtIndex(m_element_begin+i+2);
string name=element.Name();
element.Coord_y(lebel_y);
lebel_y-=m_element_height;
}
element=GetNodeAtIndex(m_element_begin+m_element_max+1);
element.Coord_y(m_menu_coord_y);
element.Hide();
m_element_begin--;
element=GetNodeAtIndex(Total()-2);
element.State(false);
element=GetPrevNode();
element.State(false);
return(true);
}
if(button_scroll==m_menu_name+"▼")
{
if(m_element_begin>=m_element_quantity-m_element_max)
{
element=GetNodeAtIndex(Total()-2);
element.State(true);
element=GetPrevNode();
element.State(false);
return(true);
}
element=GetNodeAtIndex(m_element_begin+2);
element.Coord_y(m_menu_coord_y);
element.Hide();
for(int i=1,lebel_y=m_menu_coord_y-m_element_height; i<m_element_max; i++)
{
element=GetNodeAtIndex(m_element_begin+i+2);
string name=element.Name();
element.Coord_y(lebel_y);
lebel_y-=m_element_height;
}
element=GetNodeAtIndex(m_element_begin+m_element_max+2);
element.Coord_y(m_menu_coord_y-m_menu_height+m_element_height*(2-m_save_buttom));
element.DisplayElement();
m_element_begin++;
element=GetNodeAtIndex(Total()-2);
element.State(false);
element=GetPrevNode();
element.State(false);
return(true);
}
// SelectOneElement();
return(true);
}
bool CVertical_scrolled_menus :: SynchronizationTradingTools()
{
Quantity(SymbolsTotal(true));
for(int j=0;j<SymbolsTotal(true);j++)
{
for(int pos=0;pos<SymbolsTotal(false);pos++) // loop on all symbols
{
CControlElement *element=GetNodeAtIndex(pos+2);
if(SymbolName(j,true)==element.Name())
{
Exchange(GetNodeAtIndex(pos+2),GetNodeAtIndex(j+2));
break;
}
}
}
return(true);
}