summaryrefslogtreecommitdiffabout
path: root/kaddressbook
Unidiff
Diffstat (limited to 'kaddressbook') (more/less context) (ignore whitespace changes)
-rw-r--r--kaddressbook/kabcore.cpp2
-rw-r--r--kaddressbook/views/cardview.cpp10
2 files changed, 6 insertions, 6 deletions
diff --git a/kaddressbook/kabcore.cpp b/kaddressbook/kabcore.cpp
index d651224..c339244 100644
--- a/kaddressbook/kabcore.cpp
+++ b/kaddressbook/kabcore.cpp
@@ -1978,1119 +1978,1119 @@ void KABCore::initActions()
1978 1978
1979//US we need this function, to plug all actions into the correct menues. 1979//US we need this function, to plug all actions into the correct menues.
1980// KDE uses a XML format to plug the actions, but we work her without this overhead. 1980// KDE uses a XML format to plug the actions, but we work her without this overhead.
1981void KABCore::addActionsManually() 1981void KABCore::addActionsManually()
1982{ 1982{
1983//US qDebug("KABCore::initActions(): mIsPart %i", mIsPart); 1983//US qDebug("KABCore::initActions(): mIsPart %i", mIsPart);
1984 1984
1985#ifdef KAB_EMBEDDED 1985#ifdef KAB_EMBEDDED
1986 QPopupMenu *fileMenu = new QPopupMenu( this ); 1986 QPopupMenu *fileMenu = new QPopupMenu( this );
1987 QPopupMenu *editMenu = new QPopupMenu( this ); 1987 QPopupMenu *editMenu = new QPopupMenu( this );
1988 QPopupMenu *helpMenu = new QPopupMenu( this ); 1988 QPopupMenu *helpMenu = new QPopupMenu( this );
1989 1989
1990 KToolBar* tb = mMainWindow->toolBar(); 1990 KToolBar* tb = mMainWindow->toolBar();
1991 1991
1992#ifndef DESKTOP_VERSION 1992#ifndef DESKTOP_VERSION
1993 if ( KABPrefs::instance()->mFullMenuBarVisible ) { 1993 if ( KABPrefs::instance()->mFullMenuBarVisible ) {
1994#endif 1994#endif
1995 QMenuBar* mb = mMainWindow->menuBar(); 1995 QMenuBar* mb = mMainWindow->menuBar();
1996 1996
1997 //US setup menubar. 1997 //US setup menubar.
1998 //Disable the following block if you do not want to have a menubar. 1998 //Disable the following block if you do not want to have a menubar.
1999 mb->insertItem( i18n("&File"), fileMenu ); 1999 mb->insertItem( i18n("&File"), fileMenu );
2000 mb->insertItem( i18n("&Edit"), editMenu ); 2000 mb->insertItem( i18n("&Edit"), editMenu );
2001 mb->insertItem( i18n("&View"), viewMenu ); 2001 mb->insertItem( i18n("&View"), viewMenu );
2002 mb->insertItem( i18n("&Settings"), settingsMenu ); 2002 mb->insertItem( i18n("&Settings"), settingsMenu );
2003 mb->insertItem( i18n("Synchronize"), syncMenu ); 2003 mb->insertItem( i18n("Synchronize"), syncMenu );
2004 mb->insertItem( i18n("&Change selected"), changeMenu ); 2004 mb->insertItem( i18n("&Change selected"), changeMenu );
2005 mb->insertItem( i18n("&Help"), helpMenu ); 2005 mb->insertItem( i18n("&Help"), helpMenu );
2006 mIncSearchWidget = new IncSearchWidget( tb ); 2006 mIncSearchWidget = new IncSearchWidget( tb );
2007 // tb->insertWidget(-1, 0, mIncSearchWidget); 2007 // tb->insertWidget(-1, 0, mIncSearchWidget);
2008#ifndef DESKTOP_VERSION 2008#ifndef DESKTOP_VERSION
2009 } else { 2009 } else {
2010 //US setup toolbar 2010 //US setup toolbar
2011 QPEMenuBar *menuBarTB = new QPEMenuBar( tb ); 2011 QPEMenuBar *menuBarTB = new QPEMenuBar( tb );
2012 QPopupMenu *popupBarTB = new QPopupMenu( this ); 2012 QPopupMenu *popupBarTB = new QPopupMenu( this );
2013 menuBarTB->insertItem( "ME", popupBarTB); 2013 menuBarTB->insertItem( "ME", popupBarTB);
2014 tb->insertWidget(-1, 0, menuBarTB); 2014 tb->insertWidget(-1, 0, menuBarTB);
2015 mIncSearchWidget = new IncSearchWidget( tb ); 2015 mIncSearchWidget = new IncSearchWidget( tb );
2016 2016
2017 tb->enableMoving(false); 2017 tb->enableMoving(false);
2018 popupBarTB->insertItem( i18n("&File"), fileMenu ); 2018 popupBarTB->insertItem( i18n("&File"), fileMenu );
2019 popupBarTB->insertItem( i18n("&Edit"), editMenu ); 2019 popupBarTB->insertItem( i18n("&Edit"), editMenu );
2020 popupBarTB->insertItem( i18n("&View"), viewMenu ); 2020 popupBarTB->insertItem( i18n("&View"), viewMenu );
2021 popupBarTB->insertItem( i18n("&Settings"), settingsMenu ); 2021 popupBarTB->insertItem( i18n("&Settings"), settingsMenu );
2022 popupBarTB->insertItem( i18n("Synchronize"), syncMenu ); 2022 popupBarTB->insertItem( i18n("Synchronize"), syncMenu );
2023 mViewManager->getFilterAction()->plug ( popupBarTB); 2023 mViewManager->getFilterAction()->plug ( popupBarTB);
2024 popupBarTB->insertItem( i18n("&Change selected"), changeMenu ); 2024 popupBarTB->insertItem( i18n("&Change selected"), changeMenu );
2025 popupBarTB->insertItem( i18n("&Help"), helpMenu ); 2025 popupBarTB->insertItem( i18n("&Help"), helpMenu );
2026 if (QApplication::desktop()->width() > 320 ) { 2026 if (QApplication::desktop()->width() > 320 ) {
2027 // mViewManager->getFilterAction()->plug ( tb); 2027 // mViewManager->getFilterAction()->plug ( tb);
2028 } 2028 }
2029 } 2029 }
2030#endif 2030#endif
2031 // mActionQuit->plug ( mMainWindow->toolBar()); 2031 // mActionQuit->plug ( mMainWindow->toolBar());
2032 2032
2033 2033
2034 2034
2035 //US Now connect the actions with the menue entries. 2035 //US Now connect the actions with the menue entries.
2036 mActionPrint->plug( fileMenu ); 2036 mActionPrint->plug( fileMenu );
2037 mActionMail->plug( fileMenu ); 2037 mActionMail->plug( fileMenu );
2038 fileMenu->insertSeparator(); 2038 fileMenu->insertSeparator();
2039 2039
2040 mActionNewContact->plug( fileMenu ); 2040 mActionNewContact->plug( fileMenu );
2041 mActionNewContact->plug( tb ); 2041 mActionNewContact->plug( tb );
2042 2042
2043 mActionEditAddressee->plug( fileMenu ); 2043 mActionEditAddressee->plug( fileMenu );
2044 // if ((KGlobal::getDesktopSize() > KGlobal::Small ) || 2044 // if ((KGlobal::getDesktopSize() > KGlobal::Small ) ||
2045 // (!KABPrefs::instance()->mMultipleViewsAtOnce )) 2045 // (!KABPrefs::instance()->mMultipleViewsAtOnce ))
2046 mActionEditAddressee->plug( tb ); 2046 mActionEditAddressee->plug( tb );
2047 2047
2048 fileMenu->insertSeparator(); 2048 fileMenu->insertSeparator();
2049 mActionSave->plug( fileMenu ); 2049 mActionSave->plug( fileMenu );
2050 fileMenu->insertItem( "&Import", ImportMenu ); 2050 fileMenu->insertItem( "&Import", ImportMenu );
2051 fileMenu->insertItem( "&Export", ExportMenu ); 2051 fileMenu->insertItem( "&Export", ExportMenu );
2052 fileMenu->insertSeparator(); 2052 fileMenu->insertSeparator();
2053 mActionMailVCard->plug( fileMenu ); 2053 mActionMailVCard->plug( fileMenu );
2054#ifndef DESKTOP_VERSION 2054#ifndef DESKTOP_VERSION
2055 if ( Ir::supported() ) mActionBeamVCard->plug( fileMenu ); 2055 if ( Ir::supported() ) mActionBeamVCard->plug( fileMenu );
2056 if ( Ir::supported() ) mActionBeam->plug(fileMenu ); 2056 if ( Ir::supported() ) mActionBeam->plug(fileMenu );
2057#endif 2057#endif
2058 fileMenu->insertSeparator(); 2058 fileMenu->insertSeparator();
2059 mActionQuit->plug( fileMenu ); 2059 mActionQuit->plug( fileMenu );
2060#ifdef _WIN32_ 2060#ifdef _WIN32_
2061 mActionImportOL->plug( ImportMenu ); 2061 mActionImportOL->plug( ImportMenu );
2062#endif 2062#endif
2063 // edit menu 2063 // edit menu
2064 mActionUndo->plug( editMenu ); 2064 mActionUndo->plug( editMenu );
2065 mActionRedo->plug( editMenu ); 2065 mActionRedo->plug( editMenu );
2066 editMenu->insertSeparator(); 2066 editMenu->insertSeparator();
2067 mActionCut->plug( editMenu ); 2067 mActionCut->plug( editMenu );
2068 mActionCopy->plug( editMenu ); 2068 mActionCopy->plug( editMenu );
2069 mActionPaste->plug( editMenu ); 2069 mActionPaste->plug( editMenu );
2070 mActionDelete->plug( editMenu ); 2070 mActionDelete->plug( editMenu );
2071 editMenu->insertSeparator(); 2071 editMenu->insertSeparator();
2072 mActionSelectAll->plug( editMenu ); 2072 mActionSelectAll->plug( editMenu );
2073 2073
2074 mActionRemoveVoice->plug( changeMenu ); 2074 mActionRemoveVoice->plug( changeMenu );
2075 // settings menu 2075 // settings menu
2076//US special menuentry to configure the addressbook resources. On KDE 2076//US special menuentry to configure the addressbook resources. On KDE
2077// you do that through the control center !!! 2077// you do that through the control center !!!
2078 mActionConfigResources->plug( settingsMenu ); 2078 mActionConfigResources->plug( settingsMenu );
2079 settingsMenu->insertSeparator(); 2079 settingsMenu->insertSeparator();
2080 2080
2081 mActionConfigKAddressbook->plug( settingsMenu ); 2081 mActionConfigKAddressbook->plug( settingsMenu );
2082 2082
2083 if ( mIsPart ) { 2083 if ( mIsPart ) {
2084 //US not implemented yet 2084 //US not implemented yet
2085 //mActionConfigShortcuts->plug( settingsMenu ); 2085 //mActionConfigShortcuts->plug( settingsMenu );
2086 //mActionConfigureToolbars->plug( settingsMenu ); 2086 //mActionConfigureToolbars->plug( settingsMenu );
2087 2087
2088 } else { 2088 } else {
2089 //US not implemented yet 2089 //US not implemented yet
2090 //mActionKeyBindings->plug( settingsMenu ); 2090 //mActionKeyBindings->plug( settingsMenu );
2091 } 2091 }
2092 2092
2093 settingsMenu->insertSeparator(); 2093 settingsMenu->insertSeparator();
2094 2094
2095 mActionJumpBar->plug( settingsMenu ); 2095 mActionJumpBar->plug( settingsMenu );
2096 mActionDetails->plug( settingsMenu ); 2096 mActionDetails->plug( settingsMenu );
2097 //if (!KABPrefs::instance()->mMultipleViewsAtOnce || KGlobal::getDesktopSize() == KGlobal::Desktop ) 2097 //if (!KABPrefs::instance()->mMultipleViewsAtOnce || KGlobal::getDesktopSize() == KGlobal::Desktop )
2098 mActionDetails->plug( tb ); 2098 mActionDetails->plug( tb );
2099 settingsMenu->insertSeparator(); 2099 settingsMenu->insertSeparator();
2100 mActionBR->plug(settingsMenu ); 2100 mActionBR->plug(settingsMenu );
2101 settingsMenu->insertSeparator(); 2101 settingsMenu->insertSeparator();
2102 2102
2103 mActionWhoAmI->plug( settingsMenu ); 2103 mActionWhoAmI->plug( settingsMenu );
2104 mActionEditCategories->plug( settingsMenu ); 2104 mActionEditCategories->plug( settingsMenu );
2105 mActionCategories->plug( settingsMenu ); 2105 mActionCategories->plug( settingsMenu );
2106 mActionManageCategories->plug( settingsMenu ); 2106 mActionManageCategories->plug( settingsMenu );
2107 2107
2108 2108
2109 mActionWN->plug( helpMenu ); 2109 mActionWN->plug( helpMenu );
2110 mActionSyncHowto->plug( helpMenu ); 2110 mActionSyncHowto->plug( helpMenu );
2111 mActionKdeSyncHowto->plug( helpMenu ); 2111 mActionKdeSyncHowto->plug( helpMenu );
2112 mActionMultiSyncHowto->plug( helpMenu ); 2112 mActionMultiSyncHowto->plug( helpMenu );
2113 mActionFaq->plug( helpMenu ); 2113 mActionFaq->plug( helpMenu );
2114 mActionLicence->plug( helpMenu ); 2114 mActionLicence->plug( helpMenu );
2115 mActionAboutKAddressbook->plug( helpMenu ); 2115 mActionAboutKAddressbook->plug( helpMenu );
2116 2116
2117 if (KGlobal::getDesktopSize() > KGlobal::Small ) { 2117 if (KGlobal::getDesktopSize() > KGlobal::Small ) {
2118 2118
2119 mActionSave->plug( tb ); 2119 mActionSave->plug( tb );
2120 mViewManager->getFilterAction()->plug ( tb); 2120 mViewManager->getFilterAction()->plug ( tb);
2121 if (KGlobal::getDesktopSize() == KGlobal::Desktop ) { 2121 if (KGlobal::getDesktopSize() == KGlobal::Desktop ) {
2122 mActionUndo->plug( tb ); 2122 mActionUndo->plug( tb );
2123 mActionDelete->plug( tb ); 2123 mActionDelete->plug( tb );
2124 mActionRedo->plug( tb ); 2124 mActionRedo->plug( tb );
2125 } 2125 }
2126 } else { 2126 } else {
2127 mActionSave->plug( tb ); 2127 mActionSave->plug( tb );
2128 tb->enableMoving(false); 2128 tb->enableMoving(false);
2129 } 2129 }
2130 //mActionQuit->plug ( tb ); 2130 //mActionQuit->plug ( tb );
2131 // tb->insertWidget(-1, 0, mIncSearchWidget, 6); 2131 // tb->insertWidget(-1, 0, mIncSearchWidget, 6);
2132 2132
2133 //US link the searchwidget first to this. 2133 //US link the searchwidget first to this.
2134 // The real linkage to the toolbar happens later. 2134 // The real linkage to the toolbar happens later.
2135//US mIncSearchWidget->reparent(tb, 0, QPoint(50,0), TRUE); 2135//US mIncSearchWidget->reparent(tb, 0, QPoint(50,0), TRUE);
2136//US tb->insertItem( mIncSearchWidget ); 2136//US tb->insertItem( mIncSearchWidget );
2137/*US 2137/*US
2138 mIncSearchWidget = new IncSearchWidget( tb ); 2138 mIncSearchWidget = new IncSearchWidget( tb );
2139 connect( mIncSearchWidget, SIGNAL( doSearch( const QString& ) ), 2139 connect( mIncSearchWidget, SIGNAL( doSearch( const QString& ) ),
2140 SLOT( incrementalSearch( const QString& ) ) ); 2140 SLOT( incrementalSearch( const QString& ) ) );
2141 2141
2142 mJumpButtonBar = new JumpButtonBar( this, this ); 2142 mJumpButtonBar = new JumpButtonBar( this, this );
2143 2143
2144//US topLayout->addWidget( mJumpButtonBar ); 2144//US topLayout->addWidget( mJumpButtonBar );
2145 this->layout()->add( mJumpButtonBar ); 2145 this->layout()->add( mJumpButtonBar );
2146*/ 2146*/
2147 2147
2148#endif //KAB_EMBEDDED 2148#endif //KAB_EMBEDDED
2149 2149
2150 mActionExport2phone->plug( ExportMenu ); 2150 mActionExport2phone->plug( ExportMenu );
2151 connect ( syncMenu, SIGNAL( activated ( int ) ), syncManager, SLOT (slotSyncMenu( int ) ) ); 2151 connect ( syncMenu, SIGNAL( activated ( int ) ), syncManager, SLOT (slotSyncMenu( int ) ) );
2152 syncManager->fillSyncMenu(); 2152 syncManager->fillSyncMenu();
2153 2153
2154} 2154}
2155void KABCore::showLicence() 2155void KABCore::showLicence()
2156{ 2156{
2157 KApplication::showLicence(); 2157 KApplication::showLicence();
2158} 2158}
2159 2159
2160void KABCore::manageCategories( ) 2160void KABCore::manageCategories( )
2161{ 2161{
2162 KABCatPrefs* cp = new KABCatPrefs(); 2162 KABCatPrefs* cp = new KABCatPrefs();
2163 cp->show(); 2163 cp->show();
2164 int w =cp->sizeHint().width() ; 2164 int w =cp->sizeHint().width() ;
2165 int h = cp->sizeHint().height() ; 2165 int h = cp->sizeHint().height() ;
2166 int dw = QApplication::desktop()->width(); 2166 int dw = QApplication::desktop()->width();
2167 int dh = QApplication::desktop()->height(); 2167 int dh = QApplication::desktop()->height();
2168 cp->setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 2168 cp->setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
2169 if ( !cp->exec() ) { 2169 if ( !cp->exec() ) {
2170 delete cp; 2170 delete cp;
2171 return; 2171 return;
2172 } 2172 }
2173 int count = 0; 2173 int count = 0;
2174 message( i18n("Please wait, processing categories...")); 2174 message( i18n("Please wait, processing categories..."));
2175 if ( cp->addCat() ) { 2175 if ( cp->addCat() ) {
2176 KABC::AddressBook::Iterator it; 2176 KABC::AddressBook::Iterator it;
2177 QStringList catList = KABPrefs::instance()->mCustomCategories; 2177 QStringList catList = KABPrefs::instance()->mCustomCategories;
2178 for( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) { 2178 for( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) {
2179 QStringList catIncList = (*it).categories(); 2179 QStringList catIncList = (*it).categories();
2180 int i; 2180 int i;
2181 for( i = 0; i< catIncList.count(); ++i ) { 2181 for( i = 0; i< catIncList.count(); ++i ) {
2182 if ( !catList.contains (catIncList[i])) { 2182 if ( !catList.contains (catIncList[i])) {
2183 catList.append( catIncList[i] ); 2183 catList.append( catIncList[i] );
2184 //qDebug("add cat %s ", catIncList[i].latin1()); 2184 //qDebug("add cat %s ", catIncList[i].latin1());
2185 ++count; 2185 ++count;
2186 } 2186 }
2187 } 2187 }
2188 } 2188 }
2189 catList.sort(); 2189 catList.sort();
2190 KABPrefs::instance()->mCustomCategories = catList; 2190 KABPrefs::instance()->mCustomCategories = catList;
2191 KABPrefs::instance()->writeConfig(); 2191 KABPrefs::instance()->writeConfig();
2192 message(QString::number( count )+ i18n(" categories added to list! ")); 2192 message(QString::number( count )+ i18n(" categories added to list! "));
2193 } else { 2193 } else {
2194 QStringList catList = KABPrefs::instance()->mCustomCategories; 2194 QStringList catList = KABPrefs::instance()->mCustomCategories;
2195 QStringList catIncList; 2195 QStringList catIncList;
2196 QStringList newCatList; 2196 QStringList newCatList;
2197 KABC::AddressBook::Iterator it; 2197 KABC::AddressBook::Iterator it;
2198 for( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) { 2198 for( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) {
2199 QStringList catIncList = (*it).categories(); 2199 QStringList catIncList = (*it).categories();
2200 int i; 2200 int i;
2201 if ( catIncList.count() ) { 2201 if ( catIncList.count() ) {
2202 newCatList.clear(); 2202 newCatList.clear();
2203 for( i = 0; i< catIncList.count(); ++i ) { 2203 for( i = 0; i< catIncList.count(); ++i ) {
2204 if ( catList.contains (catIncList[i])) { 2204 if ( catList.contains (catIncList[i])) {
2205 newCatList.append( catIncList[i] ); 2205 newCatList.append( catIncList[i] );
2206 } 2206 }
2207 } 2207 }
2208 newCatList.sort(); 2208 newCatList.sort();
2209 (*it).setCategories( newCatList ); 2209 (*it).setCategories( newCatList );
2210 mAddressBook->insertAddressee( (*it) ); 2210 mAddressBook->insertAddressee( (*it) );
2211 } 2211 }
2212 } 2212 }
2213 setModified( true ); 2213 setModified( true );
2214 mViewManager->refreshView(); 2214 mViewManager->refreshView();
2215 mDetails->refreshView(); 2215 mDetails->refreshView();
2216 message( i18n("Removing categories done!")); 2216 message( i18n("Removing categories done!"));
2217 } 2217 }
2218 delete cp; 2218 delete cp;
2219} 2219}
2220void KABCore::removeVoice() 2220void KABCore::removeVoice()
2221{ 2221{
2222 if ( KMessageBox::questionYesNo( this, i18n("After importing, phone numbers\nmay have two or more types.\n(E.g. work+voice)\nThese numbers are shown as \"other\".\nClick Yes to remove the voice type\nfrom numbers with more than one type.\n\nRemove voice type?") ) == KMessageBox::No ) 2222 if ( KMessageBox::questionYesNo( this, i18n("After importing, phone numbers\nmay have two or more types.\n(E.g. work+voice)\nThese numbers are shown as \"other\".\nClick Yes to remove the voice type\nfrom numbers with more than one type.\n\nRemove voice type?") ) == KMessageBox::No )
2223 return; 2223 return;
2224 KABC::Addressee::List list = mViewManager->selectedAddressees(); 2224 KABC::Addressee::List list = mViewManager->selectedAddressees();
2225 KABC::Addressee::List::Iterator it; 2225 KABC::Addressee::List::Iterator it;
2226 for ( it = list.begin(); it != list.end(); ++it ) { 2226 for ( it = list.begin(); it != list.end(); ++it ) {
2227 2227
2228 if ( (*it).removeVoice() ) 2228 if ( (*it).removeVoice() )
2229 contactModified((*it) ); 2229 contactModified((*it) );
2230 } 2230 }
2231} 2231}
2232 2232
2233 2233
2234 2234
2235void KABCore::clipboardDataChanged() 2235void KABCore::clipboardDataChanged()
2236{ 2236{
2237 2237
2238 if ( mReadWrite ) 2238 if ( mReadWrite )
2239 mActionPaste->setEnabled( !QApplication::clipboard()->text().isEmpty() ); 2239 mActionPaste->setEnabled( !QApplication::clipboard()->text().isEmpty() );
2240 2240
2241} 2241}
2242 2242
2243void KABCore::updateActionMenu() 2243void KABCore::updateActionMenu()
2244{ 2244{
2245 UndoStack *undo = UndoStack::instance(); 2245 UndoStack *undo = UndoStack::instance();
2246 RedoStack *redo = RedoStack::instance(); 2246 RedoStack *redo = RedoStack::instance();
2247 2247
2248 if ( undo->isEmpty() ) 2248 if ( undo->isEmpty() )
2249 mActionUndo->setText( i18n( "Undo" ) ); 2249 mActionUndo->setText( i18n( "Undo" ) );
2250 else 2250 else
2251 mActionUndo->setText( i18n( "Undo %1" ).arg( undo->top()->name() ) ); 2251 mActionUndo->setText( i18n( "Undo %1" ).arg( undo->top()->name() ) );
2252 2252
2253 mActionUndo->setEnabled( !undo->isEmpty() ); 2253 mActionUndo->setEnabled( !undo->isEmpty() );
2254 2254
2255 if ( !redo->top() ) 2255 if ( !redo->top() )
2256 mActionRedo->setText( i18n( "Redo" ) ); 2256 mActionRedo->setText( i18n( "Redo" ) );
2257 else 2257 else
2258 mActionRedo->setText( i18n( "Redo %1" ).arg( redo->top()->name() ) ); 2258 mActionRedo->setText( i18n( "Redo %1" ).arg( redo->top()->name() ) );
2259 2259
2260 mActionRedo->setEnabled( !redo->isEmpty() ); 2260 mActionRedo->setEnabled( !redo->isEmpty() );
2261} 2261}
2262 2262
2263void KABCore::configureKeyBindings() 2263void KABCore::configureKeyBindings()
2264{ 2264{
2265#ifndef KAB_EMBEDDED 2265#ifndef KAB_EMBEDDED
2266 KKeyDialog::configure( actionCollection(), true ); 2266 KKeyDialog::configure( actionCollection(), true );
2267#else //KAB_EMBEDDED 2267#else //KAB_EMBEDDED
2268 qDebug("KABCore::configureKeyBindings() not implemented"); 2268 qDebug("KABCore::configureKeyBindings() not implemented");
2269#endif //KAB_EMBEDDED 2269#endif //KAB_EMBEDDED
2270} 2270}
2271 2271
2272#ifdef KAB_EMBEDDED 2272#ifdef KAB_EMBEDDED
2273void KABCore::configureResources() 2273void KABCore::configureResources()
2274{ 2274{
2275 KRES::KCMKResources dlg( this, "" , 0 ); 2275 KRES::KCMKResources dlg( this, "" , 0 );
2276 2276
2277 if ( !dlg.exec() ) 2277 if ( !dlg.exec() )
2278 return; 2278 return;
2279 KMessageBox::information( this, i18n("Please restart to get the \nchanged resources (re)loaded!\n") ); 2279 KMessageBox::information( this, i18n("Please restart to get the \nchanged resources (re)loaded!\n") );
2280} 2280}
2281#endif //KAB_EMBEDDED 2281#endif //KAB_EMBEDDED
2282 2282
2283 2283
2284/* this method will be called through the QCop interface from Ko/Pi to select addresses 2284/* this method will be called through the QCop interface from Ko/Pi to select addresses
2285 * for the attendees list of an event. 2285 * for the attendees list of an event.
2286 */ 2286 */
2287void KABCore::requestForNameEmailUidList(const QString& sourceChannel, const QString& uid) 2287void KABCore::requestForNameEmailUidList(const QString& sourceChannel, const QString& uid)
2288{ 2288{
2289 QStringList nameList; 2289 QStringList nameList;
2290 QStringList emailList; 2290 QStringList emailList;
2291 QStringList uidList; 2291 QStringList uidList;
2292 2292
2293 KABC::Addressee::List list = KABC::AddresseeDialog::getAddressees(this); 2293 KABC::Addressee::List list = KABC::AddresseeDialog::getAddressees(this);
2294 uint i=0; 2294 uint i=0;
2295 for (i=0; i < list.count(); i++) 2295 for (i=0; i < list.count(); i++)
2296 { 2296 {
2297 nameList.append(list[i].realName()); 2297 nameList.append(list[i].realName());
2298 emailList.append(list[i].preferredEmail()); 2298 emailList.append(list[i].preferredEmail());
2299 uidList.append(list[i].uid()); 2299 uidList.append(list[i].uid());
2300 } 2300 }
2301 2301
2302 bool res = ExternalAppHandler::instance()->returnNameEmailUidListFromKAPI(sourceChannel, uid, nameList, emailList, uidList); 2302 bool res = ExternalAppHandler::instance()->returnNameEmailUidListFromKAPI(sourceChannel, uid, nameList, emailList, uidList);
2303 2303
2304} 2304}
2305 2305
2306/* this method will be called through the QCop interface from Ko/Pi to select birthdays 2306/* this method will be called through the QCop interface from Ko/Pi to select birthdays
2307 * to put them into the calendar. 2307 * to put them into the calendar.
2308 */ 2308 */
2309void KABCore::requestForBirthdayList(const QString& sourceChannel, const QString& uid) 2309void KABCore::requestForBirthdayList(const QString& sourceChannel, const QString& uid)
2310{ 2310{
2311 // qDebug("KABCore::requestForBirthdayList"); 2311 // qDebug("KABCore::requestForBirthdayList");
2312 QStringList birthdayList; 2312 QStringList birthdayList;
2313 QStringList anniversaryList; 2313 QStringList anniversaryList;
2314 QStringList realNameList; 2314 QStringList realNameList;
2315 QStringList preferredEmailList; 2315 QStringList preferredEmailList;
2316 QStringList assembledNameList; 2316 QStringList assembledNameList;
2317 QStringList uidList; 2317 QStringList uidList;
2318 2318
2319 KABC::AddressBook::Iterator it; 2319 KABC::AddressBook::Iterator it;
2320 2320
2321 int count = 0; 2321 int count = 0;
2322 for( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) { 2322 for( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) {
2323 ++count; 2323 ++count;
2324 } 2324 }
2325 QProgressBar bar(count,0 ); 2325 QProgressBar bar(count,0 );
2326 int w = 300; 2326 int w = 300;
2327 if ( QApplication::desktop()->width() < 320 ) 2327 if ( QApplication::desktop()->width() < 320 )
2328 w = 220; 2328 w = 220;
2329 int h = bar.sizeHint().height() ; 2329 int h = bar.sizeHint().height() ;
2330 int dw = QApplication::desktop()->width(); 2330 int dw = QApplication::desktop()->width();
2331 int dh = QApplication::desktop()->height(); 2331 int dh = QApplication::desktop()->height();
2332 bar.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 2332 bar.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
2333 bar.show(); 2333 bar.show();
2334 bar.setCaption (i18n("Collecting birthdays - close to abort!") ); 2334 bar.setCaption (i18n("Collecting birthdays - close to abort!") );
2335 qApp->processEvents(); 2335 qApp->processEvents();
2336 2336
2337 QDate bday; 2337 QDate bday;
2338 QString anni; 2338 QString anni;
2339 QString formattedbday; 2339 QString formattedbday;
2340 2340
2341 for( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) 2341 for( it = mAddressBook->begin(); it != mAddressBook->end(); ++it )
2342 { 2342 {
2343 if ( ! bar.isVisible() ) 2343 if ( ! bar.isVisible() )
2344 return; 2344 return;
2345 bar.setProgress( count++ ); 2345 bar.setProgress( count++ );
2346 qApp->processEvents(); 2346 qApp->processEvents();
2347 bday = (*it).birthday().date(); 2347 bday = (*it).birthday().date();
2348 anni = (*it).custom("KADDRESSBOOK", "X-Anniversary" ); 2348 anni = (*it).custom("KADDRESSBOOK", "X-Anniversary" );
2349 2349
2350 if ( bday.isValid() || !anni.isEmpty()) 2350 if ( bday.isValid() || !anni.isEmpty())
2351 { 2351 {
2352 if (bday.isValid()) 2352 if (bday.isValid())
2353 formattedbday = KGlobal::locale()->formatDate(bday, true, KLocale::ISODate); 2353 formattedbday = KGlobal::locale()->formatDate(bday, true, KLocale::ISODate);
2354 else 2354 else
2355 formattedbday = "NOTVALID"; 2355 formattedbday = "NOTVALID";
2356 if (anni.isEmpty()) 2356 if (anni.isEmpty())
2357 anni = "INVALID"; 2357 anni = "INVALID";
2358 2358
2359 birthdayList.append(formattedbday); 2359 birthdayList.append(formattedbday);
2360 anniversaryList.append(anni); //should be ISODate 2360 anniversaryList.append(anni); //should be ISODate
2361 realNameList.append((*it).realName()); 2361 realNameList.append((*it).realName());
2362 preferredEmailList.append((*it).preferredEmail()); 2362 preferredEmailList.append((*it).preferredEmail());
2363 assembledNameList.append((*it).assembledName()); 2363 assembledNameList.append((*it).assembledName());
2364 uidList.append((*it).uid()); 2364 uidList.append((*it).uid());
2365 2365
2366 //qDebug("found birthday in KA/Pi: %s,%s,%s,%s: %s, %s", (*it).realName().latin1(), (*it).preferredEmail().latin1(), (*it).assembledName().latin1(), (*it).uid().latin1(), formattedbday.latin1(), anni.latin1() ); 2366 //qDebug("found birthday in KA/Pi: %s,%s,%s,%s: %s, %s", (*it).realName().latin1(), (*it).preferredEmail().latin1(), (*it).assembledName().latin1(), (*it).uid().latin1(), formattedbday.latin1(), anni.latin1() );
2367 } 2367 }
2368 } 2368 }
2369 2369
2370 bool res = ExternalAppHandler::instance()->returnBirthdayListFromKAPI(sourceChannel, uid, birthdayList, anniversaryList, realNameList, preferredEmailList, assembledNameList, uidList); 2370 bool res = ExternalAppHandler::instance()->returnBirthdayListFromKAPI(sourceChannel, uid, birthdayList, anniversaryList, realNameList, preferredEmailList, assembledNameList, uidList);
2371 2371
2372} 2372}
2373 2373
2374/* this method will be called through the QCop interface from other apps to show details of a contact. 2374/* this method will be called through the QCop interface from other apps to show details of a contact.
2375 */ 2375 */
2376void KABCore::requestForDetails(const QString& sourceChannel, const QString& sessionuid, const QString& name, const QString& email, const QString& uid) 2376void KABCore::requestForDetails(const QString& sourceChannel, const QString& sessionuid, const QString& name, const QString& email, const QString& uid)
2377{ 2377{
2378 //qDebug("KABCore::requestForDetails %s %s %s %s %s", sourceChannel.latin1(), sessionuid.latin1(), name.latin1(), email.latin1(), uid.latin1()); 2378 //qDebug("KABCore::requestForDetails %s %s %s %s %s", sourceChannel.latin1(), sessionuid.latin1(), name.latin1(), email.latin1(), uid.latin1());
2379 2379
2380 QString foundUid = QString::null; 2380 QString foundUid = QString::null;
2381 if ( ! uid.isEmpty() ) { 2381 if ( ! uid.isEmpty() ) {
2382 Addressee adrr = mAddressBook->findByUid( uid ); 2382 Addressee adrr = mAddressBook->findByUid( uid );
2383 if ( !adrr.isEmpty() ) { 2383 if ( !adrr.isEmpty() ) {
2384 foundUid = uid; 2384 foundUid = uid;
2385 } 2385 }
2386 if ( email == "sendbacklist" ) { 2386 if ( email == "sendbacklist" ) {
2387 //qDebug("ssssssssssssssssssssssend "); 2387 //qDebug("ssssssssssssssssssssssend ");
2388 QStringList nameList; 2388 QStringList nameList;
2389 QStringList emailList; 2389 QStringList emailList;
2390 QStringList uidList; 2390 QStringList uidList;
2391 nameList.append(adrr.realName()); 2391 nameList.append(adrr.realName());
2392 emailList = adrr.emails(); 2392 emailList = adrr.emails();
2393 uidList.append( adrr.preferredEmail()); 2393 uidList.append( adrr.preferredEmail());
2394 bool res = ExternalAppHandler::instance()->returnNameEmailUidListFromKAPI("QPE/Application/ompi", uid, nameList, emailList, uidList); 2394 bool res = ExternalAppHandler::instance()->returnNameEmailUidListFromKAPI("QPE/Application/ompi", uid, nameList, emailList, uidList);
2395 return; 2395 return;
2396 } 2396 }
2397 2397
2398 } 2398 }
2399 2399
2400 if ( email == "sendbacklist" ) 2400 if ( email == "sendbacklist" )
2401 return; 2401 return;
2402 if (foundUid.isEmpty()) 2402 if (foundUid.isEmpty())
2403 { 2403 {
2404 //find the uid of the person first 2404 //find the uid of the person first
2405 Addressee::List namelist; 2405 Addressee::List namelist;
2406 Addressee::List emaillist; 2406 Addressee::List emaillist;
2407 2407
2408 if (!name.isEmpty()) 2408 if (!name.isEmpty())
2409 namelist = mAddressBook->findByName( name ); 2409 namelist = mAddressBook->findByName( name );
2410 2410
2411 if (!email.isEmpty()) 2411 if (!email.isEmpty())
2412 emaillist = mAddressBook->findByEmail( email ); 2412 emaillist = mAddressBook->findByEmail( email );
2413 //qDebug("count %d %d ", namelist.count(),emaillist.count() ); 2413 //qDebug("count %d %d ", namelist.count(),emaillist.count() );
2414 //check if we have a match in Namelist and Emaillist 2414 //check if we have a match in Namelist and Emaillist
2415 if ((namelist.count() == 0) && (emaillist.count() > 0)) { 2415 if ((namelist.count() == 0) && (emaillist.count() > 0)) {
2416 foundUid = emaillist[0].uid(); 2416 foundUid = emaillist[0].uid();
2417 } 2417 }
2418 else if ((namelist.count() > 0) && (emaillist.count() == 0)) 2418 else if ((namelist.count() > 0) && (emaillist.count() == 0))
2419 foundUid = namelist[0].uid(); 2419 foundUid = namelist[0].uid();
2420 else 2420 else
2421 { 2421 {
2422 for (int i = 0; i < namelist.count(); i++) 2422 for (int i = 0; i < namelist.count(); i++)
2423 { 2423 {
2424 for (int j = 0; j < emaillist.count(); j++) 2424 for (int j = 0; j < emaillist.count(); j++)
2425 { 2425 {
2426 if (namelist[i] == emaillist[j]) 2426 if (namelist[i] == emaillist[j])
2427 { 2427 {
2428 foundUid = namelist[i].uid(); 2428 foundUid = namelist[i].uid();
2429 } 2429 }
2430 } 2430 }
2431 } 2431 }
2432 } 2432 }
2433 } 2433 }
2434 else 2434 else
2435 { 2435 {
2436 foundUid = uid; 2436 foundUid = uid;
2437 } 2437 }
2438 2438
2439 if (!foundUid.isEmpty()) 2439 if (!foundUid.isEmpty())
2440 { 2440 {
2441 2441
2442 // raise Ka/Pi if it is in the background 2442 // raise Ka/Pi if it is in the background
2443#ifndef DESKTOP_VERSION 2443#ifndef DESKTOP_VERSION
2444#ifndef KORG_NODCOP 2444#ifndef KORG_NODCOP
2445 //QCopEnvelope e("QPE/Application/kapi", "raise()"); 2445 //QCopEnvelope e("QPE/Application/kapi", "raise()");
2446#endif 2446#endif
2447#endif 2447#endif
2448 2448
2449 mMainWindow->showMaximized(); 2449 mMainWindow->showMaximized();
2450 mMainWindow-> raise(); 2450 mMainWindow-> raise();
2451 2451
2452 mViewManager->setSelected( "", false); 2452 mViewManager->setSelected( "", false);
2453 mViewManager->refreshView( "" ); 2453 mViewManager->refreshView( "" );
2454 mViewManager->setSelected( foundUid, true ); 2454 mViewManager->setSelected( foundUid, true );
2455 mViewManager->refreshView( foundUid ); 2455 mViewManager->refreshView( foundUid );
2456 2456
2457 if ( !mMultipleViewsAtOnce ) 2457 if ( !mMultipleViewsAtOnce )
2458 { 2458 {
2459 setDetailsVisible( true ); 2459 setDetailsVisible( true );
2460 mActionDetails->setChecked(true); 2460 mActionDetails->setChecked(true);
2461 } 2461 }
2462 } 2462 }
2463} 2463}
2464 2464
2465void KABCore::whatsnew() 2465void KABCore::whatsnew()
2466{ 2466{
2467 KApplication::showFile( "KDE-Pim/Pi Version Info", "kdepim/WhatsNew.txt" ); 2467 KApplication::showFile( "KDE-Pim/Pi Version Info", "kdepim/WhatsNew.txt" );
2468} 2468}
2469void KABCore::synchowto() 2469void KABCore::synchowto()
2470{ 2470{
2471 KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/SyncHowto.txt" ); 2471 KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/SyncHowto.txt" );
2472} 2472}
2473void KABCore::kdesynchowto() 2473void KABCore::kdesynchowto()
2474{ 2474{
2475 KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/Zaurus-KDE_syncHowTo.txt" ); 2475 KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/Zaurus-KDE_syncHowTo.txt" );
2476} 2476}
2477void KABCore::multisynchowto() 2477void KABCore::multisynchowto()
2478{ 2478{
2479 KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/MultiSyncHowTo.txt" ); 2479 KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/MultiSyncHowTo.txt" );
2480} 2480}
2481void KABCore::faq() 2481void KABCore::faq()
2482{ 2482{
2483 KApplication::showFile( "KA/Pi FAQ", "kdepim/kaddressbook/kapiFAQ.txt" ); 2483 KApplication::showFile( "KA/Pi FAQ", "kdepim/kaddressbook/kapiFAQ.txt" );
2484} 2484}
2485 2485
2486#include <libkcal/syncdefines.h> 2486#include <libkcal/syncdefines.h>
2487 2487
2488KABC::Addressee KABCore::getLastSyncAddressee() 2488KABC::Addressee KABCore::getLastSyncAddressee()
2489{ 2489{
2490 Addressee lse; 2490 Addressee lse;
2491 QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice(); 2491 QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice();
2492 2492
2493 //qDebug("CurrentSyncDevice %s ",mCurrentSyncDevice .latin1() ); 2493 //qDebug("CurrentSyncDevice %s ",mCurrentSyncDevice .latin1() );
2494 lse = mAddressBook->findByUid( "last-syncAddressee-"+mCurrentSyncDevice ); 2494 lse = mAddressBook->findByUid( "last-syncAddressee-"+mCurrentSyncDevice );
2495 if (lse.isEmpty()) { 2495 if (lse.isEmpty()) {
2496 qDebug("Creating new last-syncAddressee "); 2496 qDebug("Creating new last-syncAddressee ");
2497 lse.setUid( "last-syncAddressee-"+mCurrentSyncDevice ); 2497 lse.setUid( "last-syncAddressee-"+mCurrentSyncDevice );
2498 QString sum = ""; 2498 QString sum = "";
2499 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) 2499 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL )
2500 sum = "E: "; 2500 sum = "E: ";
2501 lse.setFamilyName("!"+sum+mCurrentSyncDevice + i18n(" - sync event")); 2501 lse.setFamilyName("!"+sum+mCurrentSyncDevice + i18n(" - sync event"));
2502 lse.setRevision( mLastAddressbookSync ); 2502 lse.setRevision( mLastAddressbookSync );
2503 lse.setCategories( i18n("SyncEvent") ); 2503 lse.setCategories( i18n("SyncEvent") );
2504 mAddressBook->insertAddressee( lse ); 2504 mAddressBook->insertAddressee( lse );
2505 } 2505 }
2506 return lse; 2506 return lse;
2507} 2507}
2508int KABCore::takeAddressee( KABC::Addressee* local, KABC::Addressee* remote, int mode , bool full ) 2508int KABCore::takeAddressee( KABC::Addressee* local, KABC::Addressee* remote, int mode , bool full )
2509{ 2509{
2510 2510
2511 //void setZaurusId(int id); 2511 //void setZaurusId(int id);
2512 // int zaurusId() const; 2512 // int zaurusId() const;
2513 // void setZaurusUid(int id); 2513 // void setZaurusUid(int id);
2514 // int zaurusUid() const; 2514 // int zaurusUid() const;
2515 // void setZaurusStat(int id); 2515 // void setZaurusStat(int id);
2516 // int zaurusStat() const; 2516 // int zaurusStat() const;
2517 // 0 equal 2517 // 0 equal
2518 // 1 take local 2518 // 1 take local
2519 // 2 take remote 2519 // 2 take remote
2520 // 3 cancel 2520 // 3 cancel
2521 QDateTime lastSync = mLastAddressbookSync; 2521 QDateTime lastSync = mLastAddressbookSync;
2522 QDateTime localMod = local->revision(); 2522 QDateTime localMod = local->revision();
2523 QDateTime remoteMod = remote->revision(); 2523 QDateTime remoteMod = remote->revision();
2524 2524
2525 QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice(); 2525 QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice();
2526 2526
2527 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 2527 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
2528 bool remCh, locCh; 2528 bool remCh, locCh;
2529 remCh = ( remote->getCsum(mCurrentSyncDevice) != local->getCsum(mCurrentSyncDevice) ); 2529 remCh = ( remote->getCsum(mCurrentSyncDevice) != local->getCsum(mCurrentSyncDevice) );
2530 //qDebug("loc %s rem %s", local->getCsum(mCurrentSyncDevice).latin1(), remote->getCsum(mCurrentSyncDevice).latin1() ); 2530 //qDebug("loc %s rem %s", local->getCsum(mCurrentSyncDevice).latin1(), remote->getCsum(mCurrentSyncDevice).latin1() );
2531 locCh = ( localMod > mLastAddressbookSync ); 2531 locCh = ( localMod > mLastAddressbookSync );
2532 if ( !remCh && ! locCh ) { 2532 if ( !remCh && ! locCh ) {
2533 //qDebug("both not changed "); 2533 //qDebug("both not changed ");
2534 lastSync = localMod.addDays(1); 2534 lastSync = localMod.addDays(1);
2535 if ( mode <= SYNC_PREF_ASK ) 2535 if ( mode <= SYNC_PREF_ASK )
2536 return 0; 2536 return 0;
2537 } else { 2537 } else {
2538 if ( locCh ) { 2538 if ( locCh ) {
2539 //qDebug("loc changed %s %s", localMod.toString().latin1(), mLastAddressbookSync.toString().latin1()); 2539 //qDebug("loc changed %s %s", localMod.toString().latin1(), mLastAddressbookSync.toString().latin1());
2540 lastSync = localMod.addDays( -1 ); 2540 lastSync = localMod.addDays( -1 );
2541 if ( !remCh ) 2541 if ( !remCh )
2542 remoteMod =( lastSync.addDays( -1 ) ); 2542 remoteMod =( lastSync.addDays( -1 ) );
2543 } else { 2543 } else {
2544 //qDebug(" not loc changed "); 2544 //qDebug(" not loc changed ");
2545 lastSync = localMod.addDays( 1 ); 2545 lastSync = localMod.addDays( 1 );
2546 if ( remCh ) { 2546 if ( remCh ) {
2547 //qDebug("rem changed "); 2547 //qDebug("rem changed ");
2548 remoteMod =( lastSync.addDays( 1 ) ); 2548 remoteMod =( lastSync.addDays( 1 ) );
2549 } 2549 }
2550 2550
2551 } 2551 }
2552 } 2552 }
2553 full = true; 2553 full = true;
2554 if ( mode < SYNC_PREF_ASK ) 2554 if ( mode < SYNC_PREF_ASK )
2555 mode = SYNC_PREF_ASK; 2555 mode = SYNC_PREF_ASK;
2556 } else { 2556 } else {
2557 if ( localMod == remoteMod ) 2557 if ( localMod == remoteMod )
2558 return 0; 2558 return 0;
2559 2559
2560 } 2560 }
2561 //qDebug("%s %s --- %d %d", localMod.toString().latin1() , remoteMod.toString().latin1(), localMod.time().msec(), remoteMod.time().msec()); 2561 //qDebug("%s %s --- %d %d", localMod.toString().latin1() , remoteMod.toString().latin1(), localMod.time().msec(), remoteMod.time().msec());
2562 //qDebug("lastsync %s ", lastSync.toString().latin1() ); 2562 //qDebug("lastsync %s ", lastSync.toString().latin1() );
2563 //full = true; //debug only 2563 //full = true; //debug only
2564 if ( full ) { 2564 if ( full ) {
2565 bool equ = ( (*local) == (*remote) ); 2565 bool equ = ( (*local) == (*remote) );
2566 if ( equ ) { 2566 if ( equ ) {
2567 //qDebug("equal "); 2567 //qDebug("equal ");
2568 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 2568 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
2569 local->setCsum( mCurrentSyncDevice, remote->getCsum(mCurrentSyncDevice) ); 2569 local->setCsum( mCurrentSyncDevice, remote->getCsum(mCurrentSyncDevice) );
2570 } 2570 }
2571 if ( mode < SYNC_PREF_FORCE_LOCAL ) 2571 if ( mode < SYNC_PREF_FORCE_LOCAL )
2572 return 0; 2572 return 0;
2573 2573
2574 }//else //debug only 2574 }//else //debug only
2575 //qDebug("not equal %s %s ", local->summary().latin1(), remote->summary().latin1()); 2575 //qDebug("not equal %s %s ", local->summary().latin1(), remote->summary().latin1());
2576 } 2576 }
2577 int result; 2577 int result;
2578 bool localIsNew; 2578 bool localIsNew;
2579 //qDebug("%s -- %s mLastCalendarSync %s lastsync %s --- local %s remote %s ",local->summary().latin1(), remote->summary().latin1(),mLastCalendarSync.toString().latin1() ,lastSync.toString().latin1() , local->lastModified().toString().latin1() , remote->lastModified().toString().latin1() ); 2579 //qDebug("%s -- %s mLastCalendarSync %s lastsync %s --- local %s remote %s ",local->summary().latin1(), remote->summary().latin1(),mLastCalendarSync.toString().latin1() ,lastSync.toString().latin1() , local->lastModified().toString().latin1() , remote->lastModified().toString().latin1() );
2580 2580
2581 if ( full && mode < SYNC_PREF_NEWEST ) 2581 if ( full && mode < SYNC_PREF_NEWEST )
2582 mode = SYNC_PREF_ASK; 2582 mode = SYNC_PREF_ASK;
2583 2583
2584 switch( mode ) { 2584 switch( mode ) {
2585 case SYNC_PREF_LOCAL: 2585 case SYNC_PREF_LOCAL:
2586 if ( lastSync > remoteMod ) 2586 if ( lastSync > remoteMod )
2587 return 1; 2587 return 1;
2588 if ( lastSync > localMod ) 2588 if ( lastSync > localMod )
2589 return 2; 2589 return 2;
2590 return 1; 2590 return 1;
2591 break; 2591 break;
2592 case SYNC_PREF_REMOTE: 2592 case SYNC_PREF_REMOTE:
2593 if ( lastSync > remoteMod ) 2593 if ( lastSync > remoteMod )
2594 return 1; 2594 return 1;
2595 if ( lastSync > localMod ) 2595 if ( lastSync > localMod )
2596 return 2; 2596 return 2;
2597 return 2; 2597 return 2;
2598 break; 2598 break;
2599 case SYNC_PREF_NEWEST: 2599 case SYNC_PREF_NEWEST:
2600 if ( localMod > remoteMod ) 2600 if ( localMod > remoteMod )
2601 return 1; 2601 return 1;
2602 else 2602 else
2603 return 2; 2603 return 2;
2604 break; 2604 break;
2605 case SYNC_PREF_ASK: 2605 case SYNC_PREF_ASK:
2606 //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), localMod.toString().latin1(), remoteMod.toString().latin1() ); 2606 //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), localMod.toString().latin1(), remoteMod.toString().latin1() );
2607 if ( lastSync > remoteMod ) 2607 if ( lastSync > remoteMod )
2608 return 1; 2608 return 1;
2609 if ( lastSync > localMod ) 2609 if ( lastSync > localMod )
2610 return 2; 2610 return 2;
2611 localIsNew = localMod >= remoteMod; 2611 localIsNew = localMod >= remoteMod;
2612 //qDebug("conflict! ************************************** "); 2612 //qDebug("conflict! ************************************** ");
2613 { 2613 {
2614 KPIM::AddresseeChooser acd ( *local,*remote, localIsNew , this ); 2614 KPIM::AddresseeChooser acd ( *local,*remote, localIsNew , this );
2615 result = acd.executeD(localIsNew); 2615 result = acd.executeD(localIsNew);
2616 return result; 2616 return result;
2617 } 2617 }
2618 break; 2618 break;
2619 case SYNC_PREF_FORCE_LOCAL: 2619 case SYNC_PREF_FORCE_LOCAL:
2620 return 1; 2620 return 1;
2621 break; 2621 break;
2622 case SYNC_PREF_FORCE_REMOTE: 2622 case SYNC_PREF_FORCE_REMOTE:
2623 return 2; 2623 return 2;
2624 break; 2624 break;
2625 2625
2626 default: 2626 default:
2627 // SYNC_PREF_TAKE_BOTH not implemented 2627 // SYNC_PREF_TAKE_BOTH not implemented
2628 break; 2628 break;
2629 } 2629 }
2630 return 0; 2630 return 0;
2631} 2631}
2632 2632
2633 2633
2634bool KABCore::synchronizeAddressbooks( KABC::AddressBook* local, KABC::AddressBook* remote,int mode) 2634bool KABCore::synchronizeAddressbooks( KABC::AddressBook* local, KABC::AddressBook* remote,int mode)
2635{ 2635{
2636 bool syncOK = true; 2636 bool syncOK = true;
2637 int addedAddressee = 0; 2637 int addedAddressee = 0;
2638 int addedAddresseeR = 0; 2638 int addedAddresseeR = 0;
2639 int deletedAddresseeR = 0; 2639 int deletedAddresseeR = 0;
2640 int deletedAddresseeL = 0; 2640 int deletedAddresseeL = 0;
2641 int changedLocal = 0; 2641 int changedLocal = 0;
2642 int changedRemote = 0; 2642 int changedRemote = 0;
2643 2643
2644 QString mCurrentSyncName = syncManager->getCurrentSyncName(); 2644 QString mCurrentSyncName = syncManager->getCurrentSyncName();
2645 QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice(); 2645 QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice();
2646 2646
2647 //QPtrList<Addressee> el = local->rawAddressees(); 2647 //QPtrList<Addressee> el = local->rawAddressees();
2648 Addressee addresseeR; 2648 Addressee addresseeR;
2649 QString uid; 2649 QString uid;
2650 int take; 2650 int take;
2651 Addressee addresseeL; 2651 Addressee addresseeL;
2652 Addressee addresseeRSync; 2652 Addressee addresseeRSync;
2653 Addressee addresseeLSync; 2653 Addressee addresseeLSync;
2654 // KABC::Addressee::List addresseeRSyncSharp = remote->getExternLastSyncAddressees(); 2654 // KABC::Addressee::List addresseeRSyncSharp = remote->getExternLastSyncAddressees();
2655 //KABC::Addressee::List addresseeLSyncSharp = local->getExternLastSyncAddressees(); 2655 //KABC::Addressee::List addresseeLSyncSharp = local->getExternLastSyncAddressees();
2656 bool fullDateRange = false; 2656 bool fullDateRange = false;
2657 local->resetTempSyncStat(); 2657 local->resetTempSyncStat();
2658 mLastAddressbookSync = QDateTime::currentDateTime(); 2658 mLastAddressbookSync = QDateTime::currentDateTime();
2659 if ( syncManager->syncWithDesktop() ) { 2659 if ( syncManager->syncWithDesktop() ) {
2660 // remote->removeSyncInfo( QString());//remove all info 2660 // remote->removeSyncInfo( QString());//remove all info
2661 if ( KSyncManager::mRequestedSyncEvent.isValid() ) { 2661 if ( KSyncManager::mRequestedSyncEvent.isValid() ) {
2662 mLastAddressbookSync = KSyncManager::mRequestedSyncEvent; 2662 mLastAddressbookSync = KSyncManager::mRequestedSyncEvent;
2663 qDebug("using extern time for calendar sync: %s ", mLastAddressbookSync.toString().latin1() ); 2663 qDebug("using extern time for calendar sync: %s ", mLastAddressbookSync.toString().latin1() );
2664 } else { 2664 } else {
2665 qDebug("KSyncManager::mRequestedSyncEvent has invalid datatime "); 2665 qDebug("KSyncManager::mRequestedSyncEvent has invalid datatime ");
2666 } 2666 }
2667 } 2667 }
2668 QDateTime modifiedCalendar = mLastAddressbookSync; 2668 QDateTime modifiedCalendar = mLastAddressbookSync;
2669 addresseeLSync = getLastSyncAddressee(); 2669 addresseeLSync = getLastSyncAddressee();
2670 qDebug("Last Sync %s ", addresseeLSync.revision().toString().latin1()); 2670 qDebug("Last Sync %s ", addresseeLSync.revision().toString().latin1());
2671 addresseeR = remote->findByUid("last-syncAddressee-"+mCurrentSyncName ); 2671 addresseeR = remote->findByUid("last-syncAddressee-"+mCurrentSyncName );
2672 if ( !addresseeR.isEmpty() ) { 2672 if ( !addresseeR.isEmpty() ) {
2673 addresseeRSync = addresseeR; 2673 addresseeRSync = addresseeR;
2674 remote->removeAddressee(addresseeR ); 2674 remote->removeAddressee(addresseeR );
2675 2675
2676 } else { 2676 } else {
2677 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 2677 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
2678 addresseeRSync = addresseeLSync ; 2678 addresseeRSync = addresseeLSync ;
2679 } else { 2679 } else {
2680 //qDebug("FULLDATE 1"); 2680 //qDebug("FULLDATE 1");
2681 fullDateRange = true; 2681 fullDateRange = true;
2682 Addressee newAdd; 2682 Addressee newAdd;
2683 addresseeRSync = newAdd; 2683 addresseeRSync = newAdd;
2684 addresseeRSync.setFamilyName(mCurrentSyncName + i18n(" - sync addressee")); 2684 addresseeRSync.setFamilyName(mCurrentSyncName + i18n(" - sync addressee"));
2685 addresseeRSync.setUid("last-syncAddressee-"+mCurrentSyncName ); 2685 addresseeRSync.setUid("last-syncAddressee-"+mCurrentSyncName );
2686 addresseeRSync.setRevision( mLastAddressbookSync ); 2686 addresseeRSync.setRevision( mLastAddressbookSync );
2687 addresseeRSync.setCategories( i18n("SyncAddressee") ); 2687 addresseeRSync.setCategories( i18n("SyncAddressee") );
2688 } 2688 }
2689 } 2689 }
2690 if ( addresseeLSync.revision() == mLastAddressbookSync ) { 2690 if ( addresseeLSync.revision() == mLastAddressbookSync ) {
2691 // qDebug("FULLDATE 2"); 2691 // qDebug("FULLDATE 2");
2692 fullDateRange = true; 2692 fullDateRange = true;
2693 } 2693 }
2694 if ( ! fullDateRange ) { 2694 if ( ! fullDateRange ) {
2695 if ( addresseeLSync.revision() != addresseeRSync.revision() ) { 2695 if ( addresseeLSync.revision() != addresseeRSync.revision() ) {
2696 2696
2697 // qDebug("set fulldate to true %s %s" ,addresseeLSync->dtStart().toString().latin1(), addresseeRSync->dtStart().toString().latin1() ); 2697 // qDebug("set fulldate to true %s %s" ,addresseeLSync->dtStart().toString().latin1(), addresseeRSync->dtStart().toString().latin1() );
2698 //qDebug("%d %d %d %d ", addresseeLSync->dtStart().time().second(), addresseeLSync->dtStart().time().msec() , addresseeRSync->dtStart().time().second(), addresseeRSync->dtStart().time().msec()); 2698 //qDebug("%d %d %d %d ", addresseeLSync->dtStart().time().second(), addresseeLSync->dtStart().time().msec() , addresseeRSync->dtStart().time().second(), addresseeRSync->dtStart().time().msec());
2699 fullDateRange = true; 2699 fullDateRange = true;
2700 //qDebug("FULLDATE 3 %s %s", addresseeLSync.revision().toString().latin1() , addresseeRSync.revision().toString().latin1() ); 2700 //qDebug("FULLDATE 3 %s %s", addresseeLSync.revision().toString().latin1() , addresseeRSync.revision().toString().latin1() );
2701 } 2701 }
2702 } 2702 }
2703 // fullDateRange = true; // debug only! 2703 // fullDateRange = true; // debug only!
2704 if ( fullDateRange ) 2704 if ( fullDateRange )
2705 mLastAddressbookSync = QDateTime::currentDateTime().addDays( -100*365); 2705 mLastAddressbookSync = QDateTime::currentDateTime().addDays( -100*365);
2706 else 2706 else
2707 mLastAddressbookSync = addresseeLSync.revision(); 2707 mLastAddressbookSync = addresseeLSync.revision();
2708 // for resyncing if own file has changed 2708 // for resyncing if own file has changed
2709 // PENDING fixme later when implemented 2709 // PENDING fixme later when implemented
2710#if 0 2710#if 0
2711 if ( mCurrentSyncDevice == "deleteaftersync" ) { 2711 if ( mCurrentSyncDevice == "deleteaftersync" ) {
2712 mLastAddressbookSync = loadedFileVersion; 2712 mLastAddressbookSync = loadedFileVersion;
2713 qDebug("setting mLastAddressbookSync "); 2713 qDebug("setting mLastAddressbookSync ");
2714 } 2714 }
2715#endif 2715#endif
2716 2716
2717 //qDebug("*************************** "); 2717 //qDebug("*************************** ");
2718 // qDebug("mLastAddressbookSync %s ",mLastAddressbookSync.toString().latin1() ); 2718 // qDebug("mLastAddressbookSync %s ",mLastAddressbookSync.toString().latin1() );
2719 QStringList er = remote->uidList(); 2719 QStringList er = remote->uidList();
2720 Addressee inR ;//= er.first(); 2720 Addressee inR ;//= er.first();
2721 Addressee inL; 2721 Addressee inL;
2722 2722
2723 syncManager->showProgressBar(0, i18n("Syncing - close to abort!"), er.count()); 2723 syncManager->showProgressBar(0, i18n("Syncing - close to abort!"), er.count());
2724 2724
2725 int modulo = (er.count()/10)+1; 2725 int modulo = (er.count()/10)+1;
2726 int incCounter = 0; 2726 int incCounter = 0;
2727 while ( incCounter < er.count()) { 2727 while ( incCounter < er.count()) {
2728 if (syncManager->isProgressBarCanceled()) 2728 if (syncManager->isProgressBarCanceled())
2729 return false; 2729 return false;
2730 if ( incCounter % modulo == 0 ) 2730 if ( incCounter % modulo == 0 )
2731 syncManager->showProgressBar(incCounter); 2731 syncManager->showProgressBar(incCounter);
2732 2732
2733 uid = er[ incCounter ]; 2733 uid = er[ incCounter ];
2734 bool skipIncidence = false; 2734 bool skipIncidence = false;
2735 if ( uid.left(19) == QString("last-syncAddressee-") ) 2735 if ( uid.left(19) == QString("last-syncAddressee-") )
2736 skipIncidence = true; 2736 skipIncidence = true;
2737 QString idS,OidS; 2737 QString idS,OidS;
2738 qApp->processEvents(); 2738 qApp->processEvents();
2739 if ( !skipIncidence ) { 2739 if ( !skipIncidence ) {
2740 inL = local->findByUid( uid ); 2740 inL = local->findByUid( uid );
2741 inR = remote->findByUid( uid ); 2741 inR = remote->findByUid( uid );
2742 //inL.setResource( 0 ); 2742 //inL.setResource( 0 );
2743 //inR.setResource( 0 ); 2743 //inR.setResource( 0 );
2744 if ( !inL.isEmpty() ) { // maybe conflict - same uid in both calendars 2744 if ( !inL.isEmpty() ) { // maybe conflict - same uid in both calendars
2745 if ( !inL.resource() || inL.resource()->includeInSync() ) { 2745 if ( !inL.resource() || inL.resource()->includeInSync() ) {
2746 if ( take = takeAddressee( &inL, &inR, mode, fullDateRange ) ) { 2746 if ( (take = takeAddressee( &inL, &inR, mode, fullDateRange )) ) {
2747 //qDebug("take %d %s ", take, inL.summary().latin1()); 2747 //qDebug("take %d %s ", take, inL.summary().latin1());
2748 if ( take == 3 ) 2748 if ( take == 3 )
2749 return false; 2749 return false;
2750 if ( take == 1 ) {// take local ********************** 2750 if ( take == 1 ) {// take local **********************
2751 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 2751 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
2752 inL.setCsum( mCurrentSyncDevice, inR.getCsum(mCurrentSyncDevice) ); 2752 inL.setCsum( mCurrentSyncDevice, inR.getCsum(mCurrentSyncDevice) );
2753 inL.setID( mCurrentSyncDevice, inR.getID(mCurrentSyncDevice) ); 2753 inL.setID( mCurrentSyncDevice, inR.getID(mCurrentSyncDevice) );
2754 local->insertAddressee( inL, false ); 2754 local->insertAddressee( inL, false );
2755 idS = inR.externalUID(); 2755 idS = inR.externalUID();
2756 OidS = inR.originalExternalUID(); 2756 OidS = inR.originalExternalUID();
2757 } 2757 }
2758 else 2758 else
2759 idS = inR.IDStr(); 2759 idS = inR.IDStr();
2760 remote->removeAddressee( inR ); 2760 remote->removeAddressee( inR );
2761 inR = inL; 2761 inR = inL;
2762 inR.setTempSyncStat( SYNC_TEMPSTATE_INITIAL ); 2762 inR.setTempSyncStat( SYNC_TEMPSTATE_INITIAL );
2763 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 2763 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
2764 inR.setOriginalExternalUID( OidS ); 2764 inR.setOriginalExternalUID( OidS );
2765 inR.setExternalUID( idS ); 2765 inR.setExternalUID( idS );
2766 if ( syncManager->syncWithDesktop() ) { 2766 if ( syncManager->syncWithDesktop() ) {
2767 inR.setIDStr("changed" ); 2767 inR.setIDStr("changed" );
2768 } 2768 }
2769 //inR.insertCustom( "KADDRESSBOOK", "X-KDESYNC","changed" ); 2769 //inR.insertCustom( "KADDRESSBOOK", "X-KDESYNC","changed" );
2770 } else { 2770 } else {
2771 inR.setIDStr( idS ); 2771 inR.setIDStr( idS );
2772 } 2772 }
2773 inR.setResource( 0 ); 2773 inR.setResource( 0 );
2774 remote->insertAddressee( inR , false); 2774 remote->insertAddressee( inR , false);
2775 ++changedRemote; 2775 ++changedRemote;
2776 } else { // take == 2 take remote ********************** 2776 } else { // take == 2 take remote **********************
2777 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 2777 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
2778 if ( inR.revision().date().year() < 2004 ) 2778 if ( inR.revision().date().year() < 2004 )
2779 inR.setRevision( modifiedCalendar ); 2779 inR.setRevision( modifiedCalendar );
2780 } 2780 }
2781 idS = inL.IDStr(); 2781 idS = inL.IDStr();
2782 local->removeAddressee( inL ); 2782 local->removeAddressee( inL );
2783 inL = inR; 2783 inL = inR;
2784 inL.setIDStr( idS ); 2784 inL.setIDStr( idS );
2785 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 2785 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
2786 inL.setCsum( mCurrentSyncDevice, inR.getCsum(mCurrentSyncDevice) ); 2786 inL.setCsum( mCurrentSyncDevice, inR.getCsum(mCurrentSyncDevice) );
2787 inL.setID( mCurrentSyncDevice, inR.getID(mCurrentSyncDevice) ); 2787 inL.setID( mCurrentSyncDevice, inR.getID(mCurrentSyncDevice) );
2788 } 2788 }
2789 inL.setResource( 0 ); 2789 inL.setResource( 0 );
2790 local->insertAddressee( inL , false ); 2790 local->insertAddressee( inL , false );
2791 ++changedLocal; 2791 ++changedLocal;
2792 } 2792 }
2793 } 2793 }
2794 } 2794 }
2795 } else { // no conflict ********** add or delete remote 2795 } else { // no conflict ********** add or delete remote
2796 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 2796 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
2797 QString des = addresseeLSync.note(); 2797 QString des = addresseeLSync.note();
2798 if ( des.find( inR.getID(mCurrentSyncDevice) +"," ) >= 0 && mode != 5) { // delete it 2798 if ( des.find( inR.getID(mCurrentSyncDevice) +"," ) >= 0 && mode != 5) { // delete it
2799 inR.setTempSyncStat( SYNC_TEMPSTATE_DELETE ); 2799 inR.setTempSyncStat( SYNC_TEMPSTATE_DELETE );
2800 remote->insertAddressee( inR, false ); 2800 remote->insertAddressee( inR, false );
2801 ++deletedAddresseeR; 2801 ++deletedAddresseeR;
2802 } else { 2802 } else {
2803 inR.setRevision( modifiedCalendar ); 2803 inR.setRevision( modifiedCalendar );
2804 remote->insertAddressee( inR, false ); 2804 remote->insertAddressee( inR, false );
2805 inL = inR; 2805 inL = inR;
2806 inL.setIDStr( ":" ); 2806 inL.setIDStr( ":" );
2807 inL.setCsum( mCurrentSyncDevice, inR.getCsum(mCurrentSyncDevice) ); 2807 inL.setCsum( mCurrentSyncDevice, inR.getCsum(mCurrentSyncDevice) );
2808 inL.setID( mCurrentSyncDevice, inR.getID(mCurrentSyncDevice) ); 2808 inL.setID( mCurrentSyncDevice, inR.getID(mCurrentSyncDevice) );
2809 inL.setResource( 0 ); 2809 inL.setResource( 0 );
2810 local->insertAddressee( inL , false); 2810 local->insertAddressee( inL , false);
2811 ++addedAddressee; 2811 ++addedAddressee;
2812 } 2812 }
2813 } else { 2813 } else {
2814 if ( inR.revision() > mLastAddressbookSync || mode == 5 ) { 2814 if ( inR.revision() > mLastAddressbookSync || mode == 5 ) {
2815 inR.setRevision( modifiedCalendar ); 2815 inR.setRevision( modifiedCalendar );
2816 remote->insertAddressee( inR, false ); 2816 remote->insertAddressee( inR, false );
2817 inR.setResource( 0 ); 2817 inR.setResource( 0 );
2818 local->insertAddressee( inR, false ); 2818 local->insertAddressee( inR, false );
2819 ++addedAddressee; 2819 ++addedAddressee;
2820 } else { 2820 } else {
2821 // pending checkExternSyncAddressee(addresseeRSyncSharp, inR); 2821 // pending checkExternSyncAddressee(addresseeRSyncSharp, inR);
2822 remote->removeAddressee( inR ); 2822 remote->removeAddressee( inR );
2823 ++deletedAddresseeR; 2823 ++deletedAddresseeR;
2824 } 2824 }
2825 } 2825 }
2826 } 2826 }
2827 } 2827 }
2828 ++incCounter; 2828 ++incCounter;
2829 } 2829 }
2830 er.clear(); 2830 er.clear();
2831 QStringList el = local->uidList(); 2831 QStringList el = local->uidList();
2832 modulo = (el.count()/10)+1; 2832 modulo = (el.count()/10)+1;
2833 2833
2834 syncManager->showProgressBar(0, i18n("Add / remove addressees"), el.count()); 2834 syncManager->showProgressBar(0, i18n("Add / remove addressees"), el.count());
2835 incCounter = 0; 2835 incCounter = 0;
2836 while ( incCounter < el.count()) { 2836 while ( incCounter < el.count()) {
2837 qApp->processEvents(); 2837 qApp->processEvents();
2838 if (syncManager->isProgressBarCanceled()) 2838 if (syncManager->isProgressBarCanceled())
2839 return false; 2839 return false;
2840 if ( incCounter % modulo == 0 ) 2840 if ( incCounter % modulo == 0 )
2841 syncManager->showProgressBar(incCounter); 2841 syncManager->showProgressBar(incCounter);
2842 uid = el[ incCounter ]; 2842 uid = el[ incCounter ];
2843 bool skipIncidence = false; 2843 bool skipIncidence = false;
2844 if ( uid.left(19) == QString("last-syncAddressee-") ) 2844 if ( uid.left(19) == QString("last-syncAddressee-") )
2845 skipIncidence = true; 2845 skipIncidence = true;
2846 if ( !skipIncidence ) { 2846 if ( !skipIncidence ) {
2847 inL = local->findByUid( uid ); 2847 inL = local->findByUid( uid );
2848 if ( !inL.resource() || inL.resource()->includeInSync() ) { 2848 if ( !inL.resource() || inL.resource()->includeInSync() ) {
2849 inR = remote->findByUid( uid ); 2849 inR = remote->findByUid( uid );
2850 if ( inR.isEmpty() ) { // no conflict ********** add or delete local 2850 if ( inR.isEmpty() ) { // no conflict ********** add or delete local
2851 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 2851 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
2852 if ( !inL.getID(mCurrentSyncDevice).isEmpty() && mode != 4 ) { 2852 if ( !inL.getID(mCurrentSyncDevice).isEmpty() && mode != 4 ) {
2853 // pending checkExternSyncAddressee(addresseeLSyncSharp, inL); 2853 // pending checkExternSyncAddressee(addresseeLSyncSharp, inL);
2854 local->removeAddressee( inL ); 2854 local->removeAddressee( inL );
2855 ++deletedAddresseeL; 2855 ++deletedAddresseeL;
2856 } else { 2856 } else {
2857 if ( ! syncManager->mWriteBackExistingOnly ) { 2857 if ( ! syncManager->mWriteBackExistingOnly ) {
2858 inL.removeID(mCurrentSyncDevice ); 2858 inL.removeID(mCurrentSyncDevice );
2859 ++addedAddresseeR; 2859 ++addedAddresseeR;
2860 inL.setRevision( modifiedCalendar ); 2860 inL.setRevision( modifiedCalendar );
2861 local->insertAddressee( inL, false ); 2861 local->insertAddressee( inL, false );
2862 inR = inL; 2862 inR = inL;
2863 inR.setTempSyncStat( SYNC_TEMPSTATE_ADDED_EXTERNAL ); 2863 inR.setTempSyncStat( SYNC_TEMPSTATE_ADDED_EXTERNAL );
2864 inR.setResource( 0 ); 2864 inR.setResource( 0 );
2865 remote->insertAddressee( inR, false ); 2865 remote->insertAddressee( inR, false );
2866 } 2866 }
2867 } 2867 }
2868 } else { 2868 } else {
2869 if ( inL.revision() < mLastAddressbookSync && mode != 4 ) { 2869 if ( inL.revision() < mLastAddressbookSync && mode != 4 ) {
2870 //qDebug("data %s ", inL.revision().toString().latin1()); 2870 //qDebug("data %s ", inL.revision().toString().latin1());
2871 // pending checkExternSyncAddressee(addresseeLSyncSharp, inL); 2871 // pending checkExternSyncAddressee(addresseeLSyncSharp, inL);
2872 local->removeAddressee( inL ); 2872 local->removeAddressee( inL );
2873 ++deletedAddresseeL; 2873 ++deletedAddresseeL;
2874 } else { 2874 } else {
2875 if ( ! syncManager->mWriteBackExistingOnly ) { 2875 if ( ! syncManager->mWriteBackExistingOnly ) {
2876 ++addedAddresseeR; 2876 ++addedAddresseeR;
2877 inL.setRevision( modifiedCalendar ); 2877 inL.setRevision( modifiedCalendar );
2878 local->insertAddressee( inL, false ); 2878 local->insertAddressee( inL, false );
2879 inR = inL; 2879 inR = inL;
2880 inR.setIDStr( ":" ); 2880 inR.setIDStr( ":" );
2881 inR.setResource( 0 ); 2881 inR.setResource( 0 );
2882 remote->insertAddressee( inR, false ); 2882 remote->insertAddressee( inR, false );
2883 } 2883 }
2884 } 2884 }
2885 } 2885 }
2886 } 2886 }
2887 } 2887 }
2888 } 2888 }
2889 ++incCounter; 2889 ++incCounter;
2890 } 2890 }
2891 el.clear(); 2891 el.clear();
2892 syncManager->hideProgressBar(); 2892 syncManager->hideProgressBar();
2893 mLastAddressbookSync = QDateTime::currentDateTime().addSecs( 1 ); 2893 mLastAddressbookSync = QDateTime::currentDateTime().addSecs( 1 );
2894 // get rid of micro seconds 2894 // get rid of micro seconds
2895 QTime t = mLastAddressbookSync.time(); 2895 QTime t = mLastAddressbookSync.time();
2896 mLastAddressbookSync.setTime( QTime (t.hour (), t.minute (), t.second () ) ); 2896 mLastAddressbookSync.setTime( QTime (t.hour (), t.minute (), t.second () ) );
2897 addresseeLSync.setRevision( mLastAddressbookSync ); 2897 addresseeLSync.setRevision( mLastAddressbookSync );
2898 addresseeRSync.setRevision( mLastAddressbookSync ); 2898 addresseeRSync.setRevision( mLastAddressbookSync );
2899 addresseeRSync.setRole( i18n("!Remote from: ")+mCurrentSyncName ) ; 2899 addresseeRSync.setRole( i18n("!Remote from: ")+mCurrentSyncName ) ;
2900 addresseeLSync.setRole(i18n("!Local from: ") + mCurrentSyncName ); 2900 addresseeLSync.setRole(i18n("!Local from: ") + mCurrentSyncName );
2901 addresseeRSync.setGivenName( i18n("!DO NOT EDIT!") ) ; 2901 addresseeRSync.setGivenName( i18n("!DO NOT EDIT!") ) ;
2902 addresseeLSync.setGivenName(i18n("!DO NOT EDIT!") ); 2902 addresseeLSync.setGivenName(i18n("!DO NOT EDIT!") );
2903 addresseeRSync.setOrganization( "!"+mLastAddressbookSync.toString() ) ; 2903 addresseeRSync.setOrganization( "!"+mLastAddressbookSync.toString() ) ;
2904 addresseeLSync.setOrganization("!"+ mLastAddressbookSync.toString() ); 2904 addresseeLSync.setOrganization("!"+ mLastAddressbookSync.toString() );
2905 addresseeRSync.setNote( "" ) ; 2905 addresseeRSync.setNote( "" ) ;
2906 addresseeLSync.setNote( "" ); 2906 addresseeLSync.setNote( "" );
2907 2907
2908 if ( mGlobalSyncMode == SYNC_MODE_NORMAL) 2908 if ( mGlobalSyncMode == SYNC_MODE_NORMAL)
2909 remote->insertAddressee( addresseeRSync, false ); 2909 remote->insertAddressee( addresseeRSync, false );
2910 local->insertAddressee( addresseeLSync, false ); 2910 local->insertAddressee( addresseeLSync, false );
2911 QString mes; 2911 QString mes;
2912 mes .sprintf( i18n("Synchronization summary:\n\n %d items added to local\n %d items added to remote\n %d items updated on local\n %d items updated on remote\n %d items deleted on local\n %d items deleted on remote\n"),addedAddressee, addedAddresseeR, changedLocal, changedRemote, deletedAddresseeL, deletedAddresseeR ); 2912 mes .sprintf( i18n("Synchronization summary:\n\n %d items added to local\n %d items added to remote\n %d items updated on local\n %d items updated on remote\n %d items deleted on local\n %d items deleted on remote\n"),addedAddressee, addedAddresseeR, changedLocal, changedRemote, deletedAddresseeL, deletedAddresseeR );
2913 qDebug( mes ); 2913 qDebug( mes );
2914 mes = i18n("Local addressbook changed!\n") +mes; 2914 mes = i18n("Local addressbook changed!\n") +mes;
2915 if ( syncManager->mShowSyncSummary ) { 2915 if ( syncManager->mShowSyncSummary ) {
2916 if ( KMessageBox::Cancel == KMessageBox::warningContinueCancel(this, mes, 2916 if ( KMessageBox::Cancel == KMessageBox::warningContinueCancel(this, mes,
2917 i18n("KA/Pi Synchronization"),i18n("Write back"))) { 2917 i18n("KA/Pi Synchronization"),i18n("Write back"))) {
2918 qDebug("cancelled "); 2918 qDebug("cancelled ");
2919 return false; 2919 return false;
2920 } 2920 }
2921 } 2921 }
2922 return syncOK; 2922 return syncOK;
2923} 2923}
2924 2924
2925 2925
2926//this is a overwritten callbackmethods from the syncinterface 2926//this is a overwritten callbackmethods from the syncinterface
2927bool KABCore::sync(KSyncManager* manager, QString filename, int mode) 2927bool KABCore::sync(KSyncManager* manager, QString filename, int mode)
2928{ 2928{
2929 2929
2930 //pending prepare addresseeview for output 2930 //pending prepare addresseeview for output
2931 //pending detect, if remote file has REV field. if not switch to external sync 2931 //pending detect, if remote file has REV field. if not switch to external sync
2932 mGlobalSyncMode = SYNC_MODE_NORMAL; 2932 mGlobalSyncMode = SYNC_MODE_NORMAL;
2933 QString mCurrentSyncDevice = manager->getCurrentSyncDevice(); 2933 QString mCurrentSyncDevice = manager->getCurrentSyncDevice();
2934 2934
2935 AddressBook abLocal(filename,"syncContact"); 2935 AddressBook abLocal(filename,"syncContact");
2936 bool syncOK = false; 2936 bool syncOK = false;
2937 if ( abLocal.load() ) { 2937 if ( abLocal.load() ) {
2938 qDebug("AB loaded %s,sync mode %d",filename.latin1(), mode ); 2938 qDebug("AB loaded %s,sync mode %d",filename.latin1(), mode );
2939 bool external = false; 2939 bool external = false;
2940 bool isXML = false; 2940 bool isXML = false;
2941 if ( filename.right(4) == ".xml") { 2941 if ( filename.right(4) == ".xml") {
2942 mGlobalSyncMode = SYNC_MODE_EXTERNAL; 2942 mGlobalSyncMode = SYNC_MODE_EXTERNAL;
2943 isXML = true; 2943 isXML = true;
2944 abLocal.preExternSync( mAddressBook ,mCurrentSyncDevice, true ); 2944 abLocal.preExternSync( mAddressBook ,mCurrentSyncDevice, true );
2945 } else { 2945 } else {
2946 external = !manager->mIsKapiFile; 2946 external = !manager->mIsKapiFile;
2947 if ( external ) { 2947 if ( external ) {
2948 qDebug("Setting vcf mode to external "); 2948 qDebug("Setting vcf mode to external ");
2949 mGlobalSyncMode = SYNC_MODE_EXTERNAL; 2949 mGlobalSyncMode = SYNC_MODE_EXTERNAL;
2950 AddressBook::Iterator it; 2950 AddressBook::Iterator it;
2951 for ( it = abLocal.begin(); it != abLocal.end(); ++it ) { 2951 for ( it = abLocal.begin(); it != abLocal.end(); ++it ) {
2952 (*it).setID( mCurrentSyncDevice, (*it).uid() ); 2952 (*it).setID( mCurrentSyncDevice, (*it).uid() );
2953 (*it).computeCsum( mCurrentSyncDevice ); 2953 (*it).computeCsum( mCurrentSyncDevice );
2954 } 2954 }
2955 } 2955 }
2956 } 2956 }
2957 //AddressBook::Iterator it; 2957 //AddressBook::Iterator it;
2958 //QStringList vcards; 2958 //QStringList vcards;
2959 //for ( it = abLocal.begin(); it != abLocal.end(); ++it ) { 2959 //for ( it = abLocal.begin(); it != abLocal.end(); ++it ) {
2960 // qDebug("Name %s ", (*it).familyName().latin1()); 2960 // qDebug("Name %s ", (*it).familyName().latin1());
2961 //} 2961 //}
2962 syncOK = synchronizeAddressbooks( mAddressBook, &abLocal, mode ); 2962 syncOK = synchronizeAddressbooks( mAddressBook, &abLocal, mode );
2963 if ( syncOK ) { 2963 if ( syncOK ) {
2964 if ( syncManager->mWriteBackFile ) 2964 if ( syncManager->mWriteBackFile )
2965 { 2965 {
2966 if ( external ) 2966 if ( external )
2967 abLocal.removeSyncAddressees( !isXML); 2967 abLocal.removeSyncAddressees( !isXML);
2968 qDebug("Saving remote AB "); 2968 qDebug("Saving remote AB ");
2969 if ( ! abLocal.saveAB()) 2969 if ( ! abLocal.saveAB())
2970 qDebug("Error writing back AB to file "); 2970 qDebug("Error writing back AB to file ");
2971 if ( external ) { 2971 if ( external ) {
2972 // afterwrite processing 2972 // afterwrite processing
2973 abLocal.postExternSync( mAddressBook,mCurrentSyncDevice ,isXML); 2973 abLocal.postExternSync( mAddressBook,mCurrentSyncDevice ,isXML);
2974 } 2974 }
2975 } 2975 }
2976 } 2976 }
2977 setModified(); 2977 setModified();
2978 2978
2979 } 2979 }
2980 abLocal.removeResources(); 2980 abLocal.removeResources();
2981 if ( syncOK ) 2981 if ( syncOK )
2982 mViewManager->refreshView(); 2982 mViewManager->refreshView();
2983 return syncOK; 2983 return syncOK;
2984 2984
2985} 2985}
2986void KABCore::removeSyncInfo( QString syncProfile) 2986void KABCore::removeSyncInfo( QString syncProfile)
2987{ 2987{
2988 qDebug("AB:removeSyncInfo for profile %s ", syncProfile.latin1()); 2988 qDebug("AB:removeSyncInfo for profile %s ", syncProfile.latin1());
2989 mAddressBook->removeSyncInfo( syncProfile ); 2989 mAddressBook->removeSyncInfo( syncProfile );
2990 setModified(); 2990 setModified();
2991} 2991}
2992 2992
2993 2993
2994//this is a overwritten callbackmethods from the syncinterface 2994//this is a overwritten callbackmethods from the syncinterface
2995bool KABCore::syncExternal(KSyncManager* manager, QString resource) 2995bool KABCore::syncExternal(KSyncManager* manager, QString resource)
2996{ 2996{
2997 if ( resource == "phone" ) 2997 if ( resource == "phone" )
2998 return syncPhone(); 2998 return syncPhone();
2999 disableBR( true ); 2999 disableBR( true );
3000 QString mCurrentSyncDevice = manager->getCurrentSyncDevice(); 3000 QString mCurrentSyncDevice = manager->getCurrentSyncDevice();
3001 3001
3002 AddressBook abLocal( resource,"syncContact"); 3002 AddressBook abLocal( resource,"syncContact");
3003 bool syncOK = false; 3003 bool syncOK = false;
3004 if ( abLocal.load() ) { 3004 if ( abLocal.load() ) {
3005 qDebug("AB sharp loaded ,sync device %s",mCurrentSyncDevice.latin1()); 3005 qDebug("AB sharp loaded ,sync device %s",mCurrentSyncDevice.latin1());
3006 mGlobalSyncMode = SYNC_MODE_EXTERNAL; 3006 mGlobalSyncMode = SYNC_MODE_EXTERNAL;
3007 abLocal.preExternSync( mAddressBook ,mCurrentSyncDevice, false ); 3007 abLocal.preExternSync( mAddressBook ,mCurrentSyncDevice, false );
3008 syncOK = synchronizeAddressbooks( mAddressBook, &abLocal, syncManager->mSyncAlgoPrefs ); 3008 syncOK = synchronizeAddressbooks( mAddressBook, &abLocal, syncManager->mSyncAlgoPrefs );
3009 if ( syncOK ) { 3009 if ( syncOK ) {
3010 if ( syncManager->mWriteBackFile ) { 3010 if ( syncManager->mWriteBackFile ) {
3011 abLocal.removeSyncAddressees( false ); 3011 abLocal.removeSyncAddressees( false );
3012 abLocal.saveAB(); 3012 abLocal.saveAB();
3013 abLocal.postExternSync( mAddressBook,mCurrentSyncDevice, true ); 3013 abLocal.postExternSync( mAddressBook,mCurrentSyncDevice, true );
3014 } 3014 }
3015 } else 3015 } else
3016 message( i18n("Sync cancelled or failed.") ); 3016 message( i18n("Sync cancelled or failed.") );
3017 setModified(); 3017 setModified();
3018 } 3018 }
3019 abLocal.removeResources(); 3019 abLocal.removeResources();
3020 if ( syncOK ) 3020 if ( syncOK )
3021 mViewManager->refreshView(); 3021 mViewManager->refreshView();
3022 disableBR( false ); 3022 disableBR( false );
3023 return syncOK; 3023 return syncOK;
3024 3024
3025} 3025}
3026void KABCore::message( QString m ) 3026void KABCore::message( QString m )
3027{ 3027{
3028 topLevelWidget()->setCaption( m ); 3028 topLevelWidget()->setCaption( m );
3029 mMessageTimer->start( 15000, true ); 3029 mMessageTimer->start( 15000, true );
3030} 3030}
3031bool KABCore::syncPhone() 3031bool KABCore::syncPhone()
3032{ 3032{
3033 QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice(); 3033 QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice();
3034 QString fileName = getPhoneFile(); 3034 QString fileName = getPhoneFile();
3035 if ( !PhoneAccess::readFromPhone( fileName) ) { 3035 if ( !PhoneAccess::readFromPhone( fileName) ) {
3036 message(i18n("Phone access failed!")); 3036 message(i18n("Phone access failed!"));
3037 return false; 3037 return false;
3038 } 3038 }
3039 AddressBook abLocal( fileName,"syncContact"); 3039 AddressBook abLocal( fileName,"syncContact");
3040 bool syncOK = false; 3040 bool syncOK = false;
3041 { 3041 {
3042 abLocal.importFromFile( fileName ); 3042 abLocal.importFromFile( fileName );
3043 qDebug("AB phone loaded ,sync device %s",mCurrentSyncDevice.latin1()); 3043 qDebug("AB phone loaded ,sync device %s",mCurrentSyncDevice.latin1());
3044 mGlobalSyncMode = SYNC_MODE_EXTERNAL; 3044 mGlobalSyncMode = SYNC_MODE_EXTERNAL;
3045 abLocal.preparePhoneSync( mCurrentSyncDevice, true ); 3045 abLocal.preparePhoneSync( mCurrentSyncDevice, true );
3046 abLocal.preExternSync( mAddressBook ,mCurrentSyncDevice, true ); 3046 abLocal.preExternSync( mAddressBook ,mCurrentSyncDevice, true );
3047 syncOK = synchronizeAddressbooks( mAddressBook, &abLocal, syncManager->mSyncAlgoPrefs ); 3047 syncOK = synchronizeAddressbooks( mAddressBook, &abLocal, syncManager->mSyncAlgoPrefs );
3048 if ( syncOK ) { 3048 if ( syncOK ) {
3049 if ( syncManager->mWriteBackFile ) { 3049 if ( syncManager->mWriteBackFile ) {
3050 abLocal.removeSyncAddressees( true ); 3050 abLocal.removeSyncAddressees( true );
3051 abLocal.saveABphone( fileName ); 3051 abLocal.saveABphone( fileName );
3052 abLocal.findNewExtIds( fileName, mCurrentSyncDevice ); 3052 abLocal.findNewExtIds( fileName, mCurrentSyncDevice );
3053 //abLocal.preparePhoneSync( mCurrentSyncDevice, false ); 3053 //abLocal.preparePhoneSync( mCurrentSyncDevice, false );
3054 abLocal.postExternSync( mAddressBook,mCurrentSyncDevice, true ); 3054 abLocal.postExternSync( mAddressBook,mCurrentSyncDevice, true );
3055 } 3055 }
3056 } 3056 }
3057 setModified(); 3057 setModified();
3058 } 3058 }
3059 abLocal.removeResources(); 3059 abLocal.removeResources();
3060 if ( syncOK ) 3060 if ( syncOK )
3061 mViewManager->refreshView(); 3061 mViewManager->refreshView();
3062 return syncOK; 3062 return syncOK;
3063} 3063}
3064void KABCore::getFile( bool success ) 3064void KABCore::getFile( bool success )
3065{ 3065{
3066 if ( ! success ) { 3066 if ( ! success ) {
3067 message( i18n("Error receiving file. Nothing changed!") ); 3067 message( i18n("Error receiving file. Nothing changed!") );
3068 return; 3068 return;
3069 } 3069 }
3070 int count = mAddressBook->importFromFile( sentSyncFile() , false, true ); 3070 int count = mAddressBook->importFromFile( sentSyncFile() , false, true );
3071 if ( count ) 3071 if ( count )
3072 setModified( true ); 3072 setModified( true );
3073 message( i18n("Pi-Sync successful!") ); 3073 message( i18n("Pi-Sync successful!") );
3074 mViewManager->refreshView(); 3074 mViewManager->refreshView();
3075} 3075}
3076void KABCore::syncFileRequest() 3076void KABCore::syncFileRequest()
3077{ 3077{
3078 if ( KABPrefs::instance()->mPassiveSyncWithDesktop ) { 3078 if ( KABPrefs::instance()->mPassiveSyncWithDesktop ) {
3079 syncManager->slotSyncMenu( 999 ); 3079 syncManager->slotSyncMenu( 999 );
3080 } 3080 }
3081 mAddressBook->export2File( sentSyncFile() ); 3081 mAddressBook->export2File( sentSyncFile() );
3082} 3082}
3083QString KABCore::sentSyncFile() 3083QString KABCore::sentSyncFile()
3084{ 3084{
3085#ifdef DESKTOP_VERSION 3085#ifdef DESKTOP_VERSION
3086 return locateLocal( "tmp", "copysyncab.vcf" ); 3086 return locateLocal( "tmp", "copysyncab.vcf" );
3087#else 3087#else
3088 return QString( "/tmp/copysyncab.vcf" ); 3088 return QString( "/tmp/copysyncab.vcf" );
3089#endif 3089#endif
3090} 3090}
3091 3091
3092void KABCore::setCaptionBack() 3092void KABCore::setCaptionBack()
3093{ 3093{
3094 mMessageTimer->stop(); 3094 mMessageTimer->stop();
3095 topLevelWidget()->setCaption( i18n("KAddressbook/Pi") ); 3095 topLevelWidget()->setCaption( i18n("KAddressbook/Pi") );
3096} 3096}
diff --git a/kaddressbook/views/cardview.cpp b/kaddressbook/views/cardview.cpp
index da552c3..03df444 100644
--- a/kaddressbook/views/cardview.cpp
+++ b/kaddressbook/views/cardview.cpp
@@ -1,974 +1,974 @@
1/* 1/*
2 This file is part of KAddressBook. 2 This file is part of KAddressBook.
3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com> 3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com>
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 18
19 As a special exception, permission is given to link this program 19 As a special exception, permission is given to link this program
20 with any edition of Qt, and distribute the resulting executable, 20 with any edition of Qt, and distribute the resulting executable,
21 without including the source code for Qt in the source distribution. 21 without including the source code for Qt in the source distribution.
22*/ 22*/
23 23
24//BEGIN Includes 24//BEGIN Includes
25#include "cardview.h" 25#include "cardview.h"
26 26
27#include <limits.h> 27#include <limits.h>
28 28
29#include <qpainter.h> 29#include <qpainter.h>
30#include <qtimer.h> 30#include <qtimer.h>
31#include <qdatetime.h> 31#include <qdatetime.h>
32#include <qlabel.h> 32#include <qlabel.h>
33#include <qstyle.h> 33#include <qstyle.h>
34#include <qcursor.h> 34#include <qcursor.h>
35#include <qtooltip.h> 35#include <qtooltip.h>
36 36
37#include "kabprefs.h" 37#include "kabprefs.h"
38#include <kdebug.h> 38#include <kdebug.h>
39#include <kglobalsettings.h> 39#include <kglobalsettings.h>
40//END includes 40//END includes
41 41
42#define MIN_ITEM_WIDTH 80 42#define MIN_ITEM_WIDTH 80
43 43
44//BEGIN Helpers 44//BEGIN Helpers
45////////////////////////////////////// 45//////////////////////////////////////
46// CardViewTip 46// CardViewTip
47class CardViewTip : public QLabel { 47class CardViewTip : public QLabel {
48 public: 48 public:
49 CardViewTip(QWidget *parent=0, const char *name=0) : QLabel( parent, name ) 49 CardViewTip(QWidget *parent=0, const char *name=0) : QLabel( parent, name )
50 { 50 {
51 setPalette( QToolTip::palette() ); 51 setPalette( QToolTip::palette() );
52 setFrameStyle( Panel|Plain ); 52 setFrameStyle( Panel|Plain );
53 setMidLineWidth(0); 53 setMidLineWidth(0);
54 setIndent(1); 54 setIndent(1);
55 } 55 }
56 56
57 ~CardViewTip() {}; 57 ~CardViewTip() {};
58 protected: 58 protected:
59 void leaveEvent( QEvent * ) 59 void leaveEvent( QEvent * )
60 { 60 {
61 hide(); 61 hide();
62 } 62 }
63}; 63};
64 64
65////////////////////////////////////// 65//////////////////////////////////////
66// CardViewItemList 66// CardViewItemList
67 67
68 68
69// 69//
70// Warning: make sure you use findRef() instead of find() to find an 70// Warning: make sure you use findRef() instead of find() to find an
71// item! Only the pointer value is unique in the list. 71// item! Only the pointer value is unique in the list.
72// 72//
73class CardViewItemList : public QPtrList<CardViewItem> 73class CardViewItemList : public QPtrList<CardViewItem>
74{ 74{
75 protected: 75 protected:
76 virtual int compareItems(QPtrCollection::Item item1, 76 virtual int compareItems(QPtrCollection::Item item1,
77 QPtrCollection::Item item2) 77 QPtrCollection::Item item2)
78 { 78 {
79 CardViewItem *cItem1 = (CardViewItem*)item1; 79 CardViewItem *cItem1 = (CardViewItem*)item1;
80 CardViewItem *cItem2 = (CardViewItem*)item2; 80 CardViewItem *cItem2 = (CardViewItem*)item2;
81 81
82 if ( cItem1 == cItem2 ) 82 if ( cItem1 == cItem2 )
83 return 0; 83 return 0;
84 84
85 if ((cItem1 == 0) || (cItem2 == 0)) 85 if ((cItem1 == 0) || (cItem2 == 0))
86 return cItem1 ? -1 : 1; 86 return cItem1 ? -1 : 1;
87 87
88 if (cItem1->caption() < cItem2->caption()) 88 if (cItem1->caption() < cItem2->caption())
89 return -1; 89 return -1;
90 90
91 else if (cItem1->caption() > cItem2->caption()) 91 else if (cItem1->caption() > cItem2->caption())
92 return 1; 92 return 1;
93 93
94 return 0; 94 return 0;
95 } 95 }
96 96
97 private: 97 private:
98 /*int find( const CardViewItem * ) 98 /*int find( const CardViewItem * )
99 { 99 {
100 qDebug("DON'T USE CardViewItemList::find( item )! Use findRef( item )!"); 100 qDebug("DON'T USE CardViewItemList::find( item )! Use findRef( item )!");
101 }*/ 101 }*/
102}; 102};
103 103
104////////////////////////////////////// 104//////////////////////////////////////
105// CardViewSeparator 105// CardViewSeparator
106class CardViewSeparator 106class CardViewSeparator
107{ 107{
108 friend class CardView; 108 friend class CardView;
109 109
110 public: 110 public:
111 CardViewSeparator(CardView *view) 111 CardViewSeparator(CardView *view)
112 : mView(view) 112 : mView(view)
113 { 113 {
114 mRect = QRect(0, 0, view->separatorWidth(), 0); 114 mRect = QRect(0, 0, view->separatorWidth(), 0);
115 } 115 }
116 116
117 ~CardViewSeparator() {} 117 ~CardViewSeparator() {}
118 118
119 void paintSeparator(QPainter *p, QColorGroup &cg) 119 void paintSeparator(QPainter *p, QColorGroup &cg)
120 { 120 {
121 p->fillRect(0, 0, mRect.width(), mRect.height(), 121 p->fillRect(0, 0, mRect.width(), mRect.height(),
122 cg.brush(QColorGroup::Button)); 122 cg.brush(QColorGroup::Button));
123 } 123 }
124 124
125 void repaintSeparator() 125 void repaintSeparator()
126 { 126 {
127 mView->repaintContents(mRect); 127 mView->repaintContents(mRect);
128 } 128 }
129 129
130 private: 130 private:
131 CardView *mView; 131 CardView *mView;
132 QRect mRect; 132 QRect mRect;
133}; 133};
134 134
135//END Helpers 135//END Helpers
136 136
137//BEGIN Private Data 137//BEGIN Private Data
138 138
139class CardViewPrivate 139class CardViewPrivate
140{ 140{
141 public: 141 public:
142 CardViewPrivate() 142 CardViewPrivate()
143 : mSelectionMode( CardView::Multi ), 143 : mSelectionMode( CardView::Multi ),
144 mDrawCardBorder( true ), 144 mDrawCardBorder( true ),
145 mDrawFieldLabels( true ), 145 mDrawFieldLabels( true ),
146 mDrawSeparators( true), 146 mDrawSeparators( true),
147 mSepWidth( 2 ), 147 mSepWidth( 2 ),
148 mShowEmptyFields( false ), 148 mShowEmptyFields( false ),
149 mLayoutDirty( true ), 149 mLayoutDirty( true ),
150 mLastClickOnItem( false ), 150 mLastClickOnItem( false ),
151 mItemMargin( 0 ), 151 mItemMargin( 0 ),
152 mItemSpacing( 10 ), 152 mItemSpacing( 10 ),
153 mItemWidth( 200 ), 153 mItemWidth( 200 ),
154 mMaxFieldLines( INT_MAX ), 154 mMaxFieldLines( INT_MAX ),
155 mCurrentItem( 0L ), 155 mCurrentItem( 0L ),
156 mLastClickPos( QPoint(0, 0) ), 156 mLastClickPos( QPoint(0, 0) ),
157 mResizeAnchor(0),
157 mRubberBandAnchor( 0 ), 158 mRubberBandAnchor( 0 ),
158 mCompText( QString::null ), 159 mCompText( QString::null )
159 mResizeAnchor(0)
160 {}; 160 {};
161 161
162 CardViewItemList mItemList; 162 CardViewItemList mItemList;
163 QPtrList<CardViewSeparator> mSeparatorList; 163 QPtrList<CardViewSeparator> mSeparatorList;
164 QFontMetrics *mFm; 164 QFontMetrics *mFm;
165 QFontMetrics *mBFm; // bold font 165 QFontMetrics *mBFm; // bold font
166 QFont mHeaderFont; // custom header font 166 QFont mHeaderFont; // custom header font
167 CardView::SelectionMode mSelectionMode; 167 CardView::SelectionMode mSelectionMode;
168 bool mDrawCardBorder; 168 bool mDrawCardBorder;
169 bool mDrawFieldLabels; 169 bool mDrawFieldLabels;
170 bool mDrawSeparators; 170 bool mDrawSeparators;
171 int mSepWidth; 171 int mSepWidth;
172 bool mShowEmptyFields; 172 bool mShowEmptyFields;
173 bool mLayoutDirty; 173 bool mLayoutDirty;
174 bool mLastClickOnItem; 174 bool mLastClickOnItem;
175 uint mItemMargin; // internal margin in items 175 uint mItemMargin; // internal margin in items
176 uint mItemSpacing; // spacing between items, column seperators and border 176 uint mItemSpacing; // spacing between items, column seperators and border
177 int mItemWidth; // width of all items 177 int mItemWidth; // width of all items
178 uint mMaxFieldLines; // Max lines to dispaly pr field 178 uint mMaxFieldLines; // Max lines to dispaly pr field
179 CardViewItem *mCurrentItem; 179 CardViewItem *mCurrentItem;
180 QPoint mLastClickPos; 180 QPoint mLastClickPos;
181 QTimer *mTimer; // times out if mouse rests for more than 500 msecs 181 QTimer *mTimer; // times out if mouse rests for more than 500 msecs
182 CardViewTip *mTip; // passed to the item under a resting cursor to display full text 182 CardViewTip *mTip; // passed to the item under a resting cursor to display full text
183 bool mOnSeparator; // set/reset on mouse movement 183 bool mOnSeparator; // set/reset on mouse movement
184 // for resizing by dragging the separators 184 // for resizing by dragging the separators
185 int mResizeAnchor; // uint, ulong? the mouse down separator left 185 int mResizeAnchor; // uint, ulong? the mouse down separator left
186 int mRubberBandAnchor; // for erasing rubber bands 186 int mRubberBandAnchor; // for erasing rubber bands
187 // data used for resizing. 187 // data used for resizing.
188 // as they are beeded by each mouse move while resizing, we store them here, 188 // as they are beeded by each mouse move while resizing, we store them here,
189 // saving 8 calculations in each mouse move. 189 // saving 8 calculations in each mouse move.
190 int colspace; // amount of space between items pr column 190 int colspace; // amount of space between items pr column
191 uint first; // the first col to anchor at for painting rubber bands 191 uint first; // the first col to anchor at for painting rubber bands
192 int firstX; // X position of first in pixel 192 int firstX; // X position of first in pixel
193 int pressed; // the colummn that was pressed on at resizing start 193 int pressed; // the colummn that was pressed on at resizing start
194 int span; // pressed - first 194 int span; // pressed - first
195 // key completion 195 // key completion
196 QString mCompText; // current completion string 196 QString mCompText; // current completion string
197 QDateTime mCompUpdated; // ...was updated at this time 197 QDateTime mCompUpdated; // ...was updated at this time
198}; 198};
199 199
200class CardViewItemPrivate 200class CardViewItemPrivate
201{ 201{
202 public: 202 public:
203 CardViewItemPrivate() : 203 CardViewItemPrivate() :
204 x( 0 ), 204 mSelected( false ),
205 y( 0 ), 205 x( 0 ),
206 mSelected( false ){}; 206 y( 0 ){};
207 207
208 208
209 QString mCaption; 209 QString mCaption;
210 QPtrList< CardViewItem::Field > mFieldList; 210 QPtrList< CardViewItem::Field > mFieldList;
211 bool mSelected; 211 bool mSelected;
212 int x; // horizontal position, set by the view 212 int x; // horizontal position, set by the view
213 int y; // vertical position, set by the view 213 int y; // vertical position, set by the view
214 int maxLabelWidth; // the width of the widest label, according to the view font. 214 int maxLabelWidth; // the width of the widest label, according to the view font.
215 int hcache; // height cache 215 int hcache; // height cache
216}; 216};
217//END Private Data 217//END Private Data
218 218
219//BEGIN CardViewItem 219//BEGIN CardViewItem
220 220
221CardViewItem::CardViewItem(CardView *parent, QString caption) 221CardViewItem::CardViewItem(CardView *parent, QString caption)
222 : d(new CardViewItemPrivate()), mView(parent) 222 : d(new CardViewItemPrivate()), mView(parent)
223{ 223{
224 d->mCaption = caption; 224 d->mCaption = caption;
225 225
226 initialize(); 226 initialize();
227} 227}
228 228
229CardViewItem::~CardViewItem() 229CardViewItem::~CardViewItem()
230{ 230{
231 // Remove ourself from the view 231 // Remove ourself from the view
232 if (mView != 0) 232 if (mView != 0)
233 mView->takeItem(this); 233 mView->takeItem(this);
234 234
235 delete d; 235 delete d;
236 d = 0; 236 d = 0;
237} 237}
238 238
239void CardViewItem::initialize() 239void CardViewItem::initialize()
240{ 240{
241 d->mSelected = false; 241 d->mSelected = false;
242 d->mFieldList.setAutoDelete(true); 242 d->mFieldList.setAutoDelete(true);
243 d->maxLabelWidth = 0; 243 d->maxLabelWidth = 0;
244 d->hcache=0; 244 d->hcache=0;
245 245
246 //calcRect(); 246 //calcRect();
247 247
248 // Add ourself to the view 248 // Add ourself to the view
249 if (mView != 0) 249 if (mView != 0)
250 mView->insertItem(this); 250 mView->insertItem(this);
251} 251}
252 252
253void CardViewItem::paintCard(QPainter *p, QColorGroup &cg) 253void CardViewItem::paintCard(QPainter *p, QColorGroup &cg)
254{ 254{
255 255
256 if (!mView) 256 if (!mView)
257 return; 257 return;
258 258
259 QPen pen; 259 QPen pen;
260 QBrush brush; 260 QBrush brush;
261 QFontMetrics fm = *(mView->d->mFm); 261 QFontMetrics fm = *(mView->d->mFm);
262 QFontMetrics bFm = *(mView->d->mBFm); 262 QFontMetrics bFm = *(mView->d->mBFm);
263 bool drawLabels = mView->d->mDrawFieldLabels; 263 bool drawLabels = mView->d->mDrawFieldLabels;
264 bool drawBorder = mView->d->mDrawCardBorder; 264 bool drawBorder = mView->d->mDrawCardBorder;
265 int mg = mView->itemMargin(); 265 int mg = mView->itemMargin();
266 int w = mView->itemWidth() - (mg*2); 266 int w = mView->itemWidth() - (mg*2);
267 int h = height() - (mg*2); 267 int h = height() - (mg*2);
268 const int colonWidth( fm.width(":") ); 268 const int colonWidth( fm.width(":") );
269 int labelXPos = 2 + mg; 269 int labelXPos = 2 + mg;
270 int labelWidth = QMIN( w/2 - 4 - mg, d->maxLabelWidth + colonWidth + 4 ); 270 int labelWidth = QMIN( w/2 - 4 - mg, d->maxLabelWidth + colonWidth + 4 );
271 int valueXPos = labelWidth + 4 + mg; 271 int valueXPos = labelWidth + 4 + mg;
272 int valueWidth = w - labelWidth - 4 - mg; 272 int valueWidth = w - labelWidth - 4 - mg;
273 273
274 p->setFont( mView->font() ); 274 p->setFont( mView->font() );
275 labelWidth -= colonWidth; // extra space for the colon 275 labelWidth -= colonWidth; // extra space for the colon
276 276
277 if (!drawLabels) 277 if (!drawLabels)
278 { 278 {
279 valueXPos = labelXPos; 279 valueXPos = labelXPos;
280 valueWidth = w - 4; 280 valueWidth = w - 4;
281 } 281 }
282 282
283 // Draw a simple box 283 // Draw a simple box
284 if (isSelected()) 284 if (isSelected())
285 pen = QPen(cg.highlight(), 1); 285 pen = QPen(cg.highlight(), 1);
286 else 286 else
287 pen = QPen(cg.button(), 1); 287 pen = QPen(cg.button(), 1);
288 p->setPen(pen); 288 p->setPen(pen);
289 289
290 // Draw the border - this is only draw if the user asks for it. 290 // Draw the border - this is only draw if the user asks for it.
291 if (drawBorder) 291 if (drawBorder)
292 p->drawRect( mg, mg, w, h ); 292 p->drawRect( mg, mg, w, h );
293 293
294 // set the proper pen color for the caption box 294 // set the proper pen color for the caption box
295 if (isSelected()) 295 if (isSelected())
296 brush = cg.brush(QColorGroup::Highlight); 296 brush = cg.brush(QColorGroup::Highlight);
297 else 297 else
298 brush = cg.brush(QColorGroup::Button); 298 brush = cg.brush(QColorGroup::Button);
299 299
300 p->fillRect(mg, mg, w, 4 + bFm.height(), brush); 300 p->fillRect(mg, mg, w, 4 + bFm.height(), brush);
301 301
302 // Now paint the caption 302 // Now paint the caption
303 p->save(); 303 p->save();
304 QFont bFont = mView->headerFont(); 304 QFont bFont = mView->headerFont();
305 //bFont.setBold(true); 305 //bFont.setBold(true);
306 p->setFont(bFont); 306 p->setFont(bFont);
307 if (isSelected()) 307 if (isSelected())
308 p->setPen(cg.highlightedText()); 308 p->setPen(cg.highlightedText());
309 else 309 else
310 p->setPen(cg.buttonText()); 310 p->setPen(cg.buttonText());
311 p->drawText(2+mg, 2+mg + bFm.ascent()/*bFm.height()*//*-bFm.descent()*//*-bFm.leading()*/, trimString(d->mCaption, w-4, bFm)); 311 p->drawText(2+mg, 2+mg + bFm.ascent()/*bFm.height()*//*-bFm.descent()*//*-bFm.leading()*/, trimString(d->mCaption, w-4, bFm));
312 p->restore(); 312 p->restore();
313 313
314 // Go through the fields and draw them 314 // Go through the fields and draw them
315 QPtrListIterator< CardViewItem::Field > iter(d->mFieldList); 315 QPtrListIterator< CardViewItem::Field > iter(d->mFieldList);
316 QString label, value; 316 QString label, value;
317 int yPos = mg + 4 + bFm.height()/* + 1*/ + fm.height(); // why the + 1 ??? (anders) 317 int yPos = mg + 4 + bFm.height()/* + 1*/ + fm.height(); // why the + 1 ??? (anders)
318 p->setPen(cg.text()); 318 p->setPen(cg.text());
319 319
320 int fh = fm.height(); 320 int fh = fm.height();
321 int cln( 0 ); 321 int cln( 0 );
322 QString tmp; 322 QString tmp;
323 int maxLines = mView->maxFieldLines(); 323 int maxLines = mView->maxFieldLines();
324 for (iter.toFirst(); iter.current(); ++iter) 324 for (iter.toFirst(); iter.current(); ++iter)
325 { 325 {
326 value = (*iter)->second; 326 value = (*iter)->second;
327 if ( value.isEmpty() && ! mView->d->mShowEmptyFields ) 327 if ( value.isEmpty() && ! mView->d->mShowEmptyFields )
328 continue; 328 continue;
329 329
330 if (drawLabels) 330 if (drawLabels)
331 { 331 {
332 label = trimString((*iter)->first, labelWidth, fm); 332 label = trimString((*iter)->first, labelWidth, fm);
333 p->drawText(labelXPos, yPos, label + ":"); 333 p->drawText(labelXPos, yPos, label + ":");
334 } 334 }
335/* US original 335/* US original
336 for (cln=0; cln <= maxLines; cln++) 336 for (cln=0; cln <= maxLines; cln++)
337 { 337 {
338 tmp = value.section('\n',cln,cln); 338 tmp = value.section('\n',cln,cln);
339 if ( !tmp.isEmpty() ) p->drawText( valueXPos, yPos + cln*fh, trimString( tmp, valueWidth, fm ) ); 339 if ( !tmp.isEmpty() ) p->drawText( valueXPos, yPos + cln*fh, trimString( tmp, valueWidth, fm ) );
340 else break; 340 else break;
341 } 341 }
342*/ 342*/
343 343
344//US new implementation 344//US new implementation
345 QStringList strlst = QStringList::split('\n', value, true); 345 QStringList strlst = QStringList::split('\n', value, true);
346 346
347 for (cln=0; cln <= maxLines && cln <= (int)strlst.count(); cln++) 347 for (cln=0; cln <= maxLines && cln <= (int)strlst.count(); cln++)
348 { 348 {
349 tmp = strlst[cln]; 349 tmp = strlst[cln];
350 350
351 if ( !tmp.isEmpty() ) 351 if ( !tmp.isEmpty() )
352 p->drawText( valueXPos, yPos + cln*fh, trimString( tmp, valueWidth, fm ) ); 352 p->drawText( valueXPos, yPos + cln*fh, trimString( tmp, valueWidth, fm ) );
353 else 353 else
354 break; 354 break;
355 355
356 } 356 }
357 357
358 if ( cln == 0 ) cln = 1; 358 if ( cln == 0 ) cln = 1;
359 yPos += cln * fh + 2; 359 yPos += cln * fh + 2;
360 } 360 }
361 361
362 // if we are the current item and the view has focus, draw focus rect 362 // if we are the current item and the view has focus, draw focus rect
363 if ( mView->currentItem() == this && mView->hasFocus() ) 363 if ( mView->currentItem() == this && mView->hasFocus() )
364 { 364 {
365/*US 365/*US
366 mView->style().drawPrimitive( QStyle::PE_FocusRect, p, 366 mView->style().drawPrimitive( QStyle::PE_FocusRect, p,
367 QRect(0, 0, mView->itemWidth(), h+(2*mg)), cg, 367 QRect(0, 0, mView->itemWidth(), h+(2*mg)), cg,
368 QStyle::Style_FocusAtBorder, 368 QStyle::Style_FocusAtBorder,
369 QStyleOption( isSelected() ? cg.highlight() : cg.base() ) ); 369 QStyleOption( isSelected() ? cg.highlight() : cg.base() ) );
370*/ 370*/
371 371
372 const QColor pHighl = isSelected() ? cg.highlight() : cg.base(); 372 const QColor pHighl = isSelected() ? cg.highlight() : cg.base();
373 const QRect r(0, 0, mView->itemWidth(), h+(2*mg)); 373 const QRect r(0, 0, mView->itemWidth(), h+(2*mg));
374#ifndef DESKTOP_VERSION 374#ifndef DESKTOP_VERSION
375 mView->style().drawFocusRect(p, r, cg, &pHighl, true); 375 mView->style().drawFocusRect(p, r, cg, &pHighl, true);
376#endif 376#endif
377 } 377 }
378} 378}
379 379
380const QString &CardViewItem::caption() const 380const QString &CardViewItem::caption() const
381{ 381{
382 return d->mCaption; 382 return d->mCaption;
383} 383}
384 384
385 385
386int CardViewItem::height( bool allowCache ) const 386int CardViewItem::height( bool allowCache ) const
387{ 387{
388 // use cache 388 // use cache
389 if ( allowCache && d->hcache ) 389 if ( allowCache && d->hcache )
390 return d->hcache; 390 return d->hcache;
391 391
392 // Base height: 392 // Base height:
393 // 2 for line width 393 // 2 for line width
394 // 2 for top caption pad 394 // 2 for top caption pad
395 // 2 for bottom caption pad 395 // 2 for bottom caption pad
396 // 2 pad for the end 396 // 2 pad for the end
397 // + 2 times the advised margin 397 // + 2 times the advised margin
398 int baseHeight = 8 + ( 2 * mView->itemMargin() ); 398 int baseHeight = 8 + ( 2 * mView->itemMargin() );
399 399
400 // size of font for each field 400 // size of font for each field
401 // 2 pad for each field 401 // 2 pad for each field
402 402
403 // anders: if the view does not show empty fields, check for value 403 // anders: if the view does not show empty fields, check for value
404 bool sef = mView->showEmptyFields(); 404 bool sef = mView->showEmptyFields();
405 int fh = mView->d->mFm->height();//lineSpacing(); // font height 405 int fh = mView->d->mFm->height();//lineSpacing(); // font height
406 //int sp = QMAX( 0, 2- mView->d->mFm->leading() ); // field spacing NOTE make a property 406 //int sp = QMAX( 0, 2- mView->d->mFm->leading() ); // field spacing NOTE make a property
407 int fieldHeight = 0; 407 int fieldHeight = 0;
408 int lines; 408 int lines;
409 int maxLines( mView->maxFieldLines() ); 409 int maxLines( mView->maxFieldLines() );
410 QPtrListIterator< CardViewItem::Field > iter(d->mFieldList); 410 QPtrListIterator< CardViewItem::Field > iter(d->mFieldList);
411 for (iter.toFirst(); iter.current(); ++iter) 411 for (iter.toFirst(); iter.current(); ++iter)
412 { 412 {
413 if ( !sef && (*iter)->second.isEmpty() ) 413 if ( !sef && (*iter)->second.isEmpty() )
414 continue; 414 continue;
415 lines = QMIN( (*iter)->second.contains('\n') + 1, maxLines ); 415 lines = QMIN( (*iter)->second.contains('\n') + 1, maxLines );
416 fieldHeight += ( lines * fh ) + 2;//sp; 416 fieldHeight += ( lines * fh ) + 2;//sp;
417 } 417 }
418 418
419 // height of caption font (bold) 419 // height of caption font (bold)
420 fieldHeight += mView->d->mBFm->height(); 420 fieldHeight += mView->d->mBFm->height();
421 d->hcache = baseHeight + fieldHeight; 421 d->hcache = baseHeight + fieldHeight;
422 return d->hcache; 422 return d->hcache;
423} 423}
424 424
425bool CardViewItem::isSelected() const 425bool CardViewItem::isSelected() const
426{ 426{
427 return d->mSelected; 427 return d->mSelected;
428} 428}
429 429
430void CardViewItem::setSelected(bool selected) 430void CardViewItem::setSelected(bool selected)
431{ 431{
432 d->mSelected = selected; 432 d->mSelected = selected;
433} 433}
434 434
435void CardViewItem::insertField(const QString &label, const QString &value) 435void CardViewItem::insertField(const QString &label, const QString &value)
436{ 436{
437 CardViewItem::Field *f = new CardViewItem::Field(label, value); 437 CardViewItem::Field *f = new CardViewItem::Field(label, value);
438 d->mFieldList.append(f); 438 d->mFieldList.append(f);
439 d->hcache=0; 439 d->hcache=0;
440 440
441 if (mView) 441 if (mView)
442 { 442 {
443 mView->setLayoutDirty(true); 443 mView->setLayoutDirty(true);
444 d->maxLabelWidth = QMAX( mView->d->mFm->width( label ), d->maxLabelWidth ); 444 d->maxLabelWidth = QMAX( mView->d->mFm->width( label ), d->maxLabelWidth );
445 } 445 }
446} 446}
447 447
448void CardViewItem::removeField(const QString &label) 448void CardViewItem::removeField(const QString &label)
449{ 449{
450 CardViewItem::Field *f; 450 CardViewItem::Field *f;
451 451
452 QPtrListIterator< CardViewItem::Field > iter(d->mFieldList); 452 QPtrListIterator< CardViewItem::Field > iter(d->mFieldList);
453 for (iter.toFirst(); iter.current(); ++iter) 453 for (iter.toFirst(); iter.current(); ++iter)
454 { 454 {
455 f = *iter; 455 f = *iter;
456 if (f->first == label) 456 if (f->first == label)
457 break; 457 break;
458 } 458 }
459 459
460 if (*iter) 460 if (*iter)
461 d->mFieldList.remove(*iter); 461 d->mFieldList.remove(*iter);
462 d->hcache = 0; 462 d->hcache = 0;
463 463
464 if (mView) 464 if (mView)
465 mView->setLayoutDirty(true); 465 mView->setLayoutDirty(true);
466} 466}
467 467
468void CardViewItem::clearFields() 468void CardViewItem::clearFields()
469{ 469{
470 d->mFieldList.clear(); 470 d->mFieldList.clear();
471 d->hcache = 0; 471 d->hcache = 0;
472 472
473 if (mView) 473 if (mView)
474 mView->setLayoutDirty(true); 474 mView->setLayoutDirty(true);
475} 475}
476 476
477QString CardViewItem::trimString(const QString &text, int width, 477QString CardViewItem::trimString(const QString &text, int width,
478 QFontMetrics &fm) 478 QFontMetrics &fm)
479{ 479{
480 if (fm.width(text) <= width) 480 if (fm.width(text) <= width)
481 return text; 481 return text;
482 482
483 QString dots = "..."; 483 QString dots = "...";
484 int dotWidth = fm.width(dots); 484 int dotWidth = fm.width(dots);
485 QString trimmed; 485 QString trimmed;
486 int charNum = 0; 486 int charNum = 0;
487 487
488 while (fm.width(trimmed) + dotWidth < width) 488 while (fm.width(trimmed) + dotWidth < width)
489 { 489 {
490 trimmed += text[charNum]; 490 trimmed += text[charNum];
491 charNum++; 491 charNum++;
492 } 492 }
493 493
494 // Now trim the last char, since it put the width over the top 494 // Now trim the last char, since it put the width over the top
495 trimmed = trimmed.left(trimmed.length()-1); 495 trimmed = trimmed.left(trimmed.length()-1);
496 trimmed += dots; 496 trimmed += dots;
497 497
498 return trimmed; 498 return trimmed;
499} 499}
500 500
501CardViewItem *CardViewItem::nextItem() 501CardViewItem *CardViewItem::nextItem()
502{ 502{
503 CardViewItem *item = 0; 503 CardViewItem *item = 0;
504 504
505 if (mView) 505 if (mView)
506 item = mView->itemAfter(this); 506 item = mView->itemAfter(this);
507 507
508 return item; 508 return item;
509} 509}
510 510
511void CardViewItem::repaintCard() 511void CardViewItem::repaintCard()
512{ 512{
513 if (mView) 513 if (mView)
514 mView->repaintItem(this); 514 mView->repaintItem(this);
515} 515}
516 516
517void CardViewItem::setCaption(const QString &caption) 517void CardViewItem::setCaption(const QString &caption)
518{ 518{
519 d->mCaption = caption; 519 d->mCaption = caption;
520 repaintCard(); 520 repaintCard();
521} 521}
522 522
523QString CardViewItem::fieldValue(const QString &label) 523QString CardViewItem::fieldValue(const QString &label)
524{ 524{
525 QPtrListIterator< CardViewItem::Field > iter(d->mFieldList); 525 QPtrListIterator< CardViewItem::Field > iter(d->mFieldList);
526 for (iter.toFirst(); iter.current(); ++iter) 526 for (iter.toFirst(); iter.current(); ++iter)
527 if ((*iter)->first == label) 527 if ((*iter)->first == label)
528 return (*iter)->second; 528 return (*iter)->second;
529 529
530 return QString(); 530 return QString();
531} 531}
532 532
533 533
534void CardViewItem::showFullString( const QPoint &itempos, CardViewTip *tip ) 534void CardViewItem::showFullString( const QPoint &itempos, CardViewTip *tip )
535{ 535{
536 bool trimmed( false ); 536 bool trimmed( false );
537 QString s; 537 QString s;
538 int mrg = mView->itemMargin(); 538 int mrg = mView->itemMargin();
539 int y = mView->d->mBFm->height() + 6 + mrg; 539 int y = mView->d->mBFm->height() + 6 + mrg;
540 int w = mView->itemWidth() - (2*mrg); 540 int w = mView->itemWidth() - (2*mrg);
541 int lw; 541 int lw;
542 bool drawLabels = mView->drawFieldLabels(); 542 bool drawLabels = mView->drawFieldLabels();
543 bool isLabel = drawLabels && itempos.x() < w/2 ? true : false; 543 bool isLabel = drawLabels && itempos.x() < w/2 ? true : false;
544 544
545 if ( itempos.y() < y ) 545 if ( itempos.y() < y )
546 { 546 {
547 if ( itempos.y() < 8 + mrg || itempos.y() > y - 4 ) 547 if ( itempos.y() < 8 + mrg || itempos.y() > y - 4 )
548 return; 548 return;
549 // this is the caption 549 // this is the caption
550 s = caption(); 550 s = caption();
551 trimmed = mView->d->mBFm->width( s ) > w - 4; 551 trimmed = mView->d->mBFm->width( s ) > w - 4;
552 y = 2 + mrg; 552 y = 2 + mrg;
553 lw = 0; 553 lw = 0;
554 isLabel=true; 554 isLabel=true;
555 } else { 555 } else {
556 // find the field 556 // find the field
557 Field *f = fieldAt( itempos ); 557 Field *f = fieldAt( itempos );
558 if ( !f || ( !mView->showEmptyFields() && f->second.isEmpty() ) ) 558 if ( !f || ( !mView->showEmptyFields() && f->second.isEmpty() ) )
559 return; 559 return;
560 560
561 // y position: 561 // y position:
562 // header font height + 4px hader margin + 2px leading + item margin 562 // header font height + 4px hader margin + 2px leading + item margin
563 // + actual field index * (fontheight + 2px leading) 563 // + actual field index * (fontheight + 2px leading)
564 int maxLines = mView->maxFieldLines(); 564 int maxLines = mView->maxFieldLines();
565 bool se = mView->showEmptyFields(); 565 bool se = mView->showEmptyFields();
566 int fh = mView->d->mFm->height(); 566 int fh = mView->d->mFm->height();
567// { 567// {
568 Field *_f; 568 Field *_f;
569 for (_f = d->mFieldList.first(); _f != f; _f = d->mFieldList.next()) 569 for (_f = d->mFieldList.first(); _f != f; _f = d->mFieldList.next())
570 if ( se || ! _f->second.isEmpty() ) 570 if ( se || ! _f->second.isEmpty() )
571 y += ( QMIN(_f->second.contains('\n')+1, maxLines) * fh ) + 2; 571 y += ( QMIN(_f->second.contains('\n')+1, maxLines) * fh ) + 2;
572// } 572// }
573 if ( isLabel && itempos.y() > y + fh ) 573 if ( isLabel && itempos.y() > y + fh )
574 return; 574 return;
575 // label or data? 575 // label or data?
576 s = isLabel ? f->first : f->second; 576 s = isLabel ? f->first : f->second;
577 // trimmed? 577 // trimmed?
578 int colonWidth = mView->d->mFm->width(":"); 578 int colonWidth = mView->d->mFm->width(":");
579 lw = drawLabels ? // label width 579 lw = drawLabels ? // label width
580 QMIN( w/2 - 4 - mrg, d->maxLabelWidth + colonWidth + 4 ) : 580 QMIN( w/2 - 4 - mrg, d->maxLabelWidth + colonWidth + 4 ) :
581 0; 581 0;
582 int mw = isLabel ? lw - colonWidth : w - lw - (mrg*2); // max width for string 582 int mw = isLabel ? lw - colonWidth : w - lw - (mrg*2); // max width for string
583 if ( isLabel ) 583 if ( isLabel )
584 { 584 {
585 trimmed = mView->d->mFm->width( s ) > mw - colonWidth; 585 trimmed = mView->d->mFm->width( s ) > mw - colonWidth;
586 } else { 586 } else {
587 QRect r( mView->d->mFm->boundingRect( 0, 0, INT_MAX, INT_MAX, Qt::AlignTop|Qt::AlignLeft, s ) ); 587 QRect r( mView->d->mFm->boundingRect( 0, 0, INT_MAX, INT_MAX, Qt::AlignTop|Qt::AlignLeft, s ) );
588 trimmed = r.width() > mw || r.height()/fh > QMIN(s.contains('\n') + 1, maxLines); 588 trimmed = r.width() > mw || r.height()/fh > QMIN(s.contains('\n') + 1, maxLines);
589 } 589 }
590 } 590 }
591 if ( trimmed ) 591 if ( trimmed )
592 { 592 {
593 tip->setFont( (isLabel && !lw) ? mView->headerFont() : mView->font() ); // if condition is true, a header 593 tip->setFont( (isLabel && !lw) ? mView->headerFont() : mView->font() ); // if condition is true, a header
594 tip->setText( s ); 594 tip->setText( s );
595 tip->adjustSize(); 595 tip->adjustSize();
596 // find a proper position 596 // find a proper position
597 int lx; 597 int lx;
598 lx = isLabel || !drawLabels ? mrg : lw + mrg + 2 /*-1*/; 598 lx = isLabel || !drawLabels ? mrg : lw + mrg + 2 /*-1*/;
599 QPoint pnt(mView->contentsToViewport( QPoint(d->x, d->y) )); 599 QPoint pnt(mView->contentsToViewport( QPoint(d->x, d->y) ));
600 pnt += QPoint(lx, y); 600 pnt += QPoint(lx, y);
601 if ( pnt.x() < 0 ) 601 if ( pnt.x() < 0 )
602 pnt.setX( 0 ); 602 pnt.setX( 0 );
603 if ( pnt.x() + tip->width() > mView->visibleWidth() ) 603 if ( pnt.x() + tip->width() > mView->visibleWidth() )
604 pnt.setX( mView->visibleWidth() - tip->width() ); 604 pnt.setX( mView->visibleWidth() - tip->width() );
605 if ( pnt.y() + tip->height() > mView->visibleHeight() ) 605 if ( pnt.y() + tip->height() > mView->visibleHeight() )
606 pnt.setY( QMAX( 0, mView->visibleHeight() - tip->height() ) ); 606 pnt.setY( QMAX( 0, mView->visibleHeight() - tip->height() ) );
607 // show 607 // show
608 tip->move( pnt ); 608 tip->move( pnt );
609 tip->show(); 609 tip->show();
610 } 610 }
611} 611}
612 612
613CardViewItem::Field *CardViewItem::fieldAt( const QPoint & itempos ) const 613CardViewItem::Field *CardViewItem::fieldAt( const QPoint & itempos ) const
614{ 614{
615 int ypos = mView->d->mBFm->height() + 7 + mView->d->mItemMargin; 615 int ypos = mView->d->mBFm->height() + 7 + mView->d->mItemMargin;
616 int iy = itempos.y(); 616 int iy = itempos.y();
617 // skip below caption 617 // skip below caption
618 if ( iy <= ypos ) 618 if ( iy <= ypos )
619 return 0; 619 return 0;
620 // try find a field 620 // try find a field
621 bool showEmpty = mView->showEmptyFields(); 621 bool showEmpty = mView->showEmptyFields();
622 int fh = mView->d->mFm->height(); 622 int fh = mView->d->mFm->height();
623 int maxLines = mView->maxFieldLines(); 623 int maxLines = mView->maxFieldLines();
624 Field *f; 624 Field *f;
625 for ( f = d->mFieldList.first(); f; f = d->mFieldList.next() ) 625 for ( f = d->mFieldList.first(); f; f = d->mFieldList.next() )
626 { 626 {
627 if ( showEmpty || !f->second.isEmpty() ) 627 if ( showEmpty || !f->second.isEmpty() )
628 ypos += ( QMIN( f->second.contains('\n')+1, maxLines ) *fh)+2; 628 ypos += ( QMIN( f->second.contains('\n')+1, maxLines ) *fh)+2;
629 if ( iy <= ypos ) 629 if ( iy <= ypos )
630 break; 630 break;
631 } 631 }
632 return f ? f : 0; 632 return f ? f : 0;
633} 633}
634//END CardViewItem 634//END CardViewItem
635 635
636//BEGIN CardView 636//BEGIN CardView
637 637
638CardView::CardView(QWidget *parent, const char *name) 638CardView::CardView(QWidget *parent, const char *name)
639 : QScrollView(parent, name), 639 : QScrollView(parent, name),
640 d(new CardViewPrivate()) 640 d(new CardViewPrivate())
641{ 641{
642 d->mItemList.setAutoDelete(true); 642 d->mItemList.setAutoDelete(true);
643 d->mSeparatorList.setAutoDelete(true); 643 d->mSeparatorList.setAutoDelete(true);
644 644
645 QFont f = font(); 645 QFont f = font();
646 d->mFm = new QFontMetrics(f); 646 d->mFm = new QFontMetrics(f);
647 f.setBold(true); 647 f.setBold(true);
648 d->mHeaderFont = f; 648 d->mHeaderFont = f;
649 d->mBFm = new QFontMetrics(f); 649 d->mBFm = new QFontMetrics(f);
650 d->mTip = ( new CardViewTip( viewport() ) ), 650 d->mTip = ( new CardViewTip( viewport() ) ),
651 d->mTip->hide(); 651 d->mTip->hide();
652 d->mTimer = ( new QTimer(this, "mouseTimer") ), 652 d->mTimer = ( new QTimer(this, "mouseTimer") ),
653 653
654 viewport()->setMouseTracking( true ); 654 viewport()->setMouseTracking( true );
655 viewport()->setFocusProxy(this); 655 viewport()->setFocusProxy(this);
656 viewport()->setFocusPolicy(WheelFocus); 656 viewport()->setFocusPolicy(WheelFocus);
657 viewport()->setBackgroundMode(PaletteBase); 657 viewport()->setBackgroundMode(PaletteBase);
658 658
659 connect( d->mTimer, SIGNAL(timeout()), this, SLOT(tryShowFullText()) ); 659 connect( d->mTimer, SIGNAL(timeout()), this, SLOT(tryShowFullText()) );
660 660
661//US setBackgroundMode(PaletteBackground, PaletteBase); 661//US setBackgroundMode(PaletteBackground, PaletteBase);
662 setBackgroundMode(PaletteBackground); 662 setBackgroundMode(PaletteBackground);
663 663
664 // no reason for a vertical scrollbar 664 // no reason for a vertical scrollbar
665 setVScrollBarMode(AlwaysOff); 665 setVScrollBarMode(AlwaysOff);
666} 666}
667 667
668CardView::~CardView() 668CardView::~CardView()
669{ 669{
670 delete d->mFm; 670 delete d->mFm;
671 delete d->mBFm; 671 delete d->mBFm;
672 delete d; 672 delete d;
673 d = 0; 673 d = 0;
674} 674}
675 675
676void CardView::insertItem(CardViewItem *item) 676void CardView::insertItem(CardViewItem *item)
677{ 677{
678 d->mItemList.inSort(item); 678 d->mItemList.inSort(item);
679 setLayoutDirty(true); 679 setLayoutDirty(true);
680} 680}
681 681
682void CardView::takeItem(CardViewItem *item) 682void CardView::takeItem(CardViewItem *item)
683{ 683{
684 if ( d->mCurrentItem == item ) 684 if ( d->mCurrentItem == item )
685 d->mCurrentItem = item->nextItem(); 685 d->mCurrentItem = item->nextItem();
686 d->mItemList.take(d->mItemList.findRef(item)); 686 d->mItemList.take(d->mItemList.findRef(item));
687 687
688 setLayoutDirty(true); 688 setLayoutDirty(true);
689} 689}
690 690
691void CardView::clear() 691void CardView::clear()
692{ 692{
693 d->mItemList.clear(); 693 d->mItemList.clear();
694 694
695 setLayoutDirty(true); 695 setLayoutDirty(true);
696} 696}
697 697
698CardViewItem *CardView::currentItem() 698CardViewItem *CardView::currentItem()
699{ 699{
700 if ( ! d->mCurrentItem && d->mItemList.count() ) 700 if ( ! d->mCurrentItem && d->mItemList.count() )
701 d->mCurrentItem = d->mItemList.first(); 701 d->mCurrentItem = d->mItemList.first();
702 return d->mCurrentItem; 702 return d->mCurrentItem;
703} 703}
704 704
705void CardView::setCurrentItem( CardViewItem *item ) 705void CardView::setCurrentItem( CardViewItem *item )
706{ 706{
707 if ( !item ) 707 if ( !item )
708 return; 708 return;
709 else if ( item->cardView() != this ) 709 else if ( item->cardView() != this )
710 { 710 {
711 kdDebug(5720)<<"CardView::setCurrentItem: Item ("<<item<<") not owned! Backing out.."<<endl; 711 kdDebug(5720)<<"CardView::setCurrentItem: Item ("<<item<<") not owned! Backing out.."<<endl;
712 return; 712 return;
713 } 713 }
714 else if ( item == currentItem() ) 714 else if ( item == currentItem() )
715 { 715 {
716 return; 716 return;
717 } 717 }
718 718
719 if ( d->mSelectionMode == Single ) 719 if ( d->mSelectionMode == Single )
720 { 720 {
721 setSelected( item, true ); 721 setSelected( item, true );
722 } 722 }
723 else 723 else
724 { 724 {
725 CardViewItem *it = d->mCurrentItem; 725 CardViewItem *it = d->mCurrentItem;
726 d->mCurrentItem = item; 726 d->mCurrentItem = item;
727 if ( it ) 727 if ( it )
728 it->repaintCard(); 728 it->repaintCard();
729 item->repaintCard(); 729 item->repaintCard();
730 } 730 }
731 if ( ! d->mOnSeparator ) 731 if ( ! d->mOnSeparator )
732 ensureItemVisible( item ); 732 ensureItemVisible( item );
733 emit currentChanged( item ); 733 emit currentChanged( item );
734} 734}
735 735
736CardViewItem *CardView::itemAt(const QPoint &viewPos) 736CardViewItem *CardView::itemAt(const QPoint &viewPos)
737{ 737{
738 CardViewItem *item = 0; 738 CardViewItem *item = 0;
739 QPtrListIterator<CardViewItem> iter(d->mItemList); 739 QPtrListIterator<CardViewItem> iter(d->mItemList);
740 bool found = false; 740 bool found = false;
741 for (iter.toFirst(); iter.current() && !found; ++iter) 741 for (iter.toFirst(); iter.current() && !found; ++iter)
742 { 742 {
743 item = *iter; 743 item = *iter;
744 //if (item->d->mRect.contains(viewPos)) 744 //if (item->d->mRect.contains(viewPos))
745 if (QRect(item->d->x, item->d->y, d->mItemWidth, item->height()).contains(viewPos)) 745 if (QRect(item->d->x, item->d->y, d->mItemWidth, item->height()).contains(viewPos))
746 found = true; 746 found = true;
747 } 747 }
748 748
749 if (found) 749 if (found)
750 return item; 750 return item;
751 751
752 return 0; 752 return 0;
753} 753}
754 754
755QRect CardView::itemRect(const CardViewItem *item) 755QRect CardView::itemRect(const CardViewItem *item)
756{ 756{
757 //return item->d->mRect; 757 //return item->d->mRect;
758 return QRect(item->d->x, item->d->y, d->mItemWidth, item->height()); 758 return QRect(item->d->x, item->d->y, d->mItemWidth, item->height());
759} 759}
760 760
761void CardView::ensureItemVisible(const CardViewItem *item) 761void CardView::ensureItemVisible(const CardViewItem *item)
762{ 762{
763 ensureVisible(item->d->x , item->d->y, d->mItemSpacing, 0); 763 ensureVisible(item->d->x , item->d->y, d->mItemSpacing, 0);
764 ensureVisible(item->d->x + d->mItemWidth, item->d->y, d->mItemSpacing, 0); 764 ensureVisible(item->d->x + d->mItemWidth, item->d->y, d->mItemSpacing, 0);
765} 765}
766 766
767void CardView::repaintItem(const CardViewItem *item) 767void CardView::repaintItem(const CardViewItem *item)
768{ 768{
769 //repaintContents(item->d->mRect); 769 //repaintContents(item->d->mRect);
770 repaintContents( QRect(item->d->x, item->d->y, d->mItemWidth, item->height()) ); 770 repaintContents( QRect(item->d->x, item->d->y, d->mItemWidth, item->height()) );
771} 771}
772 772
773void CardView::setSelectionMode(CardView::SelectionMode mode) 773void CardView::setSelectionMode(CardView::SelectionMode mode)
774{ 774{
775 selectAll(false); 775 selectAll(false);
776 776
777 d->mSelectionMode = mode; 777 d->mSelectionMode = mode;
778} 778}
779 779
780CardView::SelectionMode CardView::selectionMode() const 780CardView::SelectionMode CardView::selectionMode() const
781{ 781{
782 return d->mSelectionMode; 782 return d->mSelectionMode;
783} 783}
784 784
785void CardView::selectAll(bool state) 785void CardView::selectAll(bool state)
786{ 786{
787 QPtrListIterator<CardViewItem> iter(d->mItemList); 787 QPtrListIterator<CardViewItem> iter(d->mItemList);
788 if (!state) 788 if (!state)
789 { 789 {
790 for (iter.toFirst(); iter.current(); ++iter) 790 for (iter.toFirst(); iter.current(); ++iter)
791 { 791 {
792 if ((*iter)->isSelected()) 792 if ((*iter)->isSelected())
793 { 793 {
794 (*iter)->setSelected(false); 794 (*iter)->setSelected(false);
795 (*iter)->repaintCard(); 795 (*iter)->repaintCard();
796 } 796 }
797 } 797 }
798 //emit selectionChanged(); // WARNING FIXME 798 //emit selectionChanged(); // WARNING FIXME
799 emit selectionChanged(0); 799 emit selectionChanged(0);
800 } 800 }
801 else if (d->mSelectionMode != CardView::Single) 801 else if (d->mSelectionMode != CardView::Single)
802 { 802 {
803 for (iter.toFirst(); iter.current(); ++iter) 803 for (iter.toFirst(); iter.current(); ++iter)
804 { 804 {
805 (*iter)->setSelected(true); 805 (*iter)->setSelected(true);
806 } 806 }
807 807
808 if (d->mItemList.count() > 0) 808 if (d->mItemList.count() > 0)
809 { 809 {
810 // emit, since there must have been at least one selected 810 // emit, since there must have been at least one selected
811 emit selectionChanged(); 811 emit selectionChanged();
812 //repaint();//??? 812 //repaint();//???
813 viewport()->update(); 813 viewport()->update();
814 } 814 }
815 } 815 }
816} 816}
817 817
818void CardView::setSelected(CardViewItem *item, bool selected) 818void CardView::setSelected(CardViewItem *item, bool selected)
819{ 819{
820 if ((item == 0) || (item->isSelected() == selected)) 820 if ((item == 0) || (item->isSelected() == selected))
821 return; 821 return;
822 822
823 if ( selected && d->mCurrentItem != item ) 823 if ( selected && d->mCurrentItem != item )
824 { 824 {
825 CardViewItem *it = d->mCurrentItem; 825 CardViewItem *it = d->mCurrentItem;
826 d->mCurrentItem = item; 826 d->mCurrentItem = item;
827 if ( it ) 827 if ( it )
828 it->repaintCard(); 828 it->repaintCard();
829 } 829 }
830 830
831 if (d->mSelectionMode == CardView::Single) 831 if (d->mSelectionMode == CardView::Single)
832 { 832 {
833 bool b = signalsBlocked(); 833 bool b = signalsBlocked();
834 blockSignals(true); 834 blockSignals(true);
835 selectAll(false); 835 selectAll(false);
836 blockSignals(b); 836 blockSignals(b);
837 837
838 if (selected) 838 if (selected)
839 { 839 {
840 item->setSelected(selected); 840 item->setSelected(selected);
841 item->repaintCard(); 841 item->repaintCard();
842 emit selectionChanged(); 842 emit selectionChanged();
843 emit selectionChanged(item); 843 emit selectionChanged(item);
844 } 844 }
845 else 845 else
846 { 846 {
847 emit selectionChanged(); 847 emit selectionChanged();
848 emit selectionChanged(0); 848 emit selectionChanged(0);
849 } 849 }
850 } 850 }
851 else if (d->mSelectionMode == CardView::Multi) 851 else if (d->mSelectionMode == CardView::Multi)
852 { 852 {
853 item->setSelected(selected); 853 item->setSelected(selected);
854 item->repaintCard(); 854 item->repaintCard();
855 emit selectionChanged(); 855 emit selectionChanged();
856 } 856 }
857 else if (d->mSelectionMode == CardView::Extended) 857 else if (d->mSelectionMode == CardView::Extended)
858 { 858 {
859 bool b = signalsBlocked(); 859 bool b = signalsBlocked();
860 blockSignals(true); 860 blockSignals(true);
861 selectAll(false); 861 selectAll(false);
862 blockSignals(b); 862 blockSignals(b);
863 863
864 item->setSelected(selected); 864 item->setSelected(selected);
865 item->repaintCard(); 865 item->repaintCard();
866 emit selectionChanged(); 866 emit selectionChanged();
867 } 867 }
868} 868}
869 869
870bool CardView::isSelected(CardViewItem *item) const 870bool CardView::isSelected(CardViewItem *item) const
871{ 871{
872 return (item && item->isSelected()); 872 return (item && item->isSelected());
873} 873}
874 874
875CardViewItem *CardView::selectedItem() const 875CardViewItem *CardView::selectedItem() const
876{ 876{
877 // find the first selected item 877 // find the first selected item
878 QPtrListIterator<CardViewItem> iter(d->mItemList); 878 QPtrListIterator<CardViewItem> iter(d->mItemList);
879 for (iter.toFirst(); iter.current(); ++iter) 879 for (iter.toFirst(); iter.current(); ++iter)
880 { 880 {
881 if ((*iter)->isSelected()) 881 if ((*iter)->isSelected())
882 return *iter; 882 return *iter;
883 } 883 }
884 884
885 return 0; 885 return 0;
886} 886}
887 887
888CardViewItem *CardView::firstItem() const 888CardViewItem *CardView::firstItem() const
889{ 889{
890 return d->mItemList.first(); 890 return d->mItemList.first();
891} 891}
892 892
893int CardView::childCount() const 893int CardView::childCount() const
894{ 894{
895 return d->mItemList.count(); 895 return d->mItemList.count();
896} 896}
897/*US 897/*US
898CardViewItem *CardView::findItem(const QString &text, const QString &label, 898CardViewItem *CardView::findItem(const QString &text, const QString &label,
899 Qt::StringComparisonMode compare) 899 Qt::StringComparisonMode compare)
900{ 900{
901 // IF the text is empty, we will return null, since empty text will 901 // IF the text is empty, we will return null, since empty text will
902 // match anything! 902 // match anything!
903 if (text.isEmpty()) 903 if (text.isEmpty())
904 return 0; 904 return 0;
905 905
906 QPtrListIterator<CardViewItem> iter(d->mItemList); 906 QPtrListIterator<CardViewItem> iter(d->mItemList);
907 if (compare & Qt::BeginsWith) 907 if (compare & Qt::BeginsWith)
908 { 908 {
909 QString value; 909 QString value;
910 for (iter.toFirst(); iter.current(); ++iter) 910 for (iter.toFirst(); iter.current(); ++iter)
911 { 911 {
912 value = (*iter)->fieldValue(label).upper(); 912 value = (*iter)->fieldValue(label).upper();
913 if (value.startsWith(text.upper())) 913 if (value.startsWith(text.upper()))
914 return *iter; 914 return *iter;
915 } 915 }
916 } 916 }
917 else 917 else
918 { 918 {
919 kdDebug(5720) << "CardView::findItem: search method not implemented" << endl; 919 kdDebug(5720) << "CardView::findItem: search method not implemented" << endl;
920 } 920 }
921 921
922 return 0; 922 return 0;
923} 923}
924*/ 924*/
925 925
926uint CardView::columnWidth() 926uint CardView::columnWidth()
927{ 927{
928 return d->mDrawSeparators ? 928 return d->mDrawSeparators ?
929 d->mItemWidth + ( 2 * d->mItemSpacing ) + d->mSepWidth : 929 d->mItemWidth + ( 2 * d->mItemSpacing ) + d->mSepWidth :
930 d->mItemWidth + d->mItemSpacing; 930 d->mItemWidth + d->mItemSpacing;
931} 931}
932 932
933void CardView::drawContents(QPainter *p, int clipx, int clipy, 933void CardView::drawContents(QPainter *p, int clipx, int clipy,
934 int clipw, int cliph) 934 int clipw, int cliph)
935{ 935{
936 QScrollView::drawContents(p, clipx, clipy, clipw, cliph); 936 QScrollView::drawContents(p, clipx, clipy, clipw, cliph);
937 937
938 if (d->mLayoutDirty) 938 if (d->mLayoutDirty)
939 calcLayout(); 939 calcLayout();
940 940
941 //kdDebug() << "CardView::drawContents: " << clipx << ", " << clipy 941 //kdDebug() << "CardView::drawContents: " << clipx << ", " << clipy
942 // << ", " << clipw << ", " << cliph << endl; 942 // << ", " << clipw << ", " << cliph << endl;
943 943
944 QColorGroup cg = viewport()->palette().active(); // allow setting costum colors in the viewport pale 944 QColorGroup cg = viewport()->palette().active(); // allow setting costum colors in the viewport pale
945 945
946 QRect clipRect(clipx, clipy, clipw, cliph); 946 QRect clipRect(clipx, clipy, clipw, cliph);
947 QRect cardRect; 947 QRect cardRect;
948 QRect sepRect; 948 QRect sepRect;
949 CardViewItem *item; 949 CardViewItem *item;
950 CardViewSeparator *sep; 950 CardViewSeparator *sep;
951 951
952 // make sure the viewport is a pure background 952 // make sure the viewport is a pure background
953 viewport()->erase(clipRect); 953 viewport()->erase(clipRect);
954 954
955 // Now tell the cards to draw, if they are in the clip region 955 // Now tell the cards to draw, if they are in the clip region
956 QPtrListIterator<CardViewItem> iter(d->mItemList); 956 QPtrListIterator<CardViewItem> iter(d->mItemList);
957 for (iter.toFirst(); iter.current(); ++iter) 957 for (iter.toFirst(); iter.current(); ++iter)
958 { 958 {
959 item = *iter; 959 item = *iter;
960 cardRect.setRect( item->d->x, item->d->y, d->mItemWidth, item->height() ); 960 cardRect.setRect( item->d->x, item->d->y, d->mItemWidth, item->height() );
961 961
962 if (clipRect.intersects(cardRect) || clipRect.contains(cardRect)) 962 if (clipRect.intersects(cardRect) || clipRect.contains(cardRect))
963 { 963 {
964 //kdDebug() << "\trepainting card at: " << cardRect.x() << ", " 964 //kdDebug() << "\trepainting card at: " << cardRect.x() << ", "
965 // << cardRect.y() << endl; 965 // << cardRect.y() << endl;
966 966
967 // Tell the card to paint 967 // Tell the card to paint
968 p->save(); 968 p->save();
969 p->translate(cardRect.x(), cardRect.y()); 969 p->translate(cardRect.x(), cardRect.y());
970 item->paintCard(p, cg); 970 item->paintCard(p, cg);
971 p->restore(); 971 p->restore();
972 } 972 }
973 } 973 }
974 974