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