00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
#include "resourceview.h"
00026
00027
#include <klistview.h>
00028
#include <klocale.h>
00029
#include <kdebug.h>
00030
#include <kglobal.h>
00031
#include <kmessagebox.h>
00032
#include <kresources/resource.h>
00033
#include <kresources/configdialog.h>
00034
#include <kinputdialog.h>
00035
#include <libkcal/calendarresources.h>
00036
#include <resourceremote.h>
00037
00038
#include <qhbox.h>
00039
#include <qlayout.h>
00040
#include <qlabel.h>
00041
#include <qpushbutton.h>
00042
#include <qpopupmenu.h>
00043
00044
using namespace KCal;
00045
00046 ResourceViewFactory::ResourceViewFactory( KCal::CalendarResources *calendar,
00047
CalendarView *view )
00048 : mCalendar( calendar ), mView( view ), mResourceView( 0 )
00049 {
00050 }
00051
00052 CalendarViewExtension *ResourceViewFactory::create(
QWidget *parent )
00053 {
00054 mResourceView =
new ResourceView( mCalendar, parent );
00055
00056 QObject::connect( mResourceView, SIGNAL( resourcesChanged() ),
00057 mView, SLOT( updateView() ) );
00058 QObject::connect( mResourceView, SIGNAL( resourcesChanged() ),
00059 mView, SLOT( updateCategories() ) );
00060
00061 QObject::connect( mCalendar,
00062 SIGNAL( signalResourceAdded( ResourceCalendar * ) ),
00063 mResourceView,
00064 SLOT( addResourceItem( ResourceCalendar * ) ) );
00065 QObject::connect( mCalendar,
00066 SIGNAL( signalResourceModified( ResourceCalendar * ) ),
00067 mResourceView,
00068 SLOT( updateResourceItem( ResourceCalendar * ) ) );
00069 QObject::connect( mCalendar, SIGNAL( signalResourceAdded( ResourceCalendar * ) ),
00070 mView, SLOT( updateCategories() ) );
00071 QObject::connect( mCalendar, SIGNAL( signalResourceModified( ResourceCalendar * ) ),
00072 mView, SLOT( updateCategories() ) );
00073
00074
return mResourceView;
00075 }
00076
00077
ResourceView *ResourceViewFactory::resourceView()
const
00078
{
00079
return mResourceView;
00080 }
00081
00082 ResourceItem::ResourceItem( ResourceCalendar *resource,
ResourceView *view,
00083 KListView *parent )
00084 :
QCheckListItem( parent, resource->resourceName(), CheckBox ),
00085 mResource( resource ), mView( view ), mBlockStateChange( false ),
00086 mIsSubresource( false )
00087 {
00088 setGuiState();
00089
00090
const QStringList subresources = mResource->subresources();
00091
if ( !subresources.isEmpty() ) {
00092 setOpen(
true );
00093 setExpandable(
true );
00094
00095 QStringList::ConstIterator it;
00096
for ( it=subresources.begin(); it!=subresources.end(); ++it ) {
00097 (
void )
new ResourceItem( mResource, *it, mView,
this );
00098 }
00099 }
00100 }
00101
00102 ResourceItem::ResourceItem( KCal::ResourceCalendar *resource,
00103
const QString& sub,
ResourceView *view,
00104 ResourceItem* parent )
00105 :
QCheckListItem( parent, sub, CheckBox ), mResource( resource ),
00106 mView( view ), mBlockStateChange( false ), mIsSubresource( true )
00107 {
00108 setGuiState();
00109 }
00110
00111
void ResourceItem::setGuiState()
00112 {
00113 mBlockStateChange =
true;
00114
if ( mIsSubresource )
00115 setOn( mResource->subresourceActive( text( 0 ) ) );
00116
else
00117 setOn( mResource->isActive() );
00118 mBlockStateChange =
false;
00119 }
00120
00121
void ResourceItem::stateChange(
bool active )
00122 {
00123
if ( mBlockStateChange )
return;
00124
00125
if ( mIsSubresource ) {
00126 mResource->setSubresourceActive( text( 0 ), active );
00127 }
else {
00128
if ( active ) {
00129
if ( mResource->load() ) mResource->setActive(
true );
00130 }
else {
00131
if ( mResource->save() ) mResource->setActive(
false );
00132 mView->requestClose( mResource );
00133 }
00134
00135 setOpen( mResource->isActive() && childCount() > 0 );
00136
00137 setGuiState();
00138 }
00139
00140 mView->emitResourcesChanged();
00141 }
00142
00143
void ResourceItem::update()
00144 {
00145 setGuiState();
00146 }
00147
00148 ResourceView::ResourceView( KCal::CalendarResources *calendar,
00149
QWidget *parent,
const char *name )
00150 : CalendarViewExtension( parent, name ), mCalendar( calendar )
00151 {
00152
QBoxLayout *topLayout =
new QVBoxLayout(
this );
00153
00154 mListView =
new KListView(
this );
00155 mListView->addColumn( i18n(
"Calendar") );
00156 mListView->setResizeMode( QListView::LastColumn );
00157 topLayout->
addWidget( mListView );
00158
00159
QHBox *buttonBox =
new QHBox(
this );
00160 topLayout->
addWidget( buttonBox );
00161
00162 mAddButton =
new QPushButton( i18n(
"Add..."), buttonBox,
"add" );
00163 mEditButton =
new QPushButton( i18n(
"Edit..."), buttonBox,
"edit" );
00164 mDeleteButton =
new QPushButton( i18n(
"Remove"), buttonBox,
"del" );
00165 mDeleteButton->setDisabled(
true );
00166 mEditButton->setDisabled(
true );
00167
00168 connect( mListView, SIGNAL( clicked(
QListViewItem * ) ),
00169 SLOT( currentChanged(
QListViewItem * ) ) );
00170 connect( mAddButton, SIGNAL( clicked() ), SLOT( addResource() ) );
00171 connect( mDeleteButton, SIGNAL( clicked() ), SLOT( removeResource() ) );
00172 connect( mEditButton, SIGNAL( clicked() ), SLOT( editResource() ) );
00173 connect( mListView, SIGNAL( doubleClicked (
QListViewItem *,
const QPoint &,
00174
int ) ),
00175 SLOT( editResource() ) );
00176 connect( mListView, SIGNAL( contextMenuRequested ( QListViewItem *,
00177
const QPoint &,
int ) ),
00178 SLOT( contextMenuRequested( QListViewItem *,
const QPoint &,
00179
int ) ) );
00180
00181 updateView();
00182 }
00183
00184 ResourceView::~ResourceView()
00185 {
00186 }
00187
00188
void ResourceView::updateView()
00189 {
00190 mListView->clear();
00191
00192 KCal::CalendarResourceManager *manager = mCalendar->resourceManager();
00193
00194 KCal::CalendarResourceManager::Iterator it;
00195
for( it = manager->begin(); it != manager->end(); ++it ) {
00196 addResourceItem( *it );
00197 }
00198 }
00199
00200
void ResourceView::emitResourcesChanged()
00201 {
00202 emit resourcesChanged();
00203 }
00204
00205
void ResourceView::addResource()
00206 {
00207 KCal::CalendarResourceManager *manager = mCalendar->resourceManager();
00208
00209
QStringList types = manager->resourceTypeNames();
00210
QStringList descs = manager->resourceTypeDescriptions();
00211
bool ok =
false;
00212
QString desc = KInputDialog::getItem( i18n(
"Resource Configuration" ),
00213 i18n(
"Please select type of the new resource:" ), descs, 0,
false, &ok,
00214
this );
00215
if ( !ok )
00216
return;
00217
00218
QString type = types[ descs.findIndex( desc ) ];
00219
00220
00221 ResourceCalendar *resource = manager->createResource( type );
00222
if( !resource ) {
00223 KMessageBox::error(
this, i18n(
"<qt>Unable to create resource of type <b>%1</b>.</qt>")
00224 .arg( type ) );
00225
return;
00226 }
00227
00228 resource->setResourceName( i18n(
"%1 resource").arg( type ) );
00229
00230 KRES::ConfigDialog dlg(
this,
QString(
"calendar"), resource,
00231
"KRES::ConfigDialog" );
00232
00233
if ( dlg.exec() ) {
00234
if ( resource->isActive() ) {
00235 resource->open();
00236 resource->load();
00237 }
00238
00239 manager->add( resource );
00240 addResourceItem( resource );
00241 }
else {
00242
delete resource;
00243 resource = 0;
00244 }
00245 }
00246
00247
void ResourceView::addResourceItem( ResourceCalendar *resource )
00248 {
00249
new ResourceItem( resource,
this, mListView );
00250
00251 connect( resource, SIGNAL( signalSubresourceAdded( ResourceCalendar *,
00252
const QString &,
00253
const QString & ) ),
00254 SLOT( slotSubresourceAdded( ResourceCalendar *,
const QString &,
00255
const QString & ) ) );
00256 connect( resource, SIGNAL( signalSubresourceRemoved( ResourceCalendar *,
00257
const QString &,
00258
const QString & ) ),
00259 SLOT( slotSubresourceRemoved( ResourceCalendar *,
const QString &,
00260
const QString & ) ) );
00261
00262 connect( resource, SIGNAL( resourceSaved( ResourceCalendar * ) ),
00263 SLOT( closeResource( ResourceCalendar * ) ) );
00264
00265 emitResourcesChanged();
00266 }
00267
00268
00269
void ResourceView::slotSubresourceAdded( ResourceCalendar *calendar,
00270
const QString &,
00271
const QString &resource )
00272 {
00273 QListViewItem *i = mListView->findItem( calendar->resourceName(), 0 );
00274
if ( !i )
00275
00276
return;
00277
00278 ResourceItem *item = static_cast<ResourceItem *>( i );
00279 (
void )
new ResourceItem( calendar, resource,
this, item );
00280 }
00281
00282
00283
void ResourceView::slotSubresourceRemoved( ResourceCalendar *,
00284
const QString &,
00285
const QString &resource )
00286 {
00287
delete mListView->findItem( resource, 0 );
00288 }
00289
00290
void ResourceView::closeResource( ResourceCalendar *r )
00291 {
00292
if ( mResourcesToClose.find( r ) >= 0 ) {
00293 r->close();
00294 mResourcesToClose.remove( r );
00295 }
00296 }
00297
00298
void ResourceView::updateResourceItem( ResourceCalendar *resource )
00299 {
00300 ResourceItem *item = findItem( resource );
00301
if ( item ) {
00302 item->update();
00303 }
00304 }
00305
00306 ResourceItem *ResourceView::currentItem()
00307 {
00308 QListViewItem *item = mListView->currentItem();
00309 ResourceItem *rItem = static_cast<ResourceItem *>( item );
00310
return rItem;
00311 }
00312
00313
void ResourceView::removeResource()
00314 {
00315 ResourceItem *item = currentItem();
00316
if ( !item )
return;
00317
00318
int km = KMessageBox::warningContinueCancel(
this,
00319 i18n(
"<qt>Do you really want to remove the resource <b>%1</b>?</qt>")
00320 .arg( item->resource()->resourceName() ),
"",
00321 KGuiItem( i18n(
"&Remove" ),
"editdelete") );
00322
if ( km == KMessageBox::Cancel )
return;
00323
00324
00325
#if 0
00326
if ( item->resource() == mCalendar->resourceManager()->standardResource() ) {
00327 KMessageBox::sorry(
this,
00328 i18n(
"You cannot remove your standard resource." ) );
00329
return;
00330 }
00331
#endif
00332
00333 mCalendar->resourceManager()->remove( item->resource() );
00334
00335 mListView->takeItem( item );
00336
delete item;
00337 emitResourcesChanged();
00338 }
00339
00340
void ResourceView::editResource()
00341 {
00342 ResourceItem *item = currentItem();
00343
00344 ResourceCalendar *resource = item->resource();
00345
00346 KRES::ConfigDialog dlg(
this,
QString(
"calendar"), resource,
00347
"KRES::ConfigDialog" );
00348
00349
if ( dlg.exec() ) {
00350 item->setText( 0, resource->resourceName() );
00351
00352 mCalendar->resourceManager()->change( resource );
00353 }
00354 }
00355
00356
void ResourceView::currentChanged( QListViewItem *item)
00357 {
00358
bool selected =
true;
00359
if ( !item ) selected =
false;
00360 mDeleteButton->setEnabled( selected );
00361 mEditButton->setEnabled( selected );
00362 }
00363
00364 ResourceItem *ResourceView::findItem( ResourceCalendar *r )
00365 {
00366 QListViewItem *item;
00367 ResourceItem *i = 0;
00368
for( item = mListView->firstChild(); item; item = item->nextSibling() ) {
00369 i = static_cast<ResourceItem *>( item );
00370
if ( i->resource() == r )
break;
00371 }
00372
return i;
00373 }
00374
00375
void ResourceView::contextMenuRequested ( QListViewItem *i,
00376
const QPoint &pos,
int )
00377 {
00378 ResourceItem *item = static_cast<ResourceItem *>( i );
00379
00380
QPopupMenu *menu =
new QPopupMenu(
this );
00381 connect( menu, SIGNAL( aboutToHide() ), menu, SLOT( deleteLater() ) );
00382
if ( item ) {
00383
int reloadId = menu->insertItem( i18n(
"Reload"),
this,
00384 SLOT( reloadResource() ) );
00385 menu->setItemEnabled( reloadId, item->resource()->isActive() );
00386
int saveId = menu->insertItem( i18n(
"Save"),
this,
00387 SLOT( saveResource() ) );
00388 menu->setItemEnabled( saveId, item->resource()->isActive() );
00389 menu->insertSeparator();
00390 menu->insertItem( i18n(
"Show Info"),
this, SLOT( showInfo() ) );
00391 menu->insertItem( i18n(
"Edit..."),
this, SLOT( editResource() ) );
00392 menu->insertItem( i18n(
"Remove"),
this, SLOT( removeResource() ) );
00393 menu->insertSeparator();
00394 }
00395 menu->insertItem( i18n(
"Add..."),
this, SLOT( addResource() ) );
00396
00397 menu->popup( pos );
00398 }
00399
00400
void ResourceView::showInfo()
00401 {
00402 ResourceItem *item = currentItem();
00403
if ( !item )
return;
00404
00405
QString txt =
"<qt>" + item->resource()->infoText() +
"</qt>";
00406 KMessageBox::information(
this, txt );
00407 }
00408
00409
void ResourceView::reloadResource()
00410 {
00411 ResourceItem *item = currentItem();
00412
if ( !item )
return;
00413
00414 ResourceCalendar *r = item->resource();
00415 r->load();
00416 }
00417
00418
void ResourceView::saveResource()
00419 {
00420 ResourceItem *item = currentItem();
00421
if ( !item )
return;
00422
00423 ResourceCalendar *r = item->resource();
00424 r->save();
00425 }
00426
00427
void ResourceView::showButtons(
bool visible )
00428 {
00429
if ( visible ) {
00430 mAddButton->show();
00431 mDeleteButton->show();
00432 mEditButton->show();
00433 }
else {
00434 mAddButton->hide();
00435 mDeleteButton->hide();
00436 mEditButton->hide();
00437 }
00438 }
00439
00440
void ResourceView::requestClose( ResourceCalendar *r )
00441 {
00442 mResourcesToClose.append( r );
00443 }
00444
00445
#include "resourceview.moc"