-rw-r--r-- | library/backend/categories.h | 1 | ||||
-rw-r--r-- | library/global.cpp | 49 | ||||
-rw-r--r-- | library/global.h | 6 | ||||
-rw-r--r-- | library/library.pro | 2 | ||||
-rw-r--r-- | library/locationcombo.cpp | 295 | ||||
-rw-r--r-- | library/locationcombo.h | 88 | ||||
-rw-r--r-- | library/qlibrary_unix.cpp | 4 | ||||
-rw-r--r-- | library/timestring.cpp | 255 | ||||
-rw-r--r-- | library/timestring.h | 94 |
9 files changed, 683 insertions, 111 deletions
diff --git a/library/backend/categories.h b/library/backend/categories.h index 91c93e7..6be3bc0 100644 --- a/library/backend/categories.h +++ b/library/backend/categories.h | |||
@@ -1,161 +1,162 @@ | |||
1 | /********************************************************************** | 1 | /********************************************************************** |
2 | ** Copyright (C) 2000 Trolltech AS. All rights reserved. | 2 | ** Copyright (C) 2000 Trolltech AS. All rights reserved. |
3 | ** | 3 | ** |
4 | ** This file is part of Qtopia Environment. | 4 | ** This file is part of Qtopia Environment. |
5 | ** | 5 | ** |
6 | ** This file may be distributed and/or modified under the terms of the | 6 | ** This file may be distributed and/or modified under the terms of the |
7 | ** GNU General Public License version 2 as published by the Free | 7 | ** GNU General Public License version 2 as published by the Free |
8 | ** Software Foundation and appearing in the file LICENSE.GPL included | 8 | ** Software Foundation and appearing in the file LICENSE.GPL included |
9 | ** in the packaging of this file. | 9 | ** in the packaging of this file. |
10 | ** | 10 | ** |
11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING | 11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING |
12 | ** THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A | 12 | ** THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A |
13 | ** PARTICULAR PURPOSE. | 13 | ** PARTICULAR PURPOSE. |
14 | ** | 14 | ** |
15 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 15 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
16 | ** | 16 | ** |
17 | ** Contact info@trolltech.com if any conditions of this licensing are | 17 | ** Contact info@trolltech.com if any conditions of this licensing are |
18 | ** not clear to you. | 18 | ** not clear to you. |
19 | ** | 19 | ** |
20 | **********************************************************************/ | 20 | **********************************************************************/ |
21 | 21 | ||
22 | #ifndef QTPALMTOP_CATEGORIES_H | 22 | #ifndef QTPALMTOP_CATEGORIES_H |
23 | #define QTPALMTOP_CATEGORIES_H | 23 | #define QTPALMTOP_CATEGORIES_H |
24 | 24 | ||
25 | #include <qstring.h> | 25 | #include <qstring.h> |
26 | #include <qstringlist.h> | 26 | #include <qstringlist.h> |
27 | #include <qmap.h> | 27 | #include <qmap.h> |
28 | #include <qlistview.h> | 28 | #include <qlistview.h> |
29 | #include <qarray.h> | 29 | #include <qarray.h> |
30 | #include "qpcglobal.h" | 30 | #include "qpcglobal.h" |
31 | #include "palmtopuidgen.h" | 31 | #include "palmtopuidgen.h" |
32 | 32 | ||
33 | class CategoryGroup; | 33 | class CategoryGroup; |
34 | QString categoryFileName(); | ||
34 | 35 | ||
35 | #if defined(QPC_TEMPLATEDLL) | 36 | #if defined(QPC_TEMPLATEDLL) |
36 | // MOC_SKIP_BEGIN | 37 | // MOC_SKIP_BEGIN |
37 | template class QPC_EXPORT QMap<int, QString>; | 38 | template class QPC_EXPORT QMap<int, QString>; |
38 | template class QPC_EXPORT QMap<QString, int>; | 39 | template class QPC_EXPORT QMap<QString, int>; |
39 | template class QPC_EXPORT QMap< QString, CategoryGroup >; | 40 | template class QPC_EXPORT QMap< QString, CategoryGroup >; |
40 | // MOC_SKIP_END | 41 | // MOC_SKIP_END |
41 | #endif | 42 | #endif |
42 | 43 | ||
43 | class QPC_EXPORT CategoryGroup | 44 | class QPC_EXPORT CategoryGroup |
44 | { | 45 | { |
45 | friend class Categories; | 46 | friend class Categories; |
46 | public: | 47 | public: |
47 | CategoryGroup(): mIdLabelMap(), mLabelIdMap() { } | 48 | CategoryGroup(): mIdLabelMap(), mLabelIdMap() { } |
48 | CategoryGroup( const CategoryGroup &c ) : | 49 | CategoryGroup( const CategoryGroup &c ) : |
49 | mIdLabelMap( c.mIdLabelMap), mLabelIdMap( c.mLabelIdMap ) { } | 50 | mIdLabelMap( c.mIdLabelMap), mLabelIdMap( c.mLabelIdMap ) { } |
50 | 51 | ||
51 | void clear() { mIdLabelMap.clear(); mLabelIdMap.clear(); } | 52 | void clear() { mIdLabelMap.clear(); mLabelIdMap.clear(); } |
52 | 53 | ||
53 | int add( const QString &label ); | 54 | int add( const QString &label ); |
54 | bool add( int uid, const QString &label ); | 55 | bool add( int uid, const QString &label ); |
55 | 56 | ||
56 | bool remove( const QString &label ); | 57 | bool remove( const QString &label ); |
57 | bool remove( int uid ); | 58 | bool remove( int uid ); |
58 | 59 | ||
59 | bool rename( int uid, const QString &newLabel ); | 60 | bool rename( int uid, const QString &newLabel ); |
60 | bool rename( const QString &oldLabel, const QString &newLabel ); | 61 | bool rename( const QString &oldLabel, const QString &newLabel ); |
61 | 62 | ||
62 | bool contains(int id) const; | 63 | bool contains(int id) const; |
63 | bool contains(const QString &label) const; | 64 | bool contains(const QString &label) const; |
64 | 65 | ||
65 | /** Returns label associated with the uid or QString::null if | 66 | /** Returns label associated with the uid or QString::null if |
66 | * not found | 67 | * not found |
67 | */ | 68 | */ |
68 | const QString &label(int id) const; | 69 | const QString &label(int id) const; |
69 | /** Returns the uid associated with label or 0 if not found */ | 70 | /** Returns the uid associated with label or 0 if not found */ |
70 | int id(const QString &label) const; | 71 | int id(const QString &label) const; |
71 | 72 | ||
72 | /** Returns a sorted list of labels */ | 73 | /** Returns a sorted list of labels */ |
73 | QStringList labels() const; | 74 | QStringList labels() const; |
74 | 75 | ||
75 | QStringList labels( const QArray<int> &catids ) const; | 76 | QStringList labels( const QArray<int> &catids ) const; |
76 | 77 | ||
77 | const QMap<int, QString> &idMap() const { return mIdLabelMap; } | 78 | const QMap<int, QString> &idMap() const { return mIdLabelMap; } |
78 | 79 | ||
79 | private: | 80 | private: |
80 | void insert( int uid, const QString &label ); | 81 | void insert( int uid, const QString &label ); |
81 | QMap<int, QString> mIdLabelMap; | 82 | QMap<int, QString> mIdLabelMap; |
82 | QMap<QString, int> mLabelIdMap; | 83 | QMap<QString, int> mLabelIdMap; |
83 | 84 | ||
84 | static Qtopia::UidGen &uidGen() { return sUidGen; } | 85 | static Qtopia::UidGen &uidGen() { return sUidGen; } |
85 | static Qtopia::UidGen sUidGen; | 86 | static Qtopia::UidGen sUidGen; |
86 | }; | 87 | }; |
87 | 88 | ||
88 | /* Map from application name to categories */ | 89 | /* Map from application name to categories */ |
89 | class QPC_EXPORT Categories : public QObject | 90 | class QPC_EXPORT Categories : public QObject |
90 | { | 91 | { |
91 | Q_OBJECT | 92 | Q_OBJECT |
92 | public: | 93 | public: |
93 | Categories( QObject *parent=0, const char *name = 0 ) | 94 | Categories( QObject *parent=0, const char *name = 0 ) |
94 | : QObject( parent, name ), mGlobalCats(), mAppCats() { } | 95 | : QObject( parent, name ), mGlobalCats(), mAppCats() { } |
95 | Categories( const Categories ©From ) : QObject( copyFrom.parent() ), | 96 | Categories( const Categories ©From ) : QObject( copyFrom.parent() ), |
96 | mGlobalCats( copyFrom.mGlobalCats ), | 97 | mGlobalCats( copyFrom.mGlobalCats ), |
97 | mAppCats( copyFrom.mAppCats ) { } | 98 | mAppCats( copyFrom.mAppCats ) { } |
98 | virtual ~Categories() { } | 99 | virtual ~Categories() { } |
99 | 100 | ||
100 | Categories &operator= ( const Categories &c ) | 101 | Categories &operator= ( const Categories &c ) |
101 | { mAppCats = c.mAppCats; mGlobalCats = c.mGlobalCats; return *this; } | 102 | { mAppCats = c.mAppCats; mGlobalCats = c.mGlobalCats; return *this; } |
102 | 103 | ||
103 | void clear(); | 104 | void clear(); |
104 | 105 | ||
105 | /** Add the category name as long as it doesn't already exist | 106 | /** Add the category name as long as it doesn't already exist |
106 | * locally or globally. Return UID if added, 0 if conflicts | 107 | * locally or globally. Return UID if added, 0 if conflicts |
107 | * (error). | 108 | * (error). |
108 | */ | 109 | */ |
109 | int addCategory( const QString &appname, const QString &catname); | 110 | int addCategory( const QString &appname, const QString &catname); |
110 | /** Add the category name as long as it doesn't already exist | 111 | /** Add the category name as long as it doesn't already exist |
111 | * locally or globally. Return UID if added, 0 if conflicts | 112 | * locally or globally. Return UID if added, 0 if conflicts |
112 | * (error). | 113 | * (error). |
113 | */ | 114 | */ |
114 | int addCategory( const QString &appname, const QString &catname, int uid); | 115 | int addCategory( const QString &appname, const QString &catname, int uid); |
115 | /** Add the global category just checking that it doesn't | 116 | /** Add the global category just checking that it doesn't |
116 | * already exist globally. Return UID if added, 0 if conflicts. | 117 | * already exist globally. Return UID if added, 0 if conflicts. |
117 | */ | 118 | */ |
118 | int addGlobalCategory( const QString &catname ); | 119 | int addGlobalCategory( const QString &catname ); |
119 | /** Add the global category just checking that it doesn't | 120 | /** Add the global category just checking that it doesn't |
120 | * already exist globally. Return UID if added, 0 if conflicts. | 121 | * already exist globally. Return UID if added, 0 if conflicts. |
121 | */ | 122 | */ |
122 | int addGlobalCategory( const QString &catname, int uid ); | 123 | int addGlobalCategory( const QString &catname, int uid ); |
123 | /** Removes the category from the application; if it is not found | 124 | /** Removes the category from the application; if it is not found |
124 | * in the application, then it removes it from the global list | 125 | * in the application, then it removes it from the global list |
125 | */ | 126 | */ |
126 | bool removeCategory( const QString &appName, const QString &catName, | 127 | bool removeCategory( const QString &appName, const QString &catName, |
127 | bool checkGlobal = TRUE); | 128 | bool checkGlobal = TRUE); |
128 | bool removeCategory( const QString &appName, int uid ); | 129 | bool removeCategory( const QString &appName, int uid ); |
129 | bool removeGlobalCategory( const QString &catName ); | 130 | bool removeGlobalCategory( const QString &catName ); |
130 | bool removeGlobalCategory( int uid ); | 131 | bool removeGlobalCategory( int uid ); |
131 | 132 | ||
132 | QArray<int> ids( const QString &app, const QStringList &labels) const; | 133 | QArray<int> ids( const QString &app, const QStringList &labels) const; |
133 | 134 | ||
134 | /** Returns the id associated with the app */ | 135 | /** Returns the id associated with the app */ |
135 | int id( const QString &app, const QString &cat ) const; | 136 | int id( const QString &app, const QString &cat ) const; |
136 | /** Returns the label associated with the id */ | 137 | /** Returns the label associated with the id */ |
137 | QString label( const QString &app, int id ) const; | 138 | QString label( const QString &app, int id ) const; |
138 | 139 | ||
139 | enum ExtraLabels { NoExtra, AllUnfiled, AllLabel, UnfiledLabel }; | 140 | enum ExtraLabels { NoExtra, AllUnfiled, AllLabel, UnfiledLabel }; |
140 | /** Returns the sorted list of all categories that are | 141 | /** Returns the sorted list of all categories that are |
141 | * associated with the app. | 142 | * associated with the app. |
142 | * If includeGlobal parameter is TRUE then the returned | 143 | * If includeGlobal parameter is TRUE then the returned |
143 | * categories will include the global category items. | 144 | * categories will include the global category items. |
144 | * If extra = NoExtra, then | 145 | * If extra = NoExtra, then |
145 | * If extra = AllUnfiled, then All and Unfiled will be prepended to | 146 | * If extra = AllUnfiled, then All and Unfiled will be prepended to |
146 | * the list | 147 | * the list |
147 | * If extra = AllLabel, then All is prepended | 148 | * If extra = AllLabel, then All is prepended |
148 | * If extra = UnfiledLabel, then Unfiled is prepended | 149 | * If extra = UnfiledLabel, then Unfiled is prepended |
149 | */ | 150 | */ |
150 | QStringList labels( const QString &app, | 151 | QStringList labels( const QString &app, |
151 | bool includeGlobal = TRUE, | 152 | bool includeGlobal = TRUE, |
152 | ExtraLabels extra = NoExtra ) const; | 153 | ExtraLabels extra = NoExtra ) const; |
153 | 154 | ||
154 | QStringList labels( const QString &app, | 155 | QStringList labels( const QString &app, |
155 | const QArray<int> &catids ) const; | 156 | const QArray<int> &catids ) const; |
156 | 157 | ||
157 | enum DisplaySingle { ShowMulti, ShowAll, ShowFirst }; | 158 | enum DisplaySingle { ShowMulti, ShowAll, ShowFirst }; |
158 | 159 | ||
159 | /** Returns a single string associated with the cat ids for display in | 160 | /** Returns a single string associated with the cat ids for display in |
160 | * a combobox or any area that requires one string. If catids are empty | 161 | * a combobox or any area that requires one string. If catids are empty |
161 | * then "Unfiled" will be returned. If multiple categories are assigned | 162 | * then "Unfiled" will be returned. If multiple categories are assigned |
diff --git a/library/global.cpp b/library/global.cpp index ec87555..f7a0767 100644 --- a/library/global.cpp +++ b/library/global.cpp | |||
@@ -683,130 +683,179 @@ void Global::execute( const QString &c, const QString& document ) | |||
683 | QString Global::shellQuote(const QString& s) | 683 | QString Global::shellQuote(const QString& s) |
684 | { | 684 | { |
685 | QString r="\""; | 685 | QString r="\""; |
686 | for (int i=0; i<(int)s.length(); i++) { | 686 | for (int i=0; i<(int)s.length(); i++) { |
687 | char c = s[i].latin1(); | 687 | char c = s[i].latin1(); |
688 | switch (c) { | 688 | switch (c) { |
689 | case '\\': case '"': case '$': | 689 | case '\\': case '"': case '$': |
690 | r+="\\"; | 690 | r+="\\"; |
691 | } | 691 | } |
692 | r += s[i]; | 692 | r += s[i]; |
693 | } | 693 | } |
694 | r += "\""; | 694 | r += "\""; |
695 | return r; | 695 | return r; |
696 | } | 696 | } |
697 | 697 | ||
698 | /*! | 698 | /*! |
699 | Returns the string \a s with the characters '\' and '"' quoted by a | 699 | Returns the string \a s with the characters '\' and '"' quoted by a |
700 | preceeding '\'. | 700 | preceeding '\'. |
701 | 701 | ||
702 | \sa shellQuote() | 702 | \sa shellQuote() |
703 | */ | 703 | */ |
704 | QString Global::stringQuote(const QString& s) | 704 | QString Global::stringQuote(const QString& s) |
705 | { | 705 | { |
706 | QString r="\""; | 706 | QString r="\""; |
707 | for (int i=0; i<(int)s.length(); i++) { | 707 | for (int i=0; i<(int)s.length(); i++) { |
708 | char c = s[i].latin1(); | 708 | char c = s[i].latin1(); |
709 | switch (c) { | 709 | switch (c) { |
710 | case '\\': case '"': | 710 | case '\\': case '"': |
711 | r+="\\"; | 711 | r+="\\"; |
712 | } | 712 | } |
713 | r += s[i]; | 713 | r += s[i]; |
714 | } | 714 | } |
715 | r += "\""; | 715 | r += "\""; |
716 | return r; | 716 | return r; |
717 | } | 717 | } |
718 | 718 | ||
719 | /*! | 719 | /*! |
720 | Finds all documents on the system's document directories which | 720 | Finds all documents on the system's document directories which |
721 | match the filter \a mimefilter, and appends the resulting DocLnk | 721 | match the filter \a mimefilter, and appends the resulting DocLnk |
722 | objects to \a folder. | 722 | objects to \a folder. |
723 | */ | 723 | */ |
724 | void Global::findDocuments(DocLnkSet* folder, const QString &mimefilter) | 724 | void Global::findDocuments(DocLnkSet* folder, const QString &mimefilter) |
725 | { | 725 | { |
726 | QString homedocs = QString(getenv("HOME")) + "/Documents"; | 726 | QString homedocs = QString(getenv("HOME")) + "/Documents"; |
727 | DocLnkSet d(homedocs,mimefilter); | 727 | DocLnkSet d(homedocs,mimefilter); |
728 | folder->appendFrom(d); | 728 | folder->appendFrom(d); |
729 | /** let's do intellegint way of searching these files | 729 | /** let's do intellegint way of searching these files |
730 | * a) the user don't want to check mediums global | 730 | * a) the user don't want to check mediums global |
731 | * b) the user wants to check but use the global options for it | 731 | * b) the user wants to check but use the global options for it |
732 | * c) the user wants to check it but not this medium | 732 | * c) the user wants to check it but not this medium |
733 | * d) the user wants to check and this medium as well | 733 | * d) the user wants to check and this medium as well |
734 | * | 734 | * |
735 | * In all cases we need to apply a different mimefilter to | 735 | * In all cases we need to apply a different mimefilter to |
736 | * the medium. | 736 | * the medium. |
737 | * a) mimefilter.isEmpty() we need to apply the responding filter | 737 | * a) mimefilter.isEmpty() we need to apply the responding filter |
738 | * either the global or the one on the medium | 738 | * either the global or the one on the medium |
739 | * | 739 | * |
740 | * b) mimefilter is set to an application we need to find out if the | 740 | * b) mimefilter is set to an application we need to find out if the |
741 | * mimetypes are included in the mime mask of the medium | 741 | * mimetypes are included in the mime mask of the medium |
742 | */ | 742 | */ |
743 | StorageInfo storage; | 743 | StorageInfo storage; |
744 | const QList<FileSystem> &fs = storage.fileSystems(); | 744 | const QList<FileSystem> &fs = storage.fileSystems(); |
745 | QListIterator<FileSystem> it ( fs ); | 745 | QListIterator<FileSystem> it ( fs ); |
746 | for ( ; it.current(); ++it ) { | 746 | for ( ; it.current(); ++it ) { |
747 | if ( (*it)->isRemovable() ) { // let's find out if we should search on it | 747 | if ( (*it)->isRemovable() ) { // let's find out if we should search on it |
748 | // this is a candidate look at the cf and see if we should search on it | 748 | // this is a candidate look at the cf and see if we should search on it |
749 | QString path = (*it)->path(); | 749 | QString path = (*it)->path(); |
750 | Config conf((*it)->path() + "/.opiestorage.cf", Config::File ); | 750 | Config conf((*it)->path() + "/.opiestorage.cf", Config::File ); |
751 | conf.setGroup("main"); | 751 | conf.setGroup("main"); |
752 | if (!conf.readBoolEntry("check",true)) { | 752 | if (!conf.readBoolEntry("check",true)) { |
753 | continue; | 753 | continue; |
754 | } | 754 | } |
755 | conf.setGroup("subdirs"); | 755 | conf.setGroup("subdirs"); |
756 | if (conf.readBoolEntry("wholemedia",true)) { | 756 | if (conf.readBoolEntry("wholemedia",true)) { |
757 | DocLnkSet ide( path,mimefilter); | 757 | DocLnkSet ide( path,mimefilter); |
758 | folder->appendFrom(ide); | 758 | folder->appendFrom(ide); |
759 | } else { | 759 | } else { |
760 | QStringList subDirs = conf.readListEntry("subdirs",':'); | 760 | QStringList subDirs = conf.readListEntry("subdirs",':'); |
761 | if (subDirs.isEmpty()) { | 761 | if (subDirs.isEmpty()) { |
762 | subDirs.append("Documents"); | 762 | subDirs.append("Documents"); |
763 | } | 763 | } |
764 | for (unsigned c = 0; c < subDirs.count();++c) { | 764 | for (unsigned c = 0; c < subDirs.count();++c) { |
765 | DocLnkSet ide( path+"/"+subDirs[c], mimefilter ); | 765 | DocLnkSet ide( path+"/"+subDirs[c], mimefilter ); |
766 | folder->appendFrom(ide); | 766 | folder->appendFrom(ide); |
767 | } | 767 | } |
768 | } | 768 | } |
769 | } else if ( (*it)->disk() == "/dev/mtdblock6" || (*it)->disk() == "tmpfs" ) { | 769 | } else if ( (*it)->disk() == "/dev/mtdblock6" || (*it)->disk() == "tmpfs" ) { |
770 | QString path = (*it)->path() + "/Documents"; | 770 | QString path = (*it)->path() + "/Documents"; |
771 | DocLnkSet ide( path, mimefilter ); | 771 | DocLnkSet ide( path, mimefilter ); |
772 | folder->appendFrom(ide); | 772 | folder->appendFrom(ide); |
773 | } | 773 | } |
774 | } | 774 | } |
775 | } | 775 | } |
776 | 776 | ||
777 | QStringList Global::languageList() | 777 | QStringList Global::languageList() |
778 | { | 778 | { |
779 | QString lang = getenv("LANG"); | 779 | QString lang = getenv("LANG"); |
780 | QStringList langs; | 780 | QStringList langs; |
781 | langs.append(lang); | 781 | langs.append(lang); |
782 | int i = lang.find("."); | 782 | int i = lang.find("."); |
783 | if ( i > 0 ) | 783 | if ( i > 0 ) |
784 | lang = lang.left( i ); | 784 | lang = lang.left( i ); |
785 | i = lang.find( "_" ); | 785 | i = lang.find( "_" ); |
786 | if ( i > 0 ) | 786 | if ( i > 0 ) |
787 | langs.append(lang.left(i)); | 787 | langs.append(lang.left(i)); |
788 | return langs; | 788 | return langs; |
789 | } | 789 | } |
790 | 790 | ||
791 | QStringList Global::helpPath() | 791 | QStringList Global::helpPath() |
792 | { | 792 | { |
793 | QString qpeDir = QPEApplication::qpeDir(); | 793 | QString qpeDir = QPEApplication::qpeDir(); |
794 | QStringList path; | 794 | QStringList path; |
795 | QStringList langs = Global::languageList(); | 795 | QStringList langs = Global::languageList(); |
796 | for (QStringList::ConstIterator it = langs.fromLast(); it!=langs.end(); --it) { | 796 | for (QStringList::ConstIterator it = langs.fromLast(); it!=langs.end(); --it) { |
797 | QString lang = *it; | 797 | QString lang = *it; |
798 | if ( !lang.isEmpty() ) | 798 | if ( !lang.isEmpty() ) |
799 | path += qpeDir + "/help/" + lang + "/html"; | 799 | path += qpeDir + "/help/" + lang + "/html"; |
800 | } | 800 | } |
801 | path += qpeDir + "/pics"; | 801 | path += qpeDir + "/pics"; |
802 | path += qpeDir + "/help/html"; | 802 | path += qpeDir + "/help/html"; |
803 | /* we even put english into the en dir so try it as fallback as well for opie */ | 803 | /* we even put english into the en dir so try it as fallback as well for opie */ |
804 | path += qpeDir + "/help/en/html"; | 804 | path += qpeDir + "/help/en/html"; |
805 | path += qpeDir + "/docs"; | 805 | path += qpeDir + "/docs"; |
806 | 806 | ||
807 | 807 | ||
808 | return path; | 808 | return path; |
809 | } | 809 | } |
810 | 810 | ||
811 | /*! | ||
812 | \internal | ||
813 | Truncate file to size specified | ||
814 | \a f must be an open file | ||
815 | \a size must be a positive value | ||
816 | */ | ||
817 | bool Global::truncateFile(QFile &f, int size){ | ||
818 | if (!f.isOpen()) | ||
819 | return FALSE; | ||
820 | |||
821 | return ::ftruncate(f.handle(), size) != -1; | ||
822 | } | ||
823 | |||
824 | |||
825 | |||
826 | |||
827 | // #if defined(Q_OS_UNIX) && defined(Q_WS_QWS) | ||
828 | // extern int qws_display_id; | ||
829 | // #endif | ||
830 | |||
831 | /*! | ||
832 | /internal | ||
833 | Returns the default system path for storing temporary files. | ||
834 | Note: This does not it ensure that the provided directory exists | ||
835 | */ | ||
836 | QString Global::tempDir() | ||
837 | { | ||
838 | QString result; | ||
839 | #ifdef Q_OS_UNIX | ||
840 | #ifdef Q_WS_QWS | ||
841 | result = QString("/tmp/qtopia-%1/").arg(QString::number(qws_display_id)); | ||
842 | #else | ||
843 | result="/tmp/"; | ||
844 | #endif | ||
845 | #else | ||
846 | if (getenv("TEMP")) | ||
847 | result = getenv("TEMP"); | ||
848 | else | ||
849 | result = getenv("TMP"); | ||
850 | |||
851 | if (result[(int)result.length() - 1] != QDir::separator()) | ||
852 | result.append(QDir::separator()); | ||
853 | #endif | ||
854 | |||
855 | return result; | ||
856 | } | ||
857 | |||
858 | //#endif | ||
859 | |||
811 | 860 | ||
812 | #include "global.moc" | 861 | #include "global.moc" |
diff --git a/library/global.h b/library/global.h index 1136b12..f32c498 100644 --- a/library/global.h +++ b/library/global.h | |||
@@ -1,90 +1,94 @@ | |||
1 | /********************************************************************** | 1 | /********************************************************************** |
2 | ** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. | 2 | ** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. |
3 | ** | 3 | ** |
4 | ** This file is part of the Qtopia Environment. | 4 | ** This file is part of the Qtopia Environment. |
5 | ** | 5 | ** |
6 | ** This file may be distributed and/or modified under the terms of the | 6 | ** This file may be distributed and/or modified under the terms of the |
7 | ** GNU General Public License version 2 as published by the Free Software | 7 | ** GNU General Public License version 2 as published by the Free Software |
8 | ** Foundation and appearing in the file LICENSE.GPL included in the | 8 | ** Foundation and appearing in the file LICENSE.GPL included in the |
9 | ** packaging of this file. | 9 | ** packaging of this file. |
10 | ** | 10 | ** |
11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | 11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE |
12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | 12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
13 | ** | 13 | ** |
14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
15 | ** | 15 | ** |
16 | ** Contact info@trolltech.com if any conditions of this licensing are | 16 | ** Contact info@trolltech.com if any conditions of this licensing are |
17 | ** not clear to you. | 17 | ** not clear to you. |
18 | ** | 18 | ** |
19 | **********************************************************************/ | 19 | **********************************************************************/ |
20 | #ifndef GLOBAL_H | 20 | #ifndef GLOBAL_H |
21 | #define GLOBAL_H | 21 | #define GLOBAL_H |
22 | 22 | ||
23 | #include <qstringlist.h> | 23 | #include <qstringlist.h> |
24 | #include <qguardedptr.h> | 24 | #include <qguardedptr.h> |
25 | class QDawg; | 25 | class QDawg; |
26 | class QLabel; | 26 | class QLabel; |
27 | class QWidget; | 27 | class QWidget; |
28 | class AppLnk; | 28 | class AppLnk; |
29 | class DocLnkSet; | 29 | class DocLnkSet; |
30 | 30 | class QFile; | |
31 | class Global | 31 | class Global |
32 | { | 32 | { |
33 | public: | 33 | public: |
34 | Global(); | 34 | Global(); |
35 | 35 | ||
36 | // Dictionaries | 36 | // Dictionaries |
37 | static const QDawg& fixedDawg(); | 37 | static const QDawg& fixedDawg(); |
38 | static const QDawg& addedDawg(); | 38 | static const QDawg& addedDawg(); |
39 | static const QDawg& dawg(const QString& name); | 39 | static const QDawg& dawg(const QString& name); |
40 | 40 | ||
41 | static void addWords(const QStringList& word); | 41 | static void addWords(const QStringList& word); |
42 | static void addWords(const QString& dictname, const QStringList& word); | 42 | static void addWords(const QString& dictname, const QStringList& word); |
43 | // static void removeWords(const QStringList& word); -- if someone wants it | 43 | // static void removeWords(const QStringList& word); -- if someone wants it |
44 | 44 | ||
45 | static void createDocDir(); | 45 | static void createDocDir(); |
46 | 46 | ||
47 | static void findDocuments(DocLnkSet* folder, const QString &mimefilter=QString::null); | 47 | static void findDocuments(DocLnkSet* folder, const QString &mimefilter=QString::null); |
48 | 48 | ||
49 | static QString applicationFileName(const QString& appname, const QString& filename); | 49 | static QString applicationFileName(const QString& appname, const QString& filename); |
50 | 50 | ||
51 | struct Command { | 51 | struct Command { |
52 | const char *file; | 52 | const char *file; |
53 | QWidget *(*func)( bool ); | 53 | QWidget *(*func)( bool ); |
54 | bool maximized; | 54 | bool maximized; |
55 | bool documentary; | 55 | bool documentary; |
56 | }; | 56 | }; |
57 | static void setBuiltinCommands( Command* ); | 57 | static void setBuiltinCommands( Command* ); |
58 | 58 | ||
59 | static void execute( const QString &exec, const QString &document=QString::null ); | 59 | static void execute( const QString &exec, const QString &document=QString::null ); |
60 | static void setDocument( QWidget* receiver, const QString& document ); | 60 | static void setDocument( QWidget* receiver, const QString& document ); |
61 | static bool terminateBuiltin( const QString& ); | 61 | static bool terminateBuiltin( const QString& ); |
62 | static void terminate( const AppLnk* ); | 62 | static void terminate( const AppLnk* ); |
63 | 63 | ||
64 | static bool isBuiltinCommand( const QString &name ); | 64 | static bool isBuiltinCommand( const QString &name ); |
65 | 65 | ||
66 | // system messaging | 66 | // system messaging |
67 | static void applyStyle(); | 67 | static void applyStyle(); |
68 | static void statusMessage(const QString&); | 68 | static void statusMessage(const QString&); |
69 | static QWidget *shutdown( bool = FALSE ); | 69 | static QWidget *shutdown( bool = FALSE ); |
70 | static QWidget *restart( bool = FALSE ); | 70 | static QWidget *restart( bool = FALSE ); |
71 | static void hideInputMethod(); | 71 | static void hideInputMethod(); |
72 | static void showInputMethod(); | 72 | static void showInputMethod(); |
73 | 73 | ||
74 | static void writeHWClock(); | 74 | static void writeHWClock(); |
75 | 75 | ||
76 | static QString shellQuote(const QString& s); | 76 | static QString shellQuote(const QString& s); |
77 | static QString stringQuote(const QString& s); | 77 | static QString stringQuote(const QString& s); |
78 | 78 | ||
79 | #ifdef QTOPIA_INTERNAL_LANGLIST | 79 | #ifdef QTOPIA_INTERNAL_LANGLIST |
80 | static QStringList languageList(); | 80 | static QStringList languageList(); |
81 | static QStringList helpPath(); | 81 | static QStringList helpPath(); |
82 | #endif | 82 | #endif |
83 | //#ifdef QTOPIA_INTERNAL_FILEOPERATIONS | ||
84 | static bool truncateFile(QFile &f, int size); | ||
85 | static QString tempDir( ); | ||
86 | //#endif | ||
83 | 87 | ||
84 | private: | 88 | private: |
85 | static void invoke( const QString &exec); | 89 | static void invoke( const QString &exec); |
86 | static Command* builtin; | 90 | static Command* builtin; |
87 | static QGuardedPtr<QWidget> *running; | 91 | static QGuardedPtr<QWidget> *running; |
88 | }; | 92 | }; |
89 | 93 | ||
90 | #endif | 94 | #endif |
diff --git a/library/library.pro b/library/library.pro index 7143454..4142529 100644 --- a/library/library.pro +++ b/library/library.pro | |||
@@ -1,141 +1,143 @@ | |||
1 | TEMPLATE= lib | 1 | TEMPLATE= lib |
2 | #CONFIG += qt warn_on release | 2 | #CONFIG += qt warn_on release |
3 | CONFIG += qt warn_on debug | 3 | CONFIG += qt warn_on debug |
4 | HEADERS= calendar.h \ | 4 | HEADERS= calendar.h \ |
5 | global.h \ | 5 | global.h \ |
6 | resource.h \ | 6 | resource.h \ |
7 | xmlreader.h \ | 7 | xmlreader.h \ |
8 | mimetype.h \ | 8 | mimetype.h \ |
9 | menubutton.h \ | 9 | menubutton.h \ |
10 | network.h \ | 10 | network.h \ |
11 | networkinterface.h \ | 11 | networkinterface.h \ |
12 | filemanager.h \ | 12 | filemanager.h \ |
13 | fontmanager.h \ | 13 | fontmanager.h \ |
14 | qdawg.h \ | 14 | qdawg.h \ |
15 | datebookmonth.h \ | 15 | datebookmonth.h \ |
16 | fileselector.h \ | 16 | fileselector.h \ |
17 | fileselector_p.h \ | 17 | fileselector_p.h \ |
18 | imageedit.h \ | 18 | imageedit.h \ |
19 | qcopenvelope_qws.h \ | 19 | qcopenvelope_qws.h \ |
20 | qpedecoration_qws.h \ | 20 | qpedecoration_qws.h \ |
21 | qpeapplication.h \ | 21 | qpeapplication.h \ |
22 | qpestyle.h \ | 22 | qpestyle.h \ |
23 | qpedialog.h \ | 23 | qpedialog.h \ |
24 | lightstyle.h \ | 24 | lightstyle.h \ |
25 | config.h \ | 25 | config.h \ |
26 | applnk.h \ | 26 | applnk.h \ |
27 | sound.h \ | 27 | sound.h \ |
28 | tzselect.h \ | 28 | tzselect.h \ |
29 | qmath.h \ | 29 | qmath.h \ |
30 | datebookdb.h \ | 30 | datebookdb.h \ |
31 | alarmserver.h \ | 31 | alarmserver.h \ |
32 | process.h \ | 32 | process.h \ |
33 | password.h \ | 33 | password.h \ |
34 | timestring.h \ | 34 | timestring.h \ |
35 | fontfactoryinterface.h \ | 35 | fontfactoryinterface.h \ |
36 | fontdatabase.h \ | 36 | fontdatabase.h \ |
37 | power.h \ | 37 | power.h \ |
38 | storage.h \ | 38 | storage.h \ |
39 | qpemessagebox.h \ | 39 | qpemessagebox.h \ |
40 | timeconversion.h \ | 40 | timeconversion.h \ |
41 | qpedebug.h \ | 41 | qpedebug.h \ |
42 | qpemenubar.h \ | 42 | qpemenubar.h \ |
43 | qpetoolbar.h \ | 43 | qpetoolbar.h \ |
44 | backend/categories.h \ | 44 | backend/categories.h \ |
45 | stringutil.h \ | 45 | stringutil.h \ |
46 | backend/palmtoprecord.h \ | 46 | backend/palmtoprecord.h \ |
47 | backend/task.h \ | 47 | backend/task.h \ |
48 | backend/event.h \ | 48 | backend/event.h \ |
49 | backend/contact.h\ | 49 | backend/contact.h\ |
50 | categorymenu.h \ | 50 | categorymenu.h \ |
51 | categoryedit_p.h \ | 51 | categoryedit_p.h \ |
52 | categoryselect.h \ | 52 | categoryselect.h \ |
53 | categorywidget.h \ | 53 | categorywidget.h \ |
54 | ir.h \ | 54 | ir.h \ |
55 | backend/vobject_p.h \ | 55 | backend/vobject_p.h \ |
56 | findwidget_p.h \ | 56 | findwidget_p.h \ |
57 | finddialog.h \ | 57 | finddialog.h \ |
58 | lnkproperties.h \ | 58 | lnkproperties.h \ |
59 | windowdecorationinterface.h \ | 59 | windowdecorationinterface.h \ |
60 | textcodecinterface.h \ | 60 | textcodecinterface.h \ |
61 | imagecodecinterface.h \ | 61 | imagecodecinterface.h \ |
62 | locationcombo.h \ | ||
62 | qpeglobal.h | 63 | qpeglobal.h |
63 | 64 | ||
64 | SOURCES= calendar.cpp \ | 65 | SOURCES= calendar.cpp \ |
65 | global.cpp \ | 66 | global.cpp \ |
66 | xmlreader.cpp \ | 67 | xmlreader.cpp \ |
67 | mimetype.cpp \ | 68 | mimetype.cpp \ |
68 | menubutton.cpp \ | 69 | menubutton.cpp \ |
69 | network.cpp \ | 70 | network.cpp \ |
70 | networkinterface.cpp \ | 71 | networkinterface.cpp \ |
71 | filemanager.cpp \ | 72 | filemanager.cpp \ |
72 | fontmanager.cpp \ | 73 | fontmanager.cpp \ |
73 | qdawg.cpp \ | 74 | qdawg.cpp \ |
74 | datebookmonth.cpp \ | 75 | datebookmonth.cpp \ |
75 | fileselector.cpp \ | 76 | fileselector.cpp \ |
76 | imageedit.cpp \ | 77 | imageedit.cpp \ |
77 | resource.cpp \ | 78 | resource.cpp \ |
78 | qpedecoration_qws.cpp \ | 79 | qpedecoration_qws.cpp \ |
79 | qcopenvelope_qws.cpp \ | 80 | qcopenvelope_qws.cpp \ |
80 | qpeapplication.cpp \ | 81 | qpeapplication.cpp \ |
81 | qpestyle.cpp \ | 82 | qpestyle.cpp \ |
82 | qpedialog.cpp \ | 83 | qpedialog.cpp \ |
83 | lightstyle.cpp \ | 84 | lightstyle.cpp \ |
84 | config.cpp \ | 85 | config.cpp \ |
85 | applnk.cpp \ | 86 | applnk.cpp \ |
86 | sound.cpp \ | 87 | sound.cpp \ |
87 | tzselect.cpp \ | 88 | tzselect.cpp \ |
88 | qmath.c \ | 89 | qmath.c \ |
89 | datebookdb.cpp \ | 90 | datebookdb.cpp \ |
90 | alarmserver.cpp \ | 91 | alarmserver.cpp \ |
91 | password.cpp \ | 92 | password.cpp \ |
92 | process.cpp \ | 93 | process.cpp \ |
93 | process_unix.cpp \ | 94 | process_unix.cpp \ |
94 | timestring.cpp \ | 95 | timestring.cpp \ |
95 | fontdatabase.cpp \ | 96 | fontdatabase.cpp \ |
96 | power.cpp \ | 97 | power.cpp \ |
97 | storage.cpp \ | 98 | storage.cpp \ |
98 | qpemessagebox.cpp \ | 99 | qpemessagebox.cpp \ |
99 | backend/timeconversion.cpp \ | 100 | backend/timeconversion.cpp \ |
100 | qpedebug.cpp \ | 101 | qpedebug.cpp \ |
101 | qpemenubar.cpp \ | 102 | qpemenubar.cpp \ |
102 | qpetoolbar.cpp \ | 103 | qpetoolbar.cpp \ |
103 | backend/categories.cpp \ | 104 | backend/categories.cpp \ |
104 | backend/stringutil.cpp \ | 105 | backend/stringutil.cpp \ |
105 | backend/palmtoprecord.cpp \ | 106 | backend/palmtoprecord.cpp \ |
106 | backend/task.cpp \ | 107 | backend/task.cpp \ |
107 | backend/event.cpp \ | 108 | backend/event.cpp \ |
108 | backend/contact.cpp \ | 109 | backend/contact.cpp \ |
109 | categorymenu.cpp \ | 110 | categorymenu.cpp \ |
110 | categoryedit_p.cpp \ | 111 | categoryedit_p.cpp \ |
111 | categoryselect.cpp \ | 112 | categoryselect.cpp \ |
112 | categorywidget.cpp \ | 113 | categorywidget.cpp \ |
113 | ir.cpp \ | 114 | ir.cpp \ |
114 | backend/vcc_yacc.cpp \ | 115 | backend/vcc_yacc.cpp \ |
115 | backend/vobject.cpp \ | 116 | backend/vobject.cpp \ |
116 | findwidget_p.cpp \ | 117 | findwidget_p.cpp \ |
117 | finddialog.cpp \ | 118 | finddialog.cpp \ |
118 | lnkproperties.cpp \ | 119 | lnkproperties.cpp \ |
120 | locationcombo.cpp \ | ||
119 | widget_showing.cpp | 121 | widget_showing.cpp |
120 | 122 | ||
121 | 123 | ||
122 | 124 | ||
123 | # Qt 3 compatibility | 125 | # Qt 3 compatibility |
124 | HEADERS += quuid.h qcom.h qlibrary.h qlibrary_p.h | 126 | HEADERS += quuid.h qcom.h qlibrary.h qlibrary_p.h |
125 | SOURCES += quuid.cpp qlibrary.cpp qlibrary_unix.cpp | 127 | SOURCES += quuid.cpp qlibrary.cpp qlibrary_unix.cpp |
126 | 128 | ||
127 | DEFINES += OPIE_INTERNAL_LIBRARY_BUILD | 129 | DEFINES += OPIE_INTERNAL_LIBRARY_BUILD |
128 | INCLUDEPATH += $(OPIEDIR)/include backend | 130 | INCLUDEPATH += $(OPIEDIR)/include backend |
129 | LIBS += -ldl -lcrypt -lm | 131 | LIBS += -ldl -lcrypt -lm |
130 | INTERFACES = passwordbase_p.ui categoryeditbase_p.ui findwidgetbase_p.ui lnkpropertiesbase_p.ui | 132 | INTERFACES = passwordbase_p.ui categoryeditbase_p.ui findwidgetbase_p.ui lnkpropertiesbase_p.ui |
131 | TARGET = qpe | 133 | TARGET = qpe |
132 | DESTDIR = $(OPIEDIR)/lib$(PROJMAK) | 134 | DESTDIR = $(OPIEDIR)/lib$(PROJMAK) |
133 | VERSION = 1.5.0.1 | 135 | VERSION = 1.5.0.1 |
134 | 136 | ||
135 | include( $(OPIEDIR)/include.pro ) | 137 | include( $(OPIEDIR)/include.pro ) |
136 | 138 | ||
137 | contains( CONFIG, LIBQPE_WITHROHFEEDBACK ){ | 139 | contains( CONFIG, LIBQPE_WITHROHFEEDBACK ){ |
138 | DEFINES += OPIE_WITHROHFEEDBACK | 140 | DEFINES += OPIE_WITHROHFEEDBACK |
139 | SOURCES += backend/rohfeedback.cpp | 141 | SOURCES += backend/rohfeedback.cpp |
140 | HEADERS += backend/rohfeedback.h | 142 | HEADERS += backend/rohfeedback.h |
141 | } | 143 | } |
diff --git a/library/locationcombo.cpp b/library/locationcombo.cpp new file mode 100644 index 0000000..31429f5 --- a/dev/null +++ b/library/locationcombo.cpp | |||
@@ -0,0 +1,295 @@ | |||
1 | /********************************************************************** | ||
2 | ** Copyright (C) 2000-2006 Trolltech AS. All rights reserved. | ||
3 | ** | ||
4 | ** This file is part of the Qtopia Environment. | ||
5 | ** | ||
6 | ** This program is free software; you can redistribute it and/or modify it | ||
7 | ** under the terms of the GNU General Public License as published by the | ||
8 | ** Free Software Foundation; either version 2 of the License, or (at your | ||
9 | ** option) any later version. | ||
10 | ** | ||
11 | ** A copy of the GNU GPL license version 2 is included in this package as | ||
12 | ** LICENSE.GPL. | ||
13 | ** | ||
14 | ** This program is distributed in the hope that it will be useful, but | ||
15 | ** WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
17 | ** See the GNU General Public License for more details. | ||
18 | ** | ||
19 | ** In addition, as a special exception Trolltech gives permission to link | ||
20 | ** the code of this program with Qtopia applications copyrighted, developed | ||
21 | ** and distributed by Trolltech under the terms of the Qtopia Personal Use | ||
22 | ** License Agreement. You must comply with the GNU General Public License | ||
23 | ** in all respects for all of the code used other than the applications | ||
24 | ** licensed under the Qtopia Personal Use License Agreement. If you modify | ||
25 | ** this file, you may extend this exception to your version of the file, | ||
26 | ** but you are not obligated to do so. If you do not wish to do so, delete | ||
27 | ** this exception statement from your version. | ||
28 | ** | ||
29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | ||
30 | ** | ||
31 | ** Contact info@trolltech.com if any conditions of this licensing are | ||
32 | ** not clear to you. | ||
33 | ** | ||
34 | **********************************************************************/ | ||
35 | |||
36 | #include "locationcombo.h" | ||
37 | |||
38 | #include <qpe/ir.h> | ||
39 | #include <qpe/applnk.h> | ||
40 | #include <qpe/global.h> | ||
41 | #include <qpe/categorywidget.h> | ||
42 | #include <qpe/categoryselect.h> | ||
43 | #ifdef QWS | ||
44 | #include <qpe/qcopenvelope_qws.h> | ||
45 | #endif | ||
46 | #include <qpe/filemanager.h> | ||
47 | #include <qpe/config.h> | ||
48 | #include <qpe/storage.h> | ||
49 | #include <qpe/global.h> | ||
50 | #include <qtopia/qpemessagebox.h> | ||
51 | |||
52 | #include <qlineedit.h> | ||
53 | #include <qtoolbutton.h> | ||
54 | #include <qpushbutton.h> | ||
55 | #include <qgroupbox.h> | ||
56 | #include <qcheckbox.h> | ||
57 | #include <qlabel.h> | ||
58 | #include <qlayout.h> | ||
59 | #include <qfile.h> | ||
60 | #include <qdir.h> | ||
61 | #include <qfileinfo.h> | ||
62 | #include <qmessagebox.h> | ||
63 | #include <qsize.h> | ||
64 | #include <qcombobox.h> | ||
65 | #include <qregexp.h> | ||
66 | |||
67 | #include <qradiobutton.h> | ||
68 | #include <qlayout.h> | ||
69 | |||
70 | #include <stdlib.h> | ||
71 | |||
72 | /*! | ||
73 | \class LocationCombo locationcombo.h | ||
74 | \brief The LocationCombo class displays a list of available storage | ||
75 | locations. | ||
76 | |||
77 | First availability: Qtopia 1.6 | ||
78 | |||
79 | \ingroup qtopiaemb | ||
80 | \sa DocPropertiesDialog | ||
81 | */ | ||
82 | |||
83 | |||
84 | class LocationComboPrivate | ||
85 | { | ||
86 | public: | ||
87 | LocationComboPrivate() : homeLocation(-1), fileSize(0), listEmpty(TRUE) {} | ||
88 | QString originalPath; | ||
89 | int homeLocation; | ||
90 | int fileSize; | ||
91 | bool listEmpty; | ||
92 | }; | ||
93 | |||
94 | /*! | ||
95 | Constructs a LocationCombo with parent \a parent and name \a name. | ||
96 | */ | ||
97 | LocationCombo::LocationCombo( QWidget *parent, const char *name ) | ||
98 | : QComboBox( FALSE, parent, name ) | ||
99 | { | ||
100 | storage = new StorageInfo; | ||
101 | d = new LocationComboPrivate; | ||
102 | setLocation( 0 ); | ||
103 | connect( this, SIGNAL(activated(int)), this, SIGNAL(newPath()) ); | ||
104 | connect( storage, SIGNAL(disksChanged()), this, SLOT(updatePaths()) ); | ||
105 | } | ||
106 | |||
107 | /*! | ||
108 | Constructs a LocationCombo with parent \a parent and name \a name. | ||
109 | \a lnk is pointer to an existing AppLnk. | ||
110 | */ | ||
111 | LocationCombo::LocationCombo( const AppLnk * lnk, QWidget *parent, const char *name ) | ||
112 | : QComboBox( FALSE, parent, name ) | ||
113 | { | ||
114 | storage = new StorageInfo; | ||
115 | d = new LocationComboPrivate; | ||
116 | setLocation(lnk); | ||
117 | connect( this, SIGNAL(activated(int)), this, SIGNAL(newPath()) ); | ||
118 | connect( storage, SIGNAL(disksChanged()), this, SLOT(updatePaths()) ); | ||
119 | } | ||
120 | |||
121 | /*! | ||
122 | Destroys the widget. | ||
123 | */ | ||
124 | LocationCombo::~LocationCombo() | ||
125 | { | ||
126 | delete storage; | ||
127 | delete d; | ||
128 | } | ||
129 | |||
130 | /*! | ||
131 | Sets the display of the LocationCombo to the location associated with the | ||
132 | AppLnk \a lnk. | ||
133 | */ | ||
134 | void LocationCombo::setLocation( const AppLnk * lnk ) | ||
135 | { | ||
136 | // NB: setLocation(const QString) assumes only lnk->file() is used. | ||
137 | |||
138 | if ( lnk ) { | ||
139 | QFileInfo fi( lnk->file() ); | ||
140 | d->fileSize = fi.size(); | ||
141 | const FileSystem *fs = storage->fileSystemOf( lnk->file() ); | ||
142 | d->originalPath = fs ? fs->path() : QString::null; | ||
143 | } else { | ||
144 | d->fileSize = 0; | ||
145 | d->originalPath = QString::null; | ||
146 | } | ||
147 | |||
148 | setupCombo(); | ||
149 | |||
150 | int currentLocation = -1; | ||
151 | if ( lnk ) { | ||
152 | int n = locations.count(); | ||
153 | for ( int i = 0; i < n; i++ ) { | ||
154 | if ( lnk->file().contains( locations[i] ) ) | ||
155 | currentLocation = i; | ||
156 | } | ||
157 | } | ||
158 | if ( currentLocation == -1 ) | ||
159 | currentLocation = 0; //default to the first one | ||
160 | |||
161 | setCurrentItem( currentLocation ); | ||
162 | } | ||
163 | |||
164 | /*! | ||
165 | \internal | ||
166 | */ | ||
167 | void LocationCombo::setupCombo() | ||
168 | { | ||
169 | clear(); | ||
170 | locations.clear(); | ||
171 | |||
172 | const QList<FileSystem> &fs = storage->fileSystems(); | ||
173 | QListIterator<FileSystem> it ( fs ); | ||
174 | QString s; | ||
175 | QString homeDir = QDir::homeDirPath(); | ||
176 | QString homeFs; | ||
177 | QString homeFsPath; | ||
178 | int index = 0; | ||
179 | for ( ; it.current(); ++it ) { | ||
180 | // we add 10k to the file size so we are sure we can also save the desktop file | ||
181 | if ( !d->fileSize || (*it)->path() == d->originalPath || | ||
182 | (ulong)(*it)->availBlocks() * (ulong)(*it)->blockSize() | ||
183 | > (ulong)d->fileSize + 10000 ) | ||
184 | { | ||
185 | if ( (*it)->isRemovable() ) { | ||
186 | insertItem( (*it)->name(), index ); | ||
187 | locations.append( (*it)->path() ); | ||
188 | index++; | ||
189 | } else if ( homeDir.contains( (*it)->path() ) && | ||
190 | (*it)->path().length() > homeFsPath.length() ) { | ||
191 | homeFs = (*it)->name(); | ||
192 | homeFsPath = (*it)->path(); | ||
193 | } | ||
194 | } | ||
195 | } | ||
196 | |||
197 | // $HOME is *somewhere*, but not shown in Storage::fileSystems(), | ||
198 | // eg. because it's mounted in some unexpected way. | ||
199 | if ( homeFsPath.isEmpty() ) { | ||
200 | homeFs = StorageInfo::tr("Internal Storage"); | ||
201 | homeFsPath = homeDir; | ||
202 | } | ||
203 | |||
204 | if ( !homeFsPath.isEmpty() ) { | ||
205 | d->homeLocation = 0; | ||
206 | insertItem( homeFs, d->homeLocation ); | ||
207 | locations.prepend( homeDir ); | ||
208 | } else { | ||
209 | d->homeLocation = -1; | ||
210 | } | ||
211 | |||
212 | d->listEmpty = locations.count() == 0; | ||
213 | if ( d->listEmpty ) { | ||
214 | insertItem( tr("No FileSystems Available!"), 0 ); | ||
215 | locations.append( "" ); | ||
216 | } | ||
217 | } | ||
218 | |||
219 | /*! | ||
220 | \internal | ||
221 | */ | ||
222 | void LocationCombo::updatePaths() | ||
223 | { | ||
224 | QString oldPath = locations[currentItem()]; | ||
225 | |||
226 | setupCombo(); | ||
227 | |||
228 | int currentLocation = 0; | ||
229 | int n = locations.count(); | ||
230 | for ( int i = 0; i < n; i++ ) { | ||
231 | if ( oldPath == locations[i] ) { | ||
232 | currentLocation = i; | ||
233 | } | ||
234 | } | ||
235 | setCurrentItem( currentLocation ); | ||
236 | if ( locations[currentItem()] != oldPath ) | ||
237 | emit newPath(); | ||
238 | } | ||
239 | |||
240 | /*! | ||
241 | Returns TRUE to indicate that the user has changed the location displayed | ||
242 | by the LocationCombo. Most useful when the LocationCombo is part of a | ||
243 | dialog; when the dialog is accept()ed, LocationCombo::isChanged() can be | ||
244 | examined to check for a change of location. | ||
245 | */ | ||
246 | bool LocationCombo::isChanged() const | ||
247 | { | ||
248 | if ( const FileSystem *fs = storage->fileSystemOf(locations[currentItem()]) ) | ||
249 | return fs->path() != d->originalPath; | ||
250 | |||
251 | return TRUE; | ||
252 | } | ||
253 | |||
254 | /*! | ||
255 | Returns the default (home) location for the file associated with this | ||
256 | LocationCombo. | ||
257 | */ | ||
258 | QString LocationCombo::installationPath() const | ||
259 | { | ||
260 | return currentItem() == d->homeLocation ? | ||
261 | QString("/") : locations[ currentItem() ]+"/"; | ||
262 | } | ||
263 | |||
264 | /*! | ||
265 | Returns the document path associated with this LocationCombo. This | ||
266 | will be "\<path\>/Documents". | ||
267 | */ | ||
268 | QString LocationCombo::documentPath() const | ||
269 | { | ||
270 | return locations[ currentItem() ]+"/Documents/"; | ||
271 | } | ||
272 | |||
273 | /*! | ||
274 | Returns a pointer to FileSystem object, associated with the current | ||
275 | selection of the LocationCombo. | ||
276 | */ | ||
277 | const FileSystem *LocationCombo::fileSystem() const | ||
278 | { | ||
279 | if ( d->listEmpty ) | ||
280 | return 0; | ||
281 | return storage->fileSystemOf( locations[ currentItem() ] ); | ||
282 | } | ||
283 | |||
284 | /*! | ||
285 | \fn LocationCombo::newPath() | ||
286 | Emitted when the LocationCombo changes to a new location. | ||
287 | */ | ||
288 | |||
289 | |||
290 | #if 0 | ||
291 | void LocationCombo::apply() | ||
292 | { | ||
293 | } | ||
294 | #endif | ||
295 | |||
diff --git a/library/locationcombo.h b/library/locationcombo.h new file mode 100644 index 0000000..fab3dfc --- a/dev/null +++ b/library/locationcombo.h | |||
@@ -0,0 +1,88 @@ | |||
1 | /********************************************************************** | ||
2 | ** Copyright (C) 2000-2006 Trolltech AS. All rights reserved. | ||
3 | ** | ||
4 | ** This file is part of the Qtopia Environment. | ||
5 | ** | ||
6 | ** This program is free software; you can redistribute it and/or modify it | ||
7 | ** under the terms of the GNU General Public License as published by the | ||
8 | ** Free Software Foundation; either version 2 of the License, or (at your | ||
9 | ** option) any later version. | ||
10 | ** | ||
11 | ** A copy of the GNU GPL license version 2 is included in this package as | ||
12 | ** LICENSE.GPL. | ||
13 | ** | ||
14 | ** This program is distributed in the hope that it will be useful, but | ||
15 | ** WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
17 | ** See the GNU General Public License for more details. | ||
18 | ** | ||
19 | ** In addition, as a special exception Trolltech gives permission to link | ||
20 | ** the code of this program with Qtopia applications copyrighted, developed | ||
21 | ** and distributed by Trolltech under the terms of the Qtopia Personal Use | ||
22 | ** License Agreement. You must comply with the GNU General Public License | ||
23 | ** in all respects for all of the code used other than the applications | ||
24 | ** licensed under the Qtopia Personal Use License Agreement. If you modify | ||
25 | ** this file, you may extend this exception to your version of the file, | ||
26 | ** but you are not obligated to do so. If you do not wish to do so, delete | ||
27 | ** this exception statement from your version. | ||
28 | ** | ||
29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | ||
30 | ** | ||
31 | ** Contact info@trolltech.com if any conditions of this licensing are | ||
32 | ** not clear to you. | ||
33 | ** | ||
34 | **********************************************************************/ | ||
35 | |||
36 | #ifndef LOCATIONCOMBO_H | ||
37 | #define LOCATIONCOMBO_H | ||
38 | |||
39 | #include <qpe/qpeglobal.h> | ||
40 | |||
41 | #ifdef Q_WS_QWS | ||
42 | |||
43 | #include <qstringlist.h> | ||
44 | #include <qcombobox.h> | ||
45 | |||
46 | class AppLnk; | ||
47 | class QListViewItem; | ||
48 | class DocLnk; | ||
49 | class FileSystem; | ||
50 | class StorageInfo; | ||
51 | |||
52 | |||
53 | class LocationComboPrivate; | ||
54 | |||
55 | class LocationCombo : public QComboBox | ||
56 | { | ||
57 | Q_OBJECT | ||
58 | public: | ||
59 | LocationCombo( QWidget *parent, const char *name=0 ); | ||
60 | LocationCombo( const AppLnk * lnk, QWidget *parent, const char *name=0 ); | ||
61 | |||
62 | ~LocationCombo(); | ||
63 | |||
64 | void setLocation( const QString& path ); // qtopia 2 | ||
65 | void setLocation( const AppLnk * ); | ||
66 | |||
67 | QString installationPath() const; | ||
68 | QString documentPath() const; | ||
69 | const FileSystem *fileSystem() const; | ||
70 | |||
71 | bool isChanged() const; | ||
72 | |||
73 | signals: | ||
74 | void newPath(); | ||
75 | |||
76 | private slots: | ||
77 | void updatePaths(); | ||
78 | |||
79 | private: | ||
80 | void setupCombo(); | ||
81 | QStringList locations; | ||
82 | StorageInfo *storage; | ||
83 | LocationComboPrivate *d; | ||
84 | }; | ||
85 | |||
86 | |||
87 | #endif // QWS | ||
88 | #endif // LNKPROPERTIES_H | ||
diff --git a/library/qlibrary_unix.cpp b/library/qlibrary_unix.cpp index fee73c2..f4d60cb 100644 --- a/library/qlibrary_unix.cpp +++ b/library/qlibrary_unix.cpp | |||
@@ -73,171 +73,171 @@ void* QLibraryPrivate::resolveSymbol( const char* symbol ) | |||
73 | #endif | 73 | #endif |
74 | return 0; | 74 | return 0; |
75 | } | 75 | } |
76 | return address; | 76 | return address; |
77 | } | 77 | } |
78 | 78 | ||
79 | #elif defined(_NULL_LIB_) | 79 | #elif defined(_NULL_LIB_) |
80 | 80 | ||
81 | bool QLibraryPrivate::loadLibrary() | 81 | bool QLibraryPrivate::loadLibrary() |
82 | { | 82 | { |
83 | //qDebug("QLibraryPrivate::loadLibrary\n"); | 83 | //qDebug("QLibraryPrivate::loadLibrary\n"); |
84 | return FALSE; | 84 | return FALSE; |
85 | } | 85 | } |
86 | bool QLibraryPrivate::freeLibrary() | 86 | bool QLibraryPrivate::freeLibrary() |
87 | { | 87 | { |
88 | //qDebug("QLibraryPrivate::freeLibrary\n"); | 88 | //qDebug("QLibraryPrivate::freeLibrary\n"); |
89 | return FALSE; | 89 | return FALSE; |
90 | } | 90 | } |
91 | void* QLibraryPrivate::resolveSymbol( const char* symbol ) | 91 | void* QLibraryPrivate::resolveSymbol( const char* symbol ) |
92 | { | 92 | { |
93 | //qDebug("QLibraryPrivate::resolveSymbol\n"); | 93 | //qDebug("QLibraryPrivate::resolveSymbol\n"); |
94 | return FALSE; | 94 | return FALSE; |
95 | } | 95 | } |
96 | 96 | ||
97 | #elif defined(Q_OS_MACX) | 97 | #elif defined(Q_OS_MACX) |
98 | 98 | ||
99 | #define ENUM_DYLD_BOOL | 99 | #define ENUM_DYLD_BOOL |
100 | enum DYLD_BOOL { | 100 | enum DYLD_BOOL { |
101 | DYLD_FALSE, | 101 | DYLD_FALSE, |
102 | DYLD_TRUE | 102 | DYLD_TRUE |
103 | }; | 103 | }; |
104 | #include <mach-o/dyld.h> | 104 | #include <mach-o/dyld.h> |
105 | typedef struct { | 105 | typedef struct { |
106 | NSObjectFileImage img; | 106 | NSObjectFileImage img; |
107 | NSModule mod; | 107 | NSModule mod; |
108 | } DyldLibDesc; | 108 | } DyldLibDesc; |
109 | 109 | ||
110 | bool QLibraryPrivate::loadLibrary() | 110 | bool QLibraryPrivate::loadLibrary() |
111 | { | 111 | { |
112 | // qDebug("QLibraryPrivate::loadLibrary\n"); | 112 | // qDebug("QLibraryPrivate::loadLibrary\n"); |
113 | // return FALSE; | 113 | // return FALSE; |
114 | if ( pHnd ) | 114 | if ( pHnd ) |
115 | return TRUE; | 115 | return TRUE; |
116 | 116 | ||
117 | QString filename = library->library(); | 117 | QString filename = library->library(); |
118 | 118 | ||
119 | NSObjectFileImage img = 0; | 119 | NSObjectFileImage img = 0; |
120 | NSModule mod = 0; | 120 | NSModule mod = 0; |
121 | NSObjectFileImageReturnCode ret = NSCreateObjectFileImageFromFile( filename.latin1() , &img ); | 121 | NSObjectFileImageReturnCode ret = NSCreateObjectFileImageFromFile( filename.latin1() , &img ); |
122 | if ( ret != NSObjectFileImageSuccess ) { | 122 | if ( ret != NSObjectFileImageSuccess ) { |
123 | qWarning( "Error in NSCreateObjectFileImageFromFile(): %d; Filename: %s", ret, filename.latin1() ); | 123 | qWarning( "Error in NSCreateObjectFileImageFromFile(): %d; Filename: %s", ret, filename.latin1() ); |
124 | if (ret == NSObjectFileImageAccess) { | 124 | if (ret == NSObjectFileImageAccess) { |
125 | qWarning ("(NSObjectFileImageAccess)" ); | 125 | qWarning ("(NSObjectFileImageAccess)" ); |
126 | } | 126 | } |
127 | } else { | 127 | } else { |
128 | mod = NSLinkModule(img, filename.latin1(), NSLINKMODULE_OPTION_BINDNOW | | 128 | mod = NSLinkModule(img, filename.latin1(), NSLINKMODULE_OPTION_BINDNOW | |
129 | NSLINKMODULE_OPTION_PRIVATE | | 129 | NSLINKMODULE_OPTION_PRIVATE | |
130 | NSLINKMODULE_OPTION_RETURN_ON_ERROR); | 130 | NSLINKMODULE_OPTION_RETURN_ON_ERROR); |
131 | if (mod == 0) { | 131 | if (mod == 0) { |
132 | qWarning( "Error in NSLinkModule()" ); | 132 | qWarning( "Error in NSLinkModule()" ); |
133 | NSDestroyObjectFileImage(img); | 133 | NSDestroyObjectFileImage(img); |
134 | } | 134 | } |
135 | } | 135 | } |
136 | DyldLibDesc* desc = 0; | 136 | DyldLibDesc* desc = 0; |
137 | if (img != 0 && mod != 0) { | 137 | if (img != 0 && mod != 0) { |
138 | desc = new DyldLibDesc; | 138 | desc = new DyldLibDesc; |
139 | desc->img = img; | 139 | desc->img = img; |
140 | desc->mod = mod; | 140 | desc->mod = mod; |
141 | } | 141 | } |
142 | pHnd = desc; | 142 | pHnd = desc; |
143 | return pHnd != 0; | 143 | return pHnd != 0; |
144 | } | 144 | } |
145 | 145 | ||
146 | bool QLibraryPrivate::freeLibrary() | 146 | bool QLibraryPrivate::freeLibrary() |
147 | { | 147 | { |
148 | //qDebug("QLibraryPrivate::freeLibrary\n"); | 148 | //qDebug("QLibraryPrivate::freeLibrary\n"); |
149 | //return FALSE; | 149 | //return FALSE; |
150 | if ( !pHnd ) | 150 | if ( !pHnd ) |
151 | return TRUE; | 151 | return TRUE; |
152 | 152 | ||
153 | DyldLibDesc* desc = (DyldLibDesc*) pHnd; | 153 | DyldLibDesc* desc = (DyldLibDesc*) pHnd; |
154 | NSModule mod = desc->mod; | 154 | NSModule mod = desc->mod; |
155 | NSObjectFileImage img = desc->img; | 155 | NSObjectFileImage img = desc->img; |
156 | bool success = NSUnLinkModule(mod, NSUNLINKMODULE_OPTION_NONE); | 156 | bool success = NSUnLinkModule(mod, NSUNLINKMODULE_OPTION_NONE); |
157 | if ( success ) { | 157 | if ( success ) { |
158 | NSDestroyObjectFileImage(img); | 158 | NSDestroyObjectFileImage(img); |
159 | delete desc; | 159 | delete desc; |
160 | pHnd = 0; | 160 | pHnd = 0; |
161 | } | 161 | } |
162 | #if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT) | 162 | #if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT) |
163 | else { | 163 | else { |
164 | qWarning( "Error in NSUnLinkModule()" ); | 164 | qWarning( "Error in NSUnLinkModule()" ); |
165 | } | 165 | } |
166 | #endif | 166 | #endif |
167 | return pHnd == 0; | 167 | return pHnd == 0; |
168 | } | 168 | } |
169 | 169 | ||
170 | void* QLibraryPrivate::resolveSymbol( const char* symbol ) | 170 | void* QLibraryPrivate::resolveSymbol( const char* symbol ) |
171 | { | 171 | { |
172 | //qDebug("QLibraryPrivate::resolveSymbol\n"); | 172 | //qDebug("QLibraryPrivate::resolveSymbol\n"); |
173 | //return FALSE; | 173 | //return FALSE; |
174 | if ( !pHnd ) | 174 | if ( !pHnd ) |
175 | return 0; | 175 | return 0; |
176 | 176 | ||
177 | DyldLibDesc* desc = (DyldLibDesc*) pHnd; | 177 | DyldLibDesc* desc = (DyldLibDesc*) pHnd; |
178 | NSSymbol sym = NSLookupSymbolInModule(desc->mod, symbol); | 178 | NSSymbol sym = NSLookupSymbolInModule(desc->mod, symbol); |
179 | void* address = 0; | 179 | void* address = 0; |
180 | if (sym != 0) { | 180 | if (sym != 0) { |
181 | address = NSAddressOfSymbol(sym); | 181 | address = NSAddressOfSymbol(sym); |
182 | } | 182 | } |
183 | #if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT) | 183 | #if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT) |
184 | if ( address == 0 ) | 184 | if ( address == 0 ) |
185 | qWarning( "Cannot find symbol: %s", symbol ); | 185 | qWarning( "Cannot find symbol: %s", symbol ); |
186 | #endif | 186 | #endif |
187 | return address; | 187 | return address; |
188 | } | 188 | } |
189 | 189 | ||
190 | #else | 190 | #else |
191 | // Something else, assuming POSIX | 191 | // Something else, assuming POSIX |
192 | #include <dlfcn.h> | 192 | #include <dlfcn.h> |
193 | 193 | ||
194 | bool QLibraryPrivate::loadLibrary() | 194 | bool QLibraryPrivate::loadLibrary() |
195 | { | 195 | { |
196 | if ( pHnd ) | 196 | if ( pHnd ) |
197 | return TRUE; | 197 | return TRUE; |
198 | 198 | ||
199 | QString filename = library->library(); | 199 | QString filename = library->library(); |
200 | 200 | ||
201 | pHnd = dlopen( filename.latin1() , RTLD_LAZY ); | 201 | pHnd = ::dlopen( filename.latin1() , RTLD_LAZY ); |
202 | // #if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT) | 202 | // #if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT) |
203 | if ( !pHnd ) | 203 | if ( !pHnd ) |
204 | qWarning( "%s", dlerror() ); | 204 | qWarning( "%s", dlerror() ); |
205 | // #endif | 205 | // #endif |
206 | return pHnd != 0; | 206 | return pHnd != 0; |
207 | } | 207 | } |
208 | 208 | ||
209 | bool QLibraryPrivate::freeLibrary() | 209 | bool QLibraryPrivate::freeLibrary() |
210 | { | 210 | { |
211 | if ( !pHnd ) | 211 | if ( !pHnd ) |
212 | return TRUE; | 212 | return TRUE; |
213 | 213 | ||
214 | int ec = dlclose( pHnd ); | 214 | int ec = ::dlclose( pHnd ); |
215 | if ( !ec ) | 215 | if ( !ec ) |
216 | pHnd = 0; | 216 | pHnd = 0; |
217 | #if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT) | 217 | #if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT) |
218 | else { | 218 | else { |
219 | const char* error = dlerror(); | 219 | const char* error = dlerror(); |
220 | if ( error ) | 220 | if ( error ) |
221 | qWarning( "%s", error ); | 221 | qWarning( "%s", error ); |
222 | } | 222 | } |
223 | #endif | 223 | #endif |
224 | return pHnd == 0; | 224 | return pHnd == 0; |
225 | } | 225 | } |
226 | 226 | ||
227 | void* QLibraryPrivate::resolveSymbol( const char* f ) | 227 | void* QLibraryPrivate::resolveSymbol( const char* f ) |
228 | { | 228 | { |
229 | if ( !pHnd ) | 229 | if ( !pHnd ) |
230 | return 0; | 230 | return 0; |
231 | 231 | ||
232 | void* address = dlsym( pHnd, f ); | 232 | void* address = dlsym( pHnd, f ); |
233 | #if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT) | 233 | #if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT) |
234 | const char* error = dlerror(); | 234 | const char* error = dlerror(); |
235 | if ( error ) | 235 | if ( error ) |
236 | qWarning( "%s", error ); | 236 | qWarning( "%s", error ); |
237 | #endif | 237 | #endif |
238 | return address; | 238 | return address; |
239 | } | 239 | } |
240 | 240 | ||
241 | #endif // POSIX | 241 | #endif // POSIX |
242 | 242 | ||
243 | #endif // QT_NO_COMPONENT | 243 | #endif // QT_NO_COMPONENT |
diff --git a/library/timestring.cpp b/library/timestring.cpp index 91c29ae..afd162d 100644 --- a/library/timestring.cpp +++ b/library/timestring.cpp | |||
@@ -1,365 +1,466 @@ | |||
1 | /********************************************************************** | 1 | /********************************************************************** |
2 | ** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. | 2 | ** Copyright (C) 2000-2006 Trolltech AS. All rights reserved. |
3 | ** | 3 | ** |
4 | ** This file is part of the Qtopia Environment. | 4 | ** This file is part of the Qtopia Environment. |
5 | ** | 5 | ** |
6 | ** This file may be distributed and/or modified under the terms of the | 6 | ** This program is free software; you can redistribute it and/or modify it |
7 | ** GNU General Public License version 2 as published by the Free Software | 7 | ** under the terms of the GNU General Public License as published by the |
8 | ** Foundation and appearing in the file LICENSE.GPL included in the | 8 | ** Free Software Foundation; either version 2 of the License, or (at your |
9 | ** packaging of this file. | 9 | ** option) any later version. |
10 | ** | 10 | ** |
11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | 11 | ** A copy of the GNU GPL license version 2 is included in this package as |
12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | 12 | ** LICENSE.GPL. |
13 | ** | ||
14 | ** This program is distributed in the hope that it will be useful, but | ||
15 | ** WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
17 | ** See the GNU General Public License for more details. | ||
18 | ** | ||
19 | ** In addition, as a special exception Trolltech gives permission to link | ||
20 | ** the code of this program with Qtopia applications copyrighted, developed | ||
21 | ** and distributed by Trolltech under the terms of the Qtopia Personal Use | ||
22 | ** License Agreement. You must comply with the GNU General Public License | ||
23 | ** in all respects for all of the code used other than the applications | ||
24 | ** licensed under the Qtopia Personal Use License Agreement. If you modify | ||
25 | ** this file, you may extend this exception to your version of the file, | ||
26 | ** but you are not obligated to do so. If you do not wish to do so, delete | ||
27 | ** this exception statement from your version. | ||
13 | ** | 28 | ** |
14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
15 | ** | 30 | ** |
16 | ** Contact info@trolltech.com if any conditions of this licensing are | 31 | ** Contact info@trolltech.com if any conditions of this licensing are |
17 | ** not clear to you. | 32 | ** not clear to you. |
18 | ** | 33 | ** |
19 | **********************************************************************/ | 34 | **********************************************************************/ |
20 | 35 | ||
21 | #include "timestring.h" | 36 | #include "timestring.h" |
22 | #include <qobject.h> | 37 | #include <qobject.h> |
23 | #include <qpe/qpeapplication.h> //for qApp | 38 | #include <qdatetime.h> |
39 | #include <qapplication.h> | ||
24 | #include "config.h" | 40 | #include "config.h" |
25 | 41 | ||
42 | #include <time.h> | ||
43 | |||
26 | 44 | ||
27 | class TimeStringFormatKeeper : public QObject | 45 | class TimeStringFormat : public QObject |
28 | { | 46 | { |
29 | Q_OBJECT | 47 | Q_OBJECT |
30 | public: | 48 | public: |
31 | static DateFormat currentFormat() | 49 | static DateFormat currentFormat() |
32 | { | 50 | { |
33 | if ( !self ) | 51 | if ( !self ) |
34 | self = new TimeStringFormatKeeper; | 52 | self = new TimeStringFormat; |
35 | return self->format; | 53 | return self->format; |
36 | } | 54 | } |
37 | private slots: | 55 | private slots: |
38 | void formatChanged( DateFormat f ) | 56 | void formatChanged( DateFormat f ) |
39 | { | 57 | { |
40 | format = f; | 58 | format = f; |
41 | } | 59 | } |
42 | private: | 60 | private: |
43 | static TimeStringFormatKeeper *self; | 61 | static TimeStringFormat *self; |
44 | DateFormat format; | 62 | DateFormat format; |
45 | 63 | ||
46 | TimeStringFormatKeeper() | 64 | TimeStringFormat() |
47 | : QObject( qApp ) | 65 | : QObject( qApp ) |
48 | { | 66 | { |
49 | Config config("qpe"); | 67 | Config config("qpe"); |
50 | config.setGroup( "Date" ); | 68 | config.setGroup( "Date" ); |
51 | format = DateFormat(QChar(config.readEntry("Separator", "/")[0]), | 69 | format = ::DateFormat(QChar(config.readEntry("Separator", "/")[0]), |
52 | (DateFormat::Order)config .readNumEntry("ShortOrder", DateFormat::DayMonthYear), | 70 | (::DateFormat::Order)config.readNumEntry("ShortOrder", ::DateFormat::DayMonthYear), |
53 | (DateFormat::Order)config.readNumEntry("LongOrder", DateFormat::DayMonthYear)); | 71 | (::DateFormat::Order)config.readNumEntry("LongOrder", ::DateFormat::DayMonthYear)); |
54 | 72 | ||
55 | connect( qApp, SIGNAL( dateFormatChanged(DateFormat) ), | 73 | connect( qApp, SIGNAL( dateFormatChanged(DateFormat) ), |
56 | this, SLOT( formatChanged(DateFormat) ) ); | 74 | this, SLOT( formatChanged(DateFormat) ) ); |
57 | } | 75 | } |
58 | }; | 76 | }; |
59 | 77 | ||
60 | TimeStringFormatKeeper *TimeStringFormatKeeper::self = 0; | 78 | TimeStringFormat *TimeStringFormat::self = 0; |
61 | 79 | ||
62 | QString DateFormat::toNumberString() const | 80 | QString DateFormat::toNumberString() const |
63 | { | 81 | { |
64 | QString buf = ""; | 82 | QString buf = ""; |
65 | // for each part of the order | 83 | // for each part of the order |
66 | for (int i = 0; i < 3; i++) { | 84 | for (int i = 0; i < 3; i++) { |
67 | // switch on the relavent 3 bits. | 85 | // switch on the relavent 3 bits. |
68 | switch((_shortOrder >> (i * 3)) & 0x0007) { | 86 | switch((_shortOrder >> (i * 3)) & 0x0007) { |
69 | case 0x0001: | 87 | case 0x0001: |
70 | buf += QObject::tr( "D" , "Shortcut for Day"); | 88 | buf += TimeStringFormat::tr( "D", "first letter of the word 'Day'" ); |
71 | break; | 89 | break; |
72 | case 0x0002: | 90 | case 0x0002: |
73 | buf += QObject::tr( "M", "Shortcur for Month" ); | 91 | buf += TimeStringFormat::tr( "M" , "first letter of the word 'Month'" ); |
74 | break; | 92 | break; |
75 | case 0x0004: | 93 | case 0x0004: |
76 | buf += QObject::tr( "Y" ); | 94 | buf += TimeStringFormat::tr( "Y" , "first letter of the word 'Year'" ); |
77 | break; | 95 | break; |
78 | } | 96 | } |
79 | if (i < 2) | 97 | if (i < 2) |
80 | buf += _shortSeparator; | 98 | buf += _shortSeparator; |
81 | } | 99 | } |
82 | return buf; | 100 | return buf; |
83 | } | 101 | } |
84 | 102 | ||
85 | QString DateFormat::toWordString() const | 103 | QString DateFormat::toWordString() const |
86 | { | 104 | { |
87 | QString buf = ""; | 105 | QString buf = ""; |
88 | // for each part of the order | 106 | // for each part of the order |
89 | for (int i = 0; i < 3; i++) { | 107 | for (int i = 0; i < 3; i++) { |
90 | // switch on the relavent 3 bits. | 108 | // switch on the relavent 3 bits. |
91 | switch((_longOrder >> (i * 3)) & 0x0007) { | 109 | switch((_longOrder >> (i * 3)) & 0x0007) { |
92 | case 0x0001: | 110 | case 0x0001: |
93 | buf += QObject::tr( "day" ); | 111 | buf += TimeStringFormat::tr( "day", "in month" ); |
94 | if (i < 2) { | 112 | if (i < 2) { |
95 | if ((_shortOrder << ((i+1) * 3)) & 0x0007) | 113 | if ((_shortOrder << ((i+1) * 3)) & 0x0007) |
96 | buf += ", "; | 114 | buf += ", "; |
97 | else | 115 | else |
98 | buf += " "; | 116 | buf += " "; |
99 | } | 117 | } |
100 | break; | 118 | break; |
101 | case 0x0002: | 119 | case 0x0002: |
102 | buf += QObject::tr( "month" ); | 120 | buf += TimeStringFormat::tr( "month" ); |
103 | if (i < 2) | 121 | if (i < 2) |
104 | buf += " "; | 122 | buf += " "; |
105 | break; | 123 | break; |
106 | case 0x0004: | 124 | case 0x0004: |
107 | buf += QObject::tr( "year" ); | 125 | buf += TimeStringFormat::tr( "year" ); |
108 | if (i < 2) | 126 | if (i < 2) |
109 | buf += ", "; | 127 | buf += ", "; |
110 | break; | 128 | break; |
111 | } | 129 | } |
112 | } | 130 | } |
113 | return buf; | 131 | return buf; |
114 | } | 132 | } |
115 | 133 | ||
116 | QString DateFormat::numberDate(const QDate &d, int v) const | 134 | QString DateFormat::numberDate(const QDate &d, int v) const |
117 | { | 135 | { |
118 | QString buf = ""; | 136 | QString buf = ""; |
119 | 137 | ||
120 | int pad = 2; | 138 | int pad = 2; |
121 | 139 | ||
122 | // for each part of the order | 140 | // for each part of the order |
123 | for (int i = 0; i < 3; i++) { | 141 | for (int i = 0; i < 3; i++) { |
124 | // switch on the relavent 3 bits. | 142 | // switch on the relavent 3 bits. |
125 | switch((_shortOrder >> (i * 3)) & 0x0007) { | 143 | switch((_shortOrder >> (i * 3)) & 0x0007) { |
126 | case 0x0001: | 144 | case 0x0001: |
127 | if (pad==2) buf += QString().sprintf("%02d",d.day()); | 145 | if (pad==2) buf += QString().sprintf("%02d",d.day()); |
128 | else buf += QString().sprintf("%d",d.day()); | 146 | else buf += QString().sprintf("%d",d.day()); |
129 | break; | 147 | break; |
130 | case 0x0002: | 148 | case 0x0002: |
131 | if (i==0) { // no padding with only MM/DD/YY format | 149 | if (i==0) { // no padding with only MM/DD/YY format |
132 | pad=0; | 150 | pad=0; |
133 | } | 151 | } |
134 | if (pad==2) buf += QString().sprintf("%02d",d.month()); | 152 | if (pad==2) buf += QString().sprintf("%02d",d.month()); |
135 | else buf += QString().sprintf("%d",d.month()); | 153 | else buf += QString().sprintf("%d",d.month()); |
136 | break; | 154 | break; |
137 | case 0x0004: | 155 | case 0x0004: |
138 | { | 156 | { |
139 | int year = d.year(); | 157 | int year = d.year(); |
140 | if (!(v & longNumber)) | 158 | if (!(v & longNumber)) |
141 | year = year % 100; | 159 | year = year % 100; |
142 | buf += QString().sprintf("%02d",year); | 160 | buf += QString().sprintf("%02d",year); |
143 | } | 161 | } |
144 | break; | 162 | break; |
145 | } | 163 | } |
146 | if (i < 2) | 164 | if (i < 2) |
147 | buf += _shortSeparator; | 165 | buf += _shortSeparator; |
148 | } | 166 | } |
149 | return buf; | 167 | return buf; |
150 | } | 168 | } |
151 | 169 | ||
170 | static const char* unTranslatedFullMonthNames[] = { | ||
171 | QT_TRANSLATE_NOOP( "QDate", "January" ), | ||
172 | QT_TRANSLATE_NOOP( "QDate", "February" ), | ||
173 | QT_TRANSLATE_NOOP( "QDate", "March" ), | ||
174 | QT_TRANSLATE_NOOP( "QDate", "April" ), | ||
175 | QT_TRANSLATE_NOOP( "QDate", "May" ), | ||
176 | QT_TRANSLATE_NOOP( "QDate", "June" ), | ||
177 | QT_TRANSLATE_NOOP( "QDate", "July" ), | ||
178 | QT_TRANSLATE_NOOP( "QDate", "August" ), | ||
179 | QT_TRANSLATE_NOOP( "QDate", "September" ), | ||
180 | QT_TRANSLATE_NOOP( "QDate", "October" ), | ||
181 | QT_TRANSLATE_NOOP( "QDate", "November" ), | ||
182 | QT_TRANSLATE_NOOP( "QDate", "December" ) | ||
183 | }; | ||
184 | |||
185 | static const char* unTranslatedFullDayNames[] = { | ||
186 | QT_TRANSLATE_NOOP( "QDate", "Monday" ), | ||
187 | QT_TRANSLATE_NOOP( "QDate", "Tuesday" ), | ||
188 | QT_TRANSLATE_NOOP( "QDate", "Wednesday" ), | ||
189 | QT_TRANSLATE_NOOP( "QDate", "Thursday" ), | ||
190 | QT_TRANSLATE_NOOP( "QDate", "Friday" ), | ||
191 | QT_TRANSLATE_NOOP( "QDate", "Saturday" ), | ||
192 | QT_TRANSLATE_NOOP( "QDate", "Sunday" ) | ||
193 | }; | ||
194 | |||
195 | #ifdef QTOPIA_DESKTOP | ||
196 | //translations in qt.qm | ||
197 | static const char* unTranslatedMediumDayNames[] = { | ||
198 | "Mon" , "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" | ||
199 | }; | ||
200 | |||
201 | static const char* unTranslatedMediumMonthNames[] = { | ||
202 | "Jan", "Feb", "Mar", "Apr", "May", "Jun", | ||
203 | "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" | ||
204 | }; | ||
205 | #endif | ||
206 | |||
207 | static QString dayname(const QDate& d, bool lng) | ||
208 | { | ||
209 | if (lng && qApp) | ||
210 | return qApp->translate("QDate", unTranslatedFullDayNames[d.dayOfWeek()-1]); | ||
211 | else { | ||
212 | #ifdef QTOPIA_DESKTOP | ||
213 | if (qApp) | ||
214 | return qApp->translate("QDate", unTranslatedMediumDayNames[ d.dayOfWeek()-1]); | ||
215 | #endif | ||
216 | return d.dayName(d.dayOfWeek()); | ||
217 | } | ||
218 | } | ||
219 | |||
152 | QString DateFormat::wordDate(const QDate &d, int v) const | 220 | QString DateFormat::wordDate(const QDate &d, int v) const |
153 | { | 221 | { |
154 | QString buf = ""; | ||
155 | // for each part of the order | 222 | // for each part of the order |
156 | if (v & showWeekDay) { | 223 | QString weekDay; |
157 | QString weekDay = d.dayName(d.dayOfWeek()); | 224 | if (v & showWeekDay) |
158 | if (!(v & longWord)) { | 225 | weekDay = ::dayname(d,(v & longWord)); |
159 | weekDay = weekDay.left(3); | ||
160 | } | ||
161 | buf += weekDay; | ||
162 | if ((_longOrder & 0x0007) == 0x0002) | ||
163 | buf += ' '; | ||
164 | else | ||
165 | buf += ", "; | ||
166 | } | ||
167 | 226 | ||
227 | QString date=""; | ||
228 | QString sep=""; | ||
168 | for (int i = 0; i < 3; i++) { | 229 | for (int i = 0; i < 3; i++) { |
169 | // switch on the relavent 3 bits. | 230 | // switch on the relavent 3 bits. |
170 | switch((_longOrder >> (i * 3)) & 0x0007) { | 231 | int field = (_longOrder >> (i * 3)) & 0x0007; |
171 | case 0x0001: | 232 | if ( field && !date.isEmpty() ) |
172 | if (i==1) { | 233 | date += sep; |
173 | buf += QString().sprintf("%02d, ",d.day()); | 234 | switch (field) { |
174 | } else { | 235 | case 0x0001: // Day |
175 | buf += QString().sprintf("%2d",d.day()); | 236 | { |
176 | if (separator()=='.') // 2002/1/11 | 237 | QString daysuffix = TimeStringFormat::tr("@day", "day suffix - applies to some asian languages (e.g. Japanese and Trad. Chinese). If it doesn't apply to your language it has to be translated to an '@day' " ); |
177 | buf += ". "; | 238 | if (i==1) { |
178 | else | 239 | date += QString().sprintf("%02d",d.day()); |
179 | buf += " "; | 240 | if (daysuffix != "@day") |
180 | } | 241 | date+=daysuffix; |
242 | sep = TimeStringFormat::tr(",","day-date separator") + " "; | ||
243 | } else { | ||
244 | date += QString().sprintf("%2d",d.day()); | ||
245 | if (daysuffix == "@day") { | ||
246 | if (separator()=='.') // 2002/1/11 | ||
247 | sep = ". "; | ||
248 | else | ||
249 | sep = " "; | ||
250 | } else { | ||
251 | date += daysuffix+" "; | ||
252 | sep = " "; | ||
253 | } | ||
254 | } | ||
255 | } | ||
181 | break; | 256 | break; |
182 | case 0x0002: | 257 | case 0x0002: // Month |
183 | { | 258 | { |
184 | QString monthName = d.monthName(d.month()); | 259 | QString monthName; |
185 | if (!(v & longWord)) { | 260 | |
186 | monthName = monthName.left(3); | 261 | if (v & longWord) |
187 | } | 262 | monthName = qApp->translate("QDate", unTranslatedFullMonthNames[d.month()-1] ); |
188 | buf += monthName; | 263 | else { |
264 | #ifdef QTOPIA_DESKTOP | ||
265 | monthName = qApp->translate("QDate", unTranslatedMediumMonthNames[d.month()-1] ); | ||
266 | #else | ||
267 | monthName = d.monthName( d.month() ); | ||
268 | #endif | ||
269 | } | ||
270 | date += monthName; | ||
189 | } | 271 | } |
190 | if (i < 2) | 272 | sep = " ";//TimeStringFormat::tr(" ","month-date separator"); |
191 | buf += " "; | ||
192 | break; | 273 | break; |
193 | case 0x0004: | 274 | case 0x0004: // Year |
194 | { | 275 | { |
195 | int year = d.year(); | 276 | int year = d.year(); |
196 | if (!(v & longNumber)) | 277 | if (!(v & longNumber)) |
197 | year = year % 100; | 278 | year = year % 100; |
198 | 279 | ||
199 | if (year < 10) | 280 | if (year < 10) |
200 | buf += "0"; | 281 | date += "0"; |
282 | |||
283 | date += QString::number(year); | ||
284 | QString yearsuffix = TimeStringFormat::tr("@year", "year suffix - applies to some asian languages (e.g. Japanese and Trad. Chinese). If it doesn't apply to your language it has to be translated to an '@year' " ); | ||
285 | if (yearsuffix != "@year") | ||
286 | date += yearsuffix; | ||
201 | 287 | ||
202 | buf += QString::number(year); | ||
203 | } | 288 | } |
204 | if (i < 2) | 289 | sep = TimeStringFormat::tr(",","year-date seperator") + " "; |
205 | buf += ", "; | ||
206 | break; | 290 | break; |
207 | } | 291 | } |
208 | } | 292 | } |
209 | return buf; | 293 | |
294 | QString r = ""; | ||
295 | if ( weekDay.isEmpty() ) | ||
296 | r = date; | ||
297 | else if ((_longOrder & 0x0007) == 0x0002) | ||
298 | r = TimeStringFormat::tr("%1 %2","1=Monday 2=January 12").arg(weekDay).arg(date); | ||
299 | else if ( _longOrder ) | ||
300 | r = TimeStringFormat::tr("%1, %2","1=Monday 2=12 January").arg(weekDay).arg(date); | ||
301 | else | ||
302 | r = weekDay; | ||
303 | return r; | ||
210 | } | 304 | } |
211 | 305 | ||
212 | #ifndef QT_NO_DATASTREAM | 306 | #ifndef QT_NO_DATASTREAM |
213 | void DateFormat::save(QDataStream &d) const | 307 | void DateFormat::save(QDataStream &d) const |
214 | { | 308 | { |
215 | d << _shortSeparator.unicode(); | 309 | d << _shortSeparator.unicode(); |
216 | uint v= _shortOrder; | 310 | uint v= _shortOrder; |
217 | d << v; | 311 | d << v; |
218 | v = _longOrder; | 312 | v = _longOrder; |
219 | d << v; | 313 | d << v; |
220 | } | 314 | } |
221 | 315 | ||
222 | void DateFormat::load(QDataStream &d) | 316 | void DateFormat::load(QDataStream &d) |
223 | { | 317 | { |
224 | ushort value; | 318 | ushort value; |
225 | d >> value; | 319 | d >> value; |
226 | _shortSeparator = QChar(value); | 320 | _shortSeparator = QChar(value); |
227 | uint v = 0; | 321 | uint v = 0; |
228 | d >> v; | 322 | d >> v; |
229 | _shortOrder = (Order)v; | 323 | _shortOrder = (Order)v; |
230 | v = 0; | 324 | v = 0; |
231 | d >> v; | 325 | d >> v; |
232 | _longOrder = (Order)v; | 326 | _longOrder = (Order)v; |
233 | } | 327 | } |
234 | 328 | ||
235 | QDataStream &operator<<(QDataStream &s, const DateFormat&df) | 329 | QDataStream &operator<<(QDataStream &s, const DateFormat&df) |
236 | { | 330 | { |
237 | df.save(s); | 331 | df.save(s); |
238 | return s; | 332 | return s; |
239 | } | 333 | } |
240 | QDataStream &operator>>(QDataStream &s, DateFormat&df) | 334 | QDataStream &operator>>(QDataStream &s, DateFormat&df) |
241 | { | 335 | { |
242 | df.load(s); | 336 | df.load(s); |
243 | return s; | 337 | return s; |
244 | } | 338 | } |
245 | #endif | 339 | #endif |
246 | 340 | ||
247 | QString TimeString::shortDate( const QDate &d, DateFormat dtf ) | 341 | QString TimeString::shortDate( const QDate &d, DateFormat dtf ) |
248 | { | 342 | { |
249 | return dtf.wordDate(d); | 343 | return dtf.wordDate(d); |
250 | } | 344 | } |
251 | 345 | ||
252 | QString TimeString::dateString( const QDate &d, DateFormat dtf ) | 346 | QString TimeString::dateString( const QDate &d, DateFormat dtf ) |
253 | { | 347 | { |
254 | return QObject::tr( dtf.wordDate(d, DateFormat::longNumber | DateFormat::longWord) ); | 348 | return dtf.wordDate(d, DateFormat::longNumber); |
255 | } | 349 | } |
256 | 350 | ||
257 | 351 | ||
258 | QString TimeString::longDateString( const QDate &d, DateFormat dtf ) | 352 | QString TimeString::longDateString( const QDate &d, DateFormat dtf ) |
259 | { | 353 | { |
260 | return QObject::tr( dtf.wordDate(d, DateFormat::showWeekDay | DateFormat::longNumber | 354 | return dtf.wordDate(d, DateFormat::showWeekDay | DateFormat::longNumber |
261 | | DateFormat::longWord) ); | 355 | | DateFormat::longWord); |
262 | } | 356 | } |
263 | 357 | ||
264 | DateFormat TimeString::currentDateFormat() | 358 | DateFormat TimeString::currentDateFormat() |
265 | { | 359 | { |
266 | return TimeStringFormatKeeper::currentFormat(); | 360 | return TimeStringFormat::currentFormat(); |
267 | } | 361 | } |
268 | 362 | ||
269 | 363 | ||
270 | QString TimeString::dateString( const QDateTime &dt, bool ampm, bool seconds, DateFormat dtf ) | 364 | QString TimeString::dateString( const QDateTime &dt, bool ampm, bool seconds, DateFormat dtf ) |
271 | { | 365 | { |
272 | const QDate& d = dt.date(); | 366 | const QDate& d = dt.date(); |
273 | const QTime& t = dt.time(); | 367 | const QTime& t = dt.time(); |
274 | 368 | ||
275 | // based on QDateTime::toString() | 369 | // based on QDateTime::toString() |
276 | QString buf = timeString(t,ampm,seconds); | 370 | QString buf = timeString(t,ampm,seconds); |
277 | buf += " "; | 371 | buf += " "; |
278 | buf += longDateString( d, dtf ); | 372 | buf += longDateString( d, dtf ); |
279 | 373 | ||
280 | return buf; | 374 | return buf; |
281 | } | 375 | } |
282 | 376 | ||
283 | QString TimeString::timeString( const QTime &t, bool ampm, bool seconds ) | 377 | QString TimeString::timeString( const QTime &t, bool ampm, bool seconds ) |
284 | { | 378 | { |
285 | if ( !ampm ) { | 379 | if ( !ampm ) { |
286 | if ( seconds ) | 380 | if ( seconds ) |
287 | return t.toString(); | 381 | return t.toString(); |
288 | QString r = QString::number(t.hour()); | 382 | QString r = QString::number(t.hour()); |
289 | if ( t.hour() < 10 ) r.prepend( "0" ); | 383 | if ( t.hour() < 10 ) r.prepend( "0" ); |
290 | r.append( ":" ); | 384 | r.append( ":" ); |
291 | if ( t.minute() < 10 ) r.append( "0" ); | 385 | if ( t.minute() < 10 ) r.append( "0" ); |
292 | r.append(QString::number(t.minute())); | 386 | r.append(QString::number(t.minute())); |
293 | return r; | 387 | return r; |
294 | } | 388 | } |
295 | // ### else the hard case that should disappear in Qt 3.0 | 389 | // ### else the hard case that should disappear in Qt 3.0 |
296 | QString argString = seconds ? "%4:%5:%6 %7" : "%4:%5 %7"; | 390 | QString argString = seconds ? "%4:%5:%6 %7" : "%4:%5 %7"; |
297 | int hour = t.hour(); | 391 | int hour = t.hour(); |
298 | QString strMin = QString::number( t.minute() ); | 392 | QString strMin = QString::number( t.minute() ); |
299 | QString strSec = QString::number( t.second() ); | 393 | QString strSec = QString::number( t.second() ); |
300 | if ( hour > 12 ) | 394 | if ( hour > 12 ) |
301 | argString = argString.arg( hour - 12, 2 ); | 395 | argString = argString.arg( hour - 12, 2 ); |
302 | else { | 396 | else { |
303 | if ( hour == 0 ) | 397 | if ( hour == 0 ) |
304 | argString = argString.arg( 12 ); | 398 | argString = argString.arg( 12 ); |
305 | else | 399 | else |
306 | argString = argString.arg( hour, 2 ); | 400 | argString = argString.arg( hour, 2 ); |
307 | } | 401 | } |
308 | if ( t.minute() < 10 ) | 402 | if ( t.minute() < 10 ) |
309 | strMin.prepend( "0" ); | 403 | strMin.prepend( "0" ); |
310 | if ( t.second() < 10 ) | 404 | if ( t.second() < 10 ) |
311 | strSec.prepend( "0" ); | 405 | strSec.prepend( "0" ); |
312 | argString = argString.arg( strMin ); | 406 | argString = argString.arg( strMin ); |
313 | if ( seconds ) | 407 | if ( seconds ) |
314 | argString = argString.arg( strSec ); | 408 | argString = argString.arg( strSec ); |
315 | if ( hour >= 12 ) | 409 | if ( hour >= 12 ) |
316 | argString = argString.arg( QObject::tr("PM") ); | 410 | argString = argString.arg( TimeStringFormat::tr("PM") ); |
317 | else | 411 | else |
318 | argString = argString.arg( QObject::tr("AM") ); | 412 | argString = argString.arg( TimeStringFormat::tr("AM") ); |
319 | return argString; | 413 | return argString; |
320 | } | 414 | } |
321 | 415 | ||
322 | QString TimeString::shortTime( bool ampm, bool seconds ) | 416 | QString TimeString::shortTime( bool ampm, bool seconds ) |
323 | { | 417 | { |
324 | static const char* const day[] = { | ||
325 | QT_TRANSLATE_NOOP( "QObject", "Mon" ), | ||
326 | QT_TRANSLATE_NOOP( "QObject", "Tue" ), | ||
327 | QT_TRANSLATE_NOOP( "QObject", "Wed" ), | ||
328 | QT_TRANSLATE_NOOP( "QObject", "Thu" ), | ||
329 | QT_TRANSLATE_NOOP( "QObject", "Fri" ), | ||
330 | QT_TRANSLATE_NOOP( "QObject", "Sat" ), | ||
331 | QT_TRANSLATE_NOOP( "QObject", "Sun" ) | ||
332 | }; | ||
333 | // just create a shorter time String | 418 | // just create a shorter time String |
334 | QDateTime dtTmp = QDateTime::currentDateTime(); | 419 | QDateTime dtTmp = QDateTime::currentDateTime(); |
335 | QString strTime; | 420 | QString strTime = TimeStringFormat::tr( "%1 %2", "1=Monday 2=12:45" ) |
336 | strTime = QObject::tr( day[dtTmp.date().dayOfWeek()-1] ) + " " + | 421 | .arg(::dayname(dtTmp.date(),FALSE)) |
337 | timeString( dtTmp.time(), ampm, seconds ); | 422 | .arg(timeString( dtTmp.time(), ampm, seconds )); |
338 | return strTime; | 423 | return strTime; |
339 | } | 424 | } |
340 | 425 | ||
341 | QString TimeString::dateString( const QDateTime &t, bool ampm ) | 426 | QString TimeString::dateString( const QDateTime &t, bool ampm ) |
342 | { | 427 | { |
343 | return dateString(t,ampm,FALSE); | 428 | return dateString(t,ampm,FALSE); |
344 | } | 429 | } |
345 | 430 | ||
346 | QString TimeString::timeString( const QTime &t, bool ampm) | 431 | QString TimeString::timeString( const QTime &t, bool ampm) |
347 | { | 432 | { |
348 | return timeString(t,ampm,FALSE); | 433 | return timeString(t,ampm,FALSE); |
349 | } | 434 | } |
350 | 435 | ||
351 | QString TimeString::shortTime( bool ampm ) | 436 | QString TimeString::shortTime( bool ampm ) |
352 | { | 437 | { |
353 | return shortTime(ampm,FALSE); | 438 | return shortTime(ampm,FALSE); |
354 | } | 439 | } |
355 | 440 | ||
356 | QString TimeString::numberDateString( const QDate &d, DateFormat dtf ) | 441 | QString TimeString::numberDateString( const QDate &d, DateFormat dtf ) |
357 | { | 442 | { |
358 | return dtf.numberDate(d); | 443 | return dtf.numberDate(d); |
359 | } | 444 | } |
360 | QString TimeString::longNumberDateString( const QDate &d, DateFormat dtf ) | 445 | QString TimeString::longNumberDateString( const QDate &d, DateFormat dtf ) |
361 | { | 446 | { |
362 | return dtf.numberDate(d,DateFormat::longNumber); | 447 | return dtf.numberDate(d,DateFormat::longNumber); |
363 | } | 448 | } |
449 | /*! | ||
450 | Returns date/time \a dt as a string, | ||
451 | showing year, month, date, hours, minutes, and seconds. | ||
452 | \a len determines the length of the resulting string. | ||
453 | |||
454 | The format, including order depends on the user's settings. | ||
455 | |||
456 | First availability: Qtopia 1.6 | ||
457 | */ | ||
458 | //QString TimeString::localYMDHMS( const QDateTime &dt, Length len ) | ||
459 | //{ | ||
460 | // const QDate& d = dt.date(); | ||
461 | // const QTime& t = dt.time(); | ||
462 | // return LocalTimeFormat::tr("%1 %2","date,time").arg(localYMD(d,len)).arg(localHMS(t)); | ||
463 | //} | ||
464 | |||
364 | 465 | ||
365 | #include "timestring.moc" | 466 | #include "timestring.moc" |
diff --git a/library/timestring.h b/library/timestring.h index 875c8bf..b8d1aea 100644 --- a/library/timestring.h +++ b/library/timestring.h | |||
@@ -1,150 +1,182 @@ | |||
1 | /********************************************************************** | 1 | /********************************************************************** |
2 | ** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. | 2 | ** Copyright (C) 2000-2006 Trolltech AS. All rights reserved. |
3 | ** | 3 | ** |
4 | ** This file is part of the Qtopia Environment. | 4 | ** This file is part of the Qtopia Environment. |
5 | ** | ||
6 | ** This program is free software; you can redistribute it and/or modify it | ||
7 | ** under the terms of the GNU General Public License as published by the | ||
8 | ** Free Software Foundation; either version 2 of the License, or (at your | ||
9 | ** option) any later version. | ||
10 | ** | ||
11 | ** A copy of the GNU GPL license version 2 is included in this package as | ||
12 | ** LICENSE.GPL. | ||
5 | ** | 13 | ** |
6 | ** This file may be distributed and/or modified under the terms of the | 14 | ** This program is distributed in the hope that it will be useful, but |
7 | ** GNU General Public License version 2 as published by the Free Software | 15 | ** WITHOUT ANY WARRANTY; without even the implied warranty of |
8 | ** Foundation and appearing in the file LICENSE.GPL included in the | 16 | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
9 | ** packaging of this file. | 17 | ** See the GNU General Public License for more details. |
10 | ** | ||
11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | ||
12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | ||
13 | ** | 18 | ** |
19 | ** In addition, as a special exception Trolltech gives permission to link | ||
20 | ** the code of this program with Qtopia applications copyrighted, developed | ||
21 | ** and distributed by Trolltech under the terms of the Qtopia Personal Use | ||
22 | ** License Agreement. You must comply with the GNU General Public License | ||
23 | ** in all respects for all of the code used other than the applications | ||
24 | ** licensed under the Qtopia Personal Use License Agreement. If you modify | ||
25 | ** this file, you may extend this exception to your version of the file, | ||
26 | ** but you are not obligated to do so. If you do not wish to do so, delete | ||
27 | ** this exception statement from your version. | ||
28 | ** | ||
14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 29 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
15 | ** | 30 | ** |
16 | ** Contact info@trolltech.com if any conditions of this licensing are | 31 | ** Contact info@trolltech.com if any conditions of this licensing are |
17 | ** not clear to you. | 32 | ** not clear to you. |
18 | ** | 33 | ** |
19 | **********************************************************************/ | 34 | **********************************************************************/ |
20 | 35 | ||
21 | #ifndef _TIMESTRING_H_ | 36 | #ifndef _TIMESTRING_H_ |
22 | #define _TIMESTRING_H_ | 37 | #define _TIMESTRING_H_ |
23 | #include <qdatetime.h> | 38 | #include <qdatetime.h> |
24 | #include <qstring.h> | 39 | #include <qstring.h> |
40 | #include <qarray.h> | ||
25 | 41 | ||
26 | #if (QT_VERSION-0 >= 0x030000) | 42 | #if (QT_VERSION-0 >= 0x030000) |
27 | #define DateFormat QPEDateFormat | 43 | #define DateFormat QPEDateFormat |
28 | #endif | 44 | #endif |
29 | 45 | ||
46 | #include <qtopia/qpeglobal.h> | ||
47 | |||
48 | class QObject; | ||
49 | |||
30 | // return a string with the time based on whether or not you want | 50 | // return a string with the time based on whether or not you want |
31 | // you want it in 12 hour form. if ampm is true, then return | 51 | // you want it in 12 hour form. if ampm is true, then return |
32 | // it in 12 hour (am/pm) form otherwise return it in 24 hour form | 52 | // it in 12 hour (am/pm) form otherwise return it in 24 hour form |
33 | // in theory Qt 3,0 handles this better (hopefully obsoleteing this) | 53 | // in theory Qt 3,0 handles this better (hopefully obsoleteing this) |
34 | class DateFormat | 54 | class DateFormat |
35 | { | 55 | { |
36 | public: | 56 | public: |
37 | // date format type 001,010,100 = day month year | 57 | // date format type 1,2,4 = day,month,year |
38 | enum Order { | 58 | enum Order { |
39 | DayMonthYear = 0x0111, // 0x001 + 0x010(0x2 << 3) + 0x100(0x4 << 3) | 59 | DayMonthYear = 0421, // right-to-left |
40 | MonthDayYear = 0x010A, | 60 | MonthDayYear = 0412, |
41 | YearMonthDay = 0x0054 | 61 | YearMonthDay = 0124 |
42 | }; | 62 | }; |
43 | 63 | ||
44 | DateFormat(QChar s = '/', Order so = MonthDayYear) : _shortOrder(so), | 64 | DateFormat(QChar s = '/', Order so = MonthDayYear) : _shortOrder(so), |
45 | _longOrder(so), _shortSeparator(s) { } | 65 | _longOrder(so), _shortSeparator(s) { } |
46 | DateFormat(QChar s, Order so, Order lo) : _shortOrder(so), | 66 | DateFormat(QChar s, Order so, Order lo) : _shortOrder(so), |
47 | _longOrder(lo), _shortSeparator(s) { } | 67 | _longOrder(lo), _shortSeparator(s) { } |
48 | DateFormat(const DateFormat &o) : _shortOrder(o._shortOrder), | 68 | DateFormat(const DateFormat &o) : _shortOrder(o._shortOrder), |
49 | _longOrder(o._longOrder), _shortSeparator(o._shortSeparator) { } | 69 | _longOrder(o._longOrder), _shortSeparator(o._shortSeparator) { } |
50 | 70 | ||
51 | bool operator==(const DateFormat &o) | 71 | bool operator==(const DateFormat &o) |
52 | { | 72 | { |
53 | if (o._shortOrder == _shortOrder && o._longOrder == _longOrder && | 73 | if (o._shortOrder == _shortOrder && o._longOrder == _longOrder && |
54 | o._shortSeparator == _shortSeparator) | 74 | o._shortSeparator == _shortSeparator) |
55 | return TRUE; | 75 | return TRUE; |
56 | return FALSE; | 76 | return FALSE; |
57 | } | 77 | } |
58 | 78 | ||
59 | // verbosity specifiers | 79 | // verbosity specifiers |
60 | enum Verbosity { | 80 | enum Verbosity { |
61 | shortNumber = 0x01, // default | 81 | shortNumber = 0x01, // default |
62 | longNumber = 0x02, | 82 | longNumber = 0x02, |
63 | 83 | ||
64 | padNumber = 0x04, | 84 | padNumber = 0x04, |
65 | 85 | ||
66 | shortWord = 0x08, // default | 86 | shortWord = 0x08, // default |
67 | longWord = 0x10, | 87 | longWord = 0x10, |
68 | 88 | ||
69 | showWeekDay = 0x20 | 89 | showWeekDay = 0x20 |
70 | }; | 90 | }; |
71 | 91 | ||
72 | QString toNumberString() const; // the M/D/Y string. | 92 | QString toNumberString() const; // the M/D/Y string. |
73 | QString toWordString() const; // the Month day, year string. | 93 | QString toWordString() const; // the Month day, year string. |
74 | 94 | ||
75 | QString numberDate(const QDate &d, int v = 0) const; | 95 | QString numberDate(const QDate &d, int v = 0) const; |
76 | QString wordDate(const QDate &d, int v = 0) const; | 96 | QString wordDate(const QDate &d, int v = 0) const; |
77 | 97 | ||
78 | #ifndef QT_NO_DATASTREAM | 98 | #ifndef QT_NO_DATASTREAM |
79 | void load(QDataStream&); | 99 | void load(QDataStream&); |
80 | void save(QDataStream&) const; | 100 | void save(QDataStream&) const; |
81 | #endif | 101 | #endif |
82 | 102 | ||
83 | QChar separator() const { return _shortSeparator; }; | 103 | QChar separator() const { return _shortSeparator; }; |
84 | Order shortOrder() const { return _shortOrder; }; | 104 | Order shortOrder() const { return _shortOrder; }; |
85 | Order longOrder() const { return _longOrder; }; | 105 | Order longOrder() const { return _longOrder; }; |
86 | 106 | ||
87 | private: | 107 | private: |
88 | Order _shortOrder; | 108 | Order _shortOrder; |
89 | Order _longOrder; | 109 | Order _longOrder; |
90 | QChar _shortSeparator; | 110 | QChar _shortSeparator; |
91 | }; | 111 | }; |
92 | 112 | ||
93 | #ifndef QT_NO_DATASTREAM | 113 | #ifndef QT_NO_DATASTREAM |
94 | QDataStream &operator<<(QDataStream &s, const DateFormat&df); | 114 | QDataStream &operator<<(QDataStream &s, const DateFormat&df); |
95 | QDataStream &operator>>(QDataStream &s, DateFormat&df); | 115 | QDataStream &operator>>(QDataStream &s, DateFormat&df); |
96 | #endif | 116 | #endif |
97 | 117 | ||
98 | class TimeString | 118 | class TimeString |
99 | { | 119 | { |
100 | public: | 120 | public: |
101 | 121 | ||
102 | //enum DateFormat { MonthDayYear, DayMonthYear, ISO8601, | 122 | //enum DateFormat { MonthDayYear, DayMonthYear, ISO8601, |
103 | //YearMonthDay = ISO8601 }; | 123 | //YearMonthDay = ISO8601 }; |
104 | 124 | ||
105 | /** | 125 | |
106 | * @name Convience functions which use currentDateFormat | 126 | //private: |
107 | */ | 127 | static QString shortDate( const QDate &d ) |
108 | //@{ | ||
109 | static QString shortDate( const QDate &d ) | ||
110 | { return shortDate( d, currentDateFormat() ); } | 128 | { return shortDate( d, currentDateFormat() ); } |
111 | static QString dateString( const QDate &d ) | 129 | static QString dateString( const QDate &d ) |
112 | { return dateString( d, currentDateFormat() ); } | 130 | { return dateString( d, currentDateFormat() ); } |
113 | static QString longDateString( const QDate &d ) | 131 | static QString longDateString( const QDate &d ) |
114 | { return longDateString( d, currentDateFormat() ); } | 132 | { return longDateString( d, currentDateFormat() ); } |
115 | //@} | ||
116 | static QString dateString( const QDateTime &dt, bool ampm, bool seconds ) | 133 | static QString dateString( const QDateTime &dt, bool ampm, bool seconds ) |
117 | { return dateString( dt, ampm, seconds, currentDateFormat() ); } | 134 | { return dateString( dt, ampm, seconds, currentDateFormat() ); } |
118 | 135 | ||
136 | public: | ||
137 | enum Length { Short, Medium, Long }; | ||
138 | static QString localH( int hour ); | ||
139 | static QString localHM( const QTime & ); | ||
140 | static QString localHM( const QTime &, Length ); // qtopia 2.1.0 | ||
141 | static QString localHMS( const QTime & ); | ||
142 | static QString localHMDayOfWeek( const QDateTime &t ); | ||
143 | static QString localHMSDayOfWeek( const QDateTime &t ); | ||
144 | static QString localMD( const QDate &, Length=Medium ); | ||
145 | static QString localYMD( const QDate &, Length=Medium ); | ||
146 | static QString localYMDHMS( const QDateTime &, Length=Medium ); | ||
147 | static QString localDayOfWeek( const QDate&, Length=Medium ); | ||
148 | static QString localDayOfWeek( int day1to7, Length=Medium ); | ||
149 | |||
150 | static QString hourString( int hour, bool ampm ); | ||
151 | static bool currentAMPM(); | ||
152 | static DateFormat currentDateFormat(); | ||
153 | static QArray<DateFormat> formatOptions(); // qtopia 1.6.0 | ||
154 | |||
155 | static void connectChange(QObject*,const char* member); | ||
156 | static void disconnectChange(QObject*,const char* member); | ||
119 | 157 | ||
120 | /** @name Do not use as they don't honor system settings for AMPM | 158 | // Not recommended to call these (they don't honor system ampm) |
121 | * | 159 | static QString dateString( const QDateTime &t, bool ampm ); |
122 | */ | ||
123 | //@{ | ||
124 | static QString dateString( const QDateTime &t, bool ampm = false ); | ||
125 | static QString timeString( const QTime &t, bool ampm, bool seconds ); | 160 | static QString timeString( const QTime &t, bool ampm, bool seconds ); |
126 | static QString timeString( const QTime &t, bool ampm = false ); | 161 | static QString timeString( const QTime &t, bool ampm ); |
127 | static QString shortTime( bool ampm, bool seconds ); | 162 | static QString shortTime( bool ampm, bool seconds ); |
128 | static QString shortTime( bool ampm = false ); | 163 | static QString shortTime( bool ampm ); |
129 | //@} | ||
130 | 164 | ||
131 | static QString numberDateString( const QDate &d, DateFormat ); | 165 | static QString numberDateString( const QDate &d, DateFormat ); |
132 | static QString numberDateString( const QDate &d ) | 166 | static QString numberDateString( const QDate &d ) |
133 | { return numberDateString( d, currentDateFormat() ); } | 167 | { return numberDateString( d, currentDateFormat() ); } |
134 | static QString longNumberDateString( const QDate &d, DateFormat ); | 168 | static QString longNumberDateString( const QDate &d, DateFormat ); |
135 | static QString longNumberDateString( const QDate &d ) | 169 | static QString longNumberDateString( const QDate &d ) |
136 | { return longNumberDateString( d, currentDateFormat() ); } | 170 | { return longNumberDateString( d, currentDateFormat() ); } |
137 | 171 | ||
138 | static QString shortDate( const QDate &, DateFormat ); | 172 | static QString shortDate( const QDate &, DateFormat ); |
139 | static QString dateString( const QDate &, DateFormat ); | 173 | static QString dateString( const QDate &, DateFormat ); |
140 | static QString longDateString( const QDate &, DateFormat ); | 174 | static QString longDateString( const QDate &, DateFormat ); |
141 | 175 | ||
142 | static DateFormat currentDateFormat(); | ||
143 | |||
144 | private: | 176 | private: |
145 | static QString dateString( const QDateTime &t, bool ampm, bool seconds, DateFormat ); | 177 | static QString dateString( const QDateTime &t, bool ampm, bool seconds, DateFormat ); |
146 | 178 | ||
147 | 179 | ||
148 | }; | 180 | }; |
149 | 181 | ||
150 | #endif | 182 | #endif |