String XmlElement::ToString(uint32 nDepth) const { // Get the number of empty spaces const XmlDocument *pDocument = GetDocument(); const uint32 nNumOfSpaces = (pDocument ? pDocument->GetTabSize() : 4) * nDepth; // Print empty spaces String sXml; for (uint32 i=0; i<nNumOfSpaces; i++) sXml += ' '; // Print value sXml += '<' + m_sValue; // Print attributes for (const XmlAttribute *pAttribute=GetFirstAttribute(); pAttribute; pAttribute=pAttribute->GetNext()) sXml += ' ' + pAttribute->ToString(nDepth); // There are 3 different formatting approaches: // 1) An element without children is printed as a <foo /> node // 2) An element with only a text child is printed as <foo> text </foo> // 3) An element with children is printed on multiple lines. if (!GetFirstChild()) sXml += " />"; else if (GetFirstChild() == GetLastChild() && GetFirstChild()->GetType() == Text) { sXml += '>' + GetFirstChild()->ToString(nDepth+1) + "</" + m_sValue + '>'; } else { sXml += '>'; for (const XmlNode *pNode=GetFirstChild(); pNode; pNode=pNode->GetNextSibling()) { if (pNode->GetType() != Text) sXml += '\n'; sXml += pNode->ToString(nDepth+1); } sXml += '\n'; // Print empty spaces for (uint32 i=0; i<nNumOfSpaces; i++) sXml += ' '; // Print value sXml += "</" + m_sValue + '>'; } // Done return sXml; }
bool nuiWindowManager::DispatchMouseUnclick(const nglMouseInfo& rInfo) { //OUT("OnMouseUnclick\n"); IteratorPtr pIt; for (pIt = GetLastChild(); pIt && pIt->IsValid(); GetPreviousChild(pIt)) { nuiWidgetPtr pItem = pIt->GetWidget(); if (pItem && pItem->IsVisible() && pItem->IsEnabled()) { if (pItem->DispatchMouseUnclick(rInfo)) return true; } } delete pIt; return nuiSimpleContainer::DispatchMouseUnclick(rInfo); }
void DockCont::Handle::Paint(Draw& w) { if (IsShown() && dc) { const DockableCtrl::Style &s = dc->GetStyle(); Rect r = GetSize(); const Rect &m = s.handle_margins; Point p; if (s.handle_vert) p = Point(r.left-1 + m.left, r.bottom - m.bottom); else p = Point(r.left + m.left, r.top + m.top); ChPaint(w, r, s.handle[focus]); Image img = dc->GetIcon(); if (!img.IsEmpty()) { if (s.handle_vert) { int isz = r.GetWidth(); p.y -= isz; isz -= (m.left + m.right); ChPaint(w, max(p.x+m.left, r.left), p.y, isz, isz, img); p.y -= 2; } else { int isz = r.GetHeight(); isz -= (m.top + m.bottom); ChPaint(w, p.x, max(p.y, r.top), isz, isz, img); p.x += isz + 2; } } if (!s.title_font.IsNull()) { Ctrl *c = GetLastChild(); while (c && !c->IsShown() && c->GetParent()) c = c->GetNext(); if (s.handle_vert) r.top = c ? c->GetRect().bottom + m.top : m.top; else r.right = c ? c->GetRect().left + m.right : m.right; w.Clip(r); WString text = IsNull(dc->GetGroup()) ? dc->GetTitle() : (WString)Format("%s (%s)", dc->GetTitle(), dc->GetGroup()); w.DrawText(p.x, p.y, s.handle_vert ? 900 : 0, text, s.title_font, s.title_ink[focus]); w.End(); } } }
wxTreeItemId cbTreeCtrl::GetPrevVisible(const wxTreeItemId& item) const { wxTreeItemId previous = GetPrevSibling(item); if (previous.IsOk()) { while (ItemHasChildren(previous) && IsExpanded(previous)) { wxTreeItemId child = GetLastChild(previous); if (!child.IsOk()) break; else previous = child; } } else previous = GetItemParent(item); return previous; }
wxSize wxTreeCtrlBase::DoGetBestSize() const { wxSize size; // this doesn't really compute the total bounding rectangle of all items // but a not too bad guess of it which has the advantage of not having to // examine all (potentially hundreds or thousands) items in the control if (GetQuickBestSize()) { for ( wxTreeItemId item = GetRootItem(); item.IsOk(); item = GetLastChild(item) ) { wxRect rect; // last parameter is "true" to get only the dimensions of the text // label, we don't want to get the entire item width as it's determined // by the current size if ( GetBoundingRect(item, rect, true) ) { if ( size.x < rect.x + rect.width ) size.x = rect.x + rect.width; if ( size.y < rect.y + rect.height ) size.y = rect.y + rect.height; } } } else // use precise, if potentially slow, size computation method { // iterate over all items recursively wxTreeItemId idRoot = GetRootItem(); if ( idRoot.IsOk() ) wxGetBestTreeSize(this, idRoot, size); } // need some minimal size even for empty tree if ( !size.x || !size.y ) size = wxControl::DoGetBestSize(); else // add border size size += GetWindowBorderSize(); return size; }
void nsFrameIterator::Last() { nsIFrame* result; nsIFrame* parent = getCurrent(); // If the current frame is a popup, don't move farther up the tree. // Otherwise, get the nearest root frame or popup. if (parent->GetType() != nsGkAtoms::menuPopupFrame) { while (!IsRootFrame(parent) && (result = GetParentFrameNotPopup(parent))) parent = result; } while ((result = GetLastChild(parent))) { parent = result; } setCurrent(parent); if (!parent) setOffEdge(1); }
void WatchWindow::CreateEmptySlotIfNeeded() { bool needsEmptySlot = true; int numItems = GetChildrenCount(m_root, false); if (numItems > 0) { wxTreeItemIdValue cookie; wxTreeItemId lastItem = GetLastChild(m_root, cookie); needsEmptySlot = !GetItemText(lastItem).empty(); } if (needsEmptySlot) { wxTreeItemId item = AppendItem(m_root, _T("")); } }
bool CRemoteTreeView::ListExpand(wxTreeItemId item) { const CServerPath path = GetPathFromItem(item); wxASSERT(!path.empty()); if (path.empty()) return false; CDirectoryListing listing; if (m_pState->m_pEngine->CacheLookup(path, listing) == FZ_REPLY_OK) RefreshItem(item, listing, false); else { SetItemImages(item, true); wxTreeItemId child = GetLastChild(item); if (!child || GetItemText(child).empty()) return false; } return true; }
nuiWidgetPtr nuiContainer::GetChildIf(nuiSize X, nuiSize Y, TestWidgetFunctor* pFunctor) { CheckValid(); X -= mRect.mLeft; Y -= mRect.mTop; IteratorPtr pIt; for (pIt = GetLastChild(); pIt && pIt->IsValid(); GetPreviousChild(pIt)) { nuiWidgetPtr pItem = pIt->GetWidget(); if (pItem && pItem->IsInsideFromParent(X,Y)) { nuiContainerPtr pContainer = dynamic_cast<nuiContainerPtr>(pItem); if (pContainer) { nuiWidget* pWidget = pContainer->GetChildIf(X,Y, pFunctor); if (pWidget) { delete pIt; return pWidget; } } else { if ((*pFunctor)(pItem)) { delete pIt; return pItem; } } } } delete pIt; if ((*pFunctor)(this)) return this; return NULL; }
void CSTBBrowser2View::OnNavigateComplete2(LPCTSTR strURL) { // TODO: Add your specialized code here and/or call the base class this->MoveWindow(0,0,1044,788); window=GetLastChild(this->m_hWnd); if(window){ if(isFirstRun){ ::PostMessage(window,WM_KEYDOWN,39,0); isFirstRun = false; VK_DOWN; } }else{ this->MessageBox("fail to get window=GetLastChild(this->m_hWnd);"); } CSTBBrowser2App *p=(CSTBBrowser2App *)::AfxGetApp(); if(p->IsNetworkedTVMode()){ //this->MessageBox("save SaveCurrentURL(strURL);"); SaveCurrentURL(strURL); } CHtmlView::OnNavigateComplete2(strURL); }
bool nuiContainer::DispatchMouseCanceled(nuiWidgetPtr pThief, const nglMouseInfo& rInfo) { CheckValid(); nuiAutoRef; if (mTrashed) return false; bool hasgrab = HasGrab(rInfo.TouchId); nglMouseInfo info(rInfo); GlobalToLocal(info.X, info.Y); // Get a chance to preempt the mouse event before the children get it: PreClickCanceled(info); IteratorPtr pIt; for (pIt = GetLastChild(false); pIt && pIt->IsValid(); GetPreviousChild(pIt)) { nuiWidgetPtr pItem = pIt->GetWidget(); if (pItem) { pItem->DispatchMouseCanceled(pThief, rInfo); } } delete pIt; if (pThief != this) { GlobalToLocal(info.X, info.Y); PreClickCanceled(info); bool ret = MouseCanceled(info); ret |= ClickCanceled(info); ret = ret | (!mClickThru); return ret; } return false; }
void WatchWindow::OnEndLabelEdit(wxTreeEvent& event) { if (!event.IsEditCancelled()) { wxTreeItemId item = event.GetItem(); wxTreeItemId next = GetNextSibling(item); wxString expression = event.GetLabel(); expression.Trim().Trim(false); if (expression.empty()) { Delete(item); event.Veto(); } else { SetItemText(item, expression); UpdateItem(item); } CreateEmptySlotIfNeeded(); // Select the next item. if (!next.IsOk()) { wxTreeItemIdValue cookie; next = GetLastChild(GetRootItem(), cookie); } SelectItem(next); } m_editing = false; }
void nuiContainer::GetChildren(nuiSize X, nuiSize Y, nuiWidgetList& rChildren, bool DeepSearch) { CheckValid(); X -= mRect.mLeft; Y -= mRect.mTop; IteratorPtr pIt; for (pIt = GetLastChild(); pIt && pIt->IsValid(); GetPreviousChild(pIt)) { nuiWidgetPtr pItem = pIt->GetWidget(); if (pItem && pItem->IsInsideFromParent(X,Y)) { if (DeepSearch) { nuiContainerPtr pContainer = dynamic_cast<nuiContainerPtr>(pItem); if (pContainer) pContainer->GetChildren(X, Y, rChildren, DeepSearch); } rChildren.push_back(pItem); } } delete pIt; }
nuiWidgetPtr nuiContainer::GetPreviousFocussableChild(nuiWidgetPtr pChild) const { CheckValid(); ConstIteratorPtr pIt = pChild ? GetChildIterator(pChild) : GetLastChild(); if (!pIt->IsValid()) return NULL; if (pChild) GetPreviousChild(pIt); while (pIt->IsValid() && !pIt->GetWidget()->GetWantKeyboardFocus() && pIt->GetWidget()) GetPreviousChild(pIt); if (pIt->IsValid()) { nuiWidgetPtr pW = pIt->GetWidget(); delete pIt; return pW; } delete pIt; return NULL; }
nuiWidgetPtr nuiContainer::GetChild(nuiSize X, nuiSize Y) { CheckValid(); X -= mRect.mLeft; Y -= mRect.mTop; IteratorPtr pIt; for (pIt = GetLastChild(); pIt && pIt->IsValid(); GetPreviousChild(pIt)) { nuiWidgetPtr pItem = pIt->GetWidget(); if (pItem && pItem->IsInsideFromSelf(X,Y)) { delete pIt; nuiContainerPtr pContainer = dynamic_cast<nuiContainerPtr>(pItem); if (pContainer) return pContainer->GetChild(X,Y); else return pItem; } } delete pIt; return this; }
void CLocalTreeView::Refresh() { wxLogNull nullLog; const wxString separator = wxFileName::GetPathSeparator(); std::list<t_dir> dirsToCheck; #ifdef __WXMSW__ int prevErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); wxTreeItemIdValue tmp; wxTreeItemId child = GetFirstChild(m_drives, tmp); while (child) { if (IsExpanded(child)) { wxString drive = GetItemText(child); int pos = drive.Find(_T(" ")); if (pos != -1) drive = drive.Left(pos); t_dir dir; dir.dir = drive + separator; dir.item = child; dirsToCheck.push_back(dir); } child = GetNextSibling(child); } #else t_dir dir; dir.dir = separator; dir.item = GetRootItem(); dirsToCheck.push_back(dir); #endif CFilterDialog filter; while (!dirsToCheck.empty()) { t_dir dir = dirsToCheck.front(); dirsToCheck.pop_front(); wxDir find(dir.dir); if (!find.IsOpened()) { // Dir does exist (listed in parent) but may not be accessible. // Recurse into children anyhow, they might be accessible again. wxTreeItemIdValue value; wxTreeItemId child = GetFirstChild(dir.item, value); while (child) { t_dir subdir; subdir.dir = dir.dir + GetItemText(child) + separator; subdir.item = child; dirsToCheck.push_back(subdir); child = GetNextSibling(child); } continue; } wxString file; bool found = find.GetFirst(&file, _T(""), wxDIR_DIRS | wxDIR_HIDDEN); std::list<wxString> dirs; while (found) { if (file == _T("")) { wxGetApp().DisplayEncodingWarning(); found = find.GetNext(&file); continue; } wxFileName fn(dir.dir + file); const bool isDir = fn.DirExists(); wxLongLong size; wxStructStat buf; int result = wxStat(fn.GetFullPath(), &buf); if (!isDir && !result) size = buf.st_size; else size = -1; int attributes; #ifdef __WXMSW__ DWORD tmp = GetFileAttributes(fn.GetFullPath()); if (tmp == INVALID_FILE_ATTRIBUTES) attributes = 0; else attributes = tmp; #else if (!result) attributes = buf.st_mode & 0x777; else attributes = -1; #endif //__WXMSW__ if (!filter.FilenameFiltered(file, isDir, size , true, attributes)) dirs.push_back(file); found = find.GetNext(&file); } dirs.sort(sortfunc); bool inserted = false; wxTreeItemId child = GetLastChild(dir.item); std::list<wxString>::reverse_iterator iter = dirs.rbegin(); while (child && iter != dirs.rend()) { #ifdef __WXMSW__ int cmp = GetItemText(child).CmpNoCase(*iter); #else int cmp = GetItemText(child).Cmp(*iter); #endif if (!cmp) { if (!IsExpanded(child)) { wxTreeItemId subchild = GetLastChild(child); if (subchild && GetItemText(subchild) == _T("")) { if (!HasSubdir(dir.dir + *iter + separator)) Delete(subchild); } else if (!subchild) { if (HasSubdir(dir.dir + *iter + separator)) AppendItem(child, _T("")); } else { t_dir subdir; subdir.dir = dir.dir + *iter + separator; subdir.item = child; dirsToCheck.push_front(subdir); } } else { t_dir subdir; subdir.dir = dir.dir + *iter + separator; subdir.item = child; dirsToCheck.push_front(subdir); } child = GetPrevSibling(child); iter++; } else if (cmp > 0) { wxTreeItemId sel = GetSelection(); while (sel && sel != child) sel = GetItemParent(sel); wxTreeItemId prev = GetPrevSibling(child); if (!sel) Delete(child); child = prev; } else if (cmp < 0) { wxString fullname = dir.dir + *iter + separator; wxTreeItemId newItem = AppendItem(dir.item, *iter, GetIconIndex(::dir, fullname), GetIconIndex(opened_dir, fullname)); if (HasSubdir(fullname)) AppendItem(newItem, _T("")); iter++; inserted = true; } } while (child) { wxTreeItemId sel = GetSelection(); while (sel && sel != child) sel = GetItemParent(sel); wxTreeItemId prev = GetPrevSibling(child); if (!sel) Delete(child); child = prev; } while (iter != dirs.rend()) { wxString fullname = dir.dir + *iter + separator; wxTreeItemId newItem = AppendItem(dir.item, *iter, GetIconIndex(::dir, fullname), GetIconIndex(opened_dir, fullname)); if (HasSubdir(fullname)) AppendItem(newItem, _T("")); iter++; inserted = true; } if (inserted) SortChildren(dir.item); } #ifdef __WXMSW__ SetErrorMode(prevErrorMode); #endif }
void CFormulaNode::Recalculate_VerticalCenter( const SizeFde &sz ) { RealFde vc = sz.height() / 2.0; switch( getAlignmentType() ) { case FBtnChildPos::Child: if( getAlignmentValue() >= 1 && (getAlignmentValue() - 1) < getGraphPrimNumber() ) { const RectFde& _t = getGraphPrimitivePositionRect( getAlignmentValue() - 1 ); vc = (_t.top() + _t.bottom()) / 2.0; } break; case FBtnChildPos::Child_Average: if( getAlignmentValue() >= 1 && (getAlignmentValue() - 1) < getGraphPrimNumber() ) { vc = 0.0; for( long i = 0; i <= getAlignmentValue() - 1; i++ ) { const RectFde& _t = getGraphPrimitivePositionRect( i ); vc += _t.top() + _t.bottom(); } vc = vc / (getAlignmentValue() * 2.0); } break; case FBtnChildPos::MSPACE_Exact_HeightDepth: case FBtnChildPos::Frame: if( (getAlignmentValue() - 1) >= 0 && (getAlignmentValue() - 1) < GetChildCount() ) { CNode *pNode = GetChild( getAlignmentValue() - 1 ); if( pNode ) vc = pNode->GetPosition().y() + pNode->GetVerticalCenter(); } break; case FBtnChildPos::Frame_Blank_Average: { CNode *pNodeFirst = GetFirstChild(); CNode *pNodeLast = GetLastChild(); if( pNodeFirst != NULL && pNodeLast != NULL ) { vc = (pNodeFirst->GetPosition().y() + pNodeFirst->GetSize().height() + pNodeLast->GetPosition().y()) / 2.0; } } break; case FBtnChildPos::Half: break; case FBtnChildPos::TableAxis: if( (getAlignmentValue() - 1) >= 0 && (getAlignmentValue() - 1) < GetChildCount() ) { CNode *pNode = GetChild( getAlignmentValue() - 1 ); if( pNode ) vc = pNode->GetPosition().y() + pNode->GetSize().height() / 2.0; } break; case FBtnChildPos::TableCenter2Baseline: case FBtnChildPos::TableTop2Baseline: case FBtnChildPos::TableBottom2Baseline: { RealFde asc = ::getCurrentDefaultAscent( GetLevel() ); RealFde h = ::getCurrentDefaultSize( GetLevel() ).height(); vc = getAscent( sz ) - asc + h - asc / 2.0; } break; default: break; } SetVerticalCenter( vc ); }
void WatchWindow::OnKeyDown(wxTreeEvent& event) { if (event.GetKeyCode() == WXK_DELETE || event.GetKeyCode() == WXK_BACK) { wxTreeItemId item = GetSelection(); if (item.IsOk() && GetItemParent(item) == m_root) { wxTreeItemId next = GetNextSibling(item); Delete(item); CreateEmptySlotIfNeeded(); // Select the next item. if (!next.IsOk()) { wxTreeItemIdValue cookie; next = GetLastChild(GetRootItem(), cookie); } SelectItem(next); } } else { // If we're not currently editing a field, begin editing. This // eliminates the need to double click to begin editing. int code = event.GetKeyCode(); if (!m_editing && code < 256 && (isgraph(code) || IsSpace(code))) { // Get the currently selected item in the list. wxTreeItemId item = GetSelection(); if (item.IsOk()) { if (IsSpace(code)) { EditLabel(item, ""); } else { EditLabel(item, wxString(static_cast<char>(code))); } event.Skip(false); } } else { event.Skip(true); } } }
void CLocalTreeView::Refresh() { wxLogNull nullLog; const wxString separator = wxFileName::GetPathSeparator(); std::list<t_dir> dirsToCheck; #ifdef __WXMSW__ int prevErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); wxTreeItemIdValue tmp; wxTreeItemId child = GetFirstChild(m_drives, tmp); while (child) { if (IsExpanded(child)) { wxString drive = GetItemText(child); int pos = drive.Find(_T(" ")); if (pos != -1) drive = drive.Left(pos); t_dir dir; dir.dir = drive + separator; dir.item = child; dirsToCheck.push_back(dir); } child = GetNextSibling(child); } #else t_dir dir; dir.dir = separator; dir.item = GetRootItem(); dirsToCheck.push_back(dir); #endif CFilterManager filter; while (!dirsToCheck.empty()) { t_dir dir = dirsToCheck.front(); dirsToCheck.pop_front(); // Step 1: Check if directory exists CLocalFileSystem local_filesystem; if (!local_filesystem.BeginFindFiles(dir.dir, true)) { // Dir does exist (listed in parent) but may not be accessible. // Recurse into children anyhow, they might be accessible again. wxTreeItemIdValue value; wxTreeItemId child = GetFirstChild(dir.item, value); while (child) { t_dir subdir; subdir.dir = dir.dir + GetItemText(child) + separator; subdir.item = child; dirsToCheck.push_back(subdir); child = GetNextSibling(child); } continue; } // Step 2: Enumerate subdirectories on disk and sort them std::list<wxString> dirs; wxString file; const wxLongLong size(-1); bool was_link; bool is_dir; int attributes; wxDateTime date; while (local_filesystem.GetNextFile(file, was_link, is_dir, 0, &date, &attributes)) { if (file == _T("")) { wxGetApp().DisplayEncodingWarning(); continue; } if (filter.FilenameFiltered(file, dir.dir, true, size, true, attributes, date.IsValid() ? &date : 0)) continue; dirs.push_back(file); } dirs.sort(sortfunc); bool inserted = false; // Step 3: Merge list of subdirectories with subtree. wxTreeItemId child = GetLastChild(dir.item); std::list<wxString>::reverse_iterator iter = dirs.rbegin(); while (child || iter != dirs.rend()) { int cmp; if (child && iter != dirs.rend()) #ifdef __WXMSW__ cmp = GetItemText(child).CmpNoCase(*iter); #else cmp = GetItemText(child).Cmp(*iter); #endif else if (child) cmp = 1; else cmp = -1; if (!cmp) { // Found item with same name. Mark it for further processing if (!IsExpanded(child)) { wxString path = dir.dir + *iter + separator; if (!CheckSubdirStatus(child, path)) { t_dir subdir; subdir.dir = path; subdir.item = child; dirsToCheck.push_front(subdir); } } else { t_dir subdir; subdir.dir = dir.dir + *iter + separator; subdir.item = child; dirsToCheck.push_front(subdir); } child = GetPrevSibling(child); ++iter; } else if (cmp > 0) { // Subdirectory currently in tree no longer exists. // Delete child from tree, unless current selection // is in the subtree. wxTreeItemId sel = GetSelection(); while (sel && sel != child) sel = GetItemParent(sel); wxTreeItemId prev = GetPrevSibling(child); if (!sel) Delete(child); child = prev; } else if (cmp < 0) { // New subdirectory, add treeitem wxString fullname = dir.dir + *iter + separator; wxTreeItemId newItem = AppendItem(dir.item, *iter, GetIconIndex(::dir, fullname), #ifdef __WXMSW__ -1 #else GetIconIndex(opened_dir, fullname) #endif ); CheckSubdirStatus(newItem, fullname); ++iter; inserted = true; } } if (inserted) SortChildren(dir.item); }
void CLocalTreeView::Refresh() { wxLogNull nullLog; const wxString separator = wxFileName::GetPathSeparator(); std::list<t_dir> dirsToCheck; #ifdef __WXMSW__ int prevErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); wxTreeItemIdValue tmp; wxTreeItemId child = GetFirstChild(m_drives, tmp); while (child) { if (IsExpanded(child)) { wxString drive = GetItemText(child); int pos = drive.Find(_T(" ")); if (pos != -1) drive = drive.Left(pos); t_dir dir; dir.dir = drive + separator; dir.item = child; dirsToCheck.push_back(dir); } child = GetNextSibling(child); } #else t_dir dir; dir.dir = separator; dir.item = GetRootItem(); dirsToCheck.push_back(dir); #endif CFilterManager filter; while (!dirsToCheck.empty()) { t_dir dir = dirsToCheck.front(); dirsToCheck.pop_front(); CLocalFileSystem local_filesystem; if (!local_filesystem.BeginFindFiles(dir.dir, true)) { // Dir does exist (listed in parent) but may not be accessible. // Recurse into children anyhow, they might be accessible again. wxTreeItemIdValue value; wxTreeItemId child = GetFirstChild(dir.item, value); while (child) { t_dir subdir; subdir.dir = dir.dir + GetItemText(child) + separator; subdir.item = child; dirsToCheck.push_back(subdir); child = GetNextSibling(child); } continue; } std::list<wxString> dirs; wxString file; const wxLongLong size(-1); bool was_link; bool is_dir; int attributes; while (local_filesystem.GetNextFile(file, was_link, is_dir, 0, 0, &attributes)) { if (file == _T("")) { wxGetApp().DisplayEncodingWarning(); continue; } if (filter.FilenameFiltered(file, dir.dir, true, size, true, attributes)) continue; dirs.push_back(file); } dirs.sort(sortfunc); bool inserted = false; wxTreeItemId child = GetLastChild(dir.item); std::list<wxString>::reverse_iterator iter = dirs.rbegin(); while (child && iter != dirs.rend()) { #ifdef __WXMSW__ int cmp = GetItemText(child).CmpNoCase(*iter); #else int cmp = GetItemText(child).Cmp(*iter); #endif if (!cmp) { if (!IsExpanded(child)) { wxString path = dir.dir + *iter + separator; if (!CheckSubdirStatus(child, path)) { t_dir subdir; subdir.dir = path; subdir.item = child; dirsToCheck.push_front(subdir); } } else { t_dir subdir; subdir.dir = dir.dir + *iter + separator; subdir.item = child; dirsToCheck.push_front(subdir); } child = GetPrevSibling(child); iter++; } else if (cmp > 0) { wxTreeItemId sel = GetSelection(); while (sel && sel != child) sel = GetItemParent(sel); wxTreeItemId prev = GetPrevSibling(child); if (!sel) Delete(child); child = prev; } else if (cmp < 0) { wxString fullname = dir.dir + *iter + separator; wxTreeItemId newItem = AppendItem(dir.item, *iter, GetIconIndex(::dir, fullname), #ifdef __WXMSW__ -1 #else GetIconIndex(opened_dir, fullname) #endif ); CheckSubdirStatus(newItem, fullname); iter++; inserted = true; } } while (child) { wxTreeItemId sel = GetSelection(); while (sel && sel != child) sel = GetItemParent(sel); wxTreeItemId prev = GetPrevSibling(child); if (!sel) Delete(child); child = prev; } while (iter != dirs.rend()) { wxString fullname = dir.dir + *iter + separator; wxTreeItemId newItem = AppendItem(dir.item, *iter, GetIconIndex(::dir, fullname), #ifdef __WXMSW__ -1 #else GetIconIndex(opened_dir, fullname) #endif ); CheckSubdirStatus(newItem, fullname); iter++; inserted = true; } if (inserted) SortChildren(dir.item); } #ifdef __WXMSW__ SetErrorMode(prevErrorMode); #endif }
void CRemoteTreeView::RefreshItem(wxTreeItemId parent, const CDirectoryListing& listing, bool will_select_parent) { SetItemImages(parent, false); wxTreeItemIdValue cookie; wxTreeItemId child = GetFirstChild(parent, cookie); if (!child || GetItemText(child).empty()) { DisplayItem(parent, listing); return; } CFilterManager filter; wxString const path = listing.path.GetPath(); wxArrayString dirs; for (unsigned int i = 0; i < listing.GetCount(); ++i) { if (!listing[i].is_dir()) continue; if (!filter.FilenameFiltered(listing[i].name, path, true, -1, false, 0, listing[i].time)) dirs.push_back(listing[i].name); } auto const& sortFunc = CFileListCtrlSortBase::GetCmpFunction(m_nameSortMode); dirs.Sort(sortFunc); bool inserted = false; child = GetLastChild(parent); wxArrayString::reverse_iterator iter = dirs.rbegin(); while (child && iter != dirs.rend()) { int cmp = sortFunc(GetItemText(child), *iter); if (!cmp) { CServerPath childPath = listing.path; childPath.AddSegment(*iter); CDirectoryListing subListing; if (m_pState->m_pEngine->CacheLookup(childPath, subListing) == FZ_REPLY_OK) { if (!GetLastChild(child) && HasSubdirs(subListing, filter)) AppendItem(child, _T(""), -1, -1); SetItemImages(child, false); } else SetItemImages(child, true); child = GetPrevSibling(child); ++iter; } else if (cmp > 0) { // Child no longer exists wxTreeItemId sel = GetSelection(); while (sel && sel != child) sel = GetItemParent(sel); wxTreeItemId prev = GetPrevSibling(child); if (!sel || will_select_parent) Delete(child); child = prev; } else if (cmp < 0) { // New directory CServerPath childPath = listing.path; childPath.AddSegment(*iter); CDirectoryListing subListing; if (m_pState->m_pEngine->CacheLookup(childPath, subListing) == FZ_REPLY_OK) { wxTreeItemId childItem = AppendItem(parent, *iter, 0, 2, 0); if (childItem) { SetItemImages(childItem, false); if (HasSubdirs(subListing, filter)) { AppendItem(childItem, _T(""), -1, -1); } } } else { wxTreeItemId childItem = AppendItem(parent, *iter, 1, 3, 0); if (childItem) { SetItemImages(childItem, true); } } ++iter; inserted = true; } } while (child) { // Child no longer exists wxTreeItemId sel = GetSelection(); while (sel && sel != child) sel = GetItemParent(sel); wxTreeItemId prev = GetPrevSibling(child); if (!sel || will_select_parent) Delete(child); child = prev; } while (iter != dirs.rend()) { CServerPath childPath = listing.path; childPath.AddSegment(*iter); CDirectoryListing subListing; if (m_pState->m_pEngine->CacheLookup(childPath, subListing) == FZ_REPLY_OK) { wxTreeItemId childItem = AppendItem(parent, *iter, 0, 2, 0); if (childItem) { SetItemImages(childItem, false); if (HasSubdirs(subListing, filter)) { AppendItem(childItem, _T(""), -1, -1); } } } else { wxTreeItemId childItem = AppendItem(parent, *iter, 1, 3, 0); if (childItem) { SetItemImages(childItem, true); } } ++iter; inserted = true; } if (inserted) SortChildren(parent); }
////// Private event management: bool nuiContainer::DispatchMouseClick(const nglMouseInfo& rInfo) { CheckValid(); nuiAutoRef; if (!mMouseEventEnabled || mTrashed) return false; bool hasgrab = HasGrab(rInfo.TouchId); if (IsDisabled() && !hasgrab) return false; nglMouseInfo info(rInfo); GlobalToLocal(info.X, info.Y); // Get a chance to preempt the mouse event before the children get it: if (PreMouseClicked(info)) { Grab(); return true; } if (IsInsideFromRoot(rInfo.X, rInfo.Y) || hasgrab) { if (!hasgrab) { IteratorPtr pIt; for (pIt = GetLastChild(false); pIt && pIt->IsValid(); GetPreviousChild(pIt)) { nuiWidgetPtr pItem = pIt->GetWidget(); if (pItem) { if (IsEnabled() && !HasGrab(rInfo.TouchId)) { if (pItem->DispatchMouseClick(rInfo)) { delete pIt; return true; } } } } delete pIt; } nglMouseInfo info(rInfo); GlobalToLocal(info.X, info.Y); if (PreClicked(info)) { Grab(); return true; } bool ret = MouseClicked(info); ret |= Clicked(info); ret = ret | (!mClickThru); if (ret) Grab(); return ret; } return false; }
void CRemoteTreeView::RefreshItem(wxTreeItemId parent, const CDirectoryListing& listing, bool will_select_parent) { SetItemImages(parent, false); wxTreeItemIdValue cookie; wxTreeItemId child = GetFirstChild(parent, cookie); if (!child || GetItemText(child) == _T("")) { DisplayItem(parent, listing); return; } CFilterManager filter; const wxString path = listing.path.GetPath(); std::list<wxString> dirs; for (unsigned int i = 0; i < listing.GetCount(); i++) { if (!listing[i].is_dir()) continue; if (!filter.FilenameFiltered(listing[i].name, path, true, -1, false, 0, listing[i].has_date() ? &listing[i].time : 0)) dirs.push_back(listing[i].name); } dirs.sort(sortfunc); bool inserted = false; child = GetLastChild(parent); std::list<wxString>::reverse_iterator iter = dirs.rbegin(); while (child && iter != dirs.rend()) { int cmp = GetItemText(child).CmpNoCase(*iter); if (!cmp) cmp = GetItemText(child).Cmp(*iter); if (!cmp) { CServerPath path = listing.path; path.AddSegment(*iter); CDirectoryListing subListing; if (m_pState->m_pEngine->CacheLookup(path, subListing) == FZ_REPLY_OK) { if (!GetLastChild(child) && HasSubdirs(subListing, filter)) AppendItem(child, _T(""), -1, -1); SetItemImages(child, false); } else SetItemImages(child, true); child = GetPrevSibling(child); iter++; } else if (cmp > 0) { // Child no longer exists wxTreeItemId sel = GetSelection(); while (sel && sel != child) sel = GetItemParent(sel); wxTreeItemId prev = GetPrevSibling(child); if (!sel || will_select_parent) Delete(child); child = prev; } else if (cmp < 0) { // New directory CServerPath path = listing.path; path.AddSegment(*iter); CDirectoryListing subListing; if (m_pState->m_pEngine->CacheLookup(path, subListing) == FZ_REPLY_OK) { wxTreeItemId child = AppendItem(parent, *iter, 0, 2, 0); SetItemImages(child, false); if (HasSubdirs(subListing, filter)) AppendItem(child, _T(""), -1, -1); } else { wxTreeItemId child = AppendItem(parent, *iter, 1, 3, 0); if (child) SetItemImages(child, true); } iter++; inserted = true; } } while (child) { // Child no longer exists wxTreeItemId sel = GetSelection(); while (sel && sel != child) sel = GetItemParent(sel); wxTreeItemId prev = GetPrevSibling(child); if (!sel || will_select_parent) Delete(child); child = prev; } while (iter != dirs.rend()) { CServerPath path = listing.path; path.AddSegment(*iter); CDirectoryListing subListing; if (m_pState->m_pEngine->CacheLookup(path, subListing) == FZ_REPLY_OK) { wxTreeItemId child = AppendItem(parent, *iter, 0, 2, 0); SetItemImages(child, false); if (HasSubdirs(subListing, filter)) AppendItem(child, _T(""), -1, -1); } else { wxTreeItemId child = AppendItem(parent, *iter, 1, 3, 0); SetItemImages(child, true); } iter++; inserted = true; } if (inserted) SortChildren(parent); }
TBWidget *TBLayout::GetFirstInLayoutOrder() const { return m_packed.mode_reverse_order ? GetLastChild() : GetFirstChild(); }
nuiWidgetPtr nuiContainer::DispatchMouseMove(const nglMouseInfo& rInfo) { CheckValid(); nuiAutoRef; if (!mMouseEventEnabled || mTrashed) return false; nuiWidgetPtr pHandled=NULL; bool inside=false,res=false; bool hasgrab = HasGrab(rInfo.TouchId); if (IsDisabled() && !hasgrab) return NULL; nglMouseInfo info(rInfo); GlobalToLocal(info.X, info.Y); // Get a chance to preempt the mouse event before the children get it: if (PreMouseMoved(info)) return this; if (IsInsideFromRoot(rInfo.X, rInfo.Y) || hasgrab) { inside = true; // If the object has the grab we should not try to notify its children of mouse events! if (!hasgrab) { IteratorPtr pIt; for (pIt = GetLastChild(false); pIt && pIt->IsValid(); GetPreviousChild(pIt)) { nuiWidgetPtr pItem = pIt->GetWidget(); if (pItem) { if (pItem->IsVisible()) { pHandled = pItem->DispatchMouseMove(rInfo); } } if (pHandled) { // stop as soon as someone caught the event delete pIt; return pHandled; } } delete pIt; } res = MouseMoved(info); res |= MovedMouse(info); } else { if (GetHover()) { res = MouseMoved(info); res |= MovedMouse(info); } } if (!pHandled && (res | (!mClickThru)) && inside) { nuiTopLevelPtr pRoot = GetTopLevel(); if (pRoot) return this; } if (pHandled) return pHandled; return (res && inside) ? this : NULL; }