korganizer

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 Qt, and distribute the resulting executable,
00023     without including the source code for Qt 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::null ),
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::null,
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"