akregator/src

simplenodeselector.cpp
1 /*
2  This file is part of Akregator.
3 
4  Copyright (C) 2005 Frank Osterfeld <frank.osterfeld at kdemail.net>
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program; if not, write to the Free Software
18  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 
20  As a special exception, permission is given to link this program
21  with any edition of TQt, and distribute the resulting executable,
22  without including the source code for TQt in the source distribution.
23 */
24 
25 #include "feedlist.h"
26 #include "folder.h"
27 #include "simplenodeselector.h"
28 #include "treenode.h"
29 #include "treenodevisitor.h"
30 
31 #include <klistview.h>
32 #include <klocale.h>
33 
34 #include <tqlayout.h>
35 #include <tqmap.h>
36 #include <tqwidget.h>
37 
38 namespace Akregator
39 {
40 
41 class SelectNodeDialog::SelectNodeDialogPrivate
42 {
43  public:
44  SimpleNodeSelector* widget;
45 };
46 
47 SelectNodeDialog::SelectNodeDialog(FeedList* feedList, TQWidget* parent, char* name) :
48  KDialogBase(parent, name, true, i18n("Select Feed or Folder"),
49  KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok, true), d(new SelectNodeDialogPrivate)
50 {
51  d->widget = new SimpleNodeSelector(feedList, this);
52 
53  connect(d->widget, TQT_SIGNAL(signalNodeSelected(TreeNode*)), this, TQT_SLOT(slotNodeSelected(TreeNode*)));
54 
55  setMainWidget(d->widget);
56  enableButtonOK(false);
57 }
58 
59 SelectNodeDialog::~SelectNodeDialog()
60 {
61  delete d;
62  d = 0;
63 }
64 
65 TreeNode* SelectNodeDialog::selectedNode() const
66 {
67  return d->widget->selectedNode();
68 }
69 
70 void SelectNodeDialog::slotSelectNode(TreeNode* node)
71 {
72  d->widget->slotSelectNode(node);
73 }
74 
75 void SelectNodeDialog::slotNodeSelected(TreeNode* node)
76 {
77  enableButtonOK(node != 0);
78 }
79 
80 
81 class SimpleNodeSelector::SimpleNodeSelectorPrivate
82 {
83  public:
84  KListView* view;
85  FeedList* list;
86  NodeVisitor* visitor;
87  TQMap<TreeNode*,TQListViewItem*> nodeToItem;
88  TQMap<TQListViewItem*, TreeNode*> itemToNode;
89 };
90 
91 class SimpleNodeSelector::NodeVisitor : public TreeNodeVisitor
92 {
93  public:
94 
95  NodeVisitor(SimpleNodeSelector* view) : TreeNodeVisitor(), m_view(view) {}
96 
97  void createItems(TreeNode* node)
98  {
99  node->accept(this);
100  }
101 
102  virtual bool visitFolder(Folder* node)
103  {
104  visitTreeNode(node);
105  TQValueList<TreeNode*> children = node->children();
106  m_view->d->nodeToItem[node]->setExpandable(true);
107  for (TQValueList<TreeNode*>::ConstIterator it = children.begin(); it != children.end(); ++it)
108  createItems(*it);
109  return true;
110  }
111 
112  virtual bool visitTreeNode(TreeNode* node)
113  {
114  TQListViewItem* pi = node->parent() ? m_view->d->nodeToItem[node->parent()] : 0;
115 
116  KListViewItem* item = 0;
117  if (pi != 0)
118  item = new KListViewItem(pi, node->title());
119  else
120  item = new KListViewItem(m_view->d->view, node->title());
121  item->setExpandable(false);
122  m_view->d->nodeToItem.insert(node, item);
123  m_view->d->itemToNode.insert(item, node);
124  connect(node, TQT_SIGNAL(signalDestroyed(TreeNode*)), m_view, TQT_SLOT(slotNodeDestroyed(TreeNode*)));
125  return true;
126  }
127 
128  private:
129 
130  SimpleNodeSelector* m_view;
131 };
132 
133 
134 SimpleNodeSelector::SimpleNodeSelector(FeedList* feedList, TQWidget* parent, const char* name) : TQWidget(parent, name), d(new SimpleNodeSelectorPrivate)
135 {
136  d->list = feedList;
137  connect(feedList, TQT_SIGNAL(signalDestroyed(FeedList*)), this, TQT_SLOT(slotFeedListDestroyed(FeedList*)));
138 
139  d->view = new KListView(this);
140  d->view->setRootIsDecorated(true);
141  d->view->addColumn(i18n("Feeds"));
142 
143  connect(d->view, TQT_SIGNAL(selectionChanged(TQListViewItem*)), this, TQT_SLOT(slotItemSelected(TQListViewItem*)));
144 
145  TQGridLayout* layout = new TQGridLayout(this, 1, 1);
146  layout->addWidget(d->view, 0, 0);
147 
148  d->visitor = new NodeVisitor(this);
149 
150  d->visitor->createItems(d->list->rootNode());
151  d->nodeToItem[d->list->rootNode()]->setOpen(true);
152  d->view->ensureItemVisible(d->nodeToItem[d->list->rootNode()]);
153 }
154 
155 SimpleNodeSelector::~SimpleNodeSelector()
156 {
157  delete d->visitor;
158  delete d;
159  d = 0;
160 }
161 
162 TreeNode* SimpleNodeSelector::selectedNode() const
163 {
164  return d->itemToNode[d->view->selectedItem()];
165 }
166 
167 void SimpleNodeSelector::slotSelectNode(TreeNode* node)
168 {
169  TQListViewItem* item = d->nodeToItem[node];
170  if (item != 0)
171  d->view->setSelected(item, true);
172 }
173 
174 void SimpleNodeSelector::slotFeedListDestroyed(FeedList* /*list*/)
175 {
176  d->nodeToItem.clear();
177  d->itemToNode.clear();
178  d->view->clear();
179 }
180 
181 void SimpleNodeSelector::slotItemSelected(TQListViewItem* item)
182 {
183  emit signalNodeSelected(d->itemToNode[item]);
184 }
185 
186 void SimpleNodeSelector::slotNodeDestroyed(TreeNode* node)
187 {
188  if (d->nodeToItem.contains(node))
189  {
190  TQListViewItem* item = d->nodeToItem[node];
191  d->nodeToItem.remove(node);
192  d->itemToNode.remove(item);
193  delete item;
194  }
195 }
196 
197 } // namespace Akregator
198 
199 #include "simplenodeselector.moc"
200