00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
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
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
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
00295 void ResourceView::slotSubresourceAdded( ResourceCalendar *calendar,
00296 const QString& type,
00297 const QString& resource )
00298 {
00299 slotSubresourceAdded( calendar, type, resource, resource );
00300 }
00301
00302
00303 void ResourceView::slotSubresourceAdded( ResourceCalendar *calendar,
00304 const QString& ,
00305 const QString& resource,
00306 const QString& label)
00307 {
00308 QListViewItem *i = mListView->findItem( calendar->resourceName(), 0 );
00309 if ( !i )
00310
00311 return;
00312
00313 ResourceItem *item = static_cast<ResourceItem *>( i );
00314 ( void )new ResourceItem( calendar, resource, label, this, item );
00315 }
00316
00317
00318 void ResourceView::slotSubresourceRemoved( ResourceCalendar *,
00319 const QString &,
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
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
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"