From b9aad1f15dc600e4dbe4c62d3fcced6363188ba3 Mon Sep 17 00:00:00 2001 From: zautrix Date: Sat, 26 Jun 2004 19:01:18 +0000 Subject: Initial revision --- (limited to 'libkdepim') diff --git a/libkdepim/addresseeview.cpp b/libkdepim/addresseeview.cpp new file mode 100644 index 0000000..deafd34 --- a/dev/null +++ b/libkdepim/addresseeview.cpp @@ -0,0 +1,282 @@ +/* + This file is part of libkdepim. + + Copyright (c) 2003 Tobias Koenig + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include +#include +#include +#include +//US#include +#include +#include +//US #include +#include +#include +#include +#include + + +#include "addresseeview.h" + +using namespace KPIM; + +AddresseeView::AddresseeView( QWidget *parent, const char *name ) +//US : KTextBrowser( parent, name ) + : QTextBrowser( parent, name ) + + +{ +//US setWrapPolicy( QTextEdit::AtWordBoundary ); + setLinkUnderline( false ); + // setVScrollBarMode( QScrollView::AlwaysOff ); + //setHScrollBarMode( QScrollView::AlwaysOff ); + +//US QStyleSheet *sheet = styleSheet(); +//US QStyleSheetItem *link = sheet->item( "a" ); +//US link->setColor( KGlobalSettings::linkColor() ); + +} + +void AddresseeView::setAddressee( const KABC::Addressee& addr ) +{ + mAddressee = addr; + + // clear view + setText( QString::null ); + + if ( mAddressee.isEmpty() ) + return; + + QString name = ( mAddressee.formattedName().isEmpty() ? + mAddressee.assembledName() : mAddressee.formattedName() ); + + QString dynamicPart; + + KABC::PhoneNumber::List phones = mAddressee.phoneNumbers(); + KABC::PhoneNumber::List::ConstIterator phoneIt; + for ( phoneIt = phones.begin(); phoneIt != phones.end(); ++phoneIt ) { + dynamicPart += QString( + "%1" + "%2" ) + .arg( KABC::PhoneNumber::typeLabel( (*phoneIt).type() ) ) + .arg( (*phoneIt).number() ); + } + + QStringList emails = mAddressee.emails(); + QStringList::ConstIterator emailIt; + QString type = i18n( "Email" ); + for ( emailIt = emails.begin(); emailIt != emails.end(); ++emailIt ) { + dynamicPart += QString( + "%1" + "%3" ) + .arg( type ) + .arg( *emailIt ) + .arg( *emailIt ); + type = i18n( "Other" ); + } + + if ( !mAddressee.url().url().isEmpty() ) { + dynamicPart += QString( + "%1" + "%2" ) + .arg( i18n( "Homepage" ) ) +//US .arg( KStringHandler::tagURLs( mAddressee.url().url() ) ); + .arg( mAddressee.url().url() ); + //qDebug("AddresseeView::setAddressee has to be verified."); + } + + KABC::Address::List addresses = mAddressee.addresses(); + KABC::Address::List::ConstIterator addrIt; + for ( addrIt = addresses.begin(); addrIt != addresses.end(); ++addrIt ) { + if ( true /*(*addrIt).label().isEmpty()*/ ) { + QString formattedAddress = (*addrIt).formattedAddress().stripWhiteSpace(); +//US formattedAddress = formattedAddress.replace( '\n', "
" ); + //qDebug("adresss %s ",formattedAddress.latin1() ); + formattedAddress = formattedAddress.replace( QRegExp("\n"), "
" ); + //qDebug("AddresseeView::setAddressee has to be verified."); + + dynamicPart += QString( + "%1" + "%2" ) + .arg( KABC::Address::typeLabel( (*addrIt).type() ) ) + .arg( formattedAddress ); + } else { + + dynamicPart += QString( + "%1" + "%2" ) + .arg( KABC::Address::typeLabel( (*addrIt).type() ) ) +//US .arg( (*addrIt).label().replace( '\n', "
" ) ); + .arg( (*addrIt).label() /*replace( QRegExp("\n"), "
" )*/ ); + + } + } + + QString notes; + if ( !mAddressee.note().isEmpty() ) { + notes = QString( + "" + "%1:" // note label + "%2" // note + "" ).arg( i18n( "Notes" ) ) +//US .arg( mAddressee.note().replace( '\n', "
" ) ); + .arg( mAddressee.note().replace( QRegExp("\n"), "
" ) ); + //qDebug("AddresseeView::setAddressee has to be verified."); + } + + QString aRole = ""; + QString aOrga = ""; + if ( true /*!mAddressee.role().isEmpty()*/ ) { + aRole = "" + "" + mAddressee.role() + "" + ""; + } + if ( true /*!mAddressee.organization().isEmpty()*/ ) { + aOrga = "" + "" + mAddressee.organization() + "" ; + ""; + } + mText = ""; + QString picString = ""; + KABC::Picture picture = mAddressee.photo(); + bool picAvailintern = false; + bool picAvailUrl = false; + if (! picture.undefined() ) { + picAvailintern = (picture.isIntern() && !picture.data().isNull()); + picAvailUrl = !picture.isIntern() && QFile::exists(picture.url() ); + } + if ( picAvailUrl || picAvailintern || QApplication::desktop()->width() > 320 ) { + if ( picAvailintern ) { + QMimeSourceFactory::defaultFactory()->setImage( "myimage", picture.data() ); + } else { + if ( picAvailUrl ) { + QMimeSourceFactory::defaultFactory()->setPixmap( "myimage", QPixmap( picture.url() )); + } else { + QMimeSourceFactory::defaultFactory()->setPixmap( "myimage", KGlobal::iconLoader()->loadIcon( "package_toys", KIcon::Desktop, 128 ) ); + } + } + picString = ""; + mText = QString::fromLatin1( + "" + "" // text and background color + "" + "" + "" + "" // name + "" + "%5" // role + "%6" // organization + "" + "%7" // dynamic part + "%8" // notes + "
" + "%3" + "%4
 
" + "" + "") +//US + .arg( /*KGlobalSettings::textColor().name()*/ "black" ) +//US + .arg( /*KGlobalSettings::baseColor().name()*/ "white" ) + .arg( picString ) + .arg( name ) + .arg( aRole ) + .arg( aOrga ) + .arg( dynamicPart ) + .arg( notes ); + + } else { // no picture! + +mText = "\n"; + //mText += "\n

"; +#ifdef DESKTOP_VERSION + mText += "

"; +#else + mText += "

"; +#endif + +#ifdef DESKTOP_VERSION + mText += " " + name+"

"; +#else + mText += " " + name +""; +#endif + mText += "
"; + + mText += ""; + /* + mText += QString("" + "" ) + .arg( i18n(" ") ) + .arg( name ); + */ + if ( ! mAddressee.role().isEmpty() ) + mText += QString("" + "" ) + .arg( i18n(" ") ) + .arg( mAddressee.role()); + if ( ! mAddressee.organization().isEmpty() ) + mText += QString("" + "" ) + .arg( i18n(" ") ) + .arg( mAddressee.organization()); + mText += dynamicPart; + mText += notes; + mText += "
 
%1%2
%1%2
%1%2
"; + + } + + // at last display it... + setText( mText ); +} + +KABC::Addressee AddresseeView::addressee() const +{ + return mAddressee; +} +void AddresseeView::addTag(const QString & tag,const QString & text) +{ + if ( text.isEmpty() ) + return; + int number=text.contains("\n"); + QString str = "<" + tag + ">"; + QString tmpText=text; + QString tmpStr=str; + if(number !=-1) + { + if (number > 0) { + int pos=0; + QString tmp; + for(int i=0;i<=number;i++) { + pos=tmpText.find("\n"); + tmp=tmpText.left(pos); + tmpText=tmpText.right(tmpText.length()-pos-1); + tmpStr+=tmp+"
"; + } + } + else tmpStr += tmpText; + tmpStr+=""; + mText.append(tmpStr); + } + else + { + str += text + ""; + mText.append(str); + } +} diff --git a/libkdepim/addresseeview.h b/libkdepim/addresseeview.h new file mode 100644 index 0000000..598ef0d --- a/dev/null +++ b/libkdepim/addresseeview.h @@ -0,0 +1,60 @@ +/* + This file is part of libkdepim. + + Copyright (c) 2003 Tobias Koenig + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef KPIM_ADDRESSEEVIEW_H +#define KPIM_ADDRESSEEVIEW_H + +#include + +//US #include +#include + +namespace KPIM { + +//US class AddresseeView : public KTextBrowser +class AddresseeView : public QTextBrowser +{ + public: + AddresseeView( QWidget *parent = 0, const char *name = 0 ); + + /** + Sets the addressee object. The addressee is displayed immediately. + + @param addr The addressee object. + */ + void setAddressee( const KABC::Addressee& addr ); + + /** + Returns the current addressee object. + */ + KABC::Addressee addressee() const; + + private: + KABC::Addressee mAddressee; + QString mText; + void addTag(const QString & tag,const QString & text); + class AddresseeViewPrivate; + AddresseeViewPrivate *d; +}; + +} + +#endif diff --git a/libkdepim/categoryeditdialog.cpp b/libkdepim/categoryeditdialog.cpp new file mode 100644 index 0000000..87172c1 --- a/dev/null +++ b/libkdepim/categoryeditdialog.cpp @@ -0,0 +1,135 @@ +/* + This file is part of libkdepim. + Copyright (c) 2000, 2001, 2002 Cornelius Schumacher + + 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ + +#include +#include +#include +#include +#include +#include + +#include "kpimprefs.h" + +#include "categoryeditdialog.h" + +using namespace KPIM; + +CategoryEditDialog::CategoryEditDialog( KPimPrefs *prefs, QWidget* parent, + const char* name, bool modal, + WFlags fl ) + : CategoryEditDialog_base( parent, name, modal, fl ), + mPrefs( prefs ) +{ + mCategories->header()->hide(); + + QStringList::Iterator it; + bool categoriesExist=false; + for (it = mPrefs->mCustomCategories.begin(); + it != mPrefs->mCustomCategories.end(); ++it ) { + new QListViewItem(mCategories,*it); + categoriesExist=true; + } + + connect(mCategories,SIGNAL(selectionChanged(QListViewItem *)), + SLOT(editItem(QListViewItem *))); + connect(mEdit,SIGNAL(textChanged ( const QString & )),this,SLOT(slotTextChanged(const QString &))); + mButtonRemove->setEnabled(categoriesExist); + mButtonModify->setEnabled(categoriesExist); + mButtonAdd->setEnabled(!mEdit->text().isEmpty()); + if ( QApplication::desktop()->width() > 460 ) + resize( 300, 360 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +CategoryEditDialog::~CategoryEditDialog() +{ + // no need to delete child widgets, Qt does it all for us +} + +void CategoryEditDialog::slotTextChanged(const QString &text) +{ + mButtonAdd->setEnabled(!text.isEmpty()); +} + +void CategoryEditDialog::add() +{ + if (!mEdit->text().isEmpty()) { + new QListViewItem(mCategories,mEdit->text()); + mEdit->setText(""); + mButtonRemove->setEnabled(mCategories->childCount()>0); + mButtonModify->setEnabled(mCategories->childCount()>0); + } +} + +void CategoryEditDialog::remove() +{ + if (mCategories->currentItem()) { + delete mCategories->currentItem(); + mButtonRemove->setEnabled(mCategories->childCount()>0); + mButtonModify->setEnabled(mCategories->childCount()>0); + } +} + +void CategoryEditDialog::modify() +{ + if (!mEdit->text().isEmpty()) { + if (mCategories->currentItem()) { + mCategories->currentItem()->setText(0,mEdit->text()); + } + } +} +void CategoryEditDialog::accept() +{ + slotOk(); +} + +void CategoryEditDialog::slotOk() +{ + slotApply(); + QDialog::accept(); +} + +void CategoryEditDialog::slotApply() +{ + mPrefs->mCustomCategories.clear(); + + QListViewItem *item = mCategories->firstChild(); + while(item) { + mPrefs->mCustomCategories.append(item->text(0)); + item = item->nextSibling(); + } + mPrefs->writeConfig(); + + emit categoryConfigChanged(); +} + +void CategoryEditDialog::editItem(QListViewItem *item) +{ + mEdit->setText(item->text(0)); + mButtonRemove->setEnabled(true); + mButtonModify->setEnabled(true); +} + +#include "categoryeditdialog.moc" diff --git a/libkdepim/categoryeditdialog.h b/libkdepim/categoryeditdialog.h new file mode 100644 index 0000000..027cb98 --- a/dev/null +++ b/libkdepim/categoryeditdialog.h @@ -0,0 +1,62 @@ +/* + This file is part of libkdepim. + Copyright (c) 2000, 2001, 2002 Cornelius Schumacher + + 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ +#ifndef KPIM_CATEGORYEDITDIALOG_H +#define KPIM_CATEGORYEDITDIALOG_H + +#include + +class KPimPrefs; + +namespace KPIM { + +class CategoryEditDialog : public CategoryEditDialog_base +{ + Q_OBJECT + public: + CategoryEditDialog( KPimPrefs *prefs, QWidget* parent = 0, + const char* name = 0, + bool modal = FALSE, WFlags fl = 0 ); + ~CategoryEditDialog(); + + public slots: + void add(); + void remove(); + void modify(); + void accept(); + + void slotOk(); + void slotApply(); + + signals: + void categoryConfigChanged(); + + private slots: + void editItem(QListViewItem *item); + void slotTextChanged(const QString &text); + + KPimPrefs *mPrefs; +}; + +} + +#endif diff --git a/libkdepim/categoryeditdialog.moc b/libkdepim/categoryeditdialog.moc new file mode 100644 index 0000000..e69de29 --- a/dev/null +++ b/libkdepim/categoryeditdialog.moc diff --git a/libkdepim/categoryeditdialog_base.cpp b/libkdepim/categoryeditdialog_base.cpp new file mode 100644 index 0000000..ac99190 --- a/dev/null +++ b/libkdepim/categoryeditdialog_base.cpp @@ -0,0 +1,154 @@ +#include +/**************************************************************************** +** Form implementation generated from reading ui file '/build/kde/cvs/korge/kdepim/libkdepim/categoryeditdialog_base.ui' +** +** Created: Sat Mar 29 21:46:09 2003 +** by: The User Interface Compiler () +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ + +#include "categoryeditdialog_base.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a CategoryEditDialog_base as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * TRUE to construct a modal dialog. + */ +CategoryEditDialog_base::CategoryEditDialog_base( QWidget* parent, const char* name, bool modal, WFlags fl ) + : QDialog( parent, name, true, fl ) + +{ + if ( !name ) + setName( "CategoryEditDialog_base" ); + CategoryEditDialog_baseLayout = new QGridLayout( this, 1, 1, 11, 6, "CategoryEditDialog_baseLayout"); + + mEdit = new QLineEdit( this, "mEdit" ); + + CategoryEditDialog_baseLayout->addMultiCellWidget( mEdit, 1, 1, 0, 1 ); + + Layout13 = new QHBoxLayout( 0, 0, 6, "Layout13"); + + // mButtonHelp = new QPushButton( this, "mButtonHelp" ); + //mButtonHelp->setAutoDefault( TRUE ); + //Layout13->addWidget( mButtonHelp ); + //QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ); + //Layout13->addItem( spacer ); + + //mApply = new QPushButton( this, "mApply" ); + // Layout13->addWidget( mApply ); + + mButtonOk = new QPushButton( this, "mButtonOk" ); + mButtonOk->setAutoDefault( TRUE ); + mButtonOk->setDefault( TRUE ); + Layout13->addWidget( mButtonOk ); + + mButtonCancel = new QPushButton( this, "mButtonCancel" ); + mButtonCancel->setAutoDefault( TRUE ); + Layout13->addWidget( mButtonCancel ); + + CategoryEditDialog_baseLayout->addMultiCellLayout( Layout13, 2, 2, 0, 1 ); + + mCategories = new QListView( this, "mCategories" ); + mCategories->addColumn( tr2i18n( "Category" ) ); + + CategoryEditDialog_baseLayout->addWidget( mCategories, 0, 0 ); + + layout103 = new QVBoxLayout( 0, 0, 6, "layout103"); + + mButtonAdd = new QPushButton( this, "mButtonAdd" ); + layout103->addWidget( mButtonAdd ); + + mButtonModify = new QPushButton( this, "mButtonModify" ); + layout103->addWidget( mButtonModify ); + + mButtonRemove = new QPushButton( this, "mButtonRemove" ); + layout103->addWidget( mButtonRemove ); + QSpacerItem* spacer_2 = new QSpacerItem( 20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding ); + layout103->addItem( spacer_2 ); + + CategoryEditDialog_baseLayout->addLayout( layout103, 0, 1 ); + languageChange(); + resize( sizeHint() ); + + // signals and slots connections + connect( mButtonCancel, SIGNAL( clicked() ), this, SLOT( reject() ) ); + connect( mButtonAdd, SIGNAL( clicked() ), this, SLOT( add() ) ); + connect( mButtonModify, SIGNAL( clicked() ), this, SLOT( modify() ) ); + connect( mButtonRemove, SIGNAL( clicked() ), this, SLOT( remove() ) ); + connect( mButtonOk, SIGNAL( clicked() ), this, SLOT( slotOk() ) ); + //connect( mApply, SIGNAL( clicked() ), this, SLOT( slotApply() ) ); + + // tab order + // setTabOrder( mCategories, mEdit ); +// setTabOrder( mEdit, mButtonAdd ); +// setTabOrder( mButtonAdd, mButtonModify ); +// setTabOrder( mButtonModify, mButtonRemove ); +// setTabOrder( mButtonRemove, mButtonHelp ); +// setTabOrder( mButtonHelp, mApply ); +// setTabOrder( mApply, mButtonOk ); +// setTabOrder( mButtonOk, mButtonCancel ); +} + +/* + * Destroys the object and frees any allocated resources + */ +CategoryEditDialog_base::~CategoryEditDialog_base() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void CategoryEditDialog_base::languageChange() +{ + setCaption( tr2i18n( "Edit Categories" ) ); + // mButtonHelp->setText( tr2i18n( "&Help" ) ); + // mApply->setText( tr2i18n( "&Apply" ) ); + mButtonOk->setText( tr2i18n( "&OK" ) ); + mButtonCancel->setText( tr2i18n( "&Cancel" ) ); + mCategories->header()->setLabel( 0, tr2i18n( "Category" ) ); + mButtonAdd->setText( tr2i18n( "A&dd" ) ); + mButtonModify->setText( tr2i18n( "&Modify" ) ); + mButtonRemove->setText( tr2i18n( "&Remove" ) ); +} + +void CategoryEditDialog_base::add() +{ + qWarning( "CategoryEditDialog_base::add(): Not implemented yet" ); +} + +void CategoryEditDialog_base::modify() +{ + qWarning( "CategoryEditDialog_base::modify(): Not implemented yet" ); +} + +void CategoryEditDialog_base::slotApply() +{ + qWarning( "CategoryEditDialog_base::slotApply(): Not implemented yet" ); +} + +void CategoryEditDialog_base::remove() +{ + qWarning( "CategoryEditDialog_base::remove(): Not implemented yet" ); +} + +void CategoryEditDialog_base::slotOk() +{ + qWarning( "CategoryEditDialog_base::slotOk(): Not implemented yet" ); +} + +#include "categoryeditdialog_base.moc" diff --git a/libkdepim/categoryeditdialog_base.h b/libkdepim/categoryeditdialog_base.h new file mode 100644 index 0000000..5557ad0 --- a/dev/null +++ b/libkdepim/categoryeditdialog_base.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** Form interface generated from reading ui file '/build/kde/cvs/korge/kdepim/libkdepim/categoryeditdialog_base.ui' +** +** Created: Sat Mar 29 21:45:20 2003 +** by: The User Interface Compiler () +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ + +#ifndef CATEGORYEDITDIALOG_BASE_H +#define CATEGORYEDITDIALOG_BASE_H + +#include +#include + +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QLineEdit; +class QListView; +class QListViewItem; +class QPushButton; + +class CategoryEditDialog_base : public QDialog +{ + Q_OBJECT + +public: + CategoryEditDialog_base( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~CategoryEditDialog_base(); + + QLineEdit* mEdit; + QPushButton* mButtonHelp; + QPushButton* mApply; + QPushButton* mButtonOk; + QPushButton* mButtonCancel; + QListView* mCategories; + QPushButton* mButtonAdd; + QPushButton* mButtonModify; + QPushButton* mButtonRemove; + +public slots: + virtual void add(); + virtual void modify(); + virtual void slotApply(); + virtual void remove(); + virtual void slotOk(); + +protected: + QGridLayout* CategoryEditDialog_baseLayout; + QHBoxLayout* Layout13; + QVBoxLayout* layout103; + +protected slots: + virtual void languageChange(); +}; + +#endif // CATEGORYEDITDIALOG_BASE_H diff --git a/libkdepim/categoryeditdialog_base.moc b/libkdepim/categoryeditdialog_base.moc new file mode 100644 index 0000000..e69de29 --- a/dev/null +++ b/libkdepim/categoryeditdialog_base.moc diff --git a/libkdepim/categoryselectdialog.cpp b/libkdepim/categoryselectdialog.cpp new file mode 100644 index 0000000..7b0aced --- a/dev/null +++ b/libkdepim/categoryselectdialog.cpp @@ -0,0 +1,173 @@ +/* + This file is part of libkdepim. + Copyright (c) 2000, 2001, 2002 Cornelius Schumacher + + 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ + +#include +#include +#include +#include +#include + + +#include +#include "categoryselectdialog.h" + +#include "kpimprefs.h" + +using namespace KPIM; + +CategorySelectDialog::CategorySelectDialog( KPimPrefs *prefs, QWidget* parent, + const char* name, + bool modal, WFlags fl ) + : CategorySelectDialog_base( parent, name, true, fl ), + mPrefs( prefs ) +{ + mCategories->header()->hide(); + + setCategories(); + + connect(mButtonEdit,SIGNAL(clicked()),this, SLOT(editCategoriesDialog())); + if ( qApp->desktop()->height() < 321 ) + setMaximumHeight( QApplication::desktop()->height() - 50 ); + else + setMaximumHeight( QApplication::desktop()->height() - 80 ); + if ( QApplication::desktop()->width() > 460 ) + resize( 260, 360 ); +} +void CategorySelectDialog::editCategoriesDialog() +{ + KPIM::CategoryEditDialog* ced = new KPIM::CategoryEditDialog(mPrefs,this ); + + ced->exec(); + delete ced; + setCategories(); +} +void CategorySelectDialog::setCategories() +{ + mCategories->clear(); + mCategoryList.clear(); + + QStringList::Iterator it; + + for (it = mPrefs->mCustomCategories.begin(); + it != mPrefs->mCustomCategories.end(); ++it ) { + new QCheckListItem(mCategories,*it,QCheckListItem::CheckBox); + } +} + +CategorySelectDialog::~CategorySelectDialog() +{ +} + +void CategorySelectDialog::setSelected(const QStringList &selList) +{ + clear(); + + QStringList::ConstIterator it; + QStringList notFound; + bool found = false; + for (it=selList.begin();it!=selList.end();++it) { + //qDebug(" CategorySelectDialog::setSelected("); + QCheckListItem *item = (QCheckListItem *)mCategories->firstChild(); + while (item) { + if (item->text() == *it) { + item->setOn(true); + found = true; + break; + } + item = (QCheckListItem *)item->nextSibling(); + } +// if ( ! found ) { + +//emit updateCategoriesGlobal(); +// QMessageBox::information( this, "KO/E: Information!", +// "Categories found, which were not\n" +// "in list of categories!\n" +// "message", +// "OK", "", 0, +// 0, 1 ); +// setSelected(selList); +// return; +// } + } +} + +QStringList CategorySelectDialog::selectedCategories() const +{ + return mCategoryList; +} + +void CategorySelectDialog::slotApply() +{ + QStringList categories; + QCheckListItem *item = (QCheckListItem *)mCategories->firstChild(); + while (item) { + if (item->isOn()) { + categories.append(item->text()); + } + item = (QCheckListItem *)item->nextSibling(); + } + + QString categoriesStr = categories.join(","); + + mCategoryList = categories; + + emit categoriesSelected(categories); + emit categoriesSelected(categoriesStr); +} +void CategorySelectDialog::accept() +{ + slotOk(); +} + +void CategorySelectDialog::slotOk() +{ + slotApply(); + QDialog::accept(); +} + +void CategorySelectDialog::clear() +{ + QCheckListItem *item = (QCheckListItem *)mCategories->firstChild(); + while (item) { + item->setOn(false); + item = (QCheckListItem *)item->nextSibling(); + } +} + +void CategorySelectDialog::updateCategoryConfig() +{ + QStringList selected; + QCheckListItem *item = (QCheckListItem *)mCategories->firstChild(); + while (item) { + if (item->isOn()) { + selected.append(item->text()); + } + item = (QCheckListItem *)item->nextSibling(); + } + + setCategories(); + + setSelected(selected); +} + +#include "categoryselectdialog.moc" diff --git a/libkdepim/categoryselectdialog.h b/libkdepim/categoryselectdialog.h new file mode 100644 index 0000000..8507dc4 --- a/dev/null +++ b/libkdepim/categoryselectdialog.h @@ -0,0 +1,69 @@ +/* + This file is part of libkdepim. + Copyright (c) 2000, 2001, 2002 Cornelius Schumacher + + 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ +#ifndef KPIM_CATEGORYSELECTDIALOG_H +#define KPIM_CATEGORYSELECTDIALOG_H + +#include + +class KPimPrefs; + +namespace KPIM { + +class CategorySelectDialog : public CategorySelectDialog_base +{ + Q_OBJECT + public: + CategorySelectDialog( KPimPrefs *prefs, QWidget* parent = 0, + const char* name = 0, + bool modal = FALSE, WFlags fl = 0 ); + ~CategorySelectDialog(); + + void setCategories(); + void setSelected(const QStringList &selList); + + QStringList selectedCategories() const; + + public slots: + void slotOk(); + void slotApply(); + void clear(); + void accept(); + void editCategoriesDialog(); + void updateCategoryConfig(); + + signals: + void categoriesSelected(const QString &); + void categoriesSelected(const QStringList &); + void editCategories(); + + private: + KPimPrefs *mPrefs; + QStringList mCategoryList; + + class CategorySelectDialogPrivate; + CategorySelectDialogPrivate *d; +}; + +} + +#endif diff --git a/libkdepim/categoryselectdialog.moc b/libkdepim/categoryselectdialog.moc new file mode 100644 index 0000000..e69de29 --- a/dev/null +++ b/libkdepim/categoryselectdialog.moc diff --git a/libkdepim/categoryselectdialog_base.cpp b/libkdepim/categoryselectdialog_base.cpp new file mode 100644 index 0000000..5e5fa72 --- a/dev/null +++ b/libkdepim/categoryselectdialog_base.cpp @@ -0,0 +1,128 @@ +#include +/**************************************************************************** +** Form implementation generated from reading ui file '/build/kde/cvs/korge/kdepim/libkdepim/categoryselectdialog_base.ui' +** +** Created: Sat Mar 29 21:46:05 2003 +** by: The User Interface Compiler () +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ + +#include "categoryselectdialog_base.h" + +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a CategorySelectDialog_base as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * TRUE to construct a modal dialog. + */ +CategorySelectDialog_base::CategorySelectDialog_base( QWidget* parent, const char* name, bool modal, WFlags fl ) + : QDialog( parent, name, modal, fl ) + +{ + if ( !name ) + setName( "CategorySelectDialog_base" ); + CategorySelectDialog_baseLayout = new QVBoxLayout( this, 11, 6, "CategorySelectDialog_baseLayout"); + + mCategories = new QListView( this, "mCategories" ); + mCategories->addColumn( i18n( "Category" ) ); + CategorySelectDialog_baseLayout->addWidget( mCategories ); + + Layout12 = new QHBoxLayout( 0, 0, 6, "Layout12"); + + mClear = new QPushButton( this, "mClear" ); + Layout12->addWidget( mClear ); + // QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ); + //Layout12->addItem( spacer ); + + mButtonEdit = new QPushButton( this, "mButtonEdit" ); + Layout12->addWidget( mButtonEdit ); + CategorySelectDialog_baseLayout->addLayout( Layout12 ); + + Layout11 = new QHBoxLayout( 0, 0, 6, "Layout11"); + + //mButtonHelp = new QPushButton( this, "mButtonHelp" ); + //Layout11->addWidget( mButtonHelp ); + //QSpacerItem* spacer_2 = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ); + // Layout11->addItem( spacer_2 ); + + //mApply = new QPushButton( this, "mApply" ); + // Layout11->addWidget( mApply ); + + mButtonOk = new QPushButton( this, "mButtonOk" ); + mButtonOk->setOn( FALSE ); + mButtonOk->setDefault( TRUE ); + Layout11->addWidget( mButtonOk ); + + mButtonCancel = new QPushButton( this, "mButtonCancel" ); + Layout11->addWidget( mButtonCancel ); + CategorySelectDialog_baseLayout->addLayout( Layout11 ); + languageChange(); + // resize( sizeHint() ); + + // signals and slots connections + connect( mButtonCancel, SIGNAL( clicked() ), this, SLOT( reject() ) ); + connect( mButtonOk, SIGNAL( clicked() ), this, SLOT( slotOk() ) ); + connect( mClear, SIGNAL( clicked() ), this, SLOT( clear() ) ); + //connect( mApply, SIGNAL( clicked() ), this, SLOT( slotApply() ) ); + + // tab order + setTabOrder( mCategories, mClear ); + setTabOrder( mClear, mButtonEdit ); + setTabOrder( mButtonEdit, mButtonOk );//mButtonHelp ); + // setTabOrder( mButtonHelp, mApply ); + // setTabOrder( mApply, mButtonOk ); + setTabOrder( mButtonOk, mButtonCancel ); + // showMaximized(); + //raise(); +} + +/* + * Destroys the object and frees any allocated resources + */ +CategorySelectDialog_base::~CategorySelectDialog_base() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void CategorySelectDialog_base::languageChange() +{ + setCaption( i18n( "Select Categories" ) ); + mCategories->header()->setLabel( 0, tr2i18n( "Category" ) ); + mClear->setText( i18n( " &Deselect All " ) ); + mButtonEdit->setText( i18n( " &Edit Categories " ) ); + // mButtonHelp->setText( tr2i18n( "&Help" ) ); + //mApply->setText( i18n( "&Apply" ) ); + mButtonOk->setText( i18n( "&OK" ) ); + mButtonCancel->setText( i18n( "&Cancel" ) ); +} + +void CategorySelectDialog_base::clear() +{ + qWarning( "CategorySelectDialog_base::clear(): Not implemented yet" ); +} + +void CategorySelectDialog_base::slotApply() +{ + qWarning( "CategorySelectDialog_base::slotApply(): Not implemented yet" ); +} + +void CategorySelectDialog_base::slotOk() +{ + qWarning( "CategorySelectDialog_base::slotOk(): Not implemented yet" ); +} + +#include "categoryselectdialog_base.moc" diff --git a/libkdepim/categoryselectdialog_base.h b/libkdepim/categoryselectdialog_base.h new file mode 100644 index 0000000..af905ed --- a/dev/null +++ b/libkdepim/categoryselectdialog_base.h @@ -0,0 +1,53 @@ +/**************************************************************************** +** Form interface generated from reading ui file '/build/kde/cvs/korge/kdepim/libkdepim/categoryselectdialog_base.ui' +** +** Created: Sat Mar 29 21:45:20 2003 +** by: The User Interface Compiler () +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ + +#ifndef CATEGORYSELECTDIALOG_BASE_H +#define CATEGORYSELECTDIALOG_BASE_H + +#include +#include + +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QListView; +class QListViewItem; +class QPushButton; + +class CategorySelectDialog_base : public QDialog +{ + Q_OBJECT + +public: + CategorySelectDialog_base( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~CategorySelectDialog_base(); + + QListView* mCategories; + QPushButton* mClear; + QPushButton* mButtonEdit; + QPushButton* mButtonHelp; + QPushButton* mApply; + QPushButton* mButtonOk; + QPushButton* mButtonCancel; + +public slots: + virtual void clear(); + virtual void slotApply(); + virtual void slotOk(); + +protected: + QVBoxLayout* CategorySelectDialog_baseLayout; + QHBoxLayout* Layout12; + QHBoxLayout* Layout11; + +protected slots: + virtual void languageChange(); +}; + +#endif // CATEGORYSELECTDIALOG_BASE_H diff --git a/libkdepim/categoryselectdialog_base.moc b/libkdepim/categoryselectdialog_base.moc new file mode 100644 index 0000000..e69de29 --- a/dev/null +++ b/libkdepim/categoryselectdialog_base.moc diff --git a/libkdepim/kdateedit.cpp b/libkdepim/kdateedit.cpp new file mode 100644 index 0000000..60bd2cf --- a/dev/null +++ b/libkdepim/kdateedit.cpp @@ -0,0 +1,486 @@ +/* + This file is part of libkdepim. + + Copyright (c) 2002 Cornelius Schumacher + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "kdateedit.h" +#include "kdateedit.moc" + +KDateEdit::KDateEdit(QWidget *parent, const char *name, bool withoutDP ) + : QHBox(parent, name) +{ + dateFormShort = true; + withoutDp = withoutDP; + mDateEdit = new QLineEdit(this); + mDateEdit->setText(KGlobal::locale()->formatDate(QDate::currentDate(),dateFormShort)); + setFocusProxy(mDateEdit); + mDateEdit->installEventFilter(this); + + // Highlight Background and Textcolor + QPalette palette = QWidget::palette(); + unsigned char red, green, blue; + red = palette.color( QPalette::Normal , QColorGroup::Background ).red() - 10; + green = palette.color( QPalette::Normal , QColorGroup::Background ).green() - 10; + blue = palette.color( QPalette::Normal , QColorGroup::Background ).blue() - 10; + palette.setColor( QColorGroup::Highlight, QColor(red,green,blue) ); + palette.setColor( QColorGroup::HighlightedText, palette.color( QPalette::Normal , QColorGroup::Foreground ) ); + mDateEdit->setPalette( palette ); + + if ( withoutDP ) { + mDateFrame = 0; + mDateButton = 0; + mDatePicker = 0; + } else { + QPixmap pixmap = SmallIcon("smallcal"); + mDateButton = new QPushButton(this); + mDateButton->setPixmap(pixmap); + + mDateFrame = new QVBox(0,0,WType_Popup); + // mDateFrame->setFrameStyle(QFrame::PopupPanel | QFrame::Raised); + mDateFrame->setFrameStyle( QFrame::WinPanel |QFrame::Raised ); + mDateFrame->setLineWidth(3); + mDateFrame->hide(); + + mDatePicker = new KDatePicker(mDateFrame,QDate::currentDate()); + connect(mDatePicker,SIGNAL(dateEntered(QDate)),SLOT(setDate(QDate))); + connect(mDatePicker,SIGNAL(dateEntered(QDate)),SIGNAL(dateChanged(QDate))); + connect(mDatePicker,SIGNAL(dateSelected(QDate)),SLOT(setDate(QDate))); + connect(mDatePicker,SIGNAL(dateSelected(QDate)),SIGNAL(dateChanged(QDate))); + connect(mDatePicker,SIGNAL(dateSelected(QDate)),mDateFrame,SLOT(hide())); + connect(mDateButton,SIGNAL(clicked()),SLOT(toggleDatePicker())); + + //mDateFrame->resize( 400, 300 ); + + } + connect(mDateEdit,SIGNAL(returnPressed()),SLOT(lineEnterPressed())); + connect(mDateEdit,SIGNAL(textChanged(const QString &)), + SLOT(textChanged(const QString &))); + + // Create the keyword list. This will be used to match against when the user + // enters information. + mKeywordMap[i18n("tomorrow")] = 1; + mKeywordMap[i18n("today")] = 0; + mKeywordMap[i18n("yesterday")] = -1; + + /* + * This loop uses some math tricks to figure out the offset in days + * to the next date the given day of the week occurs. There + * are two cases, that the new day is >= the current day, which means + * the new day has not occured yet or that the new day < the current day, + * which means the new day is already passed (so we need to find the + * day in the next week). + */ + QString dayName; + int currentDay = QDate::currentDate().dayOfWeek(); + for (int i = 1; i <= 7; ++i) + { + dayName = KGlobal::locale()->weekDayName(i).lower(); + if (i >= currentDay) + mKeywordMap[dayName] = i - currentDay; + else + mKeywordMap[dayName] = 7 - currentDay + i; + } + + mTextChanged = false; + mHandleInvalid = false; + QWidget::setTabOrder( mDateEdit, mDateButton ); +} + +KDateEdit::~KDateEdit() +{ + delete mDateFrame; +} + +void KDateEdit::setDate(QDate newDate) +{ + if (!newDate.isValid() && !mHandleInvalid) + return; + if ( readDate() == newDate ) + return; + QString dateString = ""; + if(newDate.isValid()) + dateString = KGlobal::locale()->formatDate( newDate, dateFormShort ); + + mTextChanged = false; + + // We do not want to generate a signal here, since we explicity setting + // the date + bool b = mDateEdit->signalsBlocked(); + mDateEdit->blockSignals(true); + mDateEdit->setText(dateString); + mDateEdit->blockSignals(b); +} + +void KDateEdit::setDate( QDate date,int *cpos,const int key ,const bool dateFormShort) +{ + QString dateForm = dateFormShort ? + KGlobal::locale()->dateFormatShort() : + KGlobal::locale()->dateFormat(); + + int begin = dateForm.find("%"); + int space = 0; + int allStrLength = 0; + int strLength = 0; + int repeat = 0; + + // witch? Day, Month or Year switch? + while(1){ + switch ( dateForm.at(begin + 1).latin1() ) + { + case 'd':// 16 (month day) + strLength = 2; //Ok + break; + case 'm':// 01 (month) + strLength = 2; //Ok + break; + case 'a':// Mon (Weekday) + strLength = KGlobal::locale()->weekDayName(date.dayOfWeek(), true).length(); + break; + case 'A':// Monday (Weekday) + strLength = KGlobal::locale()->weekDayName(date.dayOfWeek(), false).length(); + break; + case 'b':// Jan (monthName) + strLength = KGlobal::locale()->monthName(date.month(), true).length(); + break; + case 'B':// January (monthName) + strLength = KGlobal::locale()->monthName(date.month(), false).length(); + break; + case 'y':// 04 (year short) + strLength = 2; //Ok + break; + case 'Y':// 2004 (year) + strLength = 4; //Ok + break; + default: + break; + } + space = begin - (repeat++ * 2); + // all select? then dayswitch + if( (mDateEdit->text().length() == mDateEdit->markedText().length() ) && + ( (dateForm.at(begin + 1).latin1() == 'd') || + (dateForm.at(begin + 1).latin1() == 'a') || + (dateForm.at(begin + 1).latin1() == 'A') ) ) { + break; + } + // mDateEdit-StringPos == CursorPosition(cpos) then break and set date + if( ( (space + allStrLength) <= *cpos && *cpos <= (space + allStrLength + strLength) ) || *cpos < begin ) { + break; + } + allStrLength += strLength; + begin = dateForm.find("%", begin +1); + } + + // set date + switch ( dateForm.at(begin + 1).latin1() ) { + case 'd': + case 'a': + case 'A': + if(key == Key_Up) { + setDate( date.addDays( 1 ) ); + } + else if(key == Key_Down) { + setDate( date.addDays( -1 ) ); + } + maxDay = readDate().day(); + break; + case 'm': + case 'b': + case 'B': + if(key == Key_Up) { + int year = ((date.month()+1)>12)?date.year()+1:date.year(); + int month = ((date.month()+1)>12)?1:date.month()+1; + int day = (QDate(year,month,1).daysInMonth()weekDayName(date.dayOfWeek(), true).length(); + break; + case 'A':// Monday (Weekday) + selectStrLength = KGlobal::locale()->weekDayName(date.dayOfWeek(), false).length(); + break; + case 'b':// Jan (monthName short) + selectStrLength = KGlobal::locale()->monthName(date.month(), true).length(); + break; + case 'B':// January (monthName) + selectStrLength = KGlobal::locale()->monthName(date.month(), false).length(); + break; + case 'y':// 04 (year short) + selectStrLength = 2; //Ok + break; + case 'Y':// 2004 (year) + selectStrLength = 4; //Ok + break; + default: + break; + } + space = begin - (i * 2); + allSelectStrLength += selectStrLength; + begin = dateForm.find("%", begin +1); + } + // set selection from begin of date + setSelect( space + allSelectStrLength - selectStrLength , selectStrLength); + *cpos = space + allSelectStrLength; + emit(dateChanged(date)); + + return; +} + +void KDateEdit::setHandleInvalid(bool handleInvalid) +{ + mHandleInvalid = handleInvalid; +} + +void KDateEdit::setEnabled(bool on) +{ + mDateEdit->setEnabled(on); + mDateButton->setEnabled(on); +} + +QDate KDateEdit::date() const +{ + QDate date = readDate(); + + if (date.isValid() || mHandleInvalid) { + return date; + } else { + KNotifyClient::beep(); + return QDate::currentDate(); + } +} + +void KDateEdit::keyPressEvent(QKeyEvent *e) +{ + QDate date = readDate(); + int cpos = mDateEdit->cursorPosition(); + + switch(e->key()) + { + case Key_Escape: + mDateEdit->deselect(); + case Key_Tab: + QHBox::keyPressEvent(e); + break; + case Key_Up: + // when date invalid then set to currend and return + if(!date.isValid()) { + date = QDate::currentDate(); + setDate(date); + mDateEdit->setCursorPosition(cpos); + emit(dateChanged(date)); + QString text = i18n( "You entered an invalid date!\n Date changed to current date." ); + KMessageBox::information( 0, text ); + return; + } + setDate(date, &cpos, Key_Up, dateFormShort); + break; + case Key_Down: + // when date invalid then set to current and return + if(!date.isValid()) { + date = QDate::currentDate(); + setDate(date); + mDateEdit->setCursorPosition(cpos); + emit(dateChanged(date)); + QString text = i18n( "You entered an invalid date!\n Date changed to current date." ); + KMessageBox::information( 0, text ); + return; + } + setDate(date, &cpos, Key_Down, dateFormShort); + break; + default: + QHBox::keyPressEvent(e); + break; + } // switch + mDateEdit->setCursorPosition(cpos); +} + +void KDateEdit::setSelect( int from, int to ) +{ +// return; + mDateEdit->setSelection( from , to ); +} + +void KDateEdit::toggleDatePicker() +{ + if( mDateFrame->isVisible() ) { + mDateFrame->hide(); + } else { + QPoint tmpPoint = mapToGlobal(mDateButton->geometry().bottomRight()); + QSize datepickersize = mDatePicker->sizeHint(); + + if ( tmpPoint.x() < 7+datepickersize.width() ) tmpPoint.setX( 7+datepickersize.width() ); + + int h = QApplication::desktop()->height(); + + if ( tmpPoint.y() + datepickersize.height() > h ) tmpPoint.setY( h - datepickersize.height() ); + + mDateFrame->setGeometry(tmpPoint.x()-datepickersize.width()-7, tmpPoint.y(), + datepickersize.width()+2*mDateFrame->lineWidth(), datepickersize.height()+2*mDateFrame->lineWidth()); + + QDate date = readDate(); + if(date.isValid()) { + mDatePicker->setDate(date); + } else { + mDatePicker->setDate(QDate::currentDate()); + } + mDateFrame->show(); + } +} + + +void KDateEdit::lineEnterPressed() +{ + QDate date = readDate(); + + if(date.isValid()) + { + // Update the edit. This is needed if the user has entered a + // word rather than the actual date. + setDate(date); + emit(dateChanged(date)); + emit returnPressed(); + } + else + { + if ( withoutDp ) { + KNotifyClient::beep(); + } else { + if ( !mDateEdit->text().isEmpty() ) { + mTextChanged = false; + QString text = i18n( "You entered an invalid date!\n Will use current date instead." ); + if ( KMessageBox::warningContinueCancel( 0, text ) == KMessageBox::Continue ) { + setDate( QDate::currentDate() ); + emit dateChanged( QDate::currentDate() ); + } + } + } + } +} + +bool KDateEdit::inputIsValid() +{ + return readDate().isValid(); +} + +QDate KDateEdit::readDate() const +{ + QString text = mDateEdit->text(); + QDate date; + + if (mKeywordMap.contains(text.lower())) + { + date = QDate::currentDate().addDays(mKeywordMap[text.lower()]); + } + else + { + date = KGlobal::locale()->readDate(text); + } + + return date; +} + +bool KDateEdit::eventFilter(QObject *, QEvent *e) +{ + // We only process the focus out event if the text has changed + // since we got focus + if ((e->type() == QEvent::FocusOut) && mTextChanged) + { + lineEnterPressed(); + mTextChanged = false; + } + // switch dateFormShort by double klick with mouse + else if (e->type() == QEvent::MouseButtonDblClick) + { + dateFormShort = dateFormShort?false:true; + mDateEdit->setText(KGlobal::locale()->formatDate(readDate(),dateFormShort)); + } + else if (e->type() == QEvent::FocusIn) + { + maxDay = readDate().day(); + } + + return false; +} + +void KDateEdit::textChanged(const QString &) +{ + if(mHandleInvalid && mDateEdit->text().stripWhiteSpace().isEmpty()) { + QDate date; //invalid date + emit(dateChanged(date)); + } else { + mTextChanged = true; + } + maxDay = readDate().day(); +} diff --git a/libkdepim/kdateedit.h b/libkdepim/kdateedit.h new file mode 100644 index 0000000..742d843 --- a/dev/null +++ b/libkdepim/kdateedit.h @@ -0,0 +1,140 @@ +/* + This file is part of libkdepim. + + Copyright (c) 2002 Cornelius Schumacher + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ +#ifndef KDATEEDIT_H +#define KDATEEDIT_H + +#include +#include +#include +#include + +class QLineEdit; +class QPushButton; +class QObject; +class QEvent; +class KDatePicker; +class KDateValidator; + +/** +* A date editing widget that consists of a line edit followed by +* a small push button. The line edit contains the date in text form, +* and the push button will display a 'popup' style date picker. +* +* This widget also supports advanced features like allowing the user +* to type in the day name to get the date. The following keywords +* are supported (in the native language): tomorrow, yesturday, today, +* monday, tuesday, wednesday, thursday, friday, saturday, sunday. +* +* @author Cornelius Schumacher +* @author Mike Pilone +*/ +class KDateEdit : public QHBox +{ + Q_OBJECT + public: + KDateEdit(QWidget *parent=0, const char *name=0, bool withoutDP = false ); + virtual ~KDateEdit(); + + /** @return True if the date in the text edit is valid, + * false otherwise. This will not modify the display of the date, + * but only check for validity. + */ + bool inputIsValid(); + + /** @return The date entered. This will not + * modify the display of the date, but only return it. + */ + QDate date() const; + + /** @param handleInvalid If true the date edit accepts invalid dates + * and displays them as the empty ("") string. It also returns an invalid date. + * If false (default) invalid dates are not accepted and instead the date + * of today will be returned. + */ + void setHandleInvalid(bool handleInvalid); + + /** Checks for a focus out event. The display of the date is updated + * to display the proper date when the focus leaves. + */ + virtual bool eventFilter(QObject *o, QEvent *e); + + signals: + /** This signal is emitted whenever the user modifies the date. This + * may not get emitted until the user presses enter in the line edit or + * focus leaves the widget (ie: the user confirms their selection). + */ + void dateChanged(QDate); + void returnPressed(); + public slots: + /** Sets the date. + * + * @param date The new date to display. This date must be valid or + * it will not be displayed. + */ + void setDate(QDate date); + // set Date with key_up key_down to relation of cursor Position + // and set selection from begin to end of single date + void setDate(QDate, int *cpos, const int, const bool); + + /** Sets the date edit to be enabled or disabled (grayed out) + * + * @param on Enabled if true, disabled if false + */ + void setEnabled(bool on); + + protected slots: + void toggleDatePicker(); + void lineEnterPressed(); + void textChanged(const QString &); + + private: + /** Reads the text from the line edit. If the text is a keyword, the + * word will be translated to a date. If the text is not a keyword, the + * text will be interpreted as a date. + */ + QDate readDate() const; + + /** Maps the text that the user can enter to the offset in days from + * today. For example, the text 'tomorrow' is mapped to +1. + */ + QMap mKeywordMap; + bool mTextChanged; + bool mHandleInvalid; + + QPushButton *mDateButton; + QLineEdit *mDateEdit; + KDatePicker *mDatePicker; + QVBox *mDateFrame; + int maxDay; + bool withoutDp; + + protected: + virtual void keyPressEvent(QKeyEvent *qke); + void setSelect ( int, int ); + bool dateFormShort; + char lengthMonthName; + +}; + +#endif diff --git a/libkdepim/kdateedit.moc b/libkdepim/kdateedit.moc new file mode 100644 index 0000000..e69de29 --- a/dev/null +++ b/libkdepim/kdateedit.moc diff --git a/libkdepim/kdatepicker.cpp b/libkdepim/kdatepicker.cpp new file mode 100644 index 0000000..6e5ec0f --- a/dev/null +++ b/libkdepim/kdatepicker.cpp @@ -0,0 +1,472 @@ +/* -*- C++ -*- + This file is part of the KDE libraries + Copyright (C) 1997 Tim D. Gilman (tdgilman@best.org) + (C) 1998-2001 Mirko Boehm (mirko@kde.org) + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include "kdatepicker.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "kdatetbl.h" +#include "kdateedit.h" +#include "kdatepicker.moc" + + +KDatePicker::KDatePicker(QWidget *parent, QDate dt, const char *name) + : QFrame(parent,name), + yearForward(new QToolButton(this)), + yearBackward(new QToolButton(this)), + monthForward(new QToolButton(this)), + monthBackward(new QToolButton(this)), + selectMonth(new QToolButton(this)), + selectYear(new QToolButton(this)), + //line(new QLineEdit(this)), + val(new KDateValidator(this)) + //table(new KDateTable(this)), + //fontsize(1) +{ + // ----- + int size = 12; + if ( QApplication::desktop()->width() >= 480 ) + size = 18; + fontsize = size; + setFont ( QFont("helvetica",size) ); + table = new KDateTable(this); + setFontSize(size); + //line->setValidator(val); + lineDate = new KDateEdit( this, "dateediipicker", true ); + yearForward->setPixmap(SmallIcon("2rightarrowB")); + yearBackward->setPixmap(SmallIcon("2leftarrowB")); + monthForward->setPixmap(SmallIcon("1rightarrowB")); + monthBackward->setPixmap(SmallIcon("1leftarrowB")); + + setDate(dt); // set button texts + connect(table, SIGNAL(dateChanged(QDate)), SLOT(dateChangedSlot(QDate))); + connect(table, SIGNAL(tableClicked()), SLOT(tableClickedSlot())); + connect(monthForward, SIGNAL(clicked()), SLOT(monthForwardClicked())); + connect(monthBackward, SIGNAL(clicked()), SLOT(monthBackwardClicked())); + connect(yearForward, SIGNAL(clicked()), SLOT(yearForwardClicked())); + connect(yearBackward, SIGNAL(clicked()), SLOT(yearBackwardClicked())); + connect(selectMonth, SIGNAL(clicked()), SLOT(selectMonthClicked())); + connect(selectYear, SIGNAL(clicked()), SLOT(selectYearClicked())); + //connect(line, SIGNAL(returnPressed()), SLOT(lineEnterPressed())); + connect(lineDate, SIGNAL(dateChanged(QDate)), SLOT(slotSetDate(QDate))); + connect(lineDate, SIGNAL(returnPressed()), SLOT(lineEnterPressed())); + table->setFocus(); + +} + +KDatePicker::~KDatePicker() +{ +} + +void +KDatePicker::resizeEvent(QResizeEvent*) +{ + QWidget *buttons[] = { + yearBackward, + monthBackward, + selectMonth, + selectYear, + monthForward, + yearForward }; + const int NoOfButtons=sizeof(buttons)/sizeof(buttons[0]); + QSize sizes[NoOfButtons]; + int buttonHeight=0; + int count; + int w; + int x=0; + // ----- calculate button row height: + for(count=0; countsizeHint().width(); + int yS = buttons[count]->sizeHint().height(); + sizes[count]=QSize ( xS+10, yS ); + buttonHeight=QMAX(buttonHeight, sizes[count].height()); + } + buttonHeight += 10; + // ----- calculate size of the month button: + w=0; + for(count=0; countsetGeometry(x, 0, w, buttonHeight); + x+=w; + } + // ----- place the line edit for direct input: + sizes[0]=lineDate->sizeHint(); + //line->setGeometry(0, height()-sizes[0].height(), width(), sizes[0].height()); + lineDate->setGeometry(0, height()-sizes[0].height(), width(), sizes[0].height()); + // ----- adjust the table: + table->setGeometry(0, buttonHeight, width(), + height()-buttonHeight-sizes[0].height()); +} + +void +KDatePicker::dateChangedSlot(QDate date) +{ + lineDate->setDate( date );//(KGlobal::locale()->formatDate(date, true)); + //line->setText(KGlobal::locale()->formatDate(date, true)); + emit(dateChanged(date)); +} + +void +KDatePicker::tableClickedSlot() +{ + + emit(dateSelected(table->getDate())); + emit(tableClicked()); +} + +const QDate& +KDatePicker::getDate() const +{ + return table->getDate(); +} + +const QDate & +KDatePicker::date() const +{ + return table->getDate(); +} + +void KDatePicker::slotSetDate( QDate date ) +{ + + if(date.isValid()) { + QString temp; + // ----- + table->setDate(date); + selectMonth->setText(KGlobal::locale()->monthName(date.month(), false)); + temp.setNum(date.year()); + selectYear->setText(temp); + //line->setText(KGlobal::locale()->formatDate(date, true)); + lineDate->setDate( date ); + } + +} +bool +KDatePicker::setDate(const QDate& date) +{ + table->setFocus(); + if(date.isValid()) { + QString temp; + // ----- + table->setDate(date); + selectMonth->setText(KGlobal::locale()->monthName(date.month(), false)); + temp.setNum(date.year()); + selectYear->setText(temp); + //line->setText(KGlobal::locale()->formatDate(date, true)); + lineDate->setDate( date ); + return true; + } else { + + return false; + } + + +} + +void +KDatePicker::monthForwardClicked() +{ + QDate temp=table->getDate(); + int day=temp.day(); + // ----- + if(temp.month()==12) { + temp.setYMD(temp.year()+1, 1, 1); + } else { + temp.setYMD(temp.year(), temp.month()+1, 1); + } + if(temp.daysInMonth()getDate(); + int day=temp.day(); + // ----- + if(temp.month()==1) + { + temp.setYMD(temp.year()-1, 12, 1); + } else { + temp.setYMD(temp.year(), temp.month()-1, 1); + } + if(temp.daysInMonth()getDate(); + int day=temp.day(); + // ----- + temp.setYMD(temp.year()+1, temp.month(), 1); + if(temp.daysInMonth()getDate(); + int day=temp.day(); + // ----- + temp.setYMD(temp.year()-1, temp.month(), 1); + if(temp.daysInMonth()resize(picker->sizeHint()); + popup->setMainWidget(picker); + picker->setFocus(); + connect(picker, SIGNAL(closeMe(int)), popup, SLOT(close(int))); + if(popup->exec(selectMonth->mapToGlobal(QPoint(0, selectMonth->height())))) + { + QDate date; + int day; + // ----- + month=picker->getResult(); + date=table->getDate(); + day=date.day(); + // ----- construct a valid date in this month: + date.setYMD(date.year(), month, 1); + date.setYMD(date.year(), month, QMIN(day, date.daysInMonth())); + // ----- set this month + setDate(date); + } else { + KNotifyClient::beep(); + } + delete popup; +} + +void +KDatePicker::selectYearClicked() +{ + int year; + KPopupFrame* popup = new KPopupFrame(this); + KDateInternalYearSelector* picker = new KDateInternalYearSelector(fontsize, popup); + // ----- + picker->resize(picker->sizeHint()); + popup->setMainWidget(picker); + connect(picker, SIGNAL(closeMe(int)), popup, SLOT(close(int))); + picker->setFocus(); + if(popup->exec(selectYear->mapToGlobal(QPoint(0, selectMonth->height())))) + { + QDate date; + int day; + // ----- + year=picker->getYear(); + date=table->getDate(); + day=date.day(); + // ----- construct a valid date in this month: + date.setYMD(year, date.month(), 1); + date.setYMD(year, date.month(), QMIN(day, date.daysInMonth())); + // ----- set this month + setDate(date); + } else { + KNotifyClient::beep(); + } + delete popup; +} + +void +KDatePicker::setEnabled(bool enable) +{ + QWidget *widgets[]= { + yearForward, yearBackward, monthForward, monthBackward, + selectMonth, selectYear, + lineDate, table }; + const int Size=sizeof(widgets)/sizeof(widgets[0]); + int count; + // ----- + for(count=0; countsetEnabled(enable); + } +} + +void +KDatePicker::lineEnterPressed() +{ + QDate temp; + // ----- + temp = lineDate->date(); + //if(val->date(line->text(), temp)==QValidator::Acceptable) + //{ + emit(dateEntered(temp)); + setDate(temp); + // } else { +// KNotifyClient::beep(); +// } +} + +QSize +KDatePicker::sizeHint() const +{ + QSize tableSize=table->sizeHint(); + QWidget *buttons[]={ + yearBackward, + monthBackward, + selectMonth, + selectYear, + monthForward, + yearForward }; + const int NoOfButtons=sizeof(buttons)/sizeof(buttons[0]); + QSize sizes[NoOfButtons]; + int cx=0, cy=0, count; + // ----- store the size hints: + for(count=0; countsizeHint(); + if(buttons[count]==selectMonth) + { + cx+=maxMonthRect.width()+15; + } else { + cx+=sizes[count].width()+15; + } + cy=QMAX(sizes[count].height(), cy); + } + // ----- calculate width hint: + cx=QMAX(cx, tableSize.width()); // line edit ignored + if ( cx > QApplication::desktop()->width() -5 ) + cx = QApplication::desktop()->width() -5; + // ----- calculate height hint: + cy+=tableSize.height()+lineDate->sizeHint().height(); + + return QSize(cx, cy); +} + +void +KDatePicker::setFontSize(int s) +{ + QWidget *buttons[]= { + // yearBackward, + // monthBackward, + selectMonth, + selectYear, + // monthForward, + // yearForward + }; + const int NoOfButtons=sizeof(buttons)/sizeof(buttons[0]); + int count; + QFont font; + QRect r; + // ----- + fontsize=s; + for(count=0; countfont(); + font.setPointSize(s); + buttons[count]->setFont(font); + } + QFontMetrics metrics(selectMonth->fontMetrics()); + for(int i=1; i <= 12; ++i) + { // maxMonthRect is used by sizeHint() + r=metrics.boundingRect(KGlobal::locale()->monthName(i, false)); + maxMonthRect.setWidth(QMAX(r.width(), maxMonthRect.width())); + maxMonthRect.setHeight(QMAX(r.height(), maxMonthRect.height())); + } + table->setFontSize(s); +} + +void KDatePicker::virtual_hook( int id, void* data ) +{ /*BASE::virtual_hook( id, data );*/ } + +void KDatePicker::keyPressEvent ( QKeyEvent * e ) +{ + switch ( e->key() ) { + case Qt::Key_Right: + monthForwardClicked(); + break; + case Qt::Key_Left: + monthBackwardClicked(); + break; + + case Qt::Key_Down: + yearForwardClicked(); + + break; + + case Qt::Key_Up: + yearBackwardClicked(); + break; + + case Qt::Key_Return: + tableClickedSlot(); + break; + + default: + break; + } + +} diff --git a/libkdepim/kdatepicker.h b/libkdepim/kdatepicker.h new file mode 100644 index 0000000..6625357 --- a/dev/null +++ b/libkdepim/kdatepicker.h @@ -0,0 +1,181 @@ +/* -*- C++ -*- + This file is part of the KDE libraries + Copyright (C) 1997 Tim D. Gilman (tdgilman@best.org) + (C) 1998-2001 Mirko Boehm (mirko@kde.org) + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ +#ifndef MICROKDE_KDATEPICKER_H +#define MICROKDE_KDATEPICKER_H +#include +#include +#include + +class QLineEdit; +class QToolButton; +class KDateValidator; +class KDateTable; +class KDateEdit; + +/** + * Provides a widget for calendar date input. + * + * Different from the + * previous versions, it now emits two types of signals, either + * @ref dateSelected() or @ref dateEntered() (see documentation for both + * signals). + * + * A line edit has been added in the newer versions to allow the user + * to select a date directly by entering numbers like 19990101 + * or 990101. + * + * @image kdatepicker.png KDatePicker + * + * @version $Id$ + * @author Tim Gilman, Mirko Boehm + * + * @short A date selection widget. + **/ +class KDatePicker: public QFrame +{ + Q_OBJECT +public: + /** The usual constructor. The given date will be displayed + * initially. + **/ + KDatePicker(QWidget *parent=0, + QDate=QDate::currentDate(), + const char *name=0); + /** + * The destructor. + **/ + virtual ~KDatePicker(); + + /** The size hint for date pickers. The size hint recommends the + * minimum size of the widget so that all elements may be placed + * without clipping. This sometimes looks ugly, so when using the + * size hint, try adding 28 to each of the reported numbers of + * pixels. + **/ + QSize sizeHint() const; + + /** + * Sets the date. + * + * @returns @p false and does not change anything + * if the date given is invalid. + **/ + bool setDate(const QDate&); + + /** + * Returns the selected date. + * @deprecated + **/ + const QDate& getDate() const; + + /** + * @returns the selected date. + */ + const QDate &date() const; + + /** + * Enables or disables the widget. + **/ + void setEnabled(bool); + + /** + * Sets the font size of the widgets elements. + **/ + void setFontSize(int); + /** + * Returns the font size of the widget elements. + */ + int fontSize() const + { return fontsize; } +protected: + /// the resize event + void resizeEvent(QResizeEvent*); + /// the year forward button + QToolButton *yearForward; + /// the year backward button + QToolButton *yearBackward; + /// the month forward button + QToolButton *monthForward; + /// the month backward button + QToolButton *monthBackward; + /// the button for selecting the month directly + QToolButton *selectMonth; + /// the button for selecting the year directly + QToolButton *selectYear; + /// the line edit to enter the date directly + //QLineEdit *line; + KDateEdit *lineDate; + /// the validator for the line edit: + KDateValidator *val; + /// the date table + KDateTable *table; + /// the size calculated during resize events + // QSize sizehint; + /// the widest month string in pixels: + QSize maxMonthRect; +protected slots: + void dateChangedSlot(QDate); + void tableClickedSlot(); + void monthForwardClicked(); + void monthBackwardClicked(); + void yearForwardClicked(); + void yearBackwardClicked(); + void selectMonthClicked(); + void selectYearClicked(); + void lineEnterPressed(); + void slotSetDate(QDate); +signals: + /** This signal is emitted each time the selected date is changed. + * Usually, this does not mean that the date has been entered, + * since the date also changes, for example, when another month is + * selected. + * @see dateSelected + */ + void dateChanged(QDate); + /** This signal is emitted each time a day has been selected by + * clicking on the table (hitting a day in the current month). It + * has the same meaning as dateSelected() in older versions of + * KDatePicker. + */ + void dateSelected(QDate); + /** This signal is emitted when enter is pressed and a VALID date + * has been entered before into the line edit. Connect to both + * dateEntered() and dateSelected() to receive all events where the + * user really enters a date. + */ + void dateEntered(QDate); + /** This signal is emitted when the day has been selected by + * clicking on it in the table. + */ + void tableClicked(); + +private: + /// the font size for the widget + int fontsize; + +protected: + virtual void virtual_hook( int id, void* data ); +private: + class KDatePickerPrivate; + KDatePickerPrivate *d; + void keyPressEvent ( QKeyEvent * ) ; +}; + +#endif // KDATEPICKER_H diff --git a/libkdepim/kdatepicker.moc b/libkdepim/kdatepicker.moc new file mode 100644 index 0000000..e69de29 --- a/dev/null +++ b/libkdepim/kdatepicker.moc diff --git a/libkdepim/kdepim.pro.back b/libkdepim/kdepim.pro.back new file mode 100644 index 0000000..4dfc301 --- a/dev/null +++ b/libkdepim/kdepim.pro.back @@ -0,0 +1,34 @@ +TEMPLATE = lib +CONFIG = qt warn_on release +TARGET = kdepim +INCLUDEPATH += ../microkde ../qtcompat +INCLUDEPATH += . .. +LIBS += -lmicrokde +OBJECTS_DIR = obj/$(PLATFORM) +MOC_DIR = moc +DESTDIR=$(QPEDIR)/lib + +INTERFACES = \ + +HEADERS = \ + categoryeditdialog.h \ + categoryeditdialog_base.h \ + categoryselectdialog.h \ + categoryselectdialog_base.h \ + kdateedit.h \ + kinputdialog.h \ + kpimprefs.h \ + kprefs.h \ + kprefsdialog.h \ + +SOURCES = \ + categoryeditdialog.cpp \ + categoryeditdialog_base.cpp \ + categoryselectdialog.cpp \ + categoryselectdialog_base.cpp \ + kdateedit.cpp \ + kinputdialog.cpp \ + kpimprefs.cpp \ + kprefs.cpp \ + kprefsdialog.cpp \ + diff --git a/libkdepim/kincidenceformatter.cpp b/libkdepim/kincidenceformatter.cpp new file mode 100644 index 0000000..4815519 --- a/dev/null +++ b/libkdepim/kincidenceformatter.cpp @@ -0,0 +1,326 @@ +#include "kincidenceformatter.h" +#include +#include +#include +#ifndef KORG_NOKABC +#include +#define size count +#endif + +KIncidenceFormatter* KIncidenceFormatter::mInstance = 0; +static KStaticDeleter insd; + +QString KIncidenceFormatter::getFormattedText( Incidence * inc ) +{ +// #ifndef QT_NO_INPUTDIALOG +// return QInputDialog::getItem( caption, label, items, current, editable ); +// #else +// return QString::null; +// #endif + mText = ""; + if ( inc->type() == "Event" ) + setEvent((Event *) inc ); + else if ( inc->type() == "Todo" ) + setTodo((Todo *) inc ); + return mText; +} + +KIncidenceFormatter* KIncidenceFormatter::instance() +{ + if (!mInstance) { + mInstance = insd.setObject(new KIncidenceFormatter()); + } + return mInstance; +} +KIncidenceFormatter::~KIncidenceFormatter() +{ + if (mInstance == this) + mInstance = insd.setObject(0); + //qDebug("KIncidenceFormatter::~KIncidenceFormatter "); +} +KIncidenceFormatter::KIncidenceFormatter() +{ + mColorMode = 0; +} +void KIncidenceFormatter::setEvent(Event *event) +{ + int mode = 0; + mCurrentIncidence = event; + bool shortDate = true; + if ( mode == 0 ) { + addTag("h3",event->summary()); + } + else { + if ( mColorMode == 1 ) { + mText +=""; + } + if ( mColorMode == 2 ) { + mText +=""; + } + // mText +="" + i18n("O-due!") + ""; + if ( mode == 1 ) { + addTag("h2",i18n( "Local: " ) +event->summary()); + } else { + addTag("h2",i18n( "Remote: " ) +event->summary()); + } + addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) ); + if ( mColorMode ) + mText += ""; + } + if (event->cancelled ()) { + mText +=""; + addTag("i",i18n("This event has been cancelled!")); + mText.append("
"); + mText += "
"; + } + if (!event->location().isEmpty()) { + addTag("b",i18n("Location: ")); + mText.append(event->location()+"
"); + } + if (event->doesFloat()) { + if (event->isMultiDay()) { + mText.append(i18n("

From: %1

To: %2

") + .arg(event->dtStartDateStr(shortDate)) + .arg(event->dtEndDateStr(shortDate))); + } else { + mText.append(i18n("

On: %1

").arg(event->dtStartDateStr( shortDate ))); + } + } else { + if (event->isMultiDay()) { + mText.append(i18n("

From: %1

") + .arg(event->dtStartStr( shortDate))); + mText.append(i18n("

To: %1

") + .arg(event->dtEndStr(shortDate))); + } else { + mText.append(i18n("

On: %1

") + .arg(event->dtStartDateStr( shortDate ))); + mText.append(i18n("

From: %1 To: %2

") + .arg(event->dtStartTimeStr()) + .arg(event->dtEndTimeStr())); + } + } + + if (event->recurrence()->doesRecur()) { + + QString recurText = event->recurrence()->recurrenceText(); + addTag("p","" + i18n("This is a %1 recurring event.").arg(recurText ) + ""); + bool last; + QDate start = QDate::currentDate(); + QDate next; + next = event->recurrence()->getPreviousDate( start , &last ); + if ( !last ) { + next = event->recurrence()->getNextDate( start.addDays( - 1 ) ); + addTag("p",i18n("Next recurrence is on: ")+ KGlobal::locale()->formatDate( next, shortDate ) ); + //addTag("p", KGlobal::locale()->formatDate( next, shortDate )); + } else { + addTag("p",i18n("Last recurrence was on:") ); + addTag("p", KGlobal::locale()->formatDate( next, shortDate )); + } + } + + + if (event->isAlarmEnabled()) { + Alarm *alarm =event->alarms().first() ; + QDateTime t = alarm->time(); + int min = t.secsTo( event->dtStart() )/60; + QString s =i18n("(%1 min before)").arg( min ); + addTag("p",i18n("Alarm on: ") + s + ": "+KGlobal::locale()->formatDateTime( t, shortDate )); + //addTag("p", KGlobal::locale()->formatDateTime( t, shortDate )); + //addTag("p",s); + } + + addTag("p",i18n("Access: ") +event->secrecyStr() ); + // mText.append(event->secrecyStr()+"
"); + formatCategories(event); + if (!event->description().isEmpty()) { + addTag("p",i18n("Details: ")); + addTag("p",event->description()); + } + + + formatReadOnly(event); + formatAttendees(event); + + +} + +void KIncidenceFormatter::setTodo(Todo *event ) +{ + int mode = 0; + mCurrentIncidence = event; + bool shortDate = true; + if (mode == 0 ) + addTag("h3",event->summary()); + else { + if ( mColorMode == 1 ) { + mText +=""; + } + if ( mColorMode == 2 ) { + mText +=""; + } + if ( mode == 1 ) { + addTag("h2",i18n( "Local: " ) +event->summary()); + } else { + addTag("h2",i18n( "Remote: " ) +event->summary()); + } + addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) ); + if ( mColorMode ) + mText += ""; + } + if (event->cancelled ()) { + mText +=""; + addTag("i",i18n("This todo has been cancelled!")); + mText.append("
"); + mText += "
"; + } + + if (!event->location().isEmpty()) { + addTag("b",i18n("Location: ")); + mText.append(event->location()+"
"); + } + if (event->hasDueDate()) { + mText.append(i18n("

Due on: %1

").arg(event->dtDueStr(shortDate))); + } + mText.append(i18n("

Priority: %2

") + .arg(QString::number(event->priority()))); + + mText.append(i18n("

%1 % completed

") + .arg(event->percentComplete())); + addTag("p",i18n("Access: ") +event->secrecyStr() ); + formatCategories(event); + if (!event->description().isEmpty()) { + addTag("p",i18n("Details: ")); + addTag("p",event->description()); + } + + + + formatReadOnly(event); + formatAttendees(event); + +} + +void KIncidenceFormatter::setJournal(Journal* ) +{ + +} + +void KIncidenceFormatter::formatCategories(Incidence *event) +{ + if (!event->categoriesStr().isEmpty()) { + addTag("p",i18n("Categories: ")+event->categoriesStr() ); + //mText.append(event->categoriesStr()); + } +} +void KIncidenceFormatter::addTag(const QString & tag,const QString & text) +{ + int number=text.contains("\n"); + QString str = "<" + tag + ">"; + QString tmpText=text; + QString tmpStr=str; + if(number !=-1) + { + if (number > 0) { + int pos=0; + QString tmp; + for(int i=0;i<=number;i++) { + pos=tmpText.find("\n"); + tmp=tmpText.left(pos); + tmpText=tmpText.right(tmpText.length()-pos-1); + tmpStr+=tmp+"
"; + } + } + else tmpStr += tmpText; + tmpStr+=""; + mText.append(tmpStr); + } + else + { + str += text + ""; + mText.append(str); + } +} + +void KIncidenceFormatter::formatAttendees(Incidence *event) +{ + QPtrList attendees = event->attendees(); + if (attendees.count()) { + QString iconPath = KGlobal::iconLoader()->iconPath("mailappt",KIcon::Small); + addTag("h3",i18n("Organizer")); + mText.append("
  • "); +#ifndef KORG_NOKABC + + KABC::AddressBook *add_book = KABC::StdAddressBook::self(); + KABC::Addressee::List addressList; + addressList = add_book->findByEmail(event->organizer()); + KABC::Addressee o = addressList.first(); + if (!o.isEmpty() && addressList.size()<2) { + mText += ""; + mText += o.formattedName(); + mText += "\n"; + } else { + mText.append(event->organizer()); + } +#else + mText.append(event->organizer()); +#endif + if (iconPath) { + mText += " organizer() + "\">"; + mText += ""; + mText += "\n"; + } + mText.append("
"); + + addTag("h3",i18n("Attendees")); + Attendee *a; + mText.append(""); + } +} + +void KIncidenceFormatter::formatReadOnly(Incidence *event) +{ + if (event->isReadOnly()) { + addTag("p","(" + i18n("read-only") + ")"); + } +} diff --git a/libkdepim/kincidenceformatter.h b/libkdepim/kincidenceformatter.h new file mode 100644 index 0000000..8fe259a --- a/dev/null +++ b/libkdepim/kincidenceformatter.h @@ -0,0 +1,42 @@ +#ifndef KINCIDENCENFORMATTER_H +#define KINCIDENCENFORMATTER_H + +#include +#include + +#include "libkcal/incidence.h" +#include "libkcal/event.h" +#include "libkcal/todo.h" +#include "libkcal/journal.h" + +using namespace KCal; + +class KIncidenceFormatter : public QObject +{ + public: + static KIncidenceFormatter* instance(); + KIncidenceFormatter(); + ~KIncidenceFormatter(); + QString getFormattedText( Incidence * inc ); + + void setEvent(Event *event); + void setTodo(Todo *event ); + void setJournal(Journal* ); + + protected: + int mColorMode; + void addTag(const QString & tag,const QString & text); + + void formatCategories(Incidence *event); + void formatAttendees(Incidence *event); + void formatReadOnly(Incidence *event); + + private: + bool mSyncMode; + + QString mText; + Incidence* mCurrentIncidence; + static KIncidenceFormatter* mInstance; +}; + +#endif diff --git a/libkdepim/kinputdialog.cpp b/libkdepim/kinputdialog.cpp new file mode 100644 index 0000000..0c31ca9 --- a/dev/null +++ b/libkdepim/kinputdialog.cpp @@ -0,0 +1,14 @@ +#include "kinputdialog.h" + +#include + +QString KInputDialog::getItem( const QString &caption, const QString &label, + const QStringList &items, int current, + bool editable ) +{ +#ifndef QT_NO_INPUTDIALOG + return QInputDialog::getItem( caption, label, items, current, editable ); +#else + return QString::null; +#endif +} diff --git a/libkdepim/kinputdialog.h b/libkdepim/kinputdialog.h new file mode 100644 index 0000000..0072391 --- a/dev/null +++ b/libkdepim/kinputdialog.h @@ -0,0 +1,15 @@ +#ifndef KINPUTDIALOG_H +#define KINPUTDIALOG_H + +#include +#include + +class KInputDialog +{ + public: + static QString getItem( const QString &caption, const QString &label, + const QStringList &items, int current, + bool editable ); +}; + +#endif diff --git a/libkdepim/kpimprefs.cpp b/libkdepim/kpimprefs.cpp new file mode 100644 index 0000000..ce4c540 --- a/dev/null +++ b/libkdepim/kpimprefs.cpp @@ -0,0 +1,59 @@ +/* + This file is part of libkdepim. + Copyright (c) 2002 Cornelius Schumacher + + 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ + +#include +#include +#include +#include + +#include "kpimprefs.h" + +KPimPrefs::KPimPrefs( const QString &name ) : + KPrefs( name ) +{ +} + +KPimPrefs::~KPimPrefs() +{ +} + +void KPimPrefs::usrSetDefaults() +{ + setCategoryDefaults(); +} + +void KPimPrefs::usrReadConfig() +{ + kdDebug(5300) << "KPimPrefs::usrReadConfig()" << endl; + + config()->setGroup("General"); + mCustomCategories = config()->readListEntry("Custom Categories"); + if (mCustomCategories.isEmpty()) setCategoryDefaults(); +} + + +void KPimPrefs::usrWriteConfig() +{ + config()->setGroup("General"); + config()->writeEntry("Custom Categories",mCustomCategories); +} diff --git a/libkdepim/kpimprefs.h b/libkdepim/kpimprefs.h new file mode 100644 index 0000000..05a564c --- a/dev/null +++ b/libkdepim/kpimprefs.h @@ -0,0 +1,53 @@ +/* + This file is part of libkdepim. + Copyright (c) 2002 Cornelius Schumacher + + 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ +#ifndef KPIMPREFS_H +#define KPIMPREFS_H + +#include + +#include "kprefs.h" + +class KPimPrefs : public KPrefs +{ + public: + KPimPrefs( const QString &name = QString::null ); + + virtual ~KPimPrefs(); + + /** Set preferences to default values */ + void usrSetDefaults(); + + /** Read preferences from config file */ + void usrReadConfig(); + + /** Write preferences to config file */ + void usrWriteConfig(); + + public: + QStringList mCustomCategories; + + protected: + virtual void setCategoryDefaults() = 0; +}; + +#endif diff --git a/libkdepim/kprefs.cpp b/libkdepim/kprefs.cpp new file mode 100644 index 0000000..f5e5e5a --- a/dev/null +++ b/libkdepim/kprefs.cpp @@ -0,0 +1,463 @@ +/* + This file is part of KOrganizer. + Copyright (c) 2000,2001 Cornelius Schumacher + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +// $Id$ + +#include + +#include +#include +#include +#include + +#include "kprefs.h" + +class KPrefsItemBool : public KPrefsItem { + public: + KPrefsItemBool(const QString &group,const QString &name,bool *,bool defaultValue=true); + virtual ~KPrefsItemBool() {} + + void setDefault(); + void readConfig(KConfig *); + void writeConfig(KConfig *); + + private: + bool *mReference; + bool mDefault; +}; + +class KPrefsItemInt : public KPrefsItem { + public: + KPrefsItemInt(const QString &group,const QString &name,int *,int defaultValue=0); + virtual ~KPrefsItemInt() {} + + void setDefault(); + void readConfig(KConfig *); + void writeConfig(KConfig *); + + private: + int *mReference; + int mDefault; +}; + + +class KPrefsItemColor : public KPrefsItem { + public: + KPrefsItemColor(const QString &group,const QString &name,QColor *, + const QColor &defaultValue=QColor(128,128,128)); + virtual ~KPrefsItemColor() {} + + void setDefault(); + void readConfig(KConfig *); + void writeConfig(KConfig *); + + private: + QColor *mReference; + QColor mDefault; +}; + + +class KPrefsItemFont : public KPrefsItem { + public: + KPrefsItemFont(const QString &group,const QString &name,QFont *, + const QFont &defaultValue=QFont("helvetica",12)); + virtual ~KPrefsItemFont() {} + + void setDefault(); + void readConfig(KConfig *); + void writeConfig(KConfig *); + + private: + QFont *mReference; + QFont mDefault; +}; + + +class KPrefsItemString : public KPrefsItem { + public: + KPrefsItemString(const QString &group,const QString &name,QString *, + const QString &defaultValue="", bool isPassword=false); + virtual ~KPrefsItemString() {} + + void setDefault(); + void readConfig(KConfig *); + void writeConfig(KConfig *); + + private: + QString *mReference; + QString mDefault; + bool mPassword; +}; + + +class KPrefsItemStringList : public KPrefsItem { + public: + KPrefsItemStringList(const QString &group,const QString &name,QStringList *, + const QStringList &defaultValue=QStringList()); + virtual ~KPrefsItemStringList() {} + + void setDefault(); + void readConfig(KConfig *); + void writeConfig(KConfig *); + + private: + QStringList *mReference; + QStringList mDefault; +}; + + +class KPrefsItemIntList : public KPrefsItem { + public: + KPrefsItemIntList(const QString &group,const QString &name,QValueList *, + const QValueList &defaultValue=QValueList()); + virtual ~KPrefsItemIntList() {} + + void setDefault(); + void readConfig(KConfig *); + void writeConfig(KConfig *); + + private: + QValueList *mReference; + QValueList mDefault; +}; + + +KPrefsItemBool::KPrefsItemBool(const QString &group,const QString &name, + bool *reference,bool defaultValue) : + KPrefsItem(group,name) +{ + mReference = reference; + mDefault = defaultValue; +} + +void KPrefsItemBool::setDefault() +{ + *mReference = mDefault; +} + +void KPrefsItemBool::writeConfig(KConfig *config) +{ + config->setGroup(mGroup); + config->writeEntry(mName,*mReference); +} + + +void KPrefsItemBool::readConfig(KConfig *config) +{ + config->setGroup(mGroup); + *mReference = config->readBoolEntry(mName,mDefault); +} + + +KPrefsItemInt::KPrefsItemInt(const QString &group,const QString &name, + int *reference,int defaultValue) : + KPrefsItem(group,name) +{ + mReference = reference; + mDefault = defaultValue; +} + +void KPrefsItemInt::setDefault() +{ + *mReference = mDefault; +} + +void KPrefsItemInt::writeConfig(KConfig *config) +{ + config->setGroup(mGroup); + config->writeEntry(mName,*mReference); +} + +void KPrefsItemInt::readConfig(KConfig *config) +{ + config->setGroup(mGroup); + *mReference = config->readNumEntry(mName,mDefault); +} + + +KPrefsItemColor::KPrefsItemColor(const QString &group,const QString &name, + QColor *reference,const QColor &defaultValue) : + KPrefsItem(group,name) +{ + mReference = reference; + mDefault = defaultValue; +} + +void KPrefsItemColor::setDefault() +{ + *mReference = mDefault; +} + +void KPrefsItemColor::writeConfig(KConfig *config) +{ + config->setGroup(mGroup); + config->writeEntry(mName,*mReference); +} + +void KPrefsItemColor::readConfig(KConfig *config) +{ + config->setGroup(mGroup); + *mReference = config->readColorEntry(mName,&mDefault); + +} + + +KPrefsItemFont::KPrefsItemFont(const QString &group,const QString &name, + QFont *reference,const QFont &defaultValue) : + KPrefsItem(group,name) +{ + mReference = reference; + mDefault = defaultValue; +} + +void KPrefsItemFont::setDefault() +{ + *mReference = mDefault; +} + +void KPrefsItemFont::writeConfig(KConfig *config) +{ + config->setGroup(mGroup); + config->writeEntry(mName,*mReference); +} + +void KPrefsItemFont::readConfig(KConfig *config) +{ + config->setGroup(mGroup); + *mReference = config->readFontEntry(mName,&mDefault); +} + + +QString endecryptStr( const QString &aStr ) +{ + QString result; + uint i; + for ( i = 0; i < aStr.length(); i++) + result += (aStr.at(i).unicode() < 0x20) ? + aStr.at(i) : + QChar(0x1001F - aStr.at(i).unicode()); + return result; +} + + +KPrefsItemString::KPrefsItemString(const QString &group,const QString &name, + QString *reference,const QString &defaultValue, + bool isPassword) : + KPrefsItem(group,name) +{ + mReference = reference; + mDefault = defaultValue; + mPassword = isPassword; +} + +void KPrefsItemString::setDefault() +{ + *mReference = mDefault; +} + +void KPrefsItemString::writeConfig(KConfig *config) +{ + config->setGroup(mGroup); + if ( mPassword ) + config->writeEntry(mName, endecryptStr( *mReference ) ); + else + config->writeEntry(mName,*mReference); +} + +void KPrefsItemString::readConfig(KConfig *config) +{ + config->setGroup(mGroup); + + QString value; + if ( mPassword ) { + value = config->readEntry( mName, endecryptStr( mDefault ) ); + *mReference = endecryptStr( value ); + } else { + *mReference = config->readEntry( mName, mDefault ); + } +} + + +KPrefsItemStringList::KPrefsItemStringList(const QString &group,const QString &name, + QStringList *reference,const QStringList &defaultValue) : + KPrefsItem(group,name) +{ + mReference = reference; + mDefault = defaultValue; +} + +void KPrefsItemStringList::setDefault() +{ + *mReference = mDefault; +} + +void KPrefsItemStringList::writeConfig(KConfig *config) +{ + config->setGroup(mGroup); + config->writeEntry(mName,*mReference); +} + +void KPrefsItemStringList::readConfig(KConfig *config) +{ + config->setGroup(mGroup); + *mReference = config->readListEntry(mName); +} + + +KPrefsItemIntList::KPrefsItemIntList(const QString &group,const QString &name, + QValueList *reference,const QValueList &defaultValue) : + KPrefsItem(group,name) +{ + mReference = reference; + mDefault = defaultValue; +} + +void KPrefsItemIntList::setDefault() +{ + *mReference = mDefault; +} + +void KPrefsItemIntList::writeConfig(KConfig *config) +{ + config->setGroup(mGroup); + config->writeEntry(mName,*mReference); +} + +void KPrefsItemIntList::readConfig(KConfig *config) +{ + config->setGroup(mGroup); + *mReference = config->readIntListEntry(mName); +} + + +QString *KPrefs::mCurrentGroup = 0; + +KPrefs::KPrefs(const QString &configname) +{ + if (!configname.isEmpty()) { + //qDebug("KPrefs::KPrefs %s",configname.latin1() ); + mConfig = new KConfig(locateLocal("config",configname)); + } else { + mConfig = KGlobal::config(); + } + + mItems.setAutoDelete(true); + + // Set default group + if (mCurrentGroup == 0) mCurrentGroup = new QString("No Group"); +} + +KPrefs::~KPrefs() +{ + if (mConfig != KGlobal::config()) { + delete mConfig; + } +} + +void KPrefs::setCurrentGroup(const QString &group) +{ + if (mCurrentGroup) delete mCurrentGroup; + mCurrentGroup = new QString(group); +} + +KConfig *KPrefs::config() const +{ + return mConfig; +} + +void KPrefs::setDefaults() +{ + KPrefsItem *item; + for(item = mItems.first();item;item = mItems.next()) { + item->setDefault(); + } + + usrSetDefaults(); +} + +void KPrefs::readConfig() +{ + KPrefsItem *item; + for(item = mItems.first();item;item = mItems.next()) { + item->readConfig(mConfig); + } + + usrReadConfig(); +} + +void KPrefs::writeConfig() +{ + KPrefsItem *item; + for(item = mItems.first();item;item = mItems.next()) { + item->writeConfig(mConfig); + } + + usrWriteConfig(); + + mConfig->sync(); +} + + +void KPrefs::addItem(KPrefsItem *item) +{ + mItems.append(item); +} + +void KPrefs::addItemBool(const QString &key,bool *reference,bool defaultValue) +{ + addItem(new KPrefsItemBool(*mCurrentGroup,key,reference,defaultValue)); +} + +void KPrefs::addItemInt(const QString &key,int *reference,int defaultValue) +{ + addItem(new KPrefsItemInt(*mCurrentGroup,key,reference,defaultValue)); +} + +void KPrefs::addItemColor(const QString &key,QColor *reference,const QColor &defaultValue) +{ + addItem(new KPrefsItemColor(*mCurrentGroup,key,reference,defaultValue)); +} + +void KPrefs::addItemFont(const QString &key,QFont *reference,const QFont &defaultValue) +{ + addItem(new KPrefsItemFont(*mCurrentGroup,key,reference,defaultValue)); +} + +void KPrefs::addItemString(const QString &key,QString *reference,const QString &defaultValue) +{ + addItem(new KPrefsItemString(*mCurrentGroup,key,reference,defaultValue,false)); +} + +void KPrefs::addItemPassword(const QString &key,QString *reference,const QString &defaultValue) +{ + addItem(new KPrefsItemString(*mCurrentGroup,key,reference,defaultValue,true)); +} + +void KPrefs::addItemStringList(const QString &key,QStringList *reference, + const QStringList &defaultValue) +{ + addItem(new KPrefsItemStringList(*mCurrentGroup,key,reference,defaultValue)); +} + +void KPrefs::addItemIntList(const QString &key,QValueList *reference, + const QValueList &defaultValue) +{ + addItem(new KPrefsItemIntList(*mCurrentGroup,key,reference,defaultValue)); +} diff --git a/libkdepim/kprefs.h b/libkdepim/kprefs.h new file mode 100644 index 0000000..7014bb8 --- a/dev/null +++ b/libkdepim/kprefs.h @@ -0,0 +1,301 @@ +/* + This file is part of KOrganizer. + Copyright (c) 2001 Cornelius Schumacher + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ +#ifndef _KPREFS_H +#define _KPREFS_H +// $Id$ + +#include +#include +#include +#include + +class KConfig; + +/** + @short Class for storing a preferences setting + @author Cornelius Schumacher + @see KPref + + This class represents one preferences setting as used by @ref KPrefs. + Subclasses of KPrefsItem implement storage functions for a certain type of + setting. Normally you don't have to use this class directly. Use the special + addItem() functions of KPrefs instead. If you subclass this class you will + have to register instances with the function KPrefs::addItem(). +*/ +class KPrefsItem { + public: + /** + Constructor. + + @param group Config file group. + @param name Config file key. + */ + KPrefsItem(const QString &group,const QString &name) : + mGroup(group),mName(name) {} + /** + Destructor. + */ + virtual ~KPrefsItem() {} + + /** + This function is called by @ref KPrefs to set this setting to its default + value. + */ + virtual void setDefault() = 0; + /** + This function is called by @ref KPrefs to read the value for this setting + from a config file. + value. + */ + virtual void readConfig(KConfig *) = 0; + /** + This function is called by @ref KPrefs to write the value of this setting + to a config file. + */ + virtual void writeConfig(KConfig *) = 0; + + protected: + QString mGroup; + QString mName; +}; + +/** + @short Class for handling preferences settings for an application. + @author Cornelius Schumacher + @see KPrefsItem + + This class provides an interface to preferences settings. Preferences items + can be registered by the addItem() function corresponding to the data type of + the seetting. KPrefs then handles reading and writing of config files and + setting of default values. + + Normally you will subclass KPrefs, add data members for the preferences + settings and register the members in the constructor of the subclass. + + Example: +
+  class MyPrefs : public KPrefs {
+    public:
+      MyPrefs()
+      {
+        setCurrentGroup("MyGroup");
+        addItemBool("MySetting1",&mMyBool,false);
+        addItemColor("MySetting2",&mMyColor,QColor(1,2,3));
+        
+        setCurrentGroup("MyOtherGroup");
+        addItemFont("MySetting3",&mMyFont,QFont("helvetica",12));
+      }
+      
+      bool mMyBool;
+      QColor mMyColor;
+      QFont mMyFont;
+  }
+  
+ + It might be convenient in many cases to make this subclass of KPrefs a + singleton for global access from all over the application without passing + references to the KPrefs object around. + + You can set all values to default values by calling @ref setDefaults(), write + the data to the configuration file by calling @ref writeConfig() and read the + data from the configuration file by calling @ref readConfig(). + + If you have items, which are not covered by the existing addItem() functions + you can add customized code for reading, writing and default setting by + implementing the functions @ref usrSetDefaults(), @ref usrReadConfig() and + @ref usrWriteConfig(). + + Internally preferences settings are stored in instances of subclasses of + @ref KPrefsItem. You can also add KPrefsItem subclasses for your own types + and call the generic @ref addItem() to register them. +*/ + +class KPrefs { + public: + /** + Constructor. + + @param configname name of config file. If no name is given, the default + config file as returned by kapp()->config() is used. + */ + KPrefs(const QString &configname=QString::null); + /** + Destructor + */ + virtual ~KPrefs(); + + /** + Set preferences to default values. All registered items are set to their + default values. + */ + void setDefaults(); + + /** + Read preferences from config file. All registered items are set to the + values read from disk. + */ + void readConfig(); + + /** + Write preferences to config file. The values of all registered items are + written to disk. + */ + void writeConfig(); + + /** + Set the config file group for subsequent addItem() calls. It is valid + until setCurrentGroup() is called with a new argument. Call this before + you add any items. The default value is "No Group". + */ + static void setCurrentGroup(const QString &group); + + /** + Register a custom @ref KPrefsItem. + */ + void addItem(KPrefsItem *); + + /** + Register an item of type bool. + + @param key Key used in config file. + @param reference Pointer to the variable, which is set by readConfig() + and setDefaults() calls and read by writeConfig() calls. + @param defaultValue Default value, which is used by setDefaults() and + when the config file does not yet contain the key of + this item. + */ + void addItemBool(const QString &key,bool *reference, + bool defaultValue=false); + /** + Register an item of type int. + + @param key Key used in config file. + @param reference Pointer to the variable, which is set by readConfig() + and setDefaults() calls and read by writeConfig() calls. + @param defaultValue Default value, which is used by setDefaults() and + when the config file does not yet contain the key of + this item. + */ + void addItemInt(const QString &key,int *reference, + int defaultValue=0); + /** + Register an item of type QColor. + + @param key Key used in config file. + @param reference Pointer to the variable, which is set by readConfig() + and setDefaults() calls and read by writeConfig() calls. + @param defaultValue Default value, which is used by setDefaults() and + when the config file does not yet contain the key of + this item. + */ + void addItemColor(const QString &key,QColor *reference, + const QColor &defaultValue=QColor(128,128,128)); + /** + Register an item of type QFont. + + @param key Key used in config file. + @param reference Pointer to the variable, which is set by readConfig() + and setDefaults() calls and read by writeConfig() calls. + @param defaultValue Default value, which is used by setDefaults() and + when the config file does not yet contain the key of + this item. + */ + void addItemFont(const QString &key,QFont *reference, + const QFont &defaultValue=QFont("helvetica",12)); + /** + Register an item of type QString. + + @param key Key used in config file. + @param reference Pointer to the variable, which is set by readConfig() + and setDefaults() calls and read by writeConfig() calls. + @param defaultValue Default value, which is used by setDefaults() and + when the config file does not yet contain the key of + this item. + */ + void addItemString(const QString &key,QString *reference, + const QString &defaultValue=""); + /** + Register a password item of type QString. The string value is written + encrypted to the config file. Note that the current encryption scheme + is very weak. + + @param key Key used in config file. + @param reference Pointer to the variable, which is set by readConfig() + and setDefaults() calls and read by writeConfig() calls. + @param defaultValue Default value, which is used by setDefaults() and + when the config file does not yet contain the key of + this item. + */ + void addItemPassword(const QString &key,QString *reference, + const QString &defaultValue=""); + /** + Register an item of type QStringList. + + @param key Key used in config file. + @param reference Pointer to the variable, which is set by readConfig() + and setDefaults() calls and read by writeConfig() calls. + @param defaultValue Default value, which is used by setDefaults() and + when the config file does not yet contain the key of + this item. + */ + void addItemStringList(const QString &key,QStringList *reference, + const QStringList &defaultValue=QStringList()); + + /** + Register an item of type QValueList. + + @param key Key used in config file. + @param reference Pointer to the variable, which is set by readConfig() + and setDefaults() calls and read by writeConfig() calls. + @param defaultValue Default value, which is used by setDefaults() and + when the config file does not yet contain the key of + this item. + */ + void addItemIntList(const QString &key,QValueList *reference, + const QValueList &defaultValue=QValueList()); + + protected: + /** + Implemented by subclasses that use special defaults. + */ + virtual void usrSetDefaults() {}; + /** + Implemented by subclasses that read special config values. + */ + virtual void usrReadConfig() {}; + /** + Implemented by subclasses that write special config values. + */ + virtual void usrWriteConfig() {}; + + /** + Return the @ref KConfig object used for reading and writing the settings. + */ + KConfig *config() const; + + private: + static QString *mCurrentGroup; + + KConfig *mConfig; // pointer to KConfig object + + QPtrList mItems; +}; + +#endif diff --git a/libkdepim/kprefsdialog.cpp b/libkdepim/kprefsdialog.cpp new file mode 100644 index 0000000..3a39ea9 --- a/dev/null +++ b/libkdepim/kprefsdialog.cpp @@ -0,0 +1,410 @@ +/* + This file is part of KOrganizer. + Copyright (c) 2001 Cornelius Schumacher + + 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ + +// $Id$ + +#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 +#include +#include + +#include "kprefs.h" + +#include "kprefsdialog.h" +#include "kprefsdialog.moc" + +KPrefsWidBool::KPrefsWidBool(const QString &text,bool *reference, + QWidget *parent) +{ + mReference = reference; + + mCheck = new QCheckBox(text,parent); +} + +void KPrefsWidBool::readConfig() +{ + mCheck->setChecked(*mReference); +} + +void KPrefsWidBool::writeConfig() +{ + *mReference = mCheck->isChecked(); +} + +QCheckBox *KPrefsWidBool::checkBox() +{ + return mCheck; +} + + +KPrefsWidColor::KPrefsWidColor(const QString &text,QColor *reference, + QWidget *parent) +{ + mReference = reference; + + mButton = new KColorButton(parent); + mLabel = new QLabel(mButton, text, parent); + mButton->setColor( *mReference ); + mButton->setColor( Qt::red ); + +} + +KPrefsWidColor::~KPrefsWidColor() +{ +// kdDebug(5300) << "KPrefsWidColor::~KPrefsWidColor()" << endl; +} + +void KPrefsWidColor::readConfig() +{ + mButton->setColor(*mReference); +} + +void KPrefsWidColor::writeConfig() +{ + *mReference = mButton->color(); +} + +QLabel *KPrefsWidColor::label() +{ + return mLabel; +} + +KColorButton *KPrefsWidColor::button() +{ + return mButton; +} + +KPrefsWidFont::KPrefsWidFont(const QString &sampleText,const QString &labelText, + QFont *reference,QWidget *parent) +{ + mReference = reference; + + mLabel = new QLabel(labelText, parent); + + mPreview = new QLabel(sampleText,parent); + mPreview->setFrameStyle(QFrame::Panel|QFrame::Sunken); + + mButton = new QPushButton(i18n("Choose..."), parent); + connect(mButton,SIGNAL(clicked()),SLOT(selectFont())); + mPreview->setMaximumHeight( QApplication::desktop()->height() / 12 ); + mPreview->setMaximumWidth( (QApplication::desktop()->width() / 2)-10 ); +} + +KPrefsWidFont::~KPrefsWidFont() +{ +} + +void KPrefsWidFont::readConfig() +{ + mPreview->setFont(*mReference); +} + +void KPrefsWidFont::writeConfig() +{ + *mReference = mPreview->font(); +} + +QLabel *KPrefsWidFont::label() +{ + return mLabel; +} + +QLabel *KPrefsWidFont::preview() +{ + return mPreview; +} + +QPushButton *KPrefsWidFont::button() +{ + return mButton; +} + +void KPrefsWidFont::selectFont() +{ + QFont myFont(mPreview->font()); + bool ok; + myFont = KFontDialog::getFont(myFont, ok); + if ( ok ) { + mPreview->setFont(myFont); + } +} + + +KPrefsWidTime::KPrefsWidTime(const QString &text,int *reference, + QWidget *parent) +{ + mReference = reference; + + mLabel = new QLabel(text,parent); + mSpin = new QSpinBox(0,23,1,parent); + mSpin->setSuffix(":00"); +} + +void KPrefsWidTime::readConfig() +{ + mSpin->setValue(*mReference); +} + +void KPrefsWidTime::writeConfig() +{ + *mReference = mSpin->value(); +} + +QLabel *KPrefsWidTime::label() +{ + return mLabel; +} + +QSpinBox *KPrefsWidTime::spinBox() +{ + return mSpin; +} + + +KPrefsWidRadios::KPrefsWidRadios(const QString &text,int *reference, + QWidget *parent) +{ + mReference = reference; + + mBox = new QButtonGroup(1,Qt::Horizontal,text,parent); +} + +KPrefsWidRadios::~KPrefsWidRadios() +{ +} + +void KPrefsWidRadios::addRadio(const QString &text) +{ + new QRadioButton(text,mBox); +} + +QButtonGroup *KPrefsWidRadios::groupBox() +{ + return mBox; +} + +void KPrefsWidRadios::readConfig() +{ + mBox->setButton(*mReference); +} + +void KPrefsWidRadios::writeConfig() +{ + *mReference = mBox->id(mBox->selected()); +} + + +KPrefsWidString::KPrefsWidString(const QString &text,QString *reference, + QWidget *parent, QLineEdit::EchoMode echomode) +{ + mReference = reference; + + mLabel = new QLabel(text,parent); + mEdit = new QLineEdit(parent); + mEdit->setEchoMode( echomode ); +} + +KPrefsWidString::~KPrefsWidString() +{ +} + +void KPrefsWidString::readConfig() +{ + mEdit->setText(*mReference); +} + +void KPrefsWidString::writeConfig() +{ + *mReference = mEdit->text(); +} + +QLabel *KPrefsWidString::label() +{ + return mLabel; +} + +QLineEdit *KPrefsWidString::lineEdit() +{ + return mEdit; +} + + +KPrefsDialog::KPrefsDialog(KPrefs *prefs,QWidget *parent,char *name,bool modal) : + KDialogBase(IconList,i18n("Preferences"),Ok|Cancel|Default,Ok,parent, + name,modal,true) +{ + mPrefs = prefs; + +// This seems to cause a crash on exit. Investigate later. +// mPrefsWids.setAutoDelete(true); + + connect(this,SIGNAL(defaultClicked()),SLOT(slotDefault())); + //connect(this,SIGNAL(cancelClicked()),SLOT(slotDefault())); + //connect(this,SIGNAL(cancelClicked()),SLOT(reject())); +} + +KPrefsDialog::~KPrefsDialog() +{ +} + +void KPrefsDialog::addWid(KPrefsWid *wid) +{ + mPrefsWids.append(wid); +} + +KPrefsWidBool *KPrefsDialog::addWidBool(const QString &text,bool *reference,QWidget *parent) +{ + KPrefsWidBool *w = new KPrefsWidBool(text,reference,parent); + addWid(w); + return w; +} + +KPrefsWidTime *KPrefsDialog::addWidTime(const QString &text,int *reference,QWidget *parent) +{ + KPrefsWidTime *w = new KPrefsWidTime(text,reference,parent); + addWid(w); + return w; +} + +KPrefsWidColor *KPrefsDialog::addWidColor(const QString &text,QColor *reference,QWidget *parent) +{ + KPrefsWidColor *w = new KPrefsWidColor(text,reference,parent); + addWid(w); + return w; +} + +KPrefsWidRadios *KPrefsDialog::addWidRadios(const QString &text,int *reference,QWidget *parent) +{ + KPrefsWidRadios *w = new KPrefsWidRadios(text,reference,parent); + addWid(w); + return w; +} + +KPrefsWidString *KPrefsDialog::addWidString(const QString &text,QString *reference,QWidget *parent) +{ + KPrefsWidString *w = new KPrefsWidString(text,reference,parent); + addWid(w); + return w; +} + +KPrefsWidString *KPrefsDialog::addWidPassword(const QString &text,QString *reference,QWidget *parent) +{ + KPrefsWidString *w = new KPrefsWidString(text,reference,parent,QLineEdit::Password); + addWid(w); + return w; +} + +KPrefsWidFont *KPrefsDialog::addWidFont(const QString &sampleText,const QString &buttonText, + QFont *reference,QWidget *parent) +{ + KPrefsWidFont *w = new KPrefsWidFont(sampleText,buttonText,reference,parent); + addWid(w); + return w; +} + +void KPrefsDialog::setDefaults() +{ + mPrefs->setDefaults(); + + readConfig(); +} + +void KPrefsDialog::readConfig() +{ +// kdDebug(5300) << "KPrefsDialog::readConfig()" << endl; + + KPrefsWid *wid; + for(wid = mPrefsWids.first();wid;wid=mPrefsWids.next()) { + wid->readConfig(); + } + + usrReadConfig(); +} + +void KPrefsDialog::writeConfig() +{ +// kdDebug(5300) << "KPrefsDialog::writeConfig()" << endl; + + KPrefsWid *wid; + for(wid = mPrefsWids.first();wid;wid=mPrefsWids.next()) { + wid->writeConfig(); + } + + usrWriteConfig(); + +// kdDebug(5300) << "KPrefsDialog::writeConfig() now writing..." << endl; + + mPrefs->writeConfig(); + +// kdDebug(5300) << "KPrefsDialog::writeConfig() done" << endl; +} + + +void KPrefsDialog::slotApply() +{ + writeConfig(); + emit configChanged(); +} + +void KPrefsDialog::slotOk() +{ + slotApply(); + QDialog::accept(); +} +void KPrefsDialog::accept() +{ + slotOk(); +} + +void KPrefsDialog::slotDefault() +{ + if (KMessageBox::warningContinueCancel(this, + i18n("You are about to set all\npreferences to default values.\nAll " + "custom modifications will be lost."),i18n("Setting Default Preferences"), + i18n("Continue")) + == KMessageBox::Continue) setDefaults(); +} diff --git a/libkdepim/kprefsdialog.h b/libkdepim/kprefsdialog.h new file mode 100644 index 0000000..dceab01 --- a/dev/null +++ b/libkdepim/kprefsdialog.h @@ -0,0 +1,446 @@ +/* + This file is part of KOrganizer. + Copyright (c) 2001 Cornelius Schumacher + + 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ +#ifndef _KPREFSDIALOG_H +#define _KPREFSDIALOG_H +// $Id$ + +#include +#include + +#include + +class KPrefs; +class KPrefsDialog; + +class KColorButton; +class QCheckBox; +class QLabel; +class QSpinBox; +class QButtonGroup; + +/** + @short Base class for widgets used by @ref KPrefsDialog. + @author Cornelius Schumacher + @see KPrefsDialog + + This class provides the interface for the preferences widgets used by + KPrefsDialog. +*/ +class KPrefsWid +{ + public: + /** + This function is called to read value of the setting from the + stored configuration and display it in the widget. + */ + virtual void readConfig() = 0; + /** + This function is called to write the current setting of the widget to the + stored configuration. + */ + virtual void writeConfig() = 0; +}; + +/** + @short Widget for bool settings in @ref KPrefsDialog. + + This class provides a widget for configuring bool values. It is meant to be + used by KPrefsDialog. The user is responsible for the layout management. +*/ +class KPrefsWidBool : public KPrefsWid +{ + public: + /** + Create a bool widget consisting of a QCheckbox. + + @param text Text of QCheckBox. + @param reference Pointer to variable read and written by this widget. + @param parent Parent widget. + */ + KPrefsWidBool(const QString &text,bool *reference,QWidget *parent); + + /** + Return the QCheckbox used by this widget. + */ + QCheckBox *checkBox(); + + void readConfig(); + void writeConfig(); + + private: + bool *mReference; + + QCheckBox *mCheck; +}; + +/** + @short Widget for time settings in @ref KPrefsDialog. + + This class provides a widget for configuring time values. It is meant to be + used by KPrefsDialog. The user is responsible for the layout management. +*/ +class KPrefsWidTime : public KPrefsWid +{ + public: + /** + Create a time widget consisting of a label and a spinbox. + + @param text Text of Label. + @param reference Pointer to variable read and written by this widget. + @param parent Parent widget. + */ + KPrefsWidTime(const QString &text,int *reference,QWidget *parent); + + /** + Return QLabel used by this widget. + */ + QLabel *label(); + /** + Return QSpinBox used by this widget. + */ + QSpinBox *spinBox(); + + void readConfig(); + void writeConfig(); + + private: + int *mReference; + + QLabel *mLabel; + QSpinBox *mSpin; +}; + +/** + @short Widget for color settings in @ref KPrefsDialog. + + This class provides a widget for configuring color values. It is meant to be + used by KPrefsDialog. The user is responsible for the layout management. +*/ +class KPrefsWidColor : public QObject, public KPrefsWid +{ + Q_OBJECT + public: + /** + Create a color widget consisting of a test field and a button for opening + a color dialog. + + @param text Text of button. + @param reference Pointer to variable read and written by this widget. + @param parent Parent widget. + */ + KPrefsWidColor(const QString &text,QColor *reference,QWidget *parent); + /** + Destruct color setting widget. + */ + ~KPrefsWidColor(); + + /** + Return QLabel for the button + */ + QLabel *label(); + /** + Return button opening the color dialog. + */ + KColorButton *button(); + + void readConfig(); + void writeConfig(); + + private: + QColor *mReference; + + QLabel *mLabel; + KColorButton *mButton; +}; + +/** + @short Widget for font settings in @ref KPrefsDialog. + + This class provides a widget for configuring font values. It is meant to be + used by KPrefsDialog. The user is responsible for the layout management. +*/ +class KPrefsWidFont : public QObject, public KPrefsWid +{ + Q_OBJECT + public: + /** + Create a font widget consisting of a test field and a button for opening + a font dialog. + + @param label Text of label. + @param reference Pointer to variable read and written by this widget. + @param parent Parent widget. + */ + KPrefsWidFont(const QString &sampleText,const QString &labelText, + QFont *reference,QWidget *parent); + /** + Destruct font setting widget. + */ + ~KPrefsWidFont(); + + /** + Return label. + */ + QLabel *label(); + /** + Return QFrame used as preview field. + */ + QLabel *preview(); + /** + Return button opening the font dialog. + */ + QPushButton *button(); + + void readConfig(); + void writeConfig(); + + protected slots: + void selectFont(); + + private: + QFont *mReference; + + QLabel *mLabel; + QLabel *mPreview; + QPushButton *mButton; +}; + +/** + @short Widget for settings represented by a group of radio buttons in + @ref KPrefsDialog. + + This class provides a widget for configuring selections. It is meant to be + used by KPrefsDialog. The user is responsible for the layout management. The + setting is interpreted as an int value, corresponding to the position of the + radio button. The position of the button is defined by the sequence of @ref + addRadio() calls, starting with 0. +*/ +class KPrefsWidRadios : public KPrefsWid +{ + public: + /** + Create a widget for selection of an option. It consists of a box with + several radio buttons. + + @param text Text of main box. + @param reference Pointer to variable read and written by this widget. + @param parent Parent widget. + */ + KPrefsWidRadios(const QString &text,int *reference,QWidget *parent); + virtual ~KPrefsWidRadios(); + + /** + Add a radio button. + + @param text Text of the button. + */ + void addRadio(const QString &text); + + /** + Return the box widget used by this widget. + */ + QButtonGroup *groupBox(); + + void readConfig(); + void writeConfig(); + + private: + int *mReference; + + QButtonGroup *mBox; +}; + + +/** + @short Widget for string settings in @ref KPrefsDialog. + + This class provides a widget for configuring string values. It is meant to be + used by KPrefsDialog. The user is responsible for the layout management. +*/ +class KPrefsWidString : public KPrefsWid +{ + public: + /** + Create a string widget consisting of a test label and a line edit. + + @param text Text of label. + @param reference Pointer to variable read and written by this widget. + @param parent Parent widget. + */ + KPrefsWidString(const QString &text,QString *reference,QWidget *parent,QLineEdit::EchoMode echomode=QLineEdit::Normal); + /** + Destructor. + */ + virtual ~KPrefsWidString(); + + /** + Return label used by this widget. + */ + QLabel *label(); + /** + Return QLineEdit used by this widget. + */ + QLineEdit *lineEdit(); + + void readConfig(); + void writeConfig(); + + private: + QString *mReference; + + QLabel *mLabel; + QLineEdit *mEdit; +}; + + +/** + @short Base class for a preferences dialog. + + This class provides the framework for a preferences dialog. You have to + subclass it and add the code to create the actual configuration widgets and + do the layout management. + + KPrefsDialog provides functions to add subclasses of @ref KPrefsWid. For + these widgets the reading, writing and setting to default values is handled + automatically. Custom widgets have to be handled in the functions @ref + usrReadConfig() and @ref usrWriteConfig(). +*/ +class KPrefsDialog : public KDialogBase +{ + Q_OBJECT + public: + /** + Create a KPrefsDialog for a KPrefs object. + + @param prefs KPrefs object used to access te configuration. + @param parent Parent widget. + @param name Widget name. + @param modal true, if dialog has to be modal, false for non-modal. + */ + KPrefsDialog(KPrefs *prefs,QWidget *parent=0,char *name=0,bool modal=false); + /** + Destructor. + */ + virtual ~KPrefsDialog(); + + /** + Register a custom KPrefsWid object. + */ + void addWid(KPrefsWid *); + /** + Register a @ref KPrefsWidBool object. + + @param text Text of bool widget. + @param reference Reference to variable storing the setting. + @param parent Parent widget. + */ + KPrefsWidBool *addWidBool(const QString &text,bool *reference,QWidget *parent); + /** + Register a @ref KPrefsWidTime object. + + @param text Text of time widget. + @param reference Reference to variable storing the setting. + @param parent Parent widget. + */ + KPrefsWidTime *addWidTime(const QString &text,int *reference,QWidget *parent); + /** + Register a @ref KPrefsWidColor object. + + @param text Text of color widget. + @param reference Reference to variable storing the setting. + @param parent Parent widget. + */ + KPrefsWidColor *addWidColor(const QString &text,QColor *reference,QWidget *parent); + /** + Register a @ref KPrefsWidRadios object. + + @param text Text of radio button box widget. + @param reference Reference to variable storing the setting. + @param parent Parent widget. + */ + KPrefsWidRadios *addWidRadios(const QString &text,int *reference,QWidget *parent); + /** + Register a @ref KPrefsWidString object. + + @param text Text of string widget. + @param reference Reference to variable storing the setting. + @param parent Parent widget. + */ + KPrefsWidString *addWidString(const QString &text,QString *reference,QWidget *parent); + /** + Register a password @ref KPrefsWidString object, with echomode set to QLineEdit::Password. + + @param text Text of string widget. + @param reference Reference to variable storing the setting. + @param parent Parent widget. + */ + KPrefsWidString *addWidPassword (const QString &text,QString *reference,QWidget *parent); + /** + Register a @ref KPrefsWidFont object. + + @param sampleText Sample text of font widget. + @param buttonText Button text of font widget. + @param reference Reference to variable storing the setting. + @param parent Parent widget. + */ + KPrefsWidFont *addWidFont(const QString &sampleText,const QString &buttonText, + QFont *reference,QWidget *parent); + + public slots: + /** Set all widgets to default values. */ + void setDefaults(); + + /** Read preferences from config file. */ + void readConfig(); + + /** Write preferences to config file. */ + void writeConfig(); + + signals: + /** Emitted when the a changed configuration has been stored. */ + void configChanged(); + + protected slots: + /** Apply changes to preferences */ + void slotApply(); + + void accept(); + /** Accept changes to preferences and close dialog */ + void slotOk(); + + /** Set preferences to default values */ + void slotDefault(); + + protected: + /** Implement this to read custom configuration widgets. */ + virtual void usrReadConfig() {} + /** Implement this to write custom configuration widgets. */ + virtual void usrWriteConfig() {} + + private: + KPrefs *mPrefs; + + QPtrList mPrefsWids; +}; + +#endif diff --git a/libkdepim/kprefsdialog.moc b/libkdepim/kprefsdialog.moc new file mode 100644 index 0000000..e69de29 --- a/dev/null +++ b/libkdepim/kprefsdialog.moc diff --git a/libkdepim/ksyncprofile.cpp b/libkdepim/ksyncprofile.cpp new file mode 100644 index 0000000..d6d8fa3 --- a/dev/null +++ b/libkdepim/ksyncprofile.cpp @@ -0,0 +1,125 @@ +/* + This file is part of KOrganizer. + Copyright (c) 2004 Lutz Rogowski + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +// $Id$ + +#include + +#include +#include +#include +#include + +#include "ksyncprofile.h" + + +KSyncProfile::KSyncProfile( const char * name): QObject (0, name ) +{ + setDefault(); +} +KSyncProfile::~KSyncProfile() +{ + +} + + +KSyncProfile* KSyncProfile::clone() +{ + KSyncProfile* myClone = new KSyncProfile(); + myClone->setPreSyncCommand( mPreSyncCommand ); + myClone->setPostSyncCommand( mPostSyncCommand ); + myClone->setLocalTempFile( mLocalTempFile); + myClone->setRemoteFileName( mRemoteFileName ); + myClone->setShowSummaryAfterSync( mShowSummaryAfterSync ); + myClone->setAskForPreferences( mAskForPreferences); + myClone->setWriteBackExisting(mWriteBackExisting ); + myClone->setWriteBackFile( mWriteBackFile); + myClone->setIncludeInRingSync( mIncludeInRingSync ); + myClone->setSyncPrefs( mSyncPrefs); + myClone->setIsLocalFileSync( mIsLocalFileSync ); + myClone->setName( "noName" ); + return myClone; +} + + +void KSyncProfile::setDefault() +{ + mName = "noName"; + mPreSyncCommand = i18n("command for downloading remote file to local device"); + mPostSyncCommand = i18n("command for uploading local temp file to remote device"); + mLocalTempFile = "/tmp/mycalendar.ics"; + mRemoteFileName = "/home/polo/kdepim/apps/korganizer/localfile.ics"; + mShowSummaryAfterSync = true; + mAskForPreferences = true; + mWriteBackExisting = false; + mWriteBackFile = true; + mIncludeInRingSync = false; + mSyncPrefs = SYNC_PREF_ASK; + mIsLocalFileSync = true; + +} +void KSyncProfile::readConfig(KConfig *config ) +{ + config->setGroup("SyncProfiles"); + QString prefix = "Profile_"+mName+"_"; + //mName = config->readEntry( prefix+ "Name", mName ); + mPreSyncCommand = config->readEntry( prefix+ "PreSyncCommand",mPreSyncCommand ); + mPostSyncCommand = config->readEntry( prefix+ "PostSyncCommand", mPostSyncCommand ); + mIncludeInRingSync = config->readBoolEntry( prefix+ "IncludeInRingSync",mIncludeInRingSync ); + mLocalTempFile = config->readEntry( prefix+ "LocalTempFile", mLocalTempFile ); + mRemoteFileName = config->readEntry( prefix+ "RemoteFileName", mRemoteFileName ); + mShowSummaryAfterSync = config->readBoolEntry( prefix+ "ShowSummaryAfterSync", mShowSummaryAfterSync ); + mAskForPreferences = config->readBoolEntry( prefix+ "AskForPreferences",mAskForPreferences ); + mWriteBackExisting = config->readBoolEntry( prefix+ "WriteBackExisting",mWriteBackExisting ); + mSyncPrefs = config->readNumEntry( prefix+ "SyncPrefs", mSyncPrefs ); + mIsLocalFileSync= config->readBoolEntry( prefix+ "IsLocalFileSync", mIsLocalFileSync ); +} +void KSyncProfile::writeConfig( KConfig * config ) +{ + config->setGroup("SyncProfiles"); + QString prefix = "Profile_"+mName+"_"; + // config->writeEntry( prefix+ "Name", mName ); + config->writeEntry( prefix+ "PreSyncCommand",mPreSyncCommand ); + config->writeEntry( prefix+ "PostSyncCommand", mPostSyncCommand ); + config->writeEntry( prefix+ "IncludeInRingSync",mIncludeInRingSync ); + config->writeEntry( prefix+ "LocalTempFile", mLocalTempFile ); + config->writeEntry( prefix+ "RemoteFileName", mRemoteFileName ); + config->writeEntry( prefix+ "ShowSummaryAfterSync", mShowSummaryAfterSync ); + config->writeEntry( prefix+ "AskForPreferences",mAskForPreferences ); + config->writeEntry( prefix+ "WriteBackExisting",mWriteBackExisting ); + config->writeEntry( prefix+ "SyncPrefs", mSyncPrefs ); + config->writeEntry( prefix+ "IsLocalFileSync", mIsLocalFileSync ); +} + +/* +class KPrefsItemInt : public KPrefsItem { + public: + KPrefsItemInt(const QString &group,const QString &name,int *,int defaultValue=0); + virtual ~KPrefsItemInt() {} + + void setDefault(); + void readConfig(KConfig *); + void writeConfig(KConfig *); + + private: + int *mReference; + int mDefault; +}; +*/ diff --git a/libkdepim/ksyncprofile.h b/libkdepim/ksyncprofile.h new file mode 100644 index 0000000..238ffad --- a/dev/null +++ b/libkdepim/ksyncprofile.h @@ -0,0 +1,106 @@ +/* + This file is part of KOrganizer. + Copyright (c) 2004 Lutz Rogowski + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ +#ifndef _KSYNCPROFILE_H +#define _KSYNCPROFILE_H + +#include +#include +#include +#include +#include +#include + +#define SYNC_PREF_LOCAL 0 +#define SYNC_PREF_REMOTE 1 +#define SYNC_PREF_NEWEST 2 +#define SYNC_PREF_ASK 3 +#define SYNC_PREF_FORCE_LOCAL 4 +#define SYNC_PREF_FORCE_REMOTE 5 +#define SYNC_PREF_TAKE_BOTH 6 + +class KConfig; + +/** + @short Class for storing a preferences setting + @author Cornelius Schumacher + @see KPref + + This class represents one preferences setting as used by @ref KPrefs. + Subclasses of KPrefsItem implement storage functions for a certain type of + setting. Normally you don't have to use this class directly. Use the special + addItem() functions of KPrefs instead. If you subclass this class you will + have to register instances with the function KPrefs::addItem(). +*/ +class KSyncProfile : public QObject { + public: + KSyncProfile( const char * name = 0); + ~KSyncProfile() ; + + KSyncProfile* clone(); + void setDefault(); + void readConfig(KConfig *); + void writeConfig(KConfig *); + void setName( const QString& n ) {mName = n;} + QString getName( ) { return mName;} + void setPreSyncCommand( const QString& n ) {mPreSyncCommand = n;} + QString getPreSyncCommand( ) { return mPreSyncCommand; } + void setPostSyncCommand( const QString& n ) {mPostSyncCommand = n;} + QString getPostSyncCommand( ) { return mPostSyncCommand;} + + void setLocalTempFile( const QString& n ) { mLocalTempFile= n;} + QString getLocalTempFile( ) { return mLocalTempFile;} + void setRemoteFileName( const QString& n ) { mRemoteFileName = n;} + QString getRemoteFileName( ) { return mRemoteFileName;} + /* + void set( const QString& n ) { = n;} + QString get( ) { return ;} + */ + + void setShowSummaryAfterSync( bool b ) { mShowSummaryAfterSync = b;} + bool getShowSummaryAfterSync( ) { return mShowSummaryAfterSync ;} + void setAskForPreferences( bool b ) { mAskForPreferences= b;} + bool getAskForPreferences( ) { return mAskForPreferences;} + void setWriteBackExisting( bool b ) { mWriteBackExisting = b;} + bool getWriteBackExisting( ) { return mWriteBackExisting;} + void setWriteBackFile( bool b ) { mWriteBackFile= b;} + bool getWriteBackFile( ) { return mWriteBackFile;} + void setIncludeInRingSync( bool b ) {mIncludeInRingSync = b;} + bool getIncludeInRingSync( ) { return mIncludeInRingSync;} + void setSyncPrefs( int n ) { mSyncPrefs= n;} + int getSyncPrefs( ) { return mSyncPrefs;} + void setIsLocalFileSync( bool b ) { mIsLocalFileSync= b;} + bool getIsLocalFileSync( ) { return mIsLocalFileSync;} + + private: + QString mName; + QString mPreSyncCommand; + QString mPostSyncCommand; + QString mLocalTempFile; + QString mRemoteFileName; + bool mIncludeInRingSync; + int mSyncPrefs; + bool mWriteBackFile; + bool mWriteBackExisting; + bool mAskForPreferences; + bool mShowSummaryAfterSync; + bool mIsLocalFileSync; +}; + +#endif diff --git a/libkdepim/libkdepim.pro b/libkdepim/libkdepim.pro new file mode 100644 index 0000000..b490899 --- a/dev/null +++ b/libkdepim/libkdepim.pro @@ -0,0 +1,50 @@ +TEMPLATE = lib +CONFIG = qt warn_on +DEFINES +=KORG_NOKABC +TARGET = microkdepim +INCLUDEPATH += ../microkde ../libkabcwrap ../microkde/kdecore . .. +DESTDIR=../bin + +DEFINES += DESKTOP_VERSION +include( ../variables.pri ) +unix : { +OBJECTS_DIR = obj/unix +MOC_DIR = moc/unix +} +win32: { +DEFINES += _WIN32_ +OBJECTS_DIR = obj/win +MOC_DIR = moc/win +} +INTERFACES = \ + +HEADERS = \ + categoryeditdialog.h \ + categoryeditdialog_base.h \ + categoryselectdialog.h \ + categoryselectdialog_base.h \ + kdateedit.h \ + kdatepicker.h \ + kinputdialog.h \ + kincidenceformatter.h \ + kpimprefs.h \ + kprefs.h \ + kprefsdialog.h \ + addresseeview.h \ + ksyncprofile.h + +SOURCES = \ + categoryeditdialog.cpp \ + categoryeditdialog_base.cpp \ + categoryselectdialog.cpp \ + categoryselectdialog_base.cpp \ + kdateedit.cpp \ + kdatepicker.cpp \ + kinputdialog.cpp \ + kincidenceformatter.cpp \ + kpimprefs.cpp \ + kprefs.cpp \ + kprefsdialog.cpp \ + addresseeview.cpp \ + ksyncprofile.cpp + diff --git a/libkdepim/libkdepimE.pro b/libkdepim/libkdepimE.pro new file mode 100644 index 0000000..05abaa5 --- a/dev/null +++ b/libkdepim/libkdepimE.pro @@ -0,0 +1,43 @@ +TEMPLATE = lib +CONFIG += qt warn_on +TARGET = microkdepim +INCLUDEPATH += ../microkde ../qtcompat ../libkabcwrap ../microkde/kdecore +INCLUDEPATH += . .. +LIBS += -lmicrokde +OBJECTS_DIR = obj/$(PLATFORM) +MOC_DIR = moc/$(PLATFORM) +DESTDIR=$(QPEDIR)/lib + + +INTERFACES = \ + +HEADERS = \ + categoryeditdialog.h \ + categoryeditdialog_base.h \ + categoryselectdialog.h \ + categoryselectdialog_base.h \ + kdateedit.h \ + kdatepicker.h \ + kinputdialog.h \ + kincidenceformatter.h \ + kpimprefs.h \ + kprefs.h \ + kprefsdialog.h \ + addresseeview.h \ + ksyncprofile.h + + +SOURCES = \ + categoryeditdialog.cpp \ + categoryeditdialog_base.cpp \ + categoryselectdialog.cpp \ + categoryselectdialog_base.cpp \ + kdateedit.cpp \ + kinputdialog.cpp \ + kdatepicker.cpp \ + kincidenceformatter.cpp \ + kpimprefs.cpp \ + kprefs.cpp \ + kprefsdialog.cpp \ + addresseeview.cpp \ + ksyncprofile.cpp -- cgit v0.9.0.2