/* This file is part of KOrganizer. Copyright (c) 2003,2004 Cornelius Schumacher Copyright (C) 2003-2004 Reinhold Kainhofer This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. As a special exception, permission is given to link this program with any edition of TQt, and distribute the resulting executable, without including the source code for TQt in the source distribution. */ #include "resourceview.h" #include "koviewmanager.h" #include "multiagendaview.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "koprefs.h" using namespace KCal; static TQString labelFromSubResName( ResourceCalendar *resource, const TQString &subRes ) { DCOPRef ref( "kmail", "KMailICalIface" ); DCOPReply reply = ref.call( "dimapAccounts" ); if ( !reply.isValid() ) { kdDebug() << "DCOP Call dimapAccounts() failed " << endl; return TQString(); } TQString label; if ( (int)reply > 1 ) { if( resource && !resource->resourceName().isEmpty() ) { label = i18n( "My %1 (%2)" ).arg( subRes, resource->resourceName() ); } else { label = i18n( "My %1" ).arg( subRes ); } } else { label = i18n( "My %1" ).arg( subRes ); } return label; } static TQString labelFromIdentifier( ResourceCalendar *resource, const TQString &identifier ) { TQString subResLabel; if ( identifier.contains( "/.INBOX.directory/" ) ) { // my subresource TQString subResName = identifier; subResName.remove( TQRegExp( "^.*/\\.INBOX\\.directory/" ) ); subResLabel = labelFromSubResName( resource, subResName ); } return subResLabel; } ResourceViewFactory::ResourceViewFactory( CalendarResources *calendar, CalendarView *view ) : mCalendar( calendar ), mCalendarView( view ), mResourceView( 0 ) { } CalendarViewExtension *ResourceViewFactory::create( TQWidget *parent ) { mResourceView = new ResourceView( mCalendar, mCalendarView, parent ); TQObject::connect( mResourceView, TQT_SIGNAL( resourcesChanged() ), mCalendarView, TQT_SLOT( resourcesChanged() ) ); TQObject::connect( mResourceView, TQT_SIGNAL( resourcesChanged() ), mCalendarView, TQT_SLOT( updateCategories() ) ); TQObject::connect( mCalendar, TQT_SIGNAL( signalResourceAdded( ResourceCalendar * ) ), mResourceView, TQT_SLOT( addResourceItem( ResourceCalendar * ) ) ); TQObject::connect( mCalendar, TQT_SIGNAL( signalResourceModified( ResourceCalendar * ) ), mResourceView, TQT_SLOT( updateResourceItem( ResourceCalendar * ) ) ); TQObject::connect( mCalendar, TQT_SIGNAL( signalResourceAdded( ResourceCalendar * ) ), mCalendarView, TQT_SLOT( updateCategories() ) ); TQObject::connect( mCalendar, TQT_SIGNAL( signalResourceModified( ResourceCalendar * ) ), mCalendarView, TQT_SLOT( updateCategories() ) ); return mResourceView; } ResourceView *ResourceViewFactory::resourceView() const { return mResourceView; } ResourceItem::ResourceItem( ResourceCalendar *resource, ResourceView *view, TDEListView *parent ) : TQCheckListItem( parent, resource->resourceName(), CheckBox ), mResource( resource ), mResourceView( view ), mBlockStateChange( false ), mIsSubresource( false ), mResourceIdentifier( TQString() ), mSubItemsCreated( false ), mIsStandardResource( false ) { mResourceColor = TQColor(); setGuiState(); if ( mResource->isActive() ) { createSubresourceItems(); } } void ResourceItem::createSubresourceItems() { const TQStringList subresources = mResource->subresources(); if ( !subresources.isEmpty() ) { setOpen( true ); setExpandable( true ); // This resource has subresources TQStringList::ConstIterator it; for ( it=subresources.begin(); it!=subresources.end(); ++it ) { TQString text = labelFromIdentifier( mResource, *it ); if ( text.isEmpty() ) { text = mResource->labelForSubresource( *it ); } ResourceItem *item = new ResourceItem( mResource, *it, text, mResourceView, this ); TQColor resourceColor = *KOPrefs::instance()->resourceColor( *it ); item->setResourceColor( resourceColor ); item->update(); } } mSubItemsCreated = true; } ResourceItem::ResourceItem( ResourceCalendar *resource, const TQString &identifier, const TQString &label, ResourceView *view, ResourceItem *parent ) : TQCheckListItem( parent, label, CheckBox ), mResource( resource ), mResourceView( view ), mBlockStateChange( false ), mIsSubresource( true ), mSubItemsCreated( false ), mIsStandardResource( false ) { mResourceColor = TQColor(); mResourceIdentifier = identifier; setGuiState(); } void ResourceItem::setGuiState() { mBlockStateChange = true; if ( mIsSubresource ) setOn( mResource->subresourceActive( mResourceIdentifier ) ); else setOn( mResource->isActive() ); mBlockStateChange = false; } void ResourceItem::stateChange( bool active ) { if ( mBlockStateChange ) return; if ( mIsSubresource ) { mResource->setSubresourceActive( mResourceIdentifier, active ); } else { if ( active ) { if ( mResource->load() ) { mResource->setActive( true ); if ( !mSubItemsCreated ) createSubresourceItems(); } } else { // mResourceView->requestClose must be called before mResource->save() because // save causes closeResource do be called. mResourceView->requestClose( mResource ); if ( mResource->save() ) { mResource->setActive( false ); } } setOpen( mResource->isActive() && childCount() > 0 ); setGuiState(); } mResourceView->emitResourcesChanged(); } void ResourceItem::update() { setGuiState(); } void ResourceItem::setResourceColor(TQColor& color) { if ( color.isValid() ) { if ( mResourceColor != color ) { TQPixmap px(height()-4,height()-4); mResourceColor = color; px.fill(color); setPixmap(0,px); } } else { mResourceColor = color ; setPixmap(0,0); } } void ResourceItem::setStandardResource( bool std ) { if ( mIsStandardResource != std ) { mIsStandardResource = std; repaint(); } } void ResourceItem::paintCell(TQPainter *p, const TQColorGroup &cg, int column, int width, int alignment) { TQFont oldFont = p->font(); TQFont newFont = oldFont; newFont.setBold( mIsStandardResource && !mIsSubresource ); p->setFont( newFont ); TQCheckListItem::paintCell( p, cg, column, width, alignment ); p->setFont( oldFont ); /* TQColorGroup _cg = cg; if(!mResource) return; _cg.setColor(TQColorGroup::Base, getTextColor(mResourceColor));*/ } ResourceView::ResourceView( CalendarResources *calendar, CalendarView *view, TQWidget *parent, const char *name ) : CalendarViewExtension( parent, name ), mCalendar( calendar ), mCalendarView( view ) { TQBoxLayout *topLayout = new TQVBoxLayout( this, 0, KDialog::spacingHint() ); TQHBoxLayout *buttonBox = new TQHBoxLayout(); buttonBox->setSpacing( KDialog::spacingHint() ); topLayout->addLayout( buttonBox ); TQLabel *calLabel = new TQLabel( i18n( "Calendar" ), this ); buttonBox->addWidget( calLabel ); buttonBox->addStretch( 1 ); mAddButton = new TQPushButton( this, "add" ); mAddButton->setIconSet( SmallIconSet( "add" ) ); buttonBox->addWidget( mAddButton ); TQToolTip::add( mAddButton, i18n( "Add calendar" ) ); TQWhatsThis::add( mAddButton, i18n( "

