EasyAndFastMod/WndContainer.mqh
2026-01-15 07:23:17 -05:00

1322 lines
113 KiB
MQL5

//+------------------------------------------------------------------+
//| 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<typename T>
int ResizeArray(T &array[]);
//--- Шаблонный метод для добавления указателей в переданный по ссылке массив
template<typename T1,typename T2>
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<windows_total; w++)
m_windows[w].LastId(m_counter_element_id);
//--- Увеличим счётчик идентификаторов элементов
m_counter_element_id++;
//--- Сохраняет указатели на объекты контекстного меню
if(AddContextMenuElements(window_index,object))
return;
//--- Сохраняет указатели на объекты главного меню
if(AddMenuBarElements(window_index,object))
return;
//--- Сохраняет указатель на пункт меню
if(AddMenuItemElements(window_index,object))
return;
//--- Сохраняет указатели на объекты пункта
if(AddStatusBarElements(window_index,object))
return;
//--- Сохраняет указатели на объекты сдвоенной кнопки
if(AddSplitButtonElements(window_index,object))
return;
//--- Сохраняет указатели на объекты группы кнопок
if(AddButtonsGroupElements(window_index,object))
return;
//--- Сохраняет указатели на объекты списка в базу
if(AddListViewElements(window_index,object))
return;
//--- Сохраняет указатели на объекты элемента комбо-бокса
if(AddComboBoxElements(window_index,object))
return;
//--- Сохраняет указатели на объекты элемента кнопки для вызова цветовой палитры
if(AddColorButtonElements(window_index,object))
return;
//--- Сохраняет указатели на элементы таблицы
if(AddTableElements(window_index,object))
return;
//--- Сохраняет указатели на элементы вкладок
if(AddTabsElements(window_index,object))
return;
//--- Сохраняет указатели на элементы календаря
if(AddCalendarElements(window_index,object))
return;
//--- Сохраняет указатели на элементы выпадающего календаря
if(AddDropCalendarElements(window_index,object))
return;
//--- Сохраняет указатели на элементы цветовой палитры
if(AddColorPickersElements(window_index,object))
return;
//--- Сохраняет указатели на элементы стандартных графиков
if(AddSubChartsElements(window_index,object))
return;
//--- Сохраняет указатели на элементы слайдеров картинок
if(AddPicturesSliderElements(window_index,object))
return;
//--- Сохраняет указатели на элементы "Время"
if(AddTimeEditsElements(window_index,object))
return;
//--- Сохраняет указатели на элементы многострочного поля ввода
if(AddTextBoxElements(window_index,object))
return;
//--- Сохраняет указатели на элементы текстового поля ввода
if(AddTextEditElements(window_index,object))
return;
//--- Сохраняет указатели на элементы слайдера
if(AddSliderElements(window_index,object))
return;
//--- Сохраняет указатели на элементы древовидных списков
if(AddTreeViewListsElements(window_index,object))
return;
//--- Сохраняет указатели на элементы файлового навигатора
if(AddFileNavigatorElements(window_index,object))
return;
//--- Сохраняет указатели на объекты всплывающей подсказки
if(AddTooltipElements(window_index,object))
return;
//--- Сохраняет указатели на элементы областей
if(AddFrameElements(window_index,object))
return;
}
//+------------------------------------------------------------------+
//| Добавляет указатель в массив элементов с таймерами |
//+------------------------------------------------------------------+
void CWndContainer::AddTimerElement(const int window_index,CElement &object)
{
int last_index=ResizeArray(m_wnd[window_index].m_timer_elements);
m_wnd[window_index].m_timer_elements[last_index]=::GetPointer(object);
}
//+------------------------------------------------------------------+
//| Добавляет указатель в массив элементов с авто-ресайзом (X) |
//+------------------------------------------------------------------+
void CWndContainer::AddAutoXResizeElement(const int window_index,CElement &object)
{
int last_index=ResizeArray(m_wnd[window_index].m_auto_x_resize_elements);
m_wnd[window_index].m_auto_x_resize_elements[last_index]=::GetPointer(object);
}
//+------------------------------------------------------------------+
//| Добавляет указатель в массив элементов с авто-ресайзом (Y) |
//+------------------------------------------------------------------+
void CWndContainer::AddAutoYResizeElement(const int window_index,CElement &object)
{
int last_index=ResizeArray(m_wnd[window_index].m_auto_y_resize_elements);
m_wnd[window_index].m_auto_y_resize_elements[last_index]=::GetPointer(object);
}
//+------------------------------------------------------------------+
//| Добавляет указатель в массив доступных элементов |
//+------------------------------------------------------------------+
void CWndContainer::AddAvailableElement(const int window_index,CElement &object)
{
int last_index=ResizeArray(m_wnd[window_index].m_available_elements);
m_wnd[window_index].m_available_elements[last_index]=::GetPointer(object);
}
//+------------------------------------------------------------------+
//| Корректировка индекса окна в случае выхода из диапазона |
//+------------------------------------------------------------------+
int CWndContainer::CheckOutOfRange(const int window_index)
{
int array_size=::ArraySize(m_wnd);
if(array_size<1)
{
::Print(PREVENTING_OUT_OF_RANGE);
return(WRONG_VALUE);
}
//--- Корректировка в случае выхода из диапазона
int index=(window_index>=array_size)? array_size-1 : window_index;
//--- Вернуть индекс окна
return(index);
}
//+------------------------------------------------------------------+
//| Сохраняет указатели на объекты окна |
//+------------------------------------------------------------------+
bool CWndContainer::AddWindowElements(const int window_index,CElementBase &object)
{
//--- Выйдем, если это не текстовое поле ввода
if(dynamic_cast<CWindow *>(&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<CContextMenu *>(&object)==NULL)
return(false);
//--- Получим указатель на контекстное меню
CContextMenu *cm=::GetPointer(object);
//--- Сохраним указатели на его объекты в базе
int items_total=cm.ItemsTotal();
for(int i=0; i<items_total; i++)
{
//--- Сохраняем указатель в массив
int last_index=ResizeArray(m_wnd[window_index].m_elements);
m_wnd[window_index].m_elements[last_index]=cm.GetItemPointer(i);
}
//--- Сохраним указатели на разделительные линии
int lines_total=cm.SeparateLinesTotal();
for(int i=0; i<lines_total; i++)
{
//--- Сохраняем указатель в массив
int last_index=ResizeArray(m_wnd[window_index].m_elements);
m_wnd[window_index].m_elements[last_index]=cm.GetSeparateLinePointer(i);
}
//--- Добавим указатель в персональный массив
AddToPersonalArray(cm,m_wnd[window_index].m_context_menus);
return(true);
}
//+------------------------------------------------------------------+
//| Сохраняет указатели на объекты главного меню |
//+------------------------------------------------------------------+
bool CWndContainer::AddMenuBarElements(const int window_index,CElementBase &object)
{
//--- Выйдем, если это не главное меню
if(dynamic_cast<CMenuBar *>(&object)==NULL)
return(false);
//--- Получим указатель на главное меню
CMenuBar *mb=::GetPointer(object);
//--- Сохраним указатели на его объекты в базе
int items_total=mb.ItemsTotal();
for(int i=0; i<items_total; i++)
{
//--- Сохраняем указатель в массив
int last_index=ResizeArray(m_wnd[window_index].m_elements);
m_wnd[window_index].m_elements[last_index]=mb.GetItemPointer(i);
}
//--- Добавим указатель в персональный массив
AddToPersonalArray(mb,m_wnd[window_index].m_menu_bars);
return(true);
}
//+------------------------------------------------------------------+
//| Сохраняет указатели на пункты меню |
//+------------------------------------------------------------------+
bool CWndContainer::AddMenuItemElements(const int window_index,CElementBase &object)
{
//--- Выйдем, если это не пункт меню
if(dynamic_cast<CMenuItem *>(&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<CSplitButton *>(&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<CStatusBar *>(&object)==NULL)
return(false);
//--- Получим указатель на пункт
CStatusBar *sb=::GetPointer(object);
//--- Добавим пункты в базу
int items_total=sb.ItemsTotal();
for(int i=0; i<items_total; i++)
{
//--- Сохраняем указатель в массив
int last_index=ResizeArray(m_wnd[window_index].m_elements);
m_wnd[window_index].m_elements[last_index]=sb.GetItemPointer(i);
}
//--- Сохраним указатели на разделительные линии
int lines_total=sb.SeparateLinesTotal();
for(int i=0; i<lines_total; i++)
{
int last_index=ResizeArray(m_wnd[window_index].m_elements);
m_wnd[window_index].m_elements[last_index]=sb.GetSeparateLinePointer(i);
}
return(true);
}
//+------------------------------------------------------------------+
//| Сохраняет указатели на объекты группы кнопок |
//+------------------------------------------------------------------+
bool CWndContainer::AddButtonsGroupElements(const int window_index,CElementBase &object)
{
//--- Выйдем, если это не список
if(dynamic_cast<CButtonsGroup *>(&object)==NULL)
return(false);
//--- Получим указатель на список
CButtonsGroup *bg=::GetPointer(object);
//--- Добавим кнопки в базу
int buttons_total=bg.ButtonsTotal();
for(int i=0; i<buttons_total; i++)
{
//--- Сохраняем указатель в массив
int last_index=ResizeArray(m_wnd[window_index].m_elements);
m_wnd[window_index].m_elements[last_index]=bg.GetButtonPointer(i);
}
return(true);
}
//+------------------------------------------------------------------+
//| Сохраняет указатели на объекты списка |
//+------------------------------------------------------------------+
bool CWndContainer::AddListViewElements(const int window_index,CElementBase &object)
{
//--- Выйдем, если это не список
if(dynamic_cast<CListView *>(&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<CScroll *>(&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<CComboBox *>(&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<CColorButton *>(&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<CTable *>(&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<CTabs *>(&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<CCalendar *>(&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<CDropCalendar *>(&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<CColorPicker *>(&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<CStandardChart *>(&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<CPicturesSlider *>(&object)==NULL)
return(false);
//--- Получим указатель на слайдер картинок
CPicturesSlider *ps=::GetPointer(object);
//--- Добавим кнопки в базу
int picturs_total=ps.PicturesTotal();
for(int i=0; i<picturs_total; i++)
{
//--- Сохраняем указатель в массив
int last_index=ResizeArray(m_wnd[window_index].m_elements);
m_wnd[window_index].m_elements[last_index]=ps.GetPicturePointer(i);
}
//---
for(int i=0; i<3; i++)
{
int last_index=ResizeArray(m_wnd[window_index].m_elements);
//---
if(i==0)
{
//--- Сохраняем указатель в массив
CButtonsGroup *bg=ps.GetRadioButtonsPointer();
m_wnd[window_index].m_elements[last_index]=bg;
//--- Добавить кнопки группы
AddButtonsGroupElements(window_index,bg);
}
else
{
//--- Сохраняем указатель в массив
CButton *ib=(i<2)? ps.GetLeftArrowPointer() : ps.GetRightArrowPointer();
m_wnd[window_index].m_elements[last_index]=ib;
}
}
//--- Добавим указатель в персональный массив
AddToPersonalArray(ps,m_wnd[window_index].m_pictures_slider);
return(true);
}
//+------------------------------------------------------------------+
//| Сохраняет указатель на элементы "Время" в персональный массив |
//+------------------------------------------------------------------+
bool CWndContainer::AddTimeEditsElements(const int window_index,CElementBase &object)
{
//--- Выйдем, если это не элемент "Время"
if(dynamic_cast<CTimeEdit *>(&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<CTextBox *>(&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<CTextEdit *>(&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<CSlider *>(&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<CTooltip *>(&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<CTreeView *>(&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<tv.ItemsTotal(); j++)
{
last_index=ResizeArray(m_wnd[window_index].m_elements);
m_wnd[window_index].m_elements[last_index]=tv.ItemPointer(j);
}
break;
}
case 1 :
{
for(int j=0; j<tv.ContentItemsTotal(); j++)
{
last_index=ResizeArray(m_wnd[window_index].m_elements);
m_wnd[window_index].m_elements[last_index]=tv.ContentItemPointer(j);
}
break;
}
case 2 :
{
//--- Добавим указатель в персональный массив
CScrollV *sv=tv.GetScrollVPointer();
m_wnd[window_index].m_elements[last_index]=sv;
AddToPersonalArray(sv,m_wnd[window_index].m_scrolls);
//--- Сохраним указатели на объекты полосы прокрутки
AddScrollElements(window_index,sv);
break;
}
case 3 :
{
//--- Добавим указатель в персональный массив
CScrollV *csv=tv.GetContentScrollVPointer();
m_wnd[window_index].m_elements[last_index]=csv;
AddToPersonalArray(csv,m_wnd[window_index].m_scrolls);
//--- Сохраним указатели на объекты полосы прокрутки
AddScrollElements(window_index,csv);
break;
}
}
}
return(true);
}
//+------------------------------------------------------------------+
//| Сохраняет указатели на элементы файлового навигатора |
//+------------------------------------------------------------------+
bool CWndContainer::AddFileNavigatorElements(const int window_index,CElementBase &object)
{
//--- Выйдем, если это не файловый навигатор
if(dynamic_cast<CFileNavigator *>(&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<CFrame *>(&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<typename T>
int CWndContainer::ResizeArray(T &array[])
{
int size=::ArraySize(array);
::ArrayResize(array,size+1,RESERVE_SIZE_ARRAY);
return(size);
}
//+------------------------------------------------------------------+
//| Сохраняет указатель (T1) в переданный по ссылке массив (T2) |
//+------------------------------------------------------------------+
template<typename T1,typename T2>
void CWndContainer::AddToPersonalArray(T1 &object,T2 &array[])
{
int last_index=ResizeArray(array);
array[last_index]=object;
}
//+------------------------------------------------------------------+