void BaseTreeBranch::updateOpenFolder() { KFileTreeViewItem *newItem; KFileTreeViewItem *item = root(); while (item) { if (item->isDir() && item->isOpen()) { updateDirectory( item->url() ); kapp->processEvents(QEventLoop::ExcludeUserInput | QEventLoop::ExcludeSocketNotifiers); // dive into the tree first newItem = dynamic_cast<KFileTreeViewItem *>(item->firstChild()); if (newItem) { // found child go ahead item = newItem; continue; }; }; // go up if no sibling available if (! item->nextSibling()) item = dynamic_cast<KFileTreeViewItem *>(item->parent()); if (item == root()) break; if (item) item = dynamic_cast<KFileTreeViewItem *>(item->nextSibling()); }; }
void BaseTreeBranch::addOpenFolder(QStringList* openFolder) { if (! openFolder) // just in case return; KFileTreeViewItem *newItem; KFileTreeViewItem *item = root(); while (item) { if (item->isDir() && item->isOpen()) { openFolder->append( item->url().url() ); // dive into the tree first newItem = dynamic_cast<KFileTreeViewItem *>(item->firstChild()); if (newItem) { // found child go ahead item = newItem; continue; }; }; // move up in the tree while (item && item != root()) { if (item->nextSibling()) { item = dynamic_cast<KFileTreeViewItem *>(item->nextSibling()); break; } else { item = dynamic_cast<KFileTreeViewItem *>(item->parent()); } } if (item == root()) break; }; }
/* * The signal that tells that a directory was deleted may arrive before the signal * for its children arrive. Thus, we must walk through the children of a dir and * remove them before removing the dir itself. */ void KFileTreeBranch::slotDeleteItem( KFileItem *it ) { if( !it ) return; kdDebug(250) << "Slot Delete Item hitted for " << it->url().prettyURL() << endl; KFileTreeViewItem *kfti = static_cast<KFileTreeViewItem*>(it->extraData(this)); if( kfti ) { kdDebug( 250 ) << "Child count: " << kfti->childCount() << endl; if( kfti->childCount() > 0 ) { KFileTreeViewItem *child = static_cast<KFileTreeViewItem*>(kfti->firstChild()); while( child ) { kdDebug(250) << "Calling child to be deleted !" << endl; KFileTreeViewItem *nextChild = static_cast<KFileTreeViewItem*>(child->nextSibling()); slotDeleteItem( child->fileItem()); child = nextChild; } } kdDebug(250) << "Found corresponding KFileTreeViewItem" << endl; if( m_lastFoundURL.equals(it->url(), true )) { m_lastFoundURL = KURL(); m_lastFoundItem = 0L; } delete( kfti ); } else { kdDebug(250) << "Error: tdefiletreeviewitem: "<< kfti << endl; } }
void KFileTreeBranch::slCompleted( const KURL& url ) { kdDebug(250) << "SlotCompleted hit for " << url.prettyURL() << endl; KFileTreeViewItem *currParent = findTVIByURL( url ); if( ! currParent ) return; kdDebug(250) << "current parent " << currParent << " is already listed: " << currParent->alreadyListed() << endl; emit( populateFinished(currParent)); emit( directoryChildCount(currParent, currParent->childCount())); /* This is a walk through the children of the last populated directory. * Here we start the dirlister on every child of the dir and wait for its * finish. When it has finished, we go to the next child. * This must be done for non local file systems in dirOnly- and Full-Mode * and for local file systems only in full mode, because the stat trick * (see addItem-Method) does only work for dirs, not for files in the directory. */ /* Set bit that the parent dir was listed completely */ currParent->setListed(true); kdDebug(250) << "recurseChildren: " << m_recurseChildren << endl; kdDebug(250) << "isLocalFile: " << m_startURL.isLocalFile() << endl; kdDebug(250) << "dirOnlyMode: " << dirOnlyMode() << endl; if( m_recurseChildren && (!m_startURL.isLocalFile() || ! dirOnlyMode()) ) { bool wantRecurseUrl = false; /* look if the url is in the list for url to recurse */ for ( KURL::List::Iterator it = m_openChildrenURLs.begin(); it != m_openChildrenURLs.end(); ++it ) { /* it is only interesting that the url _is_in_ the list. */ if( (*it).equals( url, true ) ) wantRecurseUrl = true; } KFileTreeViewItem *nextChild = 0; kdDebug(250) << "Recursing " << url.prettyURL() << "? " << wantRecurseUrl << endl; if( wantRecurseUrl && currParent ) { /* now walk again through the tree and populate the children to get +-signs */ /* This is the starting point. The visible folder has finished, processing the children has not yet started */ nextChild = static_cast<KFileTreeViewItem*> (static_cast<TQListViewItem*>(currParent)->firstChild()); if( ! nextChild ) { /* This happens if there is no child at all */ kdDebug( 250 ) << "No children to recuse" << endl; } /* Since we have listed the children to recurse, we can remove the entry * in the list of the URLs to see the children. */ m_openChildrenURLs.remove(url); } if( nextChild ) /* This implies that idx > -1 */ { /* Next child is defined. We start a dirlister job on every child item * which is a directory to find out how much children are in the child * of the last opened dir */ /* Skip non directory entries */ while( nextChild ) { if( nextChild->isDir() && ! nextChild->alreadyListed()) { KFileItem *kfi = nextChild->fileItem(); if( kfi && kfi->isReadable()) { KURL recurseUrl = kfi->url(); kdDebug(250) << "Starting to recurse NOW " << recurseUrl.prettyURL() << endl; openURL( recurseUrl, true ); } } nextChild = static_cast<KFileTreeViewItem*>(static_cast<TQListViewItem*>(nextChild->nextSibling())); // kdDebug(250) << "Next child " << m_nextChild << endl; } } } else { kdDebug(250) << "skipping to recurse in complete-slot" << endl; } }