Press this button to add a resource to " "KOrganizer.

" "

Events, journal entries and to-dos are retrieved " "and stored on resources. Available " "resources include groupware servers, local files, " "journal entries as blogs on a server, etc...

" "

If you have more than one active resource, " "when creating incidents you will either automatically " "use the default resource or be prompted " "to select the resource to use.

" ) ); mEditButton = new TQPushButton( this, "edit" ); mEditButton->setIconSet( SmallIconSet( "edit" ) ); buttonBox->addWidget( mEditButton ); TQToolTip::add( mEditButton, i18n( "Edit calendar settings" ) ); TQWhatsThis::add( mEditButton, i18n( "Press this button to edit the resource currently " "selected on the KOrganizer resources list above." ) ); mDeleteButton = new TQPushButton( this, "del" ); mDeleteButton->setIconSet( SmallIconSet( "remove" ) ); buttonBox->addWidget( mDeleteButton ); TQToolTip::add( mDeleteButton, i18n( "Remove calendar" ) ); TQWhatsThis::add( mDeleteButton, i18n( "Press this button to delete the resource currently " "selected on the KOrganizer resources list above." ) ); mDeleteButton->setDisabled( true ); mEditButton->setDisabled( true ); mListView = new TDEListView( this ); mListView->header()->hide(); TQWhatsThis::add( mListView, i18n( "

