You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdepim/korganizer/kodialogmanager.cpp

289 lines
9.7 KiB

/*
This file is part of KOrganizer.
Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
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 <kcmultidialog.h>
#include <ksettings/dialog.h>
#include <twin.h>
#include <libtdepim/categoryeditdialog.h>
#include "calendarview.h"
#include "koprefsdialog.h"
#include "koprefs.h"
#include "koeventeditor.h"
#include "kotodoeditor.h"
#include "kojournaleditor.h"
#include "searchdialog.h"
#include "filtereditdialog.h"
#ifndef KORG_NOARCHIVE
#include "archivedialog.h"
#endif
#include "koviewmanager.h"
#include "koagendaview.h"
#include "koglobals.h"
#include "kodialogmanager.h"
#include "kodialogmanager.moc"
// FIXME: Handle KOEventViewerDialogs in dialog manager. Pass
// KOPrefs::mCompactDialog.
class KODialogManager::DialogManagerVisitor : public IncidenceBase::Visitor
{
public:
DialogManagerVisitor() : mDialogManager( 0 ) {}
bool act( IncidenceBase *incidence, KODialogManager *manager )
{
mDialogManager = manager;
return incidence->accept( *this );
}
protected:
KODialogManager *mDialogManager;
};
class KODialogManager::EditorDialogVisitor :
public KODialogManager::DialogManagerVisitor
{
public:
EditorDialogVisitor() : DialogManagerVisitor(), mEditor( 0 ) {}
KOIncidenceEditor *editor() const { return mEditor; }
protected:
bool visit( Event * ) { mEditor = mDialogManager->getEventEditor(); return mEditor; }
bool visit( Todo * ) { mEditor = mDialogManager->getTodoEditor(); return mEditor; }
bool visit( Journal * ) { mEditor = mDialogManager->getJournalEditor(); return mEditor; }
protected:
KOIncidenceEditor *mEditor;
};
KODialogManager::KODialogManager( CalendarView *mainView ) :
TQObject(), mMainView( mainView )
{
mOptionsDialog = 0;
mSearchDialog = 0;
mArchiveDialog = 0;
mFilterEditDialog = 0;
mCategoryEditDialog = new KPIM::CategoryEditDialog( KOPrefs::instance(), mMainView );
// don't set any specific parent for the dialog, as its kept around and reused
// in different cases where it should have different parents
KWin::setMainWindow( mCategoryEditDialog, 0 );
connect( mainView, TQ_SIGNAL( categoriesChanged() ),
mCategoryEditDialog, TQ_SLOT( reload() ) );
KOGlobals::fitDialogToScreen( mCategoryEditDialog );
}
KODialogManager::~KODialogManager()
{
delete mOptionsDialog;
delete mSearchDialog;
#ifndef KORG_NOARCHIVE
delete mArchiveDialog;
#endif
delete mFilterEditDialog;
}
void KODialogManager::errorSaveIncidence( TQWidget *parent, Incidence *incidence )
{
KMessageBox::sorry( parent, i18n("Unable to save %1 \"%2\".")
.arg( i18n( incidence->type() ) )
.arg( incidence->summary() ) );
}
void KODialogManager::showOptionsDialog()
{
if (!mOptionsDialog) {
#if 0
mOptionsDialog = new TDEConfigureDialog();
// mOptionsDialog = new TDEConfigureDialog( TDEConfigureDialog::Configurable );
// mOptionsDialog = new TDEConfigureDialog( mMainView );
connect( mOptionsDialog->dialog(),
TQ_SIGNAL( configCommitted( const TQCString & ) ),
mMainView, TQ_SLOT( updateConfig() ) );
#else
mOptionsDialog = new KCMultiDialog( mMainView, "KorganizerPreferences" );
connect( mOptionsDialog, TQ_SIGNAL( configCommitted( const TQCString & ) ),
mMainView, TQ_SLOT( updateConfig( const TQCString& ) ) );
#if 0
connect( mOptionsDialog, TQ_SIGNAL( applyClicked() ),
mMainView, TQ_SLOT( updateConfig() ) );
connect( mOptionsDialog, TQ_SIGNAL( okClicked() ),
mMainView, TQ_SLOT( updateConfig() ) );
// @TODO Find a way to do this with KCMultiDialog
connect(mCategoryEditDialog,TQ_SIGNAL(categoryConfigChanged()),
mOptionsDialog,TQ_SLOT(updateCategories()));
#endif
TQStringList modules;
modules.append( "korganizer_configmain.desktop" );
modules.append( "korganizer_configtime.desktop" );
modules.append( "korganizer_configviews.desktop" );
modules.append( "korganizer_configfonts.desktop" );
modules.append( "korganizer_configcolors.desktop" );
modules.append( "korganizer_configgroupscheduling.desktop" );
modules.append( "korganizer_configgroupautomation.desktop" );
modules.append( "korganizer_configfreebusy.desktop" );
modules.append( "korganizer_configplugins.desktop" );
modules.append( "korganizer_configdesignerfields.desktop" );
// add them all
TQStringList::iterator mit;
for ( mit = modules.begin(); mit != modules.end(); ++mit )
mOptionsDialog->addModule( *mit );
#endif
}
mOptionsDialog->show();
mOptionsDialog->raise();
}
void KODialogManager::showCategoryEditDialog()
{
mCategoryEditDialog->show();
}
void KODialogManager::showSearchDialog()
{
if ( !mSearchDialog ) {
mSearchDialog = new SearchDialog( mMainView->calendar(), mMainView );
connect( mSearchDialog, TQ_SIGNAL(showIncidenceSignal(Incidence *,const TQDate &)),
mMainView, TQ_SLOT(showIncidence(Incidence *,const TQDate &)) );
connect( mSearchDialog, TQ_SIGNAL(editIncidenceSignal(Incidence *,const TQDate &)),
mMainView, TQ_SLOT(editIncidence(Incidence *,const TQDate &)) );
connect( mSearchDialog, TQ_SIGNAL(deleteIncidenceSignal(Incidence *)),
mMainView, TQ_SLOT(deleteIncidence(Incidence *)) );
connect( mMainView, TQ_SIGNAL(closingDown()),mSearchDialog,TQ_SLOT(reject()) );
}
// make sure the widget is on top again
mSearchDialog->show();
mSearchDialog->raise();
}
void KODialogManager::showArchiveDialog()
{
#ifndef KORG_NOARCHIVE
if (!mArchiveDialog) {
mArchiveDialog = new ArchiveDialog(mMainView->calendar(),mMainView);
connect(mArchiveDialog,TQ_SIGNAL(eventsDeleted()),
mMainView,TQ_SLOT(updateView()));
connect(mArchiveDialog,TQ_SIGNAL(autoArchivingSettingsModified()),
mMainView,TQ_SLOT(slotAutoArchivingSettingsModified()));
}
mArchiveDialog->show();
mArchiveDialog->raise();
// Workaround.
TQApplication::restoreOverrideCursor();
#endif
}
void KODialogManager::showFilterEditDialog( TQPtrList<CalFilter> *filters )
{
if ( !mFilterEditDialog ) {
mFilterEditDialog = new FilterEditDialog( filters, mMainView );
connect( mFilterEditDialog, TQ_SIGNAL( filterChanged() ),
mMainView, TQ_SLOT( updateFilter() ) );
connect( mFilterEditDialog, TQ_SIGNAL( editCategories() ),
mCategoryEditDialog, TQ_SLOT( show() ) );
connect( mCategoryEditDialog, TQ_SIGNAL( categoryConfigChanged() ),
mFilterEditDialog, TQ_SLOT( updateCategoryConfig() ) );
}
mFilterEditDialog->show();
mFilterEditDialog->raise();
}
KOIncidenceEditor *KODialogManager::getEditor( Incidence *incidence )
{
if ( !incidence ) return 0;
EditorDialogVisitor v;
if ( v.act( incidence, this ) ) {
return v.editor();
} else
return 0;
}
KOEventEditor *KODialogManager::getEventEditor()
{
KOEventEditor *eventEditor = new KOEventEditor( mMainView->calendar(),
mMainView );
connectEditor( eventEditor );
return eventEditor;
}
void KODialogManager::connectTypeAhead( KOEventEditor *editor,
KOrg::AgendaView *agenda )
{
if ( editor && agenda ) {
agenda->setTypeAheadReceiver( editor->typeAheadReceiver() );
connect( editor, TQ_SIGNAL( focusReceivedSignal() ),
agenda, TQ_SLOT( finishTypeAhead() ) );
}
}
void KODialogManager::connectEditor( KOIncidenceEditor*editor )
{
connect( editor, TQ_SIGNAL( deleteIncidenceSignal( Incidence * ) ),
mMainView, TQ_SLOT( deleteIncidence( Incidence * ) ) );
connect( mCategoryEditDialog, TQ_SIGNAL( categoryConfigChanged() ),
editor, TQ_SIGNAL( updateCategoryConfig() ) );
connect( editor, TQ_SIGNAL( editCategories() ),
mCategoryEditDialog, TQ_SLOT( show() ) );
connect( editor, TQ_SIGNAL( dialogClose( Incidence * ) ),
mMainView, TQ_SLOT( dialogClosing( Incidence * ) ) );
connect( editor, TQ_SIGNAL( editCanceled( Incidence * ) ),
mMainView, TQ_SLOT( editCanceled( Incidence * ) ) );
connect( mMainView, TQ_SIGNAL( closingDown() ), editor, TQ_SLOT( reject() ) );
connect( editor, TQ_SIGNAL( deleteAttendee( Incidence * ) ),
mMainView, TQ_SIGNAL( cancelAttendees( Incidence * ) ) );
}
KOTodoEditor *KODialogManager::getTodoEditor()
{
kdDebug(5850) << k_funcinfo << endl;
KOTodoEditor *todoEditor = new KOTodoEditor( mMainView->calendar(), mMainView );
connectEditor( todoEditor );
return todoEditor;
}
KOJournalEditor *KODialogManager::getJournalEditor()
{
KOJournalEditor *journalEditor = new KOJournalEditor( mMainView->calendar(), mMainView );
connectEditor( journalEditor );
return journalEditor;
}
void KODialogManager::updateSearchDialog()
{
if (mSearchDialog) mSearchDialog->updateView();
}