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
00026 #include "resourceview.h"
00027
00028 #include <kcolordialog.h>
00029 #include <kdialog.h>
00030 #include <klistview.h>
00031 #include <klocale.h>
00032 #include <kdebug.h>
00033 #include <kglobal.h>
00034 #include <kmessagebox.h>
00035 #include <kresources/resource.h>
00036 #include <kresources/configdialog.h>
00037 #include <kinputdialog.h>
00038 #include <libkcal/calendarresources.h>
00039
00040 #include <qhbox.h>
00041 #include <qlayout.h>
00042 #include <qlabel.h>
00043 #include <qpainter.h>
00044 #include <qpushbutton.h>
00045 #include <qpopupmenu.h>
00046 #include <qwhatsthis.h>
00047
00048 #include "koprefs.h"
00049
00050 using namespace KCal;
00051
00052 ResourceViewFactory::ResourceViewFactory( KCal::CalendarResources *calendar,
00053 CalendarView *view )
00054 : mCalendar( calendar ), mView( view ), mResourceView( 0 )
00055 {
00056 }
00057
00058 CalendarViewExtension *ResourceViewFactory::create( QWidget *parent )
00059 {
00060 mResourceView = new ResourceView( mCalendar, parent );
00061
00062 QObject::connect( mResourceView, SIGNAL( resourcesChanged() ),
00063 mView, SLOT( updateView() ) );
00064 QObject::connect( mResourceView, SIGNAL( resourcesChanged() ),
00065 mView, SLOT( updateCategories() ) );
00066
00067 QObject::connect( mCalendar,
00068 SIGNAL( signalResourceAdded( ResourceCalendar * ) ),
00069 mResourceView,
00070 SLOT( addResourceItem( ResourceCalendar * ) ) );
00071 QObject::connect( mCalendar,
00072 SIGNAL( signalResourceModified( ResourceCalendar * ) ),
00073 mResourceView,
00074 SLOT( updateResourceItem( ResourceCalendar * ) ) );
00075 QObject::connect( mCalendar, SIGNAL( signalResourceAdded( ResourceCalendar * ) ),
00076 mView, SLOT( updateCategories() ) );
00077 QObject::connect( mCalendar, SIGNAL( signalResourceModified( ResourceCalendar * ) ),
00078 mView, SLOT( updateCategories() ) );
00079
00080 return mResourceView;
00081 }
00082
00083 ResourceView *ResourceViewFactory::resourceView() const
00084 {
00085 return mResourceView;
00086 }
00087
00088 ResourceItem::ResourceItem( ResourceCalendar *resource, ResourceView *view,
00089 KListView *parent )
00090 : QCheckListItem( parent, resource->resourceName(), CheckBox ),
00091 mResource( resource ), mView( view ), mBlockStateChange( false ),
00092 mIsSubresource( false ), mResourceIdentifier( QString::null ),
00093 mSubItemsCreated( false ), mIsStandardResource( false )
00094 {
00095 mResourceColor = QColor();
00096 setGuiState();
00097
00098 if ( mResource->isActive() ) {
00099 createSubresourceItems();
00100 }
00101 }
00102
00103 void ResourceItem::createSubresourceItems()
00104 {
00105 const QStringList subresources = mResource->subresources();
00106 if ( !subresources.isEmpty() ) {
00107 setOpen( true );
00108 setExpandable( true );
00109
00110 QStringList::ConstIterator it;
00111 for ( it=subresources.begin(); it!=subresources.end(); ++it ) {
00112 ResourceItem *item = new ResourceItem( mResource, *it, mResource->labelForSubresource( *it ),
00113 mView, this );
00114 QColor resourceColor = *KOPrefs::instance()->resourceColor( *it );
00115 item->setResourceColor( resourceColor );
00116 }
00117 }
00118 mSubItemsCreated = true;
00119 }
00120
00121 ResourceItem::ResourceItem( KCal::ResourceCalendar *resource,
00122 const QString& sub, const QString& label,
00123 ResourceView *view, ResourceItem* parent )
00124
00125 : QCheckListItem( parent, label, CheckBox ), mResource( resource ),
00126 mView( view ), mBlockStateChange( false ), mIsSubresource( true ),
00127 mSubItemsCreated( false ), mIsStandardResource( false )
00128 {
00129 mResourceColor = QColor();
00130 mResourceIdentifier = sub;
00131 setGuiState();
00132 }
00133
00134 void ResourceItem::setGuiState()
00135 {
00136 mBlockStateChange = true;
00137 if ( mIsSubresource )
00138 setOn( mResource->subresourceActive( mResourceIdentifier ) );
00139 else
00140 setOn( mResource->isActive() );
00141 mBlockStateChange = false;
00142 }
00143
00144 void ResourceItem::stateChange( bool active )
00145 {
00146 if ( mBlockStateChange ) return;
00147
00148 if ( mIsSubresource ) {
00149 mResource->setSubresourceActive( mResourceIdentifier, active );
00150 } else {
00151 if ( active ) {
00152 if ( mResource->load() ) {
00153 mResource->setActive( true );
00154 if ( !mSubItemsCreated )
00155 createSubresourceItems();
00156 }
00157 } else {
00158 if ( mResource->save() ) mResource->setActive( false );
00159 mView->requestClose( mResource );
00160 }
00161
00162 setOpen( mResource->isActive() && childCount() > 0 );
00163
00164 setGuiState();
00165 }
00166
00167 mView->emitResourcesChanged();
00168 }
00169
00170 void ResourceItem::update()
00171 {
00172 setGuiState();
00173 }
00174
00175 void ResourceItem::setResourceColor(QColor& color)
00176 {
00177 if ( color.isValid() ) {
00178 if ( mResourceColor != color ) {
00179 QPixmap px(height()-4,height()-4);
00180 mResourceColor = color;
00181 px.fill(color);
00182 setPixmap(0,px);
00183 }
00184 } else {
00185 mResourceColor = color ;
00186 setPixmap(0,0);
00187 }
00188 }
00189
00190 void ResourceItem::setStandardResource( bool std )
00191 {
00192 if ( mIsStandardResource != std ) {
00193 mIsStandardResource = std;
00194 repaint();
00195 }
00196 }
00197
00198 void ResourceItem::paintCell(QPainter *p, const QColorGroup &cg,
00199 int column, int width, int alignment)
00200 {
00201 QFont oldFont = p->font();
00202 QFont newFont = oldFont;
00203 newFont.setBold( mIsStandardResource && !mIsSubresource );
00204 p->setFont( newFont );
00205 QCheckListItem::paintCell( p, cg, column, width, alignment );
00206 p->setFont( oldFont );
00207
00208
00209
00210 }
00211
00212
00213 ResourceView::ResourceView( KCal::CalendarResources *calendar,
00214 QWidget *parent, const char *name )
00215 : CalendarViewExtension( parent, name ), mCalendar( calendar )
00216 {
00217 QBoxLayout *topLayout = new QVBoxLayout( this, 0, KDialog::spacingHint() );
00218
00219 mListView = new KListView( this );
00220 QWhatsThis::add( mListView,
00221 i18n( "<qt><p>Select on this list the active KOrganizer "
00222 "resources. Check the resource box to make it "
00223 "active. Press the \"Add...\" button below to add new "
00224 "resources to the list.</p>"
00225 "<p>Events, journal entries and to-dos are retrieved "
00226 "and stored on resources. Available "
00227 "resources include groupware servers, local files, "
00228 "journal entries as blogs on a server, etc...</p>"
00229 "<p>If you have more than one active resource, "
00230 "when creating incidents you will either automatically "
00231 "use the default resource or be prompted "
00232 "to select the resource to use.</p></qt>" ) );
00233 mListView->addColumn( i18n("Calendar") );
00234 mListView->setResizeMode( QListView::LastColumn );
00235 topLayout->addWidget( mListView );
00236
00237 QHBox *buttonBox = new QHBox( this );
00238 buttonBox->setSpacing( KDialog::spacingHint() );
00239 topLayout->addWidget( buttonBox );
00240
00241 mAddButton = new QPushButton( i18n("Add..."), buttonBox, "add" );
00242 QWhatsThis::add( mAddButton,
00243 i18n( "<qt><p>Press this button to add a resource to "
00244 "KOrganizer.</p>"
00245 "<p>Events, journal entries and to-dos are retrieved "
00246 "and stored on resources. Available "
00247 "resources include groupware servers, local files, "
00248 "journal entries as blogs on a server, etc... </p>"
00249 "<p>If you have more than one active resource, "
00250 "when creating incidents you will either automatically "
00251 "use the default resource or be prompted "
00252 "to select the resource to use.</p></qt>" ) );
00253 mEditButton = new QPushButton( i18n("Edit..."), buttonBox, "edit" );
00254 QWhatsThis::add( mEditButton,
00255 i18n( "Press this button to edit the resource currently "
00256 "selected on the KOrganizer resources list above." ) );
00257 mDeleteButton = new QPushButton( i18n("Remove"), buttonBox, "del" );
00258 QWhatsThis::add( mDeleteButton,
00259 i18n( "Press this button to delete the resource currently "
00260 "selected on the KOrganizer resources list above." ) );
00261 mDeleteButton->setDisabled( true );
00262 mEditButton->setDisabled( true );
00263
00264 connect( mListView, SIGNAL( clicked( QListViewItem * ) ),
00265 SLOT( currentChanged( QListViewItem * ) ) );
00266 connect( mAddButton, SIGNAL( clicked() ), SLOT( addResource() ) );
00267 connect( mDeleteButton, SIGNAL( clicked() ), SLOT( removeResource() ) );
00268 connect( mEditButton, SIGNAL( clicked() ), SLOT( editResource() ) );
00269 connect( mListView, SIGNAL( doubleClicked ( QListViewItem *, const QPoint &,
00270 int ) ),
00271 SLOT( editResource() ) );
00272 connect( mListView, SIGNAL( contextMenuRequested ( QListViewItem *,
00273 const QPoint &, int ) ),
00274 SLOT( contextMenuRequested( QListViewItem *, const QPoint &,
00275 int ) ) );
00276
00277 updateView();
00278 }
00279
00280 ResourceView::~ResourceView()
00281 {
00282 }
00283
00284 void ResourceView::updateView()
00285 {
00286 mListView->clear();
00287
00288 KCal::CalendarResourceManager *manager = mCalendar->resourceManager();
00289
00290 KCal::CalendarResourceManager::Iterator it;
00291 for( it = manager->begin(); it != manager->end(); ++it ) {
00292 addResourceItem( *it );
00293 }
00294 }
00295
00296 void ResourceView::emitResourcesChanged()
00297 {
00298 mCalendar->resourceManager()->writeConfig();
00299 emit resourcesChanged();
00300 }
00301
00302 void ResourceView::addResource()
00303 {
00304 KCal::CalendarResourceManager *manager = mCalendar->resourceManager();
00305
00306 QStringList types = manager->resourceTypeNames();
00307 QStringList descs = manager->resourceTypeDescriptions();
00308 bool ok = false;
00309 QString desc = KInputDialog::getItem( i18n( "Resource Configuration" ),
00310 i18n( "Please select type of the new resource:" ), descs, 0, false, &ok,
00311 this );
00312 if ( !ok )
00313 return;
00314
00315 QString type = types[ descs.findIndex( desc ) ];
00316
00317
00318 ResourceCalendar *resource = manager->createResource( type );
00319 if( !resource ) {
00320 KMessageBox::error( this, i18n("<qt>Unable to create resource of type <b>%1</b>.</qt>")
00321 .arg( type ) );
00322 return;
00323 }
00324
00325 resource->setResourceName( i18n("%1 resource").arg( type ) );
00326
00327 KRES::ConfigDialog *dlg = new KRES::ConfigDialog( this, QString("calendar"), resource,
00328 "KRES::ConfigDialog" );
00329
00330 if ( dlg && dlg->exec() ) {
00331 resource->setTimeZoneId( KOPrefs::instance()->mTimeZoneId );
00332 manager->add( resource );
00333
00334
00335
00336 mCalendar->resourceAdded( resource );
00337 } else {
00338 delete resource;
00339 resource = 0;
00340 }
00341 if ( dlg ) delete dlg;
00342 emitResourcesChanged();
00343 }
00344
00345 void ResourceView::addResourceItem( ResourceCalendar *resource )
00346 {
00347
00348 ResourceItem *item=new ResourceItem( resource, this, mListView );
00349
00350 QColor resourceColor;
00351
00352 resourceColor= *KOPrefs::instance()->resourceColor(resource->identifier());
00353 item->setResourceColor(resourceColor);
00354
00355 connect( resource, SIGNAL( signalSubresourceAdded( ResourceCalendar *,
00356 const QString &,
00357 const QString &,
00358 const QString & ) ),
00359 SLOT( slotSubresourceAdded( ResourceCalendar *, const QString &,
00360 const QString &, const QString & ) ) );
00361
00362 connect( resource, SIGNAL( signalSubresourceRemoved( ResourceCalendar *,
00363 const QString &,
00364 const QString & ) ),
00365 SLOT( slotSubresourceRemoved( ResourceCalendar *, const QString &,
00366 const QString & ) ) );
00367
00368 connect( resource, SIGNAL( resourceSaved( ResourceCalendar * ) ),
00369 SLOT( closeResource( ResourceCalendar * ) ) );
00370
00371 updateResourceList();
00372 emit resourcesChanged();
00373 }
00374
00375
00376 void ResourceView::slotSubresourceAdded( ResourceCalendar *calendar,
00377 const QString& ,
00378 const QString& resource,
00379 const QString& label)
00380 {
00381 QListViewItem *i = mListView->findItem( calendar->resourceName(), 0 );
00382 if ( !i )
00383
00384 return;
00385
00386 ResourceItem *item = static_cast<ResourceItem *>( i );
00387 ( void )new ResourceItem( calendar, resource, label, this, item );
00388 emitResourcesChanged();
00389 }
00390
00391
00392 void ResourceView::slotSubresourceRemoved( ResourceCalendar * ,
00393 const QString &,
00394 const QString &resource )
00395 {
00396 delete findItemByIdentifier( resource );
00397 emit resourcesChanged();
00398 }
00399
00400 void ResourceView::closeResource( ResourceCalendar *r )
00401 {
00402 if ( mResourcesToClose.find( r ) >= 0 ) {
00403 r->close();
00404 mResourcesToClose.remove( r );
00405 }
00406 }
00407
00408 void ResourceView::updateResourceItem( ResourceCalendar *resource )
00409 {
00410 ResourceItem *item = findItem( resource );
00411 if ( item ) {
00412 item->update();
00413 }
00414 }
00415
00416 ResourceItem *ResourceView::currentItem()
00417 {
00418 QListViewItem *item = mListView->currentItem();
00419 ResourceItem *rItem = static_cast<ResourceItem *>( item );
00420 return rItem;
00421 }
00422
00423 void ResourceView::removeResource()
00424 {
00425 ResourceItem *item = currentItem();
00426 if ( !item ) return;
00427
00428 int km = KMessageBox::warningContinueCancel( this,
00429 i18n("<qt>Do you really want to delete the resource <b>%1</b>?</qt>")
00430 .arg( item->text( 0 ) ), "", KStdGuiItem::del() );
00431 if ( km == KMessageBox::Cancel ) return;
00432
00433
00434 #if 0
00435 if ( item->resource() == mCalendar->resourceManager()->standardResource() ) {
00436 KMessageBox::sorry( this,
00437 i18n( "You cannot delete your standard resource." ) );
00438 return;
00439 }
00440 #endif
00441 if ( item->isSubresource() ) {
00442
00443 } else {
00444 mCalendar->resourceManager()->remove( item->resource() );
00445 mListView->takeItem( item );
00446 delete item;
00447 }
00448 updateResourceList();
00449 emit resourcesChanged();
00450 }
00451
00452 void ResourceView::editResource()
00453 {
00454 ResourceItem *item = currentItem();
00455 if ( !item ) return;
00456
00457 ResourceCalendar *resource = item->resource();
00458
00459 KRES::ConfigDialog dlg( this, QString("calendar"), resource,
00460 "KRES::ConfigDialog" );
00461
00462 if ( dlg.exec() ) {
00463 item->setText( 0, resource->resourceName() );
00464
00465 mCalendar->resourceManager()->change( resource );
00466 }
00467 emitResourcesChanged();
00468 }
00469
00470 void ResourceView::currentChanged( QListViewItem *item )
00471 {
00472 ResourceItem *i = currentItem();
00473 if ( !item || i->isSubresource() ) {
00474 mDeleteButton->setEnabled( false );
00475 mEditButton->setEnabled( false );
00476 } else {
00477 mDeleteButton->setEnabled( true );
00478 mEditButton->setEnabled( true );
00479 }
00480 }
00481
00482 ResourceItem *ResourceView::findItem( ResourceCalendar *r )
00483 {
00484 QListViewItem *item;
00485 ResourceItem *i = 0;
00486 for( item = mListView->firstChild(); item; item = item->nextSibling() ) {
00487 i = static_cast<ResourceItem *>( item );
00488 if ( i->resource() == r ) break;
00489 }
00490 return i;
00491 }
00492
00493 ResourceItem *ResourceView::findItemByIdentifier( const QString& id )
00494 {
00495 QListViewItem *item;
00496 ResourceItem *i = 0;
00497 for( item = mListView->firstChild(); item; item = item->itemBelow() ) {
00498 i = static_cast<ResourceItem *>( item );
00499 if ( i->resourceIdentifier() == id )
00500 return i;
00501 }
00502 return 0;
00503 }
00504
00505
00506 void ResourceView::contextMenuRequested ( QListViewItem *i,
00507 const QPoint &pos, int )
00508 {
00509 KCal::CalendarResourceManager *manager = mCalendar->resourceManager();
00510 ResourceItem *item = static_cast<ResourceItem *>( i );
00511
00512 QPopupMenu *menu = new QPopupMenu( this );
00513 connect( menu, SIGNAL( aboutToHide() ), menu, SLOT( deleteLater() ) );
00514 if ( item ) {
00515 int reloadId = menu->insertItem( i18n("Re&load"), this,
00516 SLOT( reloadResource() ) );
00517 menu->setItemEnabled( reloadId, item->resource()->isActive() );
00518 int saveId = menu->insertItem( i18n("&Save"), this,
00519 SLOT( saveResource() ) );
00520 menu->setItemEnabled( saveId, item->resource()->isActive() );
00521 menu->insertSeparator();
00522
00523 menu->insertItem( i18n("Show &Info"), this, SLOT( showInfo() ) );
00524
00525 if ( KOPrefs::instance()->agendaViewUsesResourceColor() ) {
00526 QPopupMenu *assignMenu= new QPopupMenu( menu );
00527 assignMenu->insertItem( i18n( "&Assign Color" ), this, SLOT( assignColor() ) );
00528 if ( item->resourceColor().isValid() )
00529 assignMenu->insertItem( i18n( "&Disable Color" ), this, SLOT( disableColor() ) );
00530 menu->insertItem( i18n( "Resources Colors" ), assignMenu );
00531 }
00532
00533 menu->insertItem( i18n("&Edit..."), this, SLOT( editResource() ) );
00534 menu->insertItem( i18n("&Remove"), this, SLOT( removeResource() ) );
00535 if ( item->resource() != manager->standardResource() ) {
00536 menu->insertSeparator();
00537 menu->insertItem( i18n("Use as &Default Calendar"), this,
00538 SLOT( setStandard() ) );
00539 }
00540
00541 menu->insertSeparator();
00542 }
00543 menu->insertItem( i18n("&Add..."), this, SLOT( addResource() ) );
00544
00545 menu->popup( pos );
00546 }
00547
00548 void ResourceView::assignColor()
00549 {
00550 ResourceItem *item = currentItem();
00551 if ( !item )
00552 return;
00553
00554 QColor myColor;
00555 KCal::ResourceCalendar *cal = item->resource();
00556
00557 QString identifier = cal->identifier();
00558 if ( item->isSubresource() )
00559 identifier = item->resourceIdentifier();
00560
00561 QColor defaultColor =*KOPrefs::instance()->resourceColor( identifier );
00562
00563 int result = KColorDialog::getColor( myColor,defaultColor);
00564
00565 if ( result == KColorDialog::Accepted ) {
00566 KOPrefs::instance()->setResourceColor( identifier, myColor );
00567 item->setResourceColor( myColor );
00568 item->update();
00569 emitResourcesChanged();
00570 }
00571 }
00572
00573 void ResourceView::disableColor()
00574 {
00575 ResourceItem *item = currentItem();
00576 if ( !item )
00577 return;
00578 QColor colorInvalid;
00579 KCal::ResourceCalendar *cal = item->resource();
00580 QString identifier = cal->identifier();
00581 if ( item->isSubresource() )
00582 identifier = item->resourceIdentifier();
00583 KOPrefs::instance()->setResourceColor( identifier, colorInvalid );
00584 item->setResourceColor( colorInvalid );
00585 item->update();
00586 emitResourcesChanged();
00587 }
00588 void ResourceView::showInfo()
00589 {
00590 ResourceItem *item = currentItem();
00591 if ( !item ) return;
00592
00593 QString txt = "<qt>" + item->resource()->infoText() + "</qt>";
00594 KMessageBox::information( this, txt );
00595 }
00596
00597 void ResourceView::reloadResource()
00598 {
00599 ResourceItem *item = currentItem();
00600 if ( !item ) return;
00601
00602 ResourceCalendar *r = item->resource();
00603 r->load();
00604 }
00605
00606 void ResourceView::saveResource()
00607 {
00608 ResourceItem *item = currentItem();
00609 if ( !item ) return;
00610
00611 ResourceCalendar *r = item->resource();
00612 r->save();
00613 }
00614
00615 void ResourceView::setStandard()
00616 {
00617 ResourceItem *item = currentItem();
00618 if ( !item ) return;
00619
00620 ResourceCalendar *r = item->resource();
00621 KCal::CalendarResourceManager *manager = mCalendar->resourceManager();
00622 manager->setStandardResource( r );
00623 updateResourceList();
00624 }
00625
00626 void ResourceView::updateResourceList()
00627 {
00628 QListViewItemIterator it( mListView );
00629 ResourceCalendar* stdRes = mCalendar->resourceManager()->standardResource();
00630 while ( it.current() ) {
00631 ResourceItem *item = static_cast<ResourceItem *>( it.current() );
00632 item->setStandardResource( item->resource() == stdRes );
00633 ++it;
00634 }
00635 }
00636
00637 void ResourceView::showButtons( bool visible )
00638 {
00639 if ( visible ) {
00640 mAddButton->show();
00641 mDeleteButton->show();
00642 mEditButton->show();
00643 } else {
00644 mAddButton->hide();
00645 mDeleteButton->hide();
00646 mEditButton->hide();
00647 }
00648 }
00649
00650 void ResourceView::requestClose( ResourceCalendar *r )
00651 {
00652 mResourcesToClose.append( r );
00653 }
00654
00655 #include "resourceview.moc"