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( QString::null ), 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, sub, CheckBox ), mResource( resource ), 00118 mView( view ), mBlockStateChange( false ), mIsSubresource( true ), 00119 mSubItemsCreated( false ) 00120 { 00121 mResourceIdentifier = sub; 00122 setText( 0, label ); 00123 setGuiState(); 00124 } 00125 00126 void ResourceItem::setGuiState() 00127 { 00128 mBlockStateChange = true; 00129 if ( mIsSubresource ) 00130 setOn( mResource->subresourceActive( mResourceIdentifier ) ); 00131 else 00132 setOn( mResource->isActive() ); 00133 mBlockStateChange = false; 00134 } 00135 00136 void ResourceItem::stateChange( bool active ) 00137 { 00138 if ( mBlockStateChange ) return; 00139 00140 if ( mIsSubresource ) { 00141 mResource->setSubresourceActive( mResourceIdentifier, active ); 00142 } else { 00143 if ( active ) { 00144 if ( mResource->load() ) { 00145 mResource->setActive( true ); 00146 if ( !mSubItemsCreated ) 00147 createSubresourceItems(); 00148 } 00149 } else { 00150 if ( mResource->save() ) mResource->setActive( false ); 00151 mView->requestClose( mResource ); 00152 } 00153 00154 setOpen( mResource->isActive() && childCount() > 0 ); 00155 00156 setGuiState(); 00157 } 00158 00159 mView->emitResourcesChanged(); 00160 } 00161 00162 void ResourceItem::update() 00163 { 00164 setGuiState(); 00165 } 00166 00167 ResourceView::ResourceView( KCal::CalendarResources *calendar, 00168 QWidget *parent, const char *name ) 00169 : CalendarViewExtension( parent, name ), mCalendar( calendar ) 00170 { 00171 QBoxLayout *topLayout = new QVBoxLayout( this ); 00172 00173 mListView = new KListView( this ); 00174 mListView->addColumn( i18n("Calendar") ); 00175 mListView->setResizeMode( QListView::LastColumn ); 00176 topLayout->addWidget( mListView ); 00177 00178 QHBox *buttonBox = new QHBox( this ); 00179 topLayout->addWidget( buttonBox ); 00180 00181 mAddButton = new QPushButton( i18n("Add..."), buttonBox, "add" ); 00182 mEditButton = new QPushButton( i18n("Edit..."), buttonBox, "edit" ); 00183 mDeleteButton = new QPushButton( i18n("Remove"), buttonBox, "del" ); 00184 mDeleteButton->setDisabled( true ); 00185 mEditButton->setDisabled( true ); 00186 00187 connect( mListView, SIGNAL( clicked( QListViewItem * ) ), 00188 SLOT( currentChanged( QListViewItem * ) ) ); 00189 connect( mAddButton, SIGNAL( clicked() ), SLOT( addResource() ) ); 00190 connect( mDeleteButton, SIGNAL( clicked() ), SLOT( removeResource() ) ); 00191 connect( mEditButton, SIGNAL( clicked() ), SLOT( editResource() ) ); 00192 connect( mListView, SIGNAL( doubleClicked ( QListViewItem *, const QPoint &, 00193 int ) ), 00194 SLOT( editResource() ) ); 00195 connect( mListView, SIGNAL( contextMenuRequested ( QListViewItem *, 00196 const QPoint &, int ) ), 00197 SLOT( contextMenuRequested( QListViewItem *, const QPoint &, 00198 int ) ) ); 00199 updateView(); 00200 } 00201 00202 ResourceView::~ResourceView() 00203 { 00204 } 00205 00206 void ResourceView::updateView() 00207 { 00208 mListView->clear(); 00209 00210 KCal::CalendarResourceManager *manager = mCalendar->resourceManager(); 00211 00212 KCal::CalendarResourceManager::Iterator it; 00213 for( it = manager->begin(); it != manager->end(); ++it ) { 00214 addResourceItem( *it ); 00215 } 00216 } 00217 00218 void ResourceView::emitResourcesChanged() 00219 { 00220 emit resourcesChanged(); 00221 } 00222 00223 void ResourceView::addResource() 00224 { 00225 KCal::CalendarResourceManager *manager = mCalendar->resourceManager(); 00226 00227 QStringList types = manager->resourceTypeNames(); 00228 QStringList descs = manager->resourceTypeDescriptions(); 00229 bool ok = false; 00230 QString desc = KInputDialog::getItem( i18n( "Resource Configuration" ), 00231 i18n( "Please select type of the new resource:" ), descs, 0, false, &ok, 00232 this ); 00233 if ( !ok ) 00234 return; 00235 00236 QString type = types[ descs.findIndex( desc ) ]; 00237 00238 // Create new resource 00239 ResourceCalendar *resource = manager->createResource( type ); 00240 if( !resource ) { 00241 KMessageBox::error( this, i18n("<qt>Unable to create resource of type <b>%1</b>.</qt>") 00242 .arg( type ) ); 00243 return; 00244 } 00245 00246 resource->setResourceName( i18n("%1 resource").arg( type ) ); 00247 00248 KRES::ConfigDialog dlg( this, QString("calendar"), resource, 00249 "KRES::ConfigDialog" ); 00250 00251 if ( dlg.exec() ) { 00252 resource->setTimeZoneId( KOPrefs::instance()->mTimeZoneId ); 00253 if ( resource->isActive() ) { 00254 resource->open(); 00255 resource->load(); 00256 } 00257 manager->add( resource ); 00258 addResourceItem( resource ); 00259 } else { 00260 delete resource; 00261 resource = 0; 00262 } 00263 } 00264 00265 void ResourceView::addResourceItem( ResourceCalendar *resource ) 00266 { 00267 new ResourceItem( resource, this, mListView ); 00268 00269 connect( resource, SIGNAL( signalSubresourceAdded( ResourceCalendar *, 00270 const QString &, 00271 const QString &, 00272 const QString & ) ), 00273 SLOT( slotSubresourceAdded( ResourceCalendar *, const QString &, 00274 const QString &, const QString & ) ) ); 00275 00276 connect( resource, SIGNAL( signalSubresourceAdded( ResourceCalendar *, 00277 const QString &, 00278 const QString & ) ), 00279 SLOT( slotSubresourceAdded( ResourceCalendar *, const QString &, 00280 const QString & ) ) ); 00281 00282 connect( resource, SIGNAL( signalSubresourceRemoved( ResourceCalendar *, 00283 const QString &, 00284 const QString & ) ), 00285 SLOT( slotSubresourceRemoved( ResourceCalendar *, const QString &, 00286 const QString & ) ) ); 00287 00288 connect( resource, SIGNAL( resourceSaved( ResourceCalendar * ) ), 00289 SLOT( closeResource( ResourceCalendar * ) ) ); 00290 00291 emitResourcesChanged(); 00292 } 00293 00294 00295 // FIXME proko2: merge once we are back in HEAD by porting imap resource 00296 void ResourceView::slotSubresourceAdded( ResourceCalendar *calendar, 00297 const QString& type, 00298 const QString& resource ) 00299 { 00300 slotSubresourceAdded( calendar, type, resource, resource ); 00301 } 00302 00303 // Add a new entry 00304 void ResourceView::slotSubresourceAdded( ResourceCalendar *calendar, 00305 const QString& /*type*/, 00306 const QString& resource, 00307 const QString& label) 00308 { 00309 QListViewItem *i = mListView->findItem( calendar->resourceName(), 0 ); 00310 if ( !i ) 00311 // Not found 00312 return; 00313 00314 ResourceItem *item = static_cast<ResourceItem *>( i ); 00315 ( void )new ResourceItem( calendar, resource, label, this, item ); 00316 } 00317 00318 // Remove an entry 00319 void ResourceView::slotSubresourceRemoved( ResourceCalendar */*calendar*/, 00320 const QString &/*type*/, 00321 const QString &resource ) 00322 { 00323 delete findItemByIdentifier( resource ); 00324 emitResourcesChanged(); 00325 } 00326 00327 void ResourceView::closeResource( ResourceCalendar *r ) 00328 { 00329 if ( mResourcesToClose.find( r ) >= 0 ) { 00330 r->close(); 00331 mResourcesToClose.remove( r ); 00332 } 00333 } 00334 00335 void ResourceView::updateResourceItem( ResourceCalendar *resource ) 00336 { 00337 ResourceItem *item = findItem( resource ); 00338 if ( item ) { 00339 item->update(); 00340 } 00341 } 00342 00343 ResourceItem *ResourceView::currentItem() 00344 { 00345 QListViewItem *item = mListView->currentItem(); 00346 ResourceItem *rItem = static_cast<ResourceItem *>( item ); 00347 return rItem; 00348 } 00349 00350 void ResourceView::removeResource() 00351 { 00352 ResourceItem *item = currentItem(); 00353 if ( !item ) return; 00354 00355 int km = KMessageBox::warningContinueCancel( this, 00356 i18n("<qt>Do you really want to remove the resource <b>%1</b>?</qt>") 00357 .arg( item->text( 0 ) ), "", 00358 KGuiItem( i18n("&Remove" ), "editdelete") ); 00359 if ( km == KMessageBox::Cancel ) return; 00360 00361 // Don't be so restricitve 00362 #if 0 00363 if ( item->resource() == mCalendar->resourceManager()->standardResource() ) { 00364 KMessageBox::sorry( this, 00365 i18n( "You cannot remove your standard resource." ) ); 00366 return; 00367 } 00368 #endif 00369 if ( item->isSubresource() ) { 00370 // TODO delete the folder in KMail 00371 } else { 00372 mCalendar->resourceManager()->remove( item->resource() ); 00373 mListView->takeItem( item ); 00374 delete item; 00375 } 00376 emitResourcesChanged(); 00377 } 00378 00379 void ResourceView::editResource() 00380 { 00381 ResourceItem *item = currentItem(); 00382 00383 ResourceCalendar *resource = item->resource(); 00384 00385 KRES::ConfigDialog dlg( this, QString("calendar"), resource, 00386 "KRES::ConfigDialog" ); 00387 00388 if ( dlg.exec() ) { 00389 item->setText( 0, resource->resourceName() ); 00390 00391 mCalendar->resourceManager()->change( resource ); 00392 } 00393 } 00394 00395 void ResourceView::currentChanged( QListViewItem *item) 00396 { 00397 ResourceItem *i = currentItem(); 00398 if ( !item || i->isSubresource() ) { 00399 mDeleteButton->setEnabled( false ); 00400 mEditButton->setEnabled( false ); 00401 } else { 00402 mDeleteButton->setEnabled( true ); 00403 mEditButton->setEnabled( true ); 00404 } 00405 } 00406 00407 ResourceItem *ResourceView::findItem( ResourceCalendar *r ) 00408 { 00409 QListViewItem *item; 00410 ResourceItem *i = 0; 00411 for( item = mListView->firstChild(); item; item = item->nextSibling() ) { 00412 i = static_cast<ResourceItem *>( item ); 00413 if ( i->resource() == r ) break; 00414 } 00415 return i; 00416 } 00417 00418 ResourceItem *ResourceView::findItemByIdentifier( const QString& id ) 00419 { 00420 QListViewItem *item; 00421 ResourceItem *i = 0; 00422 for( item = mListView->firstChild(); item; item = item->itemBelow() ) { 00423 i = static_cast<ResourceItem *>( item ); 00424 if ( i->resourceIdentifier() == id ) 00425 return i; 00426 } 00427 return 0; 00428 } 00429 00430 00431 void ResourceView::contextMenuRequested ( QListViewItem *i, 00432 const QPoint &pos, int ) 00433 { 00434 ResourceItem *item = static_cast<ResourceItem *>( i ); 00435 00436 QPopupMenu *menu = new QPopupMenu( this ); 00437 connect( menu, SIGNAL( aboutToHide() ), menu, SLOT( deleteLater() ) ); 00438 if ( item ) { 00439 int reloadId = menu->insertItem( i18n("Reload"), this, 00440 SLOT( reloadResource() ) ); 00441 menu->setItemEnabled( reloadId, item->resource()->isActive() ); 00442 int saveId = menu->insertItem( i18n("Save"), this, 00443 SLOT( saveResource() ) ); 00444 menu->setItemEnabled( saveId, item->resource()->isActive() ); 00445 menu->insertSeparator(); 00446 menu->insertItem( i18n("Show Info"), this, SLOT( showInfo() ) ); 00447 if ( !item->isSubresource() ) { 00448 menu->insertItem( i18n("Edit..."), this, SLOT( editResource() ) ); 00449 menu->insertItem( i18n("Remove"), this, SLOT( removeResource() ) ); 00450 } 00451 menu->insertSeparator(); 00452 } 00453 menu->insertItem( i18n("Add..."), this, SLOT( addResource() ) ); 00454 00455 menu->popup( pos ); 00456 } 00457 00458 void ResourceView::showInfo() 00459 { 00460 ResourceItem *item = currentItem(); 00461 if ( !item ) return; 00462 00463 QString txt = "<qt>" + item->resource()->infoText() + "</qt>"; 00464 KMessageBox::information( this, txt ); 00465 } 00466 00467 void ResourceView::reloadResource() 00468 { 00469 ResourceItem *item = currentItem(); 00470 if ( !item ) return; 00471 00472 ResourceCalendar *r = item->resource(); 00473 r->load(); 00474 } 00475 00476 void ResourceView::saveResource() 00477 { 00478 ResourceItem *item = currentItem(); 00479 if ( !item ) return; 00480 00481 ResourceCalendar *r = item->resource(); 00482 r->save(); 00483 } 00484 00485 void ResourceView::showButtons( bool visible ) 00486 { 00487 if ( visible ) { 00488 mAddButton->show(); 00489 mDeleteButton->show(); 00490 mEditButton->show(); 00491 } else { 00492 mAddButton->hide(); 00493 mDeleteButton->hide(); 00494 mEditButton->hide(); 00495 } 00496 } 00497 00498 void ResourceView::requestClose( ResourceCalendar *r ) 00499 { 00500 mResourcesToClose.append( r ); 00501 } 00502 00503 #include "resourceview.moc"
KDE Logo
This file is part of the documentation for korganizer Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Oct 21 19:46:57 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003