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