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 using namespace KCal; 00045 00046 ResourceViewFactory::ResourceViewFactory( KCal::CalendarResources *calendar, 00047 CalendarView *view ) 00048 : mCalendar( calendar ), mView( view ), mResourceView( 0 ) 00049 { 00050 } 00051 00052 CalendarViewExtension *ResourceViewFactory::create( QWidget *parent ) 00053 { 00054 mResourceView = new ResourceView( mCalendar, parent ); 00055 00056 QObject::connect( mResourceView, SIGNAL( resourcesChanged() ), 00057 mView, SLOT( updateView() ) ); 00058 QObject::connect( mResourceView, SIGNAL( resourcesChanged() ), 00059 mView, SLOT( updateCategories() ) ); 00060 00061 QObject::connect( mCalendar, 00062 SIGNAL( signalResourceAdded( ResourceCalendar * ) ), 00063 mResourceView, 00064 SLOT( addResourceItem( ResourceCalendar * ) ) ); 00065 QObject::connect( mCalendar, 00066 SIGNAL( signalResourceModified( ResourceCalendar * ) ), 00067 mResourceView, 00068 SLOT( updateResourceItem( ResourceCalendar * ) ) ); 00069 QObject::connect( mCalendar, SIGNAL( signalResourceAdded( ResourceCalendar * ) ), 00070 mView, SLOT( updateCategories() ) ); 00071 QObject::connect( mCalendar, SIGNAL( signalResourceModified( ResourceCalendar * ) ), 00072 mView, SLOT( updateCategories() ) ); 00073 00074 return mResourceView; 00075 } 00076 00077 ResourceView *ResourceViewFactory::resourceView() const 00078 { 00079 return mResourceView; 00080 } 00081 00082 ResourceItem::ResourceItem( ResourceCalendar *resource, ResourceView *view, 00083 KListView *parent ) 00084 : QCheckListItem( parent, resource->resourceName(), CheckBox ), 00085 mResource( resource ), mView( view ), mBlockStateChange( false ), 00086 mIsSubresource( false ) 00087 { 00088 setGuiState(); 00089 00090 const QStringList subresources = mResource->subresources(); 00091 if ( !subresources.isEmpty() ) { 00092 setOpen( true ); 00093 setExpandable( true ); 00094 // This resource has subresources 00095 QStringList::ConstIterator it; 00096 for ( it=subresources.begin(); it!=subresources.end(); ++it ) { 00097 ( void )new ResourceItem( mResource, *it, mView, this ); 00098 } 00099 } 00100 } 00101 00102 ResourceItem::ResourceItem( KCal::ResourceCalendar *resource, 00103 const QString& sub, ResourceView *view, 00104 ResourceItem* parent ) 00105 : QCheckListItem( parent, sub, CheckBox ), mResource( resource ), 00106 mView( view ), mBlockStateChange( false ), mIsSubresource( true ) 00107 { 00108 setGuiState(); 00109 } 00110 00111 void ResourceItem::setGuiState() 00112 { 00113 mBlockStateChange = true; 00114 if ( mIsSubresource ) 00115 setOn( mResource->subresourceActive( text( 0 ) ) ); 00116 else 00117 setOn( mResource->isActive() ); 00118 mBlockStateChange = false; 00119 } 00120 00121 void ResourceItem::stateChange( bool active ) 00122 { 00123 if ( mBlockStateChange ) return; 00124 00125 if ( mIsSubresource ) { 00126 mResource->setSubresourceActive( text( 0 ), active ); 00127 } else { 00128 if ( active ) { 00129 if ( mResource->load() ) mResource->setActive( true ); 00130 } else { 00131 if ( mResource->save() ) mResource->setActive( false ); 00132 mView->requestClose( mResource ); 00133 } 00134 00135 setOpen( mResource->isActive() && childCount() > 0 ); 00136 00137 setGuiState(); 00138 } 00139 00140 mView->emitResourcesChanged(); 00141 } 00142 00143 void ResourceItem::update() 00144 { 00145 setGuiState(); 00146 } 00147 00148 ResourceView::ResourceView( KCal::CalendarResources *calendar, 00149 QWidget *parent, const char *name ) 00150 : CalendarViewExtension( parent, name ), mCalendar( calendar ) 00151 { 00152 QBoxLayout *topLayout = new QVBoxLayout( this ); 00153 00154 mListView = new KListView( this ); 00155 mListView->addColumn( i18n("Calendar") ); 00156 mListView->setResizeMode( QListView::LastColumn ); 00157 topLayout->addWidget( mListView ); 00158 00159 QHBox *buttonBox = new QHBox( this ); 00160 topLayout->addWidget( buttonBox ); 00161 00162 mAddButton = new QPushButton( i18n("Add..."), buttonBox, "add" ); 00163 mEditButton = new QPushButton( i18n("Edit..."), buttonBox, "edit" ); 00164 mDeleteButton = new QPushButton( i18n("Remove"), buttonBox, "del" ); 00165 mDeleteButton->setDisabled( true ); 00166 mEditButton->setDisabled( true ); 00167 00168 connect( mListView, SIGNAL( clicked( QListViewItem * ) ), 00169 SLOT( currentChanged( QListViewItem * ) ) ); 00170 connect( mAddButton, SIGNAL( clicked() ), SLOT( addResource() ) ); 00171 connect( mDeleteButton, SIGNAL( clicked() ), SLOT( removeResource() ) ); 00172 connect( mEditButton, SIGNAL( clicked() ), SLOT( editResource() ) ); 00173 connect( mListView, SIGNAL( doubleClicked ( QListViewItem *, const QPoint &, 00174 int ) ), 00175 SLOT( editResource() ) ); 00176 connect( mListView, SIGNAL( contextMenuRequested ( QListViewItem *, 00177 const QPoint &, int ) ), 00178 SLOT( contextMenuRequested( QListViewItem *, const QPoint &, 00179 int ) ) ); 00180 00181 updateView(); 00182 } 00183 00184 ResourceView::~ResourceView() 00185 { 00186 } 00187 00188 void ResourceView::updateView() 00189 { 00190 mListView->clear(); 00191 00192 KCal::CalendarResourceManager *manager = mCalendar->resourceManager(); 00193 00194 KCal::CalendarResourceManager::Iterator it; 00195 for( it = manager->begin(); it != manager->end(); ++it ) { 00196 addResourceItem( *it ); 00197 } 00198 } 00199 00200 void ResourceView::emitResourcesChanged() 00201 { 00202 emit resourcesChanged(); 00203 } 00204 00205 void ResourceView::addResource() 00206 { 00207 KCal::CalendarResourceManager *manager = mCalendar->resourceManager(); 00208 00209 QStringList types = manager->resourceTypeNames(); 00210 QStringList descs = manager->resourceTypeDescriptions(); 00211 bool ok = false; 00212 QString desc = KInputDialog::getItem( i18n( "Resource Configuration" ), 00213 i18n( "Please select type of the new resource:" ), descs, 0, false, &ok, 00214 this ); 00215 if ( !ok ) 00216 return; 00217 00218 QString type = types[ descs.findIndex( desc ) ]; 00219 00220 // Create new resource 00221 ResourceCalendar *resource = manager->createResource( type ); 00222 if( !resource ) { 00223 KMessageBox::error( this, i18n("<qt>Unable to create resource of type <b>%1</b>.</qt>") 00224 .arg( type ) ); 00225 return; 00226 } 00227 00228 resource->setResourceName( i18n("%1 resource").arg( type ) ); 00229 00230 KRES::ConfigDialog dlg( this, QString("calendar"), resource, 00231 "KRES::ConfigDialog" ); 00232 00233 if ( dlg.exec() ) { 00234 if ( resource->isActive() ) { 00235 resource->open(); 00236 resource->load(); 00237 } 00238 00239 manager->add( resource ); 00240 addResourceItem( resource ); 00241 } else { 00242 delete resource; 00243 resource = 0; 00244 } 00245 } 00246 00247 void ResourceView::addResourceItem( ResourceCalendar *resource ) 00248 { 00249 new ResourceItem( resource, this, mListView ); 00250 00251 connect( resource, SIGNAL( signalSubresourceAdded( ResourceCalendar *, 00252 const QString &, 00253 const QString & ) ), 00254 SLOT( slotSubresourceAdded( ResourceCalendar *, const QString &, 00255 const QString & ) ) ); 00256 connect( resource, SIGNAL( signalSubresourceRemoved( ResourceCalendar *, 00257 const QString &, 00258 const QString & ) ), 00259 SLOT( slotSubresourceRemoved( ResourceCalendar *, const QString &, 00260 const QString & ) ) ); 00261 00262 connect( resource, SIGNAL( resourceSaved( ResourceCalendar * ) ), 00263 SLOT( closeResource( ResourceCalendar * ) ) ); 00264 00265 emitResourcesChanged(); 00266 } 00267 00268 // Add a new entry 00269 void ResourceView::slotSubresourceAdded( ResourceCalendar *calendar, 00270 const QString &/*type*/, 00271 const QString &resource ) 00272 { 00273 QListViewItem *i = mListView->findItem( calendar->resourceName(), 0 ); 00274 if ( !i ) 00275 // Not found 00276 return; 00277 00278 ResourceItem *item = static_cast<ResourceItem *>( i ); 00279 ( void )new ResourceItem( calendar, resource, this, item ); 00280 } 00281 00282 // Remove an entry 00283 void ResourceView::slotSubresourceRemoved( ResourceCalendar */*calendar*/, 00284 const QString &/*type*/, 00285 const QString &resource ) 00286 { 00287 delete mListView->findItem( resource, 0 ); 00288 } 00289 00290 void ResourceView::closeResource( ResourceCalendar *r ) 00291 { 00292 if ( mResourcesToClose.find( r ) >= 0 ) { 00293 r->close(); 00294 mResourcesToClose.remove( r ); 00295 } 00296 } 00297 00298 void ResourceView::updateResourceItem( ResourceCalendar *resource ) 00299 { 00300 ResourceItem *item = findItem( resource ); 00301 if ( item ) { 00302 item->update(); 00303 } 00304 } 00305 00306 ResourceItem *ResourceView::currentItem() 00307 { 00308 QListViewItem *item = mListView->currentItem(); 00309 ResourceItem *rItem = static_cast<ResourceItem *>( item ); 00310 return rItem; 00311 } 00312 00313 void ResourceView::removeResource() 00314 { 00315 ResourceItem *item = currentItem(); 00316 if ( !item ) return; 00317 00318 int km = KMessageBox::warningContinueCancel( this, 00319 i18n("<qt>Do you really want to remove the resource <b>%1</b>?</qt>") 00320 .arg( item->resource()->resourceName() ), "", 00321 KGuiItem( i18n("&Remove" ), "editdelete") ); 00322 if ( km == KMessageBox::Cancel ) return; 00323 00324 // Don't be so restricitve 00325 #if 0 00326 if ( item->resource() == mCalendar->resourceManager()->standardResource() ) { 00327 KMessageBox::sorry( this, 00328 i18n( "You cannot remove your standard resource." ) ); 00329 return; 00330 } 00331 #endif 00332 00333 mCalendar->resourceManager()->remove( item->resource() ); 00334 00335 mListView->takeItem( item ); 00336 delete item; 00337 emitResourcesChanged(); 00338 } 00339 00340 void ResourceView::editResource() 00341 { 00342 ResourceItem *item = currentItem(); 00343 00344 ResourceCalendar *resource = item->resource(); 00345 00346 KRES::ConfigDialog dlg( this, QString("calendar"), resource, 00347 "KRES::ConfigDialog" ); 00348 00349 if ( dlg.exec() ) { 00350 item->setText( 0, resource->resourceName() ); 00351 00352 mCalendar->resourceManager()->change( resource ); 00353 } 00354 } 00355 00356 void ResourceView::currentChanged( QListViewItem *item) 00357 { 00358 bool selected = true; 00359 if ( !item ) selected = false; 00360 mDeleteButton->setEnabled( selected ); 00361 mEditButton->setEnabled( selected ); 00362 } 00363 00364 ResourceItem *ResourceView::findItem( ResourceCalendar *r ) 00365 { 00366 QListViewItem *item; 00367 ResourceItem *i = 0; 00368 for( item = mListView->firstChild(); item; item = item->nextSibling() ) { 00369 i = static_cast<ResourceItem *>( item ); 00370 if ( i->resource() == r ) break; 00371 } 00372 return i; 00373 } 00374 00375 void ResourceView::contextMenuRequested ( QListViewItem *i, 00376 const QPoint &pos, int ) 00377 { 00378 ResourceItem *item = static_cast<ResourceItem *>( i ); 00379 00380 QPopupMenu *menu = new QPopupMenu( this ); 00381 connect( menu, SIGNAL( aboutToHide() ), menu, SLOT( deleteLater() ) ); 00382 if ( item ) { 00383 int reloadId = menu->insertItem( i18n("Reload"), this, 00384 SLOT( reloadResource() ) ); 00385 menu->setItemEnabled( reloadId, item->resource()->isActive() ); 00386 int saveId = menu->insertItem( i18n("Save"), this, 00387 SLOT( saveResource() ) ); 00388 menu->setItemEnabled( saveId, item->resource()->isActive() ); 00389 menu->insertSeparator(); 00390 menu->insertItem( i18n("Show Info"), this, SLOT( showInfo() ) ); 00391 menu->insertItem( i18n("Edit..."), this, SLOT( editResource() ) ); 00392 menu->insertItem( i18n("Remove"), this, SLOT( removeResource() ) ); 00393 menu->insertSeparator(); 00394 } 00395 menu->insertItem( i18n("Add..."), this, SLOT( addResource() ) ); 00396 00397 menu->popup( pos ); 00398 } 00399 00400 void ResourceView::showInfo() 00401 { 00402 ResourceItem *item = currentItem(); 00403 if ( !item ) return; 00404 00405 QString txt = "<qt>" + item->resource()->infoText() + "</qt>"; 00406 KMessageBox::information( this, txt ); 00407 } 00408 00409 void ResourceView::reloadResource() 00410 { 00411 ResourceItem *item = currentItem(); 00412 if ( !item ) return; 00413 00414 ResourceCalendar *r = item->resource(); 00415 r->load(); 00416 } 00417 00418 void ResourceView::saveResource() 00419 { 00420 ResourceItem *item = currentItem(); 00421 if ( !item ) return; 00422 00423 ResourceCalendar *r = item->resource(); 00424 r->save(); 00425 } 00426 00427 void ResourceView::showButtons( bool visible ) 00428 { 00429 if ( visible ) { 00430 mAddButton->show(); 00431 mDeleteButton->show(); 00432 mEditButton->show(); 00433 } else { 00434 mAddButton->hide(); 00435 mDeleteButton->hide(); 00436 mEditButton->hide(); 00437 } 00438 } 00439 00440 void ResourceView::requestClose( ResourceCalendar *r ) 00441 { 00442 mResourcesToClose.append( r ); 00443 } 00444 00445 #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 Fri Aug 27 12:53:28 2004 by doxygen 1.3.8 written by Dimitri van Heesch, © 1997-2003