author | kergoth <kergoth> | 2002-09-15 17:23:20 (UTC) |
---|---|---|
committer | kergoth <kergoth> | 2002-09-15 17:23:20 (UTC) |
commit | 9bd6edd077df796677c9d069200172f930ac1304 (patch) (side-by-side diff) | |
tree | 3b473d4280249b5ade8e5276758cc8f9aa3c2822 | |
parent | 33ec9ead7ce30bf9450b9048506f0bda49ba4791 (diff) | |
download | opie-9bd6edd077df796677c9d069200172f930ac1304.zip opie-9bd6edd077df796677c9d069200172f930ac1304.tar.gz opie-9bd6edd077df796677c9d069200172f930ac1304.tar.bz2 |
Reverting to checkbook in its previous state, hopefully i got everything.
42 files changed, 3683 insertions, 1285 deletions
diff --git a/noncore/apps/checkbook/TODO b/noncore/apps/checkbook/TODO index bc60bf4..adc9665 100644 --- a/noncore/apps/checkbook/TODO +++ b/noncore/apps/checkbook/TODO @@ -1 +1,5 @@ TODO: + * Date widget + * Various bug fixes + * Fix "the" crash + * Fix graph's legend not showing up
\ No newline at end of file diff --git a/noncore/apps/checkbook/calcdlg.ui b/noncore/apps/checkbook/calcdlg.ui deleted file mode 100644 index e0b19f9..0000000 --- a/noncore/apps/checkbook/calcdlg.ui +++ b/dev/null @@ -1,243 +0,0 @@ -<!DOCTYPE UI><UI> -<class>CalcDlg</class> -<widget> - <class>QWidget</class> - <property stdset="1"> - <name>name</name> - <cstring>CalcDlg</cstring> - </property> - <property stdset="1"> - <name>geometry</name> - <rect> - <x>0</x> - <y>0</y> - <width>218</width> - <height>274</height> - </rect> - </property> - <property stdset="1"> - <name>caption</name> - <string>Network Time</string> - </property> - <property> - <name>layoutMargin</name> - </property> - <property> - <name>layoutSpacing</name> - </property> - <widget> - <class>QTabWidget</class> - <property stdset="1"> - <name>name</name> - <cstring>TabWidgetMain</cstring> - </property> - <property stdset="1"> - <name>geometry</name> - <rect> - <x>10</x> - <y>0</y> - <width>200</width> - <height>260</height> - </rect> - </property> - <property> - <name>layoutMargin</name> - </property> - <property> - <name>layoutSpacing</name> - </property> - <widget> - <class>QWidget</class> - <property stdset="1"> - <name>name</name> - <cstring>tabMain</cstring> - </property> - <attribute> - <name>title</name> - <string>Molweight</string> - </attribute> - <widget> - <class>QFrame</class> - <property stdset="1"> - <name>name</name> - <cstring>FrameSystemTime</cstring> - </property> - <property stdset="1"> - <name>geometry</name> - <rect> - <x>2</x> - <y>2</y> - <width>180</width> - <height>220</height> - </rect> - </property> - <property stdset="1"> - <name>frameShape</name> - <enum>StyledPanel</enum> - </property> - <property stdset="1"> - <name>frameShadow</name> - <enum>Raised</enum> - </property> - <widget> - <class>QLabel</class> - <property stdset="1"> - <name>name</name> - <cstring>TextLabel1_4</cstring> - </property> - <property stdset="1"> - <name>geometry</name> - <rect> - <x>1</x> - <y>1</y> - <width>298</width> - <height>16</height> - </rect> - </property> - <property stdset="1"> - <name>text</name> - <string>Formula:</string> - </property> - </widget> - <widget> - <class>QLayoutWidget</class> - <property stdset="1"> - <name>name</name> - <cstring>Layout7</cstring> - </property> - <property stdset="1"> - <name>geometry</name> - <rect> - <x>0</x> - <y>50</y> - <width>175</width> - <height>30</height> - </rect> - </property> - <hbox> - <property stdset="1"> - <name>margin</name> - <number>0</number> - </property> - <property stdset="1"> - <name>spacing</name> - <number>6</number> - </property> - <widget> - <class>QPushButton</class> - <property stdset="1"> - <name>name</name> - <cstring>calculate</cstring> - </property> - <property stdset="1"> - <name>text</name> - <string>Calculate</string> - </property> - </widget> - <widget> - <class>QPushButton</class> - <property stdset="1"> - <name>name</name> - <cstring>clear_fields</cstring> - </property> - <property stdset="1"> - <name>text</name> - <string>Clear</string> - </property> - </widget> - </hbox> - </widget> - <widget> - <class>QLineEdit</class> - <property stdset="1"> - <name>name</name> - <cstring>formula</cstring> - </property> - <property stdset="1"> - <name>geometry</name> - <rect> - <x>0</x> - <y>20</y> - <width>170</width> - <height>22</height> - </rect> - </property> - </widget> - <widget> - <class>QMultiLineEdit</class> - <property stdset="1"> - <name>name</name> - <cstring>anal_display</cstring> - </property> - <property stdset="1"> - <name>geometry</name> - <rect> - <x>0</x> - <y>130</y> - <width>170</width> - <height>80</height> - </rect> - </property> - </widget> - <widget> - <class>QLineEdit</class> - <property stdset="1"> - <name>name</name> - <cstring>result</cstring> - </property> - <property stdset="1"> - <name>geometry</name> - <rect> - <x>0</x> - <y>100</y> - <width>170</width> - <height>22</height> - </rect> - </property> - </widget> - <widget> - <class>QLabel</class> - <property stdset="1"> - <name>name</name> - <cstring>TextLabel2_4</cstring> - </property> - <property stdset="1"> - <name>geometry</name> - <rect> - <x>1</x> - <y>86</y> - <width>298</width> - <height>16</height> - </rect> - </property> - <property stdset="1"> - <name>text</name> - <string>Result:</string> - </property> - </widget> - </widget> - </widget> - <widget> - <class>QWidget</class> - <property stdset="1"> - <name>name</name> - <cstring>tabNtp</cstring> - </property> - <attribute> - <name>title</name> - <string>Nernst</string> - </attribute> - <grid> - <property stdset="1"> - <name>margin</name> - <number>1</number> - </property> - <property stdset="1"> - <name>spacing</name> - <number>2</number> - </property> - </grid> - </widget> - </widget> -</widget> -</UI> diff --git a/noncore/apps/checkbook/calcdlgui.cpp b/noncore/apps/checkbook/calcdlgui.cpp deleted file mode 100644 index e9b40d3..0000000 --- a/noncore/apps/checkbook/calcdlgui.cpp +++ b/dev/null @@ -1,55 +0,0 @@ -/*************************************************************************** - * * - * 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. * - * * - **************************************************************************/ -#include "oxygen.h" - -#include "calcdlgui.h" -#include "kmolcalc.h" -#include <qlineedit.h> -#include <qmultilineedit.h> -#include <qpushbutton.h> - -calcDlgUI::calcDlgUI() : CalcDlg() -{ - kmolcalc = new KMolCalc; - connect( calculate, SIGNAL( clicked() ), this, SLOT( calc() ) ); - connect( clear_fields, SIGNAL( clicked() ), this, SLOT( clear() ) ); -} - -void calcDlgUI::calc() -{ - QString compound( formula->text() ); - if ( compound.isEmpty() ) { - clear(); - return; - } - QString errors( kmolcalc->readFormula( compound ) ); - QString mw, ea; - double weight = kmolcalc->getWeight(); - if ( errors == "OK" ) { - mw.setNum( weight ); - ea = kmolcalc->getEmpFormula() + " :\n" + kmolcalc->getEA(); - } else { - mw = "???"; - ea = tr( "ERROR: \n" ) + errors + "\n"; - } - result->setText( mw ); - anal_display->setText( ea ); -} - -/** - * * Clear all text entry / result fields. - * */ -void calcDlgUI::clear() -{ - formula->clear(); - result->clear(); - anal_display->clear(); -} - - diff --git a/noncore/apps/checkbook/calcdlgui.h b/noncore/apps/checkbook/calcdlgui.h deleted file mode 100644 index 33a1ec1..0000000 --- a/noncore/apps/checkbook/calcdlgui.h +++ b/dev/null @@ -1,27 +0,0 @@ - -/*************************************************************************** - * * - * 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. * - * * - **************************************************************************/ -#include <qstring.h> -#include "calcdlg.h" - -class QVBox; -class KMolCalc; - -class calcDlgUI : public CalcDlg -{ - Q_OBJECT - - public: - calcDlgUI(); - KMolCalc *kmolcalc; - - public slots: - void calc(); - void clear(); -}; diff --git a/noncore/apps/checkbook/checkbook.pro b/noncore/apps/checkbook/checkbook.pro new file mode 100644 index 0000000..e9e2167 --- a/dev/null +++ b/noncore/apps/checkbook/checkbook.pro @@ -0,0 +1,50 @@ +TEMPLATE = app +CONFIG = qt warn_on release +HEADERS = config.h \ + qcheckbook.h \ + qcheckdetails.h \ + qcheckentry.h \ + qcheckgraph.h \ + qcheckmainmenu.h \ + qcheckname.h \ + qcheckview.h \ + qrestrictedcombo.h \ + qrestrictedline.h +SOURCES = config.cpp \ + main.cpp \ + qcheckbook.cpp \ + qcheckdetails.cpp \ + qcheckentry.cpp \ + qcheckgraph.cpp \ + qcheckmainmenu.cpp \ + qcheckname.cpp \ + qcheckview.cpp \ + qrestrictedcombo.cpp \ + qrestrictedline.cpp +INTERFACES = qcheckdetailsbase.ui \ + qcheckentrybase.ui \ + qcheckgraphbase.ui \ + qcheckmmbase.ui \ + qchecknamebase.ui \ + qcheckviewbase.ui +INCLUDEPATH += $(OPIEDIR)/include +DEPENDPATH += $(OPIEDIR)/include +LIBS += -lqpe +TARGET = checkbook +DESTDIR = $(OPIEDIR)/bin + +TRANSLATIONS = ../../../i18n/de/checkbook.ts \ + ../../../i18n/en/checkbook.ts \ + ../../../i18n/es/checkbook.ts \ + ../../../i18n/fr/checkbook.ts \ + ../../../i18n/hu/checkbook.ts \ + ../../../i18n/ja/checkbook.ts \ + ../../../i18n/ko/checkbook.ts \ + ../../../i18n/no/checkbook.ts \ + ../../../i18n/pl/checkbook.ts \ + ../../../i18n/pt/checkbook.ts \ + ../../../i18n/pt_BR/checkbook.ts \ + ../../../i18n/sl/checkbook.ts \ + ../../../i18n/zh_CN/checkbook.ts \ + ../../../i18n/zh_TW/checkbook.ts \ + ../../../i18n/it/checkbook.ts diff --git a/noncore/apps/checkbook/config.cpp b/noncore/apps/checkbook/config.cpp new file mode 100644 index 0000000..e6c6dcc --- a/dev/null +++ b/noncore/apps/checkbook/config.cpp @@ -0,0 +1,560 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include <qdir.h> +#include <qfile.h> +#include <qfileinfo.h> +#include <qmessagebox.h> +#if QT_VERSION <= 230 && defined(QT_NO_CODECS) +#include <qtextcodec.h> +#endif +#include <qtextstream.h> + +#include <sys/stat.h> +#include <sys/types.h> +#include <fcntl.h> +#include <stdlib.h> +#include <unistd.h> + +#include "config.h" + + +/*! + \internal +*/ +QString Config::configFilename(const QString& name, Domain d) +{ + switch (d) { + case File: + return name; + case User: { + QDir dir = (QString(getenv("HOME")) + "/Settings"); + if ( !dir.exists() ) + mkdir(dir.path().local8Bit(),0700); + return dir.path() + "/" + name + ".conf"; + } + } + return name; +} + +/*! + \class Config config.h + \brief The Config class provides for saving application cofniguration state. + + You should keep a Config in existence only while you do not want others + to be able to change the state. There is no locking currently, but there + may be in the future. +*/ + +/*! + \enum Config::ConfigGroup + \internal +*/ + +/*! + \enum Config::Domain + + \value File + \value User + + See Config for details. +*/ + +/*! + Constructs a config that will load or create a configuration with the + given \a name in the given \a domain. + + You must call setGroup() before doing much else with the Config. + + In the default Domain, \e User, + the configuration is user-specific. \a name should not contain "/" in + this case, and in general should be the name of the C++ class that is + primarily responsible for maintaining the configuration. + + In the File Domain, \a name is an absolute filename. +*/ +Config::Config( const QString &name, Domain domain ) + : filename( configFilename(name,domain) ) +{ + git = groups.end(); + read(); + + lang = getenv("LANG"); + int i = lang.find("."); + if ( i > 0 ) + lang = lang.left( i ); + i = lang.find( "_" ); + if ( i > 0 ) + glang = lang.left(i); +} + +/*! + Writes any changes to disk and destroys the in-memory object. +*/ +Config::~Config() +{ + if ( changed ) + write(); +} + +/*! + Returns whether the current group has an entry called \a key. +*/ +bool Config::hasKey( const QString &key ) const +{ + if ( groups.end() == git ) + return FALSE; + ConfigGroup::ConstIterator it = ( *git ).find( key ); + return it != ( *git ).end(); +} + +/*! + Sets the current group for subsequent reading and writing of + entries to \a gname. Grouping allows the application to partition the namespace. + + This function must be called prior to any reading or writing + of entries. + + The \a gname must not be empty. +*/ +void Config::setGroup( const QString &gname ) +{ + QMap< QString, ConfigGroup>::Iterator it = groups.find( gname ); + if ( it == groups.end() ) { + git = groups.insert( gname, ConfigGroup() ); + changed = TRUE; + return; + } + git = it; +} + +/*! + Writes a (\a key, \a value) entry to the current group. + + \sa readEntry() +*/ +void Config::writeEntry( const QString &key, const char* value ) +{ + writeEntry(key,QString(value)); +} + +/*! + Writes a (\a key, \a value) entry to the current group. + + \sa readEntry() +*/ +void Config::writeEntry( const QString &key, const QString &value ) +{ + if ( git == groups.end() ) { + qWarning( "no group set" ); + return; + } + if ( (*git)[key] != value ) { + ( *git ).insert( key, value ); + changed = TRUE; + } +} + +/* + Note that the degree of protection offered by the encryption here is + only sufficient to avoid the most casual observation of the configuration + files. People with access to the files can write down the contents and + decrypt it using this source code. + + Conceivably, and at some burden to the user, this encryption could + be improved. +*/ +static QString encipher(const QString& plain) +{ + // mainly, we make it long + QString cipher; + int mix=28730492; + for (int i=0; i<(int)plain.length(); i++) { + int u = plain[i].unicode(); + int c = u ^ mix; + QString x = QString::number(c,36); + cipher.append(QChar('a'+x.length())); + cipher.append(x); + mix *= u; + } + return cipher; +} + +static QString decipher(const QString& cipher) +{ + QString plain; + int mix=28730492; + for (int i=0; i<(int)cipher.length();) { + int l = cipher[i].unicode()-'a'; + QString x = cipher.mid(i+1,l); i+=l+1; + int u = x.toInt(0,36) ^ mix; + plain.append(QChar(u)); + mix *= u; + } + return plain; +} + +/*! + Writes an encrypted (\a key, \a value) entry to the current group. + + Note that the degree of protection offered by the encryption is + only sufficient to avoid the most casual observation of the configuration + files. + + \sa readEntry() +*/ +void Config::writeEntryCrypt( const QString &key, const QString &value ) +{ + if ( git == groups.end() ) { + qWarning( "no group set" ); + return; + } + QString evalue = encipher(value); + if ( (*git)[key] != evalue ) { + ( *git ).insert( key, evalue ); + changed = TRUE; + } +} + +/*! + Writes a (\a key, \a num) entry to the current group. + + \sa readNumEntry() +*/ +void Config::writeEntry( const QString &key, int num ) +{ + QString s; + s.setNum( num ); + writeEntry( key, s ); +} + +#ifdef Q_HAS_BOOL_TYPE +/*! + Writes a (\a key, \a b) entry to the current group. This is equivalent + to writing a 0 or 1 as an integer entry. + + \sa readBoolEntry() +*/ +void Config::writeEntry( const QString &key, bool b ) +{ + QString s; + s.setNum( ( int )b ); + writeEntry( key, s ); +} +#endif + +/*! + Writes a (\a key, \a lst) entry to the current group. The list + is separated by \a sep, so the strings must not contain that character. + + \sa readListEntry() +*/ +void Config::writeEntry( const QString &key, const QStringList &lst, const QChar &sep ) +{ + QString s; + QStringList::ConstIterator it = lst.begin(); + for ( ; it != lst.end(); ++it ) + s += *it + sep; + writeEntry( key, s ); +} + +/*! + Removes the \a key entry from the current group. Does nothing if + there is no such entry. +*/ + +void Config::removeEntry( const QString &key ) +{ + if ( git == groups.end() ) { + qWarning( "no group set" ); + return; + } + ( *git ).remove( key ); + changed = TRUE; +} + +/*! + \fn bool Config::operator == ( const Config & other ) const + + Tests for equality with \a other. Config objects are equal if they refer to the same filename. +*/ + +/*! + \fn bool Config::operator != ( const Config & other ) const + + Tests for inequality with \a other. Config objects are equal if they refer to the same filename. +*/ + +/*! + \fn QString Config::readEntry( const QString &key, const QString &deflt ) const + + Reads a string entry stored with \a key, defaulting to \a deflt if there is no entry. +*/ + +/*! + \internal + For compatibility, non-const version. +*/ +QString Config::readEntry( const QString &key, const QString &deflt ) +{ + QString res = readEntryDirect( key+"["+lang+"]" ); + if ( !res.isNull() ) + return res; + if ( !glang.isEmpty() ) { + res = readEntryDirect( key+"["+glang+"]" ); + if ( !res.isNull() ) + return res; + } + return readEntryDirect( key, deflt ); +} + +/*! + \fn QString Config::readEntryCrypt( const QString &key, const QString &deflt ) const + + Reads an encrypted string entry stored with \a key, defaulting to \a deflt if there is no entry. +*/ + +/*! + \internal + For compatibility, non-const version. +*/ +QString Config::readEntryCrypt( const QString &key, const QString &deflt ) +{ + QString res = readEntryDirect( key+"["+lang+"]" ); + if ( res.isNull() && glang.isEmpty() ) + res = readEntryDirect( key+"["+glang+"]" ); + if ( res.isNull() ) + res = readEntryDirect( key, QString::null ); + if ( res.isNull() ) + return deflt; + return decipher(res); +} + +/*! + \fn QString Config::readEntryDirect( const QString &key, const QString &deflt ) const + \internal +*/ + +/*! + \internal + For compatibility, non-const version. +*/ +QString Config::readEntryDirect( const QString &key, const QString &deflt ) +{ + if ( git == groups.end() ) { + //qWarning( "no group set" ); + return deflt; + } + ConfigGroup::ConstIterator it = ( *git ).find( key ); + if ( it != ( *git ).end() ) + return *it; + else + return deflt; +} + +/*! + \fn int Config::readNumEntry( const QString &key, int deflt ) const + Reads a numeric entry stored with \a key, defaulting to \a deflt if there is no entry. +*/ + +/*! + \internal + For compatibility, non-const version. +*/ +int Config::readNumEntry( const QString &key, int deflt ) +{ + QString s = readEntry( key ); + if ( s.isEmpty() ) + return deflt; + else + return s.toInt(); +} + +/*! + \fn bool Config::readBoolEntry( const QString &key, bool deflt ) const + Reads a bool entry stored with \a key, defaulting to \a deflt if there is no entry. +*/ + +/*! + \internal + For compatibility, non-const version. +*/ +bool Config::readBoolEntry( const QString &key, bool deflt ) +{ + QString s = readEntry( key ); + if ( s.isEmpty() ) + return deflt; + else + return (bool)s.toInt(); +} + +/*! + \fn QStringList Config::readListEntry( const QString &key, const QChar &sep ) const + Reads a string list entry stored with \a key, and with \a sep as the separator. +*/ + +/*! + \internal + For compatibility, non-const version. +*/ + +/*! + Removes all entries from the current group. +*/ +void Config::clearGroup() +{ + if ( git == groups.end() ) { + qWarning( "no group set" ); + return; + } + if ( !(*git).isEmpty() ) { + ( *git ).clear(); + changed = TRUE; + } +} + +void Config::removeGroup() +{ + if ( git == groups.end() ) { + qWarning( "no group set" ); + return; + } + + groups.remove(git); + changed = TRUE; +} + +/*! + \internal +*/ +void Config::write( const QString &fn ) +{ + QString strNewFile; + if ( !fn.isEmpty() ) + filename = fn; + strNewFile = filename + ".new"; + + QFile f( strNewFile ); + if ( !f.open( IO_WriteOnly|IO_Raw ) ) { + qWarning( "could not open for writing `%s'", strNewFile.latin1() ); + git = groups.end(); + return; + } + + QString str; + QCString cstr; + QMap< QString, ConfigGroup >::Iterator g_it = groups.begin(); + + for ( ; g_it != groups.end(); ++g_it ) { + str += "[" + g_it.key() + "]\n"; + ConfigGroup::Iterator e_it = ( *g_it ).begin(); + for ( ; e_it != ( *g_it ).end(); ++e_it ) + str += e_it.key() + " = " + *e_it + "\n"; + } + cstr = str.utf8(); + + int total_length; + total_length = f.writeBlock( cstr.data(), cstr.length() ); + if ( total_length != int(cstr.length()) ) { + QMessageBox::critical( 0, QObject::tr("Out of Space"), + QObject::tr("There was a problem creating\nConfiguration Information \nfor this program.\n\nPlease free up some space and\ntry again.") ); + f.close(); + QFile::remove( strNewFile ); + return; + } + + f.close(); + // now rename the file... + if ( rename( strNewFile, filename ) < 0 ) { + qWarning( "problem renaming the file %s to %s", strNewFile.latin1(), + filename.latin1() ); + QFile::remove( strNewFile ); + } +} + +/*! + Returns whether the Config is in a valid state. +*/ +bool Config::isValid() const +{ + return groups.end() != git; +} + +/*! + \internal +*/ +void Config::read() +{ + changed = FALSE; + + if ( !QFileInfo( filename ).exists() ) { + git = groups.end(); + return; + } + + QFile f( filename ); + if ( !f.open( IO_ReadOnly ) ) { + git = groups.end(); + return; + } + + QTextStream s( &f ); +#if QT_VERSION <= 230 && defined(QT_NO_CODECS) + // The below should work, but doesn't in Qt 2.3.0 + s.setCodec( QTextCodec::codecForMib( 106 ) ); +#else + s.setEncoding( QTextStream::UnicodeUTF8 ); +#endif + + QStringList list = QStringList::split('\n', s.read() ); + f.close(); + + for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { + if ( !parse( *it ) ) { + git = groups.end(); + return; + } + } +} + +/*! + \internal +*/ +bool Config::parse( const QString &l ) +{ + QString line = l.stripWhiteSpace(); + if ( line[ 0 ] == QChar( '[' ) ) { + QString gname = line; + gname = gname.remove( 0, 1 ); + if ( gname[ (int)gname.length() - 1 ] == QChar( ']' ) ) + gname = gname.remove( gname.length() - 1, 1 ); + git = groups.insert( gname, ConfigGroup() ); + } else if ( !line.isEmpty() ) { + if ( git == groups.end() ) + return FALSE; + int eq = line.find( '=' ); + if ( eq == -1 ) + return FALSE; + QString key = line.left(eq).stripWhiteSpace(); + QString value = line.mid(eq+1).stripWhiteSpace(); + ( *git ).insert( key, value ); + } + return TRUE; +} diff --git a/noncore/apps/checkbook/config.h b/noncore/apps/checkbook/config.h new file mode 100644 index 0000000..b3a8561 --- a/dev/null +++ b/noncore/apps/checkbook/config.h @@ -0,0 +1,99 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef CONFIG_H +#define CONFIG_H + +// ##### could use QSettings with Qt 3.0 + +#include <qmap.h> +#include <qstringlist.h> + +class ConfigPrivate; +class Config +{ +public: + typedef QMap< QString, QString > ConfigGroup; + + enum Domain { File, User }; + Config( const QString &name, Domain domain=User ); + ~Config(); + + bool operator == ( const Config & other ) const { return (filename == other.filename); } + bool operator != ( const Config & other ) const { return (filename != other.filename); } + + bool isValid() const; + bool hasKey( const QString &key ) const; + + void setGroup( const QString &gname ); + void writeEntry( const QString &key, const char* value ); + void writeEntry( const QString &key, const QString &value ); + void writeEntryCrypt( const QString &key, const QString &value ); + void writeEntry( const QString &key, int num ); +#ifdef Q_HAS_BOOL_TYPE + void writeEntry( const QString &key, bool b ); +#endif + void writeEntry( const QString &key, const QStringList &lst, const QChar &sep ); + void removeEntry( const QString &key ); + + QString readEntry( const QString &key, const QString &deflt = QString::null ) const; + QString readEntryCrypt( const QString &key, const QString &deflt = QString::null ) const; + QString readEntryDirect( const QString &key, const QString &deflt = QString::null ) const; + int readNumEntry( const QString &key, int deflt = -1 ) const; + bool readBoolEntry( const QString &key, bool deflt = FALSE ) const; + + // For compatibility, non-const versions. + QString readEntry( const QString &key, const QString &deflt ); + QString readEntryCrypt( const QString &key, const QString &deflt ); + QString readEntryDirect( const QString &key, const QString &deflt ); + int readNumEntry( const QString &key, int deflt ); + bool readBoolEntry( const QString &key, bool deflt ); + + void clearGroup(); + void removeGroup(); + + void write( const QString &fn = QString::null ); + +protected: + void read(); + bool parse( const QString &line ); + + QMap< QString, ConfigGroup > groups; + QMap< QString, ConfigGroup >::Iterator git; + QString filename; + QString lang; + QString glang; + bool changed; + ConfigPrivate *d; + static QString configFilename(const QString& name, Domain); +}; + +inline QString Config::readEntry( const QString &key, const QString &deflt ) const +{ return ((Config*)this)->readEntry(key,deflt); } +inline QString Config::readEntryCrypt( const QString &key, const QString &deflt ) const +{ return ((Config*)this)->readEntryCrypt(key,deflt); } +inline QString Config::readEntryDirect( const QString &key, const QString &deflt ) const +{ return ((Config*)this)->readEntryDirect(key,deflt); } +inline int Config::readNumEntry( const QString &key, int deflt ) const +{ return ((Config*)this)->readNumEntry(key,deflt); } +inline bool Config::readBoolEntry( const QString &key, bool deflt ) const +{ return ((Config*)this)->readBoolEntry(key,deflt); } + +#endif diff --git a/noncore/apps/checkbook/kmolcalc.cpp b/noncore/apps/checkbook/kmolcalc.cpp deleted file mode 100644 index 50e1375..0000000 --- a/noncore/apps/checkbook/kmolcalc.cpp +++ b/dev/null @@ -1,235 +0,0 @@ -/* - * kmolcalc.cpp - * - * Copyright (C) 2000 Tomislav Gountchev <tomi@idiom.com> - * Copyright (C) 2002 Carsten Niehaus <cniehaus@handhelds.org> - */ - -/** - * KMOLCALC is the calculation engine. It knows about a hashtable of user defined atomic - * weights and group definitions ELSTABLE, and the currently processed formula, stored - * as a list of elements and their coefficients, ELEMENTS. - */ - -#include "kmolcalc.h" -#include <qdict.h> -#include <qdir.h> -#include <qfile.h> -#include <iostream.h> - - -/** - * Construct a new calculator object. - */ -KMolCalc::KMolCalc() { - elements = new ElementList; - elstable = NULL; - readElstable(); -} - -KMolCalc::~KMolCalc() { - delete elements; -} - -void KMolCalc::readElstable() { - weight = -1; // not calculated yet - if (elstable) delete elstable; - elstable = new QDict<SubUnit> (197, TRUE); - elstable->setAutoDelete(TRUE); - QStringList files;// = // KGlobal::dirs()->findAllResources("appdata", "kmolweights"); - mwfile = "/home/opie/opie/noncore/apps/oxigen/kmolweights"; - QFile f(mwfile); - QString* latest_f = &mwfile; - for (uint i=0; i<files.count(); i++) { - if (QFileInfo(QFile(files[i])).lastModified() > QFileInfo(QFile(*latest_f)).lastModified()) { - latest_f = &files[i]; - } - } - QFile lf(*latest_f); - if (f.exists()) readMwfile(f); - if (!f.exists()) { - readMwfile(lf); - writeElstable(); - } else if (QFileInfo(f).lastModified() < QFileInfo(lf).lastModified()) { - // announce - QMessageBox::information - (0, "Warning:", "Found new global Mw file.\nLocal definitions will be updated.", QMessageBox::Ok); - readMwfile(lf); - writeElstable(); - } - -} - - -/** - * Parse a string S and construct the ElementList this->ELEMENTS, representing the - * composition of S. Returns 0 if successful, or an error code (currently -1) if - * parsing failed. - * The elements is S must be valid element or group symbols, as stored in this->ELSTABLE. - * See help files for correct formula syntax. - */ -QString KMolCalc::readFormula(const QString& s) { - weight = -1; - if (elements) delete elements; - elements = new ElementList; - return KMolCalc::readGroup(s, elements); -} - -// read a formula group recursively. Called by readFormula. -QString KMolCalc::readGroup(const QString& s, ElementList* els) { - if (s.isEmpty()) return QString ("Enter a formula."); //ERROR - int sl = s.length(); - int i = 0; - QString errors ("OK"); - bool ok = TRUE; - while (i < sl && ((s[i] <= '9' && s[i] >= '0') || s[i] == '.')) i++; - double prefix = (i == 0 ? 1 : s.left(i).toDouble(&ok)); - if (! ok || i == sl || prefix == 0) return QString ("Bad formula."); // ERROR - ElementList* elstemp = new ElementList; - while (i < sl) { - int j = i; - if (s[i] == '(') { - ElementList* inner = new ElementList; - int level = 1; // count levels of nested ( ). - while (1) { - if (i++ == sl) { - delete inner; - delete elstemp; - return QString ("Bad formula."); //ERROR - } - if (s[i] == '(') level++; - if (s[i] == ')') level--; - if (level == 0) break; - } - errors = KMolCalc::readGroup(s.mid(j+1, i-j-1), inner); - j = ++i; - while (i < sl && ((s[i] <= '9' && s[i] >= '0') || s[i] == '.')) i++; - double suffix = (i == j ? 1 : s.mid(j, i-j).toDouble(&ok)); - if (! ok || suffix == 0) { - delete inner; - delete elstemp; - return QString ("Bad formula."); // ERROR - } - inner->addTo(*elstemp, suffix); - delete inner; - inner = NULL; - } else if ((s[i] >= 'A' && s[i] <= 'Z') || (s[i] >= 'a' && s[i] <= 'z')) { - while (++i < sl && ((s[i] >= 'a' && s[i] <= 'z') || s[i] == '*' || - s[i] == '\'')); - QString elname = s.mid(j, i-j); - j = i; - while (i < sl && ((s[i] <= '9' && s[i] >= '0') || s[i] == '.')) i++; - double suffix = (i == j ? 1 : s.mid(j, i-j).toDouble(&ok)); - if (! ok || suffix == 0) { - delete elstemp; - return QString ("Bad formula."); // ERROR - } - SubUnit* group = elstable->find(elname); - if (group == 0) { - delete elstemp; - return QString ("Undefined symbol: ") + elname; //ERROR - } - group->addTo(*elstemp, suffix); - } else if (s[i] == '+') { - if (elstemp->isEmpty()) { - delete elstemp; - return QString ("Bad formula."); //ERROR - } - elstemp->addTo(*els, prefix); - delete elstemp; - errors = KMolCalc::readGroup(s.mid(i+1, sl-i-1), els); - return errors; - } else { - delete elstemp; - return QString ("Bad formula."); //ERROR - } - } - elstemp->addTo(*els, prefix); - delete elstemp; - return errors; -} - -/** - * Calculate and return the molecular weight of the current chemical formula. - */ -double KMolCalc::getWeight() { - if (weight == -1) weight = elements->getWeight(elstable); - return weight; -} - -/** - * Return the elemental composition of the current formula, as a string of tab-separated - * element - percentage pairs, separated by newlines. - */ -QString KMolCalc::getEA() { - if (weight == -1) weight = elements->getWeight(elstable); - if (weight == -1) return QString("ERROR: Couldn't get Mw..."); // ERROR - return elements->getEA(elstable, weight); -} - -/** - * Return the empirical formula of the current compound as a QString. - */ -QString KMolCalc::getEmpFormula() { - return elements->getEmpFormula(); -} - -// Read the element definition file. -void KMolCalc::readMwfile(QFile& f) { - if (! f.open(IO_ReadOnly)) return; //ERROR - QTextStream fs (&f); - QString line; - while (! fs.eof()) { - line = fs.readLine(); - SubUnit* s = SubUnit::makeSubUnit(line); - elstable->replace(s->getName(), s); - } - f.close(); -} - -/** - * Save the element definitions file. - */ -void KMolCalc::writeElstable() { - QFile f(mwfile); - if (! f.open(IO_WriteOnly)) return; //ERROR - QTextStream fs (&f); - QString line; - QDictIterator<SubUnit> it(*elstable); - while (it.current()) { - it.current()->writeOut(line); - fs << line << endl; - ++it; - } - f.close(); -} - -/** - * Remove a group or element definition from ELSTABLE. - */ -void KMolCalc::undefineGroup (const QString& name) { - elstable->remove (name); -} - -/** - * Add a new element name - atomic weight record to the ELSTABLE hashtable. Assumes - * NAME has valid syntax. - - */ -void KMolCalc::defineElement (const QString& name, double weight) { - Element* el = new Element(name, weight); - elstable->replace(name, el); -} - -/** - * Add a new group definition to the ELSTABLE. Returns 0 if OK, -1 if parsing FORMULA - * fails. Assumes the syntax of grpname is correct. - */ -QString KMolCalc::defineGroup (const QString& grpname, const QString& formula) { - ElementList* els = new ElementList(grpname); - QString error = readGroup(formula, els); - if (error != "OK") return error; - if (els->contains(grpname)) return QString("Can't define a group recursively!\n"); - elstable->replace(grpname, els); - return QString("OK"); -} diff --git a/noncore/apps/checkbook/kmolcalc.h b/noncore/apps/checkbook/kmolcalc.h deleted file mode 100644 index c3e02f3..0000000 --- a/noncore/apps/checkbook/kmolcalc.h +++ b/dev/null @@ -1,110 +0,0 @@ -/* - * kmolcalc.h - * - * Copyright (C) 2000 Tomislav Gountchev <tomi@idiom.com> - */ - - -#ifndef KMOLCALC_H -#define KMOLCALC_H - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - - -#include "kmolelements.h" -#include <qdict.h> -#include <qlist.h> -#include <qstring.h> -#include <qfile.h> -#include <qfileinfo.h> -#include <qmessagebox.h> -#include <qtextstream.h> - - -/** - * KMOLCALC is the calculation engine. It knows about a hashtable of user defined atomic - * weights and group definitions ELSTABLE, and the currently processed formula, stored - * as a list of elements and their coefficients, ELEMENTS. - */ -class KMolCalc { - -public: - - KMolCalc(); - ~KMolCalc(); - - /** - * Parse a string S and construct the ElementList ELEMENTS, representing the composition - * of S. Returns "OK" if successful, or an error message if parsing failed. - * The elements is S must be valid element or group symbols, as stored in ELSTABLE. - * See help files for correct formula syntax. - */ - QString readFormula(const QString& s); - - /** - * Calculate and return the molecular weight of the current chemical formula. - */ - double getWeight(); - - /** - * Return the elemental composition of the current formula, as a string of tab-separated - * element - percentage pairs, separated by newlines. - */ - QString getEA(); - - - /** - * Return the empirical formula of the current compound as a QString. - */ - QString getEmpFormula(); - - /** - * Add a new element name - atomic weight record to the ELSTABLE hashtable. - * Assumes NAME has valid syntax. - */ - void defineElement(const QString& name, double weight); - - /** - * Add a new group definition to the ELSTABLE. Returns "OK" if OK, error message - * if parsing FORMULA fails. Assumes the syntax of NAME is correct. - */ - QString defineGroup(const QString& name, const QString& formula); - - /** - * Remove a group or element definition from ELSTABLE. - */ - void undefineGroup(const QString& name); - - /** - * Save the element definitions file. - */ - void writeElstable(); - - /** - * Read the element definitions file and construct ELSTABLE. - */ - void readElstable(); - - /** - * The element dictionary. - */ - QDict<SubUnit>* elstable; - - QString mwfile; - - private: - double weight; - - QString readGroup(const QString& s, ElementList* els); - void readMwfile(QFile& f); - ElementList* elements; -}; - -#endif - - - - - diff --git a/noncore/apps/checkbook/kmolelements.cpp b/noncore/apps/checkbook/kmolelements.cpp deleted file mode 100644 index ce8f9c1..0000000 --- a/noncore/apps/checkbook/kmolelements.cpp +++ b/dev/null @@ -1,238 +0,0 @@ -/* - * kmolelements.cpp - * - * Copyright (C) 2000 Tomislav Gountchev <tomi@idiom.com> - */ - -// classes that store and manipulate chemical formulas represented as -// lists of elements - -#include <stdio.h> -#include "kmolelements.h" - -/** - * A generic chemical entity. Can be an element or a group. - */ -SubUnit::SubUnit () {} - -SubUnit::~SubUnit () {} - -/** - * Construct a subunit and return a pointer to it. The syntax of LINE is - * the one used in the element definition file. - */ -SubUnit* SubUnit::makeSubUnit(QString line) { - QString name, grpname, weight, coef; - QTextStream str (line, IO_ReadOnly); - str >> name; - if (name != "-group") { // not a group - must be represented as Element - str >> weight >> ws; - return new Element(name, weight.toDouble()); - } - else { - str >> grpname; - ElementList* els = new ElementList(grpname); // group - make an ElementList - while (!str.eof()) { - str >> name >> ws; - str >> coef >> ws; - els->addElement(name, coef.toDouble()); - } - return els; - } -} - -QString SubUnit::getName() const { - return QString("None"); -} - -/** - * Get the molecular weight of THIS, based on the data from ELSTABLE. - */ -double SubUnit::getWeight(QDict<SubUnit>* elstable) const { - return -1; -} - -/** - * A group of elements. - */ -ElementList::ElementList () { - elements = new QList<ElementCoef>; -} - -ElementList::~ElementList () { - delete elements; -} - - -/** - * A group of elements. - */ -ElementList::ElementList (QString name) { - this->name = name; - elements = new QList<ElementCoef>; -} - -/** - * Write THIS to LINE, in a format suitable for the element definition file. - */ -void ElementList::writeOut(QString& line) { - QString coef; - line = "-group " + name; - ElementCoef* current = elements->first(); - while (current != 0) { - line += " " + current->name + " " + coef.setNum(current->coef, 'g', 10); - // precision set to 10 digits - current = elements->next(); - } -} - -/** - * Get the molecular weight of THIS, based on the data from ELSTABLE. - */ -double ElementList::getWeight(QDict<SubUnit>* elstable) const { - double weight = 0; - ElementCoef* current = elements->first(); - while (current != 0) { - SubUnit* e = elstable->find(current->name); - if (e != 0) { - weight += (current->coef) * (e->getWeight(elstable)); - } else return -1; //ERROR - current = elements->next(); - } - return weight; -} - -/** - * Return a string representing the elemental composition of THIS, as - * a tab-separated element - percentage pairs, separated by newlines. - */ -QString ElementList::getEA(QDict<SubUnit>* elstable, double mw) const { - if (mw == 0) mw = getWeight(elstable); - QString ea; - QString temp; - ElementCoef* current = elements->first(); - while (current != 0) { - SubUnit* e = elstable->find(current->name); - if (e != 0) { - double current_percent = 100 * (current->coef) * - (e->getWeight(elstable)) - / mw; - ea += current->name + "\t" + - temp.setNum(current_percent) + "\n"; - } else return QString("ERROR!\n"); //ERROR - current = elements->next(); - } - return ea; -} - -/** - * Return a string representing THIS as an empirical chemical formula. - */ -QString ElementList::getEmpFormula() const { - QString ef; - QString temp; - ElementCoef* current = elements->first(); - while (current != 0) { - ef += current->name + temp.setNum(current->coef); - current = elements->next(); - } - return ef; -} - -/** - * Multiply THIS (i.e. the coefficient of each element) by coef. - */ -void ElementList::multiplyBy(double coef) { - ElementCoef* current = elements->first(); - while (current != 0) { - (current->coef) *= coef; - current = elements->next(); - } -} - -/** - * Add THIS to ELS. THIS is not modified; ELS is. - */ -void ElementList::addTo(ElementList& els, double coef) { - ElementCoef* current = elements->first(); - while (current != 0) { - els.addElement(current->name, (current->coef) * coef); - current = elements->next(); - } -} - -/** - * Add an element to THIS, with a coefficient COEF. If THIS already contains - * an element with the same name, adjust its coefficient only; if not, create - * a new ElementCoef pair and add to THIS. - */ -void ElementList::addElement(const QString& name, double coef) { - ElementCoef* current = elements->first(); - while (current != 0) { - if (current->name == name) { - current->coef += coef; - return; - } - current = elements->next(); - } - elements->append(new ElementCoef(name, coef)); -} - -/** - * True iff THIS contains element named NAME. - */ -bool ElementList::contains(const QString& name) { - ElementCoef* current = elements->first(); - while (current != 0) { - if (current->name == name) - return true; - current = elements->next(); - } - return false; -} - -bool ElementList::isEmpty() { - return elements->isEmpty(); -} - -QString ElementList::getName() const { - return name; -} - -/** - * A chemical element. - */ -Element::Element(const QString& n, double w) - : weight(w), name(n) { } - - -Element::~Element() { -} - - -/** - * Write THIS to LINE, in a format suitable for the element definition file. - */ -void Element::writeOut(QString& line) { - line.setNum(weight); - line = name + " " + line; -} - -double Element::getWeight(QDict<SubUnit>* elstable) const { - return weight; -} - -void Element::addTo(ElementList& els, double coef) { - els.addElement(name, coef); -} - -QString Element::getName() const { - return name; -} - -/** - * An element - coefficient pair. Used to represent elements within an - * element list. - */ -ElementCoef::ElementCoef(const QString& n, double c) : name(n), coef(c) {} - diff --git a/noncore/apps/checkbook/kmolelements.h b/noncore/apps/checkbook/kmolelements.h deleted file mode 100644 index 06d1469..0000000 --- a/noncore/apps/checkbook/kmolelements.h +++ b/dev/null @@ -1,161 +0,0 @@ -/* - * kmolelements.h - * - * Copyright (C) 2000 Tomislav Gountchev <tomi@idiom.com> - */ - -// classes that store and manipulate chemical formulas represented as -// lists of elements - -#ifndef KMOLELEMENTS_H -#define KMOLELEMENTS_H - - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - - -#include <qlist.h> -#include <qdict.h> -#include <qstring.h> -#include <qtextstream.h> - -class ElementCoef; -class ElementList; - -/** - * A generic chemical entity. Can be an element or a group. - */ -class SubUnit { - public: - - SubUnit(); - - virtual ~SubUnit(); - - /** - * Construct a subunit and return a pointer to it. The syntax of LINE is - * the one used in the element definition file. - */ - static SubUnit* makeSubUnit(QString line); - - /** - * Get the molecular weight of THIS, based on the data from ELSTABLE. - */ - virtual double getWeight(QDict<SubUnit>* elstable) const; - - /** - * Add THIS to ELS. - */ - virtual void addTo(ElementList& els, double coef) = 0; - - virtual QString getName() const; - - /** - * Write THIS to LINE, in the format used in the definition file. - */ - virtual void writeOut(QString& line) = 0; -}; - - -/** - * A group of elements. - */ -class ElementList : public SubUnit { - public: - ElementList (); - ElementList (QString name); - virtual ~ElementList(); - double getWeight(QDict<SubUnit>* elstable) const; - - /** - * Return a string representing the elemental composition of THIS, as - * a tab-separated element - percentage pairs, separated by newlines. - */ - QString getEA(QDict<SubUnit>* elstable, double mw = 0) const; - - /** - * Return a string representing THIS as an empirical chemical formula. - */ - QString getEmpFormula() const; - - /** - * Multiply THIS (i.e. the coefficient of each element) by coef. - */ - void multiplyBy(double coef); - - /** - * Add THIS to ELS. THIS is not modified; ELS is. - */ - void addTo(ElementList& els, double coef); - - /** - * Add an element to THIS, with a coefficient COEF. - */ - void addElement(const QString& name, double coef); - - /** - * True iff THIS contains element named NAME. - */ - bool contains(const QString& name); - - - bool isEmpty(); - - /** - * The name of THIS, as a chemical group. - */ - QString getName() const; - - /** - * Write THIS to LINE, in a format suitable for the element definition file. - */ - void writeOut(QString& line); - - private: - QString name; - QList<ElementCoef>* elements; -}; - -/** - * A chemical element. - */ -class Element : public SubUnit { - public: - Element(const QString& name, double weight); - virtual ~Element(); - double getWeight(QDict<SubUnit>* elstable) const; - - /** - * Add THIS to ELS, with a coefficient COEF. - */ - void addTo(ElementList& els, double coef); - - QString getName() const; - - void writeOut(QString& line); - - private: - double weight; - QString name; -}; - - -/** - * An element - coefficient pair. Used to represent elements within an - * element list. - */ -class ElementCoef { - friend class ElementList; - public: - ElementCoef(const QString& name, double coef = 1.0); - private: - QString name; - double coef; -}; - - -#endif - - diff --git a/noncore/apps/checkbook/main.cpp b/noncore/apps/checkbook/main.cpp index 328b61f..68f00e6 100644 --- a/noncore/apps/checkbook/main.cpp +++ b/noncore/apps/checkbook/main.cpp @@ -1,13 +1,3 @@ -/*************************************************************************** - * * - * 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. * - * * - * ***********************************************************************/ - - #include <qpe/qpeapplication.h> -#include "oxygen.h" +#include "qcheckbook.h" @@ -15,7 +5,7 @@ int main(int argc, char **argv) { - QPEApplication app(argc, argv); - Oxygen *oxi = new Oxygen(); - app.setMainWidget(oxi); - oxi->showMaximized(); - return app.exec(); + QPEApplication app(argc, argv); + QCheckBook *qcb = new QCheckBook(); + app.setMainWidget(qcb); + qcb->showMaximized(); + return app.exec(); } diff --git a/noncore/apps/checkbook/moc_kmoledit.cpp b/noncore/apps/checkbook/moc_kmoledit.cpp deleted file mode 100644 index a94e93b..0000000 --- a/noncore/apps/checkbook/moc_kmoledit.cpp +++ b/dev/null @@ -1,95 +0,0 @@ -/**************************************************************************** -** KMolEdit meta object code from reading C++ file 'kmoledit.h' -** -** Created: Sun Sep 15 15:21:49 2002 -** by: The Qt MOC ($Id$) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#if !defined(Q_MOC_OUTPUT_REVISION) -#define Q_MOC_OUTPUT_REVISION 9 -#elif Q_MOC_OUTPUT_REVISION != 9 -#error "Moc format conflict - please regenerate all moc files" -#endif - -#include "kmoledit.h" -#include <qmetaobject.h> -#include <qapplication.h> - - - -const char *KMolEdit::className() const -{ - return "KMolEdit"; -} - -QMetaObject *KMolEdit::metaObj = 0; - -void KMolEdit::initMetaObject() -{ - if ( metaObj ) - return; - if ( qstrcmp(QDialog::className(), "QDialog") != 0 ) - badSuperclassWarning("KMolEdit","QDialog"); - (void) staticMetaObject(); -} - -#ifndef QT_NO_TRANSLATION - -QString KMolEdit::tr(const char* s) -{ - return qApp->translate( "KMolEdit", s, 0 ); -} - -QString KMolEdit::tr(const char* s, const char * c) -{ - return qApp->translate( "KMolEdit", s, c ); -} - -#endif // QT_NO_TRANSLATION - -QMetaObject* KMolEdit::staticMetaObject() -{ - if ( metaObj ) - return metaObj; - (void) QDialog::staticMetaObject(); -#ifndef QT_NO_PROPERTIES -#endif // QT_NO_PROPERTIES - typedef bool (KMolEdit::*m1_t0)(); - typedef bool (QObject::*om1_t0)(); - typedef void (KMolEdit::*m1_t1)(); - typedef void (QObject::*om1_t1)(); - typedef void (KMolEdit::*m1_t2)(); - typedef void (QObject::*om1_t2)(); - m1_t0 v1_0 = &KMolEdit::edit; - om1_t0 ov1_0 = (om1_t0)v1_0; - m1_t1 v1_1 = &KMolEdit::save; - om1_t1 ov1_1 = (om1_t1)v1_1; - m1_t2 v1_2 = &KMolEdit::undo; - om1_t2 ov1_2 = (om1_t2)v1_2; - QMetaData *slot_tbl = QMetaObject::new_metadata(3); - QMetaData::Access *slot_tbl_access = QMetaObject::new_metaaccess(3); - slot_tbl[0].name = "edit()"; - slot_tbl[0].ptr = (QMember)ov1_0; - slot_tbl_access[0] = QMetaData::Private; - slot_tbl[1].name = "save()"; - slot_tbl[1].ptr = (QMember)ov1_1; - slot_tbl_access[1] = QMetaData::Private; - slot_tbl[2].name = "undo()"; - slot_tbl[2].ptr = (QMember)ov1_2; - slot_tbl_access[2] = QMetaData::Private; - metaObj = QMetaObject::new_metaobject( - "KMolEdit", "QDialog", - slot_tbl, 3, - 0, 0, -#ifndef QT_NO_PROPERTIES - 0, 0, - 0, 0, -#endif // QT_NO_PROPERTIES - 0, 0 ); - metaObj->set_slot_access( slot_tbl_access ); -#ifndef QT_NO_PROPERTIES -#endif // QT_NO_PROPERTIES - return metaObj; -} diff --git a/noncore/apps/checkbook/opie-checkbook.control b/noncore/apps/checkbook/opie-checkbook.control index 9784206..23e21da 100644 --- a/noncore/apps/checkbook/opie-checkbook.control +++ b/noncore/apps/checkbook/opie-checkbook.control @@ -8,2 +8,2 @@ Depends: opie-base ($QPE_VERSION) Description: Checkbook keeping program. - The checkbook accounting program for the Opie environment. + The checbook accounting program for the Opie environment. diff --git a/noncore/apps/checkbook/opie-oxygen.control b/noncore/apps/checkbook/opie-oxygen.control deleted file mode 100644 index 4f84158..0000000 --- a/noncore/apps/checkbook/opie-oxygen.control +++ b/dev/null @@ -1,9 +0,0 @@ -Files: bin/oxygen apps/Applications/oxygencheckbook.desktop pics/oxygen/oxygen.png -Priority: optional -Section: applications -Maintainer: Carsten Niehaus <cniehaus@handhelds.org> -Architecture: arm -Version: $QPE_VERSION-$SUB_VERSION -Depends: opie-base ($QPE_VERSION) -Description: Periodic System of the Elements - The chemistry application for the Opie-environment diff --git a/noncore/apps/checkbook/oxygen.cpp b/noncore/apps/checkbook/oxygen.cpp deleted file mode 100644 index 81897e9..0000000 --- a/noncore/apps/checkbook/oxygen.cpp +++ b/dev/null @@ -1,53 +0,0 @@ -/*************************************************************************** - * * - * 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. * - * * - * ***********************************************************************/ -#include "oxygen.h" - -#include <qmenubar.h> -#include <qstatusbar.h> -#include <qpopupmenu.h> -#include <qlabel.h> -#include <qapplication.h> -#include <qpushbutton.h> -#include <qfile.h> -#include <qdir.h> -#include <qvbox.h> -#include "calcdlg.h" -#include "calcdlgui.h" - -Oxygen::Oxygen() - : QMainWindow() -{ - this->setCaption( "Oxygen" ); - vbox = new QVBox( this ); - QPushButton *setButton = new QPushButton( "Settings", vbox ); - connect ( setButton, SIGNAL( clicked() ), this, SLOT( slotSettings() ) ); - QPushButton *calcButton = new QPushButton( "Calculations", vbox ); - connect ( calcButton, SIGNAL( clicked() ), this, SLOT( slotCalculations() ) ); - QPushButton *pseButton = new QPushButton( "PSE", vbox ); - connect ( pseButton, SIGNAL( clicked() ), this, SLOT( slotPSE() ) ); - - setCentralWidget( vbox ); -} - - -void Oxygen::close() -{ - QApplication::exit(); -} - -//SLOTS - -void Oxygen::slotCalculations(){ - calcDlgUI *CalcDlgUI = new calcDlgUI(); - CalcDlgUI->show(); -}; - -void Oxygen::slotSettings(){ }; -void Oxygen::slotPSE(){ }; - diff --git a/noncore/apps/checkbook/oxygen.h b/noncore/apps/checkbook/oxygen.h deleted file mode 100644 index 1e923ee..0000000 --- a/noncore/apps/checkbook/oxygen.h +++ b/dev/null @@ -1,22 +0,0 @@ - -#include <qpe/resource.h> -#include <qmainwindow.h> -#include <qtoolbar.h> -#include <qstring.h> -#include <qpopupmenu.h> - -class QVBox; - -class Oxygen : public QMainWindow -{ - Q_OBJECT - - public: - Oxygen(); - QVBox *vbox; - private slots: - void slotCalculations(); - void slotSettings(); - void slotPSE(); - void close(); -}; diff --git a/noncore/apps/checkbook/oxygen.pro b/noncore/apps/checkbook/oxygen.pro deleted file mode 100644 index c5448e7..0000000 --- a/noncore/apps/checkbook/oxygen.pro +++ b/dev/null @@ -1,20 +0,0 @@ -TEMPLATE = app -CONFIG = qt warn_on release -HEADERS = oxygen.h \ - kmolcalc.h \ - kmolelements.h \ - calcdlgui.h - -SOURCES = main.cpp \ - oxygen.cpp \ - kmolcalc.cpp \ - calcdlgui.cpp \ - kmolelements.cpp -INCLUDEPATH += $(OPIEDIR)/include -DEPENDPATH += $(OPIEDIR)/include -LIBS += -lqpe -INTERFACES = calcdlg.ui -TARGET = oxygen -DESTDIR = $(OPIEDIR)/bin - -TRANSLATIONS = ../../../i18n/de/oxygen.ts diff --git a/noncore/apps/checkbook/qcheckbook.cpp b/noncore/apps/checkbook/qcheckbook.cpp new file mode 100644 index 0000000..bb7a5ac --- a/dev/null +++ b/noncore/apps/checkbook/qcheckbook.cpp @@ -0,0 +1,147 @@ +#include "qcheckbook.h" + +#include <qmenubar.h> +#include <qstatusbar.h> +#include <qpopupmenu.h> +#include <qapplication.h> +#include <qfile.h> +#include <qdir.h> + +QCheckBook::QCheckBook() + : QMainWindow(), + m_view(), + m_view2(), + m_view3() +{ + initCheck = false; + initMM = false; + setCaption("Checking"); + statusBar()->hide(); + menuBar()->hide(); + + bar = new QToolBar(this); + bar->setHorizontalStretchable( TRUE ); + + addToolBar(bar); + + Config config("qcheckbook"); + config.setGroup("Global"); + QString lastCheck = config.readEntry("LastCheckBook", QString("")); + + QString checkdirname = QDir::homeDirPath(); + checkdirname.append("/.checkbooks/"); + checkdirname.append(lastCheck); + QFile f(checkdirname); + + + if (lastCheck.isEmpty() == false && lastCheck != "" && f.exists() == true) + { + newCheck(lastCheck); + } else { + initMainMenus(); + } + + setToolBarsMovable( FALSE ); +} + +void QCheckBook::newCheck(const QString &filename) +{ + if (filename.isEmpty() == false) + { + initCheck = true; + if (m_view != 0) + { + m_view=0; + delete m_view; + } + m_view = new QCheckView(this, filename); + m_view->hide(); + connect(m_view, SIGNAL(reload(const QString &)), this, SLOT(newCheck(const QString &))); + if (initMM == true) + { + delete nb1; + } + bar->clear(); + mbar = new QMenuBar(bar); + mbar->setMargin(0); + + QPixmap newIcon = Resource::loadPixmap( "new" ); + nb2 = new QToolButton( newIcon, "New", QString::null, m_view, SLOT(newClicked()), bar, "new item" ); + QPixmap pixmap = Resource::loadPixmap( "pixmap" ); + m_filename = filename; + nb3 = new QToolButton( pixmap, "Graph", QString::null, this, SLOT(newGraph()), bar, "new graph" ); + + QPixmap closeIcon = Resource::loadPixmap( "close" ); + nb4 = new QToolButton( closeIcon, "Close", QString::null, this, SLOT(initMainMenus()), bar, "close graph" ); + + popup = new QPopupMenu(m_view); + popup->insertItem("&New Entry", m_view, SLOT(newClicked())); + popup->insertItem("&Graph Checkbook", this, SLOT(newGraph())); + popup->insertItem("&Close Checkbook", this, SLOT(initMainMenus())); + popup->insertItem("&Exit", this, SLOT(close())); + mbar->insertItem("&File", popup); + + setCentralWidget(m_view); + m_view->show(); + + Config config("qcheckbook"); + config.setGroup("Global"); + config.writeEntry("LastCheckBook", filename); + initMM = false; + } +} + +void QCheckBook::close() +{ + QApplication::exit(); +} + +void QCheckBook::newGraph() +{ + if (m_filename.isEmpty() == false) + { + m_view2 = new QCheckGraph(m_filename); + m_view2->showMaximized(); + } +} + +void QCheckBook::initMainMenus() +{ + Config config("qcheckbook"); + config.setGroup("Global"); + config.writeEntry("LastCheckBook", QString("")); + initMM = true; + m_filename = ""; + if (m_view3 != 0) + { + delete m_view3; + } + m_view3 = new QCheckMainMenu(this); + m_view3->hide(); + + if (initCheck == true) + { + delete nb2; + delete nb3; + delete nb4; + } + + bar->clear(); + + mbar = new QMenuBar(bar); + mbar->setMargin(0); + + QPixmap newIcon = Resource::loadPixmap( "new" ); + nb1 = new QToolButton( newIcon, "New", QString::null, m_view3, SLOT(newClicked()), bar, "new book" ); + + popup = new QPopupMenu(); + popup->insertItem("&New", m_view3, SLOT(newClicked())); + popup->insertItem("&Exit", this, SLOT(close())); + mbar->insertItem("&File", popup); + + setCentralWidget(m_view3); + m_view3->show(); + + connect(m_view3, SIGNAL(itemSelected(const QString &)), this, SLOT(newCheck(const QString &))); + initCheck = false; +} diff --git a/noncore/apps/checkbook/qcheckbook.h b/noncore/apps/checkbook/qcheckbook.h new file mode 100644 index 0000000..52c0d40 --- a/dev/null +++ b/noncore/apps/checkbook/qcheckbook.h @@ -0,0 +1,37 @@ +#include "qcheckview.h" +#include "qcheckgraph.h" +#include "qcheckmainmenu.h" + +#include <qpe/resource.h> +#include <qmainwindow.h> +#include <qtoolbar.h> +#include <qstring.h> +#include "config.h" +#include <qpopupmenu.h> + +class QCheckBook : public QMainWindow +{ + Q_OBJECT + public: + QCheckBook(); + private slots: + void newCheck(const QString &filename); + void newGraph(); + void close(); + void initMainMenus(); + private: + QCheckView *m_view; + QCheckGraph *m_view2; + QCheckMainMenu *m_view3; + QToolBar *bar; + QMenuBar *mbar; + int filemenuid; + QString m_filename; + QToolButton *nb1; + QToolButton *nb2; + QToolButton *nb3; + QToolButton *nb4; + bool initCheck; + bool initMM; + QPopupMenu *popup; +}; diff --git a/noncore/apps/checkbook/qcheckdetails.cpp b/noncore/apps/checkbook/qcheckdetails.cpp new file mode 100644 index 0000000..19a5e82 --- a/dev/null +++ b/noncore/apps/checkbook/qcheckdetails.cpp @@ -0,0 +1,119 @@ +#include "qcheckdetails.h" + +QCheckDetails::QCheckDetails(int row, int col, const QStringList item) + : QMainWindow(), + m_view() +{ + m_view = new QCheckDetailsBase(this); + setCentralWidget(m_view); + + m_row = row; + m_col = col; + + QToolBar *bar = new QToolBar(this); + bar->setHorizontalStretchable( TRUE ); + + QPixmap newIcon = Resource::loadPixmap( "edit" ); + QPixmap trashIcon = Resource::loadPixmap( "trash" ); + QToolButton *nb1 = new QToolButton( newIcon, "Edit", QString::null, this, SLOT(editCheck()), bar, "edit transaction" ); + QToolButton *nb2 = new QToolButton( trashIcon, "Delete", QString::null, this, SLOT(deleteCheck()), bar, "delete transaction" ); + addToolBar(bar); + + QString text = ""; + if (item[0] == "true") + { + text.append("<b>Payment</b> to <b>"); + text.append(item[1]); + } + if (item[0] == "false") + { + text.append("<b>Deposit</b> from <b>"); + text.append(item[1]); + } + text.append("</b> on <b>"); + text.append(item[7]); + text.append("</b> for <b>"); + text.append(QString("$" + item[5])); + + text.append("</b>, to make your balance <b>$"); + text.append(item[9]); + text.append("</b>."); + + text.append("<br><br>"); + text.append("<b>Category: </b>"); + text.append(item[2]); + text.append("<br>"); + text.append("<b>Type: </b>"); + + QString type = "No Type"; + if (item[0] == "true") + { + if(item[3] == "0") + { + type = "Debit Charge"; + } + if(item[3] == "1") + { + type = "Written Check"; + } + if(item[3] == "2") + { + type = "Transfer"; + } + if(item[3] == "3") + { + type = "Credit Card"; + } + } + + if (item[0] == "false") + { + if(item[3] == "0") + { + type = "Written Check"; + } + if(item[3] == "1") + { + type = "Automatic Payment"; + } + if(item[3] == "2") + { + type = "Transfer"; + } + if(item[3] == "3") + { + type = "Cash"; + } + } + + text.append(type); + text.append("<br>"); + if (item[4] != "0") + { + text.append("<b>Check Number: </b>"); + text.append(item[4]); + text.append("<br>"); + } + if (item[6] != ".00") + { + text.append("<b>Extra Fee: </b>"); + text.append(QString("$" + item[6])); + m_view->checkDetails->setText(text); + } + if (item[8] != "") + { + text.append("<br><b>Additional Comments: </b>"); + text.append(item[8]); + } + m_view->checkDetails->setText(text); +} + +void QCheckDetails::editCheck() +{ + emit editClicked(m_row, m_col); +} + +void QCheckDetails::deleteCheck() +{ + emit deleteClicked(m_row, m_col); +} diff --git a/noncore/apps/checkbook/qcheckdetails.h b/noncore/apps/checkbook/qcheckdetails.h new file mode 100644 index 0000000..fe5fe1a --- a/dev/null +++ b/noncore/apps/checkbook/qcheckdetails.h @@ -0,0 +1,27 @@ +#include "qcheckdetailsbase.h" +#include <qstring.h> +#include <qtextview.h> +#include <qtoolbar.h> +#include <qpe/resource.h> +#include <qpixmap.h> +#include <qdialog.h> +#include <qmainwindow.h> +#include <qtoolbutton.h> +#include <qwidget.h> + +class QCheckDetails : public QMainWindow +{ + Q_OBJECT + public: + QCheckDetails(int row, int col, const QStringList item); + signals: + void editClicked(int, int); + void deleteClicked(int, int); + public slots: + void editCheck(); + void deleteCheck(); + private: + int m_row; + int m_col; + QCheckDetailsBase *m_view; +}; diff --git a/noncore/apps/checkbook/qcheckdetailsbase.ui b/noncore/apps/checkbook/qcheckdetailsbase.ui new file mode 100644 index 0000000..d94ba5e --- a/dev/null +++ b/noncore/apps/checkbook/qcheckdetailsbase.ui @@ -0,0 +1,62 @@ +<!DOCTYPE UI><UI> +<class>QCheckDetailsBase</class> +<widget> + <class>QWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>QCheckDetailsBase</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>0</x> + <y>0</y> + <width>240</width> + <height>265</height> + </rect> + </property> + <property stdset="1"> + <name>caption</name> + <string>Transaction Details</string> + </property> + <grid> + <property stdset="1"> + <name>margin</name> + <number>4</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>0</number> + </property> + <widget row="0" column="0" > + <class>QTextView</class> + <property stdset="1"> + <name>name</name> + <cstring>checkDetails</cstring> + </property> + </widget> + </grid> +</widget> +<customwidgets> + <customwidget> + <class>QWidget</class> + <header location="global">qwidget.h</header> + <sizehint> + <width>-1</width> + <height>-1</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>5</hordata> + <verdata>5</verdata> + </sizepolicy> + <pixmap>image0</pixmap> + </customwidget> +</customwidgets> +<images> + <image> + <name>image0</name> + <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753</data> + </image> +</images> +</UI> diff --git a/noncore/apps/checkbook/qcheckentry.cpp b/noncore/apps/checkbook/qcheckentry.cpp new file mode 100644 index 0000000..2e8da1c --- a/dev/null +++ b/noncore/apps/checkbook/qcheckentry.cpp @@ -0,0 +1,256 @@ +#include "qcheckentry.h" + +QCheckEntry::QCheckEntry() + : QCheckEntryBase() +{ + connect(transAmount, SIGNAL(textChanged(const QString &)), this, SLOT(amountChanged(const QString &))); + connect(transFee, SIGNAL(textChanged(const QString &)), this, SLOT(transFeeChanged(const QString &))); + connect(payment, SIGNAL(clicked()), this, SLOT(paymentClicked())); + connect(deposit, SIGNAL(clicked()), this, SLOT(depositClicked())); + + QString todaysdate = QString::number(QDate::currentDate().month()); + todaysdate.append("/"); + todaysdate.append(QString::number(QDate::currentDate().day())); + todaysdate.append("/"); + todaysdate.append(QString::number(QDate::currentDate().year())); + dateEdit->setText(todaysdate); + + descriptionCombo->setFocus(); + + dateEdit->setValidChars("0123456789./-"); + dateEdit->setMaxLength(10); + + descriptionCombo->lineEdit()->setMaxLength(30); + + checkNumber->setValidChars("0123456789-"); + checkNumber->setMaxLength(10); + + transAmount->setValidChars("0123456789."); + + transFee->setMaxLength(5); + transFee->setValidChars("0123456789."); + setTabOrder(transType,checkNumber); + setTabOrder(checkNumber,transAmount); + setTabOrder(transAmount,transFee); + setTabOrder(transFee,dateEdit); + setTabOrder(dateEdit, additionalNotes ); +} + +void QCheckEntry::paymentClicked() +{ + cmbCategory->clear(); + cmbCategory->insertItem( tr( "Automobile" ) ); + cmbCategory->insertItem( tr( "Bills" ) ); + cmbCategory->insertItem( tr( "CDs" ) ); + cmbCategory->insertItem( tr( "Clothing" ) ); + cmbCategory->insertItem( tr( "Computer" ) ); + cmbCategory->insertItem( tr( "DVDs" ) ); + cmbCategory->insertItem( tr( "Eletronics" ) ); + cmbCategory->insertItem( tr( "Entertainment" ) ); + cmbCategory->insertItem( tr( "Food" ) ); + cmbCategory->insertItem( tr( "Gasoline" ) ); + cmbCategory->insertItem( tr( "Misc" ) ); + cmbCategory->insertItem( tr( "Movies" ) ); + cmbCategory->insertItem( tr( "Rent" ) ); + cmbCategory->insertItem( tr( "Travel" ) ); + cmbCategory->setCurrentItem( 0 ); + transType->clear(); + transType->insertItem( tr( "Debit Charge" ) ); + transType->insertItem( tr( "Written Check" ) ); + transType->insertItem( tr( "Transfer" ) ); + transType->insertItem( tr( "Credit Card" ) ); +} + +void QCheckEntry::depositClicked() +{ + cmbCategory->clear(); + cmbCategory->insertItem( tr( "Work" ) ); + cmbCategory->insertItem( tr( "Family Member" ) ); + cmbCategory->insertItem( tr( "Misc. Credit" ) ); + cmbCategory->setCurrentItem( 0 ); + transType->clear(); + transType->insertItem( tr( "Written Check" ) ); + transType->insertItem( tr( "Automatic Payment" ) ); + transType->insertItem( tr( "Transfer" ) ); + transType->insertItem( tr( "Cash" ) ); +} + +QStringList QCheckEntry::popupEntry(const QStringList &originaldata) +{ + QCheckEntry qce; + + // This is how the list looks: + // 0: true or false, true == payment, false == deposit + // 1: description of the transaction + // 2: category name + // 3: transaction type (stores the integer value of the index of the combobox) + // 4: check number of the transaction (if any) + // 5: transaction amount + // 6: transaction fee (e.g. service charge, or ATM charge). + // 7: date of the transaction + // 8: additional notes + // 9: recently used descriptions + if (originaldata.count() > 1) + { + if (originaldata[0] == "true") + { + qce.payment->setChecked(true); + qce.paymentClicked(); + } else { + if (originaldata[0] == "false") + { + qce.deposit->setChecked(true); + qce.depositClicked(); + } + } + qce.descriptionCombo->lineEdit()->setText(originaldata[1]); + qce.cmbCategory->lineEdit()->setText(originaldata[2]); + qce.transType->setCurrentItem(originaldata[3].toInt()); + qce.checkNumber->setText(originaldata[4]); + qce.transAmount->setText(originaldata[5]); + qce.transFee->setText(originaldata[6]); + qce.dateEdit->setText(originaldata[7]); + qce.additionalNotes->setText(originaldata[8]); + QStringList recentlist; + if (!originaldata[9].isEmpty()) + { + recentlist = QStringList::split(',', originaldata[9], false); + } + if (!recentlist.isEmpty()) + { + qce.descriptionCombo->insertStringList(recentlist); + } + } else { + QStringList recentlist; + if (!originaldata[0].isEmpty()) + { + recentlist = QStringList::split(',', originaldata[0], false); + } + if (!recentlist.isEmpty()) + { + qce.descriptionCombo->insertStringList(recentlist); + } + } + + qce.setWFlags(Qt::WType_Modal); + qce.showMaximized(); + + qce.descriptionCombo->lineEdit()->clear(); + + if (qce.exec() == QDialog::Accepted) + { + // Validate that the user has inputed a valid dollar amount + if (qce.transFee->text().contains('.') == 0) + { + QString text = qce.transFee->text(); + text.append(".00"); + qce.transFee->setText(text); + } else { + QString tmp = qce.transFee->text(); + if (tmp.mid(tmp.find('.'), tmp.length()).length() == 1) + { + tmp.append("00"); + qce.transFee->setText(tmp); + } else { + if (tmp.mid(tmp.find('.'), tmp.length()).length() == 2) + { + tmp.append("0"); + qce.transFee->setText(tmp); + } + } + } + if (qce.transAmount->text().contains('.') == 0) + { + QString text = qce.transAmount->text(); + text.append(".00"); + qce.transAmount->setText(text); + } else { + QString tmp = qce.transAmount->text(); + if (tmp.mid(tmp.find('.'), tmp.length()).length() == 1) + { + tmp.append("00"); + qce.transAmount->setText(tmp); + } else { + if (tmp.mid(tmp.find('.'), tmp.length()).length() == 2) + { + tmp.append("0"); + qce.transAmount->setText(tmp); + } + } + } + + QString recent; + if (qce.descriptionCombo->count() != 0) + { + QStringList recentlist = QStringList::split(',', originaldata[9], false); + if (recentlist.count() >= 10) + { + recentlist.remove(recentlist.last()); + } + recentlist.prepend(qce.descriptionCombo->lineEdit()->text()); + recent = recentlist.join(","); + } else { + recent = qce.descriptionCombo->lineEdit()->text(); + } + + QString checkNumberString = qce.checkNumber->text(); + if (checkNumberString.isEmpty() == true) + { + checkNumberString = "0"; + } + + QString paymentChecked = "true"; + if (qce.payment->isChecked() == false) + { + paymentChecked = "false"; + } + QStringList returnvalue; + returnvalue << paymentChecked << qce.descriptionCombo->lineEdit()->text() << qce.cmbCategory->lineEdit()->text() << QString::number(qce.transType->currentItem()) << checkNumberString << qce.transAmount->text() << qce.transFee->text() << qce.dateEdit->text() << qce.additionalNotes->text() << recent; + return returnvalue; + } else { + QStringList blank; + return blank; + } +} + +void QCheckEntry::transFeeChanged(const QString &input) +{ + QString tmpinput = input; + if (tmpinput.contains('.') > 1) + { + int first = tmpinput.find('.'); + tmpinput = tmpinput.remove(tmpinput.find('.', (first + 1)), 1); + } + if (tmpinput.contains(QRegExp("\\.[0-9][0-9]{2}$")) >= 1) + { + tmpinput = tmpinput.remove((tmpinput.length() - 1), 1); + } + transFee->setText(tmpinput); +} + +void QCheckEntry::amountChanged(const QString &input) +{ + QString tmpinput = input; + if (tmpinput.contains('.') > 1) + { + int first = tmpinput.find('.'); + tmpinput = tmpinput.remove(tmpinput.find('.', (first + 1)), 1); + } + if (tmpinput.contains(QRegExp("\\.[0-9][0-9]{2}$")) >= 1) + { + tmpinput = tmpinput.remove((tmpinput.length() - 1), 1); + } + transAmount->setText(tmpinput); +} + +void QCheckEntry::accept() +{ + // Does the description combo not have any text in it? Do something if it doesn't! + if (descriptionCombo->lineEdit()->text().isEmpty() == true) + { + QMessageBox::critical(this, "Field Missing.", "<qt>You didn't enter a description for this transaction. Please fill out the \"Transaction Description\" field and try again.</qt>"); + descriptionCombo->setFocus(); + return; + } + QDialog::accept(); +} diff --git a/noncore/apps/checkbook/qcheckentry.h b/noncore/apps/checkbook/qcheckentry.h new file mode 100644 index 0000000..f361bbf --- a/dev/null +++ b/noncore/apps/checkbook/qcheckentry.h @@ -0,0 +1,31 @@ +#include <qstring.h> +#include <qcombobox.h> +#include "qrestrictedline.h" +#include <qcombobox.h> +#include <qstringlist.h> +#include <qlabel.h> +#include <qmultilineedit.h> +#include "qcheckentrybase.h" +#include <qdialog.h> +#include <qregexp.h> +#include <qmessagebox.h> +#include <qwidget.h> +#include <qevent.h> +#include <qdatetime.h> +#include <qradiobutton.h> +#include "config.h" + +class QCheckEntry : public QCheckEntryBase +{ + Q_OBJECT + public: + QCheckEntry(); + static QStringList popupEntry(const QStringList &originaldata); + private slots: + void amountChanged(const QString &); + void transFeeChanged(const QString &); + void paymentClicked(); + void depositClicked(); + protected slots: + virtual void accept(); +}; diff --git a/noncore/apps/checkbook/qcheckentrybase.ui b/noncore/apps/checkbook/qcheckentrybase.ui new file mode 100644 index 0000000..efc35ff --- a/dev/null +++ b/noncore/apps/checkbook/qcheckentrybase.ui @@ -0,0 +1,610 @@ +<!DOCTYPE UI><UI> +<class>QCheckEntryBase</class> +<widget> + <class>QDialog</class> + <property stdset="1"> + <name>name</name> + <cstring>QCheckEntryBase</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>0</x> + <y>0</y> + <width>224</width> + <height>291</height> + </rect> + </property> + <property stdset="1"> + <name>caption</name> + <string>Account Transaction</string> + </property> + <property> + <name>layoutMargin</name> + </property> + <property> + <name>layoutSpacing</name> + </property> + <grid> + <property stdset="1"> + <name>margin</name> + <number>5</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>2</number> + </property> + <spacer row="7" column="8" rowspan="1" colspan="4" > + <property> + <name>name</name> + <cstring>Spacer3</cstring> + </property> + <property stdset="1"> + <name>orientation</name> + <enum>Horizontal</enum> + </property> + <property stdset="1"> + <name>sizeType</name> + <enum>Expanding</enum> + </property> + <property> + <name>sizeHint</name> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <spacer row="3" column="1" rowspan="1" colspan="4" > + <property> + <name>name</name> + <cstring>Spacer5</cstring> + </property> + <property stdset="1"> + <name>orientation</name> + <enum>Horizontal</enum> + </property> + <property stdset="1"> + <name>sizeType</name> + <enum>Expanding</enum> + </property> + <property> + <name>sizeHint</name> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget row="5" column="5" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel6</cstring> + </property> + <property stdset="1"> + <name>font</name> + <font> + <family>adobe-helvetica</family> + <bold>1</bold> + </font> + </property> + <property stdset="1"> + <name>text</name> + <string>$</string> + </property> + </widget> + <spacer row="4" column="6" > + <property> + <name>name</name> + <cstring>Spacer8</cstring> + </property> + <property stdset="1"> + <name>orientation</name> + <enum>Horizontal</enum> + </property> + <property stdset="1"> + <name>sizeType</name> + <enum>Expanding</enum> + </property> + <property> + <name>sizeHint</name> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget row="2" column="0" rowspan="1" colspan="3" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel2</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Category:</string> + </property> + </widget> + <spacer row="5" column="2" rowspan="1" colspan="3" > + <property> + <name>name</name> + <cstring>Spacer7</cstring> + </property> + <property stdset="1"> + <name>orientation</name> + <enum>Horizontal</enum> + </property> + <property stdset="1"> + <name>sizeType</name> + <enum>Expanding</enum> + </property> + <property> + <name>sizeHint</name> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <spacer row="5" column="11" > + <property> + <name>name</name> + <cstring>Spacer4</cstring> + </property> + <property stdset="1"> + <name>orientation</name> + <enum>Horizontal</enum> + </property> + <property stdset="1"> + <name>sizeType</name> + <enum>Expanding</enum> + </property> + <property> + <name>sizeHint</name> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <spacer row="2" column="3" rowspan="1" colspan="2" > + <property> + <name>name</name> + <cstring>Spacer6</cstring> + </property> + <property stdset="1"> + <name>orientation</name> + <enum>Horizontal</enum> + </property> + <property stdset="1"> + <name>sizeType</name> + <enum>Expanding</enum> + </property> + <property> + <name>sizeHint</name> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget row="5" column="6" rowspan="1" colspan="5" > + <class>QRestrictedLine</class> + <property stdset="1"> + <name>name</name> + <cstring>transAmount</cstring> + </property> + </widget> + <widget row="1" column="0" rowspan="1" colspan="5" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel1</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Description:</string> + </property> + </widget> + <widget row="3" column="0" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel3</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Type:</string> + </property> + </widget> + <widget row="5" column="0" rowspan="1" colspan="2" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel5</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Amount:</string> + </property> + </widget> + <widget row="2" column="5" rowspan="1" colspan="7" > + <class>QComboBox</class> + <item> + <property> + <name>text</name> + <string>Automobile</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>Bills</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>CDs</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>Clothing</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>Computer</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>DVDs</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>Eletronics</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>Entertainment</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>Food</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>Gasoline</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>Misc</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>Movies</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>Rent</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>Travel</string> + </property> + </item> + <property stdset="1"> + <name>name</name> + <cstring>cmbCategory</cstring> + </property> + <property stdset="1"> + <name>editable</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>currentItem</name> + <number>0</number> + </property> + <property stdset="1"> + <name>autoCompletion</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>duplicatesEnabled</name> + <bool>false</bool> + </property> + </widget> + <widget row="4" column="0" rowspan="1" colspan="6" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel4</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Check Number:</string> + </property> + </widget> + <widget row="6" column="4" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel6_2</cstring> + </property> + <property stdset="1"> + <name>font</name> + <font> + <family>adobe-helvetica</family> + <bold>1</bold> + </font> + </property> + <property stdset="1"> + <name>text</name> + <string>$</string> + </property> + </widget> + <widget row="6" column="5" rowspan="1" colspan="4" > + <class>QRestrictedLine</class> + <property stdset="1"> + <name>name</name> + <cstring>transFee</cstring> + </property> + </widget> + <widget row="6" column="0" rowspan="1" colspan="4" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel7</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Extra Fee:</string> + </property> + </widget> + <widget row="7" column="0" rowspan="1" colspan="8" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel8</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Additional Notes:</string> + </property> + </widget> + <widget row="1" column="5" rowspan="1" colspan="7" > + <class>QComboBox</class> + <property stdset="1"> + <name>name</name> + <cstring>descriptionCombo</cstring> + </property> + <property stdset="1"> + <name>editable</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>maxCount</name> + <number>10</number> + </property> + <property stdset="1"> + <name>insertionPolicy</name> + <enum>BeforeCurrent</enum> + </property> + <property stdset="1"> + <name>autoCompletion</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>duplicatesEnabled</name> + <bool>false</bool> + </property> + </widget> + <widget row="6" column="9" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel9</cstring> + </property> + <property stdset="1"> + <name>minimumSize</name> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property stdset="1"> + <name>maximumSize</name> + <size> + <width>32767</width> + <height>32767</height> + </size> + </property> + <property stdset="1"> + <name>caption</name> + <string></string> + </property> + <property stdset="1"> + <name>text</name> + <string>Date:</string> + </property> + </widget> + <widget row="6" column="10" rowspan="1" colspan="2" > + <class>QRestrictedLine</class> + <property stdset="1"> + <name>name</name> + <cstring>dateEdit</cstring> + </property> + </widget> + <widget row="4" column="7" rowspan="1" colspan="5" > + <class>QRestrictedLine</class> + <property stdset="1"> + <name>name</name> + <cstring>checkNumber</cstring> + </property> + </widget> + <widget row="3" column="5" rowspan="1" colspan="7" > + <class>QComboBox</class> + <item> + <property> + <name>text</name> + <string>Debit Charge</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>Written Check</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>Transfer</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>Credit Card</string> + </property> + </item> + <property stdset="1"> + <name>name</name> + <cstring>transType</cstring> + </property> + </widget> + <widget row="8" column="0" rowspan="1" colspan="12" > + <class>QMultiLineEdit</class> + <property stdset="1"> + <name>name</name> + <cstring>additionalNotes</cstring> + </property> + </widget> + <widget row="0" column="0" rowspan="1" colspan="12" > + <class>QButtonGroup</class> + <property stdset="1"> + <name>name</name> + <cstring>ButtonGroup3</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>7</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>title</name> + <string></string> + </property> + <property> + <name>layoutMargin</name> + </property> + <property> + <name>layoutSpacing</name> + </property> + <grid> + <property stdset="1"> + <name>margin</name> + <number>4</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>0</number> + </property> + <widget row="0" column="1" > + <class>QRadioButton</class> + <property stdset="1"> + <name>name</name> + <cstring>deposit</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>text</name> + <string>Deposit</string> + </property> + </widget> + <widget row="0" column="0" > + <class>QRadioButton</class> + <property stdset="1"> + <name>name</name> + <cstring>payment</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>text</name> + <string>Payment</string> + </property> + <property stdset="1"> + <name>checked</name> + <bool>true</bool> + </property> + </widget> + </grid> + </widget> + </grid> +</widget> +<customwidgets> + <customwidget> + <class>QRestrictedLine</class> + <header location="local">qrestrictedline.h</header> + <sizehint> + <width>-1</width> + <height>-1</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>5</hordata> + <verdata>5</verdata> + </sizepolicy> + <pixmap>image0</pixmap> + </customwidget> +</customwidgets> +<images> + <image> + <name>image0</name> + <data format="XPM.GZ" length="649">789c6dd23b0ec2300c00d03da7b0e22d42e9476c88232031222186c80c3074813220c4dd214dddd84dac0e759fe2386e1a07a7e3015c639e6318ef04740b0f70d7d730bccf97fdc7d8be87f8406737c62210606869dbb531f531a57f4a299d03a7e06c11cca1055508412c2889acc2ef425423b34840a645f28244936860d2c265d7923bae8b2f05cb35a91739002d2b5727d535cbe954a43ad1e22f700755caf7407cf4799fe286c47dbe3bf303014167a2</data> + </image> +</images> +<tabstops> + <tabstop>payment</tabstop> + <tabstop>descriptionCombo</tabstop> + <tabstop>cmbCategory</tabstop> + <tabstop>transType</tabstop> + <tabstop>additionalNotes</tabstop> +</tabstops> +</UI> diff --git a/noncore/apps/checkbook/qcheckgraph.cpp b/noncore/apps/checkbook/qcheckgraph.cpp new file mode 100644 index 0000000..5b21ad8 --- a/dev/null +++ b/noncore/apps/checkbook/qcheckgraph.cpp @@ -0,0 +1,258 @@ +#include "qcheckgraph.h" + +#include <qpainter.h> +#include <qmessagebox.h> +#include <qfontmetrics.h> +#include <qdir.h> +#include <qfile.h> +#include <qstringlist.h> +#include <qdatetime.h> +#include <qmenubar.h> +#include <qpopupmenu.h> + +QCheckGraph::QCheckGraph(const QString filename) + : QCheckGraphBase() +{ + QMenuBar *bar = new QMenuBar(this); + bar->setMargin(0); + QPopupMenu *popup = new QPopupMenu; + popup->insertItem("&Save Graph...", this, SLOT(saveGraphAsPicture())); + bar->insertItem("&File", popup); + + pixmapready = false; + config = new Config(filename, Config::File); + QString forresult = ""; + QString forresult2 = ""; + int i = 1; + for (; forresult != "Not Found"; i++) + { + config->setGroup(QString::number(i)); + forresult = config->readEntry("Description", QString("Not Found")); + forresult2 = config->readEntry("Category", QString("Not Found")); + if (forresult != "Not Found") + { + if (list.contains(forresult2) == 0) + { + config->setGroup("Totals"); + QString larger = config->readEntry("Spent", QString("no")); + QString smaller = config->readEntry(forresult2, QString("no")); + if (larger != "no" && smaller != "no") + { + list << forresult2; + QString percentage = calculator(smaller, larger, true); + + // Here we calculate how many pixels tall it will be by multiplying it by 200. + QString pixels = calculator(percentage, QString("200"), false); + + // This is done because it really doesn't need to have a decimal... just an int, and + // QString rounds doubles up to the nearest whole number in order to convert + // to an int (which is correct). + pixels = pixels.remove(pixels.find('.'), pixels.length()); + + if (pixels.toInt() <= 5) + { + pixels = "6"; + } + + list2 << pixels; + } + } + } else { + continue; + } + // We want to break this loop on the 7th (remember, starts at 0->6 == 7) item. + if (list.count() == 6) + { + break; + } + } + for (QStringList::Iterator it = list.begin(); it != list.end(); it++) + { + if ((*it).length() > 11) + { + (*it).truncate(8); + (*it).append("..."); + } + } + graphPixmap(); +} + +void QCheckGraph::graphPixmap() +{ + pixmapready = false; + graph = QPixmap(240,250); + QPainter p; + p.begin(&graph); + p.fillRect(0, 0, 240, 300, QColor(255,255,255)); + // Draw the graph lines + + // Y + p.drawLine( 40, 50, 40, 252 ); + + // X + p.drawLine( 40, 252, 203, 252 ); + + // Y stepup lines + p.drawLine( 40, 50, 37, 50); + p.drawLine( 40, 70, 37, 70); + p.drawLine( 40, 90, 37, 90); + p.drawLine( 40, 110, 37, 110); + p.drawLine( 40, 130, 37, 130); + p.drawLine( 40, 150, 37, 150); + p.drawLine( 40, 170, 37, 170); + p.drawLine( 40, 190, 37, 190); + p.drawLine( 40, 210, 37, 210); + p.drawLine( 40, 230, 37, 230); + p.drawLine( 40, 245, 37, 245); + + + // Y stepup values + p.drawText((35 - p.fontMetrics().width("100")), (50 + (p.fontMetrics().height() / 2)), "100"); + p.drawText((35 - p.fontMetrics().width("90")), (70 + (p.fontMetrics().height() / 2)), "90"); + p.drawText((35 - p.fontMetrics().width("80")), (90 + (p.fontMetrics().height() / 2)), "80"); + p.drawText((35 - p.fontMetrics().width("70")), (110 + (p.fontMetrics().height() / 2)), "70"); + p.drawText((35 - p.fontMetrics().width("60")), (130 + (p.fontMetrics().height() / 2)), "60"); + p.drawText((35 - p.fontMetrics().width("50")), (150 + (p.fontMetrics().height() / 2)), "50"); + p.drawText((35 - p.fontMetrics().width("40")), (170 + (p.fontMetrics().height() / 2)), "40"); + p.drawText((35 - p.fontMetrics().width("30")), (190 + (p.fontMetrics().height() / 2)), "30"); + p.drawText((35 - p.fontMetrics().width("20")), (210 + (p.fontMetrics().height() / 2)), "20"); + p.drawText((35 - p.fontMetrics().width("10")), (230 + (p.fontMetrics().height() / 2)), "10"); + p.drawText((35 - p.fontMetrics().width("<10")), (245 + (p.fontMetrics().height() / 2)), "<10"); + + // Draw the axis[sic?] labels + QString ylabel = "Percentage"; + int pixel = 100; + for (unsigned int i = 0; i != ylabel.length(); i++) + { + p.setBrush(QColor(0,0,0)); + p.drawText(5,pixel, QString(ylabel[i])); + pixel = pixel + p.fontMetrics().height(); + } + p.drawText(95, 265, "Category"); + + int i = 0; + // Hack: Using if()'s... switch was acting all wierd :{ + QStringList::Iterator it2 = list2.begin(); + for (QStringList::Iterator it = list.begin(); it != list.end(); it++) + { + qWarning(QString::number(i)); + if (i ==0) + { + // For the color code: + p.setBrush(QColor(255,0,0)); + p.drawRect(8,12, 8, 8); + + // Now the text: + p.setBrush(QColor(0,0,0)); + p.drawText(18,20, (*it)); + + // Last, but not least, we have the actual bar graph height. + p.setBrush(QColor(255,0,0)); + p.drawRect(47, ((202 - (*it2).toInt()) + 50), 15, (*it2).toInt()); + } + if (i ==1) + { + p.setBrush(QColor(255,255,0)); + p.drawRect(78,12, 8, 8); + + p.setBrush(QColor(0,0,0)); + p.drawText(88,20, (*it)); + + p.setBrush(QColor(255,255,0)); + p.drawRect(70, ((202 - (*it2).toInt()) + 50), 15, (*it2).toInt()); + } + if (i==2) + { + p.setBrush(QColor(0,255,0)); + p.drawRect(153,12, 8, 8); + p.setBrush(QColor(0,0,0)); + p.drawText(163,20, (*it)); + + p.setBrush(QColor(0,255,0)); + p.drawRect(98, ((202 - (*it2).toInt()) + 50), 15, (*it2).toInt()); + } + if (i==3) + { + p.setBrush(QColor(89,12,54)); + p.drawRect(8,27, 8, 8); + p.setBrush(QColor(0,0,0)); + p.drawText(18,35, (*it)); + + p.setBrush(QColor(89,12,54)); + p.drawRect(126, ((202 - (*it2).toInt()) + 50), 15, (*it2).toInt()); + } + if (i==4) + { + p.setBrush(QColor(0,0,255)); + p.drawRect(78,27, 8, 8); + p.setBrush(QColor(0,0,0)); + p.drawText(88,35, (*it)); + p.setBrush(QColor(0,0,255)); + p.drawRect(154, ((202 - (*it2).toInt()) + 50), 15, (*it2).toInt()); + } + if (i==5) + { + p.setBrush(QColor(100,40,0)); + p.drawRect(153,27, 8, 8); + p.setBrush(QColor(0,0,0)); + p.drawText(163,35, (*it)); + p.setBrush(QColor(100,40,0)); + p.drawRect(182, ((202 - (*it2).toInt()) + 50), 15, (*it2).toInt()); + } + i++; + it2++; + } + + p.end(); + pixmapready = true; + graphWidget->setBackgroundPixmap(graph); +} + +QString QCheckGraph::calculator(QString largervalue, QString smallervalue, bool divide) +{ +// largervalue = largervalue.remove(largervalue.find(".", 0, false), 1); +// smallervalue = smallervalue.remove(smallervalue.find(".", 0, false), 1); + + double largercents = largervalue.toDouble(); + double smallercents = smallervalue.toDouble(); + + double finalammount = 0; + + if (divide == true) + { + finalammount = (largercents / smallercents); + } else { + finalammount = (largercents * smallercents); + } + + qWarning(QString::number(finalammount)); + + return QString::number(finalammount); +} + +/*void QCheckGraph::paintEvent(QPaintEvent *e) +{ + if (pixmapready == true) + { + bitBlt((QPaintDevice *)(graphWidget), 0, 0, graph, 0,0); + QWidget::paintEvent(e); + } +} +*/ +void QCheckGraph::saveGraphAsPicture() +{ + QString homedir = QDir::homeDirPath(); + QDate current = QDate::currentDate(); + QString datestring = QString::number(current.month()); + datestring.append(QString::number(current.day())); + datestring.append(QString::number(current.year())); + QString filename = homedir; + filename.append("/Documents/graph"); + filename.append(datestring); + filename.append(".png"); + graph.save(filename, "PNG", 85); + QString graphmessage = "<qt>The graph was saved as graph"; + graphmessage.append(datestring); + graphmessage.append(".png. You may access it by returning to your home screen and clicking on the \"Documents\" tab in the upper right hand screen</qt>"); + QMessageBox::information(0, "File Saved", graphmessage); +} diff --git a/noncore/apps/checkbook/qcheckgraph.h b/noncore/apps/checkbook/qcheckgraph.h new file mode 100644 index 0000000..1cafef8 --- a/dev/null +++ b/noncore/apps/checkbook/qcheckgraph.h @@ -0,0 +1,25 @@ +#include <qstring.h> +#include <qmainwindow.h> +#include <qwidget.h> +#include <qstringlist.h> +#include <qpixmap.h> +#include "config.h" + +#include "qcheckgraphbase.h" + +class QCheckGraph : public QCheckGraphBase +{ + Q_OBJECT + public: + QCheckGraph(const QString); + private: + QStringList list; + QStringList list2; + QString calculator(QString larger, QString smaller, bool divide); + QPixmap graph; + void graphPixmap(); + bool pixmapready; + Config *config; + private slots: + void saveGraphAsPicture(); +}; diff --git a/noncore/apps/checkbook/qcheckgraphbase.ui b/noncore/apps/checkbook/qcheckgraphbase.ui new file mode 100644 index 0000000..2763839 --- a/dev/null +++ b/noncore/apps/checkbook/qcheckgraphbase.ui @@ -0,0 +1,62 @@ +<!DOCTYPE UI><UI> +<class>QCheckGraphBase</class> +<widget> + <class>QDialog</class> + <property stdset="1"> + <name>name</name> + <cstring>QCheckGraphBase</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>0</x> + <y>0</y> + <width>236</width> + <height>285</height> + </rect> + </property> + <property stdset="1"> + <name>caption</name> + <string>Account Graph</string> + </property> + <grid> + <property stdset="1"> + <name>margin</name> + <number>0</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>0</number> + </property> + <widget row="0" column="0" > + <class>QWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>graphWidget</cstring> + </property> + </widget> + </grid> +</widget> +<customwidgets> + <customwidget> + <class>QWidget</class> + <header location="global">qwidget.h</header> + <sizehint> + <width>-1</width> + <height>-1</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>5</hordata> + <verdata>5</verdata> + </sizepolicy> + <pixmap>image0</pixmap> + </customwidget> +</customwidgets> +<images> + <image> + <name>image0</name> + <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753</data> + </image> +</images> +</UI> diff --git a/noncore/apps/checkbook/qcheckmainmenu.cpp b/noncore/apps/checkbook/qcheckmainmenu.cpp new file mode 100644 index 0000000..2382513 --- a/dev/null +++ b/noncore/apps/checkbook/qcheckmainmenu.cpp @@ -0,0 +1,74 @@ +#include "qcheckmainmenu.h" +#include "qcheckname.h" + +QCheckMainMenu::QCheckMainMenu(QWidget *parent) + : QCheckMMBase(parent) +{ + init(); +} + +void QCheckMainMenu::init() +{ + lstCheckBooks->clear(); + QString checkdirname = QDir::homeDirPath(); + checkdirname.append("/.checkbooks"); + QDir checkdir(checkdirname); + if (checkdir.exists() == true) + { + QStringList checkbooks = checkdir.entryList("*.qcb", QDir::Files|QDir::Readable|QDir::Writable, QDir::Time); + for (QStringList::Iterator it = checkbooks.begin(); it != checkbooks.end(); it++) + { + (*it) = (*it).remove((*it).find('.'), (*it).length()); + } + lstCheckBooks->insertStringList(checkbooks); + } + lstCheckBooks->clearSelection(); + connect(lstCheckBooks, SIGNAL(clicked(QListBoxItem *)), this, SLOT(slotSelected(QListBoxItem *))); + lstCheckBooks->clearSelection(); +} + +void QCheckMainMenu::slotSelected(QListBoxItem *item) +{ + if (item != 0) + { + QString text = item->text(); + if (text.isEmpty() == false) + { + text.append(".qcb"); + QString checkdirname = QDir::homeDirPath(); + checkdirname.append("/.checkbooks/"); + text.prepend(checkdirname); + emit itemSelected(text); + } + } +} + +void QCheckMainMenu::newClicked() +{ + QString checkname = QCheckName::getName(); + if (checkname.isEmpty() == false) + { + QString checkdirname = QDir::homeDirPath(); + checkdirname.append("/.checkbooks"); + QDir checkdir(checkdirname); + if (checkdir.exists() == false) + { + checkdir.mkdir(checkdirname); + } + checkdirname.append("/"); + checkdirname.append(checkname); + checkdirname.append(".qcb"); + QFile file(checkdirname); + if (file.exists() == false) + { + file.open(IO_WriteOnly); + QTextStream os(&file); + os << ""; + file.close(); + } + QFileInfo fi(file); + QString noextension = fi.fileName(); + noextension = noextension.remove(noextension.find('.'), noextension.length()); + lstCheckBooks->insertItem(noextension); + } +} diff --git a/noncore/apps/checkbook/qcheckmainmenu.h b/noncore/apps/checkbook/qcheckmainmenu.h new file mode 100644 index 0000000..456d3df --- a/dev/null +++ b/noncore/apps/checkbook/qcheckmainmenu.h @@ -0,0 +1,27 @@ +#include <qwidget.h> +#include <qtoolbutton.h> +#include <qpopupmenu.h> +#include <qfile.h> +#include <qdir.h> +#include <qtextstream.h> +#include <qstring.h> +#include <qlistbox.h> +#include <qmessagebox.h> + +#include "qcheckmmbase.h" + +class QCheckMainMenu : public QCheckMMBase +{ + Q_OBJECT + public: + QCheckMainMenu(QWidget *); + signals: + void itemSelected(const QString &); + private: + void init(); + private slots: + void slotSelected(QListBoxItem *); + public slots: + void newClicked(); +}; + diff --git a/noncore/apps/checkbook/qcheckmmbase.ui b/noncore/apps/checkbook/qcheckmmbase.ui new file mode 100644 index 0000000..efde990 --- a/dev/null +++ b/noncore/apps/checkbook/qcheckmmbase.ui @@ -0,0 +1,80 @@ +<!DOCTYPE UI><UI> +<class>QCheckMMBase</class> +<widget> + <class>QWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>QCheckMMBase</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>0</x> + <y>0</y> + <width>256</width> + <height>311</height> + </rect> + </property> + <property stdset="1"> + <name>caption</name> + <string>Main Menu</string> + </property> + <grid> + <property stdset="1"> + <name>margin</name> + <number>7</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>3</number> + </property> + <widget row="0" column="0" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel2</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Select from the check books below or click the "New" icon in the toolbar.</string> + </property> + <property stdset="1"> + <name>alignment</name> + <set>WordBreak|AlignVCenter|AlignLeft</set> + </property> + <property> + <name>wordwrap</name> + </property> + </widget> + <widget row="1" column="0" > + <class>QListBox</class> + <property stdset="1"> + <name>name</name> + <cstring>lstCheckBooks</cstring> + </property> + </widget> + </grid> +</widget> +<customwidgets> + <customwidget> + <class>QWidget</class> + <header location="global">qwidget.h</header> + <sizehint> + <width>-1</width> + <height>-1</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>5</hordata> + <verdata>5</verdata> + </sizepolicy> + <pixmap>image0</pixmap> + </customwidget> +</customwidgets> +<images> + <image> + <name>image0</name> + <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753</data> + </image> +</images> +</UI> diff --git a/noncore/apps/checkbook/qcheckname.cpp b/noncore/apps/checkbook/qcheckname.cpp new file mode 100644 index 0000000..0e4d71c --- a/dev/null +++ b/noncore/apps/checkbook/qcheckname.cpp @@ -0,0 +1,36 @@ +#include "qcheckname.h" +#include <qmessagebox.h> +#include <qdialog.h> +#include <qpushbutton.h> +#include <qlineedit.h> +#include "qrestrictedline.h" + +QCheckName::QCheckName() + : QCheckNameBase() +{ + connect(cmdDone, SIGNAL(clicked()), this, SLOT(clicked())); +} + +QString QCheckName::getName() +{ + QCheckName qcn; + qcn.setWFlags(Qt::WType_Modal); + qcn.leText->setValidChars("abcdefghijklmnopqrstuvwxyz0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + if (qcn.exec() == QDialog::Accepted) + { + return qcn.leText->text(); + } else { + return QString(""); + } +} + +void QCheckName::clicked() +{ + if (leText->text().isEmpty() == false) + { + hide(); + accept(); + } else { + QMessageBox::critical(this, "Missing Information", "<qt>Please enter the name of your Check Book and try again.</qt>"); + } +} diff --git a/noncore/apps/checkbook/qcheckname.h b/noncore/apps/checkbook/qcheckname.h new file mode 100644 index 0000000..c47c4f9 --- a/dev/null +++ b/noncore/apps/checkbook/qcheckname.h @@ -0,0 +1,15 @@ +#include "qchecknamebase.h" +#include <qstring.h> +#include <qwidget.h> + +class QCheckName : public QCheckNameBase +{ + Q_OBJECT + public: + QCheckName(); + static QString getName(); + private: + QWidget *m_parent; + private slots: + void clicked(); +}; diff --git a/noncore/apps/checkbook/qchecknamebase.ui b/noncore/apps/checkbook/qchecknamebase.ui new file mode 100644 index 0000000..b9bda19 --- a/dev/null +++ b/noncore/apps/checkbook/qchecknamebase.ui @@ -0,0 +1,136 @@ +<!DOCTYPE UI><UI> +<class>QCheckNameBase</class> +<widget> + <class>QDialog</class> + <property stdset="1"> + <name>name</name> + <cstring>QCheckNameBase</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>0</x> + <y>0</y> + <width>228</width> + <height>108</height> + </rect> + </property> + <property stdset="1"> + <name>caption</name> + <string>Check Book Name</string> + </property> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel3</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>10</x> + <y>5</y> + <width>70</width> + <height>16</height> + </rect> + </property> + <property stdset="1"> + <name>font</name> + <font> + <family>BDF-helvetica</family> + <pointsize>19</pointsize> + <bold>1</bold> + </font> + </property> + <property stdset="1"> + <name>text</name> + <string>Name...</string> + </property> + </widget> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel4</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>10</x> + <y>25</y> + <width>210</width> + <height>25</height> + </rect> + </property> + <property stdset="1"> + <name>text</name> + <string>Please name your check book (limit: 15 characters):</string> + </property> + <property stdset="1"> + <name>alignment</name> + <set>WordBreak|AlignVCenter|AlignLeft</set> + </property> + <property> + <name>wordwrap</name> + </property> + </widget> + <widget> + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdDone</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>75</x> + <y>80</y> + <width>75</width> + <height>25</height> + </rect> + </property> + <property stdset="1"> + <name>text</name> + <string>&Done</string> + </property> + </widget> + <widget> + <class>QRestrictedLine</class> + <property stdset="1"> + <name>name</name> + <cstring>leText</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>5</x> + <y>51</y> + <width>216</width> + <height>25</height> + </rect> + </property> + </widget> +</widget> +<customwidgets> + <customwidget> + <class>QRestrictedLine</class> + <header location="local">qrestrictedline.h</header> + <sizehint> + <width>-1</width> + <height>-1</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>5</hordata> + <verdata>5</verdata> + </sizepolicy> + <pixmap>image0</pixmap> + </customwidget> +</customwidgets> +<images> + <image> + <name>image0</name> + <data format="XPM.GZ" length="649">789c6dd23b0ec2300c00d03da7b0e22d42e9476c88232031222186c80c3074813220c4dd214dddd84dac0e759fe2386e1a07a7e3015c639e6318ef04740b0f70d7d730bccf97fdc7d8be87f8406737c62210606869dbb531f531a57f4a299d03a7e06c11cca1055508412c2889acc2ef425423b34840a645f28244936860d2c265d7923bae8b2f05cb35a91739002d2b5727d535cbe954a43ad1e22f700755caf7407cf4799fe286c47dbe3bf303014167a2</data> + </image> +</images> +</UI> diff --git a/noncore/apps/checkbook/qcheckview.cpp b/noncore/apps/checkbook/qcheckview.cpp new file mode 100644 index 0000000..ddc3fa9 --- a/dev/null +++ b/noncore/apps/checkbook/qcheckview.cpp @@ -0,0 +1,458 @@ +#include "qcheckview.h" + +#include <qpe/resource.h> +#include <qregexp.h> +#include <qlineedit.h> +#include <qradiobutton.h> +#include <qcombobox.h> +#include <qapplication.h> +#include <qpushbutton.h> +#include <qdir.h> +#include <qlabel.h> +#include <qdatetime.h> +#include <qmessagebox.h> +#include <qcheckbox.h> +#include <qfile.h> +#include <qtextstream.h> +#include <qbuttongroup.h> +#include <qradiobutton.h> +#include <qheader.h> + +QCheckView::QCheckView(QWidget *parent, QString filename) + : QCheckViewBase(parent) +{ + tblTransactions->setHScrollBarMode( QTable::AlwaysOff ); + tblTransactions->setNumRows( 0 ); + tblTransactions->setNumCols( 4 ); + tblTransactions->setShowGrid( FALSE ); + tblTransactions->horizontalHeader()->setLabel(0, "Num", 29); + tblTransactions->horizontalHeader()->setLabel(1, "Description", 81); + tblTransactions->horizontalHeader()->setLabel(2, "Date", 57); + tblTransactions->horizontalHeader()->setLabel(3, "Amount", 59); + tblTransactions->verticalHeader()->hide(); + tblTransactions->setLeftMargin( 0 ); + tblTransactions->setSelectionMode(QTable::NoSelection); + + m_filename = filename; + load(filename); +} + +void QCheckView::deleteClicked(int row, int col) +{ + QStringList existing; + QString rowText = tblTransactions->text(row, 0); + config->setGroup(rowText); + QString originalamount = config->readEntry("Amount", "0.00"); + + config->setGroup("Data"); + int lastCheck = config->readNumEntry("LastCheck", 0); + + qWarning(rowText); + config->setGroup(rowText); + QString payment = config->readEntry("Payment", "true"); + if ( payment == QString("true") && rowText.toInt() <= lastCheck) + { + for(int i = row; i != (lastCheck); i++) + { + config->setGroup(tblTransactions->text(i, 0)); + QString ibalance = config->readEntry("Balance", "0.00"); + // this adds the old amount on to the transaction and then takes the new amount away + QString newbalance = calculator(ibalance, originalamount, false); + config->writeEntry("Balance", newbalance); + + if (i == (lastCheck - 1)) + { + config->setGroup("Totals"); + config->writeEntry("Balance", newbalance); + break; + } + } + QString category = config->readEntry("Category", "Error"); + if (category != QString("Error")) + { + config->setGroup("Totals"); + config->writeEntry("Spent", calculator(config->readEntry("Spent", QString("0")), originalamount, true)); + QString categorytotal = config->readEntry(category, QString("0")); + categorytotal = calculator(categorytotal, originalamount, true); + config->writeEntry(category, categorytotal); + } + } + if ( payment == QString("false") && rowText.toInt() <= lastCheck) + { + for(int i = row; i != (lastCheck); i++) + { + config->setGroup(tblTransactions->text(i, 0)); + QString ibalance = config->readEntry("Balance", "0.00"); + // this subtracts the old amount on to the transaction and then adds the new amount on + QString newbalance = calculator(ibalance, originalamount, true); + config->writeEntry("Balance", newbalance); + + if (i == lastCheck - 1) + { + config->setGroup("Totals"); + config->writeEntry("Balance", newbalance); + break; + } + } + config->setGroup("Totals"); + config->writeEntry("Deposited", calculator(config->readEntry("Deposited", QString("0")), originalamount, true)); + } + for (int i = rowText.toInt(); i != lastCheck; i++) + { + qWarning(QString::number(i +1)); + config->setGroup(QString::number(i +1)); + QString origamount = config->readEntry("Amount", "0"); + qWarning(origamount); + QString origbalance = config->readEntry("Balance", "0"); + QString origchecknumber = config->readEntry("CheckNumber", "0"); + QString origcomments = config->readEntry("Comments", ""); + QString origdate = config->readEntry("Date", "01/01/2000"); + QString origdescription = config->readEntry("Description", "No Description"); + QString origpayment = config->readEntry("Payment", "true"); + QString origtransactionfee = config->readEntry("TransactionFee", "0"); + QString origtype = config->readEntry("Type", "0"); + + if (config->hasKey("Category")) + { + QString origcategory = config->readEntry("Category", "No Category"); + config->removeGroup(); + config->setGroup(QString::number(i)); + config->clearGroup(); + config->writeEntry("Category", origcategory); + } else { + config->removeGroup(); + config->setGroup(QString::number(i)); + config->clearGroup(); + } + config->writeEntry("Amount", origamount); + config->writeEntry("Balance", origbalance); + config->writeEntry("CheckNumber", origchecknumber); + config->writeEntry("Comments", origcomments); + config->writeEntry("Date", origdate); + config->writeEntry("Description", origdescription); + config->writeEntry("Payment", origpayment); + config->writeEntry("TransactionFee", origtransactionfee); + config->writeEntry("Type", origtype); + } + tblTransactions->clearCell(row, col); + labelBalance->setText(QString("$" + config->readEntry("Balance", QString("0.00")))); + config->setGroup("Data"); + config->writeEntry("LastCheck", QString::number(QString(config->readEntry("LastCheck", 0)).toInt() -1)); + config->write(); + delete qcd; + emit reload(m_filename); + +} + +void QCheckView::load(const QString filename) +{ + config = new Config(filename, Config::File); + + connect(tblTransactions, SIGNAL(clicked(int, int, int, const QPoint &)), this, SLOT(tableClicked(int, int, int, const QPoint &))); + + config->setGroup("Totals"); + labelBalance->setText(QString("$" + config->readEntry("Balance", QString("0.00")))); + + config->setGroup("Data"); + int lastCheck = config->readNumEntry("LastCheck", 1); + for (int i = 1; i != (lastCheck + 1); i++) + { + config->setGroup(QString::number(i)); + QString item = config->readEntry("Description", QString("Not Found")); + if (item != "Not Found") + { + QTableItem *qti = new QTableItem(tblTransactions, QTableItem::Never, QString::number(i)); + QTableItem *qti1 = new QTableItem(tblTransactions, QTableItem::Never, config->readEntry("Description", QString("None"))); + QTableItem *qti2 = new QTableItem(tblTransactions, QTableItem::Never, config->readEntry("Date", QString("None"))); + QTableItem *qti3 = new QTableItem(tblTransactions, QTableItem::Never, QString("$" + config->readEntry("Amount", QString("0.00")))); + int row = tblTransactions->numRows(); + tblTransactions->setNumRows(row + 1); + tblTransactions->setItem(row,0, qti); + tblTransactions->setItem(row,1, qti1); + tblTransactions->setItem(row,2, qti2); + tblTransactions->setItem(row,3, qti3); + tblTransactions->updateCell(row, 0); + tblTransactions->updateCell(row, 1); + tblTransactions->updateCell(row, 2); + tblTransactions->updateCell(row, 3); + } + } +} + +void QCheckView::editClicked(int row, int col) +{ + delete qcd; + QStringList existing; + QString rowText = tblTransactions->text(row, 0); + config->setGroup("Data"); + QString recent = config->readEntry("Recent", ""); + + config->setGroup(rowText); + //We need the original amount to add or subtract to check's blanaces written after this edited check + QString originalamount = config->readEntry("Amount", "0.00"); + QString originalcategory = config->readEntry("Category", "None"); + + existing << config->readEntry("Payment", "true") << config->readEntry("Description", "No Description Found") << config->readEntry("Category", "Misc.") << config->readEntry("Type", "0") << config->readEntry("CheckNumber", "0") << originalamount << config->readEntry("TransactionFee", "") << config->readEntry("Date", "01/01/2001") << config->readEntry("Comments", "") << recent; + QStringList result = QCheckEntry::popupEntry(existing); + if (result.isEmpty() == false) + { + config->setGroup("Data"); + int lastCheck = config->readNumEntry("LastCheck", 0); + config->writeEntry("Recent", result[9]); + + config->setGroup(rowText); + + tblTransactions->setText(row, 1, result[1]); + tblTransactions->updateCell(row, 1); + + tblTransactions->setText(row, 2, result[7]); + tblTransactions->updateCell(row, 2); + + tblTransactions->setText(row, 3, QString("$" + result[5])); + tblTransactions->updateCell(row, 3); + + // This is how the list looks: + // 0: true or false, true == payment, false == deposit + // 1: description of the transaction + // 2: category name + // 3: transaction type (stores the integer value of the index of the combobox) + // 4: check number of the transaction (if any) + // 5: transaction amount + // 6: transaction fee (e.g. service charge, or ATM charge). + // 7: date of the transaction + // 8: additional comments + config->writeEntry("Payment", result[0]); + config->writeEntry("Description", result[1]); + if (result[0] == QString("true")) + { + config->writeEntry("Category", result[2]); + } + config->writeEntry("Type", result[3]); + config->writeEntry("CheckNumber", result[4]); + config->writeEntry("Amount", result[5]); + config->writeEntry("TransactionFee", result[6]); + config->writeEntry("Date", result[7]); + config->writeEntry("Comments", result[8]); + if (result[0] == QString("true")) + { + if (rowText.toInt() <= lastCheck) + { + for(int i = (rowText.toInt() - 1); i != (lastCheck); i++) + { + config->setGroup(tblTransactions->text(i, 0)); + QString ibalance = config->readEntry("Balance", "0.00"); + + // this adds the old amount on to the transaction and then takes the new amount away + QString newbalance = calculator(calculator(ibalance, originalamount, false), result[5], true); + config->writeEntry("Balance", newbalance); + if (i == (lastCheck - 1)) + { + config->setGroup("Totals"); + config->writeEntry("Balance", newbalance); + break; + } + } + } + config->setGroup("Totals"); + config->writeEntry("Spent", calculator(config->readEntry("Spent", QString("0")), originalamount, true)); + config->writeEntry("Spent", calculator(config->readEntry("Spent", QString("0")), result[5], false)); + + if (result[2] == originalcategory) + { + QString categorytotal = config->readEntry(result[2], QString("0")); + categorytotal = calculator(categorytotal, originalamount, true); + categorytotal = calculator(categorytotal, result[5], false); + config->writeEntry(result[2], categorytotal); + } else { + QString origtotal = config->readEntry(originalcategory, QString("0")); + QString origfinal = calculator(origtotal, result[5], true); + if (origfinal == "0" || origfinal == "0.00") + { + config->removeEntry(originalcategory); + } else { + config->writeEntry(originalcategory, origfinal); + } + QString categorytotal = config->readEntry(result[2], QString("0")); + categorytotal = calculator(categorytotal, originalamount, false); + config->writeEntry(result[2],categorytotal); + } + } + if (result[0] == QString("false")) + { + if (rowText.toInt() <= lastCheck) + { + for(int i = (rowText.toInt() - 1 ); i != (lastCheck); i++) + { + config->setGroup(tblTransactions->text(i, 0)); + QString ibalance = config->readEntry("Balance", "0.00"); + + // this subtracts the old amount on to the transaction and then adds the new amount on + QString newbalance = calculator(calculator(ibalance, originalamount, true), result[5], false); + config->writeEntry("Balance", newbalance); + if (i == lastCheck - 1) + { + config->setGroup("Totals"); + config->writeEntry("Balance", newbalance); + break; + } + } + } + config->setGroup("Totals"); + config->writeEntry("Deposited", calculator(config->readEntry("Deposited", QString("0")), originalamount, true)); + config->writeEntry("Deposited", calculator(config->readEntry("Deposited", QString("0")), result[5], false)); + } + labelBalance->setText(QString("$" + config->readEntry("Balance", QString("0.00")))); + config->write(); + } +} +void QCheckView::tableClicked(int row, int col, int mouseButton, const QPoint &mousePos) +{ + if (tblTransactions->text(row, col).isEmpty() == false) + { + QStringList existing; + config->setGroup(tblTransactions->text(row, 0)); + existing << config->readEntry("Payment", "true") << config->readEntry("Description", "No Description Found") << config->readEntry("Category", "Misc.") << config->readEntry("Type", "0") << config->readEntry("CheckNumber", "0") << config->readEntry("Amount", "0.00") << config->readEntry("TransactionFee", "0.00") << config->readEntry("Date", "01/01/2001") << config->readEntry("Comments", "") << config->readEntry("Balance", "0.00"); + qcd = new QCheckDetails(row, col, existing); + qcd->showMaximized(); + connect(qcd, SIGNAL(editClicked(int, int)), this, SLOT(editClicked(int, int))); + connect(qcd, SIGNAL(deleteClicked(int, int)), this, SLOT(deleteClicked(int, int))); + } +} + +void QCheckView::newClicked() +{ + config->setGroup("Data"); + QString recent = config->readEntry("Recent", ""); + QStringList kindablank; + kindablank << recent; + QStringList result = QCheckEntry::popupEntry(kindablank); + if (result.count() > 1) + { + QTableItem *qti = new QTableItem(tblTransactions, QTableItem::Never, result[1]); + int row = tblTransactions->numRows(); + tblTransactions->setNumRows(row + 1); + tblTransactions->setItem(row,1, qti); + tblTransactions->updateCell(row, 1); + config->setGroup("Data"); + config->writeEntry("Recent", result[9]); + int lastCheck = config->readNumEntry("LastCheck", 0); + if (lastCheck == 0) + { + config->writeEntry("LastCheck", 1); + } else { + config->writeEntry("LastCheck", (lastCheck + 1)); + } + QString number = QString::number(lastCheck + 1); + config->setGroup(number); + + QTableItem *qti1 = new QTableItem(tblTransactions, QTableItem::Never, number); + tblTransactions->setItem(row, 0, qti1); + tblTransactions->updateCell(row, 0); + + QTableItem *qti2 = new QTableItem(tblTransactions, QTableItem::Never, result[7]); + tblTransactions->setItem(row, 2, qti2); + tblTransactions->updateCell(row, 2); + + QTableItem *qti3 = new QTableItem(tblTransactions, QTableItem::Never, QString("$" + result[5])); + tblTransactions->setItem(row, 3, qti3); + tblTransactions->updateCell(row, 3); + + // This is how the list looks: + // 0: true or false, true == payment, false == deposit + // 1: description of the transaction + // 2: category name + // 3: transaction type (stores the integer value of the index of the combobox) + // 4: check number of the transaction (if any) + // 5: transaction amount + // 6: transaction fee (e.g. service charge, or ATM charge). + // 7: date of the transaction + config->writeEntry("Payment", result[0]); + config->writeEntry("Description", result[1]); + if (result[0] == QString("true")) + { + config->writeEntry("Category", result[2]); + } + config->writeEntry("Type", result[3]); + config->writeEntry("CheckNumber", result[4]); + config->writeEntry("Amount", result[5]); + config->writeEntry("TransactionFee", result[6]); + config->writeEntry("Date", result[7]); + config->writeEntry("Comments", result[8]); + config->setGroup("Totals"); + if (result[0] == QString("true")) + { + QString totalspent = config->readEntry("Spent", QString("0")); + totalspent = calculator(totalspent, result[5], false); + config->writeEntry("Spent", totalspent); + QString balance = config->readEntry("Balance", QString("0")); + balance = calculator(balance, result[5], true); + + // Make sure to add the fee on, if any + balance = calculator(balance, result[6], true); + + config->writeEntry("Balance", balance); + + config->setGroup(number); + config->writeEntry("Balance", balance); + + config->setGroup("Totals"); + QString categorytotal = config->readEntry(result[2], QString("0")); + categorytotal = calculator(categorytotal, result[5], false); + config->writeEntry(result[2], categorytotal); + } + if (result[0] == QString("false")) + { + QString totaldeposited = config->readEntry("Deposited", QString("0")); + totaldeposited = calculator(totaldeposited, result[5], false); + config->writeEntry("Deposited", totaldeposited); + QString balance = config->readEntry("Balance", QString("0")); + balance = calculator(balance, result[5], false); + + // Make sure to add the fee on, if any + balance = calculator(balance, result[6], true); + + config->writeEntry("Balance", balance); + + config->setGroup(number); + config->writeEntry("Balance", balance); + } + } + config->setGroup("Totals"); + labelBalance->setText(QString("$" + config->readEntry("Balance", QString("0.00")))); + config->write(); +} + +QString QCheckView::calculator(QString largervalue, QString smallervalue, bool subtract) +{ + // This class provides a way to eliminate the ARM processor problem of not being able to handle + // decimals. I just take the two QString'ed numbers and find the decimal point, then I remove the decimal + // point seperating the number into two. Then I convert it to cents (times it times 100) and add/ + // substract the two together. Put the decimals back in, and return. + + largervalue = largervalue.remove(largervalue.find(".", 0, false), 1); + smallervalue = smallervalue.remove(smallervalue.find(".", 0, false), 1); + + int largercents = largervalue.toInt(); + int smallercents = smallervalue.toInt(); + + int finalammount = 0; + + if (subtract == true) + { + finalammount = largercents - smallercents; + } else { + finalammount = largercents + smallercents; + } + + QString returnvalue = QString::number(finalammount); + if (returnvalue.length() >= 2) + { + returnvalue.insert((returnvalue.length() - 2), "."); + } else { + if (returnvalue.length() == 1) + { + returnvalue.prepend("0.0"); + } + } + return returnvalue; +} diff --git a/noncore/apps/checkbook/qcheckview.h b/noncore/apps/checkbook/qcheckview.h new file mode 100644 index 0000000..840dc8b --- a/dev/null +++ b/noncore/apps/checkbook/qcheckview.h @@ -0,0 +1,33 @@ +#include "qcheckviewbase.h" +#include "qrestrictedline.h" +#include "qcheckentry.h" +#include "qcheckdetails.h" + +#include <qstring.h> +#include "config.h" +#include <qtable.h> +#include <qpoint.h> +#include <qlayout.h> + +class QCheckView : public QCheckViewBase +{ + Q_OBJECT + public: + QCheckView(QWidget *, QString filename); + void load(const QString filename); + private: + Config *config; + QString calculator(QString largervalue, QString smallervalue, bool subtract); + int lastSortCol; + bool ascend; + QCheckDetails *qcd; + QString m_filename; + private slots: +// void entryActivated(int); + void newClicked(); + void tableClicked(int, int, int, const QPoint &mousePos); + void editClicked(int, int); + void deleteClicked(int, int); + signals: + void reload(const QString &filename); +}; diff --git a/noncore/apps/checkbook/qcheckviewbase.ui b/noncore/apps/checkbook/qcheckviewbase.ui new file mode 100644 index 0000000..00ed7dd --- a/dev/null +++ b/noncore/apps/checkbook/qcheckviewbase.ui @@ -0,0 +1,122 @@ +<!DOCTYPE UI><UI> +<class>QCheckViewBase</class> +<widget> + <class>QWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>QCheckViewBase</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>0</x> + <y>0</y> + <width>242</width> + <height>312</height> + </rect> + </property> + <property stdset="1"> + <name>caption</name> + <string>Account Transactions</string> + </property> + <grid> + <property stdset="1"> + <name>margin</name> + <number>5</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>1</number> + </property> + <widget row="0" column="1" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>labelBalance</cstring> + </property> + <property stdset="1"> + <name>frameShape</name> + <enum>MShape</enum> + </property> + <property stdset="1"> + <name>frameShadow</name> + <enum>MShadow</enum> + </property> + <property stdset="1"> + <name>text</name> + <string>$0.00</string> + </property> + <property stdset="1"> + <name>alignment</name> + <set>AlignCenter</set> + </property> + <property> + <name>hAlign</name> + </property> + </widget> + <widget row="1" column="0" rowspan="1" colspan="2" > + <class>QTable</class> + <property stdset="1"> + <name>name</name> + <cstring>tblTransactions</cstring> + </property> + <property stdset="1"> + <name>hScrollBarMode</name> + <enum>AlwaysOff</enum> + </property> + <property stdset="1"> + <name>numRows</name> + <number>0</number> + </property> + <property stdset="1"> + <name>numCols</name> + <number>4</number> + </property> + <property stdset="1"> + <name>showGrid</name> + <bool>false</bool> + </property> + </widget> + <widget row="0" column="0" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel3</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Balance:</string> + </property> + <property stdset="1"> + <name>alignment</name> + <set>AlignVCenter|AlignRight</set> + </property> + <property> + <name>hAlign</name> + </property> + </widget> + </grid> +</widget> +<customwidgets> + <customwidget> + <class>QWidget</class> + <header location="global">qwidget.h</header> + <sizehint> + <width>-1</width> + <height>-1</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>5</hordata> + <verdata>5</verdata> + </sizepolicy> + <pixmap>image0</pixmap> + </customwidget> +</customwidgets> +<images> + <image> + <name>image0</name> + <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753</data> + </image> +</images> +</UI> diff --git a/noncore/apps/checkbook/qrestrictedcombo.cpp b/noncore/apps/checkbook/qrestrictedcombo.cpp new file mode 100644 index 0000000..e1533f6 --- a/dev/null +++ b/noncore/apps/checkbook/qrestrictedcombo.cpp @@ -0,0 +1,78 @@ +/* + * + * $Id$ + * + * Implementation of QRestrictedCombo + * + * Copyright (C) 1997 Michael Wiedmann, <mw@miwie.in-berlin.de> + * + * 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; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include <qkeycode.h> + +#include "qrestrictedcombo.h" + +QRestrictedCombo::QRestrictedCombo( QWidget *parent, + const char *name, + const QString& valid ) + : QComboBox( parent, name ) +{ + qsValidChars = valid; +} + +QRestrictedCombo::~QRestrictedCombo() +{ + ; +} + + +void QRestrictedCombo::keyPressEvent( QKeyEvent *e ) +{ + // let QLineEdit process "special" keys and return/enter + // so that we still can use the default key binding + if (e->key() == Key_Enter || e->key() == Key_Return || e->key() == Key_Delete || e->ascii() < 32) + { + QComboBox::keyPressEvent(e); + return; + } + + // do we have a list of valid chars && + // is the pressed key in the list of valid chars? + if (!qsValidChars.isEmpty() && !qsValidChars.contains(e->ascii())) + { + // invalid char, emit signal and return + emit (invalidChar(e->key())); + return; + } + else + // valid char: let QLineEdit process this key as usual + QComboBox::keyPressEvent(e); + + return; +} + + +void QRestrictedCombo::setValidChars( const QString& valid) +{ + qsValidChars = valid; +} + +QString QRestrictedCombo::validChars() const +{ + return qsValidChars; +} + diff --git a/noncore/apps/checkbook/qrestrictedcombo.h b/noncore/apps/checkbook/qrestrictedcombo.h new file mode 100644 index 0000000..50ea59f --- a/dev/null +++ b/noncore/apps/checkbook/qrestrictedcombo.h @@ -0,0 +1,96 @@ +/* + * + * Definition of QRestrictedCombo + * + * Copyright (C) 1997 Michael Wiedmann, <mw@miwie.in-berlin.de> + * + * Edited 2001 by Nick Betcher <nbetcher@usinternet.com> to work + * with Qt-only. Changed class name from LRestrictedLine to + * QRestrictedCombo in order to accomidate Combo Boxes. + * + * 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; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef QRESTRICTEDCOMBO_H +#define QRESTRICTEDCOMBO_H + +#include <qcombobox.h> + +/** + * The QRestrictedCombo widget is a variant of @ref QComboBox which + * accepts only a restricted set of characters as input. + * All other characters will be discarded and the signal @ref #invalidChar() + * will be emitted for each of them. + * + * Valid characters can be passed as a QString to the constructor + * or set afterwards via @ref #setValidChars(). + * The default key bindings of @ref QComboBox are still in effect. + * + * @short A line editor for restricted character sets. + * @author Michael Wiedmann <mw@miwie.in-berlin.de> + * @version 0.0.1 + */ +class QRestrictedCombo : public QComboBox +{ + Q_OBJECT + Q_PROPERTY( QString validChars READ validChars WRITE setValidChars ) + +public: + + /** + * Constructor: This contructor takes three - optional - arguments. + * The first two parameters are simply passed on to @ref QLineEdit. + * @param parent pointer to the parent widget + * @param name pointer to the name of this widget + * @param valid pointer to set of valid characters + */ + QRestrictedCombo( QWidget *parent=0, const char *name=0, + const QString& valid = QString::null); + + /** + * Destructs the restricted line editor. + */ + ~QRestrictedCombo(); + + /** + * All characters in the string valid are treated as + * acceptable characters. + */ + void setValidChars(const QString& valid); + /** + * @return the string of acceptable characters. + */ + QString validChars() const; + +signals: + + /** + * Emitted when an invalid character was typed. + */ + void invalidChar(int); + +protected: + /** + * @reimplemented + */ + void keyPressEvent( QKeyEvent *e ); + +private: + /// QString of valid characters for this line + QString qsValidChars; +}; + +#endif // QRESTRICTEDCOMBO_H diff --git a/noncore/apps/checkbook/qrestrictedline.cpp b/noncore/apps/checkbook/qrestrictedline.cpp new file mode 100644 index 0000000..8508c33 --- a/dev/null +++ b/noncore/apps/checkbook/qrestrictedline.cpp @@ -0,0 +1,78 @@ +/* + * + * $Id$ + * + * Implementation of QRestrictedLine + * + * Copyright (C) 1997 Michael Wiedmann, <mw@miwie.in-berlin.de> + * + * 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; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include <qkeycode.h> + +#include "qrestrictedline.h" + +QRestrictedLine::QRestrictedLine( QWidget *parent, + const char *name, + const QString& valid ) + : QLineEdit( parent, name ) +{ + qsValidChars = valid; +} + +QRestrictedLine::~QRestrictedLine() +{ + ; +} + + +void QRestrictedLine::keyPressEvent( QKeyEvent *e ) +{ + // let QLineEdit process "special" keys and return/enter + // so that we still can use the default key binding + if (e->key() == Key_Enter || e->key() == Key_Return || e->key() == Key_Delete || e->ascii() < 32) + { + QLineEdit::keyPressEvent(e); + return; + } + + // do we have a list of valid chars && + // is the pressed key in the list of valid chars? + if (!qsValidChars.isEmpty() && !qsValidChars.contains(e->ascii())) + { + // invalid char, emit signal and return + emit (invalidChar(e->key())); + return; + } + else + // valid char: let QLineEdit process this key as usual + QLineEdit::keyPressEvent(e); + + return; +} + + +void QRestrictedLine::setValidChars( const QString& valid) +{ + qsValidChars = valid; +} + +QString QRestrictedLine::validChars() const +{ + return qsValidChars; +} + diff --git a/noncore/apps/checkbook/qrestrictedline.h b/noncore/apps/checkbook/qrestrictedline.h new file mode 100644 index 0000000..7e41cd9 --- a/dev/null +++ b/noncore/apps/checkbook/qrestrictedline.h @@ -0,0 +1,96 @@ +/* + * + * Definition of QRestrictedLine + * + * Copyright (C) 1997 Michael Wiedmann, <mw@miwie.in-berlin.de> + * + * Edited 2001 by Nick Betcher <nbetcher@usinternet.com> to work + * with Qt-only. Changed class name from QRestrictedLine to + * QRestrictedLine. + * + * 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; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef QRESTRICTEDLINE_H +#define QRESTRICTEDLINE_H + +#include <qlineedit.h> + +/** + * The QRestrictedLine widget is a variant of @ref QLineEdit which + * accepts only a restricted set of characters as input. + * All other characters will be discarded and the signal @ref #invalidChar() + * will be emitted for each of them. + * + * Valid characters can be passed as a QString to the constructor + * or set afterwards via @ref #setValidChars(). + * The default key bindings of @ref QLineEdit are still in effect. + * + * @short A line editor for restricted character sets. + * @author Michael Wiedmann <mw@miwie.in-berlin.de> + * @version 0.0.1 + */ +class QRestrictedLine : public QLineEdit +{ + Q_OBJECT + Q_PROPERTY( QString validChars READ validChars WRITE setValidChars ) + +public: + + /** + * Constructor: This contructor takes three - optional - arguments. + * The first two parameters are simply passed on to @ref QLineEdit. + * @param parent pointer to the parent widget + * @param name pointer to the name of this widget + * @param valid pointer to set of valid characters + */ + QRestrictedLine( QWidget *parent=0, const char *name=0, + const QString& valid = QString::null); + + /** + * Destructs the restricted line editor. + */ + ~QRestrictedLine(); + + /** + * All characters in the string valid are treated as + * acceptable characters. + */ + void setValidChars(const QString& valid); + /** + * @return the string of acceptable characters. + */ + QString validChars() const; + +signals: + + /** + * Emitted when an invalid character was typed. + */ + void invalidChar(int); + +protected: + /** + * @reimplemented + */ + void keyPressEvent( QKeyEvent *e ); + +private: + /// QString of valid characters for this line + QString qsValidChars; +}; + +#endif // QRESTRICTEDLINE_H |