Select on this list the active KOrganizer " "resources. Check the resource box to make it " "active. Press the \"Add...\" button below to add new " "resources to the list.

" "

Events, journal entries and to-dos are retrieved " "and stored on resources. Available " "resources include groupware servers, local files, " "journal entries as blogs on a server, etc...

" "

If you have more than one active resource, " "when creating incidents you will either automatically " "use the default resource or be prompted " "to select the resource to use.

" ) ); mListView->addColumn( i18n("Calendar") ); mListView->setResizeMode( TQListView::LastColumn ); topLayout->addWidget( mListView ); connect( mListView, TQT_SIGNAL( clicked( TQListViewItem * ) ), TQT_SLOT( currentChanged( TQListViewItem * ) ) ); connect( mAddButton, TQT_SIGNAL( clicked() ), TQT_SLOT( addResource() ) ); connect( mDeleteButton, TQT_SIGNAL( clicked() ), TQT_SLOT( removeResource() ) ); connect( mEditButton, TQT_SIGNAL( clicked() ), TQT_SLOT( editResource() ) ); connect( mListView, TQT_SIGNAL( doubleClicked ( TQListViewItem *, const TQPoint &, int ) ), TQT_SLOT( editResource() ) ); connect( mListView, TQT_SIGNAL( contextMenuRequested ( TQListViewItem *, const TQPoint &, int ) ), TQT_SLOT( contextMenuRequested( TQListViewItem *, const TQPoint &, int ) ) ); updateView(); } ResourceView::~ResourceView() { } void ResourceView::updateView() { mListView->clear(); CalendarResourceManager *manager = mCalendar->resourceManager(); CalendarResourceManager::Iterator it; for( it = manager->begin(); it != manager->end(); ++it ) { addResourceItem( *it ); } } void ResourceView::emitResourcesChanged() { mCalendar->resourceManager()->writeConfig(); emit resourcesChanged(); } void ResourceView::addResource() { bool ok = false; CalendarResourceManager *manager = mCalendar->resourceManager(); ResourceItem *item = static_cast( mListView->selectedItem() ); if ( item && ( item->isSubresource() || item->resource()->canHaveSubresources() ) ) { const TQString folderName = KInputDialog::getText( i18n( "Add Subresource" ), i18n( "Please enter a name for the new subresource" ), TQString(), &ok, this ); if ( !ok ) return; const TQString parentId = item->isSubresource() ? item->resourceIdentifier() : TQString:: null; if ( !item->resource()->addSubresource( folderName, parentId ) ) { KMessageBox::error( this, i18n( "Unable to create subresource %1." ).arg( folderName ) ); } return; } TQStringList types = manager->resourceTypeNames(); TQStringList descs = manager->resourceTypeDescriptions(); TQString desc = KInputDialog::getItem( i18n( "Resource Configuration" ), i18n( "Please select type of the new resource:" ), descs, 0, false, &ok, this ); if ( !ok ) { return; } TQString type = types[ descs.findIndex( desc ) ]; // Create new resource ResourceCalendar *resource = manager->createResource( type ); if( !resource ) { KMessageBox::error( this, i18n( "Unable to create resource of type %1." ).arg( type ) ); return; } KRES::ConfigDialog *dlg = new KRES::ConfigDialog( this, TQString( "calendar" ), resource, "KRES::ConfigDialog" ); bool success = true; if ( !dlg || !dlg->exec() ) success = false; if ( success ) { resource->setTimeZoneId( KOPrefs::instance()->mTimeZoneId ); if ( resource->isActive() && ( !resource->open() || !resource->load() ) ) { // ### There is a resourceLoadError() signal declared in ResourceCalendar // but no subclass seems to make use of it. We could do better. KMessageBox::error( this, i18n("Unable to create the resource.").arg( type ) ); success = false; } } if ( success ) { manager->add( resource ); // we have to call resourceAdded manually, because for in-process changes // the dcop signals are not connected, so the resource's signals would not // be connected otherwise mCalendar->resourceAdded( resource ); } if ( !success ) delete resource; delete dlg; //### maybe only do this if ( success ) emitResourcesChanged(); } void ResourceView::addResourceItem( ResourceCalendar *resource ) { ResourceItem *item = new ResourceItem( resource, this, mListView ); // assign a color, but only if this is a resource that actually // hold items at top level if ( !resource->canHaveSubresources() || resource->subresources().isEmpty() ) { TQColor resourceColor = *KOPrefs::instance()->resourceColor(resource->identifier()); item->setResourceColor(resourceColor); item->update(); } connect( resource, TQT_SIGNAL( signalSubresourceAdded( ResourceCalendar *, const TQString &, const TQString &, const TQString & ) ), TQT_SLOT( slotSubresourceAdded( ResourceCalendar *, const TQString &, const TQString &, const TQString & ) ) ); connect( resource, TQT_SIGNAL( signalSubresourceRemoved( ResourceCalendar *, const TQString &, const TQString & ) ), TQT_SLOT( slotSubresourceRemoved( ResourceCalendar *, const TQString &, const TQString & ) ) ); connect( resource, TQT_SIGNAL( resourceSaved( ResourceCalendar * ) ), TQT_SLOT( closeResource( ResourceCalendar * ) ) ); updateResourceList(); emit resourcesChanged(); } // Add a new entry void ResourceView::slotSubresourceAdded( ResourceCalendar *resource, const TQString &type, const TQString &identifier, const TQString &label ) { Q_UNUSED( type ); TQListViewItem *lvitem = mListView->findItem( resource->resourceName(), 0 ); if ( !lvitem ) // Not found return; if ( findItemByIdentifier( identifier ) ) return; TQString text = labelFromIdentifier( resource, identifier ); if ( text.isEmpty() ) { text = label; } ResourceItem *item = static_cast( lvitem ); ResourceItem *newItem = new ResourceItem( resource, identifier, text, this, item ); TQColor resourceColor = *KOPrefs::instance()->resourceColor( identifier ); newItem->setResourceColor( resourceColor ); } // Remove an entry void ResourceView::slotSubresourceRemoved( ResourceCalendar *resource, const TQString &type, const TQString &identifier ) { Q_UNUSED( resource ); Q_UNUSED( type ); delete findItemByIdentifier( identifier ); emit resourcesChanged(); } void ResourceView::closeResource( ResourceCalendar *resource ) { if ( mResourcesToClose.find( resource ) >= 0 ) { resource->close(); mResourcesToClose.remove( resource ); } } void ResourceView::updateResourceItem( ResourceCalendar *resource ) { ResourceItem *item = findItem( resource ); if ( item ) { item->update(); } } ResourceItem *ResourceView::currentItem() { TQListViewItem *item = mListView->currentItem(); ResourceItem *rItem = static_cast( item ); return rItem; } void ResourceView::removeResource() { ResourceItem *item = currentItem(); if ( !item ) return; // Do not allow a non-subresource folder to be removed if it is the standard resource. if ( !item->isSubresource() ) { if ( item->resource() == mCalendar->resourceManager()->standardResource() ) { KMessageBox::sorry( this, i18n( "You may not delete your standard calendar resource.

