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