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 TQt, and distribute the resulting executable,
00022     without including the source code for TQt 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 <tdelistview.h>
00032 #include <tdelocale.h>
00033 
00034 #include <tqlayout.h>
00035 #include <tqmap.h>
00036 #include <tqwidget.h>
00037 
00038 namespace Akregator
00039 {
00040 
00041 class SelectNodeDialog::SelectNodeDialogPrivate
00042 {
00043     public:
00044     SimpleNodeSelector* widget;
00045 };
00046 
00047 SelectNodeDialog::SelectNodeDialog(FeedList* feedList, TQWidget* 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, TQT_SIGNAL(signalNodeSelected(TreeNode*)), this, TQT_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     TDEListView* view;
00085     FeedList* list;
00086     NodeVisitor* visitor;
00087     TQMap<TreeNode*,TQListViewItem*> nodeToItem;
00088     TQMap<TQListViewItem*, TreeNode*> itemToNode;
00089 };
00090 
00091 class SimpleNodeSelector::NodeVisitor : public TreeNodeVisitor
00092 {
00093     public:
00094 
00095     NodeVisitor(SimpleNodeSelector* view) : TreeNodeVisitor(), m_view(view) {}
00096     virtual ~NodeVisitor() {}
00097 
00098     void createItems(TreeNode* node)
00099     {
00100         node->accept(this);
00101     }
00102 
00103     virtual bool visitFolder(Folder* node)
00104     {
00105         visitTreeNode(node);
00106         TQValueList<TreeNode*> children = node->children();
00107         m_view->d->nodeToItem[node]->setExpandable(true);
00108         for (TQValueList<TreeNode*>::ConstIterator it = children.begin(); it != children.end(); ++it)
00109              createItems(*it);
00110         return true;
00111     }
00112 
00113     virtual bool visitTreeNode(TreeNode* node)
00114     {
00115         TQListViewItem* pi = node->parent() ? m_view->d->nodeToItem[node->parent()] : 0;
00116          
00117         TDEListViewItem* item = 0;
00118         if (pi != 0)
00119              item = new TDEListViewItem(pi, node->title());
00120         else
00121              item = new TDEListViewItem(m_view->d->view, node->title());
00122         item->setExpandable(false);
00123         m_view->d->nodeToItem.insert(node, item);
00124         m_view->d->itemToNode.insert(item, node);
00125         connect(node, TQT_SIGNAL(signalDestroyed(TreeNode*)), m_view, TQT_SLOT(slotNodeDestroyed(TreeNode*)));
00126         return true;
00127     }
00128 
00129     private:
00130 
00131     SimpleNodeSelector* m_view;
00132 };
00133 
00134 
00135 SimpleNodeSelector::SimpleNodeSelector(FeedList* feedList, TQWidget* parent, const char* name) : TQWidget(parent, name), d(new SimpleNodeSelectorPrivate)
00136 {
00137     d->list = feedList;
00138     connect(feedList, TQT_SIGNAL(signalDestroyed(FeedList*)), this, TQT_SLOT(slotFeedListDestroyed(FeedList*)));
00139 
00140     d->view = new TDEListView(this);
00141     d->view->setRootIsDecorated(true);
00142     d->view->addColumn(i18n("Feeds"));
00143     
00144     connect(d->view, TQT_SIGNAL(selectionChanged(TQListViewItem*)), this, TQT_SLOT(slotItemSelected(TQListViewItem*)));
00145 
00146     TQGridLayout* layout = new TQGridLayout(this, 1, 1);
00147     layout->addWidget(d->view, 0, 0);
00148 
00149     d->visitor = new NodeVisitor(this);
00150 
00151     d->visitor->createItems(d->list->rootNode());
00152     d->nodeToItem[d->list->rootNode()]->setOpen(true);
00153     d->view->ensureItemVisible(d->nodeToItem[d->list->rootNode()]);
00154 }
00155 
00156 SimpleNodeSelector::~SimpleNodeSelector()
00157 {
00158     delete d->visitor;
00159     delete d;
00160     d = 0;
00161 }
00162 
00163 TreeNode* SimpleNodeSelector::selectedNode() const
00164 {
00165     return d->itemToNode[d->view->selectedItem()];
00166 }
00167 
00168 void SimpleNodeSelector::slotSelectNode(TreeNode* node)
00169 {
00170     TQListViewItem* item = d->nodeToItem[node];
00171     if (item != 0)
00172         d->view->setSelected(item, true);
00173 }
00174 
00175 void SimpleNodeSelector::slotFeedListDestroyed(FeedList* /*list*/)
00176 {
00177     d->nodeToItem.clear();
00178     d->itemToNode.clear();
00179     d->view->clear();
00180 }
00181 
00182 void SimpleNodeSelector::slotItemSelected(TQListViewItem* item)
00183 {
00184     emit signalNodeSelected(d->itemToNode[item]);
00185 }
00186 
00187 void SimpleNodeSelector::slotNodeDestroyed(TreeNode* node)
00188 {
00189     if (d->nodeToItem.contains(node))
00190     {
00191         TQListViewItem* item = d->nodeToItem[node];
00192         d->nodeToItem.remove(node);
00193         d->itemToNode.remove(item);
00194         delete item;
00195     }
00196 }
00197 
00198 } // namespace Akregator
00199 
00200 #include "simplenodeselector.moc"
00201