" "You can change the standard calendar resource in the " "Trinity Control Center using the TDE Resource settings under the " "TDE Components area." ) ); return; } } TQString moreInfo; if ( item->resource()->type() == "imap" || item->resource()->type() == "scalix" ) { moreInfo = i18n( "This is a groupware folder so you can always re-subscribe to the folder " "later as you desire." ); } else { moreInfo = i18n( "The contents will not be removed so you can always re-add this calendar " "later as you desire." ); } int km = KMessageBox::warningContinueCancel( this, i18n( "Do you really want to remove the calendar %1?

Note: %2" ). arg( item->text( 0 ), moreInfo ), "", KGuiItem( i18n( "&Remove" ) ) ); if ( km == KMessageBox::Cancel ) { return; } if ( item->isSubresource() ) { if ( !item->resource()->removeSubresource( item->resourceIdentifier() ) ) KMessageBox::sorry( this, i18n ("Failed to remove the subresource %1. The " "reason could be that it is a built-in one which cannot " "be removed, or that the removal of the underlying storage " "folder failed.").arg( item->resource()->name() ) ); return; } else { mCalendar->resourceManager()->remove( item->resource() ); } mListView->takeItem( item ); delete item; updateResourceList(); emit resourcesChanged(); } void ResourceView::editResource() { bool ok = false; ResourceItem *item = currentItem(); if (!item) return; ResourceCalendar *resource = item->resource(); if ( item->isSubresource() ) { if ( resource->type() == "imap" || resource->type() == "scalix" ) { TQString identifier = item->resourceIdentifier(); if ( !identifier.contains( "/.INBOX.directory/" ) ) { KMessageBox::sorry( this, i18n( "Cannot rename someone else's calendar folder." ) ); return; } TQString oldSubResourceName = identifier; oldSubResourceName.remove( TQRegExp( "^.*/\\.INBOX\\.directory/" ) ); TQString newSubResourceName = KInputDialog::getText( i18n( "Rename Subresource" ), i18n( "Enter a new name for the subresource

