dirctrlg.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 1,669 行 · 第 1/4 页
CPP
1,669 行
while (d.GetNext(&eachFilename));
}
}
dirs.Sort(wxDirCtrlStringCompareFunction);
// Now do the filenames -- but only if we're allowed to
if ((GetWindowStyle() & wxDIRCTRL_DIR_ONLY) == 0)
{
wxLogNull log;
d.Open(dirName);
if (d.IsOpened())
{
int style = wxDIR_FILES;
if (m_showHidden) style |= wxDIR_HIDDEN;
// Process each filter (ex: "JPEG Files (*.jpg;*.jpeg)|*.jpg;*.jpeg")
wxStringTokenizer strTok;
wxString curFilter;
strTok.SetString(m_currentFilterStr,wxT(";"));
while(strTok.HasMoreTokens())
{
curFilter = strTok.GetNextToken();
if (d.GetFirst(& eachFilename, curFilter, style))
{
do
{
if ((eachFilename != wxT(".")) && (eachFilename != wxT("..")))
{
filenames.Add(eachFilename);
}
}
while (d.GetNext(& eachFilename));
}
}
}
filenames.Sort(wxDirCtrlStringCompareFunction);
}
// Add the sorted dirs
size_t i;
for (i = 0; i < dirs.Count(); i++)
{
wxString eachFilename(dirs[i]);
path = dirName;
if (!wxEndsWithPathSeparator(path))
path += wxString(wxFILE_SEP_PATH);
path += eachFilename;
wxDirItemData *dir_item = new wxDirItemData(path,eachFilename,true);
wxTreeItemId id = AppendItem( parentId, eachFilename,
wxFileIconsTable::folder, -1, dir_item);
m_treeCtrl->SetItemImage( id, wxFileIconsTable::folder_open,
wxTreeItemIcon_Expanded );
// Has this got any children? If so, make it expandable.
// (There are two situations when a dir has children: either it
// has subdirectories or it contains files that weren't filtered
// out. The latter only applies to dirctrl with files.)
if ( dir_item->HasSubDirs() ||
(((GetWindowStyle() & wxDIRCTRL_DIR_ONLY) == 0) &&
dir_item->HasFiles(m_currentFilterStr)) )
{
m_treeCtrl->SetItemHasChildren(id);
}
}
// Add the sorted filenames
if ((GetWindowStyle() & wxDIRCTRL_DIR_ONLY) == 0)
{
for (i = 0; i < filenames.Count(); i++)
{
wxString eachFilename(filenames[i]);
path = dirName;
if (!wxEndsWithPathSeparator(path))
path += wxString(wxFILE_SEP_PATH);
path += eachFilename;
//path = dirName + wxString(wxT("/")) + eachFilename;
wxDirItemData *dir_item = new wxDirItemData(path,eachFilename,false);
int image_id = wxFileIconsTable::file;
if (eachFilename.Find(wxT('.')) != wxNOT_FOUND)
image_id = wxTheFileIconsTable->GetIconID(eachFilename.AfterLast(wxT('.')));
(void) AppendItem( parentId, eachFilename, image_id, -1, dir_item);
}
}
}
void wxGenericDirCtrl::ReCreateTree()
{
CollapseDir(m_treeCtrl->GetRootItem());
ExpandRoot();
}
void wxGenericDirCtrl::CollapseTree()
{
wxTreeItemIdValue cookie;
wxTreeItemId child = m_treeCtrl->GetFirstChild(m_rootId, cookie);
while (child.IsOk())
{
CollapseDir(child);
child = m_treeCtrl->GetNextChild(m_rootId, cookie);
}
}
// Find the child that matches the first part of 'path'.
// E.g. if a child path is "/usr" and 'path' is "/usr/include"
// then the child for /usr is returned.
wxTreeItemId wxGenericDirCtrl::FindChild(wxTreeItemId parentId, const wxString& path, bool& done)
{
wxString path2(path);
// Make sure all separators are as per the current platform
path2.Replace(wxT("\\"), wxString(wxFILE_SEP_PATH));
path2.Replace(wxT("/"), wxString(wxFILE_SEP_PATH));
// Append a separator to foil bogus substring matching
path2 += wxString(wxFILE_SEP_PATH);
// In MSW or PM, case is not significant
#if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__)
path2.MakeLower();
#endif
wxTreeItemIdValue cookie;
wxTreeItemId childId = m_treeCtrl->GetFirstChild(parentId, cookie);
while (childId.IsOk())
{
wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(childId);
if (data && !data->m_path.empty())
{
wxString childPath(data->m_path);
if (!wxEndsWithPathSeparator(childPath))
childPath += wxString(wxFILE_SEP_PATH);
// In MSW and PM, case is not significant
#if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__)
childPath.MakeLower();
#endif
if (childPath.Len() <= path2.Len())
{
wxString path3 = path2.Mid(0, childPath.Len());
if (childPath == path3)
{
if (path3.Len() == path2.Len())
done = true;
else
done = false;
return childId;
}
}
}
childId = m_treeCtrl->GetNextChild(parentId, cookie);
}
wxTreeItemId invalid;
return invalid;
}
// Try to expand as much of the given path as possible,
// and select the given tree item.
bool wxGenericDirCtrl::ExpandPath(const wxString& path)
{
bool done = false;
wxTreeItemId id = FindChild(m_rootId, path, done);
wxTreeItemId lastId = id; // The last non-zero id
while (id.IsOk() && !done)
{
ExpandDir(id);
id = FindChild(id, path, done);
if (id.IsOk())
lastId = id;
}
if (lastId.IsOk())
{
wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(lastId);
if (data->m_isDir)
{
m_treeCtrl->Expand(lastId);
}
if ((GetWindowStyle() & wxDIRCTRL_SELECT_FIRST) && data->m_isDir)
{
// Find the first file in this directory
wxTreeItemIdValue cookie;
wxTreeItemId childId = m_treeCtrl->GetFirstChild(lastId, cookie);
bool selectedChild = false;
while (childId.IsOk())
{
wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(childId);
if (data && data->m_path != wxEmptyString && !data->m_isDir)
{
m_treeCtrl->SelectItem(childId);
m_treeCtrl->EnsureVisible(childId);
selectedChild = true;
break;
}
childId = m_treeCtrl->GetNextChild(lastId, cookie);
}
if (!selectedChild)
{
m_treeCtrl->SelectItem(lastId);
m_treeCtrl->EnsureVisible(lastId);
}
}
else
{
m_treeCtrl->SelectItem(lastId);
m_treeCtrl->EnsureVisible(lastId);
}
return true;
}
else
return false;
}
wxString wxGenericDirCtrl::GetPath() const
{
wxTreeItemId id = m_treeCtrl->GetSelection();
if (id)
{
wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(id);
return data->m_path;
}
else
return wxEmptyString;
}
wxString wxGenericDirCtrl::GetFilePath() const
{
wxTreeItemId id = m_treeCtrl->GetSelection();
if (id)
{
wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(id);
if (data->m_isDir)
return wxEmptyString;
else
return data->m_path;
}
else
return wxEmptyString;
}
void wxGenericDirCtrl::SetPath(const wxString& path)
{
m_defaultPath = path;
if (m_rootId)
ExpandPath(path);
}
// Not used
#if 0
void wxGenericDirCtrl::FindChildFiles(wxTreeItemId id, int dirFlags, wxArrayString& filenames)
{
wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(id);
// This may take a longish time. Go to busy cursor
wxBusyCursor busy;
wxASSERT(data);
wxString search,path,filename;
wxString dirName(data->m_path);
#if defined(__WXMSW__) || defined(__OS2__)
if (dirName.Last() == ':')
dirName += wxString(wxFILE_SEP_PATH);
#endif
wxDir d;
wxString eachFilename;
wxLogNull log;
d.Open(dirName);
if (d.IsOpened())
{
if (d.GetFirst(& eachFilename, m_currentFilterStr, dirFlags))
{
do
{
if ((eachFilename != wxT(".")) && (eachFilename != wxT("..")))
{
filenames.Add(eachFilename);
}
}
while (d.GetNext(& eachFilename)) ;
}
}
}
#endif
void wxGenericDirCtrl::SetFilterIndex(int n)
{
m_currentFilter = n;
wxString f, d;
if (ExtractWildcard(m_filter, n, f, d))
m_currentFilterStr = f;
else
#ifdef __UNIX__
m_currentFilterStr = wxT("*");
#else
m_currentFilterStr = wxT("*.*");
#endif
}
void wxGenericDirCtrl::SetFilter(const wxString& filter)
{
m_filter = filter;
wxString f, d;
if (ExtractWildcard(m_filter, m_currentFilter, f, d))
m_currentFilterStr = f;
else
#ifdef __UNIX__
m_currentFilterStr = wxT("*");
#else
m_currentFilterStr = wxT("*.*");
#endif
}
// Extract description and actual filter from overall filter string
bool wxGenericDirCtrl::ExtractWildcard(const wxString& filterStr, int n, wxString& filter, wxString& description)
{
wxArrayString filters, descriptions;
int count = wxParseCommonDialogsFilter(filterStr, descriptions, filters);
if (count > 0 && n < count)
{
filter = filters[n];
description = descriptions[n];
return true;
}
return false;
}
#if WXWIN_COMPATIBILITY_2_4
// Parses the global filter, returning the number of filters.
// Returns 0 if none or if there's a problem.
// filterStr is in the form: "All files (*.*)|*.*|JPEG Files (*.jpeg)|*.jpg"
int wxGenericDirCtrl::ParseFilter(const wxString& filterStr, wxArrayString& filters, wxArrayString& descriptions)
{
return wxParseCommonDialogsFilter(filterStr, descriptions, filters );
}
#endif // WXWIN_COMPATIBILITY_2_4
void wxGenericDirCtrl::DoResize()
{
wxSize sz = GetClientSize();
int verticalSpacing = 3;
if (m_treeCtrl)
{
wxSize filterSz ;
if (m_filterListCtrl)
{
filterSz = m_filterListCtrl->GetSize();
sz.y -= (filterSz.y + verticalSpacing);
}
m_treeCtrl->SetSize(0, 0, sz.x, sz.y);
if (m_filterListCtrl)
{
m_filterListCtrl->SetSize(0, sz.y + verticalSpacing, sz.x, filterSz.y);
// Don't know why, but this needs refreshing after a resize (wxMSW)
m_filterListCtrl->Refresh();
}
}
}
void wxGenericDirCtrl::OnSize(wxSizeEvent& WXUNUSED(event))
{
DoResize();
}
wxTreeItemId wxGenericDirCtrl::AppendItem (const wxTreeItemId & parent,
const wxString & text,
int image, int selectedImage,
wxTreeItemData * data)
{
wxTreeCtrl *treeCtrl = GetTreeCtrl ();
wxASSERT (treeCtrl);
if (treeCtrl)
{
return treeCtrl->AppendItem (parent, text, image, selectedImage, data);
}
else
{
return wxTreeItemId();
}
}
//-----------------------------------------------------------------------------
// wxDirFilterListCtrl
//-----------------------------------------------------------------------------
IMPLEMENT_CLASS(wxDirFilterListCtrl, wxChoice)
BEGIN_EVENT_TABLE(wxDirFilterListCtrl, wxChoice)
EVT_CHOICE(wxID_ANY, wxDirFilterListCtrl::OnSelFilter)
END_EVENT_TABLE()
bool wxDirFilterListCtrl::Create(wxGenericDirCtrl* parent, const wxWindowID id,
const wxPoint& pos,
const wxSize& size,
long style)
{
m_dirCtrl = parent;
return wxChoice::Create(parent, id, pos, size, 0, NULL, style);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?