<?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>kaddressbook: viewmanager.cpp Source File (kaddressbook)</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=".">kaddressbook</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>kaddressbook</h2> <!-- Generated by Doxygen 1.5.5 --> <h1>viewmanager.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 KAddressBook.</span> <a name="l00003"></a>00003 <span class="comment"> Copyright (c) 2002 Mike Pilone <mpilone@slac.com></span> <a name="l00004"></a>00004 <span class="comment"></span> <a name="l00005"></a>00005 <span class="comment"> This program is free software; you can redistribute it and/or modify</span> <a name="l00006"></a>00006 <span class="comment"> it under the terms of the GNU General Public License as published by</span> <a name="l00007"></a>00007 <span class="comment"> the Free Software Foundation; either version 2 of the License, or</span> <a name="l00008"></a>00008 <span class="comment"> (at your option) any later version.</span> <a name="l00009"></a>00009 <span class="comment"></span> <a name="l00010"></a>00010 <span class="comment"> This program is distributed in the hope that it will be useful,</span> <a name="l00011"></a>00011 <span class="comment"> but WITHOUT ANY WARRANTY; without even the implied warranty of</span> <a name="l00012"></a>00012 <span class="comment"> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span> <a name="l00013"></a>00013 <span class="comment"> GNU General Public License for more details.</span> <a name="l00014"></a>00014 <span class="comment"></span> <a name="l00015"></a>00015 <span class="comment"> You should have received a copy of the GNU General Public License</span> <a name="l00016"></a>00016 <span class="comment"> along with this program; if not, write to the Free Software</span> <a name="l00017"></a>00017 <span class="comment"> Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</span> <a name="l00018"></a>00018 <span class="comment"></span> <a name="l00019"></a>00019 <span class="comment"> As a special exception, permission is given to link this program</span> <a name="l00020"></a>00020 <span class="comment"> with any edition of Qt, and distribute the resulting executable,</span> <a name="l00021"></a>00021 <span class="comment"> without including the source code for Qt in the source distribution.</span> <a name="l00022"></a>00022 <span class="comment">*/</span> <a name="l00023"></a>00023 <a name="l00024"></a>00024 <span class="preprocessor">#include <qfile.h></span> <a name="l00025"></a>00025 <span class="preprocessor">#include <qlayout.h></span> <a name="l00026"></a>00026 <span class="preprocessor">#include <qwidgetstack.h></span> <a name="l00027"></a>00027 <a name="l00028"></a>00028 <span class="preprocessor">#include <libkdepim/kvcarddrag.h></span> <a name="l00029"></a>00029 <span class="preprocessor">#include <kabc/addressbook.h></span> <a name="l00030"></a>00030 <span class="preprocessor">#include <kabc/vcardconverter.h></span> <a name="l00031"></a>00031 <span class="preprocessor">#include <kactionclasses.h></span> <a name="l00032"></a>00032 <span class="preprocessor">#include <kconfig.h></span> <a name="l00033"></a>00033 <span class="preprocessor">#include <kdebug.h></span> <a name="l00034"></a>00034 <span class="preprocessor">#include <kdeversion.h></span> <a name="l00035"></a>00035 <span class="preprocessor">#include <kiconloader.h></span> <a name="l00036"></a>00036 <span class="preprocessor">#include <klocale.h></span> <a name="l00037"></a>00037 <span class="preprocessor">#include <kmessagebox.h></span> <a name="l00038"></a>00038 <span class="preprocessor">#include <kmultipledrag.h></span> <a name="l00039"></a>00039 <span class="preprocessor">#include <ktempdir.h></span> <a name="l00040"></a>00040 <span class="preprocessor">#include <ktrader.h></span> <a name="l00041"></a>00041 <span class="preprocessor">#include <kurldrag.h></span> <a name="l00042"></a>00042 <a name="l00043"></a>00043 <span class="preprocessor">#include "addviewdialog.h"</span> <a name="l00044"></a>00044 <span class="preprocessor">#include "addresseeutil.h"</span> <a name="l00045"></a>00045 <span class="preprocessor">#include "core.h"</span> <a name="l00046"></a>00046 <span class="preprocessor">#include "filtereditdialog.h"</span> <a name="l00047"></a>00047 <span class="preprocessor">#include "filterselectionwidget.h"</span> <a name="l00048"></a>00048 <span class="preprocessor">#include "kabprefs.h"</span> <a name="l00049"></a>00049 <a name="l00050"></a>00050 <span class="preprocessor">#include "viewmanager.h"</span> <a name="l00051"></a>00051 <a name="l00052"></a>00052 ViewManager::ViewManager( KAB::Core *core, QWidget *parent, <span class="keyword">const</span> <span class="keywordtype">char</span> *name ) <a name="l00053"></a>00053 : QWidget( parent, name ), mCore( core ), mActiveView( 0 ), <a name="l00054"></a>00054 mFilterSelectionWidget( 0 ) <a name="l00055"></a>00055 { <a name="l00056"></a>00056 initGUI(); <a name="l00057"></a>00057 initActions(); <a name="l00058"></a>00058 <a name="l00059"></a>00059 mViewDict.setAutoDelete( <span class="keyword">true</span> ); <a name="l00060"></a>00060 <a name="l00061"></a>00061 createViewFactories(); <a name="l00062"></a>00062 } <a name="l00063"></a>00063 <a name="l00064"></a>00064 ViewManager::~ViewManager() <a name="l00065"></a>00065 { <a name="l00066"></a>00066 unloadViews(); <a name="l00067"></a>00067 mViewFactoryDict.clear(); <a name="l00068"></a>00068 } <a name="l00069"></a>00069 <a name="l00070"></a>00070 <span class="keywordtype">void</span> ViewManager::restoreSettings() <a name="l00071"></a>00071 { <a name="l00072"></a>00072 mViewNameList = KABPrefs::instance()->viewNames(); <a name="l00073"></a>00073 QString activeViewName = KABPrefs::instance()->currentView(); <a name="l00074"></a>00074 <a name="l00075"></a>00075 mActionSelectView->setItems( mViewNameList ); <a name="l00076"></a>00076 <a name="l00077"></a>00077 <span class="comment">// Filter</span> <a name="l00078"></a>00078 mFilterList = <a class="code" href="classFilter.html#0d0848758b5b80290a94eabf8456f69f" title="Loads the filter from the config file.">Filter::restore</a>( mCore->config(), <span class="stringliteral">"Filter"</span> ); <a name="l00079"></a>00079 mFilterSelectionWidget-><a class="code" href="classFilterSelectionWidget.html#c419eb4e8de10437450202707bb88722">setItems</a>( filterNames() ); <a name="l00080"></a>00080 mFilterSelectionWidget-><a class="code" href="classFilterSelectionWidget.html#429a78ad950e4b01e94bc42b9347507d">setCurrentItem</a>( KABPrefs::instance()->currentFilter() ); <a name="l00081"></a>00081 <a name="l00082"></a>00082 <span class="comment">// Tell the views to reread their config, since they may have</span> <a name="l00083"></a>00083 <span class="comment">// been modified by global settings</span> <a name="l00084"></a>00084 QDictIterator<KAddressBookView> it( mViewDict ); <a name="l00085"></a>00085 <span class="keywordflow">for</span> ( it.toFirst(); it.current(); ++it ) { <a name="l00086"></a>00086 KConfigGroupSaver saver( mCore->config(), it.currentKey() ); <a name="l00087"></a>00087 it.current()->readConfig( mCore->config() ); <a name="l00088"></a>00088 } <a name="l00089"></a>00089 <a name="l00090"></a>00090 setActiveView( activeViewName ); <a name="l00091"></a>00091 <a name="l00092"></a>00092 mActionDeleteView->setEnabled( mViewNameList.count() > 1 ); <a name="l00093"></a>00093 } <a name="l00094"></a>00094 <a name="l00095"></a>00095 <span class="keywordtype">void</span> ViewManager::saveSettings() <a name="l00096"></a>00096 { <a name="l00097"></a>00097 QDictIterator<KAddressBookView> it( mViewDict ); <a name="l00098"></a>00098 <span class="keywordflow">for</span> ( it.toFirst(); it.current(); ++it ) { <a name="l00099"></a>00099 KConfigGroupSaver saver( mCore->config(), it.currentKey() ); <a name="l00100"></a>00100 (*it)->writeConfig( mCore->config() ); <a name="l00101"></a>00101 } <a name="l00102"></a>00102 <a name="l00103"></a>00103 <a class="code" href="classFilter.html#2c544783fe126b4662eb3321323c59a2" title="Saves the filter to the config file.">Filter::save</a>( mCore->config(), <span class="stringliteral">"Filter"</span>, mFilterList ); <a name="l00104"></a>00104 KABPrefs::instance()->setCurrentFilter( mFilterSelectionWidget-><a class="code" href="classFilterSelectionWidget.html#ad6340abed572625972c056648df2f38">currentItem</a>() ); <a name="l00105"></a>00105 <a name="l00106"></a>00106 <span class="comment">// write the view name list</span> <a name="l00107"></a>00107 KABPrefs::instance()->setViewNames( mViewNameList ); <a name="l00108"></a>00108 <a name="l00109"></a>00109 <span class="keywordflow">if</span> ( mActiveView ) <a name="l00110"></a>00110 KABPrefs::instance()->setCurrentView( mActiveView->caption() ); <a name="l00111"></a>00111 } <a name="l00112"></a>00112 <a name="l00113"></a>00113 QStringList ViewManager::selectedUids()<span class="keyword"> const</span> <a name="l00114"></a>00114 <span class="keyword"></span>{ <a name="l00115"></a>00115 <span class="keywordflow">if</span> ( mActiveView ) { <a name="l00116"></a>00116 <span class="keywordflow">return</span> mActiveView-><a class="code" href="classKAddressBookView.html#8b372380967f1a2150ee2b700b2149a4" title="Must be overloaded in subclasses.">selectedUids</a>(); <a name="l00117"></a>00117 } <span class="keywordflow">else</span> <a name="l00118"></a>00118 <span class="keywordflow">return</span> QStringList(); <a name="l00119"></a>00119 } <a name="l00120"></a>00120 <a name="l00121"></a>00121 QStringList ViewManager::selectedEmails()<span class="keyword"> const</span> <a name="l00122"></a>00122 <span class="keyword"></span>{ <a name="l00123"></a>00123 <span class="keywordflow">if</span> ( mActiveView ) <a name="l00124"></a>00124 <span class="keywordflow">return</span> mActiveView-><a class="code" href="classKAddressBookView.html#39fcc2a6514a2690ac4ae89a40aaa067" title="Returns a QString with all the selected email addresses concatenated together with...">selectedEmails</a>(); <a name="l00125"></a>00125 <span class="keywordflow">else</span> <a name="l00126"></a>00126 <span class="keywordflow">return</span> QStringList(); <a name="l00127"></a>00127 } <a name="l00128"></a>00128 <a name="l00129"></a>00129 KABC::Addressee::List ViewManager::selectedAddressees()<span class="keyword"> const</span> <a name="l00130"></a>00130 <span class="keyword"></span>{ <a name="l00131"></a>00131 KABC::Addressee::List list; <a name="l00132"></a>00132 <a name="l00133"></a>00133 <span class="keyword">const</span> QStringList uids = selectedUids(); <a name="l00134"></a>00134 QStringList::ConstIterator it; <a name="l00135"></a>00135 <span class="keywordflow">for</span> ( it = uids.begin(); it != uids.end(); ++it ) { <a name="l00136"></a>00136 KABC::Addressee addr = mCore->addressBook()->findByUid( *it ); <a name="l00137"></a>00137 <span class="keywordflow">if</span> ( !addr.isEmpty() ) <a name="l00138"></a>00138 list.append( addr ); <a name="l00139"></a>00139 } <a name="l00140"></a>00140 <a name="l00141"></a>00141 <span class="keywordflow">return</span> list; <a name="l00142"></a>00142 } <a name="l00143"></a>00143 <a name="l00144"></a>00144 <span class="keywordtype">void</span> ViewManager::setFilterSelectionWidget( <a class="code" href="classFilterSelectionWidget.html" title="A simple widget which consists of a label and a combo box in a horizontal line.">FilterSelectionWidget</a> *wdg ) <a name="l00145"></a>00145 { <a name="l00146"></a>00146 mFilterSelectionWidget = wdg; <a name="l00147"></a>00147 } <a name="l00148"></a>00148 <a name="l00149"></a>00149 KABC::Field *ViewManager::currentSortField()<span class="keyword"> const</span> <a name="l00150"></a>00150 <span class="keyword"></span>{ <a name="l00151"></a>00151 <span class="keywordflow">if</span> ( mActiveView ) <a name="l00152"></a>00152 <span class="keywordflow">return</span> mActiveView-><a class="code" href="classKAddressBookView.html#78b2d39633cdf0a8de4000cabcfcee50">sortField</a>(); <a name="l00153"></a>00153 <span class="keywordflow">else</span> <a name="l00154"></a>00154 <span class="keywordflow">return</span> 0; <a name="l00155"></a>00155 } <a name="l00156"></a>00156 <a name="l00157"></a>00157 KABC::Field::List ViewManager::viewFields()<span class="keyword"> const</span> <a name="l00158"></a>00158 <span class="keyword"></span>{ <a name="l00159"></a>00159 <span class="comment">/*</span> <a name="l00160"></a>00160 <span class="comment"> if ( mActiveView )</span> <a name="l00161"></a>00161 <span class="comment"> return mActiveView->fields();</span> <a name="l00162"></a>00162 <span class="comment"> else</span> <a name="l00163"></a>00163 <span class="comment">*/</span> <a name="l00164"></a>00164 <span class="keywordflow">return</span> KABC::Field::List(); <a name="l00165"></a>00165 } <a name="l00166"></a>00166 <a name="l00167"></a>00167 <span class="keywordtype">void</span> ViewManager::setSelected( <span class="keyword">const</span> QString &uid, <span class="keywordtype">bool</span> <a class="code" href="classViewManager.html#989c54ee417e5272bc7bff10c2259952" title="Emitted whenever the user selects an entry in the view.">selected</a> ) <a name="l00168"></a>00168 { <a name="l00169"></a>00169 <span class="keywordflow">if</span> ( mActiveView ) <a name="l00170"></a>00170 mActiveView-><a class="code" href="classKAddressBookView.html#b1f67bf8e83c72484b0aa308533c0979" title="This method must be overloaded in subclasses.">setSelected</a>( uid, selected ); <a name="l00171"></a>00171 } <a name="l00172"></a>00172 <a name="l00173"></a>00173 <span class="keywordtype">void</span> ViewManager::setFirstSelected( <span class="keywordtype">bool</span> selected ) <a name="l00174"></a>00174 { <a name="l00175"></a>00175 <span class="keywordflow">if</span> ( mActiveView ) <a name="l00176"></a>00176 mActiveView-><a class="code" href="classKAddressBookView.html#c2269e27bb8c8ff06dfe2b9e3b3357c8" title="Selects the first contact in the view.">setFirstSelected</a>( selected ); <a name="l00177"></a>00177 } <a name="l00178"></a>00178 <a name="l00179"></a>00179 <span class="keywordtype">void</span> ViewManager::unloadViews() <a name="l00180"></a>00180 { <a name="l00181"></a>00181 mViewDict.clear(); <a name="l00182"></a>00182 mActiveView = 0; <a name="l00183"></a>00183 } <a name="l00184"></a>00184 <a name="l00185"></a>00185 <span class="keywordtype">void</span> ViewManager::setActiveView( <span class="keyword">const</span> QString &name ) <a name="l00186"></a>00186 { <a name="l00187"></a>00187 <a class="code" href="classKAddressBookView.html" title="Base class for all views in kaddressbook.">KAddressBookView</a> *view = 0; <a name="l00188"></a>00188 <a name="l00189"></a>00189 <span class="comment">// Check that this isn't the same as the current active view</span> <a name="l00190"></a>00190 <span class="keywordflow">if</span> ( mActiveView && ( mActiveView->caption() == name ) ) <a name="l00191"></a>00191 <span class="keywordflow">return</span>; <a name="l00192"></a>00192 <a name="l00193"></a>00193 <span class="comment">// At this point we know the view that should be active is not</span> <a name="l00194"></a>00194 <span class="comment">// currently active. We will try to find the new on in the list. If</span> <a name="l00195"></a>00195 <span class="comment">// we can't find it, it means it hasn't been instantiated, so we will</span> <a name="l00196"></a>00196 <span class="comment">// create it on demand.</span> <a name="l00197"></a>00197 <a name="l00198"></a>00198 view = mViewDict.find( name ); <a name="l00199"></a>00199 <a name="l00200"></a>00200 <span class="comment">// Check if we found the view. If we didn't, then we need to create it</span> <a name="l00201"></a>00201 <span class="keywordflow">if</span> ( view == 0 ) { <a name="l00202"></a>00202 KConfig *config = mCore->config(); <a name="l00203"></a>00203 KConfigGroupSaver saver( config, name ); <a name="l00204"></a>00204 QString type = config->readEntry( <span class="stringliteral">"Type"</span>, <span class="stringliteral">"Table"</span> ); <a name="l00205"></a>00205 <a name="l00206"></a>00206 kdDebug(5720) << <span class="stringliteral">"ViewManager::setActiveView: creating view - "</span> << name << endl; <a name="l00207"></a>00207 <a name="l00208"></a>00208 ViewFactory *factory = mViewFactoryDict.find( type ); <a name="l00209"></a>00209 <span class="keywordflow">if</span> ( factory ) <a name="l00210"></a>00210 view = factory->view( mCore, mViewWidgetStack ); <a name="l00211"></a>00211 <a name="l00212"></a>00212 <span class="keywordflow">if</span> ( view ) { <a name="l00213"></a>00213 view->setCaption( name ); <a name="l00214"></a>00214 mViewDict.insert( name, view ); <a name="l00215"></a>00215 mViewWidgetStack->addWidget( view ); <a name="l00216"></a>00216 view-><a class="code" href="classKAddressBookView.html#a57dbc0b432a252da27fc8afe81ef898" title="Called whenever this view should read the config.">readConfig</a>( config ); <a name="l00217"></a>00217 <a name="l00218"></a>00218 <span class="comment">// The manager just relays the signals</span> <a name="l00219"></a>00219 connect( view, SIGNAL( <a class="code" href="classViewManager.html#989c54ee417e5272bc7bff10c2259952" title="Emitted whenever the user selects an entry in the view.">selected</a>( <span class="keyword">const</span> QString& ) ), <a name="l00220"></a>00220 SIGNAL( <a class="code" href="classViewManager.html#989c54ee417e5272bc7bff10c2259952" title="Emitted whenever the user selects an entry in the view.">selected</a>( <span class="keyword">const</span> QString & ) ) ); <a name="l00221"></a>00221 connect( view, SIGNAL( <a class="code" href="classViewManager.html#f6ab813586423fe446a0003919fe4d36" title="Emitted whenever the user activates an entry in the view.">executed</a>( <span class="keyword">const</span> QString& ) ), <a name="l00222"></a>00222 SIGNAL( <a class="code" href="classViewManager.html#f6ab813586423fe446a0003919fe4d36" title="Emitted whenever the user activates an entry in the view.">executed</a>( <span class="keyword">const</span> QString& ) ) ); <a name="l00223"></a>00223 connect( view, SIGNAL( <a class="code" href="classViewManager.html#98f2d3f16deb7dbec008bc2745687c7a" title="Emitted whenever the address book is modified in some way.">modified</a>() ), SIGNAL( <a class="code" href="classViewManager.html#98f2d3f16deb7dbec008bc2745687c7a" title="Emitted whenever the address book is modified in some way.">modified</a>() ) ); <a name="l00224"></a>00224 connect( view, SIGNAL( <a class="code" href="classViewManager.html#e39727d2a7883e371cb5b3b539e6c694" title="Called whenever the user drops something in the active view.">dropped</a>( QDropEvent* ) ), <a name="l00225"></a>00225 SLOT( <a class="code" href="classViewManager.html#e39727d2a7883e371cb5b3b539e6c694" title="Called whenever the user drops something in the active view.">dropped</a>( QDropEvent* ) ) ); <a name="l00226"></a>00226 connect( view, SIGNAL( <a class="code" href="classViewManager.html#5692590c641a473bc8443d81b60eaa9a" title="Called whenever the user attempts to start a drag in the view.">startDrag</a>() ), SLOT( <a class="code" href="classViewManager.html#5692590c641a473bc8443d81b60eaa9a" title="Called whenever the user attempts to start a drag in the view.">startDrag</a>() ) ); <a name="l00227"></a>00227 connect( view, SIGNAL( <a class="code" href="classViewManager.html#e0511b561555336acbe43ea2f371fed9" title="Emitted whenever the sort field of a view has changed.">sortFieldChanged</a>() ), SIGNAL( <a class="code" href="classViewManager.html#e0511b561555336acbe43ea2f371fed9" title="Emitted whenever the sort field of a view has changed.">sortFieldChanged</a>() ) ); <a name="l00228"></a>00228 } <a name="l00229"></a>00229 } <a name="l00230"></a>00230 <a name="l00231"></a>00231 <span class="comment">// If we found or created the view, raise it and refresh it</span> <a name="l00232"></a>00232 <span class="keywordflow">if</span> ( view ) { <a name="l00233"></a>00233 mActiveView = view; <a name="l00234"></a>00234 mViewWidgetStack->raiseWidget( view ); <a name="l00235"></a>00235 <span class="comment">// Set the proper filter in the view. By setting the combo</span> <a name="l00236"></a>00236 <span class="comment">// box, the activated slot will be called, which will push</span> <a name="l00237"></a>00237 <span class="comment">// the filter to the view and refresh it.</span> <a name="l00238"></a>00238 <span class="keywordflow">if</span> ( view-><a class="code" href="classKAddressBookView.html#8096d78bec403feaa38bc7f8b23a746f">defaultFilterType</a>() == KAddressBookView::None ) { <a name="l00239"></a>00239 mFilterSelectionWidget-><a class="code" href="classFilterSelectionWidget.html#429a78ad950e4b01e94bc42b9347507d">setCurrentItem</a>( 0 ); <a name="l00240"></a>00240 setActiveFilter( 0 ); <a name="l00241"></a>00241 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( view-><a class="code" href="classKAddressBookView.html#8096d78bec403feaa38bc7f8b23a746f">defaultFilterType</a>() == KAddressBookView::Active ) { <a name="l00242"></a>00242 setActiveFilter( mFilterSelectionWidget-><a class="code" href="classFilterSelectionWidget.html#ad6340abed572625972c056648df2f38">currentItem</a>() ); <a name="l00243"></a>00243 } <span class="keywordflow">else</span> { <a name="l00244"></a>00244 uint pos = filterPosition( view-><a class="code" href="classKAddressBookView.html#3d6430760a156a68efcb45b5756ce891">defaultFilterName</a>() ); <a name="l00245"></a>00245 mFilterSelectionWidget-><a class="code" href="classFilterSelectionWidget.html#429a78ad950e4b01e94bc42b9347507d">setCurrentItem</a>( pos ); <a name="l00246"></a>00246 setActiveFilter( pos ); <a name="l00247"></a>00247 } <a name="l00248"></a>00248 <a name="l00249"></a>00249 <span class="comment">// Update the inc search widget to show the fields in the new active</span> <a name="l00250"></a>00250 <span class="comment">// view.</span> <a name="l00251"></a>00251 mActiveView-><a class="code" href="classKAddressBookView.html#33052941465838c43b69b61653639d13" title="Must be overloaded in subclasses to refresh the view.">refresh</a>(); <a name="l00252"></a>00252 <a name="l00253"></a>00253 } <span class="keywordflow">else</span> <a name="l00254"></a>00254 kdDebug(5720) << <span class="stringliteral">"ViewManager::setActiveView: unable to find view\n"</span>; <a name="l00255"></a>00255 } <a name="l00256"></a>00256 <a name="l00257"></a>00257 <span class="keywordtype">void</span> ViewManager::refreshView( <span class="keyword">const</span> QString &uid ) <a name="l00258"></a>00258 { <a name="l00259"></a>00259 <span class="keywordflow">if</span> ( mActiveView ) <a name="l00260"></a>00260 mActiveView-><a class="code" href="classKAddressBookView.html#33052941465838c43b69b61653639d13" title="Must be overloaded in subclasses to refresh the view.">refresh</a>( uid ); <a name="l00261"></a>00261 } <a name="l00262"></a>00262 <a name="l00263"></a>00263 <span class="keywordtype">void</span> ViewManager::editView() <a name="l00264"></a>00264 { <a name="l00265"></a>00265 <span class="keywordflow">if</span> ( !mActiveView ) <a name="l00266"></a>00266 <span class="keywordflow">return</span>; <a name="l00267"></a>00267 <a name="l00268"></a>00268 ViewFactory *factory = mViewFactoryDict.find( mActiveView-><a class="code" href="classKAddressBookView.html#76149bcdfe0f05e536a9905af3909eba" title="Return the type of the view: Icon, Table, etc.">type</a>() ); <a name="l00269"></a>00269 <a class="code" href="classViewConfigureWidget.html" title="This widget is the base class for all view configuration widgets.">ViewConfigureWidget</a> *wdg = 0; <a name="l00270"></a>00270 <a name="l00271"></a>00271 <span class="keywordflow">if</span> ( factory ) { <a name="l00272"></a>00272 <span class="comment">// Save the filters so the dialog has the latest set</span> <a name="l00273"></a>00273 <a class="code" href="classFilter.html#2c544783fe126b4662eb3321323c59a2" title="Saves the filter to the config file.">Filter::save</a>( mCore->config(), <span class="stringliteral">"Filter"</span>, mFilterList ); <a name="l00274"></a>00274 <a name="l00275"></a>00275 wdg = factory->configureWidget( mCore->addressBook(), 0 ); <a name="l00276"></a>00276 } <a name="l00277"></a>00277 <a name="l00278"></a>00278 <span class="keywordflow">if</span> ( wdg ) { <a name="l00279"></a>00279 ViewConfigureDialog dlg( wdg, mActiveView->caption(), this ); <a name="l00280"></a>00280 <a name="l00281"></a>00281 KConfigGroupSaver saver( mCore->config(), mActiveView->caption() ); <a name="l00282"></a>00282 dlg.<a class="code" href="classViewConfigureWidget.html#53bb10707460fd590d2e200c4718b82d" title="Reads the configuration from the config object and sets the values in the GUI.">restoreSettings</a>( mCore->config() ); <a name="l00283"></a>00283 <a name="l00284"></a>00284 <span class="keywordflow">if</span> ( dlg.exec() ) { <a name="l00285"></a>00285 dlg.saveSettings( mCore->config() ); <a name="l00286"></a>00286 mActiveView-><a class="code" href="classKAddressBookView.html#a57dbc0b432a252da27fc8afe81ef898" title="Called whenever this view should read the config.">readConfig</a>( mCore->config() ); <a name="l00287"></a>00287 <span class="comment">// Set the proper filter in the view. By setting the combo</span> <a name="l00288"></a>00288 <span class="comment">// box, the activated slot will be called, which will push</span> <a name="l00289"></a>00289 <span class="comment">// the filter to the view and refresh it.</span> <a name="l00290"></a>00290 <span class="keywordflow">if</span> ( mActiveView-><a class="code" href="classKAddressBookView.html#8096d78bec403feaa38bc7f8b23a746f">defaultFilterType</a>() == KAddressBookView::None ) { <a name="l00291"></a>00291 mFilterSelectionWidget-><a class="code" href="classFilterSelectionWidget.html#429a78ad950e4b01e94bc42b9347507d">setCurrentItem</a>( 0 ); <a name="l00292"></a>00292 setActiveFilter( 0 ); <a name="l00293"></a>00293 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( mActiveView-><a class="code" href="classKAddressBookView.html#8096d78bec403feaa38bc7f8b23a746f">defaultFilterType</a>() == KAddressBookView::Active ) { <a name="l00294"></a>00294 setActiveFilter( mFilterSelectionWidget-><a class="code" href="classFilterSelectionWidget.html#ad6340abed572625972c056648df2f38">currentItem</a>() ); <a name="l00295"></a>00295 } <span class="keywordflow">else</span> { <a name="l00296"></a>00296 uint pos = filterPosition( mActiveView-><a class="code" href="classKAddressBookView.html#3d6430760a156a68efcb45b5756ce891">defaultFilterName</a>() ); <a name="l00297"></a>00297 mFilterSelectionWidget-><a class="code" href="classFilterSelectionWidget.html#429a78ad950e4b01e94bc42b9347507d">setCurrentItem</a>( pos ); <a name="l00298"></a>00298 setActiveFilter( pos ); <a name="l00299"></a>00299 } <a name="l00300"></a>00300 <a name="l00301"></a>00301 mActiveView-><a class="code" href="classKAddressBookView.html#33052941465838c43b69b61653639d13" title="Must be overloaded in subclasses to refresh the view.">refresh</a>(); <a name="l00302"></a>00302 emit <a class="code" href="classViewManager.html#05e84d1c07c8f2e83d980be2e91582b0" title="Emitted whenever the view fields changed.">viewFieldsChanged</a>(); <a name="l00303"></a>00303 } <a name="l00304"></a>00304 } <a name="l00305"></a>00305 } <a name="l00306"></a>00306 <a name="l00307"></a>00307 <span class="keywordtype">void</span> ViewManager::deleteView() <a name="l00308"></a>00308 { <a name="l00309"></a>00309 QString text = i18n( <span class="stringliteral">"<qt>Are you sure that you want to delete the view <b>%1</b>?</qt>"</span> ) <a name="l00310"></a>00310 .arg( mActiveView->caption() ); <a name="l00311"></a>00311 QString caption = i18n( <span class="stringliteral">"Confirm Delete"</span> ); <a name="l00312"></a>00312 <a name="l00313"></a>00313 <span class="keywordflow">if</span> ( KMessageBox::warningContinueCancel( <span class="keyword">this</span>, text, caption, KGuiItem( i18n(<span class="stringliteral">"&Delete"</span>), <span class="stringliteral">"editdelete"</span>) ) == KMessageBox::Continue ) { <a name="l00314"></a>00314 mViewNameList.remove( mActiveView->caption() ); <a name="l00315"></a>00315 <a name="l00316"></a>00316 <span class="comment">// remove the view from the config file</span> <a name="l00317"></a>00317 KConfig *config = mCore->config(); <a name="l00318"></a>00318 config->deleteGroup( mActiveView->caption() ); <a name="l00319"></a>00319 <a name="l00320"></a>00320 mViewDict.remove( mActiveView->caption() ); <a name="l00321"></a>00321 mActiveView = 0; <a name="l00322"></a>00322 <a name="l00323"></a>00323 <span class="comment">// we are in an invalid state now, but that should be fixed after</span> <a name="l00324"></a>00324 <span class="comment">// we emit the signal</span> <a name="l00325"></a>00325 mActionSelectView->setItems( mViewNameList ); <a name="l00326"></a>00326 <span class="keywordflow">if</span> ( mViewNameList.count() > 0 ) { <a name="l00327"></a>00327 mActionSelectView->setCurrentItem( 0 ); <a name="l00328"></a>00328 setActiveView( mViewNameList[ 0 ] ); <a name="l00329"></a>00329 } <a name="l00330"></a>00330 mActionDeleteView->setEnabled( mViewNameList.count() > 1 ); <a name="l00331"></a>00331 } <a name="l00332"></a>00332 } <a name="l00333"></a>00333 <a name="l00334"></a>00334 <span class="keywordtype">void</span> ViewManager::addView() <a name="l00335"></a>00335 { <a name="l00336"></a>00336 <a class="code" href="classAddViewDialog.html" title="Modal dialog used for adding a new view.">AddViewDialog</a> dialog( &mViewFactoryDict, <span class="keyword">this</span> ); <a name="l00337"></a>00337 <a name="l00338"></a>00338 <span class="keywordflow">if</span> ( dialog.exec() ) { <a name="l00339"></a>00339 QString newName = dialog.viewName(); <a name="l00340"></a>00340 QString type = dialog.viewType(); <a name="l00341"></a>00341 <a name="l00342"></a>00342 <span class="comment">// Check for name conflicts</span> <a name="l00343"></a>00343 <span class="keywordtype">bool</span> firstConflict = <span class="keyword">true</span>; <a name="l00344"></a>00344 <span class="keywordtype">int</span> numTries = 1; <a name="l00345"></a>00345 <span class="keywordflow">while</span> ( mViewNameList.contains( newName ) > 0 ) { <a name="l00346"></a>00346 <span class="keywordflow">if</span> ( !firstConflict ) { <a name="l00347"></a>00347 newName = newName.left( newName.length() - 4 ); <a name="l00348"></a>00348 firstConflict = <span class="keyword">false</span>; <a name="l00349"></a>00349 } <a name="l00350"></a>00350 <a name="l00351"></a>00351 newName = QString( <span class="stringliteral">"%1 <%2>"</span> ).arg( newName ).arg( numTries ); <a name="l00352"></a>00352 numTries++; <a name="l00353"></a>00353 } <a name="l00354"></a>00354 <a name="l00355"></a>00355 <span class="comment">// Add the new one to the list</span> <a name="l00356"></a>00356 mViewNameList.append( newName ); <a name="l00357"></a>00357 <a name="l00358"></a>00358 <span class="comment">// write the view to the config file,</span> <a name="l00359"></a>00359 KConfig *config = mCore->config(); <a name="l00360"></a>00360 config->deleteGroup( newName ); <a name="l00361"></a>00361 KConfigGroupSaver saver( config, newName ); <a name="l00362"></a>00362 config->writeEntry( <span class="stringliteral">"Type"</span>, type ); <a name="l00363"></a>00363 <a name="l00364"></a>00364 <span class="comment">// try to set the active view</span> <a name="l00365"></a>00365 mActionSelectView->setItems( mViewNameList ); <a name="l00366"></a>00366 mActionSelectView->setCurrentItem( mViewNameList.findIndex( newName ) ); <a name="l00367"></a>00367 setActiveView( newName ); <a name="l00368"></a>00368 <a name="l00369"></a>00369 editView(); <a name="l00370"></a>00370 <a name="l00371"></a>00371 mActionDeleteView->setEnabled( mViewNameList.count() > 1 ); <a name="l00372"></a>00372 } <a name="l00373"></a>00373 } <a name="l00374"></a>00374 <a name="l00375"></a>00375 <span class="keywordtype">void</span> ViewManager::scrollUp() <a name="l00376"></a>00376 { <a name="l00377"></a>00377 <span class="keywordflow">if</span> ( mActiveView ) <a name="l00378"></a>00378 mActiveView-><a class="code" href="classKAddressBookView.html#dec384d3e38e3a9fdca0d336680fc6fb">scrollUp</a>(); <a name="l00379"></a>00379 } <a name="l00380"></a>00380 <a name="l00381"></a>00381 <span class="keywordtype">void</span> ViewManager::scrollDown() <a name="l00382"></a>00382 { <a name="l00383"></a>00383 <span class="keywordflow">if</span> ( mActiveView ) <a name="l00384"></a>00384 mActiveView-><a class="code" href="classKAddressBookView.html#b237b767f8b4efa118f44a26f4a4c0d0">scrollDown</a>(); <a name="l00385"></a>00385 } <a name="l00386"></a>00386 <a name="l00387"></a>00387 <span class="keywordtype">void</span> ViewManager::createViewFactories() <a name="l00388"></a>00388 { <a name="l00389"></a>00389 <span class="keyword">const</span> KTrader::OfferList plugins = KTrader::self()->query( <span class="stringliteral">"KAddressBook/View"</span>, <a name="l00390"></a>00390 QString( <span class="stringliteral">"[X-KDE-KAddressBook-ViewPluginVersion] == %1"</span> ).arg( KAB_VIEW_PLUGIN_VERSION ) ); <a name="l00391"></a>00391 KTrader::OfferList::ConstIterator it; <a name="l00392"></a>00392 <span class="keywordflow">for</span> ( it = plugins.begin(); it != plugins.end(); ++it ) { <a name="l00393"></a>00393 <span class="keywordflow">if</span> ( !(*it)->hasServiceType( <span class="stringliteral">"KAddressBook/View"</span> ) ) <a name="l00394"></a>00394 <span class="keywordflow">continue</span>; <a name="l00395"></a>00395 <a name="l00396"></a>00396 KLibFactory *factory = KLibLoader::self()->factory( (*it)->library().latin1() ); <a name="l00397"></a>00397 <a name="l00398"></a>00398 <span class="keywordflow">if</span> ( !factory ) { <a name="l00399"></a>00399 kdDebug(5720) << <span class="stringliteral">"ViewManager::createViewFactories(): Factory creation failed"</span> << endl; <a name="l00400"></a>00400 <span class="keywordflow">continue</span>; <a name="l00401"></a>00401 } <a name="l00402"></a>00402 <a name="l00403"></a>00403 ViewFactory *viewFactory = <span class="keyword">static_cast<</span>ViewFactory*<span class="keyword">></span>( factory ); <a name="l00404"></a>00404 <a name="l00405"></a>00405 <span class="keywordflow">if</span> ( !viewFactory ) { <a name="l00406"></a>00406 kdDebug(5720) << <span class="stringliteral">"ViewManager::createViewFactories(): Cast failed"</span> << endl; <a name="l00407"></a>00407 <span class="keywordflow">continue</span>; <a name="l00408"></a>00408 } <a name="l00409"></a>00409 <a name="l00410"></a>00410 mViewFactoryDict.insert( viewFactory->type(), viewFactory ); <a name="l00411"></a>00411 } <a name="l00412"></a>00412 } <a name="l00413"></a>00413 <a name="l00414"></a><a class="code" href="classViewManager.html#e39727d2a7883e371cb5b3b539e6c694">00414</a> <span class="keywordtype">void</span> <a class="code" href="classViewManager.html#e39727d2a7883e371cb5b3b539e6c694" title="Called whenever the user drops something in the active view.">ViewManager::dropped</a>( QDropEvent *e ) <a name="l00415"></a>00415 { <a name="l00416"></a>00416 kdDebug(5720) << <span class="stringliteral">"ViewManager::dropped: got a drop event"</span> << endl; <a name="l00417"></a>00417 <a name="l00418"></a>00418 <span class="comment">// don't allow drops from our own drags</span> <a name="l00419"></a>00419 <span class="keywordflow">if</span> ( e->source() == this ) <a name="l00420"></a>00420 <span class="keywordflow">return</span>; <a name="l00421"></a>00421 <a name="l00422"></a>00422 QString clipText, vcards; <a name="l00423"></a>00423 KURL::List urls; <a name="l00424"></a>00424 <a name="l00425"></a>00425 <span class="keywordflow">if</span> ( KURLDrag::decode( e, urls) ) { <a name="l00426"></a>00426 KURL::List::ConstIterator it = urls.begin(); <a name="l00427"></a>00427 <span class="keywordtype">int</span> c = urls.count(); <a name="l00428"></a>00428 <span class="keywordflow">if</span> ( c > 1 ) { <a name="l00429"></a>00429 QString questionString = i18n( <span class="stringliteral">"Import one contact into your addressbook?"</span>, <span class="stringliteral">"Import %n contacts into your addressbook?"</span>, c ); <a name="l00430"></a>00430 <span class="keywordflow">if</span> ( KMessageBox::questionYesNo( <span class="keyword">this</span>, questionString, i18n( <span class="stringliteral">"Import Contacts?"</span> ), i18n(<span class="stringliteral">"Import"</span>), i18n(<span class="stringliteral">"Do Not Import"</span>) ) == KMessageBox::Yes ) { <a name="l00431"></a>00431 <span class="keywordflow">for</span> ( ; it != urls.end(); ++it ) <a name="l00432"></a>00432 emit <a class="code" href="classViewManager.html#7a4961938ef73b2295fc3e51363f9b35" title="Emitted whenever a url is dragged on a view.">urlDropped</a>( *it ); <a name="l00433"></a>00433 } <a name="l00434"></a>00434 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( c == 1 ) <a name="l00435"></a>00435 emit <a class="code" href="classViewManager.html#7a4961938ef73b2295fc3e51363f9b35" title="Emitted whenever a url is dragged on a view.">urlDropped</a>( *it ); <a name="l00436"></a>00436 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( KVCardDrag::decode( e, vcards ) ) { <a name="l00437"></a>00437 KABC::VCardConverter converter; <a name="l00438"></a>00438 <a name="l00439"></a>00439 <span class="keyword">const</span> KABC::Addressee::List list = converter.parseVCards( vcards ); <a name="l00440"></a>00440 KABC::Addressee::List::ConstIterator it; <a name="l00441"></a>00441 <span class="keywordflow">for</span> ( it = list.begin(); it != list.end(); ++it ) { <a name="l00442"></a>00442 KABC::Addressee a = mCore->addressBook()->findByUid( (*it).uid() ); <a name="l00443"></a>00443 <span class="keywordflow">if</span> ( a.isEmpty() ) { <span class="comment">// not yet in address book</span> <a name="l00444"></a>00444 mCore->addressBook()->insertAddressee( *it ); <a name="l00445"></a>00445 emit <a class="code" href="classViewManager.html#98f2d3f16deb7dbec008bc2745687c7a" title="Emitted whenever the address book is modified in some way.">modified</a>(); <a name="l00446"></a>00446 } <a name="l00447"></a>00447 } <a name="l00448"></a>00448 <a name="l00449"></a>00449 mActiveView-><a class="code" href="classKAddressBookView.html#33052941465838c43b69b61653639d13" title="Must be overloaded in subclasses to refresh the view.">refresh</a>(); <a name="l00450"></a>00450 } <a name="l00451"></a>00451 } <a name="l00452"></a>00452 <a name="l00453"></a><a class="code" href="classViewManager.html#5692590c641a473bc8443d81b60eaa9a">00453</a> <span class="keywordtype">void</span> <a class="code" href="classViewManager.html#5692590c641a473bc8443d81b60eaa9a" title="Called whenever the user attempts to start a drag in the view.">ViewManager::startDrag</a>() <a name="l00454"></a>00454 { <a name="l00455"></a>00455 <span class="comment">// Get the list of all the selected addressees</span> <a name="l00456"></a>00456 KABC::Addressee::List addrList; <a name="l00457"></a>00457 <span class="keyword">const</span> QStringList uidList = selectedUids(); <a name="l00458"></a>00458 <span class="keywordflow">if</span> ( uidList.isEmpty() ) <a name="l00459"></a>00459 <span class="keywordflow">return</span>; <a name="l00460"></a>00460 <a name="l00461"></a>00461 kdDebug(5720) << <span class="stringliteral">"ViewManager::startDrag: starting to drag"</span> << endl; <a name="l00462"></a>00462 <a name="l00463"></a>00463 QStringList::ConstIterator it; <a name="l00464"></a>00464 <span class="keywordflow">for</span> ( it = uidList.begin(); it != uidList.end(); ++it ) <a name="l00465"></a>00465 addrList.append( mCore->addressBook()->findByUid( *it ) ); <a name="l00466"></a>00466 <a name="l00467"></a>00467 KMultipleDrag *drag = <span class="keyword">new</span> KMultipleDrag( <span class="keyword">this</span> ); <a name="l00468"></a>00468 <a name="l00469"></a>00469 KABC::VCardConverter converter; <a name="l00470"></a>00470 QString vcards = converter.createVCards( addrList ); <a name="l00471"></a>00471 <a name="l00472"></a>00472 <span class="comment">// Best text representation is given by textdrag, so it must be first</span> <a name="l00473"></a>00473 drag->addDragObject( <span class="keyword">new</span> QTextDrag( <a class="code" href="classAddresseeUtil.html#6a831bd0936a148dd1851f89027e4149" title="Converts the list of addressee objects into a list of email addresses.">AddresseeUtil::addresseesToEmails</a>( addrList ), <span class="keyword">this</span> ) ); <a name="l00474"></a>00474 drag->addDragObject( <span class="keyword">new</span> KVCardDrag( vcards, <span class="keyword">this</span> ) ); <a name="l00475"></a>00475 <a name="l00476"></a>00476 KTempDir tempDir; <a name="l00477"></a>00477 <span class="comment">// can't set tempDir to autoDelete, in case of dropping on the desktop, the copy is async...</span> <a name="l00478"></a>00478 <span class="keywordflow">if</span> ( tempDir.status() == 0 ) { <a name="l00479"></a>00479 QString fileName; <a name="l00480"></a>00480 <span class="keywordflow">if</span> ( addrList.count() == 1 ) <a name="l00481"></a>00481 fileName = addrList[ 0 ].givenName() + <span class="stringliteral">"_"</span> + addrList[ 0 ].familyName() + <span class="stringliteral">".vcf"</span>; <a name="l00482"></a>00482 <span class="keywordflow">else</span> <a name="l00483"></a>00483 fileName = <span class="stringliteral">"contacts.vcf"</span>; <a name="l00484"></a>00484 <a name="l00485"></a>00485 QFile tempFile( tempDir.name() + <span class="stringliteral">"/"</span> + fileName ); <a name="l00486"></a>00486 <span class="keywordflow">if</span> ( tempFile.open( IO_WriteOnly ) ) { <a name="l00487"></a>00487 tempFile.writeBlock( vcards.utf8() ); <a name="l00488"></a>00488 tempFile.close(); <a name="l00489"></a>00489 <a name="l00490"></a>00490 KURLDrag *urlDrag = <span class="keyword">new</span> KURLDrag( KURL( tempFile.name() ), <span class="keyword">this</span> ); <a name="l00491"></a>00491 drag->addDragObject( urlDrag ); <a name="l00492"></a>00492 } <a name="l00493"></a>00493 } <a name="l00494"></a>00494 <a name="l00495"></a>00495 drag->setPixmap( KGlobal::iconLoader()->loadIcon( <span class="stringliteral">"vcard"</span>, KIcon::Desktop ) ); <a name="l00496"></a>00496 drag->dragCopy(); <a name="l00497"></a>00497 } <a name="l00498"></a>00498 <a name="l00499"></a>00499 <span class="keywordtype">void</span> ViewManager::setActiveFilter( <span class="keywordtype">int</span> index ) <a name="l00500"></a>00500 { <a name="l00501"></a>00501 <a class="code" href="classFilter.html" title="Filter for AddressBook related objects (Addressees).">Filter</a> currentFilter; <a name="l00502"></a>00502 <a name="l00503"></a>00503 <span class="keywordflow">if</span> ( ( index - 1 ) < 0 ) <a name="l00504"></a>00504 currentFilter = <a class="code" href="classFilter.html" title="Filter for AddressBook related objects (Addressees).">Filter</a>(); <a name="l00505"></a>00505 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( ( index - 1 ) < 1 ) { <a name="l00506"></a>00506 currentFilter = <a class="code" href="classFilter.html" title="Filter for AddressBook related objects (Addressees).">Filter</a>(); <a name="l00507"></a>00507 currentFilter.<a class="code" href="classFilter.html#fc8fd041e058eedd96d0164c280a4431" title="Sets the filter rule.">setMatchRule</a>(Filter::NotMatching); <a name="l00508"></a>00508 } <a name="l00509"></a>00509 <span class="keywordflow">else</span> <a name="l00510"></a>00510 currentFilter = mFilterList[ index - 2 ]; <a name="l00511"></a>00511 <a name="l00512"></a>00512 <span class="comment">// Check if we have a view. Since the filter combo is created before</span> <a name="l00513"></a>00513 <span class="comment">// the view, this slot could be called before there is a valid view.</span> <a name="l00514"></a>00514 <span class="keywordflow">if</span> ( mActiveView ) { <a name="l00515"></a>00515 mActiveView-><a class="code" href="classKAddressBookView.html#3c79e2e2fecbef5ceb6479b494740d74" title="Sets the active filter.">setFilter</a>( currentFilter ); <a name="l00516"></a>00516 mActiveView-><a class="code" href="classKAddressBookView.html#33052941465838c43b69b61653639d13" title="Must be overloaded in subclasses to refresh the view.">refresh</a>(); <a name="l00517"></a>00517 emit <a class="code" href="classViewManager.html#989c54ee417e5272bc7bff10c2259952" title="Emitted whenever the user selects an entry in the view.">selected</a>( QString::null ); <a name="l00518"></a>00518 } <a name="l00519"></a>00519 } <a name="l00520"></a>00520 <a name="l00521"></a>00521 <span class="keywordtype">void</span> ViewManager::configureFilters() <a name="l00522"></a>00522 { <a name="l00523"></a>00523 FilterDialog dlg( <span class="keyword">this</span> ); <a name="l00524"></a>00524 <a name="l00525"></a>00525 dlg.setFilters( mFilterList ); <a name="l00526"></a>00526 <a name="l00527"></a>00527 <span class="keywordflow">if</span> ( dlg.exec() ) <a name="l00528"></a>00528 mFilterList = dlg.filters(); <a name="l00529"></a>00529 <a name="l00530"></a>00530 uint pos = mFilterSelectionWidget-><a class="code" href="classFilterSelectionWidget.html#ad6340abed572625972c056648df2f38">currentItem</a>(); <a name="l00531"></a>00531 mFilterSelectionWidget-><a class="code" href="classFilterSelectionWidget.html#c419eb4e8de10437450202707bb88722">setItems</a>( filterNames() ); <a name="l00532"></a>00532 mFilterSelectionWidget-><a class="code" href="classFilterSelectionWidget.html#429a78ad950e4b01e94bc42b9347507d">setCurrentItem</a>( pos ); <a name="l00533"></a>00533 setActiveFilter( pos ); <a name="l00534"></a>00534 } <a name="l00535"></a>00535 <a name="l00536"></a>00536 QStringList ViewManager::filterNames()<span class="keyword"> const</span> <a name="l00537"></a>00537 <span class="keyword"></span>{ <a name="l00538"></a>00538 QStringList names( i18n( <span class="stringliteral">"None"</span> ) ); <a name="l00539"></a>00539 names.append( i18n( <span class="stringliteral">"Unfiled"</span> ) ); <a name="l00540"></a>00540 <a name="l00541"></a>00541 Filter::List::ConstIterator it; <a name="l00542"></a>00542 <span class="keywordflow">for</span> ( it = mFilterList.begin(); it != mFilterList.end(); ++it ) <a name="l00543"></a>00543 names.append( (*it).name() ); <a name="l00544"></a>00544 <a name="l00545"></a>00545 <span class="keywordflow">return</span> names; <a name="l00546"></a>00546 } <a name="l00547"></a>00547 <a name="l00548"></a>00548 <span class="keywordtype">int</span> ViewManager::filterPosition( <span class="keyword">const</span> QString &name )<span class="keyword"> const</span> <a name="l00549"></a>00549 <span class="keyword"></span>{ <a name="l00550"></a>00550 <span class="keywordtype">int</span> pos = 0; <a name="l00551"></a>00551 <a name="l00552"></a>00552 Filter::List::ConstIterator it; <a name="l00553"></a>00553 <span class="keywordflow">for</span> ( it = mFilterList.begin(); it != mFilterList.end(); ++it, ++pos ) <a name="l00554"></a>00554 <span class="keywordflow">if</span> ( name == (*it).name() ) <a name="l00555"></a>00555 <span class="keywordflow">return</span> pos + 2; <a name="l00556"></a>00556 <a name="l00557"></a>00557 <span class="keywordflow">return</span> 0; <a name="l00558"></a>00558 } <a name="l00559"></a>00559 <a name="l00560"></a>00560 <span class="keywordtype">void</span> ViewManager::initActions() <a name="l00561"></a>00561 { <a name="l00562"></a>00562 mActionSelectView = <span class="keyword">new</span> KSelectAction( i18n( <span class="stringliteral">"Select View"</span> ), 0, mCore->actionCollection(), <span class="stringliteral">"select_view"</span> ); <a name="l00563"></a>00563 <span class="preprocessor">#if KDE_VERSION >= 309</span> <a name="l00564"></a>00564 <span class="preprocessor"></span> mActionSelectView->setMenuAccelsEnabled( <span class="keyword">false</span> ); <a name="l00565"></a>00565 <span class="preprocessor">#endif</span> <a name="l00566"></a>00566 <span class="preprocessor"></span> connect( mActionSelectView, SIGNAL( activated( <span class="keyword">const</span> QString& ) ), <a name="l00567"></a>00567 SLOT( setActiveView( <span class="keyword">const</span> QString& ) ) ); <a name="l00568"></a>00568 <a name="l00569"></a>00569 KAction *action; <a name="l00570"></a>00570 <a name="l00571"></a>00571 action = <span class="keyword">new</span> KAction( i18n( <span class="stringliteral">"Modify View..."</span> ), <span class="stringliteral">"configure"</span>, 0, <span class="keyword">this</span>, <a name="l00572"></a>00572 SLOT( editView() ), mCore->actionCollection(), <a name="l00573"></a>00573 <span class="stringliteral">"view_modify"</span> ); <a name="l00574"></a>00574 action->setWhatsThis( i18n( <span class="stringliteral">"By pressing this button a dialog opens that allows you to modify the view of the addressbook. There you can add or remove fields that you want to be shown or hidden in the addressbook like the name for example."</span> ) ); <a name="l00575"></a>00575 <a name="l00576"></a>00576 action = <span class="keyword">new</span> KAction( i18n( <span class="stringliteral">"Add View..."</span> ), <span class="stringliteral">"window_new"</span>, 0, <span class="keyword">this</span>, <a name="l00577"></a>00577 SLOT( addView() ), mCore->actionCollection(), <a name="l00578"></a>00578 <span class="stringliteral">"view_add"</span> ); <a name="l00579"></a>00579 action->setWhatsThis( i18n( <span class="stringliteral">"You can add a new view by choosing one from the dialog that appears after pressing the button. You have to give the view a name, so that you can distinguish between the different views."</span> ) ); <a name="l00580"></a>00580 <a name="l00581"></a>00581 mActionDeleteView = <span class="keyword">new</span> KAction( i18n( <span class="stringliteral">"Delete View"</span> ), <span class="stringliteral">"view_remove"</span>, 0, <a name="l00582"></a>00582 <span class="keyword">this</span>, SLOT( deleteView() ), <a name="l00583"></a>00583 mCore->actionCollection(), <span class="stringliteral">"view_delete"</span> ); <a name="l00584"></a>00584 mActionDeleteView->setWhatsThis( i18n( <span class="stringliteral">"By pressing this button you can delete the actual view, which you have added before."</span> ) ); <a name="l00585"></a>00585 <a name="l00586"></a>00586 action = <span class="keyword">new</span> KAction( i18n( <span class="stringliteral">"Refresh View"</span> ), <span class="stringliteral">"reload"</span>, 0, <span class="keyword">this</span>, <a name="l00587"></a>00587 SLOT( refreshView() ), mCore->actionCollection(), <a name="l00588"></a>00588 <span class="stringliteral">"view_refresh"</span> ); <a name="l00589"></a>00589 action->setWhatsThis( i18n( <span class="stringliteral">"The view will be refreshed by pressing this button."</span> ) ); <a name="l00590"></a>00590 <a name="l00591"></a>00591 action = <span class="keyword">new</span> KAction( i18n( <span class="stringliteral">"Edit &Filters..."</span> ), <span class="stringliteral">"filter"</span>, 0, <span class="keyword">this</span>, <a name="l00592"></a>00592 SLOT( configureFilters() ), mCore->actionCollection(), <a name="l00593"></a>00593 <span class="stringliteral">"options_edit_filters"</span> ); <a name="l00594"></a>00594 action->setWhatsThis( i18n( <span class="stringliteral">"Edit the contact filters<p>You will be presented with a dialog, where you can add, remove and edit filters."</span> ) ); <a name="l00595"></a>00595 } <a name="l00596"></a>00596 <a name="l00597"></a>00597 <span class="keywordtype">void</span> ViewManager::initGUI() <a name="l00598"></a>00598 { <a name="l00599"></a>00599 QHBoxLayout *layout = <span class="keyword">new</span> QHBoxLayout( <span class="keyword">this</span> ); <a name="l00600"></a>00600 mViewWidgetStack = <span class="keyword">new</span> QWidgetStack( <span class="keyword">this</span> ); <a name="l00601"></a>00601 layout->addWidget( mViewWidgetStack ); <a name="l00602"></a>00602 } <a name="l00603"></a>00603 <a name="l00604"></a>00604 <span class="preprocessor">#include "viewmanager.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>kaddressbook</h2> <div class="nav_list"> <ul><li><a href="index.html">Main Page</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><li><a href="pages.html">Related Pages</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="classAddressEditDialog.html">addresseditdialog</option>, <option value="classAddressEditWidget.html">addresseditwidget</option>, <option value="classAddresseeUtil.html">addresseeutil</option>, <option value="classAddressTypeDialog.html">addresstypedialog</option>, <option value="classAddViewDialog.html">addviewdialog</option>, <option value="classCardView.html">cardview</option>, <option value="classCardViewItem.html">cardviewitem</option>, <option value="classCardViewLookNFeelPage.html">cardviewlooknfeelpage</option>, <option value="classConfigureCardViewWidget.html">configurecardviewwidget</option>, <option value="classConfigureTableViewWidget.html">configuretableviewwidget</option>, <option value="classDateParser.html">dateparser</option>, <option value="classDistributionListView.html">distributionlistview</option>, <option value="classDynamicTip.html">dynamictip</option>, <option value="classEmailEditWidget.html">emaileditwidget</option>, <option value="classEmailSelector.html">emailselector</option>, <option value="classFilter.html">filter</option>, <option value="classFilterSelectionWidget.html">filterselectionwidget</option>, <option value="classIMAddressLVI.html">imaddresslvi</option>, <option value="classIMAddressWidget.html">imaddresswidget</option>, <option value="classImageButton.html">imagebutton</option>, <option value="classImageLoader.html">imageloader</option>, <option value="classIMEditorWidget.html">imeditorwidget</option>, <option value="classIMEditWidget.html">imeditwidget</option>, <option value="classJumpButtonBar.html">jumpbuttonbar</option>, <option value="classKABPrinting_1_1PrintingWizard.html">kabprinting::printingwizard</option>, <option value="classKABPrinting_1_1PrintProgress.html">kabprinting::printprogress</option>, <option value="classKABPrinting_1_1PrintStyle.html">kabprinting::printstyle</option>, <option value="classKABPrinting_1_1PrintStyleFactory.html">kabprinting::printstylefactory</option>, <option value="classKAddressBookCardView.html">kaddressbookcardview</option>, <option value="classKAddressBookIconView.html">kaddressbookiconview</option>, <option value="classKAddressBookMain.html">kaddressbookmain</option>, <option value="classKAddressBookTableView.html">kaddressbooktableview</option>, <option value="classKAddressBookView.html">kaddressbookview</option>, <option value="classLookAndFeelPage.html">lookandfeelpage</option>, <option value="classNameEditDialog.html">nameeditdialog</option>, <option value="classPhoneEditWidget.html">phoneeditwidget</option>, <option value="classPhoneTypeDialog.html">phonetypedialog</option>, <option value="classTypeCombo.html">typecombo</option>, <option value="classViewConfigureWidget.html">viewconfigurewidget</option>, <option value="classViewManager.html">viewmanager</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>