summaryrefslogtreecommitdiff
path: root/noncore
authorkergoth <kergoth>2002-09-15 17:23:20 (UTC)
committer kergoth <kergoth>2002-09-15 17:23:20 (UTC)
commit9bd6edd077df796677c9d069200172f930ac1304 (patch) (side-by-side diff)
tree3b473d4280249b5ade8e5276758cc8f9aa3c2822 /noncore
parent33ec9ead7ce30bf9450b9048506f0bda49ba4791 (diff)
downloadopie-9bd6edd077df796677c9d069200172f930ac1304.zip
opie-9bd6edd077df796677c9d069200172f930ac1304.tar.gz
opie-9bd6edd077df796677c9d069200172f930ac1304.tar.bz2
Reverting to checkbook in its previous state, hopefully i got everything.
Diffstat (limited to 'noncore') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/checkbook/TODO4
-rw-r--r--noncore/apps/checkbook/calcdlg.ui243
-rw-r--r--noncore/apps/checkbook/calcdlgui.cpp55
-rw-r--r--noncore/apps/checkbook/calcdlgui.h27
-rw-r--r--noncore/apps/checkbook/checkbook.pro50
-rw-r--r--noncore/apps/checkbook/config.cpp560
-rw-r--r--noncore/apps/checkbook/config.h99
-rw-r--r--noncore/apps/checkbook/kmolcalc.cpp235
-rw-r--r--noncore/apps/checkbook/kmolcalc.h110
-rw-r--r--noncore/apps/checkbook/kmolelements.cpp238
-rw-r--r--noncore/apps/checkbook/kmolelements.h161
-rw-r--r--noncore/apps/checkbook/main.cpp22
-rw-r--r--noncore/apps/checkbook/moc_kmoledit.cpp95
-rw-r--r--noncore/apps/checkbook/opie-checkbook.control2
-rw-r--r--noncore/apps/checkbook/opie-oxygen.control9
-rw-r--r--noncore/apps/checkbook/oxygen.cpp53
-rw-r--r--noncore/apps/checkbook/oxygen.h22
-rw-r--r--noncore/apps/checkbook/oxygen.pro20
-rw-r--r--noncore/apps/checkbook/qcheckbook.cpp147
-rw-r--r--noncore/apps/checkbook/qcheckbook.h37
-rw-r--r--noncore/apps/checkbook/qcheckdetails.cpp119
-rw-r--r--noncore/apps/checkbook/qcheckdetails.h27
-rw-r--r--noncore/apps/checkbook/qcheckdetailsbase.ui62
-rw-r--r--noncore/apps/checkbook/qcheckentry.cpp256
-rw-r--r--noncore/apps/checkbook/qcheckentry.h31
-rw-r--r--noncore/apps/checkbook/qcheckentrybase.ui610
-rw-r--r--noncore/apps/checkbook/qcheckgraph.cpp258
-rw-r--r--noncore/apps/checkbook/qcheckgraph.h25
-rw-r--r--noncore/apps/checkbook/qcheckgraphbase.ui62
-rw-r--r--noncore/apps/checkbook/qcheckmainmenu.cpp74
-rw-r--r--noncore/apps/checkbook/qcheckmainmenu.h27
-rw-r--r--noncore/apps/checkbook/qcheckmmbase.ui80
-rw-r--r--noncore/apps/checkbook/qcheckname.cpp36
-rw-r--r--noncore/apps/checkbook/qcheckname.h15
-rw-r--r--noncore/apps/checkbook/qchecknamebase.ui136
-rw-r--r--noncore/apps/checkbook/qcheckview.cpp458
-rw-r--r--noncore/apps/checkbook/qcheckview.h33
-rw-r--r--noncore/apps/checkbook/qcheckviewbase.ui122
-rw-r--r--noncore/apps/checkbook/qrestrictedcombo.cpp78
-rw-r--r--noncore/apps/checkbook/qrestrictedcombo.h96
-rw-r--r--noncore/apps/checkbook/qrestrictedline.cpp78
-rw-r--r--noncore/apps/checkbook/qrestrictedline.h96
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,21 +1,11 @@
-/***************************************************************************
- * *
- * 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"
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
@@ -6,4 +6,4 @@ Architecture: arm
Version: $QPE_VERSION-$SUB_VERSION
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>&amp;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