" "Note: the new name will take affect after the next sync." ), oldSubResourceName, &ok, this ); if ( !ok ) { return; } DCOPRef ref( "kmail", "KMailICalIface" ); DCOPReply reply = ref.call( "changeResourceUIName", identifier, newSubResourceName ); if ( !reply.isValid() ) { KMessageBox::sorry( this, i18n( "Communication with KMail failed when attempting to change the folder name." ) ); return; } item->setText( 0, labelFromSubResName( resource, newSubResourceName ) ); KOrg::BaseView *cV = mCalendarView->viewManager()->currentView(); if ( cV && cV == mCalendarView->viewManager()->multiAgendaView() ) { mCalendarView->viewManager()->multiAgendaView()->deSelectAgendaView(); } } else { KMessageBox::sorry( this, i18n ("Cannot edit the subresource %1.").arg( item->resource()->name() ) ); } } else { KRES::ConfigDialog dlg( this, TQString("calendar"), resource, "KRES::ConfigDialog" ); if ( dlg.exec() ) { item->setText( 0, resource->resourceName() ); mCalendar->resourceManager()->change( resource ); } } emitResourcesChanged(); } void ResourceView::currentChanged( TQListViewItem *lvitem ) { ResourceItem *item = currentItem(); if ( !lvitem || item->isSubresource() ) { mDeleteButton->setEnabled( false ); mEditButton->setEnabled( false ); } else { mDeleteButton->setEnabled( true ); mEditButton->setEnabled( true ); } } ResourceItem *ResourceView::findItem( ResourceCalendar *resource ) { TQListViewItem *lvitem; ResourceItem *item = 0; for( lvitem = mListView->firstChild(); lvitem; lvitem = lvitem->nextSibling() ) { item = static_cast( lvitem ); if ( item->resource() == resource ) break; } return item; } ResourceItem *ResourceView::findItemByIdentifier( const TQString &identifier ) { TQListViewItem *lvitem; ResourceItem *item = 0; for ( lvitem = mListView->firstChild(); lvitem; lvitem = lvitem->itemBelow() ) { item = static_cast( lvitem ); if ( item->resourceIdentifier() == identifier ) return item; } return 0; } void ResourceView::contextMenuRequested ( TQListViewItem *lvitem, const TQPoint &pos, int ) { CalendarResourceManager *manager = mCalendar->resourceManager(); ResourceItem *item = static_cast( lvitem ); TQPopupMenu *menu = new TQPopupMenu( this ); connect( menu, TQT_SIGNAL( aboutToHide() ), menu, TQT_SLOT( deleteLater() ) ); if ( item ) { int reloadId = menu->insertItem( i18n("Re&load"), this, TQT_SLOT( reloadResource() ) ); menu->setItemEnabled( reloadId, item->resource()->isActive() ); int saveId = menu->insertItem( i18n("&Save"), this, TQT_SLOT( saveResource() ) ); menu->setItemEnabled( saveId, item->resource()->isActive() ); menu->insertSeparator(); menu->insertItem( i18n("Show &Info"), this, TQT_SLOT( showInfo() ) ); //FIXME: This is better on the resource dialog if ( KOPrefs::instance()->agendaViewColors() != KOPrefs::CategoryOnly ) { TQPopupMenu *assignMenu= new TQPopupMenu( menu ); assignMenu->insertItem( i18n( "&Assign Color" ), this, TQT_SLOT( assignColor() ) ); if ( item->resourceColor().isValid() ) assignMenu->insertItem( i18n( "&Disable Color" ), this, TQT_SLOT( disableColor() ) ); menu->insertItem( i18n( "Resources Colors" ), assignMenu ); } if ( item->isSubresource() && ( item->resource()->type() == "imap" || item->resource()->type() == "scalix" ) ) { if ( item->resourceIdentifier().contains( "/.INBOX.directory/" ) ) { menu->insertItem( i18n("&Rename..."), this, TQT_SLOT( editResource() ) ); } } else { menu->insertItem( i18n("&Edit..."), this, TQT_SLOT( editResource() ) ); } menu->insertItem( i18n("&Remove"), this, TQT_SLOT( removeResource() ) ); if ( item->resource() != manager->standardResource() ) { menu->insertSeparator(); menu->insertItem( i18n("Use as &Default Calendar"), this, TQT_SLOT( setStandard() ) ); } menu->insertSeparator(); } menu->insertItem( i18n("&Add..."), this, TQT_SLOT( addResource() ) ); menu->popup( pos ); } void ResourceView::assignColor() { ResourceItem *item = currentItem(); if ( !item ) return; // A color without initialized is a color invalid TQColor myColor; ResourceCalendar *cal = item->resource(); TQString identifier = cal->identifier(); if ( item->isSubresource() ) identifier = item->resourceIdentifier(); TQColor defaultColor =*KOPrefs::instance()->resourceColor( identifier ); int result = KColorDialog::getColor( myColor,defaultColor); if ( result == KColorDialog::Accepted ) { KOPrefs::instance()->setResourceColor( identifier, myColor ); item->setResourceColor( myColor ); item->update(); emitResourcesChanged(); } } void ResourceView::disableColor() { ResourceItem *item = currentItem(); if ( !item ) { return; } TQColor colorInvalid; ResourceCalendar *cal = item->resource(); TQString identifier = cal->identifier(); if ( item->isSubresource() ) { identifier = item->resourceIdentifier(); } KOPrefs::instance()->setResourceColor( identifier, colorInvalid ); item->setResourceColor( colorInvalid ); item->update(); emitResourcesChanged(); } void ResourceView::showInfo() { ResourceItem *item = currentItem(); if ( !item ) return; TQString identifier; if ( item->isSubresource() ) { identifier = "

