korganizer Library API Documentation

resourceview.cpp

00001 /*
00002     This file is part of KOrganizer.
00003 
00004     Copyright (c) 2003,2004 Cornelius Schumacher <schumacher@kde.org>
00005 
00006     This program is free software; you can redistribute it and/or modify
00007     it under the terms of the GNU General Public License as published by
00008     the Free Software Foundation; either version 2 of the License, or
00009     (at your option) any later version.
00010 
00011     This program is distributed in the hope that it will be useful,
00012     but WITHOUT ANY WARRANTY; without even the implied warranty of
00013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00014     GNU General Public License for more details.
00015 
00016     You should have received a copy of the GNU General Public License
00017     along with this program; if not, write to the Free Software
00018     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00019 
00020     As a special exception, permission is given to link this program
00021     with any edition of Qt, and distribute the resulting executable,
00022     without including the source code for Qt in the source distribution.
00023 */
00024 
00025 #include "resourceview.h"
00026 
00027 #include <klistview.h>
00028 #include <klocale.h>
00029 #include <kdebug.h>
00030 #include <kglobal.h>
00031 #include <kmessagebox.h>
00032 #include <kresources/resource.h>
00033 #include <kresources/configdialog.h>
00034 #include <kinputdialog.h>
00035 #include <libkcal/calendarresources.h>
00036 #include <resourceremote.h>
00037 
00038 #include <qhbox.h>
00039 #include <qlayout.h>
00040 #include <qlabel.h>
00041 #include <qpushbutton.h>
00042 #include <qpopupmenu.h>
00043 
00044 #include "koprefs.h"
00045 
00046 using namespace KCal;
00047 
00048 ResourceViewFactory::ResourceViewFactory( KCal::CalendarResources *calendar,
00049                                           CalendarView *view )
00050   : mCalendar( calendar ), mView( view ), mResourceView( 0 )
00051 {
00052 }
00053 
00054 CalendarViewExtension *ResourceViewFactory::create( QWidget *parent )
00055 {
00056   mResourceView = new ResourceView( mCalendar, parent );
00057 
00058   QObject::connect( mResourceView, SIGNAL( resourcesChanged() ),
00059                     mView, SLOT( updateView() ) );
00060   QObject::connect( mResourceView, SIGNAL( resourcesChanged() ),
00061                     mView, SLOT( updateCategories() ) );
00062 
00063   QObject::connect( mCalendar,
00064                     SIGNAL( signalResourceAdded( ResourceCalendar * ) ),
00065                     mResourceView,
00066                     SLOT( addResourceItem( ResourceCalendar * ) ) );
00067   QObject::connect( mCalendar,
00068                     SIGNAL( signalResourceModified( ResourceCalendar * ) ),
00069                     mResourceView,
00070                     SLOT( updateResourceItem( ResourceCalendar * ) ) );
00071   QObject::connect( mCalendar, SIGNAL( signalResourceAdded( ResourceCalendar * ) ),
00072                     mView, SLOT( updateCategories() ) );
00073   QObject::connect( mCalendar, SIGNAL( signalResourceModified( ResourceCalendar * ) ),
00074                     mView, SLOT( updateCategories() ) );
00075 
00076   return mResourceView;
00077 }
00078 
00079 ResourceView *ResourceViewFactory::resourceView() const
00080 {
00081   return mResourceView;
00082 }
00083 
00084 ResourceItem::ResourceItem( ResourceCalendar *resource, ResourceView *view,
00085                             KListView *parent )
00086   : QCheckListItem( parent, resource->resourceName(), CheckBox ),
00087     mResource( resource ), mView( view ), mBlockStateChange( false ),
00088     mIsSubresource( false ), mResourceIdentifier(),
00089     mSubItemsCreated( false )
00090 {
00091   setGuiState();
00092 
00093   if ( mResource->isActive() ) {
00094     createSubresourceItems();
00095   }
00096 }
00097 
00098 void ResourceItem::createSubresourceItems() {
00099   const QStringList subresources = mResource->subresources();
00100   if ( !subresources.isEmpty() ) {
00101     setOpen( true );
00102     setExpandable( true );
00103     // This resource has subresources
00104     QStringList::ConstIterator it;
00105     for ( it=subresources.begin(); it!=subresources.end(); ++it ) {
00106       ( void )new ResourceItem( mResource, *it, mResource->labelForSubresource( *it ),
00107                                 mView, this );
00108     }
00109   }
00110   mSubItemsCreated = true;
00111 }
00112 
00113 ResourceItem::ResourceItem( KCal::ResourceCalendar *resource,
00114                             const QString& sub, const QString& label,
00115                             ResourceView *view, ResourceItem* parent )
00116 
00117   : QCheckListItem( parent, label, CheckBox ), mResource( resource ),
00118     mView( view ), mBlockStateChange( false ), mIsSubresource( true ),
00119     mSubItemsCreated( false )
00120 {
00121   mResourceIdentifier = sub;
00122   setGuiState();
00123 }
00124 
00125 void ResourceItem::setGuiState()
00126 {
00127   mBlockStateChange = true;
00128   if ( mIsSubresource )
00129     setOn( mResource->subresourceActive( mResourceIdentifier ) );
00130   else
00131     setOn( mResource->isActive() );
00132   mBlockStateChange = false;
00133 }
00134 
00135 void ResourceItem::stateChange( bool active )
00136 {
00137   if ( mBlockStateChange ) return;
00138 
00139   if ( mIsSubresource ) {
00140     mResource->setSubresourceActive( mResourceIdentifier, active );
00141   } else {
00142     if ( active ) {
00143       if ( mResource->load() ) {
00144         mResource->setActive( true );
00145         if ( !mSubItemsCreated )
00146           createSubresourceItems();
00147       }
00148     } else {
00149       if ( mResource->save() ) mResource->setActive( false );
00150       mView->requestClose( mResource );
00151     }
00152 
00153     setOpen( mResource->isActive() && childCount() > 0 );
00154 
00155     setGuiState();
00156   }
00157 
00158   mView->emitResourcesChanged();
00159 }
00160 
00161 void ResourceItem::update()
00162 {
00163   setGuiState();
00164 }
00165 
00166 ResourceView::ResourceView( KCal::CalendarResources *calendar,
00167                             QWidget *parent, const char *name )
00168   : CalendarViewExtension( parent, name ), mCalendar( calendar )
00169 {
00170   QBoxLayout *topLayout = new QVBoxLayout( this );
00171 
00172   mListView = new KListView( this );
00173   mListView->addColumn( i18n("Calendar") );
00174   mListView->setResizeMode( QListView::LastColumn );
00175   topLayout->addWidget( mListView );
00176 
00177   QHBox *buttonBox = new QHBox( this );
00178   topLayout->addWidget( buttonBox );
00179 
00180   mAddButton = new QPushButton( i18n("Add..."), buttonBox, "add" );
00181   mEditButton = new QPushButton( i18n("Edit..."), buttonBox, "edit" );
00182   mDeleteButton = new QPushButton( i18n("Remove"), buttonBox, "del" );
00183   mDeleteButton->setDisabled( true );
00184   mEditButton->setDisabled( true );
00185 
00186   connect( mListView, SIGNAL( clicked( QListViewItem * ) ),
00187            SLOT( currentChanged( QListViewItem * ) ) );
00188   connect( mAddButton, SIGNAL( clicked() ), SLOT( addResource() ) );
00189   connect( mDeleteButton, SIGNAL( clicked() ), SLOT( removeResource() ) );
00190   connect( mEditButton, SIGNAL( clicked() ), SLOT( editResource() ) );
00191   connect( mListView, SIGNAL( doubleClicked ( QListViewItem *, const QPoint &,
00192                                               int ) ),
00193            SLOT( editResource() ) );
00194   connect( mListView, SIGNAL( contextMenuRequested ( QListViewItem *,
00195                                                      const QPoint &, int ) ),
00196            SLOT( contextMenuRequested( QListViewItem *, const QPoint &,
00197                                        int ) ) );
00198   updateView();
00199 }
00200 
00201 ResourceView::~ResourceView()
00202 {
00203 }
00204 
00205 void ResourceView::updateView()
00206 {
00207   mListView->clear();
00208 
00209   KCal::CalendarResourceManager *manager = mCalendar->resourceManager();
00210 
00211   KCal::CalendarResourceManager::Iterator it;
00212   for( it = manager->begin(); it != manager->end(); ++it ) {
00213     addResourceItem( *it );
00214   }
00215 }
00216 
00217 void ResourceView::emitResourcesChanged()
00218 {
00219   emit resourcesChanged();
00220 }
00221 
00222 void ResourceView::addResource()
00223 {
00224   KCal::CalendarResourceManager *manager = mCalendar->resourceManager();
00225 
00226   QStringList types = manager->resourceTypeNames();
00227   QStringList descs = manager->resourceTypeDescriptions();
00228   bool ok = false;
00229   QString desc = KInputDialog::getItem( i18n( "Resource Configuration" ),
00230       i18n( "Please select type of the new resource:" ), descs, 0, false, &ok,
00231             this );
00232   if ( !ok )
00233     return;
00234 
00235   QString type = types[ descs.findIndex( desc ) ];
00236 
00237   // Create new resource
00238   ResourceCalendar *resource = manager->createResource( type );
00239   if( !resource ) {
00240     KMessageBox::error( this, i18n("<qt>Unable to create resource of type <b>%1</b>.</qt>")
00241                               .arg( type ) );
00242     return;
00243   }
00244 
00245   resource->setResourceName( i18n("%1 resource").arg( type ) );
00246 
00247   KRES::ConfigDialog dlg( this, QString("calendar"), resource,
00248                           "KRES::ConfigDialog" );
00249 
00250   if ( dlg.exec() ) {
00251     resource->setTimeZoneId( KOPrefs::instance()->mTimeZoneId );
00252     if ( resource->isActive() ) {
00253       resource->open();
00254       resource->load();
00255     }
00256     manager->add( resource );
00257     addResourceItem( resource );
00258   } else {
00259     delete resource;
00260     resource = 0;
00261   }
00262 }
00263 
00264 void ResourceView::addResourceItem( ResourceCalendar *resource )
00265 {
00266   new ResourceItem( resource, this, mListView );
00267 
00268   connect( resource, SIGNAL( signalSubresourceAdded( ResourceCalendar *,
00269                                                      const QString &,
00270                                                      const QString &,
00271                                                      const QString & ) ),
00272            SLOT( slotSubresourceAdded( ResourceCalendar *, const QString &,
00273                                        const QString &, const QString & ) ) );
00274 
00275   connect( resource, SIGNAL( signalSubresourceAdded( ResourceCalendar *,
00276                                                      const QString &,
00277                                                      const QString & ) ),
00278            SLOT( slotSubresourceAdded( ResourceCalendar *, const QString &,
00279                                        const QString & ) ) );
00280 
00281   connect( resource, SIGNAL( signalSubresourceRemoved( ResourceCalendar *,
00282                                                        const QString &,
00283                                                        const QString & ) ),
00284            SLOT( slotSubresourceRemoved( ResourceCalendar *, const QString &,
00285                                          const QString & ) ) );
00286 
00287   connect( resource, SIGNAL( resourceSaved( ResourceCalendar * ) ),
00288            SLOT( closeResource( ResourceCalendar * ) ) );
00289 
00290   emitResourcesChanged();
00291 }
00292 
00293 
00294 // FIXME proko2: merge once we are back in HEAD by porting imap resource
00295 void ResourceView::slotSubresourceAdded( ResourceCalendar *calendar,
00296                                          const QString& type,
00297                                          const QString& resource )
00298 {
00299    slotSubresourceAdded( calendar, type, resource, resource );
00300 }
00301 
00302 // Add a new entry
00303 void ResourceView::slotSubresourceAdded( ResourceCalendar *calendar,
00304                                          const QString& /*type*/,
00305                                          const QString& resource,
00306                                          const QString& label)
00307 {
00308   QListViewItem *i = mListView->findItem( calendar->resourceName(), 0 );
00309   if ( !i )
00310     // Not found
00311     return;
00312 
00313   ResourceItem *item = static_cast<ResourceItem *>( i );
00314   ( void )new ResourceItem( calendar, resource, label, this, item );
00315 }
00316 
00317 // Remove an entry
00318 void ResourceView::slotSubresourceRemoved( ResourceCalendar */*calendar*/,
00319                                            const QString &/*type*/,
00320                                            const QString &resource )
00321 {
00322   delete findItemByIdentifier( resource );
00323   emitResourcesChanged();
00324 }
00325 
00326 void ResourceView::closeResource( ResourceCalendar *r )
00327 {
00328   if ( mResourcesToClose.find( r ) >= 0 ) {
00329     r->close();
00330     mResourcesToClose.remove( r );
00331   }
00332 }
00333 
00334 void ResourceView::updateResourceItem( ResourceCalendar *resource )
00335 {
00336   ResourceItem *item = findItem( resource );
00337   if ( item ) {
00338     item->update();
00339   }
00340 }
00341 
00342 ResourceItem *ResourceView::currentItem()
00343 {
00344   QListViewItem *item = mListView->currentItem();
00345   ResourceItem *rItem = static_cast<ResourceItem *>( item );
00346   return rItem;
00347 }
00348 
00349 void ResourceView::removeResource()
00350 {
00351   ResourceItem *item = currentItem();
00352   if ( !item ) return;
00353 
00354   int km = KMessageBox::warningContinueCancel( this,
00355         i18n("<qt>Do you really want to remove the resource <b>%1</b>?</qt>")
00356         .arg( item->text( 0 ) ), "",
00357         KGuiItem( i18n("&Remove" ), "editdelete") );
00358   if ( km == KMessageBox::Cancel ) return;
00359 
00360 // Don't be so restricitve
00361 #if 0
00362   if ( item->resource() == mCalendar->resourceManager()->standardResource() ) {
00363     KMessageBox::sorry( this,
00364                         i18n( "You cannot remove your standard resource." ) );
00365     return;
00366   }
00367 #endif
00368   if ( item->isSubresource() ) {
00369     // TODO delete the folder in KMail
00370   } else {
00371     mCalendar->resourceManager()->remove( item->resource() );
00372     mListView->takeItem( item );
00373     delete item;
00374   }
00375   emitResourcesChanged();
00376 }
00377 
00378 void ResourceView::editResource()
00379 {
00380   ResourceItem *item = currentItem();
00381 
00382   ResourceCalendar *resource = item->resource();
00383 
00384   KRES::ConfigDialog dlg( this, QString("calendar"), resource,
00385                           "KRES::ConfigDialog" );
00386 
00387   if ( dlg.exec() ) {
00388     item->setText( 0, resource->resourceName() );
00389 
00390     mCalendar->resourceManager()->change( resource );
00391   }
00392 }
00393 
00394 void ResourceView::currentChanged( QListViewItem *item)
00395 {
00396    ResourceItem *i = currentItem();
00397    if ( !item || i->isSubresource() ) {
00398      mDeleteButton->setEnabled( false );
00399      mEditButton->setEnabled( false );
00400    } else {
00401      mDeleteButton->setEnabled( true );
00402      mEditButton->setEnabled( true );
00403    }
00404 }
00405 
00406 ResourceItem *ResourceView::findItem( ResourceCalendar *r )
00407 {
00408   QListViewItem *item;
00409   ResourceItem *i = 0;
00410   for( item = mListView->firstChild(); item; item = item->nextSibling() ) {
00411     i = static_cast<ResourceItem *>( item );
00412     if ( i->resource() == r ) break;
00413   }
00414   return i;
00415 }
00416 
00417 ResourceItem *ResourceView::findItemByIdentifier( const QString& id )
00418 {
00419   QListViewItem *item;
00420   ResourceItem *i = 0;
00421   for( item = mListView->firstChild(); item; item = item->itemBelow() ) {
00422     i = static_cast<ResourceItem *>( item );
00423     if ( i->resourceIdentifier() == id )
00424        return i;
00425   }
00426   return 0;
00427 }
00428 
00429 
00430 void ResourceView::contextMenuRequested ( QListViewItem *i,
00431                                           const QPoint &pos, int )
00432 {
00433   ResourceItem *item = static_cast<ResourceItem *>( i );
00434 
00435   QPopupMenu *menu = new QPopupMenu( this );
00436   connect( menu, SIGNAL( aboutToHide() ), menu, SLOT( deleteLater() ) );
00437   if ( item ) {
00438     int reloadId = menu->insertItem( i18n("Reload"), this,
00439                                      SLOT( reloadResource() ) );
00440     menu->setItemEnabled( reloadId, item->resource()->isActive() );
00441     int saveId = menu->insertItem( i18n("Save"), this,
00442                                    SLOT( saveResource() ) );
00443     menu->setItemEnabled( saveId, item->resource()->isActive() );
00444     menu->insertSeparator();
00445     menu->insertItem( i18n("Show Info"), this, SLOT( showInfo() ) );
00446     if ( !item->isSubresource() ) {
00447       menu->insertItem( i18n("Edit..."), this, SLOT( editResource() ) );
00448       menu->insertItem( i18n("Remove"), this, SLOT( removeResource() ) );
00449     }
00450     menu->insertSeparator();
00451  }
00452   menu->insertItem( i18n("Add..."), this, SLOT( addResource() ) );
00453 
00454   menu->popup( pos );
00455 }
00456 
00457 void ResourceView::showInfo()
00458 {
00459   ResourceItem *item = currentItem();
00460   if ( !item ) return;
00461 
00462   QString txt = "<qt>" + item->resource()->infoText() + "</qt>";
00463   KMessageBox::information( this, txt );
00464 }
00465 
00466 void ResourceView::reloadResource()
00467 {
00468   ResourceItem *item = currentItem();
00469   if ( !item ) return;
00470 
00471   ResourceCalendar *r = item->resource();
00472   r->load();
00473 }
00474 
00475 void ResourceView::saveResource()
00476 {
00477   ResourceItem *item = currentItem();
00478   if ( !item ) return;
00479 
00480   ResourceCalendar *r = item->resource();
00481   r->save();
00482 }
00483 
00484 void ResourceView::showButtons( bool visible )
00485 {
00486   if ( visible ) {
00487     mAddButton->show();
00488     mDeleteButton->show();
00489     mEditButton->show();
00490   } else {
00491     mAddButton->hide();
00492     mDeleteButton->hide();
00493     mEditButton->hide();
00494   }
00495 }
00496 
00497 void ResourceView::requestClose( ResourceCalendar *r )
00498 {
00499   mResourcesToClose.append( r );
00500 }
00501 
00502 #include "resourceview.moc"
KDE Logo
This file is part of the documentation for korganizer Library Version 3.3.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Mar 23 22:45:27 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003