<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US"> <head> <title>akregator/src: akregator_view.cpp Source File (akregator/src)</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="pics-label" content='(pics-1.1 "http://www.icra.org/ratingsv02.html" comment "ICRAonline DE v2.0" l gen true for "http://www.kde.org" r (nz 1 vz 1 lz 1 oz 1 cb 1) "http://www.rsac.org/ratingsv01.html" l gen true for "http://www.kde.org" r (n 0 s 0 v 0 l 0))' /> <meta name="trademark" content="KDE e.V." /> <meta name="description" content="K Desktop Environment Homepage, KDE.org" /> <meta name="MSSmartTagsPreventParsing" content="true" /> <meta name="robots" content="all" /> <link rel="shortcut icon" href="../../../favicon.ico" /> <link rel="stylesheet" media="screen" type="text/css" title="APIDOX" href="doxygen.css" /> <style type="text/css"> <!-- hr { display: none; } #content h2 { margin-left: 0px; } table.mdTable { background-color: #f8f8f8; border: .2em solid #d7d7d7; } td.mdRow { padding: 8px 20px; } td.md { font-weight: bold; } td.mdname1 { font-weight: bold; color: #602020; } td.mdname { font-weight: bold; color: #602020; } --> </style> </head> <body> <div id="nav_header_top" align="right"> <a href="#content" class="doNotDisplay" accesskey="2">Skip to main content ::</a> <a href="../../.."><img id="nav_header_logo" alt="Home" align="left" src="../../../kde_gear_64.png" border="0" /></a> <span class="doNotDisplay">::</span> <img id="nav_header_logo_right" alt="" align="right" src="../../../pimlogo.png" border="0" /> <div id="nav_header_title" align="left">KDE PIM API Reference</div> </div> <div id="nav_header_bottom" align="right"> <span class="doNotDisplay">:: <a href="#navigation" accesskey="5">Skip to Link Menu</a><br/></span> <div id="nav_header_bottom_left" style="text-align: left;"> / <a href="../../../">API Reference</a> / <a href="../../html/index.html">akregator</a> / <a href=".">src</a> </div> </div> <table id="main" border="0" cellpadding="0" cellspacing="0" width="100%"> <tr> <td valign="top" class="menuheader" height="0"></td> <td id="contentcolumn" valign="top" rowspan="2" > <div id="content" style="padding-top: 0px;"><div style="width:100%; margin: 0px; padding: 0px;"> <h2><a name="content"></a>akregator/src</h2> <!-- Generated by Doxygen 1.5.5 --> <h1>akregator_view.cpp</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span> <a name="l00002"></a>00002 <span class="comment"> This file is part of Akregator.</span> <a name="l00003"></a>00003 <span class="comment"></span> <a name="l00004"></a>00004 <span class="comment"> Copyright (C) 2004 Stanislav Karchebny <Stanislav.Karchebny@kdemail.net></span> <a name="l00005"></a>00005 <span class="comment"> 2004 Sashmit Bhaduri <smt@vfemail.net></span> <a name="l00006"></a>00006 <span class="comment"> 2005 Frank Osterfeld <frank.osterfeld at kdemail.net></span> <a name="l00007"></a>00007 <span class="comment"></span> <a name="l00008"></a>00008 <span class="comment"> This program is free software; you can redistribute it and/or modify</span> <a name="l00009"></a>00009 <span class="comment"> it under the terms of the GNU General Public License as published by</span> <a name="l00010"></a>00010 <span class="comment"> the Free Software Foundation; either version 2 of the License, or</span> <a name="l00011"></a>00011 <span class="comment"> (at your option) any later version.</span> <a name="l00012"></a>00012 <span class="comment"></span> <a name="l00013"></a>00013 <span class="comment"> This program is distributed in the hope that it will be useful,</span> <a name="l00014"></a>00014 <span class="comment"> but WITHOUT ANY WARRANTY; without even the implied warranty of</span> <a name="l00015"></a>00015 <span class="comment"> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span> <a name="l00016"></a>00016 <span class="comment"> GNU General Public License for more details.</span> <a name="l00017"></a>00017 <span class="comment"></span> <a name="l00018"></a>00018 <span class="comment"> You should have received a copy of the GNU General Public License</span> <a name="l00019"></a>00019 <span class="comment"> along with this program; if not, write to the Free Software</span> <a name="l00020"></a>00020 <span class="comment"> Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</span> <a name="l00021"></a>00021 <span class="comment"></span> <a name="l00022"></a>00022 <span class="comment"> As a special exception, permission is given to link this program</span> <a name="l00023"></a>00023 <span class="comment"> with any edition of Qt, and distribute the resulting executable,</span> <a name="l00024"></a>00024 <span class="comment"> without including the source code for Qt in the source distribution.</span> <a name="l00025"></a>00025 <span class="comment">*/</span> <a name="l00026"></a>00026 <a name="l00027"></a>00027 <span class="preprocessor">#include "actionmanagerimpl.h"</span> <a name="l00028"></a>00028 <span class="preprocessor">#include "akregator_part.h"</span> <a name="l00029"></a>00029 <span class="preprocessor">#include "akregator_run.h"</span> <a name="l00030"></a>00030 <span class="preprocessor">#include "akregator_view.h"</span> <a name="l00031"></a>00031 <span class="preprocessor">#include "listtabwidget.h"</span> <a name="l00032"></a>00032 <span class="preprocessor">#include "addfeeddialog.h"</span> <a name="l00033"></a>00033 <span class="preprocessor">#include "propertiesdialog.h"</span> <a name="l00034"></a>00034 <span class="preprocessor">#include "frame.h"</span> <a name="l00035"></a>00035 <span class="preprocessor">#include "fetchqueue.h"</span> <a name="l00036"></a>00036 <span class="preprocessor">#include "feedlistview.h"</span> <a name="l00037"></a>00037 <span class="preprocessor">#include "articlelistview.h"</span> <a name="l00038"></a>00038 <span class="preprocessor">#include "articleviewer.h"</span> <a name="l00039"></a>00039 <span class="preprocessor">#include "viewer.h"</span> <a name="l00040"></a>00040 <span class="preprocessor">#include "feed.h"</span> <a name="l00041"></a>00041 <span class="preprocessor">#include "tagfolder.h"</span> <a name="l00042"></a>00042 <span class="preprocessor">#include "folder.h"</span> <a name="l00043"></a>00043 <span class="preprocessor">#include "feedlist.h"</span> <a name="l00044"></a>00044 <span class="preprocessor">#include "akregatorconfig.h"</span> <a name="l00045"></a>00045 <span class="preprocessor">#include "kernel.h"</span> <a name="l00046"></a>00046 <span class="preprocessor">#include "pageviewer.h"</span> <a name="l00047"></a>00047 <span class="preprocessor">#include "searchbar.h"</span> <a name="l00048"></a>00048 <span class="preprocessor">#include "speechclient.h"</span> <a name="l00049"></a>00049 <span class="preprocessor">#include "storage.h"</span> <a name="l00050"></a>00050 <span class="preprocessor">#include "tabwidget.h"</span> <a name="l00051"></a>00051 <span class="preprocessor">#include "tag.h"</span> <a name="l00052"></a>00052 <span class="preprocessor">#include "tagset.h"</span> <a name="l00053"></a>00053 <span class="preprocessor">#include "tagnode.h"</span> <a name="l00054"></a>00054 <span class="preprocessor">#include "tagnodelist.h"</span> <a name="l00055"></a>00055 <span class="preprocessor">#include "tagpropertiesdialog.h"</span> <a name="l00056"></a>00056 <span class="preprocessor">#include "treenode.h"</span> <a name="l00057"></a>00057 <span class="preprocessor">#include "progressmanager.h"</span> <a name="l00058"></a>00058 <span class="preprocessor">#include "treenodevisitor.h"</span> <a name="l00059"></a>00059 <span class="preprocessor">#include "notificationmanager.h"</span> <a name="l00060"></a>00060 <a name="l00061"></a>00061 <span class="preprocessor">#include <kaction.h></span> <a name="l00062"></a>00062 <span class="preprocessor">#include <kapplication.h></span> <a name="l00063"></a>00063 <span class="preprocessor">#include <kcharsets.h></span> <a name="l00064"></a>00064 <span class="preprocessor">#include <kcombobox.h></span> <a name="l00065"></a>00065 <span class="preprocessor">#include <kconfig.h></span> <a name="l00066"></a>00066 <span class="preprocessor">#include <kdebug.h></span> <a name="l00067"></a>00067 <span class="preprocessor">#include <kdialog.h></span> <a name="l00068"></a>00068 <span class="preprocessor">#include <kfiledialog.h></span> <a name="l00069"></a>00069 <span class="preprocessor">#include <kfileitem.h></span> <a name="l00070"></a>00070 <span class="preprocessor">#include <khtml_part.h></span> <a name="l00071"></a>00071 <span class="preprocessor">#include <khtmlview.h></span> <a name="l00072"></a>00072 <span class="preprocessor">#include <kiconloader.h></span> <a name="l00073"></a>00073 <span class="preprocessor">#include <kinputdialog.h></span> <a name="l00074"></a>00074 <span class="preprocessor">#include <klineedit.h></span> <a name="l00075"></a>00075 <span class="preprocessor">#include <klistview.h></span> <a name="l00076"></a>00076 <span class="preprocessor">#include <klocale.h></span> <a name="l00077"></a>00077 <span class="preprocessor">#include <kmessagebox.h></span> <a name="l00078"></a>00078 <span class="preprocessor">#include <kpassdlg.h></span> <a name="l00079"></a>00079 <span class="preprocessor">#include <kprocess.h></span> <a name="l00080"></a>00080 <span class="preprocessor">#include <krun.h></span> <a name="l00081"></a>00081 <span class="preprocessor">#include <kshell.h></span> <a name="l00082"></a>00082 <span class="preprocessor">#include <kstandarddirs.h></span> <a name="l00083"></a>00083 <span class="preprocessor">#include <kurl.h></span> <a name="l00084"></a>00084 <span class="preprocessor">#include <kxmlguifactory.h></span> <a name="l00085"></a>00085 <span class="preprocessor">#include <kparts/partmanager.h></span> <a name="l00086"></a>00086 <a name="l00087"></a>00087 <span class="preprocessor">#include <qbuttongroup.h></span> <a name="l00088"></a>00088 <span class="preprocessor">#include <qcheckbox.h></span> <a name="l00089"></a>00089 <span class="preprocessor">#include <qdatetime.h></span> <span class="comment">// for startup time measure</span> <a name="l00090"></a>00090 <span class="preprocessor">#include <qfile.h></span> <a name="l00091"></a>00091 <span class="preprocessor">#include <qhbox.h></span> <a name="l00092"></a>00092 <span class="preprocessor">#include <qlabel.h></span> <a name="l00093"></a>00093 <span class="preprocessor">#include <qlayout.h></span> <a name="l00094"></a>00094 <span class="preprocessor">#include <qmultilineedit.h></span> <a name="l00095"></a>00095 <span class="preprocessor">#include <qpopupmenu.h></span> <a name="l00096"></a>00096 <span class="preprocessor">#include <qptrlist.h></span> <a name="l00097"></a>00097 <span class="preprocessor">#include <qstylesheet.h></span> <a name="l00098"></a>00098 <span class="preprocessor">#include <qtextstream.h></span> <a name="l00099"></a>00099 <span class="preprocessor">#include <qtimer.h></span> <a name="l00100"></a>00100 <span class="preprocessor">#include <qtoolbutton.h></span> <a name="l00101"></a>00101 <span class="preprocessor">#include <qtooltip.h></span> <a name="l00102"></a>00102 <span class="preprocessor">#include <qvaluevector.h></span> <a name="l00103"></a>00103 <span class="preprocessor">#include <qwhatsthis.h></span> <a name="l00104"></a>00104 <span class="preprocessor">#include <qclipboard.h></span> <a name="l00105"></a>00105 <a name="l00106"></a>00106 <span class="keyword">namespace </span>Akregator { <a name="l00107"></a>00107 <a name="l00108"></a>00108 <span class="keyword">class </span>View::EditNodePropertiesVisitor : <span class="keyword">public</span> TreeNodeVisitor <a name="l00109"></a>00109 { <a name="l00110"></a>00110 <span class="keyword">public</span>: <a name="l00111"></a>00111 EditNodePropertiesVisitor(<a class="code" href="classAkregator_1_1View.html#68b7a5828072bd7bbf583f1d4a4e0ed0" title="constructor">View</a>* view) : m_view(view) {} <a name="l00112"></a>00112 <a name="l00113"></a>00113 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> visitTagNode(TagNode* node) <a name="l00114"></a>00114 { <a name="l00115"></a>00115 TagPropertiesDialog* dlg = <span class="keyword">new</span> TagPropertiesDialog(m_view); <a name="l00116"></a>00116 dlg->setTag(node->tag()); <a name="l00117"></a>00117 dlg->exec(); <a name="l00118"></a>00118 <span class="keyword">delete</span> dlg; <a name="l00119"></a>00119 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l00120"></a>00120 } <a name="l00121"></a>00121 <a name="l00122"></a>00122 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> visitFolder(Folder* node) <a name="l00123"></a>00123 { <a name="l00124"></a>00124 m_view->m_listTabWidget->activeView()->startNodeRenaming(node); <a name="l00125"></a>00125 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l00126"></a>00126 } <a name="l00127"></a>00127 <a name="l00128"></a>00128 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> visitFeed(Feed* node) <a name="l00129"></a>00129 { <a name="l00130"></a>00130 FeedPropertiesDialog *dlg = <span class="keyword">new</span> FeedPropertiesDialog( m_view, <span class="stringliteral">"edit_feed"</span> ); <a name="l00131"></a>00131 dlg->setFeed(node); <a name="l00132"></a>00132 dlg->exec(); <a name="l00133"></a>00133 <span class="keyword">delete</span> dlg; <a name="l00134"></a>00134 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l00135"></a>00135 } <a name="l00136"></a>00136 <span class="keyword">private</span>: <a name="l00137"></a>00137 <a name="l00138"></a>00138 <a class="code" href="classAkregator_1_1View.html#68b7a5828072bd7bbf583f1d4a4e0ed0" title="constructor">View</a>* m_view; <a name="l00139"></a>00139 }; <a name="l00140"></a>00140 <a name="l00141"></a>00141 <span class="keyword">class </span>View::DeleteNodeVisitor : <span class="keyword">public</span> TreeNodeVisitor <a name="l00142"></a>00142 { <a name="l00143"></a>00143 <span class="keyword">public</span>: <a name="l00144"></a>00144 DeleteNodeVisitor(<a class="code" href="classAkregator_1_1View.html#68b7a5828072bd7bbf583f1d4a4e0ed0" title="constructor">View</a>* view) : m_view(view) {} <a name="l00145"></a>00145 <a name="l00146"></a>00146 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> visitTagNode(TagNode* node) <a name="l00147"></a>00147 { <a name="l00148"></a>00148 QString msg = i18n(<span class="stringliteral">"<qt>Are you sure you want to delete tag <b>%1</b>? The tag will be removed from all articles.</qt>"</span>).arg(node->title()); <a name="l00149"></a>00149 <span class="keywordflow">if</span> (KMessageBox::warningContinueCancel(0, msg, i18n(<span class="stringliteral">"Delete Tag"</span>), KStdGuiItem::del()) == KMessageBox::Continue) <a name="l00150"></a>00150 { <a name="l00151"></a>00151 Tag tag = node->tag(); <a name="l00152"></a>00152 QValueList<Article> articles = m_view->m_feedList->rootNode()->articles(tag.id()); <a name="l00153"></a>00153 node->setNotificationMode(<span class="keyword">false</span>); <a name="l00154"></a>00154 <span class="keywordflow">for</span> (QValueList<Article>::Iterator it = articles.begin(); it != articles.end(); ++it) <a name="l00155"></a>00155 (*it).removeTag(tag.id()); <a name="l00156"></a>00156 node->setNotificationMode(<span class="keyword">true</span>); <a name="l00157"></a>00157 Kernel::self()->tagSet()->remove(tag); <a name="l00158"></a>00158 m_view->m_listTabWidget->activeView()->setFocus(); <a name="l00159"></a>00159 } <a name="l00160"></a>00160 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l00161"></a>00161 } <a name="l00162"></a>00162 <a name="l00163"></a>00163 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> visitFolder(Folder* node) <a name="l00164"></a>00164 { <a name="l00165"></a>00165 QString msg; <a name="l00166"></a>00166 <span class="keywordflow">if</span> (node->title().isEmpty()) <a name="l00167"></a>00167 msg = i18n(<span class="stringliteral">"<qt>Are you sure you want to delete this folder and its feeds and subfolders?</qt>"</span>); <a name="l00168"></a>00168 <span class="keywordflow">else</span> <a name="l00169"></a>00169 msg = i18n(<span class="stringliteral">"<qt>Are you sure you want to delete folder <b>%1</b> and its feeds and subfolders?</qt>"</span>).arg(node->title()); <a name="l00170"></a>00170 <a name="l00171"></a>00171 <span class="keywordflow">if</span> (KMessageBox::warningContinueCancel(0, msg, i18n(<span class="stringliteral">"Delete Folder"</span>), KStdGuiItem::del()) == KMessageBox::Continue) <a name="l00172"></a>00172 { <a name="l00173"></a>00173 <span class="keyword">delete</span> node; <a name="l00174"></a>00174 m_view->m_listTabWidget->activeView()->setFocus(); <a name="l00175"></a>00175 } <a name="l00176"></a>00176 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l00177"></a>00177 } <a name="l00178"></a>00178 <a name="l00179"></a>00179 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> visitFeed(Feed* node) <a name="l00180"></a>00180 { <a name="l00181"></a>00181 QString msg; <a name="l00182"></a>00182 <span class="keywordflow">if</span> (node->title().isEmpty()) <a name="l00183"></a>00183 msg = i18n(<span class="stringliteral">"<qt>Are you sure you want to delete this feed?</qt>"</span>); <a name="l00184"></a>00184 <span class="keywordflow">else</span> <a name="l00185"></a>00185 msg = i18n(<span class="stringliteral">"<qt>Are you sure you want to delete feed <b>%1</b>?</qt>"</span>).arg(node->title()); <a name="l00186"></a>00186 <a name="l00187"></a>00187 <span class="keywordflow">if</span> (KMessageBox::warningContinueCancel(0, msg, i18n(<span class="stringliteral">"Delete Feed"</span>), KStdGuiItem::del()) == KMessageBox::Continue) <a name="l00188"></a>00188 { <a name="l00189"></a>00189 <span class="keyword">delete</span> node; <a name="l00190"></a>00190 m_view->m_listTabWidget->activeView()->setFocus(); <a name="l00191"></a>00191 } <a name="l00192"></a>00192 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l00193"></a>00193 } <a name="l00194"></a>00194 <span class="keyword">private</span>: <a name="l00195"></a>00195 <a name="l00196"></a>00196 <a class="code" href="classAkregator_1_1View.html#68b7a5828072bd7bbf583f1d4a4e0ed0" title="constructor">View</a>* m_view; <a name="l00197"></a>00197 }; <a name="l00198"></a>00198 <a name="l00199"></a>00199 <a name="l00200"></a><a class="code" href="classAkregator_1_1View.html#ae8d67a27612bcd066315995315a76e5">00200</a> <a class="code" href="classAkregator_1_1View.html#ae8d67a27612bcd066315995315a76e5" title="destructor.">View::~View</a>() <a name="l00201"></a>00201 { <a name="l00202"></a>00202 <span class="comment">// if m_shuttingDown is false, slotOnShutdown was not called. That</span> <a name="l00203"></a>00203 <span class="comment">// means that not the whole app is shutdown, only the part. So it</span> <a name="l00204"></a>00204 <span class="comment">// should be no risk to do the cleanups now</span> <a name="l00205"></a>00205 <span class="keywordflow">if</span> (!m_shuttingDown) <a name="l00206"></a>00206 { <a name="l00207"></a>00207 kdDebug() << <span class="stringliteral">"View::~View(): slotOnShutdown() wasn't called. Calling it now."</span> << endl; <a name="l00208"></a>00208 slotOnShutdown(); <a name="l00209"></a>00209 } <a name="l00210"></a>00210 kdDebug() << <span class="stringliteral">"View::~View(): leaving"</span> << endl; <a name="l00211"></a>00211 } <a name="l00212"></a>00212 <a name="l00213"></a><a class="code" href="classAkregator_1_1View.html#68b7a5828072bd7bbf583f1d4a4e0ed0">00213</a> View::View( <a class="code" href="classAkregator_1_1Part.html" title="This is a RSS Aggregator &quot;Part&quot;.">Part</a> *part, QWidget *parent, <a class="code" href="classAkregator_1_1ActionManagerImpl.html" title="Akregator-specific implementation of the ActionManager interface.">ActionManagerImpl</a>* actionManager, <span class="keyword">const</span> <span class="keywordtype">char</span> *name) <a name="l00214"></a>00214 : QWidget(parent, name), m_viewMode(NormalView), m_actionManager(actionManager) <a name="l00215"></a>00215 { <a name="l00216"></a>00216 m_editNodePropertiesVisitor = <span class="keyword">new</span> EditNodePropertiesVisitor(<span class="keyword">this</span>); <a name="l00217"></a>00217 m_deleteNodeVisitor = <span class="keyword">new</span> DeleteNodeVisitor(<span class="keyword">this</span>); <a name="l00218"></a>00218 m_keepFlagIcon = QPixmap(locate(<span class="stringliteral">"data"</span>, <span class="stringliteral">"akregator/pics/akregator_flag.png"</span>)); <a name="l00219"></a>00219 m_part = part; <a name="l00220"></a>00220 m_feedList = <span class="keyword">new</span> <a class="code" href="classAkregator_1_1FeedList.html" title="The model of a feed tree, represents an OPML document.">FeedList</a>(); <a name="l00221"></a>00221 m_tagNodeList = <span class="keyword">new</span> TagNodeList(m_feedList, Kernel::self()->tagSet()); <a name="l00222"></a>00222 m_shuttingDown = <span class="keyword">false</span>; <a name="l00223"></a>00223 m_displayingAboutPage = <span class="keyword">false</span>; <a name="l00224"></a>00224 m_currentFrame = 0L; <a name="l00225"></a>00225 setFocusPolicy(QWidget::StrongFocus); <a name="l00226"></a>00226 <a name="l00227"></a>00227 QVBoxLayout *lt = <span class="keyword">new</span> QVBoxLayout( <span class="keyword">this</span> ); <a name="l00228"></a>00228 <a name="l00229"></a>00229 m_horizontalSplitter = <span class="keyword">new</span> QSplitter(QSplitter::Horizontal, <span class="keyword">this</span>); <a name="l00230"></a>00230 <a name="l00231"></a>00231 m_horizontalSplitter->setOpaqueResize(<span class="keyword">true</span>); <a name="l00232"></a>00232 lt->addWidget(m_horizontalSplitter); <a name="l00233"></a>00233 <a name="l00234"></a>00234 connect (Kernel::self()->fetchQueue(), SIGNAL(fetched(<a class="code" href="classAkregator_1_1Feed.html" title="represents a feed">Feed</a>*)), <span class="keyword">this</span>, SLOT(<a class="code" href="classAkregator_1_1View.html#df813d0f4e22a9b57dc118d7b64340b7" title="Feed has been fetched, populate article view if needed and update counters.">slotFeedFetched</a>(<a class="code" href="classAkregator_1_1Feed.html" title="represents a feed">Feed</a>*))); <a name="l00235"></a>00235 connect (Kernel::self()->fetchQueue(), SIGNAL(signalStarted()), <span class="keyword">this</span>, SLOT(slotFetchingStarted())); <a name="l00236"></a>00236 connect (Kernel::self()->fetchQueue(), SIGNAL(signalStopped()), <span class="keyword">this</span>, SLOT(slotFetchingStopped())); <a name="l00237"></a>00237 <a name="l00238"></a>00238 connect(Kernel::self()->tagSet(), SIGNAL(signalTagAdded(<span class="keyword">const</span> Tag&)), <span class="keyword">this</span>, SLOT(slotTagCreated(<span class="keyword">const</span> Tag&))); <a name="l00239"></a>00239 connect(Kernel::self()->tagSet(), SIGNAL(signalTagRemoved(<span class="keyword">const</span> Tag&)), <span class="keyword">this</span>, SLOT(slotTagRemoved(<span class="keyword">const</span> Tag&))); <a name="l00240"></a>00240 <a name="l00241"></a>00241 m_listTabWidget = <span class="keyword">new</span> <a class="code" href="classAkregator_1_1ListTabWidget.html" title="A widget containing multiple list views, e.g.">ListTabWidget</a>(m_horizontalSplitter); <a name="l00242"></a>00242 m_actionManager-><a class="code" href="classAkregator_1_1ActionManagerImpl.html#9bfea92c417c727ec7833024c06bb7fc">initListTabWidget</a>(m_listTabWidget); <a name="l00243"></a>00243 <a name="l00244"></a>00244 connect(m_listTabWidget, SIGNAL(signalNodeSelected(<a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>*)), <span class="keyword">this</span>, SLOT(<a class="code" href="classAkregator_1_1View.html#5771f647c0fd90c828857da74f97841f" title="selected tree node has changed">slotNodeSelected</a>(<a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>*))); <a name="l00245"></a>00245 <a name="l00246"></a>00246 <span class="keywordflow">if</span> (!Settings::showTaggingGUI()) <a name="l00247"></a>00247 m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#3619d2c9dcb98106a8c13c35153a4341">setViewMode</a>(ListTabWidget::single); <a name="l00248"></a>00248 <a name="l00249"></a>00249 m_feedListView = <span class="keyword">new</span> NodeListView( <span class="keyword">this</span>, <span class="stringliteral">"feedtree"</span> ); <a name="l00250"></a>00250 m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#5d4873cfcd907744d9663a9717b1fce9">addView</a>(m_feedListView, i18n(<span class="stringliteral">"Feeds"</span>), KGlobal::iconLoader()->loadIcon(<span class="stringliteral">"folder"</span>, KIcon::Small)); <a name="l00251"></a>00251 <a name="l00252"></a>00252 connect(m_feedListView, SIGNAL(signalContextMenu(KListView*, <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>*, <span class="keyword">const</span> QPoint&)), <span class="keyword">this</span>, SLOT(<a class="code" href="classAkregator_1_1View.html#8d664d40ff761936897824890c1ec6b1" title="Shows requested popup menu for feed tree.">slotFeedTreeContextMenu</a>(KListView*, <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>*, <span class="keyword">const</span> QPoint&))); <a name="l00253"></a>00253 <a name="l00254"></a>00254 connect(m_feedListView, SIGNAL(signalDropped (KURL::List &, <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>*, <a name="l00255"></a>00255 <a class="code" href="classAkregator_1_1Folder.html" title="Represents a folder (containing feeds and/or other folders).">Folder</a>*)), <span class="keyword">this</span>, SLOT(<a class="code" href="classAkregator_1_1View.html#0aa903f500d4d01e41d1ee8ab8d12440" title="called when URLs are dropped into the tree view">slotFeedURLDropped</a> (KURL::List &, <a name="l00256"></a>00256 <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>*, <a class="code" href="classAkregator_1_1Folder.html" title="Represents a folder (containing feeds and/or other folders).">Folder</a>*))); <a name="l00257"></a>00257 <a name="l00258"></a>00258 m_tagNodeListView = <span class="keyword">new</span> NodeListView(<span class="keyword">this</span>); <a name="l00259"></a>00259 m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#5d4873cfcd907744d9663a9717b1fce9">addView</a>(m_tagNodeListView, i18n(<span class="stringliteral">"Tags"</span>), KGlobal::iconLoader()->loadIcon(<span class="stringliteral">"rss_tag"</span>, KIcon::Small)); <a name="l00260"></a>00260 <a name="l00261"></a>00261 connect(m_tagNodeListView, SIGNAL(signalContextMenu(KListView*, <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>*, <span class="keyword">const</span> QPoint&)), <span class="keyword">this</span>, SLOT(<a class="code" href="classAkregator_1_1View.html#8d664d40ff761936897824890c1ec6b1" title="Shows requested popup menu for feed tree.">slotFeedTreeContextMenu</a>(KListView*, <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>*, <span class="keyword">const</span> QPoint&))); <a name="l00262"></a>00262 <a name="l00263"></a>00263 <a name="l00264"></a>00264 ProgressManager::self()->setFeedList(m_feedList); <a name="l00265"></a>00265 <a name="l00266"></a>00266 m_tabs = <span class="keyword">new</span> TabWidget(m_horizontalSplitter); <a name="l00267"></a>00267 m_actionManager-><a class="code" href="classAkregator_1_1ActionManagerImpl.html#c6a8bcf9c6c147a763ea684aa99fea9e">initTabWidget</a>(m_tabs); <a name="l00268"></a>00268 <a name="l00269"></a>00269 connect( m_part, SIGNAL(signalSettingsChanged()), m_tabs, SLOT(slotSettingsChanged())); <a name="l00270"></a>00270 <a name="l00271"></a>00271 connect( m_tabs, SIGNAL( currentFrameChanged(Frame *) ), <span class="keyword">this</span>, <a name="l00272"></a>00272 SLOT( <a class="code" href="classAkregator_1_1View.html#b9fd8ba6990cd75b7537e758392c68ac" title="called when another part/frame is activated.">slotFrameChanged</a>(Frame *) ) ); <a name="l00273"></a>00273 <a name="l00274"></a>00274 QWhatsThis::add(m_tabs, i18n(<span class="stringliteral">"You can view multiple articles in several open tabs."</span>)); <a name="l00275"></a>00275 <a name="l00276"></a>00276 m_mainTab = <span class="keyword">new</span> QWidget(<span class="keyword">this</span>, <span class="stringliteral">"Article Tab"</span>); <a name="l00277"></a>00277 QVBoxLayout *mainTabLayout = <span class="keyword">new</span> QVBoxLayout( m_mainTab, 0, 2, <span class="stringliteral">"mainTabLayout"</span>); <a name="l00278"></a>00278 <a name="l00279"></a>00279 QWhatsThis::add(m_mainTab, i18n(<span class="stringliteral">"Articles list."</span>)); <a name="l00280"></a>00280 <a name="l00281"></a>00281 m_searchBar = <span class="keyword">new</span> SearchBar(m_mainTab); <a name="l00282"></a>00282 <a name="l00283"></a>00283 <span class="keywordflow">if</span> ( !Settings::showQuickFilter() ) <a name="l00284"></a>00284 m_searchBar->hide(); <a name="l00285"></a>00285 <a name="l00286"></a>00286 mainTabLayout->addWidget(m_searchBar); <a name="l00287"></a>00287 <a name="l00288"></a>00288 m_articleSplitter = <span class="keyword">new</span> QSplitter(QSplitter::Vertical, m_mainTab, <span class="stringliteral">"panner2"</span>); <a name="l00289"></a>00289 <a name="l00290"></a>00290 m_articleList = <span class="keyword">new</span> ArticleListView( m_articleSplitter, <span class="stringliteral">"articles"</span> ); <a name="l00291"></a>00291 m_actionManager-><a class="code" href="classAkregator_1_1ActionManagerImpl.html#1c497f0eeb19a2c539ebf612b421f1c5">initArticleListView</a>(m_articleList); <a name="l00292"></a>00292 <a name="l00293"></a>00293 connect( m_articleList, SIGNAL(signalMouseButtonPressed(<span class="keywordtype">int</span>, <span class="keyword">const</span> <a class="code" href="classAkregator_1_1Article.html" title="A proxy class for RSS::Article with some additional methods to assist sorting.">Article</a>&, <span class="keyword">const</span> QPoint &, <span class="keywordtype">int</span>)), <span class="keyword">this</span>, SLOT(<a class="code" href="classAkregator_1_1View.html#a750ca71d3f4bd16f2a9b55c14135a32" title="special behaviour in article list view (TODO: move code there?)">slotMouseButtonPressed</a>(<span class="keywordtype">int</span>, <span class="keyword">const</span> <a class="code" href="classAkregator_1_1Article.html" title="A proxy class for RSS::Article with some additional methods to assist sorting.">Article</a>&, <span class="keyword">const</span> QPoint &, <span class="keywordtype">int</span>))); <a name="l00294"></a>00294 <a name="l00295"></a>00295 <span class="comment">// use selectionChanged instead of clicked</span> <a name="l00296"></a>00296 connect( m_articleList, SIGNAL(signalArticleChosen(<span class="keyword">const</span> <a class="code" href="classAkregator_1_1Article.html" title="A proxy class for RSS::Article with some additional methods to assist sorting.">Article</a>&)), <a name="l00297"></a>00297 <span class="keyword">this</span>, SLOT( <a class="code" href="classAkregator_1_1View.html#dcb8e0575e52f966299ca82dbb3ac9c3" title="the article selection has changed">slotArticleSelected</a>(<span class="keyword">const</span> <a class="code" href="classAkregator_1_1Article.html" title="A proxy class for RSS::Article with some additional methods to assist sorting.">Article</a>&)) ); <a name="l00298"></a>00298 connect( m_articleList, SIGNAL(signalDoubleClicked(<span class="keyword">const</span> <a class="code" href="classAkregator_1_1Article.html" title="A proxy class for RSS::Article with some additional methods to assist sorting.">Article</a>&, <span class="keyword">const</span> QPoint&, <span class="keywordtype">int</span>)), <a name="l00299"></a>00299 <span class="keyword">this</span>, SLOT( <a class="code" href="classAkregator_1_1View.html#9e057967b1a4fd1dddf483b3ef54889f" title="opens article of item in external browser">slotOpenArticleExternal</a>(<span class="keyword">const</span> <a class="code" href="classAkregator_1_1Article.html" title="A proxy class for RSS::Article with some additional methods to assist sorting.">Article</a>&, <span class="keyword">const</span> QPoint&, <span class="keywordtype">int</span>)) ); <a name="l00300"></a>00300 <a name="l00301"></a>00301 m_articleViewer = <span class="keyword">new</span> <a class="code" href="classAkregator_1_1ArticleViewer.html" title="This HTML viewer is used to display articles.">ArticleViewer</a>(m_articleSplitter, <span class="stringliteral">"article_viewer"</span>); <a name="l00302"></a>00302 m_articleViewer->setSafeMode(); <span class="comment">// disable JS, Java, etc...</span> <a name="l00303"></a>00303 <a name="l00304"></a>00304 m_actionManager-><a class="code" href="classAkregator_1_1ActionManagerImpl.html#0a0dcea028a2a4dd5efa0ad377b1c668">initArticleViewer</a>(m_articleViewer); <a name="l00305"></a>00305 <a name="l00306"></a>00306 connect(m_searchBar, SIGNAL(signalSearch(<span class="keyword">const</span> <a class="code" href="classAkregator_1_1Filters_1_1ArticleMatcher.html" title="a powerful matcher supporting multiple criterions, which can be combined via logical...">Akregator::Filters::ArticleMatcher</a>&, <span class="keyword">const</span> <a class="code" href="classAkregator_1_1Filters_1_1ArticleMatcher.html" title="a powerful matcher supporting multiple criterions, which can be combined via logical...">Akregator::Filters::ArticleMatcher</a>&)), m_articleList, SLOT(slotSetFilter(<span class="keyword">const</span> <a class="code" href="classAkregator_1_1Filters_1_1ArticleMatcher.html" title="a powerful matcher supporting multiple criterions, which can be combined via logical...">Akregator::Filters::ArticleMatcher</a>&, <span class="keyword">const</span> <a class="code" href="classAkregator_1_1Filters_1_1ArticleMatcher.html" title="a powerful matcher supporting multiple criterions, which can be combined via logical...">Akregator::Filters::ArticleMatcher</a>&))); <a name="l00307"></a>00307 <a name="l00308"></a>00308 connect(m_searchBar, SIGNAL(signalSearch(<span class="keyword">const</span> <a class="code" href="classAkregator_1_1Filters_1_1ArticleMatcher.html" title="a powerful matcher supporting multiple criterions, which can be combined via logical...">Akregator::Filters::ArticleMatcher</a>&, <span class="keyword">const</span> <a class="code" href="classAkregator_1_1Filters_1_1ArticleMatcher.html" title="a powerful matcher supporting multiple criterions, which can be combined via logical...">Akregator::Filters::ArticleMatcher</a>&)), m_articleViewer, SLOT(slotSetFilter(<span class="keyword">const</span> <a class="code" href="classAkregator_1_1Filters_1_1ArticleMatcher.html" title="a powerful matcher supporting multiple criterions, which can be combined via logical...">Akregator::Filters::ArticleMatcher</a>&, <span class="keyword">const</span> <a class="code" href="classAkregator_1_1Filters_1_1ArticleMatcher.html" title="a powerful matcher supporting multiple criterions, which can be combined via logical...">Akregator::Filters::ArticleMatcher</a>&))); <a name="l00309"></a>00309 <a name="l00310"></a>00310 connect( m_articleViewer, SIGNAL(urlClicked(<span class="keyword">const</span> KURL&, Viewer*, <span class="keywordtype">bool</span>, <span class="keywordtype">bool</span>)), <a name="l00311"></a>00311 <span class="keyword">this</span>, SLOT(<a class="code" href="classAkregator_1_1View.html#1fb6d84f9339585dcd275f55905ffa3e" title="HACK: part of the url opening hack for 3.5.">slotUrlClickedInViewer</a>(<span class="keyword">const</span> KURL&, Viewer*, <span class="keywordtype">bool</span>, <span class="keywordtype">bool</span>)) ); <a name="l00312"></a>00312 <a name="l00313"></a>00313 connect( m_articleViewer->browserExtension(), SIGNAL(mouseOverInfo(<span class="keyword">const</span> KFileItem *)), <a name="l00314"></a>00314 <span class="keyword">this</span>, SLOT(<a class="code" href="classAkregator_1_1View.html#355b13d86ee9a7a735f4c4dda569b03a" title="displays a URL in the status bar when the user moves the mouse over a link">slotMouseOverInfo</a>(<span class="keyword">const</span> KFileItem *)) ); <a name="l00315"></a>00315 <a name="l00316"></a>00316 connect( m_part, SIGNAL(signalSettingsChanged()), m_articleViewer, SLOT(slotPaletteOrFontChanged())); <a name="l00317"></a>00317 QWhatsThis::add(m_articleViewer->widget(), i18n(<span class="stringliteral">"Browsing area."</span>)); <a name="l00318"></a>00318 mainTabLayout->addWidget( m_articleSplitter ); <a name="l00319"></a>00319 <a name="l00320"></a>00320 m_mainFrame=<span class="keyword">new</span> Frame(<span class="keyword">this</span>, m_part, m_mainTab, i18n(<span class="stringliteral">"Articles"</span>), <span class="keyword">false</span>); <a name="l00321"></a>00321 connectFrame(m_mainFrame); <a name="l00322"></a>00322 m_tabs->addFrame(m_mainFrame); <a name="l00323"></a>00323 <a name="l00324"></a>00324 m_horizontalSplitter->setSizes( Settings::splitter1Sizes() ); <a name="l00325"></a>00325 m_articleSplitter->setSizes( Settings::splitter2Sizes() ); <a name="l00326"></a>00326 <a name="l00327"></a>00327 KConfig *conf = Settings::self()->config(); <a name="l00328"></a>00328 conf->setGroup(<span class="stringliteral">"General"</span>); <a name="l00329"></a>00329 <span class="keywordflow">if</span>(!conf->readBoolEntry(<span class="stringliteral">"Disable Introduction"</span>, <span class="keyword">false</span>)) <a name="l00330"></a>00330 { <a name="l00331"></a>00331 m_articleList->hide(); <a name="l00332"></a>00332 m_searchBar->hide(); <a name="l00333"></a>00333 m_articleViewer-><a class="code" href="classAkregator_1_1ArticleViewer.html#6e0540bb1504deb481c60ac4627d0165">displayAboutPage</a>(); <a name="l00334"></a>00334 m_mainFrame->setTitle(i18n(<span class="stringliteral">"About"</span>)); <a name="l00335"></a>00335 m_displayingAboutPage = <span class="keyword">true</span>; <a name="l00336"></a>00336 } <a name="l00337"></a>00337 <a name="l00338"></a>00338 m_fetchTimer = <span class="keyword">new</span> QTimer(<span class="keyword">this</span>); <a name="l00339"></a>00339 connect( m_fetchTimer, SIGNAL(timeout()), <span class="keyword">this</span>, SLOT(slotDoIntervalFetches()) ); <a name="l00340"></a>00340 m_fetchTimer->start(1000*60); <a name="l00341"></a>00341 <a name="l00342"></a>00342 <span class="comment">// delete expired articles once per hour</span> <a name="l00343"></a>00343 m_expiryTimer = <span class="keyword">new</span> QTimer(<span class="keyword">this</span>); <a name="l00344"></a>00344 connect(m_expiryTimer, SIGNAL(timeout()), <span class="keyword">this</span>, <a name="l00345"></a>00345 SLOT(slotDeleteExpiredArticles()) ); <a name="l00346"></a>00346 m_expiryTimer->start(3600*1000); <a name="l00347"></a>00347 <a name="l00348"></a>00348 m_markReadTimer = <span class="keyword">new</span> QTimer(<span class="keyword">this</span>); <a name="l00349"></a>00349 connect(m_markReadTimer, SIGNAL(timeout()), <span class="keyword">this</span>, SLOT(<a class="code" href="classAkregator_1_1View.html#39d8c21551313de06b5bb41b486bfd29" title="marks the currenctly selected article as read after a user-set delay">slotSetCurrentArticleReadDelayed</a>()) ); <a name="l00350"></a>00350 <a name="l00351"></a>00351 <span class="keywordflow">switch</span> (Settings::viewMode()) <a name="l00352"></a>00352 { <a name="l00353"></a>00353 <span class="keywordflow">case</span> CombinedView: <a name="l00354"></a>00354 <a class="code" href="classAkregator_1_1View.html#c11073c7a4be7a84f489614df24d9dbe" title="switches view mode to combined view">slotCombinedView</a>(); <a name="l00355"></a>00355 <span class="keywordflow">break</span>; <a name="l00356"></a>00356 <span class="keywordflow">case</span> WidescreenView: <a name="l00357"></a>00357 <a class="code" href="classAkregator_1_1View.html#da047ed192ab73a7837f265f3987d9d6" title="switches view mode to widescreen view">slotWidescreenView</a>(); <a name="l00358"></a>00358 <span class="keywordflow">break</span>; <a name="l00359"></a>00359 <span class="keywordflow">default</span>: <a name="l00360"></a>00360 <a class="code" href="classAkregator_1_1View.html#9f4253a801a0c06e567b6f5b9b94ab8e" title="switches view mode to normal view">slotNormalView</a>(); <a name="l00361"></a>00361 } <a name="l00362"></a>00362 <a name="l00363"></a>00363 <span class="keywordflow">if</span> (!Settings::resetQuickFilterOnNodeChange()) <a name="l00364"></a>00364 { <a name="l00365"></a>00365 m_searchBar->slotSetStatus(Settings::statusFilter()); <a name="l00366"></a>00366 m_searchBar->slotSetText(Settings::textFilter()); <a name="l00367"></a>00367 } <a name="l00368"></a>00368 <a name="l00369"></a>00369 QTimer::singleShot(1000, <span class="keyword">this</span>, SLOT(slotDeleteExpiredArticles()) ); <a name="l00370"></a>00370 m_part-><a class="code" href="classAkregator_1_1Part.html#28339e454f049229ae862f9b62f77b4b" title="merges a nested part&#39;s GUI into the gui of this part">mergePart</a>(m_articleViewer); <a name="l00371"></a>00371 } <a name="l00372"></a>00372 <a name="l00373"></a>00373 <span class="keywordtype">void</span> View::slotSettingsChanged() <a name="l00374"></a>00374 { <a name="l00375"></a>00375 <span class="comment">// if tagging is hidden, show only feed list</span> <a name="l00376"></a>00376 m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#3619d2c9dcb98106a8c13c35153a4341">setViewMode</a>(Settings::showTaggingGUI() ? ListTabWidget::verticalTabs : ListTabWidget::single); <a name="l00377"></a>00377 <a name="l00378"></a>00378 } <a name="l00379"></a>00379 <a name="l00380"></a>00380 <span class="keywordtype">void</span> View::slotOnShutdown() <a name="l00381"></a>00381 { <a name="l00382"></a>00382 m_shuttingDown = <span class="keyword">true</span>; <span class="comment">// prevents slotFrameChanged from crashing</span> <a name="l00383"></a>00383 <a name="l00384"></a>00384 m_articleList->slotShowNode(0); <a name="l00385"></a>00385 m_articleViewer->slotShowNode(0); <a name="l00386"></a>00386 <a name="l00387"></a>00387 Kernel::self()->fetchQueue()->slotAbort(); <a name="l00388"></a>00388 <a name="l00389"></a>00389 m_feedListView->setNodeList(0); <a name="l00390"></a>00390 ProgressManager::self()->setFeedList(0); <a name="l00391"></a>00391 <a name="l00392"></a>00392 <span class="keyword">delete</span> m_feedList; <a name="l00393"></a>00393 <span class="keyword">delete</span> m_tagNodeList; <a name="l00394"></a>00394 <a name="l00395"></a>00395 <span class="comment">// close all pageviewers in a controlled way</span> <a name="l00396"></a>00396 <span class="comment">// fixes bug 91660, at least when no part loading data</span> <a name="l00397"></a>00397 m_tabs->setCurrentPage(m_tabs->count()-1); <span class="comment">// select last page</span> <a name="l00398"></a>00398 <span class="keywordflow">while</span> (m_tabs->count() > 1) <span class="comment">// remove frames until only the main frame remains</span> <a name="l00399"></a>00399 m_tabs->slotRemoveCurrentFrame(); <a name="l00400"></a>00400 <a name="l00401"></a>00401 <span class="keyword">delete</span> m_mainTab; <a name="l00402"></a>00402 <span class="keyword">delete</span> m_mainFrame; <a name="l00403"></a>00403 <span class="keyword">delete</span> m_editNodePropertiesVisitor; <a name="l00404"></a>00404 <span class="keyword">delete</span> m_deleteNodeVisitor; <a name="l00405"></a>00405 } <a name="l00406"></a>00406 <a name="l00407"></a><a class="code" href="classAkregator_1_1View.html#524fa260be510a1de14612f9b76d8f2c">00407</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#524fa260be510a1de14612f9b76d8f2c" title="saves settings.">View::saveSettings</a>() <a name="l00408"></a>00408 { <a name="l00409"></a>00409 Settings::setSplitter1Sizes( m_horizontalSplitter->sizes() ); <a name="l00410"></a>00410 Settings::setSplitter2Sizes( m_articleSplitter->sizes() ); <a name="l00411"></a>00411 Settings::setViewMode( m_viewMode ); <a name="l00412"></a>00412 Settings::writeConfig(); <a name="l00413"></a>00413 } <a name="l00414"></a>00414 <a name="l00415"></a><a class="code" href="classAkregator_1_1View.html#a5a99328351f0b1d1564d57808ddf711">00415</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#a5a99328351f0b1d1564d57808ddf711" title="opens a page viewer in a new tab and loads an URL">View::slotOpenNewTab</a>(<span class="keyword">const</span> KURL& url, <span class="keywordtype">bool</span> background) <a name="l00416"></a>00416 { <a name="l00417"></a>00417 PageViewer* page = <span class="keyword">new</span> PageViewer(<span class="keyword">this</span>, <span class="stringliteral">"page"</span>); <a name="l00418"></a>00418 <a name="l00419"></a>00419 connect( m_part, SIGNAL(signalSettingsChanged()), page, SLOT(slotPaletteOrFontChanged())); <a name="l00420"></a>00420 <a name="l00421"></a>00421 connect( page, SIGNAL(setTabIcon(<span class="keyword">const</span> QPixmap&)), <a name="l00422"></a>00422 <span class="keyword">this</span>, SLOT(setTabIcon(<span class="keyword">const</span> QPixmap&))); <a name="l00423"></a>00423 connect( page, SIGNAL(urlClicked(<span class="keyword">const</span> KURL &, Viewer*, <span class="keywordtype">bool</span>, <span class="keywordtype">bool</span>)), <a name="l00424"></a>00424 <span class="keyword">this</span>, SLOT(<a class="code" href="classAkregator_1_1View.html#1fb6d84f9339585dcd275f55905ffa3e" title="HACK: part of the url opening hack for 3.5.">slotUrlClickedInViewer</a>(<span class="keyword">const</span> KURL &, Viewer*, <span class="keywordtype">bool</span>, <span class="keywordtype">bool</span>)) ); <a name="l00425"></a>00425 <a name="l00426"></a>00426 Frame* frame = <span class="keyword">new</span> Frame(<span class="keyword">this</span>, page, page->widget(), i18n(<span class="stringliteral">"Untitled"</span>)); <a name="l00427"></a>00427 frame->setAutoDeletePart(<span class="keyword">true</span>); <span class="comment">// delete page viewer when removing the tab</span> <a name="l00428"></a>00428 <a name="l00429"></a>00429 connect(page, SIGNAL(setWindowCaption (<span class="keyword">const</span> QString &)), frame, SLOT(setTitle (<span class="keyword">const</span> QString &))); <a name="l00430"></a>00430 connectFrame(frame); <a name="l00431"></a>00431 m_tabs->addFrame(frame); <a name="l00432"></a>00432 <a name="l00433"></a>00433 <span class="keywordflow">if</span>(!background) <a name="l00434"></a>00434 m_tabs->showPage(page->widget()); <a name="l00435"></a>00435 <span class="keywordflow">else</span> <a name="l00436"></a>00436 setFocus(); <a name="l00437"></a>00437 <a name="l00438"></a>00438 page->openURL(url); <a name="l00439"></a>00439 } <a name="l00440"></a>00440 <a name="l00441"></a>00441 <a name="l00442"></a>00442 <span class="keywordtype">void</span> View::setTabIcon(<span class="keyword">const</span> QPixmap& icon) <a name="l00443"></a>00443 { <a name="l00444"></a>00444 <span class="keyword">const</span> PageViewer *s = <span class="keyword">dynamic_cast<</span><span class="keyword">const </span>PageViewer*<span class="keyword">></span>(sender()); <a name="l00445"></a>00445 <span class="keywordflow">if</span> (s) { <a name="l00446"></a>00446 m_tabs->setTabIconSet(const_cast<PageViewer*>(s)->widget(), icon); <a name="l00447"></a>00447 } <a name="l00448"></a>00448 } <a name="l00449"></a>00449 <a name="l00450"></a>00450 <span class="keywordtype">void</span> View::connectFrame(Frame *f) <a name="l00451"></a>00451 { <a name="l00452"></a>00452 connect(f, SIGNAL(statusText(<span class="keyword">const</span> QString &)), <span class="keyword">this</span>, SLOT(<a class="code" href="classAkregator_1_1View.html#0e66502b54fd87a95430d09d2c1719bf" title="sets the status bar text to a given string">slotStatusText</a>(<span class="keyword">const</span> QString&))); <a name="l00453"></a>00453 connect(f, SIGNAL(captionChanged (<span class="keyword">const</span> QString &)), <span class="keyword">this</span>, SLOT(<a class="code" href="classAkregator_1_1View.html#a2078c77fea1c387d327dafb35089ac4" title="sets the window caption after a frame change">slotCaptionChanged</a> (<span class="keyword">const</span> QString &))); <a name="l00454"></a>00454 connect(f, SIGNAL(loadingProgress(<span class="keywordtype">int</span>)), <span class="keyword">this</span>, SLOT(slotLoadingProgress(<span class="keywordtype">int</span>)) ); <a name="l00455"></a>00455 connect(f, SIGNAL(started()), <span class="keyword">this</span>, SLOT(slotStarted())); <a name="l00456"></a>00456 connect(f, SIGNAL(completed()), <span class="keyword">this</span>, SLOT(slotCompleted())); <a name="l00457"></a>00457 connect(f, SIGNAL(canceled(<span class="keyword">const</span> QString &)), <span class="keyword">this</span>, SLOT(slotCanceled(<span class="keyword">const</span> QString&))); <a name="l00458"></a>00458 } <a name="l00459"></a>00459 <a name="l00460"></a><a class="code" href="classAkregator_1_1View.html#0e66502b54fd87a95430d09d2c1719bf">00460</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#0e66502b54fd87a95430d09d2c1719bf" title="sets the status bar text to a given string">View::slotStatusText</a>(<span class="keyword">const</span> QString &c) <a name="l00461"></a>00461 { <a name="l00462"></a>00462 <span class="keywordflow">if</span> (sender() == m_currentFrame) <a name="l00463"></a>00463 emit setStatusBarText(c); <a name="l00464"></a>00464 } <a name="l00465"></a>00465 <a name="l00466"></a><a class="code" href="classAkregator_1_1View.html#a2078c77fea1c387d327dafb35089ac4">00466</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#a2078c77fea1c387d327dafb35089ac4" title="sets the window caption after a frame change">View::slotCaptionChanged</a>(<span class="keyword">const</span> QString &c) <a name="l00467"></a>00467 { <a name="l00468"></a>00468 <span class="keywordflow">if</span> (sender() == m_currentFrame) <a name="l00469"></a>00469 emit setWindowCaption(c); <a name="l00470"></a>00470 } <a name="l00471"></a>00471 <a name="l00472"></a>00472 <span class="keywordtype">void</span> View::slotStarted() <a name="l00473"></a>00473 { <a name="l00474"></a>00474 <span class="keywordflow">if</span> (sender() == m_currentFrame) <a name="l00475"></a>00475 emit signalStarted(0); <a name="l00476"></a>00476 } <a name="l00477"></a>00477 <a name="l00478"></a>00478 <span class="keywordtype">void</span> View::slotCanceled(<span class="keyword">const</span> QString &s) <a name="l00479"></a>00479 { <a name="l00480"></a>00480 <span class="keywordflow">if</span> (sender() == m_currentFrame) <a name="l00481"></a>00481 emit signalCanceled(s); <a name="l00482"></a>00482 } <a name="l00483"></a>00483 <a name="l00484"></a>00484 <span class="keywordtype">void</span> View::slotCompleted() <a name="l00485"></a>00485 { <a name="l00486"></a>00486 <span class="keywordflow">if</span> (sender() == m_currentFrame) <a name="l00487"></a>00487 emit signalCompleted(); <a name="l00488"></a>00488 } <a name="l00489"></a>00489 <a name="l00490"></a>00490 <span class="keywordtype">void</span> View::slotLoadingProgress(<span class="keywordtype">int</span> percent) <a name="l00491"></a>00491 { <a name="l00492"></a>00492 <span class="keywordflow">if</span> (sender() == m_currentFrame) <a name="l00493"></a>00493 emit setProgress(percent); <a name="l00494"></a>00494 } <a name="l00495"></a>00495 <a name="l00496"></a><a class="code" href="classAkregator_1_1View.html#a92dab498944ee990031e9b9d1bb2236">00496</a> <span class="keywordtype">bool</span> <a class="code" href="classAkregator_1_1View.html#a92dab498944ee990031e9b9d1bb2236" title="Adds the feeds in doc to the &quot;Imported Folder&quot;.">View::importFeeds</a>(<span class="keyword">const</span> QDomDocument& doc) <a name="l00497"></a>00497 { <a name="l00498"></a>00498 <a class="code" href="classAkregator_1_1FeedList.html" title="The model of a feed tree, represents an OPML document.">FeedList</a>* feedList = <span class="keyword">new</span> <a class="code" href="classAkregator_1_1FeedList.html" title="The model of a feed tree, represents an OPML document.">FeedList</a>(); <a name="l00499"></a>00499 <span class="keywordtype">bool</span> parsed = feedList-><a class="code" href="classAkregator_1_1FeedList.html#632935fbc18dfbdd1012b41ac9f91423" title="reads an OPML document and appends the items to this list">readFromXML</a>(doc); <a name="l00500"></a>00500 <a name="l00501"></a>00501 <span class="comment">// FIXME: parsing error, print some message</span> <a name="l00502"></a>00502 <span class="keywordflow">if</span> (!parsed) <a name="l00503"></a>00503 { <a name="l00504"></a>00504 <span class="keyword">delete</span> feedList; <a name="l00505"></a>00505 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l00506"></a>00506 } <a name="l00507"></a>00507 QString title = feedList->title(); <a name="l00508"></a>00508 <a name="l00509"></a>00509 <span class="keywordflow">if</span> (title.isEmpty()) <a name="l00510"></a>00510 title = i18n(<span class="stringliteral">"Imported Folder"</span>); <a name="l00511"></a>00511 <a name="l00512"></a>00512 <span class="keywordtype">bool</span> ok; <a name="l00513"></a>00513 title = KInputDialog::getText(i18n(<span class="stringliteral">"Add Imported Folder"</span>), i18n(<span class="stringliteral">"Imported folder name:"</span>), title, &ok); <a name="l00514"></a>00514 <a name="l00515"></a>00515 <span class="keywordflow">if</span> (!ok) <a name="l00516"></a>00516 { <a name="l00517"></a>00517 <span class="keyword">delete</span> feedList; <a name="l00518"></a>00518 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l00519"></a>00519 } <a name="l00520"></a>00520 <a name="l00521"></a>00521 <a class="code" href="classAkregator_1_1Folder.html" title="Represents a folder (containing feeds and/or other folders).">Folder</a>* fg = <span class="keyword">new</span> <a class="code" href="classAkregator_1_1Folder.html" title="Represents a folder (containing feeds and/or other folders).">Folder</a>(title); <a name="l00522"></a>00522 m_feedList->rootNode()->appendChild(fg); <a name="l00523"></a>00523 m_feedList-><a class="code" href="classAkregator_1_1FeedList.html#bb859a2c58a78ef7a498c87dba354cd3" title="appends another feed list as sub tree.">append</a>(feedList, fg); <a name="l00524"></a>00524 <a name="l00525"></a>00525 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l00526"></a>00526 } <a name="l00527"></a>00527 <a name="l00528"></a><a class="code" href="classAkregator_1_1View.html#2f6eb960fdea851e5522a28f54d922b7">00528</a> <span class="keywordtype">bool</span> <a class="code" href="classAkregator_1_1View.html#2f6eb960fdea851e5522a28f54d922b7" title="Parse OPML presentation of feeds and read in articles archive, if present.">View::loadFeeds</a>(<span class="keyword">const</span> QDomDocument& doc, <a class="code" href="classAkregator_1_1Folder.html" title="Represents a folder (containing feeds and/or other folders).">Folder</a>* parent) <a name="l00529"></a>00529 { <a name="l00530"></a>00530 <a class="code" href="classAkregator_1_1FeedList.html" title="The model of a feed tree, represents an OPML document.">FeedList</a>* feedList = <span class="keyword">new</span> <a class="code" href="classAkregator_1_1FeedList.html" title="The model of a feed tree, represents an OPML document.">FeedList</a>(); <a name="l00531"></a>00531 <span class="keywordtype">bool</span> parsed = feedList-><a class="code" href="classAkregator_1_1FeedList.html#632935fbc18dfbdd1012b41ac9f91423" title="reads an OPML document and appends the items to this list">readFromXML</a>(doc); <a name="l00532"></a>00532 <a name="l00533"></a>00533 <span class="comment">// parsing went wrong</span> <a name="l00534"></a>00534 <span class="keywordflow">if</span> (!parsed) <a name="l00535"></a>00535 { <a name="l00536"></a>00536 <span class="keyword">delete</span> feedList; <a name="l00537"></a>00537 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l00538"></a>00538 } <a name="l00539"></a>00539 m_feedListView->setUpdatesEnabled(<span class="keyword">false</span>); <a name="l00540"></a>00540 m_tagNodeListView->setUpdatesEnabled(<span class="keyword">false</span>); <a name="l00541"></a>00541 <span class="keywordflow">if</span> (!parent) <a name="l00542"></a>00542 { <a name="l00543"></a>00543 <a class="code" href="classAkregator_1_1TagSet.html" title="represents a set of tags (see Tag) In an application, there is usually one central...">TagSet</a>* tagSet = Kernel::self()->tagSet(); <a name="l00544"></a>00544 <a name="l00545"></a>00545 Kernel::self()->setFeedList(feedList); <a name="l00546"></a>00546 ProgressManager::self()->setFeedList(feedList); <a name="l00547"></a>00547 disconnectFromFeedList(m_feedList); <a name="l00548"></a>00548 <span class="keyword">delete</span> m_feedList; <a name="l00549"></a>00549 <span class="keyword">delete</span> m_tagNodeList; <a name="l00550"></a>00550 m_feedList = feedList; <a name="l00551"></a>00551 connectToFeedList(m_feedList); <a name="l00552"></a>00552 <a name="l00553"></a>00553 m_tagNodeList = <span class="keyword">new</span> TagNodeList(m_feedList, tagSet); <a name="l00554"></a>00554 m_feedListView->setNodeList(m_feedList); <a name="l00555"></a>00555 m_tagNodeListView->setNodeList(m_tagNodeList); <a name="l00556"></a>00556 <a name="l00557"></a>00557 QStringList tagIDs = m_feedList->rootNode()->tags(); <a name="l00558"></a>00558 QStringList::ConstIterator end = tagIDs.end(); <a name="l00559"></a>00559 <span class="keywordflow">for</span> (QStringList::ConstIterator it = tagIDs.begin(); it != end; ++it) <a name="l00560"></a>00560 { <a name="l00561"></a>00561 kdDebug() << *it << endl; <a name="l00562"></a>00562 <span class="comment">// create a tag for every tag ID in the archive that is not part of the tagset</span> <a name="l00563"></a>00563 <span class="comment">// this is a fallback in case the tagset was corrupted,</span> <a name="l00564"></a>00564 <span class="comment">// so the tagging information from archive does not get lost.</span> <a name="l00565"></a>00565 <span class="keywordflow">if</span> (!tagSet-><a class="code" href="classAkregator_1_1TagSet.html#3edc85c0231237589914d5f4a5c7f723" title="returns true if this set contains a tag with a given ID">containsID</a>(*it)) <a name="l00566"></a>00566 { <a name="l00567"></a>00567 Tag tag(*it, *it); <a name="l00568"></a>00568 tagSet-><a class="code" href="classAkregator_1_1TagSet.html#68e58316da63cfe3e2a85426bc7735ca" title="adds a tag to the tag set.">insert</a>(tag); <a name="l00569"></a>00569 } <a name="l00570"></a>00570 } <a name="l00571"></a>00571 } <a name="l00572"></a>00572 <span class="keywordflow">else</span> <a name="l00573"></a>00573 m_feedList-><a class="code" href="classAkregator_1_1FeedList.html#bb859a2c58a78ef7a498c87dba354cd3" title="appends another feed list as sub tree.">append</a>(feedList, parent); <a name="l00574"></a>00574 <a name="l00575"></a>00575 m_feedListView->setUpdatesEnabled(<span class="keyword">true</span>); <a name="l00576"></a>00576 m_feedListView->triggerUpdate(); <a name="l00577"></a>00577 m_tagNodeListView->setUpdatesEnabled(<span class="keyword">true</span>); <a name="l00578"></a>00578 m_tagNodeListView->triggerUpdate(); <a name="l00579"></a>00579 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l00580"></a>00580 } <a name="l00581"></a>00581 <a name="l00582"></a>00582 <span class="keywordtype">void</span> View::slotDeleteExpiredArticles() <a name="l00583"></a>00583 { <a name="l00584"></a>00584 <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>* rootNode = m_feedList->rootNode(); <a name="l00585"></a>00585 <span class="keywordflow">if</span> (rootNode) <a name="l00586"></a>00586 rootNode-><a class="code" href="classAkregator_1_1TreeNode.html#e3c46f81d6dcdc2f47a9f4176fbd291f" title="Deletes all expired articles in the node (depending on the expiry settings).">slotDeleteExpiredArticles</a>(); <a name="l00587"></a>00587 } <a name="l00588"></a>00588 <a name="l00589"></a><a class="code" href="classAkregator_1_1View.html#62e6a6a32a5ce89b98b467b511492d39">00589</a> QDomDocument <a class="code" href="classAkregator_1_1View.html#62e6a6a32a5ce89b98b467b511492d39">View::feedListToOPML</a>() <a name="l00590"></a>00590 { <a name="l00591"></a>00591 <span class="keywordflow">return</span> m_feedList-><a class="code" href="classAkregator_1_1FeedList.html#7e43794e7d2883e279426709dd21bbae" title="exports the feed list as OPML.">toXML</a>(); <a name="l00592"></a>00592 } <a name="l00593"></a>00593 <a name="l00594"></a><a class="code" href="classAkregator_1_1View.html#8cf27876e35bf3f5cd865a6e80eb2788">00594</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#8cf27876e35bf3f5cd865a6e80eb2788" title="Add a feed to a group.">View::addFeedToGroup</a>(<span class="keyword">const</span> QString& url, <span class="keyword">const</span> QString& groupName) <a name="l00595"></a>00595 { <a name="l00596"></a>00596 <a name="l00597"></a>00597 <span class="comment">// Locate the group.</span> <a name="l00598"></a>00598 <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>* node = m_feedListView->findNodeByTitle(groupName); <a name="l00599"></a>00599 <a name="l00600"></a>00600 <a class="code" href="classAkregator_1_1Folder.html" title="Represents a folder (containing feeds and/or other folders).">Folder</a>* group = 0; <a name="l00601"></a>00601 <span class="keywordflow">if</span> (!node || !node-><a class="code" href="classAkregator_1_1TreeNode.html#0f07a1ca8accba641e632ac89c279fa0" title="Helps the rest of the app to decide if node should be handled as group or not.">isGroup</a>()) <a name="l00602"></a>00602 { <a name="l00603"></a>00603 <a class="code" href="classAkregator_1_1Folder.html" title="Represents a folder (containing feeds and/or other folders).">Folder</a>* g = <span class="keyword">new</span> <a class="code" href="classAkregator_1_1Folder.html" title="Represents a folder (containing feeds and/or other folders).">Folder</a>( groupName ); <a name="l00604"></a>00604 m_feedList->rootNode()->appendChild(g); <a name="l00605"></a>00605 group = g; <a name="l00606"></a>00606 } <a name="l00607"></a>00607 <span class="keywordflow">else</span> <a name="l00608"></a>00608 group = <span class="keyword">static_cast<</span><a class="code" href="classAkregator_1_1Folder.html" title="Represents a folder (containing feeds and/or other folders).">Folder</a>*<span class="keyword">></span>(node); <a name="l00609"></a>00609 <a name="l00610"></a>00610 <span class="comment">// Invoke the Add Feed dialog with url filled in.</span> <a name="l00611"></a>00611 <span class="keywordflow">if</span> (group) <a name="l00612"></a>00612 addFeed(url, 0, group, <span class="keyword">true</span>); <a name="l00613"></a>00613 } <a name="l00614"></a>00614 <a name="l00615"></a><a class="code" href="classAkregator_1_1View.html#9f4253a801a0c06e567b6f5b9b94ab8e">00615</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#9f4253a801a0c06e567b6f5b9b94ab8e" title="switches view mode to normal view">View::slotNormalView</a>() <a name="l00616"></a>00616 { <a name="l00617"></a>00617 <span class="keywordflow">if</span> (m_viewMode == NormalView) <a name="l00618"></a>00618 <span class="keywordflow">return</span>; <a name="l00619"></a>00619 <a name="l00620"></a>00620 <span class="keywordflow">if</span> (m_viewMode == CombinedView) <a name="l00621"></a>00621 { <a name="l00622"></a>00622 m_articleList->slotShowNode(m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode()); <a name="l00623"></a>00623 m_articleList->show(); <a name="l00624"></a>00624 <a name="l00625"></a>00625 <a class="code" href="classAkregator_1_1Article.html" title="A proxy class for RSS::Article with some additional methods to assist sorting.">Article</a> article = m_articleList->currentArticle(); <a name="l00626"></a>00626 <a name="l00627"></a>00627 <span class="keywordflow">if</span> (!article.<a class="code" href="classAkregator_1_1Article.html#bbc089d0e0c6dc49318327adc2a414b4">isNull</a>()) <a name="l00628"></a>00628 m_articleViewer-><a class="code" href="classAkregator_1_1ArticleViewer.html#967a33bb28464b72aa17af69984e3ca0" title="Show single article (normal view).">slotShowArticle</a>(article); <a name="l00629"></a>00629 <span class="keywordflow">else</span> <a name="l00630"></a>00630 m_articleViewer-><a class="code" href="classAkregator_1_1ArticleViewer.html#0771aee544c1d035b64722cadf1e26f9">slotShowSummary</a>(m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode()); <a name="l00631"></a>00631 } <a name="l00632"></a>00632 <a name="l00633"></a>00633 m_articleSplitter->setOrientation(QSplitter::Vertical); <a name="l00634"></a>00634 m_viewMode = NormalView; <a name="l00635"></a>00635 <a name="l00636"></a>00636 Settings::setViewMode( m_viewMode ); <a name="l00637"></a>00637 } <a name="l00638"></a>00638 <a name="l00639"></a><a class="code" href="classAkregator_1_1View.html#da047ed192ab73a7837f265f3987d9d6">00639</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#da047ed192ab73a7837f265f3987d9d6" title="switches view mode to widescreen view">View::slotWidescreenView</a>() <a name="l00640"></a>00640 { <a name="l00641"></a>00641 <span class="keywordflow">if</span> (m_viewMode == WidescreenView) <a name="l00642"></a>00642 <span class="keywordflow">return</span>; <a name="l00643"></a>00643 <a name="l00644"></a>00644 <span class="keywordflow">if</span> (m_viewMode == CombinedView) <a name="l00645"></a>00645 { <a name="l00646"></a>00646 m_articleList->slotShowNode(m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode()); <a name="l00647"></a>00647 m_articleList->show(); <a name="l00648"></a>00648 <a name="l00649"></a>00649 <a class="code" href="classAkregator_1_1Article.html" title="A proxy class for RSS::Article with some additional methods to assist sorting.">Article</a> article = m_articleList->currentArticle(); <a name="l00650"></a>00650 <a name="l00651"></a>00651 <span class="keywordflow">if</span> (!article.<a class="code" href="classAkregator_1_1Article.html#bbc089d0e0c6dc49318327adc2a414b4">isNull</a>()) <a name="l00652"></a>00652 m_articleViewer-><a class="code" href="classAkregator_1_1ArticleViewer.html#967a33bb28464b72aa17af69984e3ca0" title="Show single article (normal view).">slotShowArticle</a>(article); <a name="l00653"></a>00653 <span class="keywordflow">else</span> <a name="l00654"></a>00654 m_articleViewer-><a class="code" href="classAkregator_1_1ArticleViewer.html#0771aee544c1d035b64722cadf1e26f9">slotShowSummary</a>(m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode()); <a name="l00655"></a>00655 } <a name="l00656"></a>00656 <a name="l00657"></a>00657 m_articleSplitter->setOrientation(QSplitter::Horizontal); <a name="l00658"></a>00658 m_viewMode = WidescreenView; <a name="l00659"></a>00659 <a name="l00660"></a>00660 Settings::setViewMode( m_viewMode ); <a name="l00661"></a>00661 } <a name="l00662"></a>00662 <a name="l00663"></a><a class="code" href="classAkregator_1_1View.html#c11073c7a4be7a84f489614df24d9dbe">00663</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#c11073c7a4be7a84f489614df24d9dbe" title="switches view mode to combined view">View::slotCombinedView</a>() <a name="l00664"></a>00664 { <a name="l00665"></a>00665 <span class="keywordflow">if</span> (m_viewMode == CombinedView) <a name="l00666"></a>00666 <span class="keywordflow">return</span>; <a name="l00667"></a>00667 <a name="l00668"></a>00668 m_articleList->slotClear(); <a name="l00669"></a>00669 m_articleList->hide(); <a name="l00670"></a>00670 m_viewMode = CombinedView; <a name="l00671"></a>00671 <a name="l00672"></a>00672 <a class="code" href="classAkregator_1_1View.html#5771f647c0fd90c828857da74f97841f" title="selected tree node has changed">slotNodeSelected</a>(m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode()); <a name="l00673"></a>00673 Settings::setViewMode( m_viewMode ); <a name="l00674"></a>00674 } <a name="l00675"></a>00675 <a name="l00676"></a><a class="code" href="classAkregator_1_1View.html#b9fd8ba6990cd75b7537e758392c68ac">00676</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#b9fd8ba6990cd75b7537e758392c68ac" title="called when another part/frame is activated.">View::slotFrameChanged</a>(Frame *f) <a name="l00677"></a>00677 { <a name="l00678"></a>00678 <span class="keywordflow">if</span> (m_shuttingDown) <a name="l00679"></a>00679 <span class="keywordflow">return</span>; <a name="l00680"></a>00680 <a name="l00681"></a>00681 m_currentFrame=f; <a name="l00682"></a>00682 <a name="l00683"></a>00683 emit setWindowCaption(f->caption()); <a name="l00684"></a>00684 emit setProgress(f->progress()); <a name="l00685"></a>00685 emit setStatusBarText(f->statusText()); <a name="l00686"></a>00686 <a name="l00687"></a>00687 <span class="keywordflow">if</span> (f->part() == m_part) <a name="l00688"></a>00688 m_part-><a class="code" href="classAkregator_1_1Part.html#28339e454f049229ae862f9b62f77b4b" title="merges a nested part&#39;s GUI into the gui of this part">mergePart</a>(m_articleViewer); <a name="l00689"></a>00689 <span class="keywordflow">else</span> <a name="l00690"></a>00690 m_part-><a class="code" href="classAkregator_1_1Part.html#28339e454f049229ae862f9b62f77b4b" title="merges a nested part&#39;s GUI into the gui of this part">mergePart</a>(f->part()); <a name="l00691"></a>00691 <a name="l00692"></a>00692 f->widget()->setFocus(); <a name="l00693"></a>00693 <a name="l00694"></a>00694 <span class="keywordflow">switch</span> (f->state()) <a name="l00695"></a>00695 { <a name="l00696"></a>00696 <span class="keywordflow">case</span> Frame::Started: <a name="l00697"></a>00697 emit signalStarted(0); <a name="l00698"></a>00698 <span class="keywordflow">break</span>; <a name="l00699"></a>00699 <span class="keywordflow">case</span> Frame::Canceled: <a name="l00700"></a>00700 emit signalCanceled(QString::null); <a name="l00701"></a>00701 <span class="keywordflow">break</span>; <a name="l00702"></a>00702 <span class="keywordflow">case</span> Frame::Idle: <a name="l00703"></a>00703 <span class="keywordflow">case</span> Frame::Completed: <a name="l00704"></a>00704 <span class="keywordflow">default</span>: <a name="l00705"></a>00705 emit signalCompleted(); <a name="l00706"></a>00706 } <a name="l00707"></a>00707 } <a name="l00708"></a>00708 <a name="l00709"></a><a class="code" href="classAkregator_1_1View.html#8d664d40ff761936897824890c1ec6b1">00709</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#8d664d40ff761936897824890c1ec6b1" title="Shows requested popup menu for feed tree.">View::slotFeedTreeContextMenu</a>(KListView*, <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>* <span class="comment">/*node*/</span>, <span class="keyword">const</span> QPoint& <span class="comment">/*p*/</span>) <a name="l00710"></a>00710 { <a name="l00711"></a>00711 m_tabs->showPage(m_mainTab); <a name="l00712"></a>00712 } <a name="l00713"></a>00713 <a name="l00714"></a>00714 <span class="keywordtype">void</span> View::slotMoveCurrentNodeUp() <a name="l00715"></a>00715 { <a name="l00716"></a>00716 <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>* current = m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode(); <a name="l00717"></a>00717 <span class="keywordflow">if</span> (!current) <a name="l00718"></a>00718 <span class="keywordflow">return</span>; <a name="l00719"></a>00719 <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>* prev = current-><a class="code" href="classAkregator_1_1TreeNode.html#04a7bb9778165dfae373c71e645b3b56" title="Get the previous sibling.">prevSibling</a>(); <a name="l00720"></a>00720 <a class="code" href="classAkregator_1_1Folder.html" title="Represents a folder (containing feeds and/or other folders).">Folder</a>* parent = current-><a class="code" href="classAkregator_1_1TreeNode.html#badc676b2769b5f3b245a5ba4f12faad" title="Returns the parent node.">parent</a>(); <a name="l00721"></a>00721 <a name="l00722"></a>00722 <span class="keywordflow">if</span> (!prev || !parent) <a name="l00723"></a>00723 <span class="keywordflow">return</span>; <a name="l00724"></a>00724 <a name="l00725"></a>00725 parent-><a class="code" href="classAkregator_1_1Folder.html#71dac3a74e4f4b5a144d493ca92fcbd8" title="remove node from children.">removeChild</a>(prev); <a name="l00726"></a>00726 parent-><a class="code" href="classAkregator_1_1Folder.html#24e0997c19feed2e4581e7b226fbbed5" title="inserts node as child after child node after.">insertChild</a>(prev, current); <a name="l00727"></a>00727 m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->ensureNodeVisible(current); <a name="l00728"></a>00728 } <a name="l00729"></a>00729 <a name="l00730"></a>00730 <span class="keywordtype">void</span> View::slotMoveCurrentNodeDown() <a name="l00731"></a>00731 { <a name="l00732"></a>00732 TreeNode* current = m_listTabWidget->activeView()->selectedNode(); <a name="l00733"></a>00733 <span class="keywordflow">if</span> (!current) <a name="l00734"></a>00734 <span class="keywordflow">return</span>; <a name="l00735"></a>00735 TreeNode* next = current->nextSibling(); <a name="l00736"></a>00736 Folder* parent = current-><a class="code" href="classAkregator_1_1TreeNode.html#badc676b2769b5f3b245a5ba4f12faad" title="Returns the parent node.">parent</a>(); <a name="l00737"></a>00737 <a name="l00738"></a>00738 <span class="keywordflow">if</span> (!next || !parent) <a name="l00739"></a>00739 <span class="keywordflow">return</span>; <a name="l00740"></a>00740 <a name="l00741"></a>00741 parent->removeChild(current); <a name="l00742"></a>00742 parent->insertChild(current, next); <a name="l00743"></a>00743 m_listTabWidget->activeView()->ensureNodeVisible(current); <a name="l00744"></a>00744 } <a name="l00745"></a>00745 <a name="l00746"></a>00746 <span class="keywordtype">void</span> View::slotMoveCurrentNodeLeft() <a name="l00747"></a>00747 { <a name="l00748"></a>00748 TreeNode* current = m_listTabWidget->activeView()->selectedNode(); <a name="l00749"></a>00749 <span class="keywordflow">if</span> (!current || !current->parent() || !current->parent()->parent()) <a name="l00750"></a>00750 <span class="keywordflow">return</span>; <a name="l00751"></a>00751 <a name="l00752"></a>00752 Folder* parent = current->parent(); <a name="l00753"></a>00753 Folder* grandparent = current->parent()->parent(); <a name="l00754"></a>00754 <a name="l00755"></a>00755 parent->removeChild(current); <a name="l00756"></a>00756 grandparent->insertChild(current, parent); <a name="l00757"></a>00757 m_listTabWidget->activeView()->ensureNodeVisible(current); <a name="l00758"></a>00758 } <a name="l00759"></a>00759 <a name="l00760"></a>00760 <span class="keywordtype">void</span> View::slotMoveCurrentNodeRight() <a name="l00761"></a>00761 { <a name="l00762"></a>00762 TreeNode* current = m_listTabWidget->activeView()->selectedNode(); <a name="l00763"></a>00763 <span class="keywordflow">if</span> (!current || !current->parent()) <a name="l00764"></a>00764 <span class="keywordflow">return</span>; <a name="l00765"></a>00765 TreeNode* prev = current-><a class="code" href="classAkregator_1_1TreeNode.html#04a7bb9778165dfae373c71e645b3b56" title="Get the previous sibling.">prevSibling</a>(); <a name="l00766"></a>00766 <a name="l00767"></a>00767 <span class="keywordflow">if</span> ( prev && prev->isGroup() ) <a name="l00768"></a>00768 { <a name="l00769"></a>00769 Folder* fg = <span class="keyword">static_cast<</span>Folder*<span class="keyword">></span>(prev); <a name="l00770"></a>00770 current->parent()->removeChild(current); <a name="l00771"></a>00771 fg->appendChild(current); <a name="l00772"></a>00772 m_listTabWidget->activeView()->ensureNodeVisible(current); <a name="l00773"></a>00773 } <a name="l00774"></a>00774 } <a name="l00775"></a>00775 <a name="l00776"></a><a class="code" href="classAkregator_1_1View.html#5771f647c0fd90c828857da74f97841f">00776</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#5771f647c0fd90c828857da74f97841f" title="selected tree node has changed">View::slotNodeSelected</a>(<a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>* node) <a name="l00777"></a>00777 { <a name="l00778"></a>00778 m_markReadTimer->stop(); <a name="l00779"></a>00779 <a name="l00780"></a>00780 <span class="keywordflow">if</span> (node) <a name="l00781"></a>00781 { <a name="l00782"></a>00782 kdDebug() << <span class="stringliteral">"node selected: "</span> << node-><a class="code" href="classAkregator_1_1TreeNode.html#735f8ddbe88f73d3ad1754812fd41983" title="Get title of node.">title</a>() << endl; <a name="l00783"></a>00783 kdDebug() << <span class="stringliteral">"unread: "</span> << node-><a class="code" href="classAkregator_1_1TreeNode.html#b7560da4f68b7b9a3ec9fb975090f58f" title="The unread count, returns the number of new/unread articles in the node (for groups:...">unread</a>() << endl; <a name="l00784"></a>00784 kdDebug() << <span class="stringliteral">"total: "</span> << node-><a class="code" href="classAkregator_1_1TreeNode.html#16c7b02a24ac258217135262cf84734b" title="returns the number of total articles in the node (for groups: the accumulated count...">totalCount</a>() << endl; <a name="l00785"></a>00785 } <a name="l00786"></a>00786 <a name="l00787"></a>00787 <span class="keywordflow">if</span> (m_displayingAboutPage) <a name="l00788"></a>00788 { <a name="l00789"></a>00789 m_mainFrame->setTitle(i18n(<span class="stringliteral">"Articles"</span>)); <a name="l00790"></a>00790 <span class="keywordflow">if</span> (m_viewMode != CombinedView) <a name="l00791"></a>00791 m_articleList->show(); <a name="l00792"></a>00792 <span class="keywordflow">if</span> (Settings::showQuickFilter()) <a name="l00793"></a>00793 m_searchBar->show(); <a name="l00794"></a>00794 m_displayingAboutPage = <span class="keyword">false</span>; <a name="l00795"></a>00795 } <a name="l00796"></a>00796 <a name="l00797"></a>00797 m_tabs->showPage(m_mainTab); <a name="l00798"></a>00798 <a name="l00799"></a>00799 <span class="keywordflow">if</span> (Settings::resetQuickFilterOnNodeChange()) <a name="l00800"></a>00800 m_searchBar->slotClearSearch(); <a name="l00801"></a>00801 <a name="l00802"></a>00802 <span class="keywordflow">if</span> (m_viewMode == CombinedView) <a name="l00803"></a>00803 m_articleViewer-><a class="code" href="classAkregator_1_1ArticleViewer.html#c9e6764936e8cbdc4d1b0bc7aa0d4b25" title="Shows the articles of the tree node node (combined view).">slotShowNode</a>(node); <a name="l00804"></a>00804 <span class="keywordflow">else</span> <a name="l00805"></a>00805 { <a name="l00806"></a>00806 m_articleList->slotShowNode(node); <a name="l00807"></a>00807 m_articleViewer-><a class="code" href="classAkregator_1_1ArticleViewer.html#0771aee544c1d035b64722cadf1e26f9">slotShowSummary</a>(node); <a name="l00808"></a>00808 } <a name="l00809"></a>00809 <a name="l00810"></a>00810 <span class="keywordflow">if</span> (node) <a name="l00811"></a>00811 m_mainFrame->setCaption(node-><a class="code" href="classAkregator_1_1TreeNode.html#735f8ddbe88f73d3ad1754812fd41983" title="Get title of node.">title</a>()); <a name="l00812"></a>00812 <a name="l00813"></a>00813 m_actionManager-><a class="code" href="classAkregator_1_1ActionManagerImpl.html#877378e286310b25b3f9f961437c35d6">slotNodeSelected</a>(node); <a name="l00814"></a>00814 <a name="l00815"></a>00815 updateTagActions(); <a name="l00816"></a>00816 } <a name="l00817"></a>00817 <a name="l00818"></a>00818 <span class="keywordtype">void</span> View::slotOpenURL(<span class="keyword">const</span> KURL& url, Viewer* currentViewer, BrowserRun::OpeningMode mode) <a name="l00819"></a>00819 { <a name="l00820"></a>00820 <span class="keywordflow">if</span> (mode == BrowserRun::EXTERNAL) <a name="l00821"></a>00821 Viewer::displayInExternalBrowser(url); <a name="l00822"></a>00822 <span class="keywordflow">else</span> <a name="l00823"></a>00823 { <a name="l00824"></a>00824 KParts::URLArgs args = currentViewer ? currentViewer->browserExtension()->urlArgs() : KParts::URLArgs(); <a name="l00825"></a>00825 <a name="l00826"></a>00826 BrowserRun* r = <span class="keyword">new</span> BrowserRun(<span class="keyword">this</span>, currentViewer, url, args, mode); <a name="l00827"></a>00827 connect(r, SIGNAL(signalOpenInViewer(<span class="keyword">const</span> KURL&, Akregator::Viewer*, Akregator::BrowserRun::OpeningMode)), <a name="l00828"></a>00828 <span class="keyword">this</span>, SLOT(<a class="code" href="classAkregator_1_1View.html#b6406b763f64f7230eba9c11c9c91fc7" title="HACK: receives signal from browserrun when the browserrun detects an HTML mimetype...">slotOpenURLReply</a>(<span class="keyword">const</span> KURL&, Akregator::Viewer*, Akregator::BrowserRun::OpeningMode))); <a name="l00829"></a>00829 } <a name="l00830"></a>00830 } <a name="l00831"></a>00831 <a name="l00832"></a>00832 <span class="comment">//TODO: KDE4 remove this ugly ugly hack</span> <a name="l00833"></a><a class="code" href="classAkregator_1_1View.html#1fb6d84f9339585dcd275f55905ffa3e">00833</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#1fb6d84f9339585dcd275f55905ffa3e" title="HACK: part of the url opening hack for 3.5.">View::slotUrlClickedInViewer</a>(<span class="keyword">const</span> KURL& url, Viewer* viewer, <span class="keywordtype">bool</span> newTab, <span class="keywordtype">bool</span> background) <a name="l00834"></a>00834 { <a name="l00835"></a>00835 <a name="l00836"></a>00836 <span class="keywordflow">if</span> (!newTab) <a name="l00837"></a>00837 { <a name="l00838"></a>00838 slotOpenURL(url, viewer, BrowserRun::CURRENT_TAB); <a name="l00839"></a>00839 } <a name="l00840"></a>00840 <span class="keywordflow">else</span> <a name="l00841"></a>00841 { <a name="l00842"></a>00842 slotOpenURL(url, 0L, background ? BrowserRun::NEW_TAB_BACKGROUND : BrowserRun::NEW_TAB_FOREGROUND); <a name="l00843"></a>00843 } <a name="l00844"></a>00844 } <a name="l00845"></a>00845 <a name="l00846"></a>00846 <span class="comment">//TODO: KDE4 remove this ugly ugly hack</span> <a name="l00847"></a><a class="code" href="classAkregator_1_1View.html#b6406b763f64f7230eba9c11c9c91fc7">00847</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#b6406b763f64f7230eba9c11c9c91fc7" title="HACK: receives signal from browserrun when the browserrun detects an HTML mimetype...">View::slotOpenURLReply</a>(<span class="keyword">const</span> KURL& url, Viewer* currentViewer, BrowserRun::OpeningMode mode) <a name="l00848"></a>00848 { <a name="l00849"></a>00849 <span class="keywordflow">switch</span> (mode) <a name="l00850"></a>00850 { <a name="l00851"></a>00851 <span class="keywordflow">case</span> BrowserRun::CURRENT_TAB: <a name="l00852"></a>00852 currentViewer->openURL(url); <a name="l00853"></a>00853 <span class="keywordflow">break</span>; <a name="l00854"></a>00854 <span class="keywordflow">case</span> BrowserRun::NEW_TAB_FOREGROUND: <a name="l00855"></a>00855 <span class="keywordflow">case</span> BrowserRun::NEW_TAB_BACKGROUND: <a name="l00856"></a>00856 <a class="code" href="classAkregator_1_1View.html#a5a99328351f0b1d1564d57808ddf711" title="opens a page viewer in a new tab and loads an URL">slotOpenNewTab</a>(url, mode == BrowserRun::NEW_TAB_BACKGROUND); <a name="l00857"></a>00857 <span class="keywordflow">break</span>; <a name="l00858"></a>00858 <span class="keywordflow">case</span> BrowserRun::EXTERNAL: <a name="l00859"></a>00859 Viewer::displayInExternalBrowser(url); <a name="l00860"></a>00860 <span class="keywordflow">break</span>; <a name="l00861"></a>00861 } <a name="l00862"></a>00862 } <a name="l00863"></a>00863 <a name="l00864"></a><a class="code" href="classAkregator_1_1View.html#0f44b28e758854b61266a5ff94203196">00864</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#0f44b28e758854b61266a5ff94203196" title="adds a new feed to the feed tree">View::slotFeedAdd</a>() <a name="l00865"></a>00865 { <a name="l00866"></a>00866 <a class="code" href="classAkregator_1_1Folder.html" title="Represents a folder (containing feeds and/or other folders).">Folder</a>* group = 0; <a name="l00867"></a>00867 <span class="keywordflow">if</span> (!m_feedListView->selectedNode()) <a name="l00868"></a>00868 group = m_feedList->rootNode(); <span class="comment">// all feeds</span> <a name="l00869"></a>00869 <span class="keywordflow">else</span> <a name="l00870"></a>00870 { <a name="l00871"></a>00871 <span class="comment">//TODO: tag nodes need rework</span> <a name="l00872"></a>00872 <span class="keywordflow">if</span> ( m_feedListView->selectedNode()->isGroup()) <a name="l00873"></a>00873 group = static_cast<Folder*>(m_feedListView->selectedNode()); <a name="l00874"></a>00874 <span class="keywordflow">else</span> <a name="l00875"></a>00875 group= m_feedListView->selectedNode()->parent(); <a name="l00876"></a>00876 <a name="l00877"></a>00877 } <a name="l00878"></a>00878 <a name="l00879"></a>00879 <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>* lastChild = group-><a class="code" href="classAkregator_1_1Folder.html#60f5dd4a6782561766889d212feb927b" title="returns the (direct) children of this node.">children</a>().last(); <a name="l00880"></a>00880 <a name="l00881"></a>00881 addFeed(QString::null, lastChild, group, <span class="keyword">false</span>); <a name="l00882"></a>00882 } <a name="l00883"></a>00883 <a name="l00884"></a>00884 <span class="keywordtype">void</span> View::addFeed(<span class="keyword">const</span> QString& url, <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a> *after, <a class="code" href="classAkregator_1_1Folder.html" title="Represents a folder (containing feeds and/or other folders).">Folder</a>* parent, <span class="keywordtype">bool</span> autoExec) <a name="l00885"></a>00885 { <a name="l00886"></a>00886 <a name="l00887"></a>00887 AddFeedDialog *afd = <span class="keyword">new</span> AddFeedDialog( 0, <span class="stringliteral">"add_feed"</span> ); <a name="l00888"></a>00888 <a name="l00889"></a>00889 afd->setURL(KURL::decode_string(url)); <a name="l00890"></a>00890 <a name="l00891"></a>00891 <span class="keywordflow">if</span> (autoExec) <a name="l00892"></a>00892 afd->slotOk(); <a name="l00893"></a>00893 <span class="keywordflow">else</span> <a name="l00894"></a>00894 { <a name="l00895"></a>00895 <span class="keywordflow">if</span> (afd->exec() != QDialog::Accepted) <a name="l00896"></a>00896 { <a name="l00897"></a>00897 <span class="keyword">delete</span> afd; <a name="l00898"></a>00898 <span class="keywordflow">return</span>; <a name="l00899"></a>00899 } <a name="l00900"></a>00900 } <a name="l00901"></a>00901 <a name="l00902"></a>00902 Feed* feed = afd->feed; <a name="l00903"></a>00903 <span class="keyword">delete</span> afd; <a name="l00904"></a>00904 <a name="l00905"></a>00905 FeedPropertiesDialog *dlg = <span class="keyword">new</span> FeedPropertiesDialog( 0, <span class="stringliteral">"edit_feed"</span> ); <a name="l00906"></a>00906 dlg->setFeed(feed); <a name="l00907"></a>00907 <a name="l00908"></a>00908 dlg->selectFeedName(); <a name="l00909"></a>00909 <a name="l00910"></a>00910 <span class="keywordflow">if</span> (!autoExec) <a name="l00911"></a>00911 <span class="keywordflow">if</span> (dlg->exec() != QDialog::Accepted) <a name="l00912"></a>00912 { <a name="l00913"></a>00913 <span class="keyword">delete</span> feed; <a name="l00914"></a>00914 <span class="keyword">delete</span> dlg; <a name="l00915"></a>00915 <span class="keywordflow">return</span>; <a name="l00916"></a>00916 } <a name="l00917"></a>00917 <a name="l00918"></a>00918 <span class="keywordflow">if</span> (!parent) <a name="l00919"></a>00919 parent = m_feedList->rootNode(); <a name="l00920"></a>00920 <a name="l00921"></a>00921 parent-><a class="code" href="classAkregator_1_1Folder.html#24e0997c19feed2e4581e7b226fbbed5" title="inserts node as child after child node after.">insertChild</a>(feed, after); <a name="l00922"></a>00922 <a name="l00923"></a>00923 m_feedListView->ensureNodeVisible(feed); <a name="l00924"></a>00924 <a name="l00925"></a>00925 <a name="l00926"></a>00926 <span class="keyword">delete</span> dlg; <a name="l00927"></a>00927 } <a name="l00928"></a>00928 <a name="l00929"></a><a class="code" href="classAkregator_1_1View.html#f59c8cc5fc786f20667e15aadd466c17">00929</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#f59c8cc5fc786f20667e15aadd466c17" title="adds a feed group to the feed tree">View::slotFeedAddGroup</a>() <a name="l00930"></a>00930 { <a name="l00931"></a>00931 <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>* node = m_feedListView->selectedNode(); <a name="l00932"></a>00932 <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>* after = 0; <a name="l00933"></a>00933 <a name="l00934"></a>00934 <span class="keywordflow">if</span> (!node) <a name="l00935"></a>00935 node = m_feedListView->rootNode(); <a name="l00936"></a>00936 <a name="l00937"></a>00937 <span class="comment">// if a feed is selected, add group next to it</span> <a name="l00938"></a>00938 <span class="comment">//TODO: tag nodes need rework</span> <a name="l00939"></a>00939 <span class="keywordflow">if</span> (!node-><a class="code" href="classAkregator_1_1TreeNode.html#0f07a1ca8accba641e632ac89c279fa0" title="Helps the rest of the app to decide if node should be handled as group or not.">isGroup</a>()) <a name="l00940"></a>00940 { <a name="l00941"></a>00941 after = node; <a name="l00942"></a>00942 node = node-><a class="code" href="classAkregator_1_1TreeNode.html#badc676b2769b5f3b245a5ba4f12faad" title="Returns the parent node.">parent</a>(); <a name="l00943"></a>00943 } <a name="l00944"></a>00944 <a name="l00945"></a>00945 <a class="code" href="classAkregator_1_1Folder.html" title="Represents a folder (containing feeds and/or other folders).">Folder</a>* currentGroup = <span class="keyword">static_cast<</span><a class="code" href="classAkregator_1_1Folder.html" title="Represents a folder (containing feeds and/or other folders).">Folder</a>*<span class="keyword">></span> (node); <a name="l00946"></a>00946 <a name="l00947"></a>00947 <span class="keywordtype">bool</span> Ok; <a name="l00948"></a>00948 <a name="l00949"></a>00949 QString text = KInputDialog::getText(i18n(<span class="stringliteral">"Add Folder"</span>), i18n(<span class="stringliteral">"Folder name:"</span>), <span class="stringliteral">""</span>, &Ok); <a name="l00950"></a>00950 <a name="l00951"></a>00951 <span class="keywordflow">if</span> (Ok) <a name="l00952"></a>00952 { <a name="l00953"></a>00953 <a class="code" href="classAkregator_1_1Folder.html" title="Represents a folder (containing feeds and/or other folders).">Folder</a>* newGroup = <span class="keyword">new</span> <a class="code" href="classAkregator_1_1Folder.html" title="Represents a folder (containing feeds and/or other folders).">Folder</a>(text); <a name="l00954"></a>00954 <span class="keywordflow">if</span> (!after) <a name="l00955"></a>00955 currentGroup-><a class="code" href="classAkregator_1_1Folder.html#cb5dc675084a9afc5aacd23b7a625eed" title="inserts node as last child">appendChild</a>(newGroup); <a name="l00956"></a>00956 <span class="keywordflow">else</span> <a name="l00957"></a>00957 currentGroup-><a class="code" href="classAkregator_1_1Folder.html#24e0997c19feed2e4581e7b226fbbed5" title="inserts node as child after child node after.">insertChild</a>(newGroup, after); <a name="l00958"></a>00958 <a name="l00959"></a>00959 m_feedListView->ensureNodeVisible(newGroup); <a name="l00960"></a>00960 } <a name="l00961"></a>00961 } <a name="l00962"></a>00962 <a name="l00963"></a><a class="code" href="classAkregator_1_1View.html#aae936ed3a74371b715693a3ab916e84">00963</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#aae936ed3a74371b715693a3ab916e84" title="removes the currently selected feed (ask for confirmation)">View::slotFeedRemove</a>() <a name="l00964"></a>00964 { <a name="l00965"></a>00965 <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>* selectedNode = m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode(); <a name="l00966"></a>00966 <a name="l00967"></a>00967 <span class="comment">// don't delete root element! (safety valve)</span> <a name="l00968"></a>00968 <span class="keywordflow">if</span> (!selectedNode || selectedNode == m_feedList->rootNode()) <a name="l00969"></a>00969 <span class="keywordflow">return</span>; <a name="l00970"></a>00970 <a name="l00971"></a>00971 m_deleteNodeVisitor->visit(selectedNode); <a name="l00972"></a>00972 } <a name="l00973"></a>00973 <a name="l00974"></a><a class="code" href="classAkregator_1_1View.html#ceeb16397cb1b6a90e7551039a3625b3">00974</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#ceeb16397cb1b6a90e7551039a3625b3" title="calls the properties dialog for feeds, starts renaming for feed groups">View::slotFeedModify</a>() <a name="l00975"></a>00975 { <a name="l00976"></a>00976 <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>* node = m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode(); <a name="l00977"></a>00977 <span class="keywordflow">if</span> (node) <a name="l00978"></a>00978 m_editNodePropertiesVisitor->visit(node); <a name="l00979"></a>00979 <a name="l00980"></a>00980 } <a name="l00981"></a>00981 <a name="l00982"></a><a class="code" href="classAkregator_1_1View.html#f6dc7cdaddc5ea21a47b305c70182143">00982</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#f6dc7cdaddc5ea21a47b305c70182143" title="selects the next unread article in the article list">View::slotNextUnreadArticle</a>() <a name="l00983"></a>00983 { <a name="l00984"></a>00984 <span class="keywordflow">if</span> (m_viewMode == CombinedView) <a name="l00985"></a>00985 m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->slotNextUnreadFeed(); <a name="l00986"></a>00986 <a name="l00987"></a>00987 <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>* sel = m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode(); <a name="l00988"></a>00988 <span class="keywordflow">if</span> (sel && sel-><a class="code" href="classAkregator_1_1TreeNode.html#b7560da4f68b7b9a3ec9fb975090f58f" title="The unread count, returns the number of new/unread articles in the node (for groups:...">unread</a>() > 0) <a name="l00989"></a>00989 m_articleList->slotNextUnreadArticle(); <a name="l00990"></a>00990 <span class="keywordflow">else</span> <a name="l00991"></a>00991 m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->slotNextUnreadFeed(); <a name="l00992"></a>00992 } <a name="l00993"></a>00993 <a name="l00994"></a><a class="code" href="classAkregator_1_1View.html#4ee861cf7ba6fef373da06cc662b0dfb">00994</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#4ee861cf7ba6fef373da06cc662b0dfb" title="selects the previous unread article in the article list">View::slotPrevUnreadArticle</a>() <a name="l00995"></a>00995 { <a name="l00996"></a>00996 <span class="keywordflow">if</span> (m_viewMode == CombinedView) <a name="l00997"></a>00997 m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->slotPrevUnreadFeed(); <a name="l00998"></a>00998 <a name="l00999"></a>00999 <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>* sel = m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode(); <a name="l01000"></a>01000 <span class="keywordflow">if</span> (sel && sel-><a class="code" href="classAkregator_1_1TreeNode.html#b7560da4f68b7b9a3ec9fb975090f58f" title="The unread count, returns the number of new/unread articles in the node (for groups:...">unread</a>() > 0) <a name="l01001"></a>01001 m_articleList->slotPreviousUnreadArticle(); <a name="l01002"></a>01002 <span class="keywordflow">else</span> <a name="l01003"></a>01003 m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->slotPrevUnreadFeed(); <a name="l01004"></a>01004 } <a name="l01005"></a>01005 <a name="l01006"></a><a class="code" href="classAkregator_1_1View.html#f4e3d512d568bee3f2d76c758318e325">01006</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#f4e3d512d568bee3f2d76c758318e325" title="marks all articles in all feeds in the tree as read">View::slotMarkAllFeedsRead</a>() <a name="l01007"></a>01007 { <a name="l01008"></a>01008 m_feedList->rootNode()->slotMarkAllArticlesAsRead(); <a name="l01009"></a>01009 } <a name="l01010"></a>01010 <a name="l01011"></a><a class="code" href="classAkregator_1_1View.html#b7c02dc7794f947294c4f7a193f43bf2">01011</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#b7c02dc7794f947294c4f7a193f43bf2" title="marks all articles in the currently selected feed as read">View::slotMarkAllRead</a>() <a name="l01012"></a>01012 { <a name="l01013"></a>01013 <span class="keywordflow">if</span>(!m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode()) <span class="keywordflow">return</span>; <a name="l01014"></a>01014 m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode()->slotMarkAllArticlesAsRead(); <a name="l01015"></a>01015 } <a name="l01016"></a>01016 <a name="l01017"></a><a class="code" href="classAkregator_1_1View.html#d3ef562b937096f5f0ac08f118e06d64">01017</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#d3ef562b937096f5f0ac08f118e06d64" title="opens the homepage of the currently selected feed">View::slotOpenHomepage</a>() <a name="l01018"></a>01018 { <a name="l01019"></a>01019 <a class="code" href="classAkregator_1_1Feed.html" title="represents a feed">Feed</a>* feed = <span class="keyword">dynamic_cast<</span><a class="code" href="classAkregator_1_1Feed.html" title="represents a feed">Feed</a> *<span class="keyword">></span>(m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode()); <a name="l01020"></a>01020 <a name="l01021"></a>01021 <span class="keywordflow">if</span> (!feed) <a name="l01022"></a>01022 <span class="keywordflow">return</span>; <a name="l01023"></a>01023 <a name="l01024"></a>01024 KURL url = KURL(feed-><a class="code" href="classAkregator_1_1Feed.html#2199fa1b1abb1ccd78083dd6fabb8fe3" title="returns the URL of the HTML page of this feed">htmlUrl</a>()) <a name="l01025"></a>01025 ; <a name="l01026"></a>01026 <span class="keywordflow">switch</span> (Settings::lMBBehaviour()) <a name="l01027"></a>01027 { <a name="l01028"></a>01028 <span class="keywordflow">case</span> Settings::EnumLMBBehaviour::OpenInExternalBrowser: <a name="l01029"></a>01029 slotOpenURL(url, 0, BrowserRun::EXTERNAL); <a name="l01030"></a>01030 <span class="keywordflow">break</span>; <a name="l01031"></a>01031 <span class="keywordflow">case</span> Settings::EnumLMBBehaviour::OpenInBackground: <a name="l01032"></a>01032 slotOpenURL(url, 0, BrowserRun::NEW_TAB_BACKGROUND); <a name="l01033"></a>01033 <span class="keywordflow">break</span>; <a name="l01034"></a>01034 <span class="keywordflow">default</span>: <a name="l01035"></a>01035 slotOpenURL(url, 0, BrowserRun::NEW_TAB_FOREGROUND); <a name="l01036"></a>01036 } <a name="l01037"></a>01037 } <a name="l01038"></a>01038 <a name="l01039"></a><a class="code" href="classAkregator_1_1View.html#c5fe5db32bff5ce54c2f44e4acc787ab">01039</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#c5fe5db32bff5ce54c2f44e4acc787ab" title="emits signalUnreadCountChanged(int)">View::slotSetTotalUnread</a>() <a name="l01040"></a>01040 { <a name="l01041"></a>01041 emit <a class="code" href="classAkregator_1_1View.html#a34ea7e09848d509005e80efe74b25b8" title="emitted when the unread count of &quot;All Feeds&quot; was changed">signalUnreadCountChanged</a>( m_feedList->rootNode()->unread() ); <a name="l01042"></a>01042 } <a name="l01043"></a>01043 <a name="l01044"></a>01044 <span class="keywordtype">void</span> View::slotDoIntervalFetches() <a name="l01045"></a>01045 { <a name="l01046"></a>01046 m_feedList->rootNode()->slotAddToFetchQueue(Kernel::self()->fetchQueue(), <span class="keyword">true</span>); <a name="l01047"></a>01047 } <a name="l01048"></a>01048 <a name="l01049"></a><a class="code" href="classAkregator_1_1View.html#249c67a8f9ccf69558a73f52e1ae09f2">01049</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#249c67a8f9ccf69558a73f52e1ae09f2" title="fetches the currently selected feed">View::slotFetchCurrentFeed</a>() <a name="l01050"></a>01050 { <a name="l01051"></a>01051 <span class="keywordflow">if</span> ( !m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode() ) <a name="l01052"></a>01052 <span class="keywordflow">return</span>; <a name="l01053"></a>01053 m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode()->slotAddToFetchQueue(Kernel::self()->fetchQueue()); <a name="l01054"></a>01054 } <a name="l01055"></a>01055 <a name="l01056"></a><a class="code" href="classAkregator_1_1View.html#d9ecc39ee3204193d8d082b6fdbffa46">01056</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#d9ecc39ee3204193d8d082b6fdbffa46" title="starts fetching of all feeds in the tree">View::slotFetchAllFeeds</a>() <a name="l01057"></a>01057 { <a name="l01058"></a>01058 m_feedList->rootNode()->slotAddToFetchQueue(Kernel::self()->fetchQueue()); <a name="l01059"></a>01059 } <a name="l01060"></a>01060 <a name="l01061"></a>01061 <span class="keywordtype">void</span> View::slotFetchingStarted() <a name="l01062"></a>01062 { <a name="l01063"></a>01063 m_mainFrame->setState(Frame::Started); <a name="l01064"></a>01064 m_actionManager-><a class="code" href="classAkregator_1_1ActionManagerImpl.html#82a96ac8afc1d81c01fe961a13023bf1">action</a>(<span class="stringliteral">"feed_stop"</span>)->setEnabled(<span class="keyword">true</span>); <a name="l01065"></a>01065 m_mainFrame->setStatusText(i18n(<span class="stringliteral">"Fetching Feeds..."</span>)); <a name="l01066"></a>01066 } <a name="l01067"></a>01067 <a name="l01068"></a>01068 <span class="keywordtype">void</span> View::slotFetchingStopped() <a name="l01069"></a>01069 { <a name="l01070"></a>01070 m_mainFrame->setState(Frame::Completed); <a name="l01071"></a>01071 m_actionManager->action(<span class="stringliteral">"feed_stop"</span>)->setEnabled(<span class="keyword">false</span>); <a name="l01072"></a>01072 m_mainFrame->setStatusText(QString::null); <a name="l01073"></a>01073 } <a name="l01074"></a>01074 <a name="l01075"></a><a class="code" href="classAkregator_1_1View.html#df813d0f4e22a9b57dc118d7b64340b7">01075</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#df813d0f4e22a9b57dc118d7b64340b7" title="Feed has been fetched, populate article view if needed and update counters.">View::slotFeedFetched</a>(<a class="code" href="classAkregator_1_1Feed.html" title="represents a feed">Feed</a> *feed) <a name="l01076"></a>01076 { <a name="l01077"></a>01077 <span class="comment">// iterate through the articles (once again) to do notifications properly</span> <a name="l01078"></a>01078 <span class="keywordflow">if</span> (feed-><a class="code" href="classAkregator_1_1Feed.html#7e1bcdaac94fccb89e7e33cf4a62448b" title="Returns a sequence of the articles this node contains.">articles</a>().count() > 0) <a name="l01079"></a>01079 { <a name="l01080"></a>01080 QValueList<Article> articles = feed-><a class="code" href="classAkregator_1_1Feed.html#7e1bcdaac94fccb89e7e33cf4a62448b" title="Returns a sequence of the articles this node contains.">articles</a>(); <a name="l01081"></a>01081 QValueList<Article>::ConstIterator it; <a name="l01082"></a>01082 QValueList<Article>::ConstIterator end = articles.end(); <a name="l01083"></a>01083 <span class="keywordflow">for</span> (it = articles.begin(); it != end; ++it) <a name="l01084"></a>01084 { <a name="l01085"></a>01085 <span class="keywordflow">if</span> ((*it).status()==Article::New && ((*it).feed()->useNotification() || Settings::useNotifications())) <a name="l01086"></a>01086 { <a name="l01087"></a>01087 <a class="code" href="classAkregator_1_1NotificationManager.html#ce0606a2f69a9c64eca15707a706241c" title="singleton instance of notification manager">NotificationManager::self</a>()-><a class="code" href="classAkregator_1_1NotificationManager.html#9a98652fc36c51db3697de12efe54728" title="notifies an article.">slotNotifyArticle</a>(*it); <a name="l01088"></a>01088 } <a name="l01089"></a>01089 } <a name="l01090"></a>01090 } <a name="l01091"></a>01091 } <a name="l01092"></a>01092 <a name="l01093"></a><a class="code" href="classAkregator_1_1View.html#a750ca71d3f4bd16f2a9b55c14135a32">01093</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#a750ca71d3f4bd16f2a9b55c14135a32" title="special behaviour in article list view (TODO: move code there?)">View::slotMouseButtonPressed</a>(<span class="keywordtype">int</span> button, <span class="keyword">const</span> <a class="code" href="classAkregator_1_1Article.html" title="A proxy class for RSS::Article with some additional methods to assist sorting.">Article</a>& article, <span class="keyword">const</span> QPoint &, <span class="keywordtype">int</span>) <a name="l01094"></a>01094 { <a name="l01095"></a>01095 <span class="keywordflow">if</span> (button == Qt::MidButton) <a name="l01096"></a>01096 { <a name="l01097"></a>01097 KURL link = article.<a class="code" href="classAkregator_1_1Article.html#1ebcbb8d1fc7c89f6936eeb319cfbee0">link</a>(); <a name="l01098"></a>01098 <span class="keywordflow">switch</span> (Settings::mMBBehaviour()) <a name="l01099"></a>01099 { <a name="l01100"></a>01100 <span class="keywordflow">case</span> Settings::EnumMMBBehaviour::OpenInExternalBrowser: <a name="l01101"></a>01101 slotOpenURL(link, 0L, BrowserRun::EXTERNAL); <a name="l01102"></a>01102 <span class="keywordflow">break</span>; <a name="l01103"></a>01103 <span class="keywordflow">case</span> Settings::EnumMMBBehaviour::OpenInBackground: <a name="l01104"></a>01104 slotOpenURL(link, 0L, BrowserRun::NEW_TAB_BACKGROUND); <a name="l01105"></a>01105 <span class="keywordflow">break</span>; <a name="l01106"></a>01106 <span class="keywordflow">default</span>: <a name="l01107"></a>01107 slotOpenURL(link, 0L, BrowserRun::NEW_TAB_FOREGROUND); <a name="l01108"></a>01108 } <a name="l01109"></a>01109 } <a name="l01110"></a>01110 } <a name="l01111"></a>01111 <a name="l01112"></a>01112 <span class="keywordtype">void</span> View::slotAssignTag(<span class="keyword">const</span> Tag& tag, <span class="keywordtype">bool</span> assign) <a name="l01113"></a>01113 { <a name="l01114"></a>01114 kdDebug() << (assign ? <span class="stringliteral">"assigned"</span> : <span class="stringliteral">"removed"</span>) << <span class="stringliteral">" tag \""</span> << tag.id() << <span class="stringliteral">"\""</span> << endl; <a name="l01115"></a>01115 QValueList<Article> selectedArticles = m_articleList->selectedArticles(); <a name="l01116"></a>01116 <span class="keywordflow">for</span> (QValueList<Article>::Iterator it = selectedArticles.begin(); it != selectedArticles.end(); ++it) <a name="l01117"></a>01117 { <a name="l01118"></a>01118 <span class="keywordflow">if</span> (assign) <a name="l01119"></a>01119 (*it).addTag(tag.id()); <a name="l01120"></a>01120 <span class="keywordflow">else</span> <a name="l01121"></a>01121 (*it).removeTag(tag.id()); <a name="l01122"></a>01122 } <a name="l01123"></a>01123 updateTagActions(); <a name="l01124"></a>01124 } <a name="l01125"></a>01125 <span class="comment">/*</span> <a name="l01126"></a>01126 <span class="comment">void View::slotRemoveTag(const Tag& tag)</span> <a name="l01127"></a>01127 <span class="comment">{</span> <a name="l01128"></a>01128 <span class="comment"> kdDebug() << "remove tag \"" << tag.id() << "\" from selected articles" << endl;</span> <a name="l01129"></a>01129 <span class="comment"> QValueList<Article> selectedArticles = m_articleList->selectedArticles();</span> <a name="l01130"></a>01130 <span class="comment"> for (QValueList<Article>::Iterator it = selectedArticles.begin(); it != selectedArticles.end(); ++it)</span> <a name="l01131"></a>01131 <span class="comment"> (*it).removeTag(tag.id());</span> <a name="l01132"></a>01132 <span class="comment"></span> <a name="l01133"></a>01133 <span class="comment"> updateTagActions();</span> <a name="l01134"></a>01134 <span class="comment">}</span> <a name="l01135"></a>01135 <span class="comment">*/</span> <a name="l01136"></a>01136 <span class="keywordtype">void</span> View::slotNewTag() <a name="l01137"></a>01137 { <a name="l01138"></a>01138 Tag tag(KApplication::randomString(8), <span class="stringliteral">"New Tag"</span>); <a name="l01139"></a>01139 Kernel::self()->tagSet()->insert(tag); <a name="l01140"></a>01140 TagNode* node = m_tagNodeList->findByTagID(tag.id()); <a name="l01141"></a>01141 <span class="keywordflow">if</span> (node) <a name="l01142"></a>01142 m_tagNodeListView->startNodeRenaming(node); <a name="l01143"></a>01143 } <a name="l01144"></a>01144 <a name="l01145"></a>01145 <span class="keywordtype">void</span> View::slotTagCreated(<span class="keyword">const</span> Tag& tag) <a name="l01146"></a>01146 { <a name="l01147"></a>01147 <span class="keywordflow">if</span> (m_tagNodeList && !m_tagNodeList->containsTagId(tag.id())) <a name="l01148"></a>01148 { <a name="l01149"></a>01149 TagNode* tagNode = <span class="keyword">new</span> TagNode(tag, m_feedList->rootNode()); <a name="l01150"></a>01150 m_tagNodeList->rootNode()->appendChild(tagNode); <a name="l01151"></a>01151 } <a name="l01152"></a>01152 } <a name="l01153"></a>01153 <a name="l01154"></a>01154 <span class="keywordtype">void</span> View::slotTagRemoved(<span class="keyword">const</span> Tag& <span class="comment">/*tag*/</span>) <a name="l01155"></a>01155 { <a name="l01156"></a>01156 } <a name="l01157"></a>01157 <a name="l01158"></a><a class="code" href="classAkregator_1_1View.html#dcb8e0575e52f966299ca82dbb3ac9c3">01158</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#dcb8e0575e52f966299ca82dbb3ac9c3" title="the article selection has changed">View::slotArticleSelected</a>(<span class="keyword">const</span> <a class="code" href="classAkregator_1_1Article.html" title="A proxy class for RSS::Article with some additional methods to assist sorting.">Article</a>& article) <a name="l01159"></a>01159 { <a name="l01160"></a>01160 <span class="keywordflow">if</span> (m_viewMode == CombinedView) <a name="l01161"></a>01161 <span class="keywordflow">return</span>; <a name="l01162"></a>01162 <a name="l01163"></a>01163 m_markReadTimer->stop(); <a name="l01164"></a>01164 <a name="l01165"></a>01165 <a class="code" href="classAkregator_1_1Feed.html" title="represents a feed">Feed</a> *feed = article.<a class="code" href="classAkregator_1_1Article.html#503fda89de687ac7c8625b6a74844b9c">feed</a>(); <a name="l01166"></a>01166 <span class="keywordflow">if</span> (!feed) <a name="l01167"></a>01167 <span class="keywordflow">return</span>; <a name="l01168"></a>01168 <a name="l01169"></a>01169 <a class="code" href="classAkregator_1_1Article.html" title="A proxy class for RSS::Article with some additional methods to assist sorting.">Article</a> a(article); <a name="l01170"></a>01170 <span class="keywordflow">if</span> (a.<a class="code" href="classAkregator_1_1Article.html#88f8693097a22779f8b13b7fa6a11c32">status</a>() != Article::Read) <a name="l01171"></a>01171 { <a name="l01172"></a>01172 <span class="keywordtype">int</span> delay; <a name="l01173"></a>01173 <a name="l01174"></a>01174 <span class="keywordflow">if</span> ( Settings::useMarkReadDelay() ) <a name="l01175"></a>01175 { <a name="l01176"></a>01176 delay = Settings::markReadDelay(); <a name="l01177"></a>01177 <a name="l01178"></a>01178 <span class="keywordflow">if</span> (delay > 0) <a name="l01179"></a>01179 m_markReadTimer->start( delay*1000, <span class="keyword">true</span> ); <a name="l01180"></a>01180 <span class="keywordflow">else</span> <a name="l01181"></a>01181 a.<a class="code" href="classAkregator_1_1Article.html#41467ad4c3587ee18884622df7d59776">setStatus</a>(Article::Read); <a name="l01182"></a>01182 } <a name="l01183"></a>01183 } <a name="l01184"></a>01184 <a name="l01185"></a>01185 KToggleAction* maai = <span class="keyword">dynamic_cast<</span>KToggleAction*<span class="keyword">></span>(m_actionManager-><a class="code" href="classAkregator_1_1ActionManagerImpl.html#82a96ac8afc1d81c01fe961a13023bf1">action</a>(<span class="stringliteral">"article_set_status_important"</span>)); <a name="l01186"></a>01186 maai->setChecked(a.<a class="code" href="classAkregator_1_1Article.html#78d28aa4fe17bcc75a09a2718ffb97ac" title="if true, the article should be kept even when expired">keep</a>()); <a name="l01187"></a>01187 <a name="l01188"></a>01188 kdDebug() << <span class="stringliteral">"selected: "</span> << a.<a class="code" href="classAkregator_1_1Article.html#7e6dc5cd30979e8e45c54424f0ec1693">guid</a>() << endl; <a name="l01189"></a>01189 <a name="l01190"></a>01190 updateTagActions(); <a name="l01191"></a>01191 <a name="l01192"></a>01192 m_articleViewer-><a class="code" href="classAkregator_1_1ArticleViewer.html#967a33bb28464b72aa17af69984e3ca0" title="Show single article (normal view).">slotShowArticle</a>(a); <a name="l01193"></a>01193 } <a name="l01194"></a>01194 <a name="l01195"></a><a class="code" href="classAkregator_1_1View.html#9e057967b1a4fd1dddf483b3ef54889f">01195</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#9e057967b1a4fd1dddf483b3ef54889f" title="opens article of item in external browser">View::slotOpenArticleExternal</a>(<span class="keyword">const</span> <a class="code" href="classAkregator_1_1Article.html" title="A proxy class for RSS::Article with some additional methods to assist sorting.">Article</a>& article, <span class="keyword">const</span> QPoint&, <span class="keywordtype">int</span>) <a name="l01196"></a>01196 { <a name="l01197"></a>01197 <span class="keywordflow">if</span> (!article.<a class="code" href="classAkregator_1_1Article.html#bbc089d0e0c6dc49318327adc2a414b4">isNull</a>()) <a name="l01198"></a>01198 Viewer::displayInExternalBrowser(article.<a class="code" href="classAkregator_1_1Article.html#1ebcbb8d1fc7c89f6936eeb319cfbee0">link</a>()); <a name="l01199"></a>01199 } <a name="l01200"></a>01200 <a name="l01201"></a>01201 <a name="l01202"></a><a class="code" href="classAkregator_1_1View.html#2d97c49a7eb4fc1a80d1b5f36ad956e2">01202</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#2d97c49a7eb4fc1a80d1b5f36ad956e2" title="opens current article in new tab, background/foreground depends on settings TODO:...">View::slotOpenCurrentArticle</a>() <a name="l01203"></a>01203 { <a name="l01204"></a>01204 <a class="code" href="classAkregator_1_1Article.html" title="A proxy class for RSS::Article with some additional methods to assist sorting.">Article</a> article = m_articleList->currentArticle(); <a name="l01205"></a>01205 <a name="l01206"></a>01206 <span class="keywordflow">if</span> (article.<a class="code" href="classAkregator_1_1Article.html#bbc089d0e0c6dc49318327adc2a414b4">isNull</a>()) <a name="l01207"></a>01207 <span class="keywordflow">return</span>; <a name="l01208"></a>01208 <a name="l01209"></a>01209 KURL link; <a name="l01210"></a>01210 <span class="keywordflow">if</span> (article.<a class="code" href="classAkregator_1_1Article.html#1ebcbb8d1fc7c89f6936eeb319cfbee0">link</a>().isValid()) <a name="l01211"></a>01211 link = article.<a class="code" href="classAkregator_1_1Article.html#1ebcbb8d1fc7c89f6936eeb319cfbee0">link</a>(); <a name="l01212"></a>01212 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (article.<a class="code" href="classAkregator_1_1Article.html#20fc99ae341f6d83c6603290e026ace3">guidIsPermaLink</a>()) <a name="l01213"></a>01213 link = KURL(article.<a class="code" href="classAkregator_1_1Article.html#7e6dc5cd30979e8e45c54424f0ec1693">guid</a>()); <a name="l01214"></a>01214 <a name="l01215"></a>01215 <span class="keywordflow">if</span> (link.isValid()) <a name="l01216"></a>01216 { <a name="l01217"></a>01217 slotOpenURL(link, 0L, BrowserRun::NEW_TAB_FOREGROUND); <a name="l01218"></a>01218 } <a name="l01219"></a>01219 } <a name="l01220"></a>01220 <a name="l01221"></a><a class="code" href="classAkregator_1_1View.html#35ca324744aa17a5d93addf2a9e4568c">01221</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#35ca324744aa17a5d93addf2a9e4568c" title="opens the current article (currentItem) in external browser TODO: use selected instead...">View::slotOpenCurrentArticleExternal</a>() <a name="l01222"></a>01222 { <a name="l01223"></a>01223 <a class="code" href="classAkregator_1_1View.html#9e057967b1a4fd1dddf483b3ef54889f" title="opens article of item in external browser">slotOpenArticleExternal</a>(m_articleList->currentArticle(), QPoint(), 0); <a name="l01224"></a>01224 } <a name="l01225"></a>01225 <a name="l01226"></a><a class="code" href="classAkregator_1_1View.html#8b874b9677a9234e46ab57565b398bab">01226</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#8b874b9677a9234e46ab57565b398bab" title="opens the current article (currentItem) in background tab TODO: use selected instead...">View::slotOpenCurrentArticleBackgroundTab</a>() <a name="l01227"></a>01227 { <a name="l01228"></a>01228 <a class="code" href="classAkregator_1_1Article.html" title="A proxy class for RSS::Article with some additional methods to assist sorting.">Article</a> article = m_articleList->currentArticle(); <a name="l01229"></a>01229 <a name="l01230"></a>01230 <span class="keywordflow">if</span> (article.<a class="code" href="classAkregator_1_1Article.html#bbc089d0e0c6dc49318327adc2a414b4">isNull</a>()) <a name="l01231"></a>01231 <span class="keywordflow">return</span>; <a name="l01232"></a>01232 <a name="l01233"></a>01233 KURL link; <a name="l01234"></a>01234 <a name="l01235"></a>01235 <span class="keywordflow">if</span> (article.<a class="code" href="classAkregator_1_1Article.html#1ebcbb8d1fc7c89f6936eeb319cfbee0">link</a>().isValid()) <a name="l01236"></a>01236 link = article.<a class="code" href="classAkregator_1_1Article.html#1ebcbb8d1fc7c89f6936eeb319cfbee0">link</a>(); <a name="l01237"></a>01237 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (article.<a class="code" href="classAkregator_1_1Article.html#20fc99ae341f6d83c6603290e026ace3">guidIsPermaLink</a>()) <a name="l01238"></a>01238 link = KURL(article.<a class="code" href="classAkregator_1_1Article.html#7e6dc5cd30979e8e45c54424f0ec1693">guid</a>()); <a name="l01239"></a>01239 <a name="l01240"></a>01240 <span class="keywordflow">if</span> (link.isValid()) <a name="l01241"></a>01241 { <a name="l01242"></a>01242 slotOpenURL(link, 0L, BrowserRun::NEW_TAB_BACKGROUND); <a name="l01243"></a>01243 } <a name="l01244"></a>01244 } <a name="l01245"></a>01245 <a name="l01246"></a><a class="code" href="classAkregator_1_1View.html#8cd6c15284c6dbf9367dba32ed79222d">01246</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#8cd6c15284c6dbf9367dba32ed79222d" title="copies the link of current article to clipboard">View::slotCopyLinkAddress</a>() <a name="l01247"></a>01247 { <a name="l01248"></a>01248 <a class="code" href="classAkregator_1_1Article.html" title="A proxy class for RSS::Article with some additional methods to assist sorting.">Article</a> article = m_articleList->currentArticle(); <a name="l01249"></a>01249 <a name="l01250"></a>01250 <span class="keywordflow">if</span>(article.<a class="code" href="classAkregator_1_1Article.html#bbc089d0e0c6dc49318327adc2a414b4">isNull</a>()) <a name="l01251"></a>01251 <span class="keywordflow">return</span>; <a name="l01252"></a>01252 <a name="l01253"></a>01253 QString link; <a name="l01254"></a>01254 <span class="keywordflow">if</span> (article.<a class="code" href="classAkregator_1_1Article.html#1ebcbb8d1fc7c89f6936eeb319cfbee0">link</a>().isValid() || (article.<a class="code" href="classAkregator_1_1Article.html#20fc99ae341f6d83c6603290e026ace3">guidIsPermaLink</a>() && KURL(article.<a class="code" href="classAkregator_1_1Article.html#7e6dc5cd30979e8e45c54424f0ec1693">guid</a>()).isValid())) <a name="l01255"></a>01255 { <a name="l01256"></a>01256 <span class="comment">// in case link isn't valid, fall back to the guid permaLink.</span> <a name="l01257"></a>01257 <span class="keywordflow">if</span> (article.<a class="code" href="classAkregator_1_1Article.html#1ebcbb8d1fc7c89f6936eeb319cfbee0">link</a>().isValid()) <a name="l01258"></a>01258 link = article.<a class="code" href="classAkregator_1_1Article.html#1ebcbb8d1fc7c89f6936eeb319cfbee0">link</a>().url(); <a name="l01259"></a>01259 <span class="keywordflow">else</span> <a name="l01260"></a>01260 link = article.<a class="code" href="classAkregator_1_1Article.html#7e6dc5cd30979e8e45c54424f0ec1693">guid</a>(); <a name="l01261"></a>01261 QClipboard *cb = QApplication::clipboard(); <a name="l01262"></a>01262 cb->setText(link, QClipboard::Clipboard); <a name="l01263"></a>01263 cb->setText(link, QClipboard::Selection); <a name="l01264"></a>01264 } <a name="l01265"></a>01265 } <a name="l01266"></a>01266 <a name="l01267"></a><a class="code" href="classAkregator_1_1View.html#0aa903f500d4d01e41d1ee8ab8d12440">01267</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#0aa903f500d4d01e41d1ee8ab8d12440" title="called when URLs are dropped into the tree view">View::slotFeedURLDropped</a>(KURL::List &urls, <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>* after, <a class="code" href="classAkregator_1_1Folder.html" title="Represents a folder (containing feeds and/or other folders).">Folder</a>* parent) <a name="l01268"></a>01268 { <a name="l01269"></a>01269 KURL::List::iterator it; <a name="l01270"></a>01270 <span class="keywordflow">for</span> ( it = urls.begin(); it != urls.end(); ++it ) <a name="l01271"></a>01271 { <a name="l01272"></a>01272 addFeed((*it).prettyURL(), after, parent, <span class="keyword">false</span>); <a name="l01273"></a>01273 } <a name="l01274"></a>01274 } <a name="l01275"></a>01275 <a name="l01276"></a><a class="code" href="classAkregator_1_1View.html#cbf8fcbd768cb14ebf906fac81f45bcb">01276</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#cbf8fcbd768cb14ebf906fac81f45bcb" title="toggles the visibility of the filter bar">View::slotToggleShowQuickFilter</a>() <a name="l01277"></a>01277 { <a name="l01278"></a>01278 <span class="keywordflow">if</span> ( Settings::showQuickFilter() ) <a name="l01279"></a>01279 { <a name="l01280"></a>01280 Settings::setShowQuickFilter(<span class="keyword">false</span>); <a name="l01281"></a>01281 m_searchBar->slotClearSearch(); <a name="l01282"></a>01282 m_searchBar->hide(); <a name="l01283"></a>01283 } <a name="l01284"></a>01284 <span class="keywordflow">else</span> <a name="l01285"></a>01285 { <a name="l01286"></a>01286 Settings::setShowQuickFilter(<span class="keyword">true</span>); <a name="l01287"></a>01287 <span class="keywordflow">if</span> (!m_displayingAboutPage) <a name="l01288"></a>01288 m_searchBar->show(); <a name="l01289"></a>01289 } <a name="l01290"></a>01290 <a name="l01291"></a>01291 } <a name="l01292"></a>01292 <a name="l01293"></a><a class="code" href="classAkregator_1_1View.html#98698cc96d4f83996a096017e1d91558">01293</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#98698cc96d4f83996a096017e1d91558" title="deletes the currently selected article">View::slotArticleDelete</a>() <a name="l01294"></a>01294 { <a name="l01295"></a>01295 <a name="l01296"></a>01296 <span class="keywordflow">if</span> ( m_viewMode == CombinedView ) <a name="l01297"></a>01297 <span class="keywordflow">return</span>; <a name="l01298"></a>01298 <a name="l01299"></a>01299 QValueList<Article> articles = m_articleList->selectedArticles(); <a name="l01300"></a>01300 <a name="l01301"></a>01301 QString msg; <a name="l01302"></a>01302 <span class="keywordflow">switch</span> (articles.count()) <a name="l01303"></a>01303 { <a name="l01304"></a>01304 <span class="keywordflow">case</span> 0: <a name="l01305"></a>01305 <span class="keywordflow">return</span>; <a name="l01306"></a>01306 <span class="keywordflow">case</span> 1: <a name="l01307"></a>01307 msg = i18n(<span class="stringliteral">"<qt>Are you sure you want to delete article <b>%1</b>?</qt>"</span>).arg(QStyleSheet::escape(articles.first().title())); <a name="l01308"></a>01308 <span class="keywordflow">break</span>; <a name="l01309"></a>01309 <span class="keywordflow">default</span>: <a name="l01310"></a>01310 msg = i18n(<span class="stringliteral">"<qt>Are you sure you want to delete the selected article?</qt>"</span>, <a name="l01311"></a>01311 <span class="stringliteral">"<qt>Are you sure you want to delete the %n selected articles?</qt>"</span>, <a name="l01312"></a>01312 articles.count()); <a name="l01313"></a>01313 } <a name="l01314"></a>01314 <a name="l01315"></a>01315 <span class="keywordflow">if</span> (KMessageBox::warningContinueCancel(0, msg, i18n(<span class="stringliteral">"Delete Article"</span>), KStdGuiItem::del()) == KMessageBox::Continue) <a name="l01316"></a>01316 { <a name="l01317"></a>01317 <span class="keywordflow">if</span> (m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode()) <a name="l01318"></a>01318 m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode()->setNotificationMode(<span class="keyword">false</span>); <a name="l01319"></a>01319 <a name="l01320"></a>01320 QValueList<Feed*> feeds; <a name="l01321"></a>01321 <span class="keywordflow">for</span> (QValueList<Article>::Iterator it = articles.begin(); it != articles.end(); ++it) <a name="l01322"></a>01322 { <a name="l01323"></a>01323 <a class="code" href="classAkregator_1_1Feed.html" title="represents a feed">Feed</a>* feed = (*it).feed(); <a name="l01324"></a>01324 <span class="keywordflow">if</span> (!feeds.contains(feed)) <a name="l01325"></a>01325 feeds.append(feed); <a name="l01326"></a>01326 feed-><a class="code" href="classAkregator_1_1TreeNode.html#3a19ae67136daa08cdf3b077fef2a2b3">setNotificationMode</a>(<span class="keyword">false</span>); <a name="l01327"></a>01327 (*it).setDeleted(); <a name="l01328"></a>01328 } <a name="l01329"></a>01329 <a name="l01330"></a>01330 <span class="keywordflow">for</span> (QValueList<Feed*>::Iterator it = feeds.begin(); it != feeds.end(); ++it) <a name="l01331"></a>01331 { <a name="l01332"></a>01332 (*it)->setNotificationMode(<span class="keyword">true</span>); <a name="l01333"></a>01333 } <a name="l01334"></a>01334 <a name="l01335"></a>01335 <span class="keywordflow">if</span> (m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode()) <a name="l01336"></a>01336 m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode()->setNotificationMode(<span class="keyword">true</span>); <a name="l01337"></a>01337 } <a name="l01338"></a>01338 } <a name="l01339"></a>01339 <a name="l01340"></a>01340 <a name="l01341"></a><a class="code" href="classAkregator_1_1View.html#7a365bb7cf00c459a7241b7b4eaf0091">01341</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#7a365bb7cf00c459a7241b7b4eaf0091" title="toggles the keep flag of the currently selected article">View::slotArticleToggleKeepFlag</a>(<span class="keywordtype">bool</span> <span class="comment">/*enabled*/</span>) <a name="l01342"></a>01342 { <a name="l01343"></a>01343 QValueList<Article> articles = m_articleList->selectedArticles(); <a name="l01344"></a>01344 <a name="l01345"></a>01345 <span class="keywordflow">if</span> (articles.isEmpty()) <a name="l01346"></a>01346 <span class="keywordflow">return</span>; <a name="l01347"></a>01347 <a name="l01348"></a>01348 <span class="keywordtype">bool</span> allFlagsSet = <span class="keyword">true</span>; <a name="l01349"></a>01349 <span class="keywordflow">for</span> (QValueList<Article>::Iterator it = articles.begin(); allFlagsSet && it != articles.end(); ++it) <a name="l01350"></a>01350 <span class="keywordflow">if</span> (!(*it).keep()) <a name="l01351"></a>01351 allFlagsSet = <span class="keyword">false</span>; <a name="l01352"></a>01352 <a name="l01353"></a>01353 <span class="keywordflow">for</span> (QValueList<Article>::Iterator it = articles.begin(); it != articles.end(); ++it) <a name="l01354"></a>01354 (*it).setKeep(!allFlagsSet); <a name="l01355"></a>01355 } <a name="l01356"></a>01356 <a name="l01357"></a><a class="code" href="classAkregator_1_1View.html#217e6e7bb8cb8c4ec572b7f0f9a76dc2">01357</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#217e6e7bb8cb8c4ec572b7f0f9a76dc2" title="marks the currently selected article as read">View::slotSetSelectedArticleRead</a>() <a name="l01358"></a>01358 { <a name="l01359"></a>01359 QValueList<Article> articles = m_articleList->selectedArticles(); <a name="l01360"></a>01360 <a name="l01361"></a>01361 <span class="keywordflow">if</span> (articles.isEmpty()) <a name="l01362"></a>01362 <span class="keywordflow">return</span>; <a name="l01363"></a>01363 <a name="l01364"></a>01364 <span class="keywordflow">for</span> (QValueList<Article>::Iterator it = articles.begin(); it != articles.end(); ++it) <a name="l01365"></a>01365 (*it).setStatus(Article::Read); <a name="l01366"></a>01366 } <a name="l01367"></a>01367 <a name="l01368"></a><a class="code" href="classAkregator_1_1View.html#da9f2ebeb3787d4e45e80fa550f6b79a">01368</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#da9f2ebeb3787d4e45e80fa550f6b79a" title="reads the currently selected articles using KTTSD">View::slotTextToSpeechRequest</a>() <a name="l01369"></a>01369 { <a name="l01370"></a>01370 <span class="keywordflow">if</span> (m_currentFrame == m_mainFrame) <a name="l01371"></a>01371 { <a name="l01372"></a>01372 <span class="keywordflow">if</span> (m_viewMode != CombinedView) <a name="l01373"></a>01373 { <a name="l01374"></a>01374 <span class="comment">// in non-combined view, read selected articles</span> <a name="l01375"></a>01375 SpeechClient::self()->slotSpeak(m_articleList->selectedArticles()); <a name="l01376"></a>01376 <span class="comment">// TODO: if article viewer has a selection, read only the selected text?</span> <a name="l01377"></a>01377 } <a name="l01378"></a>01378 <span class="keywordflow">else</span> <a name="l01379"></a>01379 { <a name="l01380"></a>01380 <span class="keywordflow">if</span> (m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode()) <a name="l01381"></a>01381 { <a name="l01382"></a>01382 <span class="comment">//TODO: read articles in current node, respecting quick filter!</span> <a name="l01383"></a>01383 } <a name="l01384"></a>01384 } <a name="l01385"></a>01385 } <a name="l01386"></a>01386 <span class="keywordflow">else</span> <a name="l01387"></a>01387 { <a name="l01388"></a>01388 QString selectedText = <span class="keyword">static_cast<</span>PageViewer *<span class="keyword">></span>(m_currentFrame->part())->selectedText(); <a name="l01389"></a>01389 <a name="l01390"></a>01390 <span class="keywordflow">if</span> (!selectedText.isEmpty()) <a name="l01391"></a>01391 SpeechClient::self()->slotSpeak(selectedText, <span class="stringliteral">"en"</span>); <a name="l01392"></a>01392 } <a name="l01393"></a>01393 } <a name="l01394"></a>01394 <a name="l01395"></a><a class="code" href="classAkregator_1_1View.html#708a18a25f40cb134ac2991df0ea3176">01395</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#708a18a25f40cb134ac2991df0ea3176" title="marks the currently selected article as unread">View::slotSetSelectedArticleUnread</a>() <a name="l01396"></a>01396 { <a name="l01397"></a>01397 QValueList<Article> articles = m_articleList->selectedArticles(); <a name="l01398"></a>01398 <a name="l01399"></a>01399 <span class="keywordflow">if</span> (articles.isEmpty()) <a name="l01400"></a>01400 <span class="keywordflow">return</span>; <a name="l01401"></a>01401 <a name="l01402"></a>01402 <span class="keywordflow">for</span> (QValueList<Article>::Iterator it = articles.begin(); it != articles.end(); ++it) <a name="l01403"></a>01403 (*it).setStatus(Article::Unread); <a name="l01404"></a>01404 } <a name="l01405"></a>01405 <a name="l01406"></a><a class="code" href="classAkregator_1_1View.html#96122e757ac81f522f1daef4c4ba3ab8">01406</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#96122e757ac81f522f1daef4c4ba3ab8" title="marks the currently selected article as new">View::slotSetSelectedArticleNew</a>() <a name="l01407"></a>01407 { <a name="l01408"></a>01408 QValueList<Article> articles = m_articleList->selectedArticles(); <a name="l01409"></a>01409 <a name="l01410"></a>01410 <span class="keywordflow">if</span> (articles.isEmpty()) <a name="l01411"></a>01411 <span class="keywordflow">return</span>; <a name="l01412"></a>01412 <a name="l01413"></a>01413 <span class="keywordflow">for</span> (QValueList<Article>::Iterator it = articles.begin(); it != articles.end(); ++it) <a name="l01414"></a>01414 (*it).setStatus(Article::New); <a name="l01415"></a>01415 } <a name="l01416"></a>01416 <a name="l01417"></a><a class="code" href="classAkregator_1_1View.html#39d8c21551313de06b5bb41b486bfd29">01417</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#39d8c21551313de06b5bb41b486bfd29" title="marks the currenctly selected article as read after a user-set delay">View::slotSetCurrentArticleReadDelayed</a>() <a name="l01418"></a>01418 { <a name="l01419"></a>01419 <a class="code" href="classAkregator_1_1Article.html" title="A proxy class for RSS::Article with some additional methods to assist sorting.">Article</a> article = m_articleList->currentArticle(); <a name="l01420"></a>01420 <a name="l01421"></a>01421 <span class="keywordflow">if</span> (article.<a class="code" href="classAkregator_1_1Article.html#bbc089d0e0c6dc49318327adc2a414b4">isNull</a>()) <a name="l01422"></a>01422 <span class="keywordflow">return</span>; <a name="l01423"></a>01423 <a name="l01424"></a>01424 article.<a class="code" href="classAkregator_1_1Article.html#41467ad4c3587ee18884622df7d59776">setStatus</a>(Article::Read); <a name="l01425"></a>01425 } <a name="l01426"></a>01426 <a name="l01427"></a><a class="code" href="classAkregator_1_1View.html#355b13d86ee9a7a735f4c4dda569b03a">01427</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#355b13d86ee9a7a735f4c4dda569b03a" title="displays a URL in the status bar when the user moves the mouse over a link">View::slotMouseOverInfo</a>(<span class="keyword">const</span> KFileItem *kifi) <a name="l01428"></a>01428 { <a name="l01429"></a>01429 <span class="keywordflow">if</span> (kifi) <a name="l01430"></a>01430 { <a name="l01431"></a>01431 KFileItem *k=(KFileItem*)kifi; <a name="l01432"></a>01432 m_mainFrame->setStatusText(k->url().prettyURL());<span class="comment">//getStatusBarInfo());</span> <a name="l01433"></a>01433 } <a name="l01434"></a>01434 <span class="keywordflow">else</span> <a name="l01435"></a>01435 { <a name="l01436"></a>01436 m_mainFrame->setStatusText(QString::null); <a name="l01437"></a>01437 } <a name="l01438"></a>01438 } <a name="l01439"></a>01439 <a name="l01440"></a><a class="code" href="classAkregator_1_1View.html#d3d897b1845add5b0619fa5f1ca59a1e">01440</a> <span class="keywordtype">void</span> <a class="code" href="classAkregator_1_1View.html#d3d897b1845add5b0619fa5f1ca59a1e" title="session management">View::readProperties</a>(KConfig* config) <a name="l01441"></a>01441 { <a name="l01442"></a>01442 <a name="l01443"></a>01443 <span class="keywordflow">if</span> (!Settings::resetQuickFilterOnNodeChange()) <a name="l01444"></a>01444 { <a name="l01445"></a>01445 m_searchBar->slotSetText(config->readEntry(<span class="stringliteral">"searchLine"</span>)); <a name="l01446"></a>01446 <span class="keywordtype">int</span> statusfilter = config->readNumEntry(<span class="stringliteral">"searchCombo"</span>, -1); <a name="l01447"></a>01447 <span class="keywordflow">if</span> (statusfilter != -1) <a name="l01448"></a>01448 m_searchBar->slotSetStatus(statusfilter); <a name="l01449"></a>01449 } <a name="l01450"></a>01450 <a name="l01451"></a>01451 <span class="keywordtype">int</span> selectedID = config->readNumEntry(<span class="stringliteral">"selectedNodeID"</span>, -1); <a name="l01452"></a>01452 <span class="keywordflow">if</span> (selectedID != -1) <a name="l01453"></a>01453 { <a name="l01454"></a>01454 <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>* selNode = m_feedList->findByID(selectedID); <a name="l01455"></a>01455 <span class="keywordflow">if</span> (selNode) <a name="l01456"></a>01456 m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->setSelectedNode(selNode); <a name="l01457"></a>01457 } <a name="l01458"></a>01458 <a name="l01459"></a>01459 QStringList urls = config->readListEntry(<span class="stringliteral">"FeedBrowserURLs"</span>); <a name="l01460"></a>01460 QStringList::ConstIterator it = urls.begin(); <a name="l01461"></a>01461 <span class="keywordflow">for</span> (; it != urls.end(); ++it) <a name="l01462"></a>01462 { <a name="l01463"></a>01463 KURL url = KURL::fromPathOrURL(*it); <a name="l01464"></a>01464 <span class="keywordflow">if</span> (url.isValid()) <a name="l01465"></a>01465 <a class="code" href="classAkregator_1_1View.html#a5a99328351f0b1d1564d57808ddf711" title="opens a page viewer in a new tab and loads an URL">slotOpenNewTab</a>(url, <span class="keyword">true</span>); <span class="comment">// open in background</span> <a name="l01466"></a>01466 } <a name="l01467"></a>01467 } <a name="l01468"></a>01468 <a name="l01469"></a>01469 <span class="keywordtype">void</span> View::saveProperties(KConfig* config) <a name="l01470"></a>01470 { <a name="l01471"></a>01471 <span class="comment">// save filter settings</span> <a name="l01472"></a>01472 config->writeEntry(<span class="stringliteral">"searchLine"</span>, m_searchBar->text()); <a name="l01473"></a>01473 config->writeEntry(<span class="stringliteral">"searchCombo"</span>, m_searchBar->status()); <a name="l01474"></a>01474 <a name="l01475"></a>01475 <a class="code" href="classAkregator_1_1TreeNode.html" title="Abstract base class for all kind of elements in the feed tree, like feeds and feed...">TreeNode</a>* sel = m_listTabWidget-><a class="code" href="classAkregator_1_1ListTabWidget.html#4f6c0a11fc9ed703136d28cc8b76364f">activeView</a>()->selectedNode(); <a name="l01476"></a>01476 <a name="l01477"></a>01477 <span class="keywordflow">if</span> (sel) <a name="l01478"></a>01478 { <a name="l01479"></a>01479 config->writeEntry(<span class="stringliteral">"selectedNodeID"</span>, sel-><a class="code" href="classAkregator_1_1TreeNode.html#acfc6a524fccd34dfb63fc7afedc5035" title="returns the ID of this node.">id</a>() ); <a name="l01480"></a>01480 } <a name="l01481"></a>01481 <a name="l01482"></a>01482 <span class="comment">// save browser URLs</span> <a name="l01483"></a>01483 QStringList urls; <a name="l01484"></a>01484 QPtrList<Frame> frames = m_tabs->frames(); <a name="l01485"></a>01485 QPtrList<Frame>::ConstIterator it = frames.begin(); <a name="l01486"></a>01486 <span class="keywordflow">for</span> (; it != frames.end(); ++it) <a name="l01487"></a>01487 { <a name="l01488"></a>01488 Frame *frame = *it; <a name="l01489"></a>01489 KParts::ReadOnlyPart *part = frame->part(); <a name="l01490"></a>01490 PageViewer *pageViewer = <span class="keyword">dynamic_cast<</span>PageViewer*<span class="keyword">></span>(part); <span class="comment">// don't save the ArticleViewer</span> <a name="l01491"></a>01491 <span class="keywordflow">if</span> (pageViewer) <a name="l01492"></a>01492 { <a name="l01493"></a>01493 KURL url = pageViewer->url(); <a name="l01494"></a>01494 <span class="keywordflow">if</span> (url.isValid()) <a name="l01495"></a>01495 urls.append(url.prettyURL()); <a name="l01496"></a>01496 } <a name="l01497"></a>01497 } <a name="l01498"></a>01498 <a name="l01499"></a>01499 config->writeEntry(<span class="stringliteral">"FeedBrowserURLs"</span>, urls); <a name="l01500"></a>01500 } <a name="l01501"></a>01501 <a name="l01502"></a>01502 <span class="keywordtype">void</span> View::connectToFeedList(FeedList* feedList) <a name="l01503"></a>01503 { <a name="l01504"></a>01504 connect(feedList->rootNode(), SIGNAL(signalChanged(TreeNode*)), <span class="keyword">this</span>, SLOT(<a class="code" href="classAkregator_1_1View.html#c5fe5db32bff5ce54c2f44e4acc787ab" title="emits signalUnreadCountChanged(int)">slotSetTotalUnread</a>())); <a name="l01505"></a>01505 <a class="code" href="classAkregator_1_1View.html#c5fe5db32bff5ce54c2f44e4acc787ab" title="emits signalUnreadCountChanged(int)">slotSetTotalUnread</a>(); <a name="l01506"></a>01506 } <a name="l01507"></a>01507 <a name="l01508"></a>01508 <span class="keywordtype">void</span> View::disconnectFromFeedList(FeedList* feedList) <a name="l01509"></a>01509 { <a name="l01510"></a>01510 disconnect(feedList->rootNode(), SIGNAL(signalChanged(TreeNode*)), <span class="keyword">this</span>, SLOT(<a class="code" href="classAkregator_1_1View.html#c5fe5db32bff5ce54c2f44e4acc787ab" title="emits signalUnreadCountChanged(int)">slotSetTotalUnread</a>())); <a name="l01511"></a>01511 } <a name="l01512"></a>01512 <a name="l01513"></a>01513 <span class="keywordtype">void</span> View::updateTagActions() <a name="l01514"></a>01514 { <a name="l01515"></a>01515 QStringList tags; <a name="l01516"></a>01516 <a name="l01517"></a>01517 QValueList<Article> selectedArticles = m_articleList->selectedArticles(); <a name="l01518"></a>01518 <a name="l01519"></a>01519 <span class="keywordflow">for</span> (QValueList<Article>::ConstIterator it = selectedArticles.begin(); it != selectedArticles.end(); ++it) <a name="l01520"></a>01520 { <a name="l01521"></a>01521 QStringList atags = (*it).tags(); <a name="l01522"></a>01522 <span class="keywordflow">for</span> (QStringList::ConstIterator it2 = atags.begin(); it2 != atags.end(); ++it2) <a name="l01523"></a>01523 { <a name="l01524"></a>01524 <span class="keywordflow">if</span> (!tags.contains(*it2)) <a name="l01525"></a>01525 tags += *it2; <a name="l01526"></a>01526 } <a name="l01527"></a>01527 } <a name="l01528"></a>01528 m_actionManager->slotUpdateTagActions(!selectedArticles.isEmpty(), tags); <a name="l01529"></a>01529 } <a name="l01530"></a>01530 <a name="l01531"></a>01531 } <span class="comment">// namespace Akregator</span> <a name="l01532"></a>01532 <a name="l01533"></a>01533 <span class="preprocessor">#include "akregator_view.moc"</span> </pre></div></div> </div></div> </td> </tr> <tr> <td valign="top" id="leftmenu" width="25%"> <a name="navigation"></a> <div class="menu_box"><h2>akregator/src</h2> <div class="nav_list"> <ul><li><a href="index.html">Main Page</a></li><li><a href="namespaces.html">Namespace List</a></li><li><a href="hierarchy.html">Class Hierarchy</a></li><li><a href="classes.html">Alphabetical List</a></li><li><a href="annotated.html">Class List</a></li><li><a href="files.html">File List</a></li><li><a href="functions.html">Class Members</a></li></ul> <!-- <h2>Class Picker</h2> <div style="text-align: center;"> <form name="guideform"> <select name="guidelinks" style="width:100%;" onChange="window.location=document.guideform.guidelinks.options[document.guideform.guidelinks.selectedIndex].value"> <option value="annotated.html">-- Choose --</option> <option value="classAkregator_1_1AboutData.html">akregator::aboutdata</option>, <option value="classAkregator_1_1ActionManager.html">akregator::actionmanager</option>, <option value="classAkregator_1_1ActionManagerImpl.html">akregator::actionmanagerimpl</option>, <option value="classAkregator_1_1Article.html">akregator::article</option>, <option value="classAkregator_1_1ArticleInterceptor.html">akregator::articleinterceptor</option>, <option value="classAkregator_1_1ArticleInterceptorManager.html">akregator::articleinterceptormanager</option>, <option value="classAkregator_1_1ArticleViewer.html">akregator::articleviewer</option>, <option value="classAkregator_1_1Backend_1_1Category.html">akregator::backend::category</option>, <option value="classAkregator_1_1Backend_1_1Storage.html">akregator::backend::storage</option>, <option value="classAkregator_1_1Backend_1_1StorageDummyImpl.html">akregator::backend::storagedummyimpl</option>, <option value="classAkregator_1_1Feed.html">akregator::feed</option>, <option value="classAkregator_1_1FeedItem.html">akregator::feeditem</option>, <option value="classAkregator_1_1FeedList.html">akregator::feedlist</option>, <option value="classAkregator_1_1Filters_1_1AbstractMatcher.html">akregator::filters::abstractmatcher</option>, <option value="classAkregator_1_1Filters_1_1ArticleFilter.html">akregator::filters::articlefilter</option>, <option value="classAkregator_1_1Filters_1_1ArticleMatcher.html">akregator::filters::articlematcher</option>, <option value="classAkregator_1_1Filters_1_1Criterion.html">akregator::filters::criterion</option>, <option value="classAkregator_1_1Folder.html">akregator::folder</option>, <option value="classAkregator_1_1KCursorSaver.html">akregator::kcursorsaver</option>, <option value="classAkregator_1_1ListTabWidget.html">akregator::listtabwidget</option>, <option value="classAkregator_1_1MainWindow.html">akregator::mainwindow</option>, <option value="classAkregator_1_1NotificationManager.html">akregator::notificationmanager</option>, <option value="classAkregator_1_1Part.html">akregator::part</option>, <option value="classAkregator_1_1ProgressItemHandler.html">akregator::progressitemhandler</option>, <option value="classAkregator_1_1ProgressManager.html">akregator::progressmanager</option>, <option value="classAkregator_1_1SelectNodeDialog.html">akregator::selectnodedialog</option>, <option value="classAkregator_1_1TagAction.html">akregator::tagaction</option>, <option value="classAkregator_1_1TagSet.html">akregator::tagset</option>, <option value="classAkregator_1_1TreeNode.html">akregator::treenode</option>, <option value="classAkregator_1_1TreeNodeItem.html">akregator::treenodeitem</option>, <option value="classAkregator_1_1View.html">akregator::view</option>, </select> </form> </div> --> </div></div> <div class="menu_box"><h2>API Dox</h2> <div class="nav_list"> <ul> <li><a href="../../../akregator/html/index.html">akregator</a></li><li> <a href="../../../akregator/src/html/index.html">src</a></li><li> <a href="../../../akregator/src/librss/html/index.html">librss</a></li><li><a href="../../../certmanager/html/index.html">certmanager</a></li><li> <a href="../../../certmanager/lib/html/index.html">lib</a></li><li><a href="../../../kaddressbook/html/index.html">kaddressbook</a></li><li><a href="../../../kalarm/html/index.html">kalarm</a></li><li> <a href="../../../kalarm/lib/html/index.html">lib</a></li><li><a href="../../../kandy/html/index.html">kandy</a></li><li><a href="../../../karm/html/index.html">karm</a></li><li><a href="../../../kdgantt/html/index.html">kdgantt</a></li><li><a href="../../../kgantt/html/index.html">kgantt</a></li><li><a href="../../../kioslaves/html/index.html">kioslaves</a></li><li> <a href="../../../kioslaves/imap4/html/index.html">imap4</a></li><li> <a href="../../../kioslaves/mbox/html/index.html">mbox</a></li><li><a href="../../../kitchensync/html/index.html">kitchensync</a></li><li><a href="../../../kmail/html/index.html">kmail</a></li><li><a href="../../../knotes/html/index.html">knotes</a></li><li><a href="../../../konsolekalendar/html/index.html">konsolekalendar</a></li><li><a href="../../../kontact/html/index.html">kontact</a></li><li><a href="../../../korganizer/html/index.html">korganizer</a></li><li><a href="../../../kpilot/html/index.html">kpilot</a></li><li> <a href="../../../kpilot/kpilot/html/index.html">kpilot</a></li><li> <a href="../../../kpilot/lib/html/index.html">lib</a></li><li><a href="../../../libemailfunctions/html/index.html">libemailfunctions</a></li><li><a href="../../../libkcal/html/index.html">libkcal</a></li><li><a href="../../../libkdepim/html/index.html">libkdepim</a></li><li><a href="../../../libkholidays/html/index.html">libkholidays</a></li><li><a href="../../../libkmime/html/index.html">libkmime</a></li><li><a href="../../../libkpgp/html/index.html">libkpgp</a></li><li><a href="../../../libkpimidentities/html/index.html">libkpimidentities</a></li> </ul></div></div> </td> </tr> </table> <span class="doNotDisplay"> <a href="http://www.kde.org/" accesskey="8">KDE Home</a> | <a href="http://accessibility.kde.org/" accesskey="9">KDE Accessibility Home</a> | <a href="http://www.kde.org/media/accesskeys.php" accesskey="0">Description of Access Keys</a> </span> <div style="height: 8px"></div> <div id="footer"> <div id="footer_left"> Maintained by <a href="mailto:groot@kde.org">Adriaan de Groot</a> and <a href="mailto:winter@kde.org">Allen Winter</a>. <br/> KDE and K Desktop Environment are trademarks of <a href="http://www.kde.org/areas/kde-ev/" title="Homepage of the KDE non-profit Organization">KDE e.V.</a> | <a href="http://www.kde.org/contact/impressum.php">Legal</a> </div> <div id="footer_right"><img src="/media/images/footer_right.png" style="margin: 0px" alt="" /></div> </div> <!-- WARNING: DO NOT SEND MAIL TO THE FOLLOWING EMAIL ADDRESS! YOU WILL BE BLOCKED INSTANTLY AND PERMANENTLY! <a href="mailto:aaaatrap-425acc3b5374943f@kde.org">Block me</a> WARNING END --> </body> </html>