" + item->resourceIdentifier(); } TQString txt = "" + item->resource()->infoText() + identifier + ""; KMessageBox::information( this, txt ); } void ResourceView::reloadResource() { ResourceItem *item = currentItem(); if ( !item ) return; ResourceCalendar *resource = item->resource(); resource->load(); } void ResourceView::saveResource() { ResourceItem *item = currentItem(); if ( !item ) return; ResourceCalendar *resource = item->resource(); resource->save(); } void ResourceView::setStandard() { ResourceItem *item = currentItem(); if ( !item ) return; ResourceCalendar *resource = item->resource(); CalendarResourceManager *manager = mCalendar->resourceManager(); manager->setStandardResource( resource ); updateResourceList(); } void ResourceView::updateResourceList() { TQListViewItemIterator it( mListView ); ResourceCalendar* stdRes = mCalendar->resourceManager()->standardResource(); while ( it.current() ) { ResourceItem *item = static_cast( it.current() ); item->setStandardResource( item->resource() == stdRes ); ++it; } } void ResourceView::showButtons( bool visible ) { if ( visible ) { mAddButton->show(); mDeleteButton->show(); mEditButton->show(); } else { mAddButton->hide(); mDeleteButton->hide(); mEditButton->hide(); } } void ResourceView::requestClose( ResourceCalendar *r ) { mResourcesToClose.append( r ); } #include "resourceview.moc"