File indexing completed on 2024-04-21 05:50:20

0001 /* This file is part of the KDE project
0002    Copyright (C) 2005 Daniel Teske <teske@squorn.de>
0003 
0004    This program is free software; you can redistribute it and/or
0005    modify it under the terms of the GNU General Public License as
0006    published by the Free Software Foundation; either version 2 of
0007    the License, or (at your option) version 3.
0008 
0009    This program is distributed in the hope that it will be useful,
0010    but WITHOUT ANY WARRANTY; without even the implied warranty of
0011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0012    GNU General Public License for more details.
0013 
0014    You should have received a copy of the GNU General Public License
0015    along with this program.  If not, see <http://www.gnu.org/licenses/>
0016 */
0017 
0018 #include "treeitem_p.h"
0019 
0020 TreeItem::TreeItem(const KBookmark &bk, TreeItem *parent)
0021     : mParent(parent)
0022     , mBookmark(bk)
0023     , mInitDone(false)
0024 {
0025 }
0026 
0027 TreeItem::~TreeItem()
0028 {
0029     qDeleteAll(children);
0030     children.clear();
0031 }
0032 
0033 TreeItem *TreeItem::child(int row)
0034 {
0035     if (!mInitDone)
0036         initChildren();
0037     if (row < 0 || row >= children.count())
0038         return parent();
0039     return children.at(row);
0040 }
0041 
0042 int TreeItem::childCount()
0043 {
0044     if (!mInitDone)
0045         initChildren();
0046     return children.count();
0047 }
0048 
0049 TreeItem *TreeItem::parent() const
0050 {
0051     return mParent;
0052 }
0053 
0054 void TreeItem::insertChildren(int first, int last)
0055 {
0056     // Find child number last
0057     KBookmarkGroup parent = bookmark().toGroup();
0058     KBookmark child = parent.first();
0059     for (int j = 0; j < last; ++j)
0060         child = parent.next(child);
0061 
0062     // insert children
0063     int i = last;
0064     do {
0065         children.insert(i, new TreeItem(child, this));
0066         child = parent.previous(child);
0067         --i;
0068     } while (i >= first);
0069 }
0070 
0071 void TreeItem::deleteChildren(int first, int last)
0072 {
0073     if (!mInitDone) {
0074         return;
0075     }
0076     Q_ASSERT(first <= last);
0077     Q_ASSERT(last < children.count());
0078     QList<TreeItem *>::iterator firstIt, lastIt, it;
0079     firstIt = children.begin() + first;
0080     lastIt = children.begin() + last + 1;
0081     for (it = firstIt; it != lastIt; ++it) {
0082         delete *it;
0083     }
0084     children.erase(firstIt, lastIt);
0085 }
0086 
0087 KBookmark TreeItem::bookmark() const
0088 {
0089     return mBookmark;
0090 }
0091 
0092 void TreeItem::initChildren()
0093 {
0094     mInitDone = true;
0095     if (mBookmark.isGroup()) {
0096         KBookmarkGroup parent = mBookmark.toGroup();
0097         for (KBookmark child = parent.first(); child.hasParent(); child = parent.next(child)) {
0098             TreeItem *item = new TreeItem(child, this);
0099             children.append(item);
0100         }
0101     }
0102 }
0103 
0104 TreeItem *TreeItem::treeItemForBookmark(const KBookmark &bk)
0105 {
0106     if (bk.address() == mBookmark.address())
0107         return this;
0108     if (!mInitDone) {
0109         initChildren();
0110     }
0111     QString commonParent = KBookmark::commonParent(bk.address(), mBookmark.address());
0112     if (commonParent == mBookmark.address()) // mBookmark is a parent of bk
0113     {
0114         QList<TreeItem *>::const_iterator it, end;
0115         end = children.constEnd();
0116         for (it = children.constBegin(); it != end; ++it) {
0117             KBookmark child = (*it)->bookmark();
0118             if (KBookmark::commonParent(child.address(), bk.address()) == child.address())
0119                 return (*it)->treeItemForBookmark(bk);
0120         }
0121         return nullptr;
0122     } else {
0123         if (parent() == nullptr)
0124             return nullptr;
0125         return parent()->treeItemForBookmark(bk);
0126     }
0127 }
0128 
0129 // kate: space-indent on; indent-width 4; replace-tabs on;