resourceview.cpp
00001 /* 00002 This file is part of KOrganizer. 00003 00004 Copyright (c) 2003,2004 Cornelius Schumacher <schumacher@kde.org> 00005 Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com> 00006 00007 This program is free software; you can redistribute it and/or modify 00008 it under the terms of the GNU General Public License as published by 00009 the Free Software Foundation; either version 2 of the License, or 00010 (at your option) any later version. 00011 00012 This program is distributed in the hope that it will be useful, 00013 but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 GNU General Public License for more details. 00016 00017 You should have received a copy of the GNU General Public License 00018 along with this program; if not, write to the Free Software 00019 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 00020 00021 As a special exception, permission is given to link this program 00022 with any edition of TQt, and distribute the resulting executable, 00023 without including the source code for TQt in the source distribution. 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 <klistview.h> 00034 #include <klocale.h> 00035 #include <kdebug.h> 00036 #include <kglobal.h> 00037 #include <kmessagebox.h> 00038 #include <kinputdialog.h> 00039 #include <kiconloader.h> 00040 #include <kresources/resource.h> 00041 #include <kresources/configdialog.h> 00042 #include <libkcal/calendarresources.h> 00043 #include <kconfig.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/" ) ) { // my subresource 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 KListView *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 // This resource has subresources 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 // mResourceView->requestClose must be called before mResource->save() because 00202 // save causes closeResource do be called. 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 /* TQColorGroup _cg = cg; 00255 if(!mResource) return; 00256 _cg.setColor(TQColorGroup::Base, getTextColor(mResourceColor));*/ 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 KListView( 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 // Create new resource 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 // ### There is a resourceLoadError() signal declared in ResourceCalendar 00416 // but no subclass seems to make use of it. We could do better. 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 // we have to call resourceAdded manually, because for in-process changes 00425 // the dcop signals are not connected, so the resource's signals would not 00426 // be connected otherwise 00427 mCalendar->resourceAdded( resource ); 00428 } 00429 00430 if ( !success ) 00431 delete resource; 00432 00433 delete dlg; 00434 00435 //### maybe only do this if ( success ) 00436 emitResourcesChanged(); 00437 } 00438 00439 void ResourceView::addResourceItem( ResourceCalendar *resource ) 00440 { 00441 00442 ResourceItem *item = new ResourceItem( resource, this, mListView ); 00443 00444 // assign a color, but only if this is a resource that actually 00445 // hold items at top level 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 // Add a new entry 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 // Not found 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 // Remove an entry 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 // Do not allow a non-subresource folder to be removed if it is the standard resource. 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 "KDE Control Center using the KDE Resource settings under the " 00545 "KDE 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 //FIXME: This is better on the resource dialog 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 // A color without initialized is a color invalid 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"