kaddressbook Library API Documentation

contacteditorwidgetmanager.cpp

00001 /*
00002     This file is part of KAddressBook.
00003     Copyright (c) 2004 Tobias Koenig <tokoe@kde.org>
00004 
00005     This program is free software; you can redistribute it and/or modify
00006     it under the terms of the GNU General Public License as published by
00007     the Free Software Foundation; either version 2 of the License, or
00008     (at your option) any later version.
00009 
00010     This program is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00013     GNU General Public License for more details.
00014 
00015     You should have received a copy of the GNU General Public License
00016     along with this program; if not, write to the Free Software
00017     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00018 
00019     As a special exception, permission is given to link this program
00020     with any edition of Qt, and distribute the resulting executable,
00021     without including the source code for Qt in the source distribution.
00022 */
00023 
00024 #include <qlayout.h>
00025 
00026 #include <kapplication.h>
00027 #include <kdialog.h>
00028 #include <klibloader.h>
00029 #include <ktrader.h>
00030 
00031 // include non-plugin contact editor widgets
00032 #include "customfieldswidget.h"
00033 #include "freebusywidget.h"
00034 #include "geowidget.h"
00035 #include "imagewidget.h"
00036 #include "soundwidget.h"
00037 
00038 #include "contacteditorwidget.h"
00039 #include "contacteditorwidgetmanager.h"
00040 
00041 ContactEditorWidgetManager *ContactEditorWidgetManager::mSelf = 0;
00042 
00043 ContactEditorWidgetManager::ContactEditorWidgetManager()
00044   : QObject( qApp )
00045 {
00046   reload();
00047 }
00048 
00049 ContactEditorWidgetManager::~ContactEditorWidgetManager()
00050 {
00051   mFactories.clear();
00052 }
00053 
00054 ContactEditorWidgetManager *ContactEditorWidgetManager::self()
00055 {
00056   kdWarning( !kapp, 7520 ) << "No QApplication object available!" << endl;
00057 
00058   if ( !mSelf )
00059     mSelf = new ContactEditorWidgetManager();
00060 
00061   return mSelf;
00062 }
00063 
00064 int ContactEditorWidgetManager::count() const
00065 {
00066   return mFactories.count();
00067 }
00068 
00069 KAB::ContactEditorWidgetFactory *ContactEditorWidgetManager::factory( int pos ) const
00070 {
00071   return mFactories[ pos ];
00072 }
00073 
00074 void ContactEditorWidgetManager::reload()
00075 {
00076   mFactories.clear();
00077   kdDebug(5720) << "ContactEditorWidgetManager::reload()" << endl;
00078   KTrader::OfferList plugins = KTrader::self()->query( "KAddressBook/ContactEditorWidget" );
00079   KTrader::OfferList::ConstIterator it;
00080 
00081   for ( it = plugins.begin(); it != plugins.end(); ++it ) {
00082     KLibFactory *factory = KLibLoader::self()->factory( (*it)->library().latin1() );
00083     if ( !factory ) {
00084       kdDebug(5720) << "ContactEditorWidgetManager::reload(): Factory creation failed" << endl;
00085       continue;
00086     }
00087 
00088     KAB::ContactEditorWidgetFactory *pageFactory =
00089                           static_cast<KAB::ContactEditorWidgetFactory*>( factory );
00090 
00091     if ( !pageFactory ) {
00092       kdDebug(5720) << "ContactEditorWidgetManager::reload(): Cast failed" << endl;
00093       continue;
00094     }
00095 
00096     mFactories.append( pageFactory );
00097   }
00098 
00099   // add all non-plugin contact editor factories
00100   mFactories.append( new FreeBusyWidgetFactory );
00101   mFactories.append( new ImageWidgetFactory );
00102   mFactories.append( new SoundWidgetFactory );
00103   mFactories.append( new GeoWidgetFactory );
00104   mFactories.append( new CustomFieldsWidgetFactory );
00105 }
00106 
00108 
00109 ContactEditorTabPage::ContactEditorTabPage( QWidget *parent, const char *name )
00110   : QWidget( parent, name )
00111 {
00112   mLayout = new QGridLayout( this, 0, 2, KDialog::marginHint(), 
00113                              KDialog::spacingHint() );
00114 }
00115 
00116 void ContactEditorTabPage::addWidget( KAB::ContactEditorWidget *widget )
00117 {
00118   if ( widget->logicalWidth() == 2 ) {
00119     mWidgets.prepend( widget );
00120     connect( widget, SIGNAL( changed() ), SIGNAL( changed() ) );
00121     return;
00122   }
00123 
00124   // insert it in descending order
00125   KAB::ContactEditorWidget::List::Iterator it;
00126   for ( it = mWidgets.begin(); it != mWidgets.end(); ++it ) {
00127     if ( widget->logicalHeight() > (*it)->logicalHeight() &&
00128          (*it)->logicalWidth() == 1 ) {
00129       --it;
00130       break;
00131     }
00132   }
00133   mWidgets.insert( ++it, widget );
00134 
00135   connect( widget, SIGNAL( changed() ), SIGNAL( changed() ) );
00136 }
00137 
00138 void ContactEditorTabPage::loadContact( KABC::Addressee *addr )
00139 {
00140   KAB::ContactEditorWidget::List::Iterator it;
00141   for ( it = mWidgets.begin(); it != mWidgets.end(); ++it ) {
00142     (*it)->setModified( false );
00143     (*it)->loadContact( addr );
00144   }
00145 }
00146 
00147 void ContactEditorTabPage::storeContact( KABC::Addressee *addr )
00148 {
00149   KAB::ContactEditorWidget::List::Iterator it;
00150   for ( it = mWidgets.begin(); it != mWidgets.end(); ++it ) {
00151     if ( (*it)->modified() ) {
00152       (*it)->storeContact( addr );
00153       (*it)->setModified( false );
00154     }
00155   }
00156 }
00157 
00158 void ContactEditorTabPage::setReadOnly( bool readOnly )
00159 {
00160   KAB::ContactEditorWidget::List::Iterator it;
00161   for ( it = mWidgets.begin(); it != mWidgets.end(); ++it )
00162     (*it)->setReadOnly( readOnly );
00163 }
00164 
00165 void ContactEditorTabPage::updateLayout()
00166 {
00167   KAB::ContactEditorWidget::List::Iterator it;
00168 
00169   int row = 0;
00170   for ( it = mWidgets.begin(); it != mWidgets.end(); ++it ) {
00171     if ( (*it)->logicalWidth() == 2 ) {
00172       mLayout->addMultiCellWidget( *it, row, row + (*it)->logicalHeight() - 1, 0, 1 );
00173       row += (*it)->logicalHeight();
00174 
00175       if ( it != mWidgets.fromLast() ) {
00176         QFrame *frame = new QFrame( this );
00177         frame->setFrameStyle( QFrame::HLine | QFrame::Sunken );
00178         mLayout->addMultiCellWidget( frame, row, row, 0, 1 );
00179         row++;
00180       }
00181       continue;
00182     }
00183 
00184     // fill left side
00185     int leftHeight = (*it)->logicalHeight();
00186 
00187     if ( it == mWidgets.fromLast() ) { // last widget gets full width
00188       mLayout->addMultiCellWidget( *it, row, row + leftHeight - 1, 0, 1 );
00189       return;
00190     } else {
00191       mLayout->addMultiCellWidget( *it, row, row + leftHeight - 1, 0, 0 );
00192       QFrame *frame = new QFrame( this );
00193       frame->setFrameStyle( QFrame::HLine | QFrame::Sunken );
00194       mLayout->addMultiCellWidget( frame, row + leftHeight, row + leftHeight, 0, 1 );
00195     }
00196 
00197     // fill right side
00198     for ( int i = 0; i < leftHeight; ++i ) {
00199       ++it;
00200       if ( it == mWidgets.end() )
00201         break;
00202 
00203       int rightHeight = (*it)->logicalHeight();
00204       if ( rightHeight + i <= leftHeight )
00205         mLayout->addMultiCellWidget( *it, row + i, row + i + rightHeight - 1, 1, 1 );
00206       else {
00207         --i;
00208         break;
00209       }
00210     }
00211 
00212     row += 2;
00213   }
00214 }
00215 
00216 #include "contacteditorwidgetmanager.moc"
KDE Logo
This file is part of the documentation for kaddressbook Library Version 3.3.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Mar 23 22:42:46 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003