//+------------------------------------------------------------------+ //| WndContainer.mqh | //| Copyright 2015, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property strict #include "Controls\Button.mqh" #include "Controls\ButtonsGroup.mqh" #include "Controls\Calendar.mqh" #include "Controls\CheckBox.mqh" #include "Controls\ColorButton.mqh" #include "Controls\ColorPicker.mqh" #include "Controls\ComboBox.mqh" #include "Controls\ContextMenu.mqh" #include "Controls\DropCalendar.mqh" #include "Controls\FileNavigator.mqh" #include "Controls\Frame.mqh" #include "Controls\Graph.mqh" #include "Controls\ListView.mqh" #include "Controls\MenuBar.mqh" #include "Controls\MenuItem.mqh" #include "Controls\Picture.mqh" #include "Controls\PicturesSlider.mqh" #include "Controls\ProgressBar.mqh" #include "Controls\SeparateLine.mqh" #include "Controls\Slider.mqh" #include "Controls\SplitButton.mqh" #include "Controls\StandardChart.mqh" #include "Controls\StatusBar.mqh" #include "Controls\Table.mqh" #include "Controls\Tabs.mqh" #include "Controls\TextBox.mqh" #include "Controls\TextEdit.mqh" #include "Controls\TextLabel.mqh" #include "Controls\TimeEdit.mqh" #include "Controls\Tooltip.mqh" #include "Controls\TreeItem.mqh" #include "Controls\TreeView.mqh" #include "Controls\Window.mqh" //--- Резервный размер массивов #define RESERVE_SIZE_ARRAY 1000 //+------------------------------------------------------------------+ //| Класс для хранения всех объектов интерфейса | //+------------------------------------------------------------------+ class CWndContainer { private: //--- Счётчик элементов int m_counter_element_id; //--- protected: //--- Экземпляр класса для получения параметров мыши CMouse m_mouse; //--- Массив окон CWindow *m_windows[]; //--- Структура массивов элементов struct WindowElements { //--- Общий массив всех элементов CElement *m_elements[]; //--- Массив главных элементов CElement *m_main_elements[]; //--- Элементы с таймером CElement *m_timer_elements[]; //--- Видимые и доступные в данный момент элементы CElement *m_available_elements[]; //--- Элементы с авто-изменением размеров по оси X CElement *m_auto_x_resize_elements[]; //--- Элементы с авто-изменением размеров по оси Y CElement *m_auto_y_resize_elements[]; //--- Персональные массивы элементов: CContextMenu *m_context_menus[]; // Контекстные меню CComboBox *m_combo_boxes[]; // Комбо-боксы CSplitButton *m_split_buttons[]; // Сдвоенные кнопки CMenuBar *m_menu_bars[]; // Главные меню CMenuItem *m_menu_items[]; // Пункты меню CElementBase *m_drop_lists[]; // Выпадающие списки CElementBase *m_scrolls[]; // Полосы прокрутки CElementBase *m_tables[]; // Таблицы CTabs *m_tabs[]; // Вкладки CSlider *m_sliders[]; // Слайдеры CCalendar *m_calendars[]; // Календари CDropCalendar *m_drop_calendars[]; // Выпадающие календари CStandardChart *m_sub_charts[]; // Стандартные графики CTimeEdit *m_time_edits[]; // Элементы "Время" CTextBox *m_text_boxes[]; // Многострочные поля ввода CTreeView *m_treeview_lists[]; // Древовидные списки CFileNavigator *m_file_navigators[]; // Файловые навигаторы CTooltip *m_tooltips[]; // Всплывающие подсказки CPicturesSlider *m_pictures_slider[]; // Слайдеры картинок CFrame *m_frames[]; // Области }; //--- Массив массивов элементов для каждого окна WindowElements m_wnd[]; // void PrintContainer(void) { // string out = // " > m_elements (" + (string)ArraySize(m_wnd[0].m_elements) + ")\n" + // " > m_main_elements (" + (string)ArraySize(m_wnd[0].m_main_elements) + ")\n" + // // " > m_menu_bars (" + (string)ArraySize(m_wnd[0].m_menu_bars) + ")\n" + // " > m_menu_items (" + (string)ArraySize(m_wnd[0].m_menu_items) + ")\n" + // " > m_context_menus (" + (string)ArraySize(m_wnd[0].m_context_menus) + ")\n"; // // Print(__FUNCTION__, ":"); // Print(out); // } //--- public: CWndContainer(void); ~CWndContainer(void); //--- public: //--- Количество окон в интерфейсе int WindowsTotal(void) { return(::ArraySize(m_windows)); } //--- Количество всех элементов int ElementsTotal(const int window_index); //--- Количество главных элементов int MainElementsTotal(const int window_index); //--- Количество элементов с таймерами int TimerElementsTotal(const int window_index); //--- Количество элементов с авто-ресайзом по оси X int AutoXResizeElementsTotal(const int window_index); //--- Количество элементов с авто-ресайзом по оси Y int AutoYResizeElementsTotal(const int window_index); //--- Количество доступных в данный момент элементов int AvailableElementsTotal(const int window_index); //--- Количество элементов указанного типа int ElementsTotal(const int window_index,const ENUM_ELEMENT_TYPE type); //--- protected: //--- Добавляет указатель окна в базу элементов интерфейса void AddWindow(CWindow &object); //--- Добавляет указатель в массив элементов void AddToElementsArray(const int window_index,CElementBase &object); //--- Добавляет указатель в массив элементов с таймерами void AddTimerElement(const int window_index,CElement &object); //--- Добавляет указатель в массив элементов с авто-ресайзом по оси X void AddAutoXResizeElement(const int window_index,CElement &object); //--- Добавляет указатель в массив элементов с авто-ресайзом по оси Y void AddAutoYResizeElement(const int window_index,CElement &object); //--- Добавляет указатель в массив доступных на данный элементов void AddAvailableElement(const int window_index,CElement &object); //--- private: //--- Увеличивает массив на один элемент и возвращает последний индекс template int ResizeArray(T &array[]); //--- Шаблонный метод для добавления указателей в переданный по ссылке массив template void AddToPersonalArray(T1 &object,T2 &array[]); //--- private: //--- Проверка выхода из диапазона int CheckOutOfRange(const int window_index); //--- Сохраняет указатели на объекты окна bool AddWindowElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на элементы контекстного меню bool AddContextMenuElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на элементы главного меню bool AddMenuBarElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на элементы пункта меню bool AddMenuItemElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на элементы статусной строки bool AddStatusBarElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на элементы сдвоенной кнопки bool AddSplitButtonElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на элементы группы вкладок bool AddButtonsGroupElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на объекты списка bool AddListViewElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на объекты полосы прокрутки в базу bool AddScrollElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на элементы выпадающих списков (комбо-бокс) bool AddComboBoxElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на элементы кнопок для вызова цветовой палитры bool AddColorButtonElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на элементы таблицы bool AddTableElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на вкладки в персональный массив bool AddTabsElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на элементы календаря bool AddCalendarElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на элементы выпадающего календаря bool AddDropCalendarElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на элементы цветовой палитры bool AddColorPickersElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на элементы объектов-графиков bool AddSubChartsElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на элементы слайдеров картинок bool AddPicturesSliderElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на элементы "Время" bool AddTimeEditsElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на объекты многострочного поля ввода bool AddTextBoxElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на объекты текстового поля ввода bool AddTextEditElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на объекты слайдера bool AddSliderElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на элементы древовидных списков bool AddTreeViewListsElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на элементы навигатора bool AddFileNavigatorElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на элементы всплывающих подсказок bool AddTooltipElements(const int window_index,CElementBase &object); //--- Сохраняет указатели на элементы областей bool AddFrameElements(const int window_index,CElementBase &object); }; //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CWndContainer::CWndContainer(void) : m_counter_element_id(0) { } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CWndContainer::~CWndContainer(void) { } //+------------------------------------------------------------------+ //| Кол-во элементов по указанному индексу окна | //+------------------------------------------------------------------+ int CWndContainer::ElementsTotal(const int window_index) { int index=CheckOutOfRange(window_index); return((index!=WRONG_VALUE)? ::ArraySize(m_wnd[index].m_elements) : WRONG_VALUE); } //+------------------------------------------------------------------+ //| Кол-во главных элементов по указанному индексу окна | //+------------------------------------------------------------------+ int CWndContainer::MainElementsTotal(const int window_index) { int index=CheckOutOfRange(window_index); return((index!=WRONG_VALUE)? ::ArraySize(m_wnd[index].m_main_elements) : WRONG_VALUE); } //+------------------------------------------------------------------+ //| Кол-во элементов с таймерами по указанному индексу окна | //+------------------------------------------------------------------+ int CWndContainer::TimerElementsTotal(const int window_index) { int index=CheckOutOfRange(window_index); return((index!=WRONG_VALUE)? ::ArraySize(m_wnd[index].m_timer_elements) : WRONG_VALUE); } //+------------------------------------------------------------------+ //| Количество доступных в данный момент элементов | //+------------------------------------------------------------------+ int CWndContainer::AvailableElementsTotal(const int window_index) { int index=CheckOutOfRange(window_index); return((index!=WRONG_VALUE)? ::ArraySize(m_wnd[index].m_available_elements) : WRONG_VALUE); } //+------------------------------------------------------------------+ //| Кол-во элементов с авто-ресайзом (X) по указанному индексу окна | //+------------------------------------------------------------------+ int CWndContainer::AutoXResizeElementsTotal(const int window_index) { int index=CheckOutOfRange(window_index); return((index!=WRONG_VALUE)? ::ArraySize(m_wnd[index].m_auto_x_resize_elements) : WRONG_VALUE); } //+------------------------------------------------------------------+ //| Кол-во элементов с авто-ресайзом (Y) по указанному индексу окна | //+------------------------------------------------------------------+ int CWndContainer::AutoYResizeElementsTotal(const int window_index) { int index=CheckOutOfRange(window_index); return((index!=WRONG_VALUE)? ::ArraySize(m_wnd[index].m_auto_y_resize_elements) : WRONG_VALUE); } //+------------------------------------------------------------------+ //| Кол-во элементов по указанному индексу окна указанного типа | //+------------------------------------------------------------------+ int CWndContainer::ElementsTotal(const int window_index,const ENUM_ELEMENT_TYPE type) { //--- Проверка на выход из диапазона int index=CheckOutOfRange(window_index); if(index==WRONG_VALUE) return(WRONG_VALUE); //--- int elements_total=0; //--- switch(type) { case E_CONTEXT_MENU : elements_total=::ArraySize(m_wnd[index].m_context_menus); break; case E_COMBO_BOX : elements_total=::ArraySize(m_wnd[index].m_combo_boxes); break; case E_SPLIT_BUTTON : elements_total=::ArraySize(m_wnd[index].m_split_buttons); break; case E_MENU_BAR : elements_total=::ArraySize(m_wnd[index].m_menu_bars); break; case E_MENU_ITEM : elements_total=::ArraySize(m_wnd[index].m_menu_items); break; case E_DROP_LIST : elements_total=::ArraySize(m_wnd[index].m_drop_lists); break; case E_SCROLL : elements_total=::ArraySize(m_wnd[index].m_scrolls); break; case E_TABLE : elements_total=::ArraySize(m_wnd[index].m_tables); break; case E_TABS : elements_total=::ArraySize(m_wnd[index].m_tabs); break; case E_SLIDER : elements_total=::ArraySize(m_wnd[index].m_sliders); break; case E_CALENDAR : elements_total=::ArraySize(m_wnd[index].m_calendars); break; case E_DROP_CALENDAR : elements_total=::ArraySize(m_wnd[index].m_drop_calendars); break; case E_SUB_CHART : elements_total=::ArraySize(m_wnd[index].m_sub_charts); break; case E_PICTURES_SLIDER : elements_total=::ArraySize(m_wnd[index].m_pictures_slider); break; case E_TIME_EDIT : elements_total=::ArraySize(m_wnd[index].m_time_edits); break; case E_TEXT_BOX : elements_total=::ArraySize(m_wnd[index].m_text_boxes); break; case E_TREE_VIEW : elements_total=::ArraySize(m_wnd[index].m_treeview_lists); break; case E_FILE_NAVIGATOR : elements_total=::ArraySize(m_wnd[index].m_file_navigators); break; case E_TOOLTIP : elements_total=::ArraySize(m_wnd[index].m_tooltips); break; case E_FRAME : elements_total=::ArraySize(m_wnd[index].m_frames); break; } //--- Вернуть количество элементов указанного типа return(elements_total); } //+------------------------------------------------------------------+ //| Добавляет указатель окна в базу элементов интерфейса | //+------------------------------------------------------------------+ void CWndContainer::AddWindow(CWindow &object) { int windows_total=::ArraySize(m_windows); //--- Если окон ещё нет, обнулим счётчик элементов if(windows_total<1) { m_counter_element_id=0; ::Comment("Loading. Please wait..."); } //--- Добавим указатель в массив окон int new_size=windows_total+1; ::ArrayResize(m_wnd,new_size); ::ArrayResize(m_windows,new_size); m_windows[windows_total]=::GetPointer(object); //--- Добавим указатель в общий массив элементов int last_index=ResizeArray(m_wnd[windows_total].m_elements); m_wnd[windows_total].m_elements[last_index]=::GetPointer(object); //--- Добавим в базу указатели кнопок окна AddWindowElements(windows_total,object); //--- Установим идентификатор и запомним id последнего элемента m_windows[windows_total].Id(m_counter_element_id); m_windows[windows_total].LastId(m_counter_element_id); //--- Увеличим счётчик идентификаторов элементов m_counter_element_id++; } //+------------------------------------------------------------------+ //| Добавляет указатель в массив элементов | //+------------------------------------------------------------------+ void CWndContainer::AddToElementsArray(const int window_index,CElementBase &object) { int windows_total=::ArraySize(m_windows); //--- Если в базе нет форм для элементов управления if(windows_total<1) { ::Print(__FUNCTION__," > Перед созданием элемента управления нужно создать форму " "и добавить её в базу с помощью метода CWndContainer::AddWindow(CWindow &object)."); return; } //--- Если запрос на несуществующую форму if(window_index>=windows_total) { ::Print(PREVENTING_OUT_OF_RANGE," window_index: ",window_index,"; windows total: ",windows_total); return; } //--- Добавим в общий массив элементов int last_index=ResizeArray(m_wnd[window_index].m_elements); m_wnd[window_index].m_elements[last_index]=::GetPointer(object); //--- Добавим в массив главных элементов last_index=ResizeArray(m_wnd[window_index].m_main_elements); m_wnd[window_index].m_main_elements[last_index]=::GetPointer(object); //--- Запомним во всех формах id последнего элемента for(int w=0; w=array_size)? array_size-1 : window_index; //--- Вернуть индекс окна return(index); } //+------------------------------------------------------------------+ //| Сохраняет указатели на объекты окна | //+------------------------------------------------------------------+ bool CWndContainer::AddWindowElements(const int window_index,CElementBase &object) { //--- Выйдем, если это не текстовое поле ввода if(dynamic_cast(&object)==NULL) return(false); //--- Получим указатель на элемент CWindow *wnd=::GetPointer(object); //--- Сохраним указатель мыши object.MousePointer(m_mouse); //--- for(int i=0; i<4; i++) { CButton *ib=NULL; //--- if(i==0) ib=wnd.GetCloseButtonPointer(); else if(i==1) ib=wnd.GetFullscreenButtonPointer(); else if(i==2) ib=wnd.GetCollapseButtonPointer(); else if(i==3) ib=wnd.GetTooltipButtonPointer(); //--- Увеличение массива элементов int last_index=ResizeArray(m_wnd[window_index].m_elements); //--- Добавим кнопку закрытия в базу m_wnd[window_index].m_elements[last_index]=ib; //--- Сохраним указатель мыши ib.MousePointer(m_mouse); } return(true); } //+------------------------------------------------------------------+ //| Сохраняет указатели на объекты контекстного меню | //+------------------------------------------------------------------+ bool CWndContainer::AddContextMenuElements(const int window_index,CElementBase &object) { //--- Выйдем, если это не контекстное меню if(dynamic_cast(&object)==NULL) return(false); //--- Получим указатель на контекстное меню CContextMenu *cm=::GetPointer(object); //--- Сохраним указатели на его объекты в базе int items_total=cm.ItemsTotal(); for(int i=0; i(&object)==NULL) return(false); //--- Получим указатель на главное меню CMenuBar *mb=::GetPointer(object); //--- Сохраним указатели на его объекты в базе int items_total=mb.ItemsTotal(); for(int i=0; i(&object)==NULL) return(false); //--- Получим указатель на пункт меню CMenuItem *mi=::GetPointer(object); //--- Добавим указатель в персональный массив AddToPersonalArray(mi,m_wnd[window_index].m_menu_items); return(true); } //+------------------------------------------------------------------+ //| Сохраняет указатели на объекты сдвоенной кнопки | //+------------------------------------------------------------------+ bool CWndContainer::AddSplitButtonElements(const int window_index,CElementBase &object) { //--- Выйдем, если это не сдвоенная кнопка if(dynamic_cast(&object)==NULL) return(false); //--- Получим указатель на сдвоенную кнопку CSplitButton *sb=::GetPointer(object); //--- for(int i=0; i<3; i++) { //--- Увеличение массива элементов int last_index=ResizeArray(m_wnd[window_index].m_elements); //--- Сохраняем указатель в массив if(i==0) { m_wnd[window_index].m_elements[last_index]=sb.GetButtonPointer(); } else if(i==1) { m_wnd[window_index].m_elements[last_index]=sb.GetDropButtonPointer(); } else if(i==2) { CContextMenu *cm=sb.GetContextMenuPointer(); m_wnd[window_index].m_elements[last_index]=cm; //--- Добавим элементы контекстного меню AddContextMenuElements(window_index,cm); } } //--- Добавим указатель в персональный массив AddToPersonalArray(sb,m_wnd[window_index].m_split_buttons); return(true); } //+------------------------------------------------------------------+ //| Сохраняет указатели на элементы статусной строки | //+------------------------------------------------------------------+ bool CWndContainer::AddStatusBarElements(const int window_index,CElementBase &object) { //--- Выйдем, если это не пункт if(dynamic_cast(&object)==NULL) return(false); //--- Получим указатель на пункт CStatusBar *sb=::GetPointer(object); //--- Добавим пункты в базу int items_total=sb.ItemsTotal(); for(int i=0; i(&object)==NULL) return(false); //--- Получим указатель на список CButtonsGroup *bg=::GetPointer(object); //--- Добавим кнопки в базу int buttons_total=bg.ButtonsTotal(); for(int i=0; i(&object)==NULL) return(false); //--- Получим указатель на список CListView *lv=::GetPointer(object); //--- Сохраним указатели на объекты полосы прокрутки CScrollV *sv=lv.GetScrollVPointer(); AddScrollElements(window_index,sv); return(true); } //+------------------------------------------------------------------+ //| Сохраняет указатели на объекты полосы прокрутки | //+------------------------------------------------------------------+ bool CWndContainer::AddScrollElements(const int window_index,CElementBase &object) { //--- Выйдем, если это не список if(dynamic_cast(&object)==NULL) return(false); //--- Получим указатель на полосу прокрутки CScroll *sc=::GetPointer(object); //--- Сохраняем указатель в массив int last_index=ResizeArray(m_wnd[window_index].m_elements); m_wnd[window_index].m_elements[last_index]=sc; //--- for(int i=0; i<2; i++) { //--- Получим указатель кнопки полосы прокрутки CButton *ib=(i<1)? sc.GetIncButtonPointer() : sc.GetDecButtonPointer(); //--- Сохраняем указатель в массив last_index=ResizeArray(m_wnd[window_index].m_elements); m_wnd[window_index].m_elements[last_index]=ib; } //--- Добавим указатель в персональный массив AddToPersonalArray(sc,m_wnd[window_index].m_scrolls); return(true); } //+------------------------------------------------------------------+ //| Сохраняет указатель на выпадающий список в персональный массив | //+------------------------------------------------------------------+ bool CWndContainer::AddComboBoxElements(const int window_index,CElementBase &object) { //--- Выйдем, если это не комбобокс if(dynamic_cast(&object)==NULL) return(false); //--- Получим указатель на комбо-бокс CComboBox *cb=::GetPointer(object); //--- for(int i=0; i<2; i++) { //--- Увеличение массива элементов int last_index=ResizeArray(m_wnd[window_index].m_elements); //--- Добавим кнопку в базу if(i==0) { m_wnd[window_index].m_elements[last_index]=cb.GetButtonPointer(); } //--- Добавим список в базу else if(i==1) { CListView *lv=cb.GetListViewPointer(); m_wnd[window_index].m_elements[last_index]=lv; //--- Сохраним указатели на объекты списка AddListViewElements(window_index,lv); //--- Добавим указатель в персональный массив AddToPersonalArray(lv,m_wnd[window_index].m_drop_lists); } } //--- Добавим указатель в персональный массив AddToPersonalArray(cb,m_wnd[window_index].m_combo_boxes); return(true); } //+------------------------------------------------------------------+ //| Сохраняет указатель на элементы цветовой кнопки | //+------------------------------------------------------------------+ bool CWndContainer::AddColorButtonElements(const int window_index,CElementBase &object) { //--- Выйдем, если это не комбобокс if(dynamic_cast(&object)==NULL) return(false); //--- Получим указатель на кнопку CColorButton *cb=::GetPointer(object); //--- Сохраняем указатель в массив int last_index=ResizeArray(m_wnd[window_index].m_elements); m_wnd[window_index].m_elements[last_index]=cb.GetButtonPointer(); return(true); } //+------------------------------------------------------------------+ //| Сохраняет указатели на элементы таблицы | //+------------------------------------------------------------------+ bool CWndContainer::AddTableElements(const int window_index,CElementBase &object) { //--- Выйдем, если это не нарисованная таблица if(dynamic_cast(&object)==NULL) return(false); //--- Получим указатель на нарисованную таблицу CTable *tbl=::GetPointer(object); //--- for(int i=0; i<2; i++) { int last_index=ResizeArray(m_wnd[window_index].m_elements); //--- if(i==0) { //--- Сохраняем указатель в массив CScrollV *sv=tbl.GetScrollVPointer(); m_wnd[window_index].m_elements[last_index]=sv; //--- Сохраним указатели на объекты полосы прокрутки AddScrollElements(window_index,sv); //--- Добавим указатель в персональный массив AddToPersonalArray(sv,m_wnd[window_index].m_scrolls); } else if(i==1) { //--- Сохраняем указатель в массив CScrollH *sh=tbl.GetScrollHPointer(); m_wnd[window_index].m_elements[last_index]=sh; //--- Сохраним указатели на объекты полосы прокрутки AddScrollElements(window_index,sh); //--- Добавим указатель в персональный массив AddToPersonalArray(sh,m_wnd[window_index].m_scrolls); } } //--- Если есть поле ввода if(tbl.HasEditElements()) { int last_index=ResizeArray(m_wnd[window_index].m_elements); //--- Сохраняем указатель в массив CTextEdit *te=tbl.GetTextEditPointer(); m_wnd[window_index].m_elements[last_index]=te; //--- Сохраним указатели на объекты AddTextEditElements(window_index,te); } //--- Если есть комбо-бокс if(tbl.HasComboboxElements()) { int last_index=ResizeArray(m_wnd[window_index].m_elements); //--- Сохраняем указатель в массив CComboBox *cb=tbl.GetComboboxPointer(); m_wnd[window_index].m_elements[last_index]=cb; //--- Сохраним указатели на объекты AddComboBoxElements(window_index,cb); } //--- Добавим указатель в персональный массив AddToPersonalArray(tbl,m_wnd[window_index].m_tables); return(true); } //+------------------------------------------------------------------+ //| Сохраняет указатели на вкладки в персональный массив | //+------------------------------------------------------------------+ bool CWndContainer::AddTabsElements(const int window_index,CElementBase &object) { //--- Выйдем, если это не вкладки if(dynamic_cast(&object)==NULL) return(false); //--- Получим указатель на элемент "Вкладки" CTabs *tabs=::GetPointer(object); //--- Сохраняем указатель в массив int last_index=ResizeArray(m_wnd[window_index].m_elements); CButtonsGroup *bg=tabs.GetButtonsGroupPointer(); m_wnd[window_index].m_elements[last_index]=bg; //--- Сохраним указатели на кнопки группы AddButtonsGroupElements(window_index,bg); //--- Добавим указатель в персональный массив AddToPersonalArray(tabs,m_wnd[window_index].m_tabs); return(true); } //+------------------------------------------------------------------+ //| Сохраняет указатели на объекты календаря | //+------------------------------------------------------------------+ bool CWndContainer::AddCalendarElements(const int window_index,CElementBase &object) { //--- Выйдем, если это не календарь if(dynamic_cast(&object)==NULL) return(false); //--- Получим указатель на элемент "Календарь" CCalendar *cal=::GetPointer(object); //--- for(int i=0; i<6; i++) { int last_index=ResizeArray(m_wnd[window_index].m_elements); //--- switch(i) { case 0 : { m_wnd[window_index].m_elements[last_index]=cal.GetMonthDecPointer(); break; } case 1 : { m_wnd[window_index].m_elements[last_index]=cal.GetMonthIncPointer(); break; } case 2 : { CComboBox *cb=cal.GetComboBoxPointer(); m_wnd[window_index].m_elements[last_index]=cb; //--- Добавить элементы комбо-бокса AddComboBoxElements(window_index,cb); break; } case 3 : { CTextEdit *te=cal.GetSpinEditPointer(); m_wnd[window_index].m_elements[last_index]=te; //--- Добавить элементы поля ввода AddTextEditElements(window_index,te); break; } case 4 : { CButtonsGroup *bg=cal.GetDayButtonsPointer(); m_wnd[window_index].m_elements[last_index]=bg; //--- Сохраним указатели на кнопки группы AddButtonsGroupElements(window_index,bg); break; } case 5 : { m_wnd[window_index].m_elements[last_index]=cal.GetTodayButtonPointer(); break; } } } //--- Добавим указатель в персональный массив AddToPersonalArray(cal,m_wnd[window_index].m_calendars); return(true); } //+------------------------------------------------------------------+ //| Сохраняет указатели на объекты выпадающего календаря | //+------------------------------------------------------------------+ bool CWndContainer::AddDropCalendarElements(const int window_index,CElementBase &object) { //--- Выйдем, если это не выпадающий календарь if(dynamic_cast(&object)==NULL) return(false); //--- Получим указатель на элемент "Выпадающий календарь" CDropCalendar *dc=::GetPointer(object); //--- for(int i=0; i<3; i++) { //--- Увеличение массива элементов int last_index=ResizeArray(m_wnd[window_index].m_elements); //--- if(i==0) { //--- Сохраняем указатель в массив CTextEdit *te=dc.GetTextEditPointer(); m_wnd[window_index].m_elements[last_index]=te; //--- Добавить элементы календаря AddTextEditElements(window_index,te); } else if(i==1) { m_wnd[window_index].m_elements[last_index]=dc.GetDropButtonPointer(); } else if(i==2) { //--- Сохраняем указатель в массив CCalendar *cal=dc.GetCalendarPointer(); m_wnd[window_index].m_elements[last_index]=cal; //--- Добавить элементы календаря AddCalendarElements(window_index,cal); } } //--- Добавим указатель в персональный массив AddToPersonalArray(dc,m_wnd[window_index].m_drop_calendars); return(true); } //+------------------------------------------------------------------+ //| Сохраняет указатели на элементы цветовой палитры | //+------------------------------------------------------------------+ bool CWndContainer::AddColorPickersElements(const int window_index,CElementBase &object) { //--- Выйдем, если это не цветовая палитра if(dynamic_cast(&object)==NULL) return(false); //--- Получим указатель на элемент CColorPicker *cp=::GetPointer(object); //--- for(int i=0; i<12; i++) { int last_index=ResizeArray(m_wnd[window_index].m_elements); //--- if(i<1) { //--- Сохраняем указатель в массив CButtonsGroup *bg=cp.GetRadioButtonsPointer(); m_wnd[window_index].m_elements[last_index]=bg; //--- Добавить кнопки группы AddButtonsGroupElements(window_index,bg); } else if(i>0 && i<10) { //--- Сохраняем указатель в массив CTextEdit *se=cp.GetSpinEditPointer(i-1); m_wnd[window_index].m_elements[last_index]=se; //--- Добавить элементы поля ввода AddTextEditElements(window_index,se); } else if(i>9) { CButton *ib=cp.GetButtonPointer(i-10); m_wnd[window_index].m_elements[last_index]=ib; } } //--- return(true); } //+------------------------------------------------------------------+ //| Сохраняет указатель на стандартные графики в персональный массив | //+------------------------------------------------------------------+ bool CWndContainer::AddSubChartsElements(const int window_index,CElementBase &object) { //--- Выйдем, если это не стандартный график if(dynamic_cast(&object)==NULL) return(false); //--- Получим указатель на стандартный график CStandardChart *sc=::GetPointer(object); //--- Добавим указатель в персональный массив AddToPersonalArray(sc,m_wnd[window_index].m_sub_charts); return(true); } //+------------------------------------------------------------------+ //| Сохраняет указатель на слайдеры картинок в персональный массив | //+------------------------------------------------------------------+ bool CWndContainer::AddPicturesSliderElements(const int window_index,CElementBase &object) { //--- Выйдем, если это не слайдер картинок if(dynamic_cast(&object)==NULL) return(false); //--- Получим указатель на слайдер картинок CPicturesSlider *ps=::GetPointer(object); //--- Добавим кнопки в базу int picturs_total=ps.PicturesTotal(); for(int i=0; i(&object)==NULL) return(false); //--- Получим указатель на элемент "Время" CTimeEdit *te=::GetPointer(object); for(int i=0; i<2; i++) { int last_index=ResizeArray(m_wnd[window_index].m_elements); //--- if(i==0) { //--- Сохраняем указатель в массив CTextEdit *se=te.GetMinutesEditPointer(); m_wnd[window_index].m_elements[last_index]=se; //--- Сохраним указатели на объекты текстового поля ввода AddTextEditElements(window_index,se); } else { //--- Сохраняем указатель в массив CTextEdit *se=te.GetHoursEditPointer(); m_wnd[window_index].m_elements[last_index]=se; //--- Сохраним указатели на объекты текстового поля ввода AddTextEditElements(window_index,se); } } //--- Добавим указатель в персональный массив AddToPersonalArray(te,m_wnd[window_index].m_time_edits); return(true); } //+------------------------------------------------------------------+ //| Сохраняет указатели на объекты многострочного поля ввода | //+------------------------------------------------------------------+ bool CWndContainer::AddTextBoxElements(const int window_index,CElementBase &object) { //--- Выйдем, если это не многострочное поле ввода if(dynamic_cast(&object)==NULL) return(false); //--- Получим указатель на элемент CTextBox *tb=::GetPointer(object); //--- Добавим указатель в персональный массив AddToPersonalArray(tb,m_wnd[window_index].m_text_boxes); //--- if(!tb.MultiLineMode()) return(true); //--- for(int i=0; i<2; i++) { int last_index=ResizeArray(m_wnd[window_index].m_elements); //--- if(i==0) { //--- Получим указатель полосы прокрутки CScrollV *sv=tb.GetScrollVPointer(); m_wnd[window_index].m_elements[last_index]=sv; //--- Сохраним указатели на объекты полосы прокрутки AddScrollElements(window_index,sv); //--- Добавим указатель в персональный массив AddToPersonalArray(sv,m_wnd[window_index].m_scrolls); } else if(i==1) { CScrollH *sh=tb.GetScrollHPointer(); m_wnd[window_index].m_elements[last_index]=sh; //--- Сохраним указатели на объекты полосы прокрутки AddScrollElements(window_index,sh); //--- Добавим указатель в персональный массив AddToPersonalArray(sh,m_wnd[window_index].m_scrolls); } } return(true); } //+------------------------------------------------------------------+ //| Сохраняет указатели на объекты текстового поля ввода | //+------------------------------------------------------------------+ bool CWndContainer::AddTextEditElements(const int window_index,CElementBase &object) { //--- Выйдем, если это не текстовое поле ввода if(dynamic_cast(&object)==NULL) return(false); //--- Получим указатель на элемент CTextEdit *te=::GetPointer(object); //--- Увеличение массива элементов int last_index=ResizeArray(m_wnd[window_index].m_elements); //--- Получим указатель поля ввода CTextBox *tb=te.GetTextBoxPointer(); m_wnd[window_index].m_elements[last_index]=tb; //--- Добавим указатель в персональный массив AddToPersonalArray(tb,m_wnd[window_index].m_text_boxes); //--- Выйти, если кнопки отключены if(!te.SpinEditMode()) return(true); //--- for(int i=0; i<2; i++) { //--- Увеличение массива элементов last_index=ResizeArray(m_wnd[window_index].m_elements); //--- Добавим кнопку в базу if(i==0) m_wnd[window_index].m_elements[last_index]=te.GetIncButtonPointer(); else if(i==1) m_wnd[window_index].m_elements[last_index]=te.GetDecButtonPointer(); } //--- return(true); } //+------------------------------------------------------------------+ //| Сохраняет указатели на элементы слайдера | //+------------------------------------------------------------------+ bool CWndContainer::AddSliderElements(const int window_index,CElementBase &object) { //--- Выйдем, если это не слайдер if(dynamic_cast(&object)==NULL) return(false); //--- Получим указатель на элемент CSlider *ns=::GetPointer(object); //--- Увеличение массива элементов int last_index=ResizeArray(m_wnd[window_index].m_elements); //--- Получим указатель поля ввода CTextEdit *te=ns.GetRightEditPointer(); m_wnd[window_index].m_elements[last_index]=te; //--- Сохраним указатели на элементы поля ввода AddTextEditElements(window_index,te); //--- if(ns.DualSliderMode()) { //--- Увеличение массива элементов last_index=ResizeArray(m_wnd[window_index].m_elements); //--- Получим указатель поля ввода te=ns.GetLeftEditPointer(); m_wnd[window_index].m_elements[last_index]=te; //--- Сохраним указатели на элементы поля ввода AddTextEditElements(window_index,te); } //--- Добавим указатель в персональный массив AddToPersonalArray(ns,m_wnd[window_index].m_sliders); return(true); } //+------------------------------------------------------------------+ //| Сохраняет указатель на подсказку в персональный массив | //+------------------------------------------------------------------+ bool CWndContainer::AddTooltipElements(const int window_index,CElementBase &object) { //--- Выйдем, если это не всплывающая подсказка if(dynamic_cast(&object)==NULL) return(false); //--- Получим указатель на всплывающую подсказку CTooltip *t=::GetPointer(object); //--- Добавим указатель в персональный массив AddToPersonalArray(t,m_wnd[window_index].m_tooltips); return(true); } //+------------------------------------------------------------------+ //| Сохраняет указатели на элементы древовидного списка | //+------------------------------------------------------------------+ bool CWndContainer::AddTreeViewListsElements(const int window_index,CElementBase &object) { //--- Выйдем, если это не древовидный список if(dynamic_cast(&object)==NULL) return(false); //--- Получим указатель на элемент "Древовидный список" CTreeView *tv=::GetPointer(object); //--- Добавим указатель в персональный массив AddToPersonalArray(tv,m_wnd[window_index].m_treeview_lists); //--- Последний индекс int last_index=0; //--- for(int i=0; i<4; i++) { if(i==3 && !tv.ShowItemContent()) break; //--- if(i>1) { last_index=ResizeArray(m_wnd[window_index].m_elements); } //--- switch(i) { case 0 : { for(int j=0; j(&object)==NULL) return(false); //--- Получим указатель файлового навигатора CFileNavigator *fn=::GetPointer(object); //--- Добавим указатель в персональный массив AddToPersonalArray(fn,m_wnd[window_index].m_file_navigators); //--- Сохраним указатель на древовидный список int last_index=ResizeArray(m_wnd[window_index].m_elements); m_wnd[window_index].m_elements[last_index]=fn.GetTreeViewPointer(); //--- Добавить элементы древовидного списка AddTreeViewListsElements(window_index,fn.GetTreeViewPointer()); return(true); } //+------------------------------------------------------------------+ //| Сохраняет указатели на вкладки в персональный массив | //+------------------------------------------------------------------+ bool CWndContainer::AddFrameElements(const int window_index,CElementBase &object) { //--- Выйдем, если это не область if(dynamic_cast(&object)==NULL) return(false); //--- Получим указатель на элемент "Область" CFrame *frame=::GetPointer(object); //--- Добавим указатель в персональный массив AddToPersonalArray(frame,m_wnd[window_index].m_frames); //--- Сохраняем указатель в массив int last_index=ResizeArray(m_wnd[window_index].m_elements); m_wnd[window_index].m_elements[last_index]=frame.GetTextLabelPointer(); return(true); } //+------------------------------------------------------------------+ //| Увеличивает массив на один элемент и возвращает последний индекс | //+------------------------------------------------------------------+ template int CWndContainer::ResizeArray(T &array[]) { int size=::ArraySize(array); ::ArrayResize(array,size+1,RESERVE_SIZE_ARRAY); return(size); } //+------------------------------------------------------------------+ //| Сохраняет указатель (T1) в переданный по ссылке массив (T2) | //+------------------------------------------------------------------+ template void CWndContainer::AddToPersonalArray(T1 &object,T2 &array[]) { int last_index=ResizeArray(array); array[last_index]=object; } //+------------------------------------------------------------------+