EasyAndFastMod/Controls/FileNavigator.mqh

625 lines
59 KiB
MQL5
Raw Permalink Normal View History

2026-01-15 07:23:17 -05:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| FileNavigator.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#include "..\Element.mqh"
#include "TreeView.mqh"
//+------------------------------------------------------------------+
//| ;0AA 4;O A>740=8O D09;>2>3> =02830B>@0 |
//+------------------------------------------------------------------+
class CFileNavigator : public CElement
{
private:
//--- 1J5:BK 4;O A>740=8O M;5<5=B0
CTreeView m_treeview;
//--- A=>2=K5 <0AA82K 4;O E@0=5=8O 40==KE
int m_g_list_index[]; // >1I89 8=45:A
int m_g_prev_node_list_index[]; // >1I89 8=45:A ?@54K4CI53> C7;0
string m_g_item_text[]; // 8<O ?0?:8/D09;0
int m_g_item_index[]; // ;>:0;L=K9 8=45:A
int m_g_node_level[]; // C@>25=L C7;0
int m_g_prev_node_item_index[]; // ;>:0;L=K9 8=45:A ?@54K4CI53> C7;0
int m_g_items_total[]; // 2A53> M;5<5=B>2 2 ?0?:5
int m_g_folders_total[]; // :>;8G5AB2> ?0?>: 2 ?0?:5
bool m_g_is_folder[]; // ?@87=0: ?0?:8
bool m_g_item_state[]; // A>AB>O=85 ?C=:B0 (A2Q@=CB/>B:@KB)
//--- A?><>30B5;L=K5 <0AA82K 4;O A1>@0 40==KE
int m_l_prev_node_list_index[];
string m_l_item_text[];
string m_l_path[];
int m_l_item_index[];
int m_l_item_total[];
int m_l_folders_total[];
//--- (8@8=0 >1;0AB8 4@52>284=>3> A?8A:0
int m_treeview_width;
//--- 0@B8=:8 4;O (1) ?0?>: 8 (2) D09;>2
string m_file_icon;
string m_folder_icon;
//--- "5:CI89 ?CBL >B=>A8B5;L=> D09;>2>9 "?5A>G=8FK" B5@<8=0;0
string m_current_path;
//--- "5:CI89 ?>;=K9 ?CBL >B=>A8B5;L=> D09;>2>9 A8AB5<K 2:;NG0O <5B:C B><0 6QAB:>3> 48A:0
string m_current_full_path;
//--- 1;0ABL B5:CI59 48@5:B>@88
int m_directory_area;
//--- 568< A>45@60=8O D09;>2>3> =02830B>@0
ENUM_FILE_NAVIGATOR_CONTENT m_navigator_content;
//---
public:
CFileNavigator(void);
~CFileNavigator(void);
//--- 5B>4K 4;O A>740=8O D09;>2>3> =02830B>@0
bool CreateFileNavigator(const int x_gap,const int y_gap);
//---
private:
void InitializeProperties(const int x_gap,const int y_gap);
bool CreateCanvas(void);
bool CreateTreeView(void);
//---
public:
//--- (1) >72@0I05B C:070B5;L 4@52>284=>3> A?8A:0,
// (2) @568< =02830B>@0 (>:07K20BL 2A5/">;L:> ?0?:8), (3) A>45@60=85 =02830B>@0 (1I0O ?0?:0/>:0;L=0O/AQ)
CTreeView *GetTreeViewPointer(void) { return(::GetPointer(m_treeview)); }
void NavigatorMode(const ENUM_FILE_NAVIGATOR_MODE mode) { m_treeview.NavigatorMode(mode); }
void NavigatorContent(const ENUM_FILE_NAVIGATOR_CONTENT mode) { m_navigator_content=mode; }
//--- (1) H8@8=0 4@52>284=>3> A?8A:0, (2) CAB0=>2:0 ?CB8 : D09;0< 4;O D09;>2 8 ?0?>:
void TreeViewWidth(const int x_size) { m_treeview_width=x_size; }
void FileIcon(const string file_path) { m_file_icon=file_path; }
void FolderIcon(const string file_path) { m_folder_icon=file_path; }
//--- >72@0I05B (1) B5:CI89 ?CBL 8 (2) ?>;=K9 ?CBL, (3) 2K45;5==K9 D09;
string CurrentPath(void) const { return(m_current_path); }
string CurrentFullPath(void) const { return(m_current_full_path); }
//--- >72@0I05B (1) >1;0ABL 48@5:B>@88 8 (2) 2K45;5==K9 D09;
int DirectoryArea(void) const { return(m_directory_area); }
string SelectedFile(void) const { return(m_treeview.SelectedItemFileName()); }
//---
public:
//--- 1@01>BG8: A>1KB89 3@0D8:0
virtual void OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
//--- #?@02;5=85
virtual void Delete(void);
//--- 8AC5B M;5<5=B
virtual void Draw(void);
//---
private:
//--- 1@01>B:0 A>1KB8O 2K1>@0 =>2>3> ?CB8 2 4@52>284=>< A?8A:5
void OnChangeTreePath(void);
//--- 0?>;=O5B <0AA82K ?0@0<5B@0<8 M;5<5=B>2 D09;>2>9 A8AB5<K B5@<8=0;0
void FillArraysData(void);
//--- '8B05B D09;>2CN A8AB5<C 8 70?8AK205B ?0@0<5B@K 2 <0AA82K
void FileSystemScan(const int root_index,int &list_index,int &node_level,int &item_index,int search_area);
//--- 7<5=O5B @07<5@ 2A?><>30B5;L=KE <0AA82>2 >B=>A8B5;L=> B5:CI53> C@>2=O C7;0
void AuxiliaryArraysResize(const int node_level);
//--- ?@545;O5B, ?5@540=> 8<O ?0?:8 8;8 D09;0
bool IsFolder(const string file_name);
//--- >72@0I05B :>;8G5AB2> (1) M;5<5=B>2 8 (2) ?0?>: 2 C:070==>9 48@5:B>@88
int ItemsTotal(const string search_path,const int mode);
int FoldersTotal(const string search_path,const int mode);
//--- >72@0I05B ;>:0;L=K9 8=45:A ?@54K4CI53> C7;0 >B=>A8B5;L=> ?5@540==KE ?0@0<5B@>2
int PrevNodeItemIndex(const int root_index,const int node_level);
//--- >102;O5B ?C=:B 2 <0AA82K
void AddItem(const int list_index,const string item_text,const int node_level,const int prev_node_item_index,
const int item_index,const int items_total,const int folders_total,const bool is_folder);
//--- 5@5E>4 =0 A;54CNI89 C75;
void ToNextNode(const int root_index,int list_index,int &node_level,
int &item_index,long &handle,const string item_text,const int search_area);
virtual void DrawText(void);
//--- 7<5=8BL H8@8=C ?> ?@02><C :@0N >:=0
virtual void ChangeWidthByRightWindowSide(void);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CFileNavigator::CFileNavigator(void) : m_current_path(""),
m_current_full_path(""),
m_treeview_width(200),
m_directory_area(FILE_COMMON),
m_navigator_content(FN_ONLY_MQL),
m_file_icon("Images\\EasyAndFastGUI\\Icons\\bmp16\\text_file_w10.bmp"),
m_folder_icon("Images\\EasyAndFastGUI\\Icons\\bmp16\\folder_w10.bmp")
{
//--- !>E@0=8< 8<O :;0AA0 M;5<5=B0 2 107>2>< :;0AA5
CElementBase::ClassName(CLASS_NAME);
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CFileNavigator::~CFileNavigator(void)
{
}
//+------------------------------------------------------------------+
//| 1@01>BG8: A>1KB89 |
//+------------------------------------------------------------------+
void CFileNavigator::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
//--- 1@01>B:0 A>1KB8O "7<5=5=85 ?CB8 2 4@52>284=>< A?8A:5"
if(id==CHARTEVENT_CUSTOM+ON_CHANGE_TREE_PATH)
{
OnChangeTreePath();
//--- B>1@078< B5:CI89 ?CBL 2 04@5A=>9 AB@>:5
Update(true);
return;
}
}
//+------------------------------------------------------------------+
//| !>740QB D09;>2K9 =02830B>@ |
//+------------------------------------------------------------------+
bool CFileNavigator::CreateFileNavigator(const int x_gap,const int y_gap)
{
//--- K9B8, 5A;8 =5B C:070B5;O =0 3;02=K9 M;5<5=B
if(!CElement::CheckMainPointer())
return(false);
//--- !:0=8@C5< D09;>2CN A8AB5<C B5@<8=0;0 8 70=>A8< 40==K5 2 <0AA82K
FillArraysData();
//--- =8F80;870F8O A2>9AB2
InitializeProperties(x_gap,y_gap);
//--- !>740=85 M;5<5=B0
if(!CreateTreeView())
return(false);
if(!CreateCanvas())
return(false);
//--- B>1@078< B5:CI89 ?CBL 2 04@5A=>9 AB@>:5
OnChangeTreePath();
return(true);
}
//+------------------------------------------------------------------+
//| =8F80;870F8O A2>9AB2 |
//+------------------------------------------------------------------+
void CFileNavigator::InitializeProperties(const int x_gap,const int y_gap)
{
m_x =CElement::CalculateX(x_gap);
m_y =CElement::CalculateY(y_gap);
m_x_size =(m_x_size<1 || m_auto_xresize_mode)? m_main.X2()-CElementBase::X()-m_auto_xresize_right_offset : m_x_size;
m_y_size =(m_y_size<1)? 20 : m_y_size;
//--- &25B0 ?> C<>;G0=8N
m_border_color =(m_border_color!=clrNONE)? m_border_color : C'150,170,180';
m_label_color =(m_label_color!=clrNONE)? m_label_color : clrBlack;
//--- BABC?K >B :@09=59 B>G:8
CElementBase::XGap(x_gap);
CElementBase::YGap(y_gap);
}
//+------------------------------------------------------------------+
//| !>740QB >1J5:B 4;O @8A>20=8O |
//+------------------------------------------------------------------+
bool CFileNavigator::CreateCanvas(void)
{
//--- $>@<8@>20=85 8<5=8 >1J5:B0
string name=CElementBase::ElementName("file_navigator");
//--- !>740=85 >1J5:B0
if(!CElement::CreateCanvas(name,m_x,m_y,m_treeview.XSize(),m_y_size))
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| !>740QB 4@52>284=K9 A?8A>: |
//+------------------------------------------------------------------+
#resource "\\Images\\EasyAndFastGUI\\Icons\\bmp16\\folder_w10.bmp"
#resource "\\Images\\EasyAndFastGUI\\Icons\\bmp16\\text_file_w10.bmp"
//---
bool CFileNavigator::CreateTreeView(void)
{
//--- !>E@0=8< C:070B5;L =0 >:=>
m_treeview.MainPointer(this);
//--- >>@48=0BK
int x=0,y=m_y_size-1;
//--- !2>9AB20
m_treeview.XSize(m_x_size);
m_treeview.TreeViewWidth(m_treeview_width);
m_treeview.ResizeListMode(true);
m_treeview.ShowItemContent(true);
m_treeview.AutoXResizeMode(CElementBase::AutoXResizeMode());
m_treeview.AutoXResizeRightOffset(0);
m_treeview.AnchorRightWindowSide(CElementBase::AnchorRightWindowSide());
m_treeview.AnchorBottomWindowSide(CElementBase::AnchorBottomWindowSide());
//--- $>@<8@C5< <0AA82K 4@52>284=>3> A?8A:0
int items_total=::ArraySize(m_g_item_text);
for(int i=0; i<items_total; i++)
{
//--- ?@545;8< :0@B8=:C 4;O ?C=:B0 (?0?:0/D09;)
string icon_path=(m_g_is_folder[i])? m_folder_icon : m_file_icon;
//--- A;8 MB> ?0?:0, C40;8< ?>A;54=89 A8<2>; ('\') 2 AB@>:5
if(m_g_is_folder[i])
m_g_item_text[i]=::StringSubstr(m_g_item_text[i],0,::StringLen(m_g_item_text[i])-1);
//--- >1028< ?C=:B 2 4@52>284=K9 A?8A>:
m_treeview.AddItem(i,m_g_prev_node_list_index[i],m_g_item_text[i],icon_path,m_g_item_index[i],
m_g_node_level[i],m_g_prev_node_item_index[i],m_g_items_total[i],m_g_folders_total[i],false,m_g_is_folder[i]);
}
//--- !>740BL 4@52>284=K9 A?8A>:
if(!m_treeview.CreateTreeView(x,y))
return(false);
//--- >1028BL M;5<5=B 2 <0AA82
CElement::AddToArray(m_treeview);
return(true);
}
//+------------------------------------------------------------------+
//| 1@01>B:0 A>1KB8O 2K1>@0 =>2>3> ?CB8 2 4@52>284=>< A?8A:5 |
//+------------------------------------------------------------------+
void CFileNavigator::OnChangeTreePath(void)
{
//--- >;CG8< B5:CI89 ?CBL
string path=m_treeview.CurrentFullPath();
//--- A;8 MB> >1I0O ?0?:0 B5@<8=0;>2
if(::StringFind(path,"Common\\Files\\",0)>-1)
{
//--- >;CG8< 04@5A >1I59 ?0?:8 B5@<8=0;>2
string common_path=::TerminalInfoString(TERMINAL_COMMONDATA_PATH);
//--- #40;8< 2 AB@>:5 (?@8=OB>9 2 A>1KB88) ?@5D8:A "Common\"
path=::StringSubstr(path,7,::StringLen(common_path)-7);
//--- !D>@<8@C5< ?CBL (:@0B:CN 8 ?>;=CN 25@A8N)
m_current_path =::StringSubstr(path,6,::StringLen(path)-6);
m_current_full_path =common_path+"\\"+path;
//--- !>E@0=8< >1;0ABL 48@5:B>@88
m_directory_area=FILE_COMMON;
}
//--- A;8 MB> ;>:0;L=0O ?0?:0 B5@<8=0;0
else if(::StringFind(path,"MQL5\\Files\\",0)>-1)
{
//--- >;CG8< 04@5A 40==KE 2 ;>:0;L=>9 ?0?:5 B5@<8=0;0
string local_path=::TerminalInfoString(TERMINAL_DATA_PATH);
//--- !D>@<8@C5< ?CBL (:@0B:CN 8 ?>;=CN 25@A8N)
m_current_path =::StringSubstr(path,11,::StringLen(path)-11);
m_current_full_path =local_path+"\\"+path;
//--- !>E@0=8< >1;0ABL 48@5:B>@88
m_directory_area=0;
}
}
//+------------------------------------------------------------------+
//| 0?>;=O5B <0AA82K ?0@0<5B@0<8 M;5<5=B>2 D09;>2>9 A8AB5<K |
//+------------------------------------------------------------------+
void CFileNavigator::FillArraysData(void)
{
//--- !GQBG8:8 (1) >1I8E 8=45:A>2, (2) C@>2=59 C7;>2, (3) ;>:0;L=KE 8=45:A>2
int list_index =0;
int node_level =0;
int item_index =0;
//--- A;8 =C6=> >B>1@060BL >15 48@5:B>@88 (1I0O (0)/>:0;L=0O (1))
int begin=0,end=1;
//--- A;8 =C6=> >B>1@060BL A>45@68<>5 B>;L:> ;>:0;L=>9 48@5:B>@88
if(m_navigator_content==FN_ONLY_MQL)
begin=1;
//--- A;8 =C6=> >B>1@060BL A>45@68<>5 B>;L:> >1I59 48@5:B>@88
else if(m_navigator_content==FN_ONLY_COMMON)
begin=end=0;
//--- @>94Q<AO ?> C:070==K< 48@5:B>@8O<
for(int root_index=begin; root_index<=end; root_index++)
{
//--- ?@545;8< 48@5:B>@8N 4;O A:0=8@>20=8O D09;>2>9 AB@C:BC@K
int search_area=(root_index>0) ? 0 : FILE_COMMON;
//--- 1=C;8< AGQBG8: ;>:0;L=KE 8=45:A>2
item_index=0;
//--- #25;8G8< @07<5@ <0AA82>2 =0 >48= M;5<5=B (>B=>A8B5;L=> C@>2=O C7;0)
AuxiliaryArraysResize(node_level);
//--- >;CG8< :>;-2> D09;>2 8 ?0?>: 2 C:070==>9 48@5:B>@88 (* - ?@>25@8BL 2A5 D09;K/?0?:8)
string search_path =m_l_path[0]+"*";
m_l_item_total[0] =ItemsTotal(search_path,search_area);
m_l_folders_total[0] =FoldersTotal(search_path,search_area);
//--- >1028< ?C=:B A =0720=85< :>@=52>3> :0B0;>30 2 =0G0;> A?8A:0
string item_text=(root_index>0)? "MQL5\\Files\\" : "Common\\Files\\";
AddItem(list_index,item_text,0,0,root_index,m_l_item_total[0],m_l_folders_total[0],true);
//--- #25;8G8< AGQBG8:8 >1I8E 8=45:A>2 8 C@>2=59 C7;>2
list_index++;
node_level++;
//--- #25;8G8< @07<5@ <0AA82>2 =0 >48= M;5<5=B (>B=>A8B5;L=> C@>2=O C7;0)
AuxiliaryArraysResize(node_level);
//--- =8F80;870F8O ?5@2KE M;5<5=B>2 4;O 48@5:B>@88 ;>:0;L=>9 ?0?:8 B5@<8=0;0
if(root_index>0)
{
m_l_item_index[0] =root_index;
m_l_prev_node_list_index[0] =list_index-1;
}
//--- !:0=8@C5< 48@5:B>@88 8 70=>A8< 40==K5 2 <0AA82K
FileSystemScan(root_index,list_index,node_level,item_index,search_area);
}
}
//+------------------------------------------------------------------+
//| '8B05B D09;>2CN A8AB5<C B5@<8=0;0 8 70?8AK205B |
//| ?0@0<5B@K M;5<5=B>2 2 <0AA82K |
//+------------------------------------------------------------------+
void CFileNavigator::FileSystemScan(const int root_index,int &list_index,int &node_level,int &item_index,int search_area)
{
long search_handle =INVALID_HANDLE; // %M=4; ?>8A:0 ?0?:8/D09;0
string file_name =""; // <O =0945==>3> M;5<5=B0 (D09;0/?0?:8)
string filter ="*"; // $8;LB@ ?>8A:0 (* - ?@>25@8BL 2A5 D09;K/?0?:8)
//--- !:0=8@C5< 48@5:B>@88 8 70=>A8< 40==K5 2 <0AA82K
while(!::IsStopped())
{
//--- A;8 MB> =0G0;> A?8A:0 48@5:B>@88
if(item_index==0)
{
//--- CBL 4;O ?>8A:0 2A5E M;5<5=B>2
string search_path=m_l_path[node_level]+filter;
//--- >;CG05< EM=4; 8 8<O ?5@2>3> D09;0
search_handle=::FileFindFirst(search_path,file_name,search_area);
//--- >;CG8< :>;-2> D09;>2 8 ?0?>: 2 C:070==>9 48@5:B>@88
m_l_item_total[node_level] =ItemsTotal(search_path,search_area);
m_l_folders_total[node_level] =FoldersTotal(search_path,search_area);
}
//--- A;8 8=45:A MB>3> C7;0 C65 1K;, ?5@594Q< : A;54CNI5<C D09;C
if(m_l_item_index[node_level]>-1 && item_index<=m_l_item_index[node_level])
{
//--- #25;8G8< AGQBG8: ;>:0;L=KE 8=45:A>2
item_index++;
//--- 5@5E>48< : A;54CNI5<C M;5<5=BC
::FileFindNext(search_handle,file_name);
continue;
}
//--- A;8 4>H;8 4> :>=F0 A?8A:0 2 :>@=52>< C7;5, 70:>=G8< F8:;
if(node_level==1 && item_index>=m_l_item_total[node_level])
break;
//--- A;8 4>H;8 4> :>=F0 A?8A:0 2 ;N1>< C7;5, :@><5 :>@=52>3>
else if(item_index>=m_l_item_total[node_level])
{
//--- 5@525AB8 AGQBG8: C7;>2 =0 >48= C@>25=L =0704
node_level--;
//--- 1=C;8BL AGQBG8: ;>:0;L=KE 8=45:A>2
item_index=0;
//--- 0:@K205< EM=4; ?>8A:0
::FileFindClose(search_handle);
continue;
}
//--- A;8 MB> ?0?:0
if(IsFolder(file_name))
{
//--- 5@594Q< =0 A;54CNI89 C75;
ToNextNode(root_index,list_index,node_level,item_index,search_handle,file_name,search_area);
//--- #25;8G8BL AGQBG8: >1I8E 8=45:A>2 8 =0G0BL =>2CN 8B5@0F8N
list_index++;
continue;
}
//--- >;CG8< ;>:0;L=K9 8=45:A ?@54K4CI53> C7;0
int prev_node_item_index=PrevNodeItemIndex(root_index,node_level);
//--- >1028< ?C=:B A C:070==K<8 40==K<8 2 >1I85 <0AA82K
AddItem(list_index,file_name,node_level,prev_node_item_index,item_index,0,0,false);
//--- #25;8G8< AGQBG8: >1I8E 8=45:A>2
list_index++;
//--- #25;8G8< AGQBG8: ;>:0;L=KE 8=45:A>2
item_index++;
//--- 5@5E>48< : A;54CNI5<C M;5<5=BC
::FileFindNext(search_handle,file_name);
}
//--- 0:@K205< EM=4; ?>8A:0
::FileFindClose(search_handle);
}
//+------------------------------------------------------------------+
//| 7<5=O5B @07<5@ 2A?><>30B5;L=KE <0AA82>2 |
//| >B=>A8B5;L=> B5:CI53> C@>2=O C7;0 |
//+------------------------------------------------------------------+
void CFileNavigator::AuxiliaryArraysResize(const int node_level)
{
//--- 7<5=8BL @07<5@ <0AA82>2
int new_size=node_level+1;
::ArrayResize(m_l_prev_node_list_index,new_size);
::ArrayResize(m_l_item_text,new_size);
::ArrayResize(m_l_path,new_size);
::ArrayResize(m_l_item_index,new_size);
::ArrayResize(m_l_item_total,new_size);
::ArrayResize(m_l_folders_total,new_size);
//--- =8F80;870F8O ?>A;54=53> 7=0G5=8O
m_l_prev_node_list_index[node_level] =0;
m_l_item_text[node_level] ="";
m_l_path[node_level] ="";
m_l_item_index[node_level] =-1;
m_l_item_total[node_level] =0;
m_l_folders_total[node_level] =0;
}
//+------------------------------------------------------------------+
//| ?@545;O5B, ?5@540=> 8<O ?0?:8 8;8 D09;0 |
//+------------------------------------------------------------------+
bool CFileNavigator::IsFolder(const string file_name)
{
//--- A;8 2 8<5=8 5ABL A8<2>;K "\\", B> MB> ?0?:0
if(::StringFind(file_name,"\\",0)>-1)
return(true);
//---
return(false);
}
//+------------------------------------------------------------------+
//| !G8B05B :>;8G5AB2> D09;>2 2 B5:CI59 48@5:B>@88 |
//+------------------------------------------------------------------+
int CFileNavigator::ItemsTotal(const string search_path,const int search_area)
{
int counter =0; // AGQBG8: M;5<5=B>2
string file_name =""; // 8<O D09;0
long search_handle =INVALID_HANDLE; // EM=4; ?>8A:0
//--- >;CG05< ?5@2K9 D09; 2 B5:CI59 48@5:B>@88
search_handle=::FileFindFirst(search_path,file_name,search_area);
//--- A;8 48@5:B>@8O =5 ?CAB0
if(search_handle!=INVALID_HANDLE && file_name!="")
{
//--- >AG8B05< :>;8G5AB2> >1J5:B>2 2 B5:CI59 48@5:B>@88
counter++;
while(::FileFindNext(search_handle,file_name))
counter++;
}
//--- 0:@K205< EM=4; ?>8A:0
::FileFindClose(search_handle);
return(counter);
}
//+------------------------------------------------------------------+
//| !G8B05B :>;8G5AB2> ?0?>: 2 B5:CI59 48@5:B>@88 |
//+------------------------------------------------------------------+
int CFileNavigator::FoldersTotal(const string search_path,const int search_area)
{
int counter =0; // AGQBG8: M;5<5=B>2
string file_name =""; // 8<O D09;0
long search_handle =INVALID_HANDLE; // EM=4; ?>8A:0
//--- >;CG05< ?5@2K9 D09; 2 B5:CI59 48@5:B>@88
search_handle=::FileFindFirst(search_path,file_name,search_area);
//--- A;8 =5 ?CB>, B> 2 F8:;5 AG8B05< :>;-2> >1J5:B>2 2 B5:CI59 48@5:B>@88
if(search_handle!=INVALID_HANDLE && file_name!="")
{
//--- A;8 MB> ?0?:0, C25;8G8< AGQBG8:
if(IsFolder(file_name))
counter++;
//--- @>94Q<AO 40;55 ?> A?8A:C 8 ?>AG8B05< 4@C385 ?0?:8
while(::FileFindNext(search_handle,file_name))
{
if(IsFolder(file_name))
counter++;
}
}
//--- 0:@K205< EM=4; ?>8A:0
::FileFindClose(search_handle);
return(counter);
}
//+------------------------------------------------------------------+
//| >72@0I05B ;>:0;L=K9 8=45:A ?@54K4CI53> C7;0 |
//| >B=>A8B5;L=> ?5@540==KE ?0@0<5B@>2 |
//+------------------------------------------------------------------+
int CFileNavigator::PrevNodeItemIndex(const int root_index,const int node_level)
{
int prev_node_item_index=0;
//--- A;8 =5 2 :>@=52>< :0B0;>35
if(node_level>1)
prev_node_item_index=m_l_item_index[node_level-1];
else
{
//--- A;8 =5 ?5@2K9 M;5<5=B A?8A:0
if(root_index>0)
prev_node_item_index=m_l_item_index[node_level-1];
}
//--- 5@=Q< ;>:0;L=K9 8=45:A ?@54K4CI53> C7;0
return(prev_node_item_index);
}
//+------------------------------------------------------------------+
//| >102;O5B ?C=:B A C:070==K<8 ?0@0<5B@0<8 2 <0AA82K |
//+------------------------------------------------------------------+
void CFileNavigator::AddItem(const int list_index,const string item_text,const int node_level,const int prev_node_item_index,
const int item_index,const int items_total,const int folders_total,const bool is_folder)
{
//--- 575@2=K9 @07<5@ <0AA820
int reserve_size=100000;
//--- #25;8G8< @07<5@ <0AA82>2 =0 >48= M;5<5=B
int array_size =::ArraySize(m_g_list_index);
int new_size =array_size+1;
::ArrayResize(m_g_prev_node_list_index,new_size,reserve_size);
::ArrayResize(m_g_list_index,new_size,reserve_size);
::ArrayResize(m_g_item_text,new_size,reserve_size);
::ArrayResize(m_g_item_index,new_size,reserve_size);
::ArrayResize(m_g_node_level,new_size,reserve_size);
::ArrayResize(m_g_prev_node_item_index,new_size,reserve_size);
::ArrayResize(m_g_items_total,new_size,reserve_size);
::ArrayResize(m_g_folders_total,new_size,reserve_size);
::ArrayResize(m_g_is_folder,new_size,reserve_size);
//--- !>E@0=8< 7=0G5=8O ?5@540==KE ?0@0<5B@>2
m_g_prev_node_list_index[array_size] =(node_level==0)? -1 : m_l_prev_node_list_index[node_level-1];
m_g_list_index[array_size] =list_index;
m_g_item_text[array_size] =item_text;
m_g_item_index[array_size] =item_index;
m_g_node_level[array_size] =node_level;
m_g_prev_node_item_index[array_size] =prev_node_item_index;
m_g_items_total[array_size] =items_total;
m_g_folders_total[array_size] =folders_total;
m_g_is_folder[array_size] =is_folder;
}
//+------------------------------------------------------------------+
//| 5@5E>4 =0 A;54CNI89 C75; |
//+------------------------------------------------------------------+
void CFileNavigator::ToNextNode(const int root_index,int list_index,int &node_level,
int &item_index,long &handle,const string item_text,const int search_area)
{
//--- $8;LB@ ?>8A:0 (* - ?@>25@8BL 2A5 D09;K/?0?:8)
string filter="*";
//--- !D>@<8@C5< ?CBL
string search_path=m_l_path[node_level]+item_text+filter;
//--- >;CG8< 8 A>E@0=8< 40==K5
m_l_item_total[node_level] =ItemsTotal(search_path,search_area);
m_l_folders_total[node_level] =FoldersTotal(search_path,search_area);
m_l_item_text[node_level] =item_text;
m_l_item_index[node_level] =item_index;
m_l_prev_node_list_index[node_level] =list_index;
//--- >;CG8< 8=45:A ?C=:B0 ?@54K4CI53> C7;0
int prev_node_item_index=PrevNodeItemIndex(root_index,node_level);
//--- >1028< ?C=:B A C:070==K<8 40==K<8 2 >1I85 <0AA82K
AddItem(list_index,item_text,node_level,prev_node_item_index,
item_index,m_l_item_total[node_level],m_l_folders_total[node_level],true);
//--- #25;8G8< AGQBG8: C7;>2
node_level++;
//--- #25;8G8< @07<5@ <0AA82>2 =0 >48= M;5<5=B
AuxiliaryArraysResize(node_level);
//--- >;CG8< 8 A>E@0=8< 40==K5
m_l_path[node_level] =m_l_path[node_level-1]+item_text;
m_l_item_total[node_level] =ItemsTotal(m_l_path[node_level]+filter,search_area);
m_l_folders_total[node_level] =FoldersTotal(m_l_path[node_level]+item_text+filter,search_area);
//--- 1=C;8BL AGQBG8: ;>:0;L=KE 8=45:A>2
item_index=0;
//--- 0:@K205< EM=4; ?>8A:0
::FileFindClose(handle);
}
//+------------------------------------------------------------------+
//| #40;5=85 |
//+------------------------------------------------------------------+
void CFileNavigator::Delete(void)
{
CElement::Delete();
//--- A2>1>645=85 <0AA82>2 M;5<5=B0
::ArrayFree(m_g_prev_node_list_index);
::ArrayFree(m_g_list_index);
::ArrayFree(m_g_item_text);
::ArrayFree(m_g_item_index);
::ArrayFree(m_g_node_level);
::ArrayFree(m_g_prev_node_item_index);
::ArrayFree(m_g_items_total);
::ArrayFree(m_g_folders_total);
::ArrayFree(m_g_item_state);
//---
::ArrayFree(m_l_prev_node_list_index);
::ArrayFree(m_l_item_text);
::ArrayFree(m_l_path);
::ArrayFree(m_l_item_index);
::ArrayFree(m_l_item_total);
::ArrayFree(m_l_folders_total);
//--- 1=C;8BL ?5@5<5==K5
m_current_path="";
}
//+------------------------------------------------------------------+
//| 8AC5B M;5<5=B |
//+------------------------------------------------------------------+
void CFileNavigator::Draw(void)
{
//--- 0@8A>20BL D>=
CElement::DrawBackground();
//--- 0@8A>20BL @0<:C
CElement::DrawBorder();
//--- 0@8A>20BL B5:AB
DrawText();
}
//+------------------------------------------------------------------+
//| 8AC5B B5:AB |
//+------------------------------------------------------------------+
void CFileNavigator::DrawText(void)
{
//--- >>@48=0BK
int x=5,y=m_y_size>>1;
//--- !2>9AB20 B5:AB0
m_canvas.FontSet(CElement::Font(),-CElement::FontSize()*10,FW_NORMAL);
//--- A;8 ?CBL 5IQ =5 CAB0=>2;5=, ?>:070BL AB@>:C ?> C<>;G0=8N
if(m_current_full_path=="")
m_current_full_path="Loading. Please wait...";
//--- K2545< ?CBL 2 04@5A=CN AB@>:C D09;>2>3> =02830B>@0
m_canvas.TextOut(x,y,m_current_full_path,::ColorToARGB(m_label_color),TA_LEFT|TA_VCENTER);
}
//+------------------------------------------------------------------+
//| 7<5=8BL H8@8=C ?> ?@02><C :@0N D>@<K |
//+------------------------------------------------------------------+
void CFileNavigator::ChangeWidthByRightWindowSide(void)
{
//--- K9B8, 5A;8 2:;NG5= @568< ?@82O7:8 : ?@02>9 G0AB8 >:=0
if(m_anchor_right_window_side)
return;
//--- 0AAG8B0BL 8 CAB0=>28BL =>2K9 @07<5@ D>=C M;5<5=B0
int x_size=m_main.X2()-CElementBase::X()-m_auto_xresize_right_offset;
//--- #AB0=>28BL =>2K9 @07<5@
CElementBase::XSize(x_size);
m_canvas.XSize(x_size);
m_canvas.Resize(x_size,m_y_size);
//--- 5@5@8A>20BL M;5<5=B
Draw();
}
//+------------------------------------------------------------------+