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 #include "koviewmanager.h"
00028 #include "multiagendaview.h"
00029
00030 #include <dcopref.h>
00031 #include <kcolordialog.h>
00032 #include <kdialog.h>
00033 #include <tdelistview.h>
00034 #include <tdelocale.h>
00035 #include <kdebug.h>
00036 #include <tdeglobal.h>
00037 #include <tdemessagebox.h>
00038 #include <kinputdialog.h>
00039 #include <kiconloader.h>
00040 #include <tderesources/resource.h>
00041 #include <tderesources/configdialog.h>
00042 #include <libkcal/calendarresources.h>
00043 #include <tdeconfig.h>
00044
00045 #include <tqhbox.h>
00046 #include <tqheader.h>
00047 #include <tqlayout.h>
00048 #include <tqlabel.h>
00049 #include <tqpainter.h>
00050 #include <tqpushbutton.h>
00051 #include <tqpopupmenu.h>
00052 #include <tqregexp.h>
00053 #include <tqtooltip.h>
00054 #include <tqwhatsthis.h>
00055
00056 #include "koprefs.h"
00057
00058 using namespace KCal;
00059
00060 static TQString labelFromSubResName( ResourceCalendar *resource, const TQString &subRes )
00061 {
00062
00063 DCOPRef ref( "kmail", "KMailICalIface" );
00064 DCOPReply reply = ref.call( "dimapAccounts" );
00065 if ( !reply.isValid() ) {
00066 kdDebug() << "DCOP Call dimapAccounts() failed " << endl;
00067 return TQString();
00068 }
00069
00070 TQString label;
00071 if ( (int)reply > 1 ) {
00072 if( resource && !resource->resourceName().isEmpty() ) {
00073 label = i18n( "My %1 (%2)" ).arg( subRes, resource->resourceName() );
00074 } else {
00075 label = i18n( "My %1" ).arg( subRes );
00076 }
00077 } else {
00078 label = i18n( "My %1" ).arg( subRes );
00079 }
00080 return label;
00081 }
00082
00083 static TQString labelFromIdentifier( ResourceCalendar *resource, const TQString &identifier )
00084 {
00085 TQString subResLabel;
00086 if ( identifier.contains( "/.INBOX.directory/" ) ) {
00087 TQString subResName = identifier;
00088 subResName.remove( TQRegExp( "^.*/\\.INBOX\\.directory/" ) );
00089 subResLabel = labelFromSubResName( resource, subResName );
00090 }
00091 return subResLabel;
00092 }
00093
00094 ResourceViewFactory::ResourceViewFactory( CalendarResources *calendar, CalendarView *view )
00095 : mCalendar( calendar ), mCalendarView( view ), mResourceView( 0 )
00096 {
00097 }
00098
00099 CalendarViewExtension *ResourceViewFactory::create( TQWidget *parent )
00100 {
00101 mResourceView = new ResourceView( mCalendar, mCalendarView, parent );
00102
00103 TQObject::connect( mResourceView, TQT_SIGNAL( resourcesChanged() ),
00104 mCalendarView, TQT_SLOT( resourcesChanged() ) );
00105 TQObject::connect( mResourceView, TQT_SIGNAL( resourcesChanged() ),
00106 mCalendarView, TQT_SLOT( updateCategories() ) );
00107
00108 TQObject::connect( mCalendar,
00109 TQT_SIGNAL( signalResourceAdded( ResourceCalendar * ) ),
00110 mResourceView,
00111 TQT_SLOT( addResourceItem( ResourceCalendar * ) ) );
00112 TQObject::connect( mCalendar,
00113 TQT_SIGNAL( signalResourceModified( ResourceCalendar * ) ),
00114 mResourceView,
00115 TQT_SLOT( updateResourceItem( ResourceCalendar * ) ) );
00116 TQObject::connect( mCalendar, TQT_SIGNAL( signalResourceAdded( ResourceCalendar * ) ),
00117 mCalendarView, TQT_SLOT( updateCategories() ) );
00118 TQObject::connect( mCalendar, TQT_SIGNAL( signalResourceModified( ResourceCalendar * ) ),
00119 mCalendarView, TQT_SLOT( updateCategories() ) );
00120
00121 return mResourceView;
00122 }
00123
00124 ResourceView *ResourceViewFactory::resourceView() const
00125 {
00126 return mResourceView;
00127 }
00128
00129 ResourceItem::ResourceItem( ResourceCalendar *resource, ResourceView *view,
00130 TDEListView *parent )
00131 : TQCheckListItem( parent, resource->resourceName(), CheckBox ),
00132 mResource( resource ), mResourceView( view ), mBlockStateChange( false ),
00133 mIsSubresource( false ), mResourceIdentifier( TQString() ),
00134 mSubItemsCreated( false ), mIsStandardResource( false )
00135 {
00136 mResourceColor = TQColor();
00137 setGuiState();
00138
00139 if ( mResource->isActive() ) {
00140 createSubresourceItems();
00141 }
00142 }
00143
00144 void ResourceItem::createSubresourceItems()
00145 {
00146 const TQStringList subresources = mResource->subresources();
00147 if ( !subresources.isEmpty() ) {
00148 setOpen( true );
00149 setExpandable( true );
00150
00151 TQStringList::ConstIterator it;
00152 for ( it=subresources.begin(); it!=subresources.end(); ++it ) {
00153 TQString text = labelFromIdentifier( mResource, *it );
00154 if ( text.isEmpty() ) {
00155 text = mResource->labelForSubresource( *it );
00156 }
00157 ResourceItem *item = new ResourceItem( mResource, *it, text, mResourceView, this );
00158 TQColor resourceColor = *KOPrefs::instance()->resourceColor( *it );
00159 item->setResourceColor( resourceColor );
00160 item->update();
00161 }
00162 }
00163 mSubItemsCreated = true;
00164 }
00165
00166 ResourceItem::ResourceItem( ResourceCalendar *resource, const TQString &identifier,
00167 const TQString &label, ResourceView *view, ResourceItem *parent )
00168 : TQCheckListItem( parent, label, CheckBox ), mResource( resource ),
00169 mResourceView( view ), mBlockStateChange( false ), mIsSubresource( true ),
00170 mSubItemsCreated( false ), mIsStandardResource( false )
00171 {
00172 mResourceColor = TQColor();
00173 mResourceIdentifier = identifier;
00174 setGuiState();
00175 }
00176
00177 void ResourceItem::setGuiState()
00178 {
00179 mBlockStateChange = true;
00180 if ( mIsSubresource )
00181 setOn( mResource->subresourceActive( mResourceIdentifier ) );
00182 else
00183 setOn( mResource->isActive() );
00184 mBlockStateChange = false;
00185 }
00186
00187 void ResourceItem::stateChange( bool active )
00188 {
00189 if ( mBlockStateChange ) return;
00190
00191 if ( mIsSubresource ) {
00192 mResource->setSubresourceActive( mResourceIdentifier, active );
00193 } else {
00194 if ( active ) {
00195 if ( mResource->load() ) {
00196 mResource->setActive( true );
00197 if ( !mSubItemsCreated )
00198 createSubresourceItems();
00199 }
00200 } else {
00201
00202
00203 mResourceView->requestClose( mResource );
00204 if ( mResource->save() ) {
00205 mResource->setActive( false );
00206 }
00207 }
00208
00209 setOpen( mResource->isActive() && childCount() > 0 );
00210
00211 setGuiState();
00212 }
00213
00214 mResourceView->emitResourcesChanged();
00215 }
00216
00217 void ResourceItem::update()
00218 {
00219 setGuiState();
00220 }
00221
00222 void ResourceItem::setResourceColor(TQColor& color)
00223 {
00224 if ( color.isValid() ) {
00225 if ( mResourceColor != color ) {
00226 TQPixmap px(height()-4,height()-4);
00227 mResourceColor = color;
00228 px.fill(color);
00229 setPixmap(0,px);
00230 }
00231 } else {
00232 mResourceColor = color ;
00233 setPixmap(0,0);
00234 }
00235 }
00236
00237 void ResourceItem::setStandardResource( bool std )
00238 {
00239 if ( mIsStandardResource != std ) {
00240 mIsStandardResource = std;
00241 repaint();
00242 }
00243 }
00244
00245 void ResourceItem::paintCell(TQPainter *p, const TQColorGroup &cg,
00246 int column, int width, int alignment)
00247 {
00248 TQFont oldFont = p->font();
00249 TQFont newFont = oldFont;
00250 newFont.setBold( mIsStandardResource && !mIsSubresource );
00251 p->setFont( newFont );
00252 TQCheckListItem::paintCell( p, cg, column, width, alignment );
00253 p->setFont( oldFont );
00254
00255
00256
00257 }
00258
00259
00260 ResourceView::ResourceView( CalendarResources *calendar,
00261 CalendarView *view, TQWidget *parent, const char *name )
00262 : CalendarViewExtension( parent, name ), mCalendar( calendar ), mCalendarView( view )
00263 {
00264 TQBoxLayout *topLayout = new TQVBoxLayout( this, 0, KDialog::spacingHint() );
00265
00266 TQHBoxLayout *buttonBox = new TQHBoxLayout();
00267 buttonBox->setSpacing( KDialog::spacingHint() );
00268 topLayout->addLayout( buttonBox );
00269
00270 TQLabel *calLabel = new TQLabel( i18n( "Calendar" ), this );
00271 buttonBox->addWidget( calLabel );
00272 buttonBox->addStretch( 1 );
00273
00274 mAddButton = new TQPushButton( this, "add" );
00275 mAddButton->setIconSet( SmallIconSet( "add" ) );
00276 buttonBox->addWidget( mAddButton );
00277 TQToolTip::add( mAddButton, i18n( "Add calendar" ) );
00278 TQWhatsThis::add( mAddButton,
00279 i18n( "<qt><p>Press this button to add a resource to "
00280 "KOrganizer.</p>"
00281 "<p>Events, journal entries and to-dos are retrieved "
00282 "and stored on resources. Available "
00283 "resources include groupware servers, local files, "
00284 "journal entries as blogs on a server, etc... </p>"
00285 "<p>If you have more than one active resource, "
00286 "when creating incidents you will either automatically "
00287 "use the default resource or be prompted "
00288 "to select the resource to use.</p></qt>" ) );
00289 mEditButton = new TQPushButton( this, "edit" );
00290 mEditButton->setIconSet( SmallIconSet( "edit" ) );
00291 buttonBox->addWidget( mEditButton );
00292 TQToolTip::add( mEditButton, i18n( "Edit calendar settings" ) );
00293 TQWhatsThis::add( mEditButton,
00294 i18n( "Press this button to edit the resource currently "
00295 "selected on the KOrganizer resources list above." ) );
00296 mDeleteButton = new TQPushButton( this, "del" );
00297 mDeleteButton->setIconSet( SmallIconSet( "remove" ) );
00298 buttonBox->addWidget( mDeleteButton );
00299 TQToolTip::add( mDeleteButton, i18n( "Remove calendar" ) );
00300 TQWhatsThis::add( mDeleteButton,
00301 i18n( "Press this button to delete the resource currently "
00302 "selected on the KOrganizer resources list above." ) );
00303 mDeleteButton->setDisabled( true );
00304 mEditButton->setDisabled( true );
00305
00306 mListView = new TDEListView( this );
00307 mListView->header()->hide();
00308 TQWhatsThis::add( mListView,
00309 i18n( "<qt><p>Select on this list the active KOrganizer "
00310 "resources. Check the resource box to make it "
00311 "active. Press the \"Add...\" button below to add new "
00312 "resources to the list.</p>"
00313 "<p>Events, journal entries and to-dos are retrieved "
00314 "and stored on resources. Available "
00315 "resources include groupware servers, local files, "
00316 "journal entries as blogs on a server, etc...</p>"
00317 "<p>If you have more than one active resource, "
00318 "when creating incidents you will either automatically "
00319 "use the default resource or be prompted "
00320 "to select the resource to use.</p></qt>" ) );
00321 mListView->addColumn( i18n("Calendar") );
00322 mListView->setResizeMode( TQListView::LastColumn );
00323 topLayout->addWidget( mListView );
00324
00325 connect( mListView, TQT_SIGNAL( clicked( TQListViewItem * ) ),
00326 TQT_SLOT( currentChanged( TQListViewItem * ) ) );
00327 connect( mAddButton, TQT_SIGNAL( clicked() ), TQT_SLOT( addResource() ) );
00328 connect( mDeleteButton, TQT_SIGNAL( clicked() ), TQT_SLOT( removeResource() ) );
00329 connect( mEditButton, TQT_SIGNAL( clicked() ), TQT_SLOT( editResource() ) );
00330 connect( mListView, TQT_SIGNAL( doubleClicked ( TQListViewItem *, const TQPoint &,
00331 int ) ),
00332 TQT_SLOT( editResource() ) );
00333 connect( mListView, TQT_SIGNAL( contextMenuRequested ( TQListViewItem *,
00334 const TQPoint &, int ) ),
00335 TQT_SLOT( contextMenuRequested( TQListViewItem *, const TQPoint &,
00336 int ) ) );
00337
00338 updateView();
00339 }
00340
00341 ResourceView::~ResourceView()
00342 {
00343 }
00344
00345 void ResourceView::updateView()
00346 {
00347 mListView->clear();
00348
00349 CalendarResourceManager *manager = mCalendar->resourceManager();
00350
00351 CalendarResourceManager::Iterator it;
00352 for( it = manager->begin(); it != manager->end(); ++it ) {
00353 addResourceItem( *it );
00354 }
00355 }
00356
00357 void ResourceView::emitResourcesChanged()
00358 {
00359 mCalendar->resourceManager()->writeConfig();
00360 emit resourcesChanged();
00361 }
00362
00363 void ResourceView::addResource()
00364 {
00365 bool ok = false;
00366 CalendarResourceManager *manager = mCalendar->resourceManager();
00367 ResourceItem *item = static_cast<ResourceItem*>( mListView->selectedItem() );
00368 if ( item && ( item->isSubresource() || item->resource()->canHaveSubresources() ) ) {
00369 const TQString folderName =
00370 KInputDialog::getText( i18n( "Add Subresource" ),
00371 i18n( "Please enter a name for the new subresource" ), TQString(),
00372 &ok, this );
00373 if ( !ok )
00374 return;
00375 const TQString parentId = item->isSubresource() ? item->resourceIdentifier() : TQString:: null;
00376 if ( !item->resource()->addSubresource( folderName, parentId ) ) {
00377 KMessageBox::error(
00378 this,
00379 i18n( "<qt>Unable to create subresource <b>%1</b>.</qt>" ).arg( folderName ) );
00380 }
00381 return;
00382 }
00383
00384 TQStringList types = manager->resourceTypeNames();
00385 TQStringList descs = manager->resourceTypeDescriptions();
00386 TQString desc =
00387 KInputDialog::getItem( i18n( "Resource Configuration" ),
00388 i18n( "Please select type of the new resource:" ),
00389 descs, 0, false, &ok, this );
00390 if ( !ok ) {
00391 return;
00392 }
00393
00394 TQString type = types[ descs.findIndex( desc ) ];
00395
00396
00397 ResourceCalendar *resource = manager->createResource( type );
00398 if( !resource ) {
00399 KMessageBox::error(
00400 this,
00401 i18n( "<qt>Unable to create resource of type <b>%1</b>.</qt>" ).arg( type ) );
00402 return;
00403 }
00404
00405 KRES::ConfigDialog *dlg =
00406 new KRES::ConfigDialog( this, TQString( "calendar" ), resource, "KRES::ConfigDialog" );
00407
00408 bool success = true;
00409 if ( !dlg || !dlg->exec() )
00410 success = false;
00411
00412 if ( success ) {
00413 resource->setTimeZoneId( KOPrefs::instance()->mTimeZoneId );
00414 if ( resource->isActive() && ( !resource->open() || !resource->load() ) ) {
00415
00416
00417 KMessageBox::error( this, i18n("Unable to create the resource.").arg( type ) );
00418 success = false;
00419 }
00420 }
00421
00422 if ( success ) {
00423 manager->add( resource );
00424
00425
00426
00427 mCalendar->resourceAdded( resource );
00428 }
00429
00430 if ( !success )
00431 delete resource;
00432
00433 delete dlg;
00434
00435
00436 emitResourcesChanged();
00437 }
00438
00439 void ResourceView::addResourceItem( ResourceCalendar *resource )
00440 {
00441
00442 ResourceItem *item = new ResourceItem( resource, this, mListView );
00443
00444
00445
00446 if ( !resource->canHaveSubresources() || resource->subresources().isEmpty() ) {
00447 TQColor resourceColor = *KOPrefs::instance()->resourceColor(resource->identifier());
00448 item->setResourceColor(resourceColor);
00449 item->update();
00450 }
00451
00452 connect( resource, TQT_SIGNAL( signalSubresourceAdded( ResourceCalendar *,
00453 const TQString &,
00454 const TQString &,
00455 const TQString & ) ),
00456 TQT_SLOT( slotSubresourceAdded( ResourceCalendar *, const TQString &,
00457 const TQString &, const TQString & ) ) );
00458
00459 connect( resource, TQT_SIGNAL( signalSubresourceRemoved( ResourceCalendar *,
00460 const TQString &,
00461 const TQString & ) ),
00462 TQT_SLOT( slotSubresourceRemoved( ResourceCalendar *, const TQString &,
00463 const TQString & ) ) );
00464
00465 connect( resource, TQT_SIGNAL( resourceSaved( ResourceCalendar * ) ),
00466 TQT_SLOT( closeResource( ResourceCalendar * ) ) );
00467
00468 updateResourceList();
00469 emit resourcesChanged();
00470 }
00471
00472
00473 void ResourceView::slotSubresourceAdded( ResourceCalendar *resource,
00474 const TQString &type,
00475 const TQString &identifier,
00476 const TQString &label )
00477 {
00478 Q_UNUSED( type );
00479
00480 TQListViewItem *lvitem = mListView->findItem( resource->resourceName(), 0 );
00481 if ( !lvitem )
00482
00483 return;
00484
00485 if ( findItemByIdentifier( identifier ) ) return;
00486
00487 TQString text = labelFromIdentifier( resource, identifier );
00488 if ( text.isEmpty() ) {
00489 text = label;
00490 }
00491 ResourceItem *item = static_cast<ResourceItem *>( lvitem );
00492 ResourceItem *newItem = new ResourceItem( resource, identifier, text, this, item );
00493 TQColor resourceColor = *KOPrefs::instance()->resourceColor( identifier );
00494 newItem->setResourceColor( resourceColor );
00495 }
00496
00497
00498 void ResourceView::slotSubresourceRemoved( ResourceCalendar *resource,
00499 const TQString &type,
00500 const TQString &identifier )
00501 {
00502 Q_UNUSED( resource );
00503 Q_UNUSED( type );
00504
00505 delete findItemByIdentifier( identifier );
00506 emit resourcesChanged();
00507 }
00508
00509 void ResourceView::closeResource( ResourceCalendar *resource )
00510 {
00511 if ( mResourcesToClose.find( resource ) >= 0 ) {
00512 resource->close();
00513 mResourcesToClose.remove( resource );
00514 }
00515 }
00516
00517 void ResourceView::updateResourceItem( ResourceCalendar *resource )
00518 {
00519 ResourceItem *item = findItem( resource );
00520 if ( item ) {
00521 item->update();
00522 }
00523 }
00524
00525 ResourceItem *ResourceView::currentItem()
00526 {
00527 TQListViewItem *item = mListView->currentItem();
00528 ResourceItem *rItem = static_cast<ResourceItem *>( item );
00529 return rItem;
00530 }
00531
00532 void ResourceView::removeResource()
00533 {
00534 ResourceItem *item = currentItem();
00535 if ( !item ) return;
00536
00537
00538 if ( !item->isSubresource() ) {
00539 if ( item->resource() == mCalendar->resourceManager()->standardResource() ) {
00540 KMessageBox::sorry(
00541 this,
00542 i18n( "<qt>You may not delete your standard calendar resource.<p>"
00543 "You can change the standard calendar resource in the "
00544 "Trinity Control Center using the TDE Resource settings under the "
00545 "TDE Components area.</qt>" ) );
00546 return;
00547 }
00548 }
00549
00550 TQString moreInfo;
00551 if ( item->resource()->type() == "imap" || item->resource()->type() == "scalix" ) {
00552 moreInfo = i18n( "This is a groupware folder so you can always re-subscribe to the folder "
00553 "later as you desire." );
00554 } else {
00555 moreInfo = i18n( "The contents will not be removed so you can always re-add this calendar "
00556 "later as you desire." );
00557 }
00558
00559 int km =
00560 KMessageBox::warningContinueCancel(
00561 this,
00562 i18n( "<qt>Do you really want to remove the calendar <b>%1</b>?<p><b>Note:</b> %2</qt>" ).
00563 arg( item->text( 0 ), moreInfo ),
00564 "", KGuiItem( i18n( "&Remove" ) ) );
00565 if ( km == KMessageBox::Cancel ) {
00566 return;
00567 }
00568
00569 if ( item->isSubresource() ) {
00570 if ( !item->resource()->removeSubresource( item->resourceIdentifier() ) )
00571 KMessageBox::sorry(
00572 this,
00573 i18n ("<qt>Failed to remove the subresource <b>%1</b>. The "
00574 "reason could be that it is a built-in one which cannot "
00575 "be removed, or that the removal of the underlying storage "
00576 "folder failed.</qt>").arg( item->resource()->name() ) );
00577 return;
00578 } else {
00579 mCalendar->resourceManager()->remove( item->resource() );
00580 }
00581 mListView->takeItem( item );
00582 delete item;
00583
00584 updateResourceList();
00585 emit resourcesChanged();
00586 }
00587
00588 void ResourceView::editResource()
00589 {
00590 bool ok = false;
00591 ResourceItem *item = currentItem();
00592 if (!item) return;
00593 ResourceCalendar *resource = item->resource();
00594
00595 if ( item->isSubresource() ) {
00596 if ( resource->type() == "imap" || resource->type() == "scalix" ) {
00597 TQString identifier = item->resourceIdentifier();
00598 if ( !identifier.contains( "/.INBOX.directory/" ) ) {
00599 KMessageBox::sorry(
00600 this,
00601 i18n( "Cannot rename someone else's calendar folder." ) );
00602 return;
00603 }
00604
00605 TQString oldSubResourceName = identifier;
00606 oldSubResourceName.remove( TQRegExp( "^.*/\\.INBOX\\.directory/" ) );
00607 TQString newSubResourceName =
00608 KInputDialog::getText(
00609 i18n( "Rename Subresource" ),
00610 i18n( "<qt>Enter a new name for the subresource<p>"
00611 "<b>Note:</b> the new name will take affect after the next sync.</qt>" ),
00612 oldSubResourceName, &ok, this );
00613 if ( !ok ) {
00614 return;
00615 }
00616
00617 DCOPRef ref( "kmail", "KMailICalIface" );
00618 DCOPReply reply = ref.call( "changeResourceUIName", identifier, newSubResourceName );
00619 if ( !reply.isValid() ) {
00620 KMessageBox::sorry(
00621 this,
00622 i18n( "Communication with KMail failed when attempting to change the folder name." ) );
00623 return;
00624 }
00625
00626 item->setText( 0, labelFromSubResName( resource, newSubResourceName ) );
00627
00628 KOrg::BaseView *cV = mCalendarView->viewManager()->currentView();
00629 if ( cV && cV == mCalendarView->viewManager()->multiAgendaView() ) {
00630 mCalendarView->viewManager()->multiAgendaView()->deSelectAgendaView();
00631 }
00632 } else {
00633 KMessageBox::sorry(
00634 this,
00635 i18n ("<qt>Cannot edit the subresource <b>%1</b>.</qt>").arg( item->resource()->name() ) );
00636 }
00637 } else {
00638 KRES::ConfigDialog dlg( this, TQString("calendar"), resource, "KRES::ConfigDialog" );
00639
00640 if ( dlg.exec() ) {
00641 item->setText( 0, resource->resourceName() );
00642 mCalendar->resourceManager()->change( resource );
00643 }
00644 }
00645 emitResourcesChanged();
00646 }
00647
00648 void ResourceView::currentChanged( TQListViewItem *lvitem )
00649 {
00650 ResourceItem *item = currentItem();
00651 if ( !lvitem || item->isSubresource() ) {
00652 mDeleteButton->setEnabled( false );
00653 mEditButton->setEnabled( false );
00654 } else {
00655 mDeleteButton->setEnabled( true );
00656 mEditButton->setEnabled( true );
00657 }
00658 }
00659
00660 ResourceItem *ResourceView::findItem( ResourceCalendar *resource )
00661 {
00662 TQListViewItem *lvitem;
00663 ResourceItem *item = 0;
00664 for( lvitem = mListView->firstChild(); lvitem; lvitem = lvitem->nextSibling() ) {
00665 item = static_cast<ResourceItem *>( lvitem );
00666 if ( item->resource() == resource ) break;
00667 }
00668 return item;
00669 }
00670
00671 ResourceItem *ResourceView::findItemByIdentifier( const TQString &identifier )
00672 {
00673 TQListViewItem *lvitem;
00674 ResourceItem *item = 0;
00675 for ( lvitem = mListView->firstChild(); lvitem; lvitem = lvitem->itemBelow() ) {
00676 item = static_cast<ResourceItem *>( lvitem );
00677 if ( item->resourceIdentifier() == identifier )
00678 return item;
00679 }
00680 return 0;
00681 }
00682
00683 void ResourceView::contextMenuRequested ( TQListViewItem *lvitem, const TQPoint &pos, int )
00684 {
00685 CalendarResourceManager *manager = mCalendar->resourceManager();
00686 ResourceItem *item = static_cast<ResourceItem *>( lvitem );
00687
00688 TQPopupMenu *menu = new TQPopupMenu( this );
00689 connect( menu, TQT_SIGNAL( aboutToHide() ), menu, TQT_SLOT( deleteLater() ) );
00690 if ( item ) {
00691 int reloadId = menu->insertItem( i18n("Re&load"), this,
00692 TQT_SLOT( reloadResource() ) );
00693 menu->setItemEnabled( reloadId, item->resource()->isActive() );
00694 int saveId = menu->insertItem( i18n("&Save"), this,
00695 TQT_SLOT( saveResource() ) );
00696 menu->setItemEnabled( saveId, item->resource()->isActive() );
00697 menu->insertSeparator();
00698
00699 menu->insertItem( i18n("Show &Info"), this, TQT_SLOT( showInfo() ) );
00700
00701 if ( KOPrefs::instance()->agendaViewColors() != KOPrefs::CategoryOnly ) {
00702 TQPopupMenu *assignMenu= new TQPopupMenu( menu );
00703 assignMenu->insertItem( i18n( "&Assign Color" ), this, TQT_SLOT( assignColor() ) );
00704 if ( item->resourceColor().isValid() )
00705 assignMenu->insertItem( i18n( "&Disable Color" ), this, TQT_SLOT( disableColor() ) );
00706 menu->insertItem( i18n( "Resources Colors" ), assignMenu );
00707 }
00708
00709 if ( item->isSubresource() &&
00710 ( item->resource()->type() == "imap" || item->resource()->type() == "scalix" ) ) {
00711 if ( item->resourceIdentifier().contains( "/.INBOX.directory/" ) ) {
00712 menu->insertItem( i18n("&Rename..."), this, TQT_SLOT( editResource() ) );
00713 }
00714 } else {
00715 menu->insertItem( i18n("&Edit..."), this, TQT_SLOT( editResource() ) );
00716 }
00717 menu->insertItem( i18n("&Remove"), this, TQT_SLOT( removeResource() ) );
00718 if ( item->resource() != manager->standardResource() ) {
00719 menu->insertSeparator();
00720 menu->insertItem( i18n("Use as &Default Calendar"), this,
00721 TQT_SLOT( setStandard() ) );
00722 }
00723
00724 menu->insertSeparator();
00725 }
00726 menu->insertItem( i18n("&Add..."), this, TQT_SLOT( addResource() ) );
00727
00728 menu->popup( pos );
00729 }
00730
00731 void ResourceView::assignColor()
00732 {
00733 ResourceItem *item = currentItem();
00734 if ( !item )
00735 return;
00736
00737 TQColor myColor;
00738 ResourceCalendar *cal = item->resource();
00739
00740 TQString identifier = cal->identifier();
00741 if ( item->isSubresource() )
00742 identifier = item->resourceIdentifier();
00743
00744 TQColor defaultColor =*KOPrefs::instance()->resourceColor( identifier );
00745
00746 int result = KColorDialog::getColor( myColor,defaultColor);
00747
00748 if ( result == KColorDialog::Accepted ) {
00749 KOPrefs::instance()->setResourceColor( identifier, myColor );
00750 item->setResourceColor( myColor );
00751 item->update();
00752 emitResourcesChanged();
00753 }
00754 }
00755
00756 void ResourceView::disableColor()
00757 {
00758 ResourceItem *item = currentItem();
00759 if ( !item ) {
00760 return;
00761 }
00762
00763 TQColor colorInvalid;
00764 ResourceCalendar *cal = item->resource();
00765 TQString identifier = cal->identifier();
00766 if ( item->isSubresource() ) {
00767 identifier = item->resourceIdentifier();
00768 }
00769 KOPrefs::instance()->setResourceColor( identifier, colorInvalid );
00770 item->setResourceColor( colorInvalid );
00771 item->update();
00772 emitResourcesChanged();
00773 }
00774 void ResourceView::showInfo()
00775 {
00776 ResourceItem *item = currentItem();
00777 if ( !item ) return;
00778
00779 TQString identifier;
00780 if ( item->isSubresource() ) {
00781 identifier = "<p>" + item->resourceIdentifier();
00782 }
00783
00784 TQString txt = "<qt>" + item->resource()->infoText() + identifier + "</qt>";
00785 KMessageBox::information( this, txt );
00786 }
00787
00788 void ResourceView::reloadResource()
00789 {
00790 ResourceItem *item = currentItem();
00791 if ( !item ) return;
00792
00793 ResourceCalendar *resource = item->resource();
00794 resource->load();
00795 }
00796
00797 void ResourceView::saveResource()
00798 {
00799 ResourceItem *item = currentItem();
00800 if ( !item ) return;
00801
00802 ResourceCalendar *resource = item->resource();
00803 resource->save();
00804 }
00805
00806 void ResourceView::setStandard()
00807 {
00808 ResourceItem *item = currentItem();
00809 if ( !item ) return;
00810
00811 ResourceCalendar *resource = item->resource();
00812 CalendarResourceManager *manager = mCalendar->resourceManager();
00813 manager->setStandardResource( resource );
00814 updateResourceList();
00815 }
00816
00817 void ResourceView::updateResourceList()
00818 {
00819 TQListViewItemIterator it( mListView );
00820 ResourceCalendar* stdRes = mCalendar->resourceManager()->standardResource();
00821 while ( it.current() ) {
00822 ResourceItem *item = static_cast<ResourceItem *>( it.current() );
00823 item->setStandardResource( item->resource() == stdRes );
00824 ++it;
00825 }
00826 }
00827
00828 void ResourceView::showButtons( bool visible )
00829 {
00830 if ( visible ) {
00831 mAddButton->show();
00832 mDeleteButton->show();
00833 mEditButton->show();
00834 } else {
00835 mAddButton->hide();
00836 mDeleteButton->hide();
00837 mEditButton->hide();
00838 }
00839 }
00840
00841 void ResourceView::requestClose( ResourceCalendar *r )
00842 {
00843 mResourcesToClose.append( r );
00844 }
00845
00846 #include "resourceview.moc"