akregator/src

simplenodeselector.cpp

00001 /*
00002     This file is part of Akregator.
00003 
00004     Copyright (C) 2005 Frank Osterfeld <frank.osterfeld at kdemail.net>
00005 
00006     This program is free software; you can redistribute it and/or modify
00007     it under the terms of the GNU General Public License as published by
00008     the Free Software Foundation; either version 2 of the License, or
00009     (at your option) any later version.
00010 
00011     This program is distributed in the hope that it will be useful,
00012     but WITHOUT ANY WARRANTY; without even the implied warranty of
00013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00014     GNU General Public License for more details.
00015 
00016     You should have received a copy of the GNU General Public License
00017     along with this program; if not, write to the Free Software
00018     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00019 
00020     As a special exception, permission is given to link this program
00021     with any edition of Qt, and distribute the resulting executable,
00022     without including the source code for Qt in the source distribution.
00023 */
00024 
00025 #include "feedlist.h"
00026 #include "folder.h"
00027 #include "simplenodeselector.h"
00028 #include "treenode.h"
00029 #include "treenodevisitor.h"
00030 
00031 #include <klistview.h>
00032 #include <klocale.h>
00033 
00034 #include <qlayout.h>
00035 #include <qmap.h>
00036 #include <qwidget.h>
00037 
00038 namespace Akregator
00039 {
00040 
00041 class SelectNodeDialog::SelectNodeDialogPrivate
00042 {
00043     public:
00044     SimpleNodeSelector* widget;
00045 };
00046 
00047 SelectNodeDialog::SelectNodeDialog(FeedList* feedList, QWidget* parent, char* name) : 
00048  KDialogBase(parent, name, true, i18n("Select Feed or Folder"),
00049                   KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok, true), d(new SelectNodeDialogPrivate)
00050 {
00051     d->widget = new SimpleNodeSelector(feedList, this);
00052 
00053     connect(d->widget, SIGNAL(signalNodeSelected(TreeNode*)), this, SLOT(slotNodeSelected(TreeNode*)));
00054 
00055     setMainWidget(d->widget);
00056     enableButtonOK(false);
00057 }
00058 
00059 SelectNodeDialog::~SelectNodeDialog()
00060 {
00061     delete d;
00062     d = 0;
00063 }
00064 
00065 TreeNode* SelectNodeDialog::selectedNode() const
00066 {
00067     return d->widget->selectedNode();
00068 }
00069 
00070 void SelectNodeDialog::slotSelectNode(TreeNode* node)
00071 {
00072     d->widget->slotSelectNode(node);
00073 }
00074 
00075 void SelectNodeDialog::slotNodeSelected(TreeNode* node)
00076 {
00077     enableButtonOK(node != 0);
00078 }
00079 
00080 
00081 class SimpleNodeSelector::SimpleNodeSelectorPrivate
00082 {
00083     public:
00084     KListView* view;
00085     FeedList* list;
00086     NodeVisitor* visitor;
00087     QMap<TreeNode*,QListViewItem*> nodeToItem;
00088     QMap<QListViewItem*, TreeNode*> itemToNode;
00089 };
00090 
00091 class SimpleNodeSelector::NodeVisitor : public TreeNodeVisitor
00092 {
00093     public:
00094 
00095     NodeVisitor(SimpleNodeSelector* view) : TreeNodeVisitor(), m_view(view) {}
00096 
00097     void createItems(TreeNode* node)
00098     {
00099         node->accept(this);
00100     }
00101 
00102     virtual bool visitFolder(Folder* node)
00103     {
00104         visitTreeNode(node);
00105         QValueList<TreeNode*> children = node->children();
00106         m_view->d->nodeToItem[node]->setExpandable(true);
00107         for (QValueList<TreeNode*>::ConstIterator it = children.begin(); it != children.end(); ++it)
00108              createItems(*it);
00109         return true;
00110     }
00111 
00112     virtual bool visitTreeNode(TreeNode* node)
00113     {
00114         QListViewItem* pi = node->parent() ? m_view->d->nodeToItem[node->parent()] : 0;
00115          
00116         KListViewItem* item = 0;
00117         if (pi != 0)
00118              item = new KListViewItem(pi, node->title());
00119         else
00120              item = new KListViewItem(m_view->d->view, node->title());
00121         item->setExpandable(false);
00122         m_view->d->nodeToItem.insert(node, item);
00123         m_view->d->itemToNode.insert(item, node);
00124         connect(node, SIGNAL(signalDestroyed(TreeNode*)), m_view, SLOT(slotNodeDestroyed(TreeNode*)));
00125         return true;
00126     }
00127 
00128     private:
00129 
00130     SimpleNodeSelector* m_view;
00131 };
00132 
00133 
00134 SimpleNodeSelector::SimpleNodeSelector(FeedList* feedList, QWidget* parent, const char* name) : QWidget(parent, name), d(new SimpleNodeSelectorPrivate)
00135 {
00136     d->list = feedList;
00137     connect(feedList, SIGNAL(signalDestroyed(FeedList*)), this, SLOT(slotFeedListDestroyed(FeedList*)));
00138 
00139     d->view = new KListView(this);
00140     d->view->setRootIsDecorated(true);
00141     d->view->addColumn(i18n("Feeds"));
00142     
00143     connect(d->view, SIGNAL(selectionChanged(QListViewItem*)), this, SLOT(slotItemSelected(QListViewItem*)));
00144 
00145     QGridLayout* layout = new QGridLayout(this, 1, 1);
00146     layout->addWidget(d->view, 0, 0);
00147 
00148     d->visitor = new NodeVisitor(this);
00149 
00150     d->visitor->createItems(d->list->rootNode());
00151     d->nodeToItem[d->list->rootNode()]->setOpen(true);
00152     d->view->ensureItemVisible(d->nodeToItem[d->list->rootNode()]);
00153 }
00154 
00155 SimpleNodeSelector::~SimpleNodeSelector()
00156 {
00157     delete d->visitor;
00158     delete d;
00159     d = 0;
00160 }
00161 
00162 TreeNode* SimpleNodeSelector::selectedNode() const
00163 {
00164     return d->itemToNode[d->view->selectedItem()];
00165 }
00166 
00167 void SimpleNodeSelector::slotSelectNode(TreeNode* node)
00168 {
00169     QListViewItem* item = d->nodeToItem[node];
00170     if (item != 0)
00171         d->view->setSelected(item, true);
00172 }
00173 
00174 void SimpleNodeSelector::slotFeedListDestroyed(FeedList* /*list*/)
00175 {
00176     d->nodeToItem.clear();
00177     d->itemToNode.clear();
00178     d->view->clear();
00179 }
00180 
00181 void SimpleNodeSelector::slotItemSelected(QListViewItem* item)
00182 {
00183     emit signalNodeSelected(d->itemToNode[item]);
00184 }
00185 
00186 void SimpleNodeSelector::slotNodeDestroyed(TreeNode* node)
00187 {
00188     if (d->nodeToItem.contains(node))
00189     {
00190         QListViewItem* item = d->nodeToItem[node];
00191         d->nodeToItem.remove(node);
00192         d->itemToNode.remove(item);
00193         delete item;
00194     }
00195 }
00196 
00197 } // namespace Akregator
00198 
00199 #include "simplenodeselector.moc"
00200     
KDE Home | KDE Accessibility Home | Description of Access Keys