Initial Release
authorSudheer K <scifi.guy@hotmail.com>
Tue, 17 May 2011 02:26:16 +0000 (19:26 -0700)
committerSudheer K <scifi.guy@hotmail.com>
Tue, 17 May 2011 02:26:16 +0000 (19:26 -0700)
80 files changed:
Makefile [new file with mode: 0644]
debian/README [new file with mode: 0644]
debian/changelog [new file with mode: 0644]
debian/compat [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/files [new file with mode: 0644]
debian/marketstoday.substvars [new file with mode: 0644]
debian/marketstoday/DEBIAN/control [new file with mode: 0644]
debian/marketstoday/DEBIAN/md5sums [new file with mode: 0644]
debian/marketstoday/DEBIAN/postrm [new file with mode: 0755]
debian/marketstoday/opt/marketstoday/marketstoday [new file with mode: 0755]
debian/marketstoday/usr/share/applications/hildon-home/marketstoday.desktop [new file with mode: 0644]
debian/marketstoday/usr/share/doc/marketstoday/changelog.Debian.gz [new file with mode: 0644]
debian/marketstoday/usr/share/doc/marketstoday/copyright [new file with mode: 0644]
debian/marketstoday/usr/share/icons/hicolor/48x48/apps/marketstoday.png [new file with mode: 0755]
debian/postrm [new file with mode: 0755]
debian/rules [new file with mode: 0755]
marketstoday.pro [new file with mode: 0644]
qtc_packaging/debian_fremantle/README [new file with mode: 0644]
qtc_packaging/debian_fremantle/changelog [new file with mode: 0644]
qtc_packaging/debian_fremantle/compat [new file with mode: 0644]
qtc_packaging/debian_fremantle/control [new file with mode: 0644]
qtc_packaging/debian_fremantle/copyright [new file with mode: 0644]
qtc_packaging/debian_fremantle/marketstoday.substvars [new file with mode: 0644]
qtc_packaging/debian_fremantle/postrm [new file with mode: 0755]
qtc_packaging/debian_fremantle/rules [new file with mode: 0755]
src/cpp/configqmlview.cpp [new file with mode: 0644]
src/cpp/configqmlview.h [new file with mode: 0644]
src/cpp/logutility.h [new file with mode: 0644]
src/cpp/main.cpp [new file with mode: 0644]
src/cpp/marketstodayqmlview.cpp [new file with mode: 0644]
src/cpp/marketstodayqmlview.h [new file with mode: 0644]
src/data/icons/marketstoday.png [new file with mode: 0755]
src/data/icons/marketstoday.png.base64 [new file with mode: 0644]
src/data/marketstoday.desktop [new file with mode: 0644]
src/qmaemo5homescreenadaptor/qmaemo5homescreenadaptor.cpp [new file with mode: 0644]
src/qmaemo5homescreenadaptor/qmaemo5homescreenadaptor.h [new file with mode: 0644]
src/qmaemo5homescreenadaptor/qmaemo5homescreenadaptor.pri [new file with mode: 0644]
src/qml/Config.qml [new file with mode: 0644]
src/qml/ConfigOptionsComponent.qml [new file with mode: 0644]
src/qml/ConfigParametersComponent.qml [new file with mode: 0644]
src/qml/ConfigTickersComponent.qml [new file with mode: 0644]
src/qml/Library/TitleBar.qml [new file with mode: 0644]
src/qml/Library/ToolBar.qml [new file with mode: 0644]
src/qml/Library/images/add.png [new file with mode: 0644]
src/qml/Library/images/back.png [new file with mode: 0644]
src/qml/Library/images/checkbox_checked.png [new file with mode: 0755]
src/qml/Library/images/checkbox_unchecked.png [new file with mode: 0755]
src/qml/Library/images/close.png [new file with mode: 0755]
src/qml/Library/images/config.png [new file with mode: 0755]
src/qml/Library/images/down.png [new file with mode: 0755]
src/qml/Library/images/gloss.png [new file with mode: 0644]
src/qml/Library/images/icon_settings.png [new file with mode: 0755]
src/qml/Library/images/icon_stocks.png [new file with mode: 0755]
src/qml/Library/images/lineedit.png [new file with mode: 0644]
src/qml/Library/images/lineedit.sci [new file with mode: 0644]
src/qml/Library/images/loading.png [new file with mode: 0644]
src/qml/Library/images/news.png [new file with mode: 0644]
src/qml/Library/images/reload.png [new file with mode: 0755]
src/qml/Library/images/remove.png [new file with mode: 0644]
src/qml/Library/images/stripes.png [new file with mode: 0644]
src/qml/Library/images/tab_schedule.png [new file with mode: 0755]
src/qml/Library/images/tab_settings.png [new file with mode: 0755]
src/qml/Library/images/tab_stocks.png [new file with mode: 0755]
src/qml/Library/images/titlebar.png [new file with mode: 0644]
src/qml/Library/images/titlebar.sci [new file with mode: 0644]
src/qml/Library/images/toolbar.png [new file with mode: 0755]
src/qml/Library/images/toolbar.sci [new file with mode: 0644]
src/qml/Library/images/toolbutton.png [new file with mode: 0644]
src/qml/Library/images/toolbutton.sci [new file with mode: 0644]
src/qml/Library/images/up.png [new file with mode: 0755]
src/qml/Library/js/Common.js [new file with mode: 0644]
src/qml/Library/js/DBUtility.js [new file with mode: 0644]
src/qml/Library/js/ISODate.js [new file with mode: 0644]
src/qml/MarketsToday.qml [new file with mode: 0644]
src/qml/StockQuoteDelegate.qml [new file with mode: 0644]
src/qml/StockQuotesComponent.qml [new file with mode: 0644]
src/resources.qrc [new file with mode: 0644]
src/src.pro [new file with mode: 0644]

diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..3520de8
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,120 @@
+#############################################################################
+# Makefile for building: marketstoday
+# Generated by qmake (2.01a) (Qt 4.7.0) on: Sat May 14 02:17:10 2011
+# Project:  marketstoday.pro
+# Template: subdirs
+# Command: /usr/bin/qmake -o Makefile marketstoday.pro
+#############################################################################
+
+first: make_default
+MAKEFILE      = Makefile
+QMAKE         = /usr/bin/qmake
+DEL_FILE      = rm -f
+CHK_DIR_EXISTS= test -d
+MKDIR         = mkdir -p
+COPY          = cp -f
+COPY_FILE     = $(COPY)
+COPY_DIR      = $(COPY) -r
+INSTALL_FILE  = install -m 644 -p
+INSTALL_PROGRAM = install -m 755 -p
+INSTALL_DIR   = $(COPY_DIR)
+DEL_FILE      = rm -f
+SYMLINK       = ln -f -s
+DEL_DIR       = rmdir
+MOVE          = mv -f
+CHK_DIR_EXISTS= test -d
+MKDIR         = mkdir -p
+SUBTARGETS    =  \
+               sub-src
+
+src/$(MAKEFILE): 
+       @$(CHK_DIR_EXISTS) src/ || $(MKDIR) src/ 
+       cd src/ && $(QMAKE) /home/sudheer/marketstoday/marketstoday-0.1/src/src.pro -o $(MAKEFILE)
+sub-src-qmake_all:  FORCE
+       @$(CHK_DIR_EXISTS) src/ || $(MKDIR) src/ 
+       cd src/ && $(QMAKE) /home/sudheer/marketstoday/marketstoday-0.1/src/src.pro -o $(MAKEFILE)
+sub-src: src/$(MAKEFILE) FORCE
+       cd src/ && $(MAKE) -f $(MAKEFILE)
+sub-src-make_default: src/$(MAKEFILE) FORCE
+       cd src/ && $(MAKE) -f $(MAKEFILE) 
+sub-src-make_first: src/$(MAKEFILE) FORCE
+       cd src/ && $(MAKE) -f $(MAKEFILE) first
+sub-src-all: src/$(MAKEFILE) FORCE
+       cd src/ && $(MAKE) -f $(MAKEFILE) all
+sub-src-clean: src/$(MAKEFILE) FORCE
+       cd src/ && $(MAKE) -f $(MAKEFILE) clean
+sub-src-distclean: src/$(MAKEFILE) FORCE
+       cd src/ && $(MAKE) -f $(MAKEFILE) distclean
+sub-src-install_subtargets: src/$(MAKEFILE) FORCE
+       cd src/ && $(MAKE) -f $(MAKEFILE) install
+sub-src-uninstall_subtargets: src/$(MAKEFILE) FORCE
+       cd src/ && $(MAKE) -f $(MAKEFILE) uninstall
+
+Makefile: marketstoday.pro  /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/linux-g++/qmake.conf /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/common/g++.conf \
+               /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/common/unix.conf \
+               /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/common/linux.conf \
+               /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/qconfig.pri \
+               /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/modules/qt_webkit_version.pri \
+               /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/qt_functions.prf \
+               /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/qt_config.prf \
+               /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/exclusive_builds.prf \
+               /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/default_pre.prf \
+               /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/release.prf \
+               /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/default_post.prf \
+               /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/warn_on.prf \
+               /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/qt.prf \
+               /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/unix/thread.prf \
+               /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/moc.prf \
+               /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/resources.prf \
+               /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/uic.prf \
+               /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/yacc.prf \
+               /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/lex.prf \
+               /targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/include_source_dir.prf
+       $(QMAKE) -o Makefile marketstoday.pro
+/targets/FREMANTLE_X86/usr/share/qt4/mkspecs/common/g++.conf:
+/targets/FREMANTLE_X86/usr/share/qt4/mkspecs/common/unix.conf:
+/targets/FREMANTLE_X86/usr/share/qt4/mkspecs/common/linux.conf:
+/targets/FREMANTLE_X86/usr/share/qt4/mkspecs/qconfig.pri:
+/targets/FREMANTLE_X86/usr/share/qt4/mkspecs/modules/qt_webkit_version.pri:
+/targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/qt_functions.prf:
+/targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/qt_config.prf:
+/targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/exclusive_builds.prf:
+/targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/default_pre.prf:
+/targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/release.prf:
+/targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/default_post.prf:
+/targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/warn_on.prf:
+/targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/qt.prf:
+/targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/unix/thread.prf:
+/targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/moc.prf:
+/targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/resources.prf:
+/targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/uic.prf:
+/targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/yacc.prf:
+/targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/lex.prf:
+/targets/FREMANTLE_X86/usr/share/qt4/mkspecs/features/include_source_dir.prf:
+qmake: qmake_all FORCE
+       @$(QMAKE) -o Makefile marketstoday.pro
+
+qmake_all: sub-src-qmake_all FORCE
+
+make_default: sub-src-make_default FORCE
+make_first: sub-src-make_first FORCE
+all: sub-src-all FORCE
+clean: sub-src-clean FORCE
+distclean: sub-src-distclean FORCE
+       -$(DEL_FILE) Makefile
+install_subtargets: sub-src-install_subtargets FORCE
+uninstall_subtargets: sub-src-uninstall_subtargets FORCE
+
+sub-src-check: src/$(MAKEFILE)
+       cd src/ && $(MAKE) check
+check: sub-src-check
+
+mocclean: compiler_moc_header_clean compiler_moc_source_clean
+
+mocables: compiler_moc_header_make_all compiler_moc_source_make_all
+install: install_subtargets  FORCE
+
+uninstall:  uninstall_subtargets FORCE
+
+FORCE:
+
diff --git a/debian/README b/debian/README
new file mode 100644 (file)
index 0000000..036a37e
--- /dev/null
@@ -0,0 +1,8 @@
+The Debian Package marketstoday
+----------------------------
+
+- Package depends on qt4-homescreen-loader to display Qt based widgets on Maemo's hildon desktop.
+- Signal/Slots are extensively used to interact between Config and Main windows. As a result, qmlviewer may not be used.
+- It is recommended to build/test this application in scratchbox. 
+
+ -- Sudheer <scifi1947@gmail.com>  Sat, 14 May 2011 00:00:00 -0800
diff --git a/debian/changelog b/debian/changelog
new file mode 100644 (file)
index 0000000..1a156e4
--- /dev/null
@@ -0,0 +1,5 @@
+marketstoday (0.1-0) unstable; urgency=low
+
+  * Initial Release.
+
+ -- Sudheer K. <scifi1947 at gmail.com>  Sat, 14 May 2011 00:00:00 -0800
diff --git a/debian/compat b/debian/compat
new file mode 100644 (file)
index 0000000..7ed6ff8
--- /dev/null
@@ -0,0 +1 @@
+5
diff --git a/debian/control b/debian/control
new file mode 100644 (file)
index 0000000..47a763c
--- /dev/null
@@ -0,0 +1,122 @@
+Source: marketstoday
+Section: user/desktop
+Priority: optional
+Maintainer: Sudheer K. <scifi1947 at gmail.com>
+Build-Depends: debhelper (>= 5), libqt4-dev, libx11-dev
+Standards-Version: 3.7.3
+Homepage: https://garage.maemo.org/projects/marketstoday
+XSBC-Bugtracker: https://garage.maemo.org/tracker/?group_id=2110
+XB-Maemo-Display-Name: Markets Today - Desktop Stock Quotes Widget
+
+Package: marketstoday
+Architecture: any
+Depends: ${shlibs:Depends}, qt4-homescreen-loader
+Description: A simple desktop widget for stock quotes with auto-update option.
+XB-Maemo-Icon-26:
+ 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
+ kc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE
+ 3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/8
+ 7fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfIT
+ dyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxM
+ DUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8e
+ lQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zv
+ n//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vt
+ V5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmK
+ rhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N
+ 2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLd
+ tWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvtt
+ Xa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG
+ 4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+
+ 0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO
+ 32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7
+ nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+
+ cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP
+ /pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV
+ 69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98P
+ T+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9
+ 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
+ AElFTkSuQmCC
diff --git a/debian/copyright b/debian/copyright
new file mode 100644 (file)
index 0000000..3046325
--- /dev/null
@@ -0,0 +1,35 @@
+This package was debianized by Sudheer K. <scifi1947  at gmail.com> on
+Sat, 14 May 2011 00:00:00 -0800.
+
+It was downloaded from <https://garage.maemo.org/projects/marketstoday>
+
+Upstream Author: Sudheer K. <scifi1947 at gmail.com>
+
+Copyright: 2011, Sudheer K.
+
+License:
+
+    This package is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This package is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this package; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL'.
+
+The Debian packaging is (C) 2011, Sudheer K. <scifi1947 at gmail.com> and
+is licensed under the GPL, see above.
+
+Icons used in this package include:
+- Devine Icons by iPapun (http://ipapun.deviantart.com/art/Devine-Icons-137555756)
+- Human o2 by Oliver Scholtz (and others) (http://schollidesign.deviantart.com/art/Human-O2-Iconset-105344123)
+Please check the attached links for license information.
diff --git a/debian/files b/debian/files
new file mode 100644 (file)
index 0000000..87c218d
--- /dev/null
@@ -0,0 +1 @@
+marketstoday_0.1-0_armel.deb user/desktop optional
diff --git a/debian/marketstoday.substvars b/debian/marketstoday.substvars
new file mode 100644 (file)
index 0000000..a1593b2
--- /dev/null
@@ -0,0 +1 @@
+shlibs:Depends=libc6 (>= 2.5.0-1), libgcc1 (>= 1:4.2.1), libqt4-core (>= 4.7.0~git20100909), libqt4-dbus (>= 4.7.0~git20100909), libqt4-declarative (>= 4.7.0~git20100909), libqt4-gui (>= 4.7.0~git20100909), libqt4-network (>= 4.7.0~git20100909), libqt4-opengl (>= 4.7.0~git20100909), libqt4-script (>= 4.7.0~git20100909), libqt4-sql (>= 4.7.0~git20100909), libqt4-svg (>= 4.7.0~git20100909), libqt4-xml (>= 4.7.0~git20100909), libqt4-xmlpatterns (>= 4.7.0~git20100909), libstdc++6 (>= 4.2.1), libx11-6
diff --git a/debian/marketstoday/DEBIAN/control b/debian/marketstoday/DEBIAN/control
new file mode 100644 (file)
index 0000000..5b25842
--- /dev/null
@@ -0,0 +1,119 @@
+Package: marketstoday
+Version: 0.1-0
+Section: user/desktop
+Priority: optional
+Architecture: armel
+Depends: libc6 (>= 2.5.0-1), libgcc1 (>= 1:4.2.1), libqt4-core (>= 4.7.0~git20100909), libqt4-dbus (>= 4.7.0~git20100909), libqt4-declarative (>= 4.7.0~git20100909), libqt4-gui (>= 4.7.0~git20100909), libqt4-network (>= 4.7.0~git20100909), libqt4-opengl (>= 4.7.0~git20100909), libqt4-script (>= 4.7.0~git20100909), libqt4-sql (>= 4.7.0~git20100909), libqt4-svg (>= 4.7.0~git20100909), libqt4-xml (>= 4.7.0~git20100909), libqt4-xmlpatterns (>= 4.7.0~git20100909), libstdc++6 (>= 4.2.1), libx11-6, qt4-homescreen-loader
+Installed-Size: 208
+Maintainer: Sudheer K. <scifi1947 at gmail.com>
+Description: A simple desktop widget for stock quotes with auto-update option.
+Bugtracker: https://garage.maemo.org/tracker/?group_id=2110
+Maemo-Display-Name: Markets Today - Desktop Stock Quotes Widget
+Maemo-Icon-26: 
+ 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
+ kc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE
+ 3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/8
+ 7fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfIT
+ dyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxM
+ DUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8e
+ lQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zv
+ n//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vt
+ V5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmK
+ rhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N
+ 2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLd
+ tWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvtt
+ Xa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG
+ 4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+
+ 0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO
+ 32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7
+ nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+
+ cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP
+ /pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV
+ 69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98P
+ T+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9
+ 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
+ AElFTkSuQmCC
diff --git a/debian/marketstoday/DEBIAN/md5sums b/debian/marketstoday/DEBIAN/md5sums
new file mode 100644 (file)
index 0000000..890f447
--- /dev/null
@@ -0,0 +1,5 @@
+577012ec40cc31d35c931723e65041de  opt/marketstoday/marketstoday
+e1575c7633d95a9071bf511cdf6c7ba9  usr/share/doc/marketstoday/copyright
+69e14451af3766e939881071ad799b70  usr/share/doc/marketstoday/changelog.Debian.gz
+4f184c6853965ad3c45fe68506d64dd8  usr/share/icons/hicolor/48x48/apps/marketstoday.png
+551bca229853538c376b80e4444c0bf7  usr/share/applications/hildon-home/marketstoday.desktop
diff --git a/debian/marketstoday/DEBIAN/postrm b/debian/marketstoday/DEBIAN/postrm
new file mode 100755 (executable)
index 0000000..32f723b
--- /dev/null
@@ -0,0 +1,48 @@
+#!/bin/sh
+# postrm script for vicar
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+#        * <postrm> `remove'
+#        * <postrm> `purge'
+#        * <old-postrm> `upgrade' <new-version>
+#        * <new-postrm> `failed-upgrade' <old-version>
+#        * <new-postrm> `abort-install'
+#        * <new-postrm> `abort-install' <old-version>
+#        * <new-postrm> `abort-upgrade' <old-version>
+#        * <disappearer's-postrm> `disappear' <overwriter>
+#          <overwriter-version>
+# for details, see http://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+
+
+case "$1" in
+    purge)
+        echo "Deleting configuration database ..."
+        [[ -d /home/user/.marketstoday/OfflineStorage ]] && rm -rf /home/user/.marketstoday/OfflineStorage
+        echo "Removing logs ..."
+        [[ -x /home/user/.marketstoday/marketstoday.log ]] && rm -f /home/user/.marketstoday/marketstoday.log
+    ;;
+
+    remove|abort-install|upgrade|failed-upgrade|abort-upgrade|disappear)
+        echo "Clearing logs ..."
+        [[ -x /home/user/.marketstoday/marketstoday.log ]] && cat /dev/null > /home/user/.marketstoday/marketstoday.log
+    ;;
+    
+    *)
+        echo "postrm called with unknown argument \`$1'" >&2
+        exit 1
+    ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+
+
+exit 0
+
+
diff --git a/debian/marketstoday/opt/marketstoday/marketstoday b/debian/marketstoday/opt/marketstoday/marketstoday
new file mode 100755 (executable)
index 0000000..90bea1c
Binary files /dev/null and b/debian/marketstoday/opt/marketstoday/marketstoday differ
diff --git a/debian/marketstoday/usr/share/applications/hildon-home/marketstoday.desktop b/debian/marketstoday/usr/share/applications/hildon-home/marketstoday.desktop
new file mode 100644 (file)
index 0000000..e63ec2b
--- /dev/null
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Name=Markets Today
+Comment=A simple desktop widget for stock quotes
+Type=qt
+X-Path=/opt/marketstoday/marketstoday
+X-Multiple-Instances=false
+X-home-applet-minwidth=400
+X-home-applet-minheight=325
+Name[en_US]=Markets Today
diff --git a/debian/marketstoday/usr/share/doc/marketstoday/changelog.Debian.gz b/debian/marketstoday/usr/share/doc/marketstoday/changelog.Debian.gz
new file mode 100644 (file)
index 0000000..802482b
Binary files /dev/null and b/debian/marketstoday/usr/share/doc/marketstoday/changelog.Debian.gz differ
diff --git a/debian/marketstoday/usr/share/doc/marketstoday/copyright b/debian/marketstoday/usr/share/doc/marketstoday/copyright
new file mode 100644 (file)
index 0000000..3046325
--- /dev/null
@@ -0,0 +1,35 @@
+This package was debianized by Sudheer K. <scifi1947  at gmail.com> on
+Sat, 14 May 2011 00:00:00 -0800.
+
+It was downloaded from <https://garage.maemo.org/projects/marketstoday>
+
+Upstream Author: Sudheer K. <scifi1947 at gmail.com>
+
+Copyright: 2011, Sudheer K.
+
+License:
+
+    This package is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This package is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this package; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL'.
+
+The Debian packaging is (C) 2011, Sudheer K. <scifi1947 at gmail.com> and
+is licensed under the GPL, see above.
+
+Icons used in this package include:
+- Devine Icons by iPapun (http://ipapun.deviantart.com/art/Devine-Icons-137555756)
+- Human o2 by Oliver Scholtz (and others) (http://schollidesign.deviantart.com/art/Human-O2-Iconset-105344123)
+Please check the attached links for license information.
diff --git a/debian/marketstoday/usr/share/icons/hicolor/48x48/apps/marketstoday.png b/debian/marketstoday/usr/share/icons/hicolor/48x48/apps/marketstoday.png
new file mode 100755 (executable)
index 0000000..246f021
Binary files /dev/null and b/debian/marketstoday/usr/share/icons/hicolor/48x48/apps/marketstoday.png differ
diff --git a/debian/postrm b/debian/postrm
new file mode 100755 (executable)
index 0000000..e69ef12
--- /dev/null
@@ -0,0 +1,48 @@
+#!/bin/sh
+# postrm script for vicar
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+#        * <postrm> `remove'
+#        * <postrm> `purge'
+#        * <old-postrm> `upgrade' <new-version>
+#        * <new-postrm> `failed-upgrade' <old-version>
+#        * <new-postrm> `abort-install'
+#        * <new-postrm> `abort-install' <old-version>
+#        * <new-postrm> `abort-upgrade' <old-version>
+#        * <disappearer's-postrm> `disappear' <overwriter>
+#          <overwriter-version>
+# for details, see http://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+
+
+case "$1" in
+    purge)
+        echo "Deleting configuration database ..."
+        [[ -d /home/user/.marketstoday/OfflineStorage ]] && rm -rf /home/user/.marketstoday/OfflineStorage
+        echo "Removing logs ..."
+        [[ -x /home/user/.marketstoday/marketstoday.log ]] && rm -f /home/user/.marketstoday/marketstoday.log
+    ;;
+
+    remove|abort-install|upgrade|failed-upgrade|abort-upgrade|disappear)
+        echo "Clearing logs ..."
+        [[ -x /home/user/.marketstoday/marketstoday.log ]] && cat /dev/null > /home/user/.marketstoday/marketstoday.log
+    ;;
+    
+    *)
+        echo "postrm called with unknown argument \`$1'" >&2
+        exit 1
+    ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
+
+
diff --git a/debian/rules b/debian/rules
new file mode 100755 (executable)
index 0000000..0ca482f
--- /dev/null
@@ -0,0 +1,73 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+APPNAME := marketstoday
+builddir:
+       mkdir -p builddir
+
+builddir/Makefile: builddir
+       cd builddir && qmake ../$(APPNAME).pro
+
+build: build-stamp
+
+build-stamp: builddir/Makefile
+       dh_testdir
+
+       # Add here commands to compile the package.
+       cd builddir && $(MAKE)
+       #docbook-to-man debian/$(APPNAME).sgml > $(APPNAME).1
+
+       touch $@
+
+clean: 
+       dh_testdir
+       dh_testroot
+       rm -f build-stamp
+
+       # Add here commands to clean up after the build process.
+       rm -rf builddir
+
+       dh_clean 
+
+install: build
+       dh_testdir
+       dh_testroot
+       dh_clean -k 
+       dh_installdirs
+
+       # Add here commands to install the package into debian/marketstoday.
+       cd builddir && $(MAKE) INSTALL_ROOT=$(CURDIR)/debian/$(APPNAME) install
+
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+       dh_testdir
+       dh_testroot
+       dh_installchangelogs 
+       dh_installdocs
+       dh_installexamples
+       dh_installman
+       dh_link
+       dh_strip
+       dh_compress
+       dh_fixperms
+       dh_installdeb
+       dh_shlibdeps                      # Uncomment this line for publishing!
+       dh_gencontrol
+       dh_md5sums
+       dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install configure
diff --git a/marketstoday.pro b/marketstoday.pro
new file mode 100644 (file)
index 0000000..d97061d
--- /dev/null
@@ -0,0 +1,8 @@
+QMAKEVERSION = $$[QMAKE_VERSION]
+ISQT4 = $$find(QMAKEVERSION, ^[2-9])
+isEmpty( ISQT4 ) {
+error("Use the qmake include with Qt4.4 or greater, on Debian that is qmake-qt4");
+}
+
+TEMPLATE = subdirs
+SUBDIRS  = src
diff --git a/qtc_packaging/debian_fremantle/README b/qtc_packaging/debian_fremantle/README
new file mode 100644 (file)
index 0000000..036a37e
--- /dev/null
@@ -0,0 +1,8 @@
+The Debian Package marketstoday
+----------------------------
+
+- Package depends on qt4-homescreen-loader to display Qt based widgets on Maemo's hildon desktop.
+- Signal/Slots are extensively used to interact between Config and Main windows. As a result, qmlviewer may not be used.
+- It is recommended to build/test this application in scratchbox. 
+
+ -- Sudheer <scifi1947@gmail.com>  Sat, 14 May 2011 00:00:00 -0800
diff --git a/qtc_packaging/debian_fremantle/changelog b/qtc_packaging/debian_fremantle/changelog
new file mode 100644 (file)
index 0000000..1a156e4
--- /dev/null
@@ -0,0 +1,5 @@
+marketstoday (0.1-0) unstable; urgency=low
+
+  * Initial Release.
+
+ -- Sudheer K. <scifi1947 at gmail.com>  Sat, 14 May 2011 00:00:00 -0800
diff --git a/qtc_packaging/debian_fremantle/compat b/qtc_packaging/debian_fremantle/compat
new file mode 100644 (file)
index 0000000..7ed6ff8
--- /dev/null
@@ -0,0 +1 @@
+5
diff --git a/qtc_packaging/debian_fremantle/control b/qtc_packaging/debian_fremantle/control
new file mode 100644 (file)
index 0000000..7867f47
--- /dev/null
@@ -0,0 +1,122 @@
+Source: marketstoday
+Section: user/desktop
+Priority: optional
+Maintainer: Sudheer K. <scifi1947 at gmail.com>
+Build-Depends: debhelper (>= 5), libqt4-dev
+Standards-Version: 3.7.3
+Homepage: https://garage.maemo.org/projects/marketstoday
+XSBC-Bugtracker: https://garage.maemo.org/tracker/?group_id=2110
+XB-Maemo-Display-Name: Markets Today - Desktop Stock Quotes Widget
+
+Package: marketstoday
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: A simple desktop widget for stock quotes with auto-update option.
+XB-Maemo-Icon-26:
+ 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
+ kc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE
+ 3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/8
+ 7fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfIT
+ dyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxM
+ DUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8e
+ lQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zv
+ n//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vt
+ V5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmK
+ rhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N
+ 2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLd
+ tWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvtt
+ Xa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG
+ 4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+
+ 0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO
+ 32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7
+ nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+
+ cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP
+ /pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV
+ 69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98P
+ T+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9
+ 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
+ AElFTkSuQmCC
diff --git a/qtc_packaging/debian_fremantle/copyright b/qtc_packaging/debian_fremantle/copyright
new file mode 100644 (file)
index 0000000..3046325
--- /dev/null
@@ -0,0 +1,35 @@
+This package was debianized by Sudheer K. <scifi1947  at gmail.com> on
+Sat, 14 May 2011 00:00:00 -0800.
+
+It was downloaded from <https://garage.maemo.org/projects/marketstoday>
+
+Upstream Author: Sudheer K. <scifi1947 at gmail.com>
+
+Copyright: 2011, Sudheer K.
+
+License:
+
+    This package is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This package is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this package; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL'.
+
+The Debian packaging is (C) 2011, Sudheer K. <scifi1947 at gmail.com> and
+is licensed under the GPL, see above.
+
+Icons used in this package include:
+- Devine Icons by iPapun (http://ipapun.deviantart.com/art/Devine-Icons-137555756)
+- Human o2 by Oliver Scholtz (and others) (http://schollidesign.deviantart.com/art/Human-O2-Iconset-105344123)
+Please check the attached links for license information.
diff --git a/qtc_packaging/debian_fremantle/marketstoday.substvars b/qtc_packaging/debian_fremantle/marketstoday.substvars
new file mode 100644 (file)
index 0000000..e7a7177
--- /dev/null
@@ -0,0 +1 @@
+shlibs:Depends=libc6 (>= 2.5.0-1), libgcc1 (>= 1:4.2.1), libqt4-core (>= 4.7.0~git20100909), libqt4-dbus (>= 4.7.0~git20100909), libqt4-declarative (>= 4.7.0~git20100909), libqt4-gui (>= 4.7.0~git20100909), libqt4-network (>= 4.7.0~git20100909), libqt4-opengl (>= 4.7.0~git20100909), libqt4-script (>= 4.7.0~git20100909), libqt4-sql (>= 4.7.0~git20100909), libqt4-svg (>= 4.7.0~git20100909), libqt4-xml (>= 4.7.0~git20100909), libqt4-xmlpatterns (>= 4.7.0~git20100909), libstdc++6 (>= 4.2.1), libx11-6, qt4-homescreen-loader
diff --git a/qtc_packaging/debian_fremantle/postrm b/qtc_packaging/debian_fremantle/postrm
new file mode 100755 (executable)
index 0000000..b891667
--- /dev/null
@@ -0,0 +1,48 @@
+#!/bin/sh
+# postrm script for vicar
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+#        * <postrm> `remove'
+#        * <postrm> `purge'
+#        * <old-postrm> `upgrade' <new-version>
+#        * <new-postrm> `failed-upgrade' <old-version>
+#        * <new-postrm> `abort-install'
+#        * <new-postrm> `abort-install' <old-version>
+#        * <new-postrm> `abort-upgrade' <old-version>
+#        * <disappearer's-postrm> `disappear' <overwriter>
+#          <overwriter-version>
+# for details, see http://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+
+
+case "$1" in
+    purge)
+        echo "Deleting configuration database ..."
+        [[ -d /home/user/.marketstoday/OfflineStorage ]] && rm -rf /home/user/.marketstoday/OfflineStorage
+        echo "Removing logs ..."
+        [[ -x /home/user/.marketstoday/marketstoday.log ]] && rm -f /home/user/.marketstoday/marketstoday.log
+    ;;
+
+    remove|abort-install|upgrade|failed-upgrade|abort-upgrade|disappear)
+        echo "Removing logs ..."
+        [[ -x /home/user/.marketstoday/marketstoday.log ]] && rm -f /home/user/.marketstoday/marketstoday.log
+    ;;
+    
+    *)
+        echo "postrm called with unknown argument \`$1'" >&2
+        exit 1
+    ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
+
+
diff --git a/qtc_packaging/debian_fremantle/rules b/qtc_packaging/debian_fremantle/rules
new file mode 100755 (executable)
index 0000000..0ca482f
--- /dev/null
@@ -0,0 +1,73 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+APPNAME := marketstoday
+builddir:
+       mkdir -p builddir
+
+builddir/Makefile: builddir
+       cd builddir && qmake ../$(APPNAME).pro
+
+build: build-stamp
+
+build-stamp: builddir/Makefile
+       dh_testdir
+
+       # Add here commands to compile the package.
+       cd builddir && $(MAKE)
+       #docbook-to-man debian/$(APPNAME).sgml > $(APPNAME).1
+
+       touch $@
+
+clean: 
+       dh_testdir
+       dh_testroot
+       rm -f build-stamp
+
+       # Add here commands to clean up after the build process.
+       rm -rf builddir
+
+       dh_clean 
+
+install: build
+       dh_testdir
+       dh_testroot
+       dh_clean -k 
+       dh_installdirs
+
+       # Add here commands to install the package into debian/marketstoday.
+       cd builddir && $(MAKE) INSTALL_ROOT=$(CURDIR)/debian/$(APPNAME) install
+
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+       dh_testdir
+       dh_testroot
+       dh_installchangelogs 
+       dh_installdocs
+       dh_installexamples
+       dh_installman
+       dh_link
+       dh_strip
+       dh_compress
+       dh_fixperms
+       dh_installdeb
+       dh_shlibdeps                      # Uncomment this line for publishing!
+       dh_gencontrol
+       dh_md5sums
+       dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install configure
diff --git a/src/cpp/configqmlview.cpp b/src/cpp/configqmlview.cpp
new file mode 100644 (file)
index 0000000..7473bc6
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+@version: 0.1
+@author: Sudheer K. <scifi1947 at gmail.com>
+@license: GNU General Public License
+*/
+
+#include "configqmlview.h"
+#include "marketstodayqmlview.h"
+#include "logutility.h"
+#include <QtDeclarative/QDeclarativeView>
+#include <QDeclarativeEngine>
+#include <QDeclarativeContext>
+#include <QGraphicsObject>
+#include <QDebug>
+
+ConfigQMLView::ConfigQMLView(QWidget *parent, MarketsTodayQMLView *parentView)
+    : QDeclarativeView(parent), logUtility(new LogUtility(this))
+{
+    // Setup QDeclarativeView
+    setAlignment(Qt::AlignCenter);
+    //setContentResizable(false);
+    this->stockQuotesView = parentView;
+    this->rootContext()->setContextProperty("logUtility",logUtility);
+}
+
+void ConfigQMLView::configClosed(){
+    logUtility->logMessage("Config window is closed");
+    this->stockQuotesView->initialize();
+    this->close();
+}
+
+ConfigQMLView::~ConfigQMLView(){
+    qDebug() << "In destructor for ConfigQMLView object";
+}
diff --git a/src/cpp/configqmlview.h b/src/cpp/configqmlview.h
new file mode 100644 (file)
index 0000000..a452320
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+@version: 0.1
+@author: Sudheer K. <scifi1947 at gmail.com>
+@license: GNU General Public License
+*/
+
+#ifndef CONFIGQMLVIEW_H
+#define CONFIGQMLVIEW_H
+
+#include <QDeclarativeView>
+#include "marketstodayqmlview.h"
+#include "logutility.h"
+
+class ConfigQMLView : public QDeclarativeView
+{
+    Q_OBJECT
+
+public:
+    ConfigQMLView(QWidget *parent = 0, MarketsTodayQMLView *parentView = 0);
+    ~ConfigQMLView();
+
+public slots:
+    void configClosed();
+
+private:
+    MarketsTodayQMLView *stockQuotesView;
+    LogUtility * const logUtility;
+};
+
+#endif // CONFIGQMLVIEW_H
diff --git a/src/cpp/logutility.h b/src/cpp/logutility.h
new file mode 100644 (file)
index 0000000..530ba96
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+@version: 0.1
+@author: Sudheer K. <scifi1947 at gmail.com>
+@license: GNU General Public License
+*/
+
+#ifndef LOGUTILITY_H
+#define LOGUTILITY_H
+#include <QDebug>
+#include <QFile>
+#include <QIODevice>
+#include <QDateTime>
+
+class LogUtility : public QObject
+{
+    Q_OBJECT
+
+public:
+    LogUtility(QObject *parent = 0) :
+        QObject(parent){
+
+    }
+    ~LogUtility(){
+        qDebug() << "Markets Today: In LogUtility object destructor..";
+    }
+
+public slots:
+    void logMessage(QString strMessage) {
+
+        QString strTimeNow = QDateTime::currentDateTime().toString("dd-MMM-yyyy HH:mm:ss");
+        qDebug() << QString("Markets Today: [%1] - %2").arg(strTimeNow,strMessage);
+
+#ifdef Q_WS_MAEMO_5
+    //For maemo use a common path
+        QFile logFile("/home/user/.marketstoday/marketstoday.log");
+#else
+        QFile logFile("marketstoday.log");
+#endif
+
+        if (!logFile.open(QIODevice::Append | QIODevice::WriteOnly | QIODevice::Text)) { return; }
+
+        QTextStream logStream(&logFile);
+        logStream <<  QString("Markets Today: [%1] - %2").arg(strTimeNow,strMessage) << endl;
+    }
+};
+
+#endif // LOGUTILITY_H
+;
diff --git a/src/cpp/main.cpp b/src/cpp/main.cpp
new file mode 100644 (file)
index 0000000..0c4fe71
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+@version: 0.1
+@author: Sudheer K. <scifi1947 at gmail.com>
+@license: GNU General Public License
+*/
+
+#include "qmaemo5homescreenadaptor.h"
+#include "marketstodayqmlview.h"
+
+#include <QtGui>
+#include <QDeclarativeEngine>
+#include <QDebug>
+#include "logutility.h"
+
+int main(int argc, char *argv[])
+{
+    QApplication app(argc, argv);
+
+    MarketsTodayQMLView widgetAdaptor;
+    QMaemo5HomescreenAdaptor *adaptor = new QMaemo5HomescreenAdaptor(&widgetAdaptor);
+    adaptor->setSettingsAvailable(false); //Don't use the standard widget settings button   
+
+#ifdef Q_WS_MAEMO_5
+    //For maemo use a common path
+    widgetAdaptor.engine()->setOfflineStoragePath("/home/user/.marketstoday/OfflineStorage");
+#else
+    widgetAdaptor.engine()->setOfflineStoragePath("qml/OfflineStorage");
+#endif
+    widgetAdaptor.setResizeMode(QDeclarativeView::SizeRootObjectToView);
+    widgetAdaptor.setFixedSize(400,325);
+    widgetAdaptor.setSource(QUrl("qrc:/qml/MarketsToday.qml"));
+    widgetAdaptor.setWindowTitle("Markets Today");
+
+    LogUtility logUtility;
+    logUtility.logMessage(widgetAdaptor.engine()->offlineStoragePath());
+
+    QObject *rootObject = dynamic_cast<QObject*>(widgetAdaptor.rootObject());
+    //Signal to display config window when user clicks config icon
+    QObject::connect(rootObject, SIGNAL(showConfigInNewWindow()), &widgetAdaptor, SLOT(displayConfigWindow()));
+    //Signal to reload configuration and update quotes after config window is clicked
+    QObject::connect(&widgetAdaptor, SIGNAL(initializeWidget()), rootObject, SLOT(initialize()));
+
+    widgetAdaptor.show();
+    app.exec();
+}
diff --git a/src/cpp/marketstodayqmlview.cpp b/src/cpp/marketstodayqmlview.cpp
new file mode 100644 (file)
index 0000000..c087bb1
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+@version: 0.1
+@author: Sudheer K. <scifi1947 at gmail.com>
+@license: GNU General Public License
+*/
+
+#include "marketstodayqmlview.h"
+#include "configqmlview.h"
+#include <QDeclarativeEngine>
+#include <QDeclarativeContext>
+#include "logutility.h"
+#include <QDebug>
+
+MarketsTodayQMLView::MarketsTodayQMLView(QWidget *parent) : QDeclarativeView(parent), logUtility(new LogUtility(this))
+{    
+    // Setup QDeclarativeView
+    //setAttribute(Qt::WA_OpaquePaintEvent);
+    setAttribute(Qt::WA_TranslucentBackground);
+    setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
+    setAlignment(Qt::AlignCenter);
+    this->rootContext()->setContextProperty("logUtility",logUtility);
+}
+
+QSize MarketsTodayQMLView::sizeHint() const
+{
+    return QSize(400, 325);
+}
+
+void MarketsTodayQMLView::displayConfigWindow() {
+
+    ConfigQMLView *configView = new ConfigQMLView(this->parentWidget(),this);
+
+#ifdef Q_WS_MAEMO_5
+    //For maemo use a common path
+    configView->engine()->setOfflineStoragePath("/home/user/.marketstoday/OfflineStorage");
+#else
+    configView->engine()->setOfflineStoragePath("qml/OfflineStorage");
+#endif
+    configView->setResizeMode(QDeclarativeView::SizeRootObjectToView);
+    configView->setSource(QUrl("qrc:/qml/Config.qml"));
+    configView->setWindowTitle("Configuration");
+    QObject::connect((QObject*)configView->engine(), SIGNAL(quit()), configView, SLOT(configClosed()));
+    configView->showFullScreen();
+}
+
+void MarketsTodayQMLView::initialize(){
+    emit initializeWidget();
+}
+
+MarketsTodayQMLView::~MarketsTodayQMLView(){
+    qDebug() << "In destructor for MarketsTodayQMLView object";
+}
diff --git a/src/cpp/marketstodayqmlview.h b/src/cpp/marketstodayqmlview.h
new file mode 100644 (file)
index 0000000..6ec531b
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+@version: 0.1
+@author: Sudheer K. <scifi1947 at gmail.com>
+@license: GNU General Public License
+*/
+
+#ifndef MARKETSTODAYQMLVIEW_H
+#define MARKETSTODAYQMLVIEW_H
+
+#include <QDeclarativeView>
+#include "logutility.h"
+
+class MarketsTodayQMLView: public QDeclarativeView
+{
+    Q_OBJECT
+
+public:
+    MarketsTodayQMLView(QWidget *parent = 0);
+    ~MarketsTodayQMLView();
+    QSize sizeHint() const;
+
+public slots:
+    void displayConfigWindow();
+    void initialize();
+
+signals:
+    void initializeWidget();
+
+private:
+    LogUtility * const logUtility;
+
+};
+
+#endif // MARKETSTODAYQMLVIEW_H
diff --git a/src/data/icons/marketstoday.png b/src/data/icons/marketstoday.png
new file mode 100755 (executable)
index 0000000..246f021
Binary files /dev/null and b/src/data/icons/marketstoday.png differ
diff --git a/src/data/icons/marketstoday.png.base64 b/src/data/icons/marketstoday.png.base64
new file mode 100644 (file)
index 0000000..8a272fd
--- /dev/null
@@ -0,0 +1,109 @@
+ begin-base64 777 marketstoday.png
+ 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
+ kc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE
+ 3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/8
+ 7fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfIT
+ dyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxM
+ DUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8e
+ lQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zv
+ n//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vt
+ V5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmK
+ rhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N
+ 2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLd
+ tWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvtt
+ Xa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG
+ 4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+
+ 0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO
+ 32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7
+ nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+
+ cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP
+ /pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV
+ 69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98P
+ T+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9
+ 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
+ AElFTkSuQmCC
+ ====
diff --git a/src/data/marketstoday.desktop b/src/data/marketstoday.desktop
new file mode 100644 (file)
index 0000000..e63ec2b
--- /dev/null
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Name=Markets Today
+Comment=A simple desktop widget for stock quotes
+Type=qt
+X-Path=/opt/marketstoday/marketstoday
+X-Multiple-Instances=false
+X-home-applet-minwidth=400
+X-home-applet-minheight=325
+Name[en_US]=Markets Today
diff --git a/src/qmaemo5homescreenadaptor/qmaemo5homescreenadaptor.cpp b/src/qmaemo5homescreenadaptor/qmaemo5homescreenadaptor.cpp
new file mode 100644 (file)
index 0000000..bc0f53d
--- /dev/null
@@ -0,0 +1,336 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qmaemo5homescreenadaptor.h"
+
+#include <QtCore/qsocketnotifier.h>
+#include <QtCore/qpointer.h>
+
+#include <QtGui/qapplication.h>
+#include <QtGui/qx11info_x11.h>
+#include <QtGui/qwidget.h>
+#include <QtGui/qevent.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Xutil.h>
+
+static QCoreApplication::EventFilter oldEventFilter;
+static QList<QMaemo5HomescreenAdaptor *> allDesktopItems;
+
+static Atom atomByName(const char *name)
+{
+    Atom atom = XInternAtom(QX11Info::display(), name, False);
+    if (!atom)
+        qWarning("Unable to obtain %s atom. This class requires a running Hildon session.", name);
+
+    return atom;
+}
+
+enum HomescreenAtoms
+{
+    HildonAppletId               = 0,
+    NetWmWindowType              = 1,
+    Utf8String                   = 2,
+    HildonTypeHomeApplet         = 3,
+    HildonAppletSettings         = 4,
+    HildonAppletShowSettings     = 5,
+    HildonAppletOnCurrentDesktop = 6,
+    EnumCount                    = 7
+};
+
+static Atom hsAtoms[EnumCount] = { 0, 0, 0, 0, 0, 0, 0 };
+
+static void initAtoms()
+{
+    hsAtoms[HildonAppletId] = atomByName("_HILDON_APPLET_ID");
+    hsAtoms[NetWmWindowType] = atomByName("_NET_WM_WINDOW_TYPE");
+    hsAtoms[Utf8String] = atomByName("UTF8_STRING");
+    hsAtoms[HildonTypeHomeApplet] = atomByName("_HILDON_WM_WINDOW_TYPE_HOME_APPLET");
+    hsAtoms[HildonAppletSettings] = atomByName("_HILDON_APPLET_SETTINGS");
+    hsAtoms[HildonAppletShowSettings] = atomByName("_HILDON_APPLET_SHOW_SETTINGS");
+    hsAtoms[HildonAppletOnCurrentDesktop] = atomByName("_HILDON_APPLET_ON_CURRENT_DESKTOP");
+}
+
+/*! \class QMaemo5HomescreenAdaptor
+
+    \brief The QMaemo5HomescreenAdaptor flags a top-level QWidget as homescreen widget
+
+    QMaemo5HomescreenAdaptor is used in conjunction with the Qt for Maemo homescreen
+    loader. It evaluates the two command line arguments "-plugin-id" and "-write-pipe"
+    to set up a Qt top-level widget as Maemo 5 homescreen widget.
+
+    Note: By default, the widget will have a black background. In order to make the
+    widget transparent, set the Qt::WA_TranslucentBackground widget attribute.
+
+    Example:
+
+    \code
+    QLabel *label = new QLabel("Hello Homescreen");
+    new QMaemo5HomescreenAdaptor(label);
+    label->show();
+    \endcode
+
+    Maemo 5 supports homescreen widgets with settings dialogs. To use it, set
+    the settingsAvailable() property and show a settings dialog when the
+    settingsRequested() signal is emitted.
+
+    Maemo 5 supports more than one homescreen. In order to determine whether
+    the homescreen widget is on the currently visible homescreen, connect to
+    the homescreenChanged() signal.
+*/
+
+/*! \property QMaemo5HomescreenAdaptor::settingsAvailable
+
+    Set this property to true if the widget can make use of a settings dialog,
+    otherwise to false. When this property is set to true, the Maemo 5 homescreen
+    renders a small settings icon on top of the homescreen widget when the
+    user enters the desktop menu. When the user clicks that settings icon, the
+    settingsRequested() signal is emitted.
+
+    The default is false.
+
+    \sa settingsRequested()
+ */
+
+/*! \fn void settingsRequested()
+
+    This signal is emitted every time the homescreen widget's settings icon is
+    invoked by the user. Note that this icon is only visible when the settingsAvailable()
+    property is set.
+
+    \sa settingsAvailable()
+ */
+
+/*! \fn void homescreenChanged(bool isOnCurrentHomescreen)
+
+    This is signal is emitted when current homescreen changes and the homescreen
+    widget becomes visible or invisible. The \a isOnCurrentHomescreen argument
+    indicates whether the homescreen widget is on the current homescreen or not.
+
+    This signal can be used to start/stop background processing in order to save
+    battery life.
+ */
+
+/*!
+    Constructs a new QMaemo5HomescreenAdaptor for the given \a widget.
+
+    Note: The widget must be a top-level widget, and must not be reparented
+    during the lifetime of this adaptor.
+
+    Note: \a widget is also the parent of this class, if the widget is destroyed,
+    so is this adaptor.
+ */
+QMaemo5HomescreenAdaptor::QMaemo5HomescreenAdaptor(QWidget *widget)
+    : QObject(widget),
+      hasSettings(false)
+{
+    Q_ASSERT(widget->isWindow());
+
+    if (!hsAtoms[0])
+        initAtoms();
+
+    Display *display = QX11Info::display();
+
+    const QStringList args = QApplication::arguments();
+
+    // parse the command line arguments.
+    int idx;
+    if ((idx = args.indexOf(QLatin1String("-plugin-id"))) != -1) {
+        appletId = args.value(idx + 1);
+        const QByteArray pluginId = appletId.toUtf8();
+        if (!pluginId.isEmpty()) {
+            XChangeProperty(display,
+                    widget->winId(),
+                    hsAtoms[HildonAppletId],
+                    hsAtoms[Utf8String], 8, PropModeReplace,
+                    reinterpret_cast<const unsigned char *>(pluginId.constData()),
+                    pluginId.length());
+        }
+    }
+    if ((idx = args.indexOf(QLatin1String("-write-pipe"))) != -1) {
+        bool ok;
+        int sockId = args.value(idx + 1).toInt(&ok);
+        if (ok) {
+            socketNotifier = new QSocketNotifier(sockId, QSocketNotifier::Exception, this);
+            connect(socketNotifier, SIGNAL(activated(int)), this, SLOT(socketException()));
+        }
+    }
+
+    // set the X11 atoms to flag our widget as homescreen widget
+    if (!appletId.isEmpty()) {
+        XChangeProperty(display,
+                widget->winId(),
+                hsAtoms[NetWmWindowType],
+                XA_ATOM, 32, PropModeReplace,
+                reinterpret_cast<const unsigned char *>(&hsAtoms[HildonTypeHomeApplet]),
+                1);
+
+        updateStatus();
+
+        // --- make this window a child of root
+        XSetTransientForHint(display, widget->winId(),
+                             RootWindow(display, widget->x11Info().screen()));
+
+        // --- add an x11 event filter
+        if (!oldEventFilter)
+            oldEventFilter = QCoreApplication::instance()->setEventFilter(applicationEventFilter);
+
+        allDesktopItems.append(this);
+
+        // --- set WM input hints indicating that we don't want focus events
+        XWMHints *h = XGetWMHints(display, widget->winId());
+        XWMHints wm_hints;
+        if (!h) {
+            memset(&wm_hints, 0, sizeof(wm_hints)); // make valgrind happy
+            h = &wm_hints;
+        }
+        h->flags |= InputHint;
+        h->input = False;
+
+        XSetWMHints(display, widget->winId(), h);
+        if (h != &wm_hints)
+            XFree(h);
+
+        widget->setMouseTracking(true);
+    }
+}
+
+QMaemo5HomescreenAdaptor::~QMaemo5HomescreenAdaptor()
+{
+    allDesktopItems.removeOne(this);
+}
+
+/*! \internal */
+void QMaemo5HomescreenAdaptor::updateStatus()
+{
+    if (appletId.isEmpty())
+        return;
+
+    Display *display = QX11Info::display();
+
+    // Set or remove settings property
+    if (hasSettings)
+        XChangeProperty(display,
+                appletWidget()->winId(),
+                hsAtoms[HildonAppletSettings],
+                XA_CARDINAL, 32, PropModeReplace,
+                (const unsigned char *) &(hasSettings), 1);
+    else
+        XDeleteProperty(display,
+                appletWidget()->winId(),
+                hsAtoms[HildonAppletSettings]);
+}
+
+/*! \internal */
+void QMaemo5HomescreenAdaptor::socketException()
+{
+    socketNotifier->setEnabled(false);
+    appletWidget()->close();
+}
+
+bool qt_sendSpontaneousEvent(QObject *receiver, QEvent *event)
+{
+    return QCoreApplication::sendSpontaneousEvent(receiver, event);
+}
+
+
+
+/*! \internal */
+bool QMaemo5HomescreenAdaptor::applicationEventFilter(void *message, long *result)
+{
+    static QPointer<QWidget> lastMouseWidget;
+    bool retval = false;
+
+    if (oldEventFilter)
+        retval = oldEventFilter(message, result);
+
+    if (allDesktopItems.isEmpty())
+        return retval;
+
+    XEvent *ev = reinterpret_cast<XEvent *>(message);
+
+    // Generate a mouse release for a leave Notify (as we don't get the mouse release from X11)
+    if (ev->type == ButtonPress) {
+        QPoint globalPos( ev->xbutton.x_root, ev->xbutton.y_root);
+        QWidget *widget = QWidget::find((WId)ev->xany.window);
+        if (widget) {
+            lastMouseWidget = widget->childAt(widget->mapFromGlobal(globalPos));
+            if (!lastMouseWidget)
+                lastMouseWidget = widget;
+        }
+
+    } else if (ev->type == ButtonRelease) {
+        lastMouseWidget = 0;
+
+    } else if (ev->type == LeaveNotify) {
+        if (lastMouseWidget) {
+            // create a mouse up event that lies in Nirvana.
+            QPoint pos(-1000, -1000);
+            QMouseEvent e(QEvent::MouseButtonRelease, pos, pos, Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
+            qt_sendSpontaneousEvent(lastMouseWidget, &e);
+            lastMouseWidget = 0;
+       }
+
+    } else if (ev->type == ClientMessage) {
+        XClientMessageEvent *cm = (XClientMessageEvent *)message;
+        if (cm->message_type == hsAtoms[HildonAppletShowSettings]) {
+            for (int i = 0; i < allDesktopItems.count(); ++i) {
+                if (allDesktopItems.at(i)->appletWidget()->winId() == ev->xproperty.window) {
+                    emit allDesktopItems.at(i)->settingsRequested();
+                    retval = true;
+                }
+            }
+        }
+    } else if (ev->type == PropertyNotify) {
+        if (ev->xproperty.atom == hsAtoms[HildonAppletOnCurrentDesktop]) {
+            for (int i = 0; i < allDesktopItems.count(); ++i) {
+                if (allDesktopItems.at(i)->appletWidget()->winId() == ev->xproperty.window) {
+                    emit allDesktopItems.at(i)->homescreenChanged(ev->xproperty.state == 0);
+                    retval = true;
+                }
+            }
+        }
+    }
+
+    return retval;
+}
+
diff --git a/src/qmaemo5homescreenadaptor/qmaemo5homescreenadaptor.h b/src/qmaemo5homescreenadaptor/qmaemo5homescreenadaptor.h
new file mode 100644 (file)
index 0000000..9270649
--- /dev/null
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QMAEMO5HOMESCREENADAPTOR_H
+#define QMAEMO5HOMESCREENADAPTOR_H
+
+#include <QtCore/qobject.h>
+#include <QtCore/qpointer.h>
+#include <QtGui/qwidget.h>
+
+class QWidget;
+class QSocketNotifier;
+
+class QMaemo5HomescreenAdaptor : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(bool settingsAvailable READ settingsAvailable WRITE setSettingsAvailable)
+
+public:
+    QMaemo5HomescreenAdaptor(QWidget *widget);
+    ~QMaemo5HomescreenAdaptor();
+
+    inline void setSettingsAvailable(bool available)
+    {
+        hasSettings = available;
+        updateStatus();
+    }
+
+    inline bool settingsAvailable() const
+    {
+        return hasSettings;
+    }
+
+Q_SIGNALS:
+    void settingsRequested();
+    void homescreenChanged(bool isOnCurrentHomescreen);
+
+private Q_SLOTS:
+    void socketException();
+
+private:
+    inline QWidget *appletWidget() const { return static_cast<QWidget *>(parent()); }
+
+    void updateStatus();
+
+    static bool applicationEventFilter(void *message, long *result);
+
+    bool hasSettings;
+    QString appletId;
+    QSocketNotifier *socketNotifier;
+};
+
+#endif
diff --git a/src/qmaemo5homescreenadaptor/qmaemo5homescreenadaptor.pri b/src/qmaemo5homescreenadaptor/qmaemo5homescreenadaptor.pri
new file mode 100644 (file)
index 0000000..73d41c3
--- /dev/null
@@ -0,0 +1,4 @@
+HEADERS += $$PWD/qmaemo5homescreenadaptor.h
+SOURCES += $$PWD/qmaemo5homescreenadaptor.cpp
+
+INCLUDEPATH += $$PWD
diff --git a/src/qml/Config.qml b/src/qml/Config.qml
new file mode 100644 (file)
index 0000000..9ece6bf
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+@version: 0.1
+@author: Sudheer K. <scifi1947 at gmail.com>
+@license: GNU General Public License
+*/
+
+import Qt 4.7
+import "Library" as Library
+
+Rectangle {
+    id: screen
+
+    width: 800; height: 480
+
+    property int componentWidth: screen.width
+    property int itemHeight: 50
+
+    function close(){
+        Qt.quit();
+    }
+
+    function back(){
+        configArea.sourceComponent = configParentComponent;
+        titleBar.buttonType = "Close";
+    }    
+
+    Library.TitleBar {
+        id: titleBar; width: parent.width; height: 60;
+        anchors.top: parent.top
+        title: "Markets Today - Configuration"
+        buttonType: "Close"
+        onCloseClicked: close()
+        onBackClicked: back()
+    }
+
+    Loader {
+        id: configArea
+        sourceComponent: configParentComponent
+        anchors.top: titleBar.bottom
+        anchors.bottom: parent.bottom
+        width: parent.width
+    }
+
+    Component {
+        id: configParentComponent
+        ConfigOptionsComponent {
+            id: configOptionsComponent
+            onTickersOptionSelected: {
+                configArea.sourceComponent = tickersComponent;
+                titleBar.buttonType = "Back";
+            }
+            onSettingsOptionSelected: {
+                configArea.sourceComponent = settingsComponent;
+                titleBar.buttonType = "Back";
+            }
+        }
+    }
+
+    Component {
+        id: tickersComponent
+        ConfigTickersComponent {
+            id: tickersTab
+            anchors.fill: parent
+            componentWidth: screen.componentWidth
+            itemHeight: screen.itemHeight
+            onLogRequest: logUtility.logMessage(strMessage)
+
+        }
+    }
+
+    Component {
+        id: settingsComponent
+        ConfigParametersComponent {
+            id: settingsTab
+            anchors.fill: parent
+            onLogRequest: logUtility.logMessage(strMessage)
+        }
+    }
+}
diff --git a/src/qml/ConfigOptionsComponent.qml b/src/qml/ConfigOptionsComponent.qml
new file mode 100644 (file)
index 0000000..a81ec49
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+@version: 0.1
+@author: Sudheer K. <scifi1947 at gmail.com>
+@license: GNU General Public License
+*/
+
+import Qt 4.7
+
+Rectangle {
+    id: configOptionsComponent
+    anchors.fill: parent;
+    color: "#343434"
+    clip: true
+
+    signal tickersOptionSelected
+    signal settingsOptionSelected
+
+    Rectangle {
+        id: iconTickersArea
+        width: 128
+        height: 128
+        border.width: 1
+        border.color: "#BFBFBF"
+        color:"#2E2E2E"
+        anchors.verticalCenter: parent.verticalCenter
+        anchors.horizontalCenter: parent.horizontalCenter
+        anchors.horizontalCenterOffset: -0.25 * parent.width
+        radius: 15
+        Image {
+            source: "Library/images/icon_stocks.png"
+            anchors.fill: parent            
+        }
+
+        MouseArea{
+            id: iconTickersMouseArea
+            anchors.fill: parent
+            onClicked: {
+                configOptionsComponent.tickersOptionSelected();
+            }
+        }
+
+        states: State {
+                 name: "pressed"; when: iconTickersMouseArea.pressed
+                 PropertyChanges { target: iconTickersArea; color: "#9a9a9a"}
+        }
+    }
+
+    Rectangle {
+        id: iconSettingsArea
+        width: 128
+        height: 128
+        border.width: 1
+        border.color: "#BFBFBF"
+        color:"#2E2E2E"
+        anchors.verticalCenter: parent.verticalCenter
+        anchors.horizontalCenter: parent.horizontalCenter
+        anchors.horizontalCenterOffset: 0.25 * parent.width
+        radius: 15
+        Image {
+            source: "Library/images/icon_settings.png"
+            anchors.fill: parent
+        }
+
+        MouseArea{
+            id: iconSettingsMouseArea
+            anchors.fill: parent
+            onClicked: {
+                configOptionsComponent.settingsOptionSelected();
+            }
+        }
+        states: State {
+                 name: "pressed"; when: iconSettingsMouseArea.pressed
+                 PropertyChanges { target: iconSettingsArea; color: "#9a9a9a"}
+        }
+    }
+
+}
diff --git a/src/qml/ConfigParametersComponent.qml b/src/qml/ConfigParametersComponent.qml
new file mode 100644 (file)
index 0000000..8cf3482
--- /dev/null
@@ -0,0 +1,171 @@
+/*
+@version: 0.1
+@author: Sudheer K. <scifi1947 at gmail.com>
+@license: GNU General Public License
+*/
+
+import Qt 4.7
+import "Library/js/DBUtility.js" as DBUtility
+
+Item {
+    id: configParametersComponent
+    property bool updateFreqEnabled
+    property string  updateFreqMin
+    property bool updateWeekdaysOnly
+    signal logRequest(string strMessage)
+
+    Rectangle {
+        id: updateConfig
+        anchors.fill: parent
+        color:"#343434"
+
+        Component.onCompleted: {
+                DBUtility.initialize();
+                loadSettings();
+        }
+
+        Component.onDestruction:{
+            logRequest("Saving settings");
+            saveSettings();
+        }
+
+        function loadSettings(){
+            var value;
+            value  = DBUtility.getSetting("UpdateFreqency");
+            if (!value || value == "0.0" || value == ""){
+                configParametersComponent.updateFreqEnabled = false;
+            }
+            else{
+                configParametersComponent.updateFreqEnabled = true;
+                configParametersComponent.updateFreqMin = parseInt(value);
+            }
+            value  = DBUtility.getSetting("UpdateWeekdaysOnly");
+            if (!value || value == "0.0" || value == ""){
+                configParametersComponent.updateWeekdaysOnly = false;
+            }
+            else{
+                configParametersComponent.updateWeekdaysOnly = true;
+            }
+        }
+
+        function saveSettings(){
+            DBUtility.setSetting("UpdateFreqency",configParametersComponent.updateFreqMin);
+            DBUtility.setSetting("UpdateWeekdaysOnly",(configParametersComponent.updateWeekdaysOnly?1:0));
+        }
+
+        Text {
+            id: autoUpdateSectionLabel
+            anchors.top: parent.top
+            //anchors.topMargin: 10
+            anchors.left: parent.left
+            anchors.leftMargin: 45
+            height: 50
+            horizontalAlignment: Text.AlignLeft; verticalAlignment: Text.AlignVCenter
+            font.pixelSize: 22; font.bold: true; elide: Text.ElideRight; color: "#B8B8B8"; style: Text.Raised; styleColor: "black"
+            text: "Auto-Update"
+        }
+
+        Rectangle {
+            id: autoUpdateSection
+            border.width: 1
+            border.color: "#BFBFBF"
+            color:"#2E2E2E"
+            anchors.top: autoUpdateSectionLabel.bottom
+            anchors.topMargin: 10
+            anchors.left: parent.left
+            anchors.leftMargin: 40
+            anchors.right: parent.right
+            anchors.rightMargin: 40
+            height: 120
+            radius: 15
+
+            Row {
+                id: rowUpdateFreq
+                anchors.top: parent.top
+                anchors.topMargin: 5
+                anchors.left: parent.left
+                anchors.leftMargin: 5
+                anchors.right: parent.right
+                height: 50
+                spacing: 5
+
+                Image {
+                    id: checkboxUpdateFreqImg
+                    source: configParametersComponent.updateFreqEnabled? "Library/images/checkbox_checked.png":"Library/images/checkbox_unchecked.png"
+                    width: 32; height: 32
+                    MouseArea {
+                        anchors.fill: parent;
+                        onClicked: {
+                            configParametersComponent.updateFreqEnabled = !configParametersComponent.updateFreqEnabled;
+                            if (!configParametersComponent.updateFreqEnabled){
+                                txtUpdateFreqMin.text = "";
+                                configParametersComponent.updateWeekdaysOnly = false;
+                            }
+                        }
+                    }
+                }
+
+                Text{
+                    height:parent.height
+                    horizontalAlignment: Text.AlignLeft; verticalAlignment: Text.AlignVCenter
+                    font.pixelSize: 20; font.bold: false; elide: Text.ElideRight; style: Text.Raised; styleColor: "black"
+                    text: "Every "
+                    color: configParametersComponent.updateFreqEnabled? "#ffffff" :"#B8B8B8";
+                }
+                Item {
+                    height: 40
+                    width: 80
+                    BorderImage { source: "Library/images/lineedit.sci"; anchors.fill: parent }
+                    TextInput{                        
+                        id: txtUpdateFreqMin
+                        anchors.fill: parent
+                        focus: true
+                        text: configParametersComponent.updateFreqMin
+                        horizontalAlignment: Text.AlignHCenter
+                        inputMethodHints: Qt.ImhDigitsOnly | Qt.ImhNoPredictiveText
+                        onTextChanged: {
+                            configParametersComponent.updateFreqMin = txtUpdateFreqMin.text;
+                        }
+                    }
+                }
+                Text{
+                    height:parent.height
+                    horizontalAlignment: Text.AlignLeft; verticalAlignment: Text.AlignVCenter
+                    font.pixelSize: 20; font.bold: false; elide: Text.ElideRight; style: Text.Raised; styleColor: "black"
+                    text: " minutes"
+                    color: configParametersComponent.updateFreqEnabled? "#ffffff" :"#B8B8B8";
+                }
+            }
+            Row {
+                id: rowUpdateDays
+                anchors.top: rowUpdateFreq.bottom
+                anchors.topMargin: 5
+                anchors.left: parent.left
+                anchors.leftMargin: 5
+                anchors.right: parent.right
+                height: 50
+                spacing: 5
+
+                Image {
+                    id: checkboxUpdateWeekdays
+                    source: configParametersComponent.updateWeekdaysOnly? "Library/images/checkbox_checked.png":"Library/images/checkbox_unchecked.png"
+                    width: 32; height: 32
+                    MouseArea {
+                        anchors.fill: parent;
+                        onClicked: {
+                            configParametersComponent.updateWeekdaysOnly = !configParametersComponent.updateWeekdaysOnly;
+                        }
+                    }
+                }
+
+                Text{
+                    height:parent.height
+                    horizontalAlignment: Text.AlignLeft; verticalAlignment: Text.AlignVCenter
+                    font.pixelSize: 20; font.bold: false; elide: Text.ElideRight; style: Text.Raised; styleColor: "black"
+                    text: "Only on weekdays"
+                    color: configParametersComponent.updateWeekdaysOnly? "#ffffff" :"#B8B8B8";
+                }
+            }
+        }
+    }
+}
diff --git a/src/qml/ConfigTickersComponent.qml b/src/qml/ConfigTickersComponent.qml
new file mode 100644 (file)
index 0000000..98ef112
--- /dev/null
@@ -0,0 +1,208 @@
+/*
+@version: 0.1
+@author: Sudheer K. <scifi1947 at gmail.com>
+@license: GNU General Public License
+*/
+
+import Qt 4.7
+import "Library/js/DBUtility.js" as DBUtility
+
+Item {
+    id: tickerTab
+    property int componentWidth
+    property int itemHeight
+    signal logRequest(string strMessage)
+
+    Component.onCompleted: {
+            DBUtility.initialize();
+            loadSymbols();
+    }
+
+    function loadSymbols(){
+        var symbolsArray = DBUtility.getAllSymbols();
+        if (symbolsArray && symbolsArray.length > 0){
+            var i = 0;
+            for (i = 0; i< symbolsArray.length; i++) {
+                logRequest("Appending "+symbolsArray[i]+ " to ListModel");
+                symbolsListModel.append({"symbol": symbolsArray[i]});
+            }
+            logRequest("ListModel count is  "+symbolsListModel.count);
+        }
+    }
+
+    function removeSymbol(symbol,index){
+        logRequest("Removing symbol "+symbol+" at index "+index);
+
+        var result = DBUtility.removeSymbol(symbol);
+        if (result != "Error"){
+            symbolsListModel.remove(index);
+        }
+        else{
+            logRequest("Error: DB error while removing "+symbol+" at index "+index);
+        }
+
+    }
+
+    function addSymbol(symbol){
+        if (symbol && symbol.length > 0){
+            symbol = symbol.toUpperCase();
+            logRequest("Adding symbol "+symbol);
+            var result = DBUtility.addSymbol(symbol);
+            logRequest("Result is "+result);
+
+            if (result != "Error"){
+                symbolsListModel.append({"symbol": symbol});
+            }
+            else{
+                logRequest("Error: DB error while adding "+symbol);
+            }
+        }
+        else{
+            logRequest("Error: Invalid symbol "+symbol);
+        }
+    }
+
+    ListModel {
+        id: symbolsListModel
+    }
+
+    Component {
+        id: tickersListDelegate
+
+        Item {
+            id: wrapper; width: componentWidth; height: itemHeight
+            Rectangle { id: listRecord;
+                color: "black";
+                opacity: index % 2 ? 0.2 : 0.4;
+                height: parent.height - 2;
+                width: parent.width; y: 1 }
+
+            Text {
+                text: symbol;
+                anchors.left: parent.left
+                anchors.leftMargin: 30
+                anchors.verticalCenter: parent.verticalCenter
+                verticalAlignment: Text.AlignVCenter
+                width: parent.width - 120;
+                height: parent.height
+                font.pixelSize: 18;
+                font.bold: true;
+                elide: Text.ElideRight;
+                color: "white";
+                style: Text.Raised;
+                styleColor: "black"
+            }
+
+            Rectangle {
+                id: removeButtonArea
+                width: 120
+                height: parent.height
+                anchors.right: parent.right
+                color: "#00000000";
+
+                Image {
+                    source: "Library/images/remove.png"
+                    anchors.centerIn: parent
+                    width: 32; height: 32
+                }
+
+                MouseArea{
+                    id:removeButtonMouseArea
+                    anchors.fill: parent
+                    onClicked: {
+                        removeSymbol(symbol,index)
+                    }
+                }
+
+                states: State {
+                         name: "pressed"; when: removeButtonMouseArea.pressed
+                         PropertyChanges { target: removeButtonArea; color: "#9a9a9a"}
+                }
+            }
+        }
+    }
+
+    Rectangle {
+        id: newSymbolRow
+        //width: parent.width
+        width: componentWidth
+        height: itemHeight;
+        anchors.top: parent.top
+        color: "#343434"
+
+        Item {
+            id: lineEditItem
+            width: parent.width - 120
+            height: parent.height
+            anchors.verticalCenter: parent.verticalCenter
+            anchors.left: parent.left
+            BorderImage { source: "Library/images/lineedit.sci"; anchors.fill: parent }
+            TextInput{
+                id: newSymbol
+                width: parent.width
+                height: parent.height
+                anchors.left: parent.left
+                anchors.leftMargin: 5
+                anchors.verticalCenter: parent.verticalCenter
+                maximumLength:25
+                font.pixelSize: 18
+                font.bold: true
+                font.capitalization: Font.AllUppercase
+                color: "#151515"; selectionColor: "green"
+                KeyNavigation.tab: addButton
+                Keys.onReturnPressed: {
+                    logRequest("Return pressed");
+                    addSymbol(newSymbol.text.trim());
+                    newSymbol.text = "";
+                }
+                Keys.onEnterPressed: {
+                    logRequest("Enter pressed");
+                    addSymbol(newSymbol.text.trim());
+                    newSymbol.text = "";
+                }
+                focus: true
+            }
+        }
+
+        Rectangle {
+            id: addButtonArea
+            anchors.verticalCenter: parent.verticalCenter
+            anchors.right: parent.right
+            width: 120
+            height: parent.height
+            color:"#343434"
+            Image {
+                id: addButton
+                source: "Library/images/add.png"
+                width: 32; height: 32
+                anchors.centerIn: parent
+            }
+            MouseArea{
+                id:addButtonMouseArea
+                anchors.fill: parent
+                onClicked: {
+                     addSymbol(newSymbol.text.trim());
+                     newSymbol.text = "";
+                }
+            }
+            states: State {
+                     name: "pressed"; when: addButtonMouseArea.pressed
+                     PropertyChanges { target: addButtonArea; color: "#9a9a9a"}
+            }
+        }
+    }
+    Rectangle{
+        anchors.top: newSymbolRow.bottom
+        anchors.bottom: parent.bottom
+        width: parent.width;
+
+        color:"#343434"
+        ListView{
+            id: symbolsListView
+            anchors.fill: parent
+            model: symbolsListModel
+            delegate: tickersListDelegate
+        }
+
+    }
+}
diff --git a/src/qml/Library/TitleBar.qml b/src/qml/Library/TitleBar.qml
new file mode 100644 (file)
index 0000000..f6dff31
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+@version: 0.1
+@author: Sudheer K. <scifi1947 at gmail.com>
+@license: GNU General Public License
+
+Based on Nokia Qt Quick Demos with copyright notice below.
+
+Source: http://doc.qt.nokia.com/4.7-snapshot/demos-declarative-twitter-twittercore-titlebar-qml.html
+*/
+
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import Qt 4.7
+
+Item {
+    id: titleBar
+    property string title: "Markets Today"
+    property string buttonType: "Config"
+    signal settingsClicked
+    signal closeClicked
+    signal backClicked
+
+    BorderImage { source: "images/titlebar.sci"; width: parent.width; height: parent.height + 14; y: -7 }
+
+    Item {
+        id: container
+        width: parent.width; height: parent.height
+
+        Text {
+            id: categoryText            
+            anchors {
+                leftMargin: 5; rightMargin: 10
+                verticalCenter: parent.verticalCenter
+                horizontalCenter: parent.horizontalCenter
+            }
+            elide: Text.ElideMiddle
+            text: title
+            font.bold: true; color: "White"; style: Text.Raised; styleColor: "Black"
+            font.pixelSize: 18
+        }
+
+        Component {
+            id: configButton
+
+            Rectangle {
+                id: configButtonArea
+                anchors.fill: parent
+                color: "#00000000"
+
+                Image {
+                    source: "images/config.png"
+                    width: 40; height: 40
+                    anchors.centerIn: parent
+                }
+
+                MouseArea{
+                  id: configButtonMouseArea
+                  anchors.fill: parent
+                  onClicked: {
+                      titleBar.settingsClicked();
+                  }
+                }
+
+                states: State {
+                         name: "pressed"; when: configButtonMouseArea.pressed
+                         PropertyChanges { target: configButtonArea; color: "#9a9a9a"}
+                }
+            }
+        }
+
+        Component {
+            id: closeButton
+
+            Rectangle {
+                id: closeButtonArea
+                anchors.fill: parent
+                color: "#00000000"
+
+                Image {
+                    source: "images/close.png"
+                    width: 32; height: 32
+                    anchors.centerIn: parent
+                }
+
+                MouseArea{
+                  id: closeButtonMouseArea
+                  anchors.fill: parent
+                  onClicked: titleBar.closeClicked();
+                }
+
+                states: State {
+                         name: "pressed"; when: closeButtonMouseArea.pressed
+                         PropertyChanges { target: closeButtonArea; color: "#9a9a9a"}
+                }
+            }
+        }
+
+        Component {
+            id: backButton
+
+            Rectangle {
+                id: backButtonArea
+                anchors.fill: parent
+                color: "#00000000"
+
+                Image {
+                    source: "images/back.png"
+                    width: 32; height: 32
+                    anchors.centerIn: parent
+                }
+                MouseArea{
+                  id: backButtonMouseArea
+                  anchors.fill: parent
+                  onClicked: titleBar.backClicked();
+                }
+
+                states: State {
+                         name: "pressed"; when: backButtonMouseArea.pressed
+                         PropertyChanges { target: backButtonArea; color: "#9a9a9a"}
+                }
+            }
+        }
+
+        Loader {
+            width: 80
+            height: parent.height
+            anchors.right: parent.right
+            sourceComponent: buttonType == "Config" ? configButton : (buttonType == "Close"? closeButton: backButton)
+        }
+    }
+}
diff --git a/src/qml/Library/ToolBar.qml b/src/qml/Library/ToolBar.qml
new file mode 100644 (file)
index 0000000..c977d93
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+@version: 0.1
+@author: Sudheer K. <scifi1947 at gmail.com>
+@license: GNU General Public License
+*/
+
+import Qt 4.7
+
+Item {
+    id: toolbar
+    property bool updatePending: false
+
+    signal reloadButtonClicked
+    signal downButtonClicked
+    signal upButtonClicked
+    signal newsButtonClicked
+
+    BorderImage { source: "images/toolbar.sci"; width: parent.width; height: parent.height + 14; y: -7 }
+
+    Rectangle {
+        id: reloadButtonArea
+        width: 60
+        height: parent.height
+        anchors.left: parent.left
+        color: "#00000000"
+
+        Image {
+            id: reloadButton
+            source: "images/reload.png"
+            width: 32; height: 32
+            anchors.centerIn: parent
+
+            NumberAnimation on rotation {
+                from: 0; to: 360; running: toolbar.updatePending == true; loops: Animation.Infinite; duration: 900
+            }
+        }
+
+        MouseArea{
+          id: reloadButtonMouseArea
+          anchors.fill: parent
+          onClicked: {
+              toolbar.updatePending = true;
+              toolbar.reloadButtonClicked();
+          }
+        }
+
+        states: State {
+                 name: "pressed"; when: reloadButtonMouseArea.pressed
+                 PropertyChanges { target: reloadButtonArea; color: "#9a9a9a"}
+        }
+    }
+
+    Rectangle {
+        id: downButtonArea
+        width: 60
+        height: parent.height
+        anchors.right: parent.horizontalCenter; anchors.horizontalCenterOffset: -60;
+        color: "#00000000"
+
+        Image {
+            id: downButton
+            source: "images/down.png"
+            width: 32; height: 32
+            anchors.verticalCenter: parent.verticalCenter
+            anchors.right: parent.right
+            anchors.rightMargin: 5
+        }
+
+        MouseArea{
+          id: downButtonMouseArea
+          anchors.fill: parent
+          onClicked: toolbar.downButtonClicked()
+        }
+
+        states: State {
+                 name: "pressed"; when: downButtonMouseArea.pressed
+                 PropertyChanges { target: downButtonArea; color: "#9a9a9a"}
+        }
+    }
+
+
+    Rectangle {
+        id: upButtonArea
+        width: 60
+        height: parent.height
+        anchors.left: parent.horizontalCenter; anchors.horizontalCenterOffset: 60;
+        color: "#00000000"
+
+        Image {
+            id: upButton
+            source: "images/up.png"
+            width: 32; height: 32
+            anchors.verticalCenter: parent.verticalCenter
+            anchors.left: parent.left
+            anchors.leftMargin: 5
+        }
+
+        MouseArea{
+          id: upButtonMouseArea
+          anchors.fill: parent
+          onClicked: toolbar.upButtonClicked()
+        }
+
+        states: State {
+                 name: "pressed"; when: upButtonMouseArea.pressed
+                 PropertyChanges { target: upButtonArea; color: "#9a9a9a"}
+        }
+    }
+
+    Rectangle {
+        id: newsButtonArea
+        width: 60
+        height: parent.height
+        anchors.right: parent.right
+        color: "#00000000"
+
+        Image {
+            id: newsButton
+            source: "images/news.png"
+            width: 32; height: 32
+            anchors.centerIn: parent
+        }
+
+        MouseArea{
+          id: newsButtonMouseArea
+          anchors.fill: parent
+          onClicked: toolbar.newsButtonClicked()
+        }
+
+        states: State {
+                 name: "pressed"; when: newsButtonMouseArea.pressed
+                 PropertyChanges { target: newsButtonArea; color: "#9a9a9a"}
+        }
+    }
+}
diff --git a/src/qml/Library/images/add.png b/src/qml/Library/images/add.png
new file mode 100644 (file)
index 0000000..302b60c
Binary files /dev/null and b/src/qml/Library/images/add.png differ
diff --git a/src/qml/Library/images/back.png b/src/qml/Library/images/back.png
new file mode 100644 (file)
index 0000000..7d5b116
Binary files /dev/null and b/src/qml/Library/images/back.png differ
diff --git a/src/qml/Library/images/checkbox_checked.png b/src/qml/Library/images/checkbox_checked.png
new file mode 100755 (executable)
index 0000000..cd2ba8f
Binary files /dev/null and b/src/qml/Library/images/checkbox_checked.png differ
diff --git a/src/qml/Library/images/checkbox_unchecked.png b/src/qml/Library/images/checkbox_unchecked.png
new file mode 100755 (executable)
index 0000000..7592e51
Binary files /dev/null and b/src/qml/Library/images/checkbox_unchecked.png differ
diff --git a/src/qml/Library/images/close.png b/src/qml/Library/images/close.png
new file mode 100755 (executable)
index 0000000..845ec0c
Binary files /dev/null and b/src/qml/Library/images/close.png differ
diff --git a/src/qml/Library/images/config.png b/src/qml/Library/images/config.png
new file mode 100755 (executable)
index 0000000..96d0c69
Binary files /dev/null and b/src/qml/Library/images/config.png differ
diff --git a/src/qml/Library/images/down.png b/src/qml/Library/images/down.png
new file mode 100755 (executable)
index 0000000..fc8ad8a
Binary files /dev/null and b/src/qml/Library/images/down.png differ
diff --git a/src/qml/Library/images/gloss.png b/src/qml/Library/images/gloss.png
new file mode 100644 (file)
index 0000000..5d370cd
Binary files /dev/null and b/src/qml/Library/images/gloss.png differ
diff --git a/src/qml/Library/images/icon_settings.png b/src/qml/Library/images/icon_settings.png
new file mode 100755 (executable)
index 0000000..9708892
Binary files /dev/null and b/src/qml/Library/images/icon_settings.png differ
diff --git a/src/qml/Library/images/icon_stocks.png b/src/qml/Library/images/icon_stocks.png
new file mode 100755 (executable)
index 0000000..bf79b4b
Binary files /dev/null and b/src/qml/Library/images/icon_stocks.png differ
diff --git a/src/qml/Library/images/lineedit.png b/src/qml/Library/images/lineedit.png
new file mode 100644 (file)
index 0000000..2cc38dc
Binary files /dev/null and b/src/qml/Library/images/lineedit.png differ
diff --git a/src/qml/Library/images/lineedit.sci b/src/qml/Library/images/lineedit.sci
new file mode 100644 (file)
index 0000000..054bff7
--- /dev/null
@@ -0,0 +1,5 @@
+border.left: 10
+border.top: 10
+border.bottom: 10
+border.right: 10
+source: lineedit.png
diff --git a/src/qml/Library/images/loading.png b/src/qml/Library/images/loading.png
new file mode 100644 (file)
index 0000000..47a1589
Binary files /dev/null and b/src/qml/Library/images/loading.png differ
diff --git a/src/qml/Library/images/news.png b/src/qml/Library/images/news.png
new file mode 100644 (file)
index 0000000..1c87e02
Binary files /dev/null and b/src/qml/Library/images/news.png differ
diff --git a/src/qml/Library/images/reload.png b/src/qml/Library/images/reload.png
new file mode 100755 (executable)
index 0000000..cbfbcd7
Binary files /dev/null and b/src/qml/Library/images/reload.png differ
diff --git a/src/qml/Library/images/remove.png b/src/qml/Library/images/remove.png
new file mode 100644 (file)
index 0000000..02074b8
Binary files /dev/null and b/src/qml/Library/images/remove.png differ
diff --git a/src/qml/Library/images/stripes.png b/src/qml/Library/images/stripes.png
new file mode 100644 (file)
index 0000000..9f36727
Binary files /dev/null and b/src/qml/Library/images/stripes.png differ
diff --git a/src/qml/Library/images/tab_schedule.png b/src/qml/Library/images/tab_schedule.png
new file mode 100755 (executable)
index 0000000..9f223d4
Binary files /dev/null and b/src/qml/Library/images/tab_schedule.png differ
diff --git a/src/qml/Library/images/tab_settings.png b/src/qml/Library/images/tab_settings.png
new file mode 100755 (executable)
index 0000000..3ab3c5a
Binary files /dev/null and b/src/qml/Library/images/tab_settings.png differ
diff --git a/src/qml/Library/images/tab_stocks.png b/src/qml/Library/images/tab_stocks.png
new file mode 100755 (executable)
index 0000000..a9b05de
Binary files /dev/null and b/src/qml/Library/images/tab_stocks.png differ
diff --git a/src/qml/Library/images/titlebar.png b/src/qml/Library/images/titlebar.png
new file mode 100644 (file)
index 0000000..51c9008
Binary files /dev/null and b/src/qml/Library/images/titlebar.png differ
diff --git a/src/qml/Library/images/titlebar.sci b/src/qml/Library/images/titlebar.sci
new file mode 100644 (file)
index 0000000..0418d94
--- /dev/null
@@ -0,0 +1,5 @@
+border.left: 10
+border.top: 12
+border.bottom: 12
+border.right: 10
+source: titlebar.png
diff --git a/src/qml/Library/images/toolbar.png b/src/qml/Library/images/toolbar.png
new file mode 100755 (executable)
index 0000000..5a5a3f7
Binary files /dev/null and b/src/qml/Library/images/toolbar.png differ
diff --git a/src/qml/Library/images/toolbar.sci b/src/qml/Library/images/toolbar.sci
new file mode 100644 (file)
index 0000000..879aee1
--- /dev/null
@@ -0,0 +1,5 @@
+border.left: 10
+border.top: 12
+border.bottom: 12
+border.right: 10
+source: toolbar.png
diff --git a/src/qml/Library/images/toolbutton.png b/src/qml/Library/images/toolbutton.png
new file mode 100644 (file)
index 0000000..1131001
Binary files /dev/null and b/src/qml/Library/images/toolbutton.png differ
diff --git a/src/qml/Library/images/toolbutton.sci b/src/qml/Library/images/toolbutton.sci
new file mode 100644 (file)
index 0000000..9e4f965
--- /dev/null
@@ -0,0 +1,5 @@
+border.left: 15
+border.top: 4
+border.bottom: 4
+border.right: 15
+source: toolbutton.png
diff --git a/src/qml/Library/images/up.png b/src/qml/Library/images/up.png
new file mode 100755 (executable)
index 0000000..05f05aa
Binary files /dev/null and b/src/qml/Library/images/up.png differ
diff --git a/src/qml/Library/js/Common.js b/src/qml/Library/js/Common.js
new file mode 100644 (file)
index 0000000..eef8c9e
--- /dev/null
@@ -0,0 +1,11 @@
+/*
+@version: 0.1
+@author: Sudheer K. <scifi1947 at gmail.com>
+@license: GNU General Public License
+*/
+
+function isTodayAWeekDay(){
+    var dayOfWeek = (new Date()).getDay();
+    var isWeekDay = (dayOfWeek == 0 || dayOfWeek == 6)? false : true;
+    return isWeekDay;
+}
diff --git a/src/qml/Library/js/DBUtility.js b/src/qml/Library/js/DBUtility.js
new file mode 100644 (file)
index 0000000..5904455
--- /dev/null
@@ -0,0 +1,135 @@
+/*\r
+@version: 0.1\r
+@author: Sudheer K. <scifi1947 at gmail.com>\r
+@license: GNU General Public License\r
+*/\r
+\r
+function getDatabase() {\r
+     logMessage("Opening MarketsToday database..");\r
+     return openDatabaseSync("MarketsToday", "1.0", "StorageDatabase", 100);\r
+}\r
+\r
+function logMessage(strMessage){\r
+    if (logUtility){\r
+        logUtility.logMessage(strMessage);\r
+    }\r
+    else{\r
+        console.log(strMessage);\r
+    }\r
+}\r
+\r
+// Initialize tables\r
+function initialize() {\r
+    var db = getDatabase();\r
+    db.transaction(\r
+        function(tx) {\r
+            // Create the settings table if it doesn't already exist\r
+            // If the table exists, this is skipped\r
+            tx.executeSql('CREATE TABLE IF NOT EXISTS settings(setting TEXT UNIQUE, value TEXT)');\r
+            tx.executeSql('CREATE TABLE IF NOT EXISTS tickers(symbol TEXT UNIQUE)');\r
+          },\r
+        function(error) {\r
+            logMessage("Error ["+error.code +"] - " + error.DOMString+" occurred.");\r
+         });\r
+}\r
+\r
+function getSetting(setting) {\r
+    var db = getDatabase();\r
+    var res="";\r
+    db.transaction(\r
+      function(tx) {\r
+          var rs = tx.executeSql('SELECT value FROM settings WHERE setting=?;', [setting]);\r
+          if (rs.rows.length > 0) {\r
+               res = rs.rows.item(0).value;\r
+               logMessage(setting+" is "+res);\r
+          } else {\r
+              res = "Unknown";\r
+          }\r
+      },\r
+      function(error) {\r
+         logMessage("Error ["+error.code +"] - " + error.DOMString+" occurred.");\r
+      }\r
+     );\r
+     return res;\r
+}\r
+\r
+\r
+function setSetting(setting, value) {\r
+    var db = getDatabase();\r
+    var res = "";\r
+    db.transaction(\r
+        function(tx) {\r
+            var rs = tx.executeSql('INSERT OR REPLACE INTO settings VALUES (?,?);', [setting,value]);\r
+            if (rs.rowsAffected > 0) {\r
+                res = "OK";\r
+                logMessage("Updated "+setting+" to "+value);\r
+            } else {\r
+             res = "Error";\r
+            }\r
+        },\r
+        function(error) {\r
+            logMessage("Error ["+error.code +"] - " + error.DOMString+" occurred.");\r
+        }\r
+    );\r
+   return res;\r
+}\r
+\r
+function addSymbol(symbol){\r
+    logMessage('SQL> INSERT OR REPLACE INTO tickers VALUES ('+[symbol]+')');\r
+    var db = getDatabase();\r
+    var res = "";\r
+    logMessage("Opened MarketsToday database..");\r
+\r
+    db.transaction(function(tx) {\r
+         var rs = tx.executeSql('INSERT OR REPLACE INTO tickers VALUES (?);', [symbol]);\r
+               logMessage("Inserted/replaced "+rs.rowsAffected+" rows");\r
+               if (rs.rowsAffected > 0) {\r
+                 res = "OK";\r
+               } else {\r
+                 res = "Error";\r
+               }\r
+         },\r
+         function(error) {\r
+           logMessage("Error ["+error.code +"] - " + error.DOMString+" occurred.");\r
+         }\r
+   );\r
+   return res;\r
+}\r
+\r
+function removeSymbol(symbol){\r
+    logMessage('SQL> DELETE FROM tickers WHERE symbol = '+[symbol]);\r
+    var db = getDatabase();\r
+    var res = "";\r
+    db.transaction(function(tx) {\r
+         var rs = tx.executeSql('DELETE FROM tickers WHERE symbol = ?;', [symbol]);\r
+               logMessage("Deleted "+rs.rowsAffected+" rows");\r
+               if (rs.rowsAffected > 0) {\r
+                 res = "OK";\r
+               } else {\r
+                 res = "Error";\r
+               }\r
+         },\r
+         function(error) {\r
+            logMessage("Error ["+error.code +"] - " + error.DOMString+" occurred.");\r
+         }\r
+   );\r
+   return res;\r
+}\r
+\r
+function getAllSymbols(){\r
+    var db = getDatabase();\r
+    var symbolsArray = new Array();\r
+    db.transaction(function(tx) {\r
+           var rs = tx.executeSql('SELECT symbol FROM tickers');\r
+           logMessage("Fetched "+rs.rows.length+" rows");\r
+           var i = 0;\r
+           for (i = 0; i < rs.rows.length; i++){\r
+               symbolsArray[i] = rs.rows.item(i).symbol;\r
+           }\r
+       },\r
+       function(error) {\r
+           logMessage("Error ["+error.code +"] - " + error.DOMString+" occurred.");\r
+       }\r
+   );\r
+   return symbolsArray;\r
+}\r
diff --git a/src/qml/Library/js/ISODate.js b/src/qml/Library/js/ISODate.js
new file mode 100644 (file)
index 0000000..1b85f88
--- /dev/null
@@ -0,0 +1,35 @@
+//Source: http://stackoverflow.com/questions/498578/how-can-i-convert-a-date-value-in-utc-format-to-a-date-object-in-javascript\r
+var ISODate = {\r
+    convert : function (input){\r
+        if (!(typeof input === "string")) throw "ISODate, convert: input must be a string";\r
+        var d = input.match(/^(\d{4})-(\d{2})-(\d{2})[T ](\d{2}):(\d{2}):(\d{2}(?:\.\d+)?)(Z|(([+-])(\d{2}):(\d{2})))$/i);\r
+        if (!d) throw "ISODate, convert: Illegal format";\r
+        return new Date(\r
+                Date.UTC(d[1],d[2]-1,d[3],d[4],d[5],d[6]|0,(d[6]*1000-((d[6]|0)*1000))|0,d[7]) +\r
+                (d[7].toUpperCase() ==="Z" ? 0 : (d[10]*3600 + d[11]*60) * (d[9]==="-" ? 1000 : -1000))\r
+        );\r
+    },\r
+    format : function(t,utc){\r
+        if (typeof t === "string") t = this.convert(t);\r
+        if (!(t instanceof Date)) throw "ISODate, format: t is not a date object";\r
+        t = utc ?\r
+                [t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate(),t.getUTCHours(),t.getUTCMinutes(),t.getUTCSeconds()] :\r
+                [t.getFullYear(),t.getMonth(),t.getDate(),t.getHours(),t.getMinutes(),t.getSeconds()];\r
+\r
+        return this.month[t[1]] + " " +this.ordinal(t[2]) + ", " +t[0] +\r
+                " @ " + this.clock12(t[3],t[4]);\r
+    },\r
+    month:["January","February","March","April","May","June","July","September","October","November","December"],\r
+    ordinal:function(n) {\r
+        return n+(["th","st","nd","rd"][(( n % 100 / 10) | 0) ===1 ? 0 : n % 10 < 4 ? n % 10 : 0 ]);\r
+    },\r
+    clock12:function(h24,m,s){\r
+        h24%=24;\r
+        var h12 = h24 % 12;\r
+        if (h12===0) h12=12;\r
+        return h12 + ":" +\r
+                (m<10 ? "0" + m : m) +\r
+                (isFinite(s) ? ":" + (s<10?"0"+s:s): "") +\r
+                (h24<12 ? "AM":"PM");\r
+    }\r
+};\r
diff --git a/src/qml/MarketsToday.qml b/src/qml/MarketsToday.qml
new file mode 100644 (file)
index 0000000..b0f0433
--- /dev/null
@@ -0,0 +1,212 @@
+/*
+@version: 0.1
+@author: Sudheer K. <scifi1947 at gmail.com>
+@license: GNU General Public License
+*/
+
+import Qt 4.7
+
+import "Library" as Library
+import "Library/js/ISODate.js" as DateLib
+import "Library/js/DBUtility.js" as DBUtility
+import "Library/js/Common.js" as Common
+
+Item {
+    id: screen; width: 400; height: 325
+
+    signal showConfigInNewWindow
+    signal quoteRefreshStarted
+    signal quoteRefreshCompleted
+
+    property int autoUpdateInterval: 300000
+    property bool updateWeekDaysOnly: false
+
+    function getQuery(){
+        var query;
+        var symbolsArray = DBUtility.getAllSymbols();
+        if (symbolsArray && symbolsArray.length > 0){
+            var i = 0;
+            for (i = 0; i< symbolsArray.length; i++) {
+                logUtility.logMessage("Appending "+symbolsArray[i]+ " to Query");
+
+                if (!query){
+                    query = '"'+symbolsArray[i]+'"';
+                }
+                else{
+                    query = query + ',"' + symbolsArray[i]+'"';
+                }
+            }
+        }
+
+        return query;        
+    }
+
+
+    function reloadQuotes(){
+        var query = getQuery();
+        if (query){
+            screen.quoteRefreshStarted();
+            logUtility.logMessage("Reloading Data..");
+
+            //var queryURL = 'http://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.quotes where symbol in ("INDU","^IXIC","^GSPC","CLJ11.NYM","YHOO","AAPL","GOOG","MSFT")&env=store://datatables.org/alltableswithkeys';
+            var queryURL = 'http://query.yahooapis.com/v1/public/yql?q=select Symbol,Name,LastTradePriceOnly,Change,ChangeinPercent from yahoo.finance.quotes where symbol in ('+query+')&env=store://datatables.org/alltableswithkeys';
+            logUtility.logMessage(queryURL);
+
+            var response = new XMLHttpRequest();
+            response.onreadystatechange = function() {
+                if (response.readyState == XMLHttpRequest.DONE) {
+                    stockQuoteDataModel.xml = response.responseText;
+                    lastUpdatedDateModel.xml = response.responseText;
+                    logUtility.logMessage("Data Reload Completed..");
+                    screen.quoteRefreshCompleted();
+                }
+            }
+
+            response.open("GET", queryURL);
+            response.send();
+        }
+        else{
+            logUtility.logMessage("No stock symbols found in configuration.");
+        }
+    }
+
+    function loadSettings(){
+        var value;
+        value  = DBUtility.getSetting("UpdateFreqency");
+        if (!value || value == "0.0" || value == ""){
+            autoUpdateInterval = 0;
+        }
+        else{
+            autoUpdateInterval = parseInt(value)*60*1000; //Convert minutes to milliseconds
+        }
+        value  = DBUtility.getSetting("UpdateWeekdaysOnly");
+        if (!value || value == "0.0" || value == ""){
+            updateWeekDaysOnly = false;
+        }
+        else{
+            updateWeekDaysOnly = true;
+        }
+    }
+
+    function initialize(){
+        if (autoUpdateTimer.running) autoUpdateTimer.stop();
+        loadSettings();
+        reloadQuotes();
+        if (autoUpdateInterval != 0) {
+            logUtility.logMessage("Starting Timer..");
+            autoUpdateTimer.start();
+        }
+    }
+
+    Component.onCompleted: {
+        initialize();
+    }
+
+    Timer {
+        id: autoUpdateTimer
+        interval: autoUpdateInterval
+        //running: (autoUpdateInterval == 0? false:true)
+        repeat: true
+        onTriggered: {
+            if (!updateWeekDaysOnly){
+                logUtility.logMessage("Update triggered: Allowed to update all days of the week");
+                reloadQuotes();
+            }
+            else if (Common.isTodayAWeekDay()){
+                logUtility.logMessage("Update triggered: Today is a weekday");
+                reloadQuotes();
+            }
+            else{
+                logUtility.logMessage("Update not triggered: Today is not a weekday");
+            }
+        }
+    }
+
+    XmlListModel{
+        id: stockQuoteDataModel
+        query:  "/query/results/quote"
+
+        XmlRole { name: "symbol"; query: "Symbol/string()" }
+        XmlRole { name: "stockName"; query: "Name/string()" }
+        XmlRole { name: "lastTradedPrice"; query: "LastTradePriceOnly/string()" }
+        XmlRole { name: "change"; query: "Change/string()" }
+        XmlRole { name: "changePercentage"; query: "ChangeinPercent/string()" }
+
+        onStatusChanged: {
+            if (status == XmlListModel.Ready){
+                logUtility.logMessage("No. of tickers: "+stockQuoteDataModel.count);
+            }
+        }
+    }
+
+    XmlListModel {
+        id: lastUpdatedDateModel
+        query: "/query"
+        namespaceDeclarations: "declare namespace yahoo='http://www.yahooapis.com/v1/base.rng';"
+        XmlRole { name: "timestamp"; query: '@yahoo:created/string()'}
+
+        onStatusChanged: {
+            if (status == XmlListModel.Ready && lastUpdatedDateModel.get(0)){
+                logUtility.logMessage("Updated: "+DateLib.ISODate.format(lastUpdatedDateModel.get(0).timestamp));
+            }
+        }
+    }            
+
+    Rectangle {
+        id: background        
+        anchors.fill: parent;
+        color: "#343434"
+        clip: true
+        property int itemHeight: 50
+
+        Library.TitleBar {
+            id: titleBar;
+            width: parent.width; height: 60;
+            anchors.top: parent.top
+            title: "Markets Today";
+            buttonType: "Config";
+            onSettingsClicked: {
+                screen.showConfigInNewWindow();
+            }
+
+            onCloseClicked: {
+                Qt.quit();
+            }
+        }
+
+        Loader {
+            id: marketsTodayLoader
+            anchors.top: titleBar.bottom
+            anchors.bottom: parent.bottom
+            width: parent.width
+            sourceComponent: stockQuotesParentComponent
+        }
+
+        Component {
+            id: stockQuotesParentComponent
+            StockQuotesComponent{
+                id:stockQuotesComponent
+                componentWidth: background.width
+                stockQuotesListModel: stockQuoteDataModel
+                lastUpdatedModel: lastUpdatedDateModel
+
+                Connections {
+                    target: screen
+
+                    onQuoteRefreshStarted: {
+                        stockQuotesComponent.updateStarted();
+                    }
+
+                    onQuoteRefreshCompleted: {
+                        stockQuotesComponent.updateCompleted();
+                    }
+                }
+
+                Component.onCompleted: {
+                    titleBar.title = "Markets Today";
+                    titleBar.buttonType = "Config";
+                }
+            }
+        }
+    }
+}
diff --git a/src/qml/StockQuoteDelegate.qml b/src/qml/StockQuoteDelegate.qml
new file mode 100644 (file)
index 0000000..e647282
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+@version: 0.1
+@author: Sudheer K. <scifi1947 at gmail.com>
+@license: GNU General Public License
+*/
+
+import Qt 4.7
+
+Component {
+    Item {
+        id: wrapper; width: wrapper.PathView.view.width; height: 50
+        Rectangle { color: "black"; opacity: index % 2 ? 0.2 : 0.4; height: wrapper.height; width: wrapper.width; y: 1
+            Row {
+                anchors.verticalCenter: parent.verticalCenter
+                anchors.left: parent.left
+                width: wrapper.PathView.view.width - 70;
+                spacing: 5
+                Text { text: symbol; width: parent.width * 35/100; font.pixelSize: 18; font.bold: true; elide: Text.ElideRight; color: "white"; style: Text.Raised; styleColor: "black" }
+                Text { text: lastTradedPrice; width: parent.width * 25/100; font.pixelSize: 18; elide: Text.ElideLeft; color: "#cccccc"; style: Text.Raised; styleColor: "black" }
+                Text { text: change; width: parent.width * 20/100; font.pixelSize: 18; elide: Text.ElideRight
+                    color: if(change >= 0){"green";} else {"red";}
+                        style: Text.Raised; styleColor: "black" }
+                Text { text: changePercentage; width: parent.width * 20/100; font.pixelSize: 18; elide: Text.ElideRight;
+                    color: if(change >= 0){"green";} else {"red";}
+                        style: Text.Raised; styleColor: "black" }
+            }
+        }
+    }
+}
diff --git a/src/qml/StockQuotesComponent.qml b/src/qml/StockQuotesComponent.qml
new file mode 100644 (file)
index 0000000..f37cf91
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+@version: 0.1
+@author: Sudheer K. <scifi1947 at gmail.com>
+@license: GNU General Public License
+*/
+
+import Qt 4.7
+import "Library" as Library
+import "Library/js/ISODate.js" as DateLib
+
+Rectangle {
+    id: stockQuotesComponent
+    clip: true
+    color: "#343434"
+
+    signal updateStarted
+    signal updateCompleted
+
+    property XmlListModel stockQuotesListModel
+    property XmlListModel lastUpdatedModel
+    property int componentWidth
+    property int componentHeight
+    property int itemHeight: 50
+
+    Component {
+        id: stockQuotesDelegate
+
+        Item {
+            id: wrapper; width: componentWidth; height: itemHeight
+            Item {
+                Rectangle { color: "black"; opacity: index % 2 ? 0.2 : 0.4; height: wrapper.height - 2; width: wrapper.width; y: 1 }
+                Row {
+                    x: 30;y: 15;
+                    width: componentWidth - 40;
+                    spacing: 5
+
+                    Text { text: if (width >= 250) {stockName;} else {symbol;} width: parent.width * 35/100; font.pixelSize: 18; font.bold: true; elide: Text.ElideRight; color: "white"; style: Text.Raised; styleColor: "black" }
+                    Text { text: lastTradedPrice; width: parent.width * 25/100; font.pixelSize: 18; elide: Text.ElideLeft; color: "#cccccc"; style: Text.Raised; styleColor: "black" }
+                    Text { text: change; width: parent.width * 20/100; font.pixelSize: 18; elide: Text.ElideRight
+                        color: if(change >= 0){"green";} else {"red";}
+                            style: Text.Raised; styleColor: "black" }
+                    Text { text: changePercentage; width: parent.width * 20/100; font.pixelSize: 18; elide: Text.ElideRight;
+                        color: if(change >= 0){"green";} else {"red";}
+                            style: Text.Raised; styleColor: "black" }
+                }
+            }
+        }
+    }
+
+    Rectangle{
+        id: pathViewWrapper
+        width: parent.width
+        anchors.top: parent.top
+        anchors.bottom: footerText.top
+        color: "#343434"
+
+        PathView{
+            id: stockQuotesView
+            flickDeceleration: 500
+            //preferredHighlightBegin: 1/stockQuotesView.count
+            //preferredHighlightEnd: 1/stockQuotesView.count
+            //pathItemCount: count
+            focus: true
+            interactive: true
+            model: stockQuotesListModel
+            delegate:  stockQuotesDelegate
+            path: Path {
+                startX: width / 2
+                startY: itemHeight/2
+                PathLine {
+                    x: width / 2
+                    y: stockQuotesView.count * itemHeight  + itemHeight/2
+                }
+            }
+            Keys.onDownPressed: if (!moving && interactive) {
+                                    console.log(stockQuotesView.height);
+                                    incrementCurrentIndex();
+                                }
+            Keys.onUpPressed: if (!moving && interactive) decrementCurrentIndex()
+        }
+    }
+
+    Rectangle{
+        id: footerText
+        width: parent.width
+        height: 25
+        color: "#343434"
+        anchors.bottom: toolBar.top
+        ListView {
+            anchors.fill: parent
+            model: lastUpdatedModel
+            delegate:
+                Text {
+                    text: "Updated: "+DateLib.ISODate.format(timestamp)
+                    horizontalAlignment: Text.AlignRight; verticalAlignment: Text.AlignVCenter
+                    width: parent.width; font.pixelSize: 12; elide: Text.ElideRight;
+                    color: "#cccccc"
+                    style: Text.Raised; styleColor: "black"
+                }
+        }
+    }
+
+    Library.ToolBar {
+        id:toolBar
+        width: parent.width; height: 40
+        anchors.bottom: parent.bottom
+        opacity: 0.9
+        onReloadButtonClicked: reloadQuotes();
+        onDownButtonClicked: if (!stockQuotesView.moving && stockQuotesView.interactive) stockQuotesView.currentIndex = stockQuotesView.currentIndex + 1
+        onUpButtonClicked: if (!stockQuotesView.moving && stockQuotesView.interactive) stockQuotesView.currentIndex = stockQuotesView.currentIndex - 1
+        onNewsButtonClicked: Qt.openUrlExternally("http://finance.yahoo.com");
+        Connections {
+            target: stockQuotesComponent
+            onUpdateStarted:{
+                if (!toolBar.updatePending) toolBar.updatePending = true;
+            }
+            onUpdateCompleted:{
+                toolBar.updatePending = false;
+            }
+        }
+    }
+}
diff --git a/src/resources.qrc b/src/resources.qrc
new file mode 100644 (file)
index 0000000..0e9d964
--- /dev/null
@@ -0,0 +1,37 @@
+<RCC>
+    <qresource prefix="/">
+        <file>qml/Library/ToolBar.qml</file>
+        <file>qml/Library/images/titlebar.png</file>
+        <file>qml/Library/images/lineedit.png</file>
+        <file>qml/Library/images/gloss.png</file>
+        <file>qml/Library/images/loading.png</file>
+        <file>qml/Library/images/lineedit.sci</file>
+        <file>qml/Library/images/titlebar.sci</file>
+        <file>qml/Library/TitleBar.qml</file>
+        <file>qml/Library/js/ISODate.js</file>
+        <file>qml/Library/js/DBUtility.js</file>
+        <file>qml/Library/images/config.png</file>
+        <file>qml/Library/images/close.png</file>
+        <file>qml/Library/images/reload.png</file>
+        <file>qml/Library/images/down.png</file>
+        <file>qml/Library/images/up.png</file>
+        <file>qml/Library/images/add.png</file>
+        <file>qml/Library/images/remove.png</file>
+        <file>qml/Library/images/news.png</file>
+        <file>qml/Library/images/checkbox_unchecked.png</file>
+        <file>qml/Library/images/checkbox_checked.png</file>
+        <file>qml/Library/images/icon_settings.png</file>
+        <file>qml/Library/images/icon_stocks.png</file>
+        <file>qml/Library/images/back.png</file>
+        <file>qml/Library/images/toolbar.png</file>
+        <file>qml/Library/images/toolbar.sci</file>
+        <file>qml/StockQuoteDelegate.qml</file>
+        <file>qml/StockQuotesComponent.qml</file>
+        <file>qml/ConfigOptionsComponent.qml</file>
+        <file>qml/ConfigTickersComponent.qml</file>
+        <file>qml/Config.qml</file>
+        <file>qml/MarketsToday.qml</file>
+        <file>qml/ConfigParametersComponent.qml</file>
+        <file>qml/Library/js/Common.js</file>
+    </qresource>
+</RCC>
diff --git a/src/src.pro b/src/src.pro
new file mode 100644 (file)
index 0000000..5872b08
--- /dev/null
@@ -0,0 +1,55 @@
+TEMPLATE = app
+
+QT += script \
+    declarative \
+    sql
+
+TARGET = marketstoday
+HEADERS += \
+    cpp/marketstodayqmlview.h \
+    cpp/configqmlview.h \
+    cpp/logutility.h
+SOURCES += cpp/main.cpp \
+    cpp/marketstodayqmlview.cpp \
+    cpp/configqmlview.cpp
+VPATH += cpp
+
+MOC_DIR = cpp/.mocs
+OBJECTS_DIR = cpp/.objs
+
+OTHER_FILES += qml/MarketsToday.qml \
+    qml/Config.qml \
+    qml/ConfigOptionsComponent.qml \
+    qml/ConfigParametersComponent.qml \
+    qml/ConfigTickersComponent.qml \
+    qml/StockQuoteDelegate.qml \
+    qml/StockQuotesComponent.qml \
+    qml/Library/TitleBar.qml \
+    qml/Library/ToolBar.qml \
+    qml/Library/js/DBUtility.js \
+    qml/Library/js/ISODate.js \
+    qml/Library/js/Common.js
+
+RESOURCES += \
+    resources.qrc
+
+INSTALLDIR = /../debian/marketstoday
+
+symbian {
+
+    TARGET.UID3 = 0xE6159209
+    # Allow network access on Symbian
+    TARGET.CAPABILITY += NetworkServices
+}
+
+unix {
+   INSTALLS += target desktop icon48
+   target.path = $$INTSALLDIR/opt/marketstoday/
+   desktop.path = /usr/share/applications/hildon-home
+   desktop.files += data/marketstoday.desktop
+   icon48.path = /usr/share/icons/hicolor/48x48/apps
+   icon48.files += data/icons/marketstoday.png
+}
+
+# Include Qt Maemo 5 Home screen widget adaptor
+include(qmaemo5homescreenadaptor/qmaemo5homescreenadaptor.pri)