-rw-r--r-- | library/alarmserver.cpp | 5 | ||||
-rw-r--r-- | library/applnk.cpp | 4 | ||||
-rw-r--r-- | library/categoryedit_p.cpp | 3 | ||||
-rw-r--r-- | library/categorymenu.cpp | 2 | ||||
-rw-r--r-- | library/config.cpp | 2 | ||||
-rw-r--r-- | library/datebookdb.cpp | 5 | ||||
-rw-r--r-- | library/datebookmonth.cpp | 5 | ||||
-rw-r--r-- | library/filemanager.cpp | 3 | ||||
-rw-r--r-- | library/fileselector.cpp | 2 | ||||
-rw-r--r-- | library/finddialog.cpp | 1 | ||||
-rw-r--r-- | library/findwidget_p.cpp | 6 | ||||
-rw-r--r-- | library/fontdatabase.cpp | 2 | ||||
-rw-r--r-- | library/global.cpp | 2 | ||||
-rw-r--r-- | library/imageedit.cpp | 1 | ||||
-rw-r--r-- | library/ir.cpp | 2 | ||||
-rw-r--r-- | library/lnkproperties.cpp | 3 | ||||
-rw-r--r-- | library/mimetype.cpp | 4 | ||||
-rw-r--r-- | library/qcopenvelope_qws.cpp | 2 | ||||
-rw-r--r-- | library/qdawg.cpp | 2 | ||||
-rw-r--r-- | library/qpeapplication.cpp | 1 | ||||
-rw-r--r-- | library/qpemenubar.cpp | 1 | ||||
-rw-r--r-- | library/qpestyle.cpp | 3 | ||||
-rw-r--r-- | library/qpetoolbar.cpp | 2 | ||||
-rw-r--r-- | library/qt_override.cpp | 2 | ||||
-rw-r--r-- | library/resource.cpp | 3 | ||||
-rw-r--r-- | library/sound.cpp | 2 | ||||
-rw-r--r-- | library/storage.cpp | 4 | ||||
-rw-r--r-- | library/tzselect.cpp | 1 |
28 files changed, 1 insertions, 74 deletions
diff --git a/library/alarmserver.cpp b/library/alarmserver.cpp index 6f6f32d..48ab9c1 100644 --- a/library/alarmserver.cpp +++ b/library/alarmserver.cpp | |||
@@ -1,413 +1,408 @@ | |||
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 | 20 | ||
21 | #include <qdir.h> | 21 | #include <qdir.h> |
22 | #include <qfile.h> | ||
23 | #include <qmessagebox.h> | ||
24 | #include <qtextstream.h> | ||
25 | 22 | ||
26 | 23 | ||
27 | #include <qpe/qpeapplication.h> | 24 | #include <qpe/qpeapplication.h> |
28 | #include "global.h" | ||
29 | #include "resource.h" | ||
30 | 25 | ||
31 | #include <qpe/qcopenvelope_qws.h> | 26 | #include <qpe/qcopenvelope_qws.h> |
32 | #include "alarmserver.h" | 27 | #include "alarmserver.h" |
33 | #include <qpe/timeconversion.h> | 28 | #include <qpe/timeconversion.h> |
34 | 29 | ||
35 | #include <sys/types.h> | 30 | #include <sys/types.h> |
36 | #include <sys/stat.h> | 31 | #include <sys/stat.h> |
37 | 32 | ||
38 | #include <stdlib.h> | 33 | #include <stdlib.h> |
39 | #include <unistd.h> | 34 | #include <unistd.h> |
40 | 35 | ||
41 | 36 | ||
42 | #undef USE_ATD // not used anymore -- we run opie-alarm on suspend/resume | 37 | #undef USE_ATD // not used anymore -- we run opie-alarm on suspend/resume |
43 | 38 | ||
44 | 39 | ||
45 | struct timerEventItem | 40 | struct timerEventItem |
46 | { | 41 | { |
47 | time_t UTCtime; | 42 | time_t UTCtime; |
48 | QCString channel, message; | 43 | QCString channel, message; |
49 | int data; | 44 | int data; |
50 | bool operator==( const timerEventItem &right ) const | 45 | bool operator==( const timerEventItem &right ) const |
51 | { | 46 | { |
52 | return ( UTCtime == right.UTCtime | 47 | return ( UTCtime == right.UTCtime |
53 | && channel == right.channel | 48 | && channel == right.channel |
54 | && message == right.message | 49 | && message == right.message |
55 | && data == right.data ); | 50 | && data == right.data ); |
56 | } | 51 | } |
57 | }; | 52 | }; |
58 | 53 | ||
59 | class TimerReceiverObject : public QObject | 54 | class TimerReceiverObject : public QObject |
60 | { | 55 | { |
61 | public: | 56 | public: |
62 | TimerReceiverObject() | 57 | TimerReceiverObject() |
63 | { } | 58 | { } |
64 | ~TimerReceiverObject() | 59 | ~TimerReceiverObject() |
65 | { } | 60 | { } |
66 | void resetTimer(); | 61 | void resetTimer(); |
67 | void setTimerEventItem(); | 62 | void setTimerEventItem(); |
68 | void deleteTimer(); | 63 | void deleteTimer(); |
69 | protected: | 64 | protected: |
70 | void timerEvent( QTimerEvent *te ); | 65 | void timerEvent( QTimerEvent *te ); |
71 | 66 | ||
72 | #ifdef USE_ATD | 67 | #ifdef USE_ATD |
73 | private: | 68 | private: |
74 | QString atfilename; | 69 | QString atfilename; |
75 | #endif | 70 | #endif |
76 | }; | 71 | }; |
77 | 72 | ||
78 | TimerReceiverObject *timerEventReceiver = NULL; | 73 | TimerReceiverObject *timerEventReceiver = NULL; |
79 | QList<timerEventItem> timerEventList; | 74 | QList<timerEventItem> timerEventList; |
80 | timerEventItem *nearestTimerEvent = NULL; | 75 | timerEventItem *nearestTimerEvent = NULL; |
81 | 76 | ||
82 | 77 | ||
83 | // set the timer to go off on the next event in the list | 78 | // set the timer to go off on the next event in the list |
84 | void setNearestTimerEvent() | 79 | void setNearestTimerEvent() |
85 | { | 80 | { |
86 | nearestTimerEvent = NULL; | 81 | nearestTimerEvent = NULL; |
87 | QListIterator<timerEventItem> it( timerEventList ); | 82 | QListIterator<timerEventItem> it( timerEventList ); |
88 | if ( *it ) | 83 | if ( *it ) |
89 | nearestTimerEvent = *it; | 84 | nearestTimerEvent = *it; |
90 | for ( ; *it; ++it ) | 85 | for ( ; *it; ++it ) |
91 | if ( (*it)->UTCtime < nearestTimerEvent->UTCtime ) | 86 | if ( (*it)->UTCtime < nearestTimerEvent->UTCtime ) |
92 | nearestTimerEvent = *it; | 87 | nearestTimerEvent = *it; |
93 | if (nearestTimerEvent) | 88 | if (nearestTimerEvent) |
94 | timerEventReceiver->resetTimer(); | 89 | timerEventReceiver->resetTimer(); |
95 | else | 90 | else |
96 | timerEventReceiver->deleteTimer(); | 91 | timerEventReceiver->deleteTimer(); |
97 | } | 92 | } |
98 | 93 | ||
99 | 94 | ||
100 | //store current state to file | 95 | //store current state to file |
101 | //Simple implementation. Should run on a timer. | 96 | //Simple implementation. Should run on a timer. |
102 | 97 | ||
103 | static void saveState() | 98 | static void saveState() |
104 | { | 99 | { |
105 | QString savefilename = Global::applicationFileName( "AlarmServer", "saveFile" ); | 100 | QString savefilename = Global::applicationFileName( "AlarmServer", "saveFile" ); |
106 | if ( timerEventList.isEmpty() ) { | 101 | if ( timerEventList.isEmpty() ) { |
107 | unlink( savefilename ); | 102 | unlink( savefilename ); |
108 | return ; | 103 | return ; |
109 | } | 104 | } |
110 | 105 | ||
111 | QFile savefile(savefilename + ".new"); | 106 | QFile savefile(savefilename + ".new"); |
112 | if ( savefile.open(IO_WriteOnly) ) { | 107 | if ( savefile.open(IO_WriteOnly) ) { |
113 | QDataStream ds( &savefile ); | 108 | QDataStream ds( &savefile ); |
114 | 109 | ||
115 | //save | 110 | //save |
116 | 111 | ||
117 | QListIterator<timerEventItem> it( timerEventList ); | 112 | QListIterator<timerEventItem> it( timerEventList ); |
118 | for ( ; *it; ++it ) { | 113 | for ( ; *it; ++it ) { |
119 | ds << it.current()->UTCtime; | 114 | ds << it.current()->UTCtime; |
120 | ds << it.current()->channel; | 115 | ds << it.current()->channel; |
121 | ds << it.current()->message; | 116 | ds << it.current()->message; |
122 | ds << it.current()->data; | 117 | ds << it.current()->data; |
123 | } | 118 | } |
124 | 119 | ||
125 | 120 | ||
126 | savefile.close(); | 121 | savefile.close(); |
127 | unlink( savefilename ); | 122 | unlink( savefilename ); |
128 | QDir d; | 123 | QDir d; |
129 | d.rename(savefilename + ".new", savefilename); | 124 | d.rename(savefilename + ".new", savefilename); |
130 | 125 | ||
131 | } | 126 | } |
132 | } | 127 | } |
133 | 128 | ||
134 | /*! | 129 | /*! |
135 | Sets up the alarm server. Restoring to previous state (session management). | 130 | Sets up the alarm server. Restoring to previous state (session management). |
136 | */ | 131 | */ |
137 | void AlarmServer::initialize() | 132 | void AlarmServer::initialize() |
138 | { | 133 | { |
139 | //read autosave file and put events in timerEventList | 134 | //read autosave file and put events in timerEventList |
140 | 135 | ||
141 | QString savefilename = Global::applicationFileName( "AlarmServer", "saveFile" ); | 136 | QString savefilename = Global::applicationFileName( "AlarmServer", "saveFile" ); |
142 | 137 | ||
143 | QFile savefile(savefilename); | 138 | QFile savefile(savefilename); |
144 | if ( savefile.open(IO_ReadOnly) ) { | 139 | if ( savefile.open(IO_ReadOnly) ) { |
145 | QDataStream ds( &savefile ); | 140 | QDataStream ds( &savefile ); |
146 | while ( !ds.atEnd() ) { | 141 | while ( !ds.atEnd() ) { |
147 | timerEventItem *newTimerEventItem = new timerEventItem; | 142 | timerEventItem *newTimerEventItem = new timerEventItem; |
148 | ds >> newTimerEventItem->UTCtime; | 143 | ds >> newTimerEventItem->UTCtime; |
149 | ds >> newTimerEventItem->channel; | 144 | ds >> newTimerEventItem->channel; |
150 | ds >> newTimerEventItem->message; | 145 | ds >> newTimerEventItem->message; |
151 | ds >> newTimerEventItem->data; | 146 | ds >> newTimerEventItem->data; |
152 | timerEventList.append( newTimerEventItem ); | 147 | timerEventList.append( newTimerEventItem ); |
153 | } | 148 | } |
154 | savefile.close(); | 149 | savefile.close(); |
155 | if (!timerEventReceiver) | 150 | if (!timerEventReceiver) |
156 | timerEventReceiver = new TimerReceiverObject; | 151 | timerEventReceiver = new TimerReceiverObject; |
157 | setNearestTimerEvent(); | 152 | setNearestTimerEvent(); |
158 | } | 153 | } |
159 | } | 154 | } |
160 | 155 | ||
161 | 156 | ||
162 | #ifdef USE_ATD | 157 | #ifdef USE_ATD |
163 | 158 | ||
164 | static const char* atdir = "/var/spool/at/"; | 159 | static const char* atdir = "/var/spool/at/"; |
165 | 160 | ||
166 | static bool triggerAtd( bool writeHWClock = FALSE ) | 161 | static bool triggerAtd( bool writeHWClock = FALSE ) |
167 | { | 162 | { |
168 | QFile trigger(QString(atdir) + "trigger"); | 163 | QFile trigger(QString(atdir) + "trigger"); |
169 | if ( trigger.open(IO_WriteOnly | IO_Raw) ) { | 164 | if ( trigger.open(IO_WriteOnly | IO_Raw) ) { |
170 | if ( trigger.writeBlock("\n", 2) != 2 ) { | 165 | if ( trigger.writeBlock("\n", 2) != 2 ) { |
171 | QMessageBox::critical( 0, QObject::tr( "Out of Space" ), | 166 | QMessageBox::critical( 0, QObject::tr( "Out of Space" ), |
172 | QObject::tr( "Unable to schedule alarm.\nFree some memory and try again." ) ); | 167 | QObject::tr( "Unable to schedule alarm.\nFree some memory and try again." ) ); |
173 | trigger.close(); | 168 | trigger.close(); |
174 | QFile::remove | 169 | QFile::remove |
175 | ( trigger.name() ); | 170 | ( trigger.name() ); |
176 | return FALSE; | 171 | return FALSE; |
177 | } | 172 | } |
178 | return TRUE; | 173 | return TRUE; |
179 | } | 174 | } |
180 | return FALSE; | 175 | return FALSE; |
181 | } | 176 | } |
182 | 177 | ||
183 | #else | 178 | #else |
184 | 179 | ||
185 | static bool writeResumeAt ( time_t wakeup ) | 180 | static bool writeResumeAt ( time_t wakeup ) |
186 | { | 181 | { |
187 | FILE *fp = ::fopen ( "/var/run/resumeat", "w" ); | 182 | FILE *fp = ::fopen ( "/var/run/resumeat", "w" ); |
188 | 183 | ||
189 | if ( fp ) { | 184 | if ( fp ) { |
190 | ::fprintf ( fp, "%d\n", (int) wakeup ); | 185 | ::fprintf ( fp, "%d\n", (int) wakeup ); |
191 | ::fclose ( fp ); | 186 | ::fclose ( fp ); |
192 | } | 187 | } |
193 | else | 188 | else |
194 | qWarning ( "Failed to write wakeup time to /var/run/resumeat" ); | 189 | qWarning ( "Failed to write wakeup time to /var/run/resumeat" ); |
195 | 190 | ||
196 | return ( fp ); | 191 | return ( fp ); |
197 | } | 192 | } |
198 | 193 | ||
199 | #endif | 194 | #endif |
200 | 195 | ||
201 | void TimerReceiverObject::deleteTimer() | 196 | void TimerReceiverObject::deleteTimer() |
202 | { | 197 | { |
203 | #ifdef USE_ATD | 198 | #ifdef USE_ATD |
204 | if ( !atfilename.isEmpty() ) { | 199 | if ( !atfilename.isEmpty() ) { |
205 | unlink( atfilename ); | 200 | unlink( atfilename ); |
206 | atfilename = QString::null; | 201 | atfilename = QString::null; |
207 | triggerAtd( FALSE ); | 202 | triggerAtd( FALSE ); |
208 | } | 203 | } |
209 | #else | 204 | #else |
210 | writeResumeAt ( 0 ); | 205 | writeResumeAt ( 0 ); |
211 | #endif | 206 | #endif |
212 | } | 207 | } |
213 | 208 | ||
214 | void TimerReceiverObject::resetTimer() | 209 | void TimerReceiverObject::resetTimer() |
215 | { | 210 | { |
216 | const int maxsecs = 2147000; | 211 | const int maxsecs = 2147000; |
217 | QDateTime nearest = TimeConversion::fromUTC(nearestTimerEvent->UTCtime); | 212 | QDateTime nearest = TimeConversion::fromUTC(nearestTimerEvent->UTCtime); |
218 | QDateTime now = QDateTime::currentDateTime(); | 213 | QDateTime now = QDateTime::currentDateTime(); |
219 | if ( nearest < now ) | 214 | if ( nearest < now ) |
220 | nearest = now; | 215 | nearest = now; |
221 | int secs = TimeConversion::secsTo( now, nearest ); | 216 | int secs = TimeConversion::secsTo( now, nearest ); |
222 | if ( secs > maxsecs ) { | 217 | if ( secs > maxsecs ) { |
223 | // too far for millisecond timing | 218 | // too far for millisecond timing |
224 | secs = maxsecs; | 219 | secs = maxsecs; |
225 | } | 220 | } |
226 | 221 | ||
227 | // System timer (needed so that we wake from deep sleep), | 222 | // System timer (needed so that we wake from deep sleep), |
228 | // from the Epoch in seconds. | 223 | // from the Epoch in seconds. |
229 | // | 224 | // |
230 | int at_secs = TimeConversion::toUTC(nearest); | 225 | int at_secs = TimeConversion::toUTC(nearest); |
231 | // qDebug("reset timer to %d seconds from Epoch",at_secs); | 226 | // qDebug("reset timer to %d seconds from Epoch",at_secs); |
232 | 227 | ||
233 | #ifdef USE_ATD | 228 | #ifdef USE_ATD |
234 | 229 | ||
235 | QString fn = atdir + QString::number(at_secs) + "." | 230 | QString fn = atdir + QString::number(at_secs) + "." |
236 | + QString::number(getpid()); | 231 | + QString::number(getpid()); |
237 | if ( fn != atfilename ) { | 232 | if ( fn != atfilename ) { |
238 | QFile atfile(fn + ".new"); | 233 | QFile atfile(fn + ".new"); |
239 | if ( atfile.open(IO_WriteOnly | IO_Raw) ) { | 234 | if ( atfile.open(IO_WriteOnly | IO_Raw) ) { |
240 | int total_written; | 235 | int total_written; |
241 | 236 | ||
242 | // just wake up and delete the at file | 237 | // just wake up and delete the at file |
243 | QString cmd = "#!/bin/sh\nrm " + fn; | 238 | QString cmd = "#!/bin/sh\nrm " + fn; |
244 | total_written = atfile.writeBlock(cmd.latin1(), cmd.length()); | 239 | total_written = atfile.writeBlock(cmd.latin1(), cmd.length()); |
245 | if ( total_written != int(cmd.length()) ) { | 240 | if ( total_written != int(cmd.length()) ) { |
246 | QMessageBox::critical( 0, tr("Out of Space"), | 241 | QMessageBox::critical( 0, tr("Out of Space"), |
247 | tr("Unable to schedule alarm.\n" | 242 | tr("Unable to schedule alarm.\n" |
248 | "Please free up space and try again") ); | 243 | "Please free up space and try again") ); |
249 | atfile.close(); | 244 | atfile.close(); |
250 | QFile::remove | 245 | QFile::remove |
251 | ( atfile.name() ); | 246 | ( atfile.name() ); |
252 | return ; | 247 | return ; |
253 | } | 248 | } |
254 | atfile.close(); | 249 | atfile.close(); |
255 | unlink( atfilename ); | 250 | unlink( atfilename ); |
256 | QDir d; | 251 | QDir d; |
257 | d.rename(fn + ".new", fn); | 252 | d.rename(fn + ".new", fn); |
258 | chmod(fn.latin1(), 0755); | 253 | chmod(fn.latin1(), 0755); |
259 | atfilename = fn; | 254 | atfilename = fn; |
260 | triggerAtd( FALSE ); | 255 | triggerAtd( FALSE ); |
261 | } | 256 | } |
262 | else { | 257 | else { |
263 | qWarning("Cannot open atd file %s", fn.latin1()); | 258 | qWarning("Cannot open atd file %s", fn.latin1()); |
264 | } | 259 | } |
265 | } | 260 | } |
266 | #else | 261 | #else |
267 | writeResumeAt ( at_secs ); | 262 | writeResumeAt ( at_secs ); |
268 | 263 | ||
269 | #endif | 264 | #endif |
270 | 265 | ||
271 | // Qt timers (does the actual alarm) | 266 | // Qt timers (does the actual alarm) |
272 | // from now in milliseconds | 267 | // from now in milliseconds |
273 | // | 268 | // |
274 | qDebug("AlarmServer waiting %d seconds", secs); | 269 | qDebug("AlarmServer waiting %d seconds", secs); |
275 | startTimer( 1000 * secs + 500 ); | 270 | startTimer( 1000 * secs + 500 ); |
276 | } | 271 | } |
277 | 272 | ||
278 | void TimerReceiverObject::timerEvent( QTimerEvent * ) | 273 | void TimerReceiverObject::timerEvent( QTimerEvent * ) |
279 | { | 274 | { |
280 | bool needSave = FALSE; | 275 | bool needSave = FALSE; |
281 | killTimers(); | 276 | killTimers(); |
282 | if (nearestTimerEvent) { | 277 | if (nearestTimerEvent) { |
283 | if ( nearestTimerEvent->UTCtime | 278 | if ( nearestTimerEvent->UTCtime |
284 | <= TimeConversion::toUTC(QDateTime::currentDateTime()) ) { | 279 | <= TimeConversion::toUTC(QDateTime::currentDateTime()) ) { |
285 | #ifndef QT_NO_COP | 280 | #ifndef QT_NO_COP |
286 | QCopEnvelope e( nearestTimerEvent->channel, | 281 | QCopEnvelope e( nearestTimerEvent->channel, |
287 | nearestTimerEvent->message ); | 282 | nearestTimerEvent->message ); |
288 | e << TimeConversion::fromUTC( nearestTimerEvent->UTCtime ) | 283 | e << TimeConversion::fromUTC( nearestTimerEvent->UTCtime ) |
289 | << nearestTimerEvent->data; | 284 | << nearestTimerEvent->data; |
290 | #endif | 285 | #endif |
291 | 286 | ||
292 | timerEventList.remove( nearestTimerEvent ); | 287 | timerEventList.remove( nearestTimerEvent ); |
293 | needSave = TRUE; | 288 | needSave = TRUE; |
294 | } | 289 | } |
295 | setNearestTimerEvent(); | 290 | setNearestTimerEvent(); |
296 | } | 291 | } |
297 | else { | 292 | else { |
298 | resetTimer(); | 293 | resetTimer(); |
299 | } | 294 | } |
300 | if ( needSave ) | 295 | if ( needSave ) |
301 | saveState(); | 296 | saveState(); |
302 | } | 297 | } |
303 | 298 | ||
304 | /*! | 299 | /*! |
305 | \class AlarmServer alarmserver.h | 300 | \class AlarmServer alarmserver.h |
306 | \brief The AlarmServer class allows alarms to be scheduled and unscheduled. | 301 | \brief The AlarmServer class allows alarms to be scheduled and unscheduled. |
307 | 302 | ||
308 | Applications can schedule alarms with addAlarm() and can | 303 | Applications can schedule alarms with addAlarm() and can |
309 | unschedule alarms with deleteAlarm(). When the time for an alarm | 304 | unschedule alarms with deleteAlarm(). When the time for an alarm |
310 | to go off is reached the specified \link qcop.html QCop\endlink | 305 | to go off is reached the specified \link qcop.html QCop\endlink |
311 | message is sent on the specified channel (optionally with | 306 | message is sent on the specified channel (optionally with |
312 | additional data). | 307 | additional data). |
313 | 308 | ||
314 | Scheduling an alarm using this class is important (rather just using | 309 | Scheduling an alarm using this class is important (rather just using |
315 | a QTimer) since the machine may be asleep and needs to get woken up using | 310 | a QTimer) since the machine may be asleep and needs to get woken up using |
316 | the Linux kernel which implements this at the kernel level to minimize | 311 | the Linux kernel which implements this at the kernel level to minimize |
317 | battery usage while asleep. | 312 | battery usage while asleep. |
318 | 313 | ||
319 | A small example on how to use AlarmServer. | 314 | A small example on how to use AlarmServer. |
320 | 315 | ||
321 | First we need to connect a slot the AppMessage QCOP call. appMessage | 316 | First we need to connect a slot the AppMessage QCOP call. appMessage |
322 | will be emitted if QPE/Application/appname gets called. | 317 | will be emitted if QPE/Application/appname gets called. |
323 | 318 | ||
324 | \code | 319 | \code |
325 | TestApp::TestApp(QWidget *parent, const char* name, WFlags fl ) | 320 | TestApp::TestApp(QWidget *parent, const char* name, WFlags fl ) |
326 | : QMainWindow(parent,name,fl){ | 321 | : QMainWindow(parent,name,fl){ |
327 | connect(qApp,SIGNAL(appMessage(const QCString&,const QByteArray&)), | 322 | connect(qApp,SIGNAL(appMessage(const QCString&,const QByteArray&)), |
328 | this,SLOT(slotAppMessage(const QCString&,const QByteArray&))); | 323 | this,SLOT(slotAppMessage(const QCString&,const QByteArray&))); |
329 | } | 324 | } |
330 | \endcode | 325 | \endcode |
331 | 326 | ||
332 | To add / delete an alarm, you can use the static method AlarmServer::addAlarm and | 327 | To add / delete an alarm, you can use the static method AlarmServer::addAlarm and |
333 | AlarmServer::deleteAlarm. Note that an old (expired) alarm will automatically be deleted | 328 | AlarmServer::deleteAlarm. Note that an old (expired) alarm will automatically be deleted |
334 | from the alarmserver list, but a change in timing will have the effect, that both | 329 | from the alarmserver list, but a change in timing will have the effect, that both |
335 | alarms will be emitted. So if you change an Alarm be sure to delete the old one! | 330 | alarms will be emitted. So if you change an Alarm be sure to delete the old one! |
336 | @see addAlarm | 331 | @see addAlarm |
337 | 332 | ||
338 | \code | 333 | \code |
339 | QDateTime oldDt = oldAlarmDateTime(); | 334 | QDateTime oldDt = oldAlarmDateTime(); |
340 | QPEApplication::execDialog(ourDlg); | 335 | QPEApplication::execDialog(ourDlg); |
341 | QDateTime newDt = ourDlg->dateTime(); | 336 | QDateTime newDt = ourDlg->dateTime(); |
342 | if(newDt == oldDt ) return; | 337 | if(newDt == oldDt ) return; |
343 | @slash* code is missing for unsetting an alarm *@slash | 338 | @slash* code is missing for unsetting an alarm *@slash |
344 | 339 | ||
345 | AlarmServer::deleteAlarm(oldDt,"QPE/Application/appname","checkAlarm(QDateTime,int)",0); | 340 | AlarmServer::deleteAlarm(oldDt,"QPE/Application/appname","checkAlarm(QDateTime,int)",0); |
346 | AlarmServer::addAlarm( newDt,"QPE/AlarmServer/appname","checkAlarm(QDateTime,int)",0); | 341 | AlarmServer::addAlarm( newDt,"QPE/AlarmServer/appname","checkAlarm(QDateTime,int)",0); |
347 | 342 | ||
348 | \endcode | 343 | \endcode |
349 | 344 | ||
350 | Now once the Alarm is emitted you need to check the appMessage and then do what you want. | 345 | Now once the Alarm is emitted you need to check the appMessage and then do what you want. |
351 | \code | 346 | \code |
352 | void TestApp::slotAppMessage(const QCString& str, const QByteArray& ar ){ | 347 | void TestApp::slotAppMessage(const QCString& str, const QByteArray& ar ){ |
353 | QDataStream stream(ar,IO_ReadOnly); | 348 | QDataStream stream(ar,IO_ReadOnly); |
354 | if(str == "checkAlarm(QDateTime,int)" ){ | 349 | if(str == "checkAlarm(QDateTime,int)" ){ |
355 | QDateTime dt; | 350 | QDateTime dt; |
356 | int a; | 351 | int a; |
357 | stream >> dt >> a; | 352 | stream >> dt >> a; |
358 | // fire up alarm | 353 | // fire up alarm |
359 | } | 354 | } |
360 | } | 355 | } |
361 | \endcode | 356 | \endcode |
362 | 357 | ||
363 | \ingroup qtopiaemb | 358 | \ingroup qtopiaemb |
364 | \sa QCopEnvelope | 359 | \sa QCopEnvelope |
365 | @see QPEApplication::appMessage(const QCString&,const QByteArray&) | 360 | @see QPEApplication::appMessage(const QCString&,const QByteArray&) |
366 | @see OPimMainWindow | 361 | @see OPimMainWindow |
367 | @see ODevice::alarmSound() | 362 | @see ODevice::alarmSound() |
368 | @see Sound::soundAlarm() | 363 | @see Sound::soundAlarm() |
369 | */ | 364 | */ |
370 | 365 | ||
371 | /*! | 366 | /*! |
372 | Schedules an alarm to go off at (or soon after) time \a when. When | 367 | Schedules an alarm to go off at (or soon after) time \a when. When |
373 | the alarm goes off, the \link qcop.html QCop\endlink \a message will | 368 | the alarm goes off, the \link qcop.html QCop\endlink \a message will |
374 | be sent to \a channel, with \a data as a parameter. | 369 | be sent to \a channel, with \a data as a parameter. |
375 | 370 | ||
376 | If this function is called with exactly the same data as a previous | 371 | If this function is called with exactly the same data as a previous |
377 | call the subsequent call is ignored, so there is only ever one alarm | 372 | call the subsequent call is ignored, so there is only ever one alarm |
378 | with a given set of parameters. | 373 | with a given set of parameters. |
379 | 374 | ||
380 | Once an alarm is emitted. The \a channel with a \a message will be emitted | 375 | Once an alarm is emitted. The \a channel with a \a message will be emitted |
381 | and data will be send. | 376 | and data will be send. |
382 | The QDateTime and int are the two parameters included in the QCOP message. | 377 | The QDateTime and int are the two parameters included in the QCOP message. |
383 | You can specify channel, message and the integer parameter. QDateTime will be | 378 | You can specify channel, message and the integer parameter. QDateTime will be |
384 | the datetime of the QCop call. | 379 | the datetime of the QCop call. |
385 | 380 | ||
386 | @param when The QDateTime of the alarm | 381 | @param when The QDateTime of the alarm |
387 | @param channel The channel which gets called once the alarm is emitted | 382 | @param channel The channel which gets called once the alarm is emitted |
388 | @param message The message to be send to the channel | 383 | @param message The message to be send to the channel |
389 | @param data Additional data as integer | 384 | @param data Additional data as integer |
390 | 385 | ||
391 | @see QCopChannel | 386 | @see QCopChannel |
392 | \sa deleteAlarm() | 387 | \sa deleteAlarm() |
393 | */ | 388 | */ |
394 | void AlarmServer::addAlarm ( QDateTime when, const QCString& channel, | 389 | void AlarmServer::addAlarm ( QDateTime when, const QCString& channel, |
395 | const QCString& message, int data) | 390 | const QCString& message, int data) |
396 | { | 391 | { |
397 | if ( qApp->type() == QApplication::GuiServer ) { | 392 | if ( qApp->type() == QApplication::GuiServer ) { |
398 | bool needSave = FALSE; | 393 | bool needSave = FALSE; |
399 | // Here we are the server so either it has been directly called from | 394 | // Here we are the server so either it has been directly called from |
400 | // within the server or it has been sent to us from a client via QCop | 395 | // within the server or it has been sent to us from a client via QCop |
401 | if (!timerEventReceiver) | 396 | if (!timerEventReceiver) |
402 | timerEventReceiver = new TimerReceiverObject; | 397 | timerEventReceiver = new TimerReceiverObject; |
403 | 398 | ||
404 | timerEventItem *newTimerEventItem = new timerEventItem; | 399 | timerEventItem *newTimerEventItem = new timerEventItem; |
405 | newTimerEventItem->UTCtime = TimeConversion::toUTC( when ); | 400 | newTimerEventItem->UTCtime = TimeConversion::toUTC( when ); |
406 | newTimerEventItem->channel = channel; | 401 | newTimerEventItem->channel = channel; |
407 | newTimerEventItem->message = message; | 402 | newTimerEventItem->message = message; |
408 | newTimerEventItem->data = data; | 403 | newTimerEventItem->data = data; |
409 | // explore the case of already having the event in here... | 404 | // explore the case of already having the event in here... |
410 | QListIterator<timerEventItem> it( timerEventList ); | 405 | QListIterator<timerEventItem> it( timerEventList ); |
411 | for ( ; *it; ++it ) | 406 | for ( ; *it; ++it ) |
412 | if ( *(*it) == *newTimerEventItem ) | 407 | if ( *(*it) == *newTimerEventItem ) |
413 | return ; | 408 | return ; |
diff --git a/library/applnk.cpp b/library/applnk.cpp index 8763eb2..9c60f1a 100644 --- a/library/applnk.cpp +++ b/library/applnk.cpp | |||
@@ -1,425 +1,421 @@ | |||
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 | 20 | ||
21 | #define QTOPIA_INTERNAL_MIMEEXT | 21 | #define QTOPIA_INTERNAL_MIMEEXT |
22 | #define QTOPIA_INTERNAL_PRELOADACCESS | 22 | #define QTOPIA_INTERNAL_PRELOADACCESS |
23 | #define QTOPIA_INTERNAL_APPLNKASSIGN | 23 | #define QTOPIA_INTERNAL_APPLNKASSIGN |
24 | 24 | ||
25 | #include "applnk.h" | 25 | #include "applnk.h" |
26 | 26 | ||
27 | #include <qpe/qpeapplication.h> | 27 | #include <qpe/qpeapplication.h> |
28 | #include <qpe/categories.h> | 28 | #include <qpe/categories.h> |
29 | #include <qpe/categoryselect.h> | 29 | #include <qpe/categoryselect.h> |
30 | #include <qpe/qcopenvelope_qws.h> | 30 | #include <qpe/qcopenvelope_qws.h> |
31 | #include <qpe/global.h> | ||
32 | #include <qpe/mimetype.h> | 31 | #include <qpe/mimetype.h> |
33 | #include <qpe/config.h> | 32 | #include <qpe/config.h> |
34 | #include <qpe/storage.h> | 33 | #include <qpe/storage.h> |
35 | #include <qpe/resource.h> | 34 | #include <qpe/resource.h> |
36 | 35 | ||
37 | #include <qdict.h> | ||
38 | #include <qdir.h> | 36 | #include <qdir.h> |
39 | #include <qregexp.h> | ||
40 | 37 | ||
41 | #include <qgfx_qws.h> | ||
42 | 38 | ||
43 | #include <stdlib.h> | 39 | #include <stdlib.h> |
44 | 40 | ||
45 | int AppLnk::lastId = 5000; | 41 | int AppLnk::lastId = 5000; |
46 | 42 | ||
47 | static int smallSize = 14; | 43 | static int smallSize = 14; |
48 | static int bigSize = 32; | 44 | static int bigSize = 32; |
49 | 45 | ||
50 | static QString safeFileName(const QString& n) | 46 | static QString safeFileName(const QString& n) |
51 | { | 47 | { |
52 | QString safename=n; | 48 | QString safename=n; |
53 | safename.replace(QRegExp("[^0-9A-Za-z.]"),"_"); | 49 | safename.replace(QRegExp("[^0-9A-Za-z.]"),"_"); |
54 | safename.replace(QRegExp("^[^A-Za-z]*"),""); | 50 | safename.replace(QRegExp("^[^A-Za-z]*"),""); |
55 | if ( safename.isEmpty() ) | 51 | if ( safename.isEmpty() ) |
56 | safename = "_"; | 52 | safename = "_"; |
57 | return safename; | 53 | return safename; |
58 | } | 54 | } |
59 | 55 | ||
60 | static bool prepareDirectories(const QString& lf) | 56 | static bool prepareDirectories(const QString& lf) |
61 | { | 57 | { |
62 | if ( !QFile::exists(lf) ) { | 58 | if ( !QFile::exists(lf) ) { |
63 | // May need to create directories | 59 | // May need to create directories |
64 | QFileInfo fi(lf); | 60 | QFileInfo fi(lf); |
65 | if ( system(("mkdir -p "+fi.dirPath(TRUE))) ) | 61 | if ( system(("mkdir -p "+fi.dirPath(TRUE))) ) |
66 | return FALSE; | 62 | return FALSE; |
67 | } | 63 | } |
68 | return TRUE; | 64 | return TRUE; |
69 | } | 65 | } |
70 | 66 | ||
71 | class AppLnkPrivate | 67 | class AppLnkPrivate |
72 | { | 68 | { |
73 | public: | 69 | public: |
74 | /* the size of the Pixmap */ | 70 | /* the size of the Pixmap */ |
75 | enum Size {Normal = 0, Big }; | 71 | enum Size {Normal = 0, Big }; |
76 | AppLnkPrivate() { | 72 | AppLnkPrivate() { |
77 | /* we want one normal and one big item */ | 73 | /* we want one normal and one big item */ |
78 | 74 | ||
79 | QPixmap pix; | 75 | QPixmap pix; |
80 | mPixmaps.insert(0, pix ); | 76 | mPixmaps.insert(0, pix ); |
81 | mPixmaps.insert(1, pix); | 77 | mPixmaps.insert(1, pix); |
82 | } | 78 | } |
83 | 79 | ||
84 | QStringList mCatList; // always correct | 80 | QStringList mCatList; // always correct |
85 | QArray<int> mCat; // cached value; correct if not empty | 81 | QArray<int> mCat; // cached value; correct if not empty |
86 | QMap<int, QPixmap> mPixmaps; | 82 | QMap<int, QPixmap> mPixmaps; |
87 | 83 | ||
88 | void updateCatListFromArray() | 84 | void updateCatListFromArray() |
89 | { | 85 | { |
90 | Categories cat( 0 ); | 86 | Categories cat( 0 ); |
91 | cat.load( categoryFileName() ); | 87 | cat.load( categoryFileName() ); |
92 | // we need to update the names for the mCat... to mCatList | 88 | // we need to update the names for the mCat... to mCatList |
93 | mCatList.clear(); | 89 | mCatList.clear(); |
94 | for (uint i = 0; i < mCat.count(); i++ ) | 90 | for (uint i = 0; i < mCat.count(); i++ ) |
95 | mCatList << cat.label("Document View", mCat[i] ); | 91 | mCatList << cat.label("Document View", mCat[i] ); |
96 | 92 | ||
97 | } | 93 | } |
98 | 94 | ||
99 | void setCatArrayDirty() | 95 | void setCatArrayDirty() |
100 | { | 96 | { |
101 | mCat.resize(0); | 97 | mCat.resize(0); |
102 | } | 98 | } |
103 | 99 | ||
104 | void ensureCatArray() | 100 | void ensureCatArray() |
105 | { | 101 | { |
106 | if ( mCat.count() > 0 || mCatList.count()==0 ) | 102 | if ( mCat.count() > 0 || mCatList.count()==0 ) |
107 | return; | 103 | return; |
108 | 104 | ||
109 | Categories cat( 0 ); | 105 | Categories cat( 0 ); |
110 | cat.load( categoryFileName() ); | 106 | cat.load( categoryFileName() ); |
111 | mCat.resize( mCatList.count() ); | 107 | mCat.resize( mCatList.count() ); |
112 | int i; | 108 | int i; |
113 | QStringList::ConstIterator it; | 109 | QStringList::ConstIterator it; |
114 | for ( i = 0, it = mCatList.begin(); it != mCatList.end(); | 110 | for ( i = 0, it = mCatList.begin(); it != mCatList.end(); |
115 | ++it, i++ ) { | 111 | ++it, i++ ) { |
116 | 112 | ||
117 | bool number; | 113 | bool number; |
118 | int id = (*it).toInt( &number ); | 114 | int id = (*it).toInt( &number ); |
119 | if ( !number ) { | 115 | if ( !number ) { |
120 | id = cat.id( "Document View", *it ); | 116 | id = cat.id( "Document View", *it ); |
121 | if ( id == 0 ) | 117 | if ( id == 0 ) |
122 | id = cat.addCategory( "Document View", *it ); | 118 | id = cat.addCategory( "Document View", *it ); |
123 | } | 119 | } |
124 | mCat[i] = id; | 120 | mCat[i] = id; |
125 | } | 121 | } |
126 | } | 122 | } |
127 | }; | 123 | }; |
128 | 124 | ||
129 | /*! | 125 | /*! |
130 | \class AppLnk applnk.h | 126 | \class AppLnk applnk.h |
131 | \brief The AppLnk class represents an application available on the system. | 127 | \brief The AppLnk class represents an application available on the system. |
132 | 128 | ||
133 | Every Qtopia application \e app has a corresponding \e app.desktop | 129 | Every Qtopia application \e app has a corresponding \e app.desktop |
134 | file. When one of these files is read its data is stored as an | 130 | file. When one of these files is read its data is stored as an |
135 | AppLnk object. | 131 | AppLnk object. |
136 | 132 | ||
137 | The AppLnk class introduces some Qtopia-specific concepts, and | 133 | The AppLnk class introduces some Qtopia-specific concepts, and |
138 | provides a variety of functions, as described in the following | 134 | provides a variety of functions, as described in the following |
139 | sections. | 135 | sections. |
140 | \tableofcontents | 136 | \tableofcontents |
141 | 137 | ||
142 | \target Types | 138 | \target Types |
143 | \section1 Types | 139 | \section1 Types |
144 | 140 | ||
145 | Every AppLnk object has a \e type. For applications, games and | 141 | Every AppLnk object has a \e type. For applications, games and |
146 | settings the type is \c Application; for documents the | 142 | settings the type is \c Application; for documents the |
147 | type is the document's MIME type. | 143 | type is the document's MIME type. |
148 | 144 | ||
149 | \target files-and-links | 145 | \target files-and-links |
150 | \section1 Files and Links | 146 | \section1 Files and Links |
151 | 147 | ||
152 | When you create an AppLnk (or more likely, a \link doclnk.html | 148 | When you create an AppLnk (or more likely, a \link doclnk.html |
153 | DocLnk\endlink), you don't deal directly with filenames in the | 149 | DocLnk\endlink), you don't deal directly with filenames in the |
154 | filesystem. Instead you do this: | 150 | filesystem. Instead you do this: |
155 | \code | 151 | \code |
156 | DocLnk d; | 152 | DocLnk d; |
157 | d.setType("text/plain"); | 153 | d.setType("text/plain"); |
158 | d.setName("My Nicely Named Document / Whatever"); // Yes, "/" is legal. | 154 | d.setName("My Nicely Named Document / Whatever"); // Yes, "/" is legal. |
159 | \endcode | 155 | \endcode |
160 | At this point, the file() and linkFile() are unknown. Normally | 156 | At this point, the file() and linkFile() are unknown. Normally |
161 | this is uninteresting, and the names become automatically known, | 157 | this is uninteresting, and the names become automatically known, |
162 | and more importantly, becomes reserved, when you ask what they are: | 158 | and more importantly, becomes reserved, when you ask what they are: |
163 | 159 | ||
164 | \code | 160 | \code |
165 | QString fn = d.file(); | 161 | QString fn = d.file(); |
166 | \endcode | 162 | \endcode |
167 | This invents a filename, and creates the file on disk (an empty | 163 | This invents a filename, and creates the file on disk (an empty |
168 | reservation file) to prevent the name being used by another | 164 | reservation file) to prevent the name being used by another |
169 | application. | 165 | application. |
170 | 166 | ||
171 | In some circumstances, you don't want to create the file if it | 167 | In some circumstances, you don't want to create the file if it |
172 | doesn't already exist (e.g. in the Document tab, some of the \link | 168 | doesn't already exist (e.g. in the Document tab, some of the \link |
173 | doclnk.html DocLnk\endlink objects represented by icons are | 169 | doclnk.html DocLnk\endlink objects represented by icons are |
174 | DocLnk's created just for that view - they don't have | 170 | DocLnk's created just for that view - they don't have |
175 | corresponding \c .desktop files. To avoid littering empty | 171 | corresponding \c .desktop files. To avoid littering empty |
176 | reservation files around, we check in a few places to see whether | 172 | reservation files around, we check in a few places to see whether |
177 | the file really needs to exist). | 173 | the file really needs to exist). |
178 | 174 | ||
179 | \section1 Functionality | 175 | \section1 Functionality |
180 | 176 | ||
181 | AppLnk objects are created by calling the constructor with the | 177 | AppLnk objects are created by calling the constructor with the |
182 | name of a \e .desktop file. The object can be checked for validity | 178 | name of a \e .desktop file. The object can be checked for validity |
183 | using isValid(). | 179 | using isValid(). |
184 | 180 | ||
185 | The following functions are used to set or retrieve information | 181 | The following functions are used to set or retrieve information |
186 | about the application: | 182 | about the application: |
187 | \table | 183 | \table |
188 | \header \i Get Function \i Set Function \i Short Description | 184 | \header \i Get Function \i Set Function \i Short Description |
189 | \row \i \l name() \i \l setName() \i application's name | 185 | \row \i \l name() \i \l setName() \i application's name |
190 | \row \i \l pixmap() \i \e none \i application's icon | 186 | \row \i \l pixmap() \i \e none \i application's icon |
191 | \row \i \l bigPixmap() \i \e none \i application's large icon | 187 | \row \i \l bigPixmap() \i \e none \i application's large icon |
192 | \row \i \e none \i setIcon() \i sets the icon's filename | 188 | \row \i \e none \i setIcon() \i sets the icon's filename |
193 | \row \i \l type() \i \l setType() \i see \link #Types Types\endlink above | 189 | \row \i \l type() \i \l setType() \i see \link #Types Types\endlink above |
194 | \row \i \l rotation() \i \e none \i 0, 90, 180 or 270 degrees | 190 | \row \i \l rotation() \i \e none \i 0, 90, 180 or 270 degrees |
195 | \row \i \l comment() \i \l setComment() \i text for the Details dialog | 191 | \row \i \l comment() \i \l setComment() \i text for the Details dialog |
196 | \row \i \l exec() \i \l setExec() \i executable's filename | 192 | \row \i \l exec() \i \l setExec() \i executable's filename |
197 | \row \i \l file() \i \e none \i document's filename | 193 | \row \i \l file() \i \e none \i document's filename |
198 | \row \i \l linkFile() \i \l setLinkFile() \i \e .desktop filename | 194 | \row \i \l linkFile() \i \l setLinkFile() \i \e .desktop filename |
199 | \row \i \l mimeTypes() \i \e none \i the mime types the application can view or edit | 195 | \row \i \l mimeTypes() \i \e none \i the mime types the application can view or edit |
200 | \row \i \l categories() \i \l setCategories() \i \e{see the function descriptions} | 196 | \row \i \l categories() \i \l setCategories() \i \e{see the function descriptions} |
201 | \row \i \l fileKnown() \i \e none \i see \link | 197 | \row \i \l fileKnown() \i \e none \i see \link |
202 | #files-and-links Files and Links\endlink above | 198 | #files-and-links Files and Links\endlink above |
203 | \row \i \l linkFileKnown() \i \e none \i see \link | 199 | \row \i \l linkFileKnown() \i \e none \i see \link |
204 | #files-and-links Files and Links\endlink above | 200 | #files-and-links Files and Links\endlink above |
205 | \row \i \l property() \i \l setProperty() \i any AppLnk property | 201 | \row \i \l property() \i \l setProperty() \i any AppLnk property |
206 | can be retrieved or set (if writeable) using these | 202 | can be retrieved or set (if writeable) using these |
207 | \endtable | 203 | \endtable |
208 | 204 | ||
209 | To save an AppLnk to disk use writeLink(). To execute the | 205 | To save an AppLnk to disk use writeLink(). To execute the |
210 | application that the AppLnk object refers to, use execute(). | 206 | application that the AppLnk object refers to, use execute(). |
211 | 207 | ||
212 | AppLnk's can be deleted from disk using removeLinkFile(). To | 208 | AppLnk's can be deleted from disk using removeLinkFile(). To |
213 | remove both the link and the application's executable use | 209 | remove both the link and the application's executable use |
214 | removeFiles(). | 210 | removeFiles(). |
215 | 211 | ||
216 | Icon sizes can be globally changed (but only for AppLnk objects | 212 | Icon sizes can be globally changed (but only for AppLnk objects |
217 | created after the calls) with setSmallIconSize() and | 213 | created after the calls) with setSmallIconSize() and |
218 | setBigIconSize(). | 214 | setBigIconSize(). |
219 | 215 | ||
220 | \ingroup qtopiaemb | 216 | \ingroup qtopiaemb |
221 | */ | 217 | */ |
222 | 218 | ||
223 | /*! | 219 | /*! |
224 | Sets the size used for small icons to \a small pixels. | 220 | Sets the size used for small icons to \a small pixels. |
225 | Only affects AppLnk objects created after the call. | 221 | Only affects AppLnk objects created after the call. |
226 | 222 | ||
227 | \sa smallIconSize() setIcon() | 223 | \sa smallIconSize() setIcon() |
228 | */ | 224 | */ |
229 | void AppLnk::setSmallIconSize(int small) | 225 | void AppLnk::setSmallIconSize(int small) |
230 | { | 226 | { |
231 | smallSize = small; | 227 | smallSize = small; |
232 | } | 228 | } |
233 | 229 | ||
234 | /*! | 230 | /*! |
235 | Returns the size used for small icons. | 231 | Returns the size used for small icons. |
236 | 232 | ||
237 | \sa setSmallIconSize() setIcon() | 233 | \sa setSmallIconSize() setIcon() |
238 | */ | 234 | */ |
239 | int AppLnk::smallIconSize() | 235 | int AppLnk::smallIconSize() |
240 | { | 236 | { |
241 | return smallSize; | 237 | return smallSize; |
242 | } | 238 | } |
243 | 239 | ||
244 | 240 | ||
245 | /*! | 241 | /*! |
246 | Sets the size used for large icons to \a big pixels. | 242 | Sets the size used for large icons to \a big pixels. |
247 | Only affects AppLnk objects created after the call. | 243 | Only affects AppLnk objects created after the call. |
248 | 244 | ||
249 | \sa bigIconSize() setIcon() | 245 | \sa bigIconSize() setIcon() |
250 | */ | 246 | */ |
251 | void AppLnk::setBigIconSize(int big) | 247 | void AppLnk::setBigIconSize(int big) |
252 | { | 248 | { |
253 | bigSize = big; | 249 | bigSize = big; |
254 | } | 250 | } |
255 | 251 | ||
256 | /*! | 252 | /*! |
257 | Returns the size used for large icons. | 253 | Returns the size used for large icons. |
258 | 254 | ||
259 | \sa setBigIconSize() setIcon() | 255 | \sa setBigIconSize() setIcon() |
260 | */ | 256 | */ |
261 | int AppLnk::bigIconSize() | 257 | int AppLnk::bigIconSize() |
262 | { | 258 | { |
263 | return bigSize; | 259 | return bigSize; |
264 | } | 260 | } |
265 | 261 | ||
266 | 262 | ||
267 | /*! | 263 | /*! |
268 | \fn QString AppLnk::name() const | 264 | \fn QString AppLnk::name() const |
269 | 265 | ||
270 | Returns the Name property. This is the user-visible name for the | 266 | Returns the Name property. This is the user-visible name for the |
271 | document or application, not the filename. | 267 | document or application, not the filename. |
272 | 268 | ||
273 | See \link #files-and-links Files and Links\endlink. | 269 | See \link #files-and-links Files and Links\endlink. |
274 | 270 | ||
275 | \sa setName() | 271 | \sa setName() |
276 | */ | 272 | */ |
277 | /*! | 273 | /*! |
278 | \fn QString AppLnk::exec() const | 274 | \fn QString AppLnk::exec() const |
279 | 275 | ||
280 | Returns the Exec property. This is the name of the executable | 276 | Returns the Exec property. This is the name of the executable |
281 | program associated with the AppLnk. | 277 | program associated with the AppLnk. |
282 | 278 | ||
283 | \sa setExec() | 279 | \sa setExec() |
284 | */ | 280 | */ |
285 | /*! | 281 | /*! |
286 | \fn QString AppLnk::rotation() const | 282 | \fn QString AppLnk::rotation() const |
287 | 283 | ||
288 | Returns the Rotation property. The value is 0, 90, 180 or 270 | 284 | Returns the Rotation property. The value is 0, 90, 180 or 270 |
289 | degrees. | 285 | degrees. |
290 | */ | 286 | */ |
291 | /*! | 287 | /*! |
292 | \fn QString AppLnk::comment() const | 288 | \fn QString AppLnk::comment() const |
293 | 289 | ||
294 | Returns the Comment property. | 290 | Returns the Comment property. |
295 | 291 | ||
296 | \sa setComment() | 292 | \sa setComment() |
297 | */ | 293 | */ |
298 | /*! | 294 | /*! |
299 | \fn QStringList AppLnk::mimeTypes() const | 295 | \fn QStringList AppLnk::mimeTypes() const |
300 | 296 | ||
301 | Returns the MimeTypes property. This is the list of MIME types | 297 | Returns the MimeTypes property. This is the list of MIME types |
302 | that the application can view or edit. | 298 | that the application can view or edit. |
303 | */ | 299 | */ |
304 | /*! | 300 | /*! |
305 | \fn const QArray<int>& AppLnk::categories() const | 301 | \fn const QArray<int>& AppLnk::categories() const |
306 | 302 | ||
307 | Returns the Categories property. | 303 | Returns the Categories property. |
308 | 304 | ||
309 | See the CategoryWidget for more details. | 305 | See the CategoryWidget for more details. |
310 | 306 | ||
311 | \sa setCategories() | 307 | \sa setCategories() |
312 | */ | 308 | */ |
313 | 309 | ||
314 | const QArray<int>& AppLnk::categories() const | 310 | const QArray<int>& AppLnk::categories() const |
315 | { | 311 | { |
316 | d->ensureCatArray(); | 312 | d->ensureCatArray(); |
317 | return d->mCat; | 313 | return d->mCat; |
318 | } | 314 | } |
319 | 315 | ||
320 | /*! | 316 | /*! |
321 | \fn int AppLnk::id() const | 317 | \fn int AppLnk::id() const |
322 | 318 | ||
323 | Returns the id of the AppLnk. If the AppLnk is not in an AppLnkSet, | 319 | Returns the id of the AppLnk. If the AppLnk is not in an AppLnkSet, |
324 | this value is 0, otherwise it is a value that is unique for the | 320 | this value is 0, otherwise it is a value that is unique for the |
325 | duration of the current process. | 321 | duration of the current process. |
326 | 322 | ||
327 | \sa AppLnkSet::find() | 323 | \sa AppLnkSet::find() |
328 | */ | 324 | */ |
329 | 325 | ||
330 | /*! | 326 | /*! |
331 | \fn bool AppLnk::isValid() const | 327 | \fn bool AppLnk::isValid() const |
332 | 328 | ||
333 | Returns TRUE if this AppLnk is valid; otherwise returns FALSE. | 329 | Returns TRUE if this AppLnk is valid; otherwise returns FALSE. |
334 | */ | 330 | */ |
335 | /*! | 331 | /*! |
336 | \fn bool AppLnk::fileKnown() const | 332 | \fn bool AppLnk::fileKnown() const |
337 | 333 | ||
338 | If the with the AppLnk associated file is not equal to QString::null | 334 | If the with the AppLnk associated file is not equal to QString::null |
339 | */ | 335 | */ |
340 | /*! | 336 | /*! |
341 | \fn bool AppLnk::linkFileKnown()const | 337 | \fn bool AppLnk::linkFileKnown()const |
342 | 338 | ||
343 | The filename of the AppLnk | 339 | The filename of the AppLnk |
344 | 340 | ||
345 | */ | 341 | */ |
346 | /*! | 342 | /*! |
347 | \fn void AppLnk::setRotation( const QString& ) | 343 | \fn void AppLnk::setRotation( const QString& ) |
348 | 344 | ||
349 | The default rotation of the associated application. This | 345 | The default rotation of the associated application. This |
350 | function is included inline for binary compatible issues | 346 | function is included inline for binary compatible issues |
351 | */ | 347 | */ |
352 | /*! | 348 | /*! |
353 | Creates an invalid AppLnk. | 349 | Creates an invalid AppLnk. |
354 | 350 | ||
355 | \sa isValid() | 351 | \sa isValid() |
356 | */ | 352 | */ |
357 | AppLnk::AppLnk() | 353 | AppLnk::AppLnk() |
358 | { | 354 | { |
359 | mId = 0; | 355 | mId = 0; |
360 | d = new AppLnkPrivate(); | 356 | d = new AppLnkPrivate(); |
361 | } | 357 | } |
362 | 358 | ||
363 | /*! | 359 | /*! |
364 | Loads \a file (e.g. \e app.desktop) as an AppLnk. | 360 | Loads \a file (e.g. \e app.desktop) as an AppLnk. |
365 | 361 | ||
366 | \sa writeLink() | 362 | \sa writeLink() |
367 | */ | 363 | */ |
368 | AppLnk::AppLnk( const QString &file ) | 364 | AppLnk::AppLnk( const QString &file ) |
369 | { | 365 | { |
370 | QStringList sl; | 366 | QStringList sl; |
371 | d = new AppLnkPrivate(); | 367 | d = new AppLnkPrivate(); |
372 | if ( !file.isNull() ) { | 368 | if ( !file.isNull() ) { |
373 | Config config( file, Config::File ); | 369 | Config config( file, Config::File ); |
374 | 370 | ||
375 | if ( config.isValid() ) { | 371 | if ( config.isValid() ) { |
376 | config.setGroup( "Desktop Entry" ); | 372 | config.setGroup( "Desktop Entry" ); |
377 | 373 | ||
378 | mName = config.readEntry( "Name", file ); | 374 | mName = config.readEntry( "Name", file ); |
379 | mExec = config.readEntry( "Exec" ); | 375 | mExec = config.readEntry( "Exec" ); |
380 | mType = config.readEntry( "Type", QString::null ); | 376 | mType = config.readEntry( "Type", QString::null ); |
381 | mIconFile = config.readEntry( "Icon", QString::null ); | 377 | mIconFile = config.readEntry( "Icon", QString::null ); |
382 | mRotation = config.readEntry( "Rotation", "" ); | 378 | mRotation = config.readEntry( "Rotation", "" ); |
383 | mComment = config.readEntry( "Comment", QString::null ); | 379 | mComment = config.readEntry( "Comment", QString::null ); |
384 | // MIME types are case-insensitive. | 380 | // MIME types are case-insensitive. |
385 | mMimeTypes = config.readListEntry( "MimeType", ';' ); | 381 | mMimeTypes = config.readListEntry( "MimeType", ';' ); |
386 | for (QStringList::Iterator it=mMimeTypes.begin(); it!=mMimeTypes.end(); ++it) | 382 | for (QStringList::Iterator it=mMimeTypes.begin(); it!=mMimeTypes.end(); ++it) |
387 | *it = (*it).lower(); | 383 | *it = (*it).lower(); |
388 | mMimeTypeIcons = config.readListEntry( "MimeTypeIcons", ';' ); | 384 | mMimeTypeIcons = config.readListEntry( "MimeTypeIcons", ';' ); |
389 | mLinkFile = file; | 385 | mLinkFile = file; |
390 | mFile = config.readEntry("File", QString::null); | 386 | mFile = config.readEntry("File", QString::null); |
391 | if ( !mExec. isEmpty ( )) { | 387 | if ( !mExec. isEmpty ( )) { |
392 | mFile = QString::null; | 388 | mFile = QString::null; |
393 | } | 389 | } |
394 | else if ( mFile[0] != '/' ) { | 390 | else if ( mFile[0] != '/' ) { |
395 | int slash = file.findRev('/'); | 391 | int slash = file.findRev('/'); |
396 | if ( slash >= 0 ) { | 392 | if ( slash >= 0 ) { |
397 | mFile = file.left(slash) + '/' + mFile; | 393 | mFile = file.left(slash) + '/' + mFile; |
398 | } | 394 | } |
399 | } | 395 | } |
400 | d->mCatList = config.readListEntry("Categories", ';'); | 396 | d->mCatList = config.readListEntry("Categories", ';'); |
401 | if ( d->mCatList[0].toInt() < -1 ) { | 397 | if ( d->mCatList[0].toInt() < -1 ) { |
402 | // numeric cats in file! convert to text | 398 | // numeric cats in file! convert to text |
403 | Categories cat( 0 ); | 399 | Categories cat( 0 ); |
404 | cat.load( categoryFileName() ); | 400 | cat.load( categoryFileName() ); |
405 | d->mCat.resize( d->mCatList.count() ); | 401 | d->mCat.resize( d->mCatList.count() ); |
406 | int i; | 402 | int i; |
407 | QStringList::ConstIterator it; | 403 | QStringList::ConstIterator it; |
408 | for ( i = 0, it = d->mCatList.begin(); it != d->mCatList.end(); | 404 | for ( i = 0, it = d->mCatList.begin(); it != d->mCatList.end(); |
409 | ++it, i++ ) { | 405 | ++it, i++ ) { |
410 | bool number; | 406 | bool number; |
411 | int id = (*it).toInt( &number ); | 407 | int id = (*it).toInt( &number ); |
412 | if ( !number ) { | 408 | if ( !number ) { |
413 | // convert from text | 409 | // convert from text |
414 | id = cat.id( "Document View", *it ); | 410 | id = cat.id( "Document View", *it ); |
415 | if ( id == 0 ) | 411 | if ( id == 0 ) |
416 | id = cat.addCategory( "Document View", *it ); | 412 | id = cat.addCategory( "Document View", *it ); |
417 | } | 413 | } |
418 | d->mCat[i] = id; | 414 | d->mCat[i] = id; |
419 | } | 415 | } |
420 | d->updateCatListFromArray(); | 416 | d->updateCatListFromArray(); |
421 | } | 417 | } |
422 | } | 418 | } |
423 | } | 419 | } |
424 | mId = 0; | 420 | mId = 0; |
425 | } | 421 | } |
diff --git a/library/categoryedit_p.cpp b/library/categoryedit_p.cpp index 9321259..14ac2e1 100644 --- a/library/categoryedit_p.cpp +++ b/library/categoryedit_p.cpp | |||
@@ -1,230 +1,227 @@ | |||
1 | /********************************************************************** | 1 | /********************************************************************** |
2 | ** Copyright (C) 2001 Trolltech AS. All rights reserved. | 2 | ** Copyright (C) 2001 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 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 | 20 | ||
21 | #include "categoryedit_p.h" | 21 | #include "categoryedit_p.h" |
22 | 22 | ||
23 | #include <qpe/categories.h> | 23 | #include <qpe/categories.h> |
24 | 24 | ||
25 | #include <qdir.h> | 25 | #include <qdir.h> |
26 | #include <qcheckbox.h> | 26 | #include <qcheckbox.h> |
27 | #include <qlineedit.h> | 27 | #include <qlineedit.h> |
28 | #include <qlistview.h> | ||
29 | #include <qstringlist.h> | ||
30 | #include <qtoolbutton.h> | ||
31 | 28 | ||
32 | #include <sys/types.h> | 29 | #include <sys/types.h> |
33 | #include <sys/stat.h> | 30 | #include <sys/stat.h> |
34 | 31 | ||
35 | #include <stdlib.h> | 32 | #include <stdlib.h> |
36 | 33 | ||
37 | 34 | ||
38 | using namespace Qtopia; | 35 | using namespace Qtopia; |
39 | 36 | ||
40 | class CategoryEditPrivate | 37 | class CategoryEditPrivate |
41 | { | 38 | { |
42 | public: | 39 | public: |
43 | CategoryEditPrivate( QWidget *parent, const QString &appName ) | 40 | CategoryEditPrivate( QWidget *parent, const QString &appName ) |
44 | : mCategories( parent, "" ), | 41 | : mCategories( parent, "" ), |
45 | mStrApp( appName ) | 42 | mStrApp( appName ) |
46 | { | 43 | { |
47 | editItem = 0; | 44 | editItem = 0; |
48 | mCategories.load( categoryFileName() ); | 45 | mCategories.load( categoryFileName() ); |
49 | } | 46 | } |
50 | Categories mCategories; | 47 | Categories mCategories; |
51 | QListViewItem *editItem; | 48 | QListViewItem *editItem; |
52 | QString mStrApp; | 49 | QString mStrApp; |
53 | QString mVisible; | 50 | QString mVisible; |
54 | }; | 51 | }; |
55 | 52 | ||
56 | CategoryEdit::CategoryEdit( QWidget *parent, const char *name ) | 53 | CategoryEdit::CategoryEdit( QWidget *parent, const char *name ) |
57 | : CategoryEditBase( parent, name ) | 54 | : CategoryEditBase( parent, name ) |
58 | { | 55 | { |
59 | d = 0; | 56 | d = 0; |
60 | } | 57 | } |
61 | 58 | ||
62 | CategoryEdit::CategoryEdit( const QArray<int> &recCats, | 59 | CategoryEdit::CategoryEdit( const QArray<int> &recCats, |
63 | const QString &appName, const QString &visibleName, | 60 | const QString &appName, const QString &visibleName, |
64 | QWidget *parent, const char *name ) | 61 | QWidget *parent, const char *name ) |
65 | : CategoryEditBase( parent, name ) | 62 | : CategoryEditBase( parent, name ) |
66 | { | 63 | { |
67 | d = 0; | 64 | d = 0; |
68 | setCategories( recCats, appName, visibleName ); | 65 | setCategories( recCats, appName, visibleName ); |
69 | } | 66 | } |
70 | 67 | ||
71 | void CategoryEdit::setCategories( const QArray<int> &recCats, | 68 | void CategoryEdit::setCategories( const QArray<int> &recCats, |
72 | const QString &appName, const QString &visibleName ) | 69 | const QString &appName, const QString &visibleName ) |
73 | { | 70 | { |
74 | if ( !d ) | 71 | if ( !d ) |
75 | d = new CategoryEditPrivate( (QWidget*)parent(), name() ); | 72 | d = new CategoryEditPrivate( (QWidget*)parent(), name() ); |
76 | d->mStrApp = appName; | 73 | d->mStrApp = appName; |
77 | d->mVisible = visibleName; | 74 | d->mVisible = visibleName; |
78 | 75 | ||
79 | QStringList appCats = d->mCategories.labels( d->mStrApp ); | 76 | QStringList appCats = d->mCategories.labels( d->mStrApp ); |
80 | QArray<int> cats = d->mCategories.ids(d->mStrApp, appCats); | 77 | QArray<int> cats = d->mCategories.ids(d->mStrApp, appCats); |
81 | lvView->clear(); | 78 | lvView->clear(); |
82 | 79 | ||
83 | QStringList::ConstIterator it; | 80 | QStringList::ConstIterator it; |
84 | int i, j; | 81 | int i, j; |
85 | for ( i = 0, it = appCats.begin(); it != appCats.end(); i++, ++it ) { | 82 | for ( i = 0, it = appCats.begin(); it != appCats.end(); i++, ++it ) { |
86 | QCheckListItem *chk; | 83 | QCheckListItem *chk; |
87 | chk = new QCheckListItem( lvView, (*it), QCheckListItem::CheckBox ); | 84 | chk = new QCheckListItem( lvView, (*it), QCheckListItem::CheckBox ); |
88 | if ( !d->mCategories.isGlobal((*it)) ) | 85 | if ( !d->mCategories.isGlobal((*it)) ) |
89 | chk->setText( 1, tr(d->mVisible) ); | 86 | chk->setText( 1, tr(d->mVisible) ); |
90 | else | 87 | else |
91 | chk->setText( 1, tr("All") ); | 88 | chk->setText( 1, tr("All") ); |
92 | // Is this record using this category, then we should check it | 89 | // Is this record using this category, then we should check it |
93 | for ( j = 0; j < int(recCats.count()); j++ ) { | 90 | for ( j = 0; j < int(recCats.count()); j++ ) { |
94 | if ( cats[i] == recCats[j] ) { | 91 | if ( cats[i] == recCats[j] ) { |
95 | chk->setOn( true ); | 92 | chk->setOn( true ); |
96 | break; | 93 | break; |
97 | } | 94 | } |
98 | } | 95 | } |
99 | } | 96 | } |
100 | lvView->setSorting( 0, TRUE ); | 97 | lvView->setSorting( 0, TRUE ); |
101 | lvView->sort(); | 98 | lvView->sort(); |
102 | if ( lvView->childCount() < 1 ) | 99 | if ( lvView->childCount() < 1 ) |
103 | txtCat->setEnabled( FALSE ); | 100 | txtCat->setEnabled( FALSE ); |
104 | else { | 101 | else { |
105 | lvView->setSelected( lvView->firstChild(), true ); | 102 | lvView->setSelected( lvView->firstChild(), true ); |
106 | } | 103 | } |
107 | } | 104 | } |
108 | 105 | ||
109 | CategoryEdit::~CategoryEdit() | 106 | CategoryEdit::~CategoryEdit() |
110 | { | 107 | { |
111 | if ( d ) | 108 | if ( d ) |
112 | delete d; | 109 | delete d; |
113 | } | 110 | } |
114 | 111 | ||
115 | void CategoryEdit::slotSetText( QListViewItem *selected ) | 112 | void CategoryEdit::slotSetText( QListViewItem *selected ) |
116 | { | 113 | { |
117 | d->editItem = selected; | 114 | d->editItem = selected; |
118 | if ( !d->editItem ) | 115 | if ( !d->editItem ) |
119 | return; | 116 | return; |
120 | txtCat->setText( d->editItem->text(0) ); | 117 | txtCat->setText( d->editItem->text(0) ); |
121 | txtCat->setEnabled( true ); | 118 | txtCat->setEnabled( true ); |
122 | if ( d->editItem->text(1) == tr("All") ) | 119 | if ( d->editItem->text(1) == tr("All") ) |
123 | chkGlobal->setChecked( true ); | 120 | chkGlobal->setChecked( true ); |
124 | else | 121 | else |
125 | chkGlobal->setChecked( false ); | 122 | chkGlobal->setChecked( false ); |
126 | } | 123 | } |
127 | 124 | ||
128 | void CategoryEdit::slotAdd() | 125 | void CategoryEdit::slotAdd() |
129 | { | 126 | { |
130 | QString name = tr( "New Category" ); | 127 | QString name = tr( "New Category" ); |
131 | bool insertOk = FALSE; | 128 | bool insertOk = FALSE; |
132 | int num = 0; | 129 | int num = 0; |
133 | while ( !insertOk ) { | 130 | while ( !insertOk ) { |
134 | if ( num++ > 0 ) | 131 | if ( num++ > 0 ) |
135 | name = tr("New Category ") + QString::number(num); | 132 | name = tr("New Category ") + QString::number(num); |
136 | insertOk = d->mCategories.addCategory( d->mStrApp, name ); | 133 | insertOk = d->mCategories.addCategory( d->mStrApp, name ); |
137 | } | 134 | } |
138 | QCheckListItem *chk; | 135 | QCheckListItem *chk; |
139 | chk = new QCheckListItem( lvView, name, QCheckListItem::CheckBox ); | 136 | chk = new QCheckListItem( lvView, name, QCheckListItem::CheckBox ); |
140 | if ( !chkGlobal->isChecked() ) | 137 | if ( !chkGlobal->isChecked() ) |
141 | chk->setText( 1, tr(d->mVisible) ); | 138 | chk->setText( 1, tr(d->mVisible) ); |
142 | else | 139 | else |
143 | chk->setText( 1, tr("All") ); | 140 | chk->setText( 1, tr("All") ); |
144 | 141 | ||
145 | lvView->setSelected( chk, TRUE ); | 142 | lvView->setSelected( chk, TRUE ); |
146 | txtCat->selectAll(); | 143 | txtCat->selectAll(); |
147 | txtCat->setFocus(); | 144 | txtCat->setFocus(); |
148 | } | 145 | } |
149 | 146 | ||
150 | void CategoryEdit::slotRemove() | 147 | void CategoryEdit::slotRemove() |
151 | { | 148 | { |
152 | d->editItem = lvView->selectedItem(); | 149 | d->editItem = lvView->selectedItem(); |
153 | if ( d->editItem ) { | 150 | if ( d->editItem ) { |
154 | QListViewItem *sibling = d->editItem->nextSibling(); | 151 | QListViewItem *sibling = d->editItem->nextSibling(); |
155 | 152 | ||
156 | d->mCategories.removeCategory( d->mStrApp, d->editItem->text(0) ); | 153 | d->mCategories.removeCategory( d->mStrApp, d->editItem->text(0) ); |
157 | 154 | ||
158 | delete d->editItem; | 155 | delete d->editItem; |
159 | d->editItem = 0; | 156 | d->editItem = 0; |
160 | 157 | ||
161 | if ( sibling ) | 158 | if ( sibling ) |
162 | lvView->setSelected( sibling, TRUE ); | 159 | lvView->setSelected( sibling, TRUE ); |
163 | } | 160 | } |
164 | if ( lvView->childCount() < 1 ) { | 161 | if ( lvView->childCount() < 1 ) { |
165 | txtCat->clear(); | 162 | txtCat->clear(); |
166 | txtCat->setEnabled( FALSE ); | 163 | txtCat->setEnabled( FALSE ); |
167 | } | 164 | } |
168 | } | 165 | } |
169 | 166 | ||
170 | void CategoryEdit::slotSetGlobal( bool isChecked ) | 167 | void CategoryEdit::slotSetGlobal( bool isChecked ) |
171 | { | 168 | { |
172 | if ( d->editItem ) { | 169 | if ( d->editItem ) { |
173 | if ( isChecked ) | 170 | if ( isChecked ) |
174 | d->editItem->setText( 1, tr("All") ); | 171 | d->editItem->setText( 1, tr("All") ); |
175 | else | 172 | else |
176 | d->editItem->setText( 1, tr(d->mVisible) ); | 173 | d->editItem->setText( 1, tr(d->mVisible) ); |
177 | 174 | ||
178 | d->mCategories.setGlobal( d->mStrApp, d->editItem->text( 0 ), isChecked ); | 175 | d->mCategories.setGlobal( d->mStrApp, d->editItem->text( 0 ), isChecked ); |
179 | } | 176 | } |
180 | } | 177 | } |
181 | 178 | ||
182 | void CategoryEdit::slotTextChanged( const QString &strNew ) | 179 | void CategoryEdit::slotTextChanged( const QString &strNew ) |
183 | { | 180 | { |
184 | if ( d->editItem ) { | 181 | if ( d->editItem ) { |
185 | if ( chkGlobal->isChecked() ) | 182 | if ( chkGlobal->isChecked() ) |
186 | d->mCategories.renameGlobalCategory( d->editItem->text(0), strNew ); | 183 | d->mCategories.renameGlobalCategory( d->editItem->text(0), strNew ); |
187 | else | 184 | else |
188 | d->mCategories.renameCategory( d->mStrApp, d->editItem->text(0), strNew ); | 185 | d->mCategories.renameCategory( d->mStrApp, d->editItem->text(0), strNew ); |
189 | d->editItem->setText( 0, strNew ); | 186 | d->editItem->setText( 0, strNew ); |
190 | } | 187 | } |
191 | } | 188 | } |
192 | 189 | ||
193 | QArray<int> CategoryEdit::newCategories() | 190 | QArray<int> CategoryEdit::newCategories() |
194 | { | 191 | { |
195 | QArray<int> a; | 192 | QArray<int> a; |
196 | if ( d ) { | 193 | if ( d ) { |
197 | d->mCategories.save( categoryFileName() ); | 194 | d->mCategories.save( categoryFileName() ); |
198 | QListViewItemIterator it( lvView ); | 195 | QListViewItemIterator it( lvView ); |
199 | QValueList<int> l; | 196 | QValueList<int> l; |
200 | for ( ; it.current(); ++it ) { | 197 | for ( ; it.current(); ++it ) { |
201 | if ( reinterpret_cast<QCheckListItem*>(it.current())->isOn() ) | 198 | if ( reinterpret_cast<QCheckListItem*>(it.current())->isOn() ) |
202 | l.append( d->mCategories.id( d->mStrApp, it.current()->text(0) ) ); | 199 | l.append( d->mCategories.id( d->mStrApp, it.current()->text(0) ) ); |
203 | } | 200 | } |
204 | uint i = 0; | 201 | uint i = 0; |
205 | a.resize( l.count() ); | 202 | a.resize( l.count() ); |
206 | for ( QValueList<int>::Iterator lit = l.begin(); lit != l.end(); ++lit ) | 203 | for ( QValueList<int>::Iterator lit = l.begin(); lit != l.end(); ++lit ) |
207 | a[i++] = *lit; | 204 | a[i++] = *lit; |
208 | } | 205 | } |
209 | return a; | 206 | return a; |
210 | } | 207 | } |
211 | 208 | ||
212 | void CategoryEdit::accept() | 209 | void CategoryEdit::accept() |
213 | { | 210 | { |
214 | // write our categories out... | 211 | // write our categories out... |
215 | d->mCategories.save( categoryFileName() ); | 212 | d->mCategories.save( categoryFileName() ); |
216 | // QDialog::accept(); | 213 | // QDialog::accept(); |
217 | } | 214 | } |
218 | 215 | ||
219 | QString categoryFileName() | 216 | QString categoryFileName() |
220 | { | 217 | { |
221 | QDir dir = (QString(getenv("HOME")) + "/Settings"); | 218 | QDir dir = (QString(getenv("HOME")) + "/Settings"); |
222 | if ( !dir.exists() ) | 219 | if ( !dir.exists() ) |
223 | mkdir( dir.path().local8Bit(), 0700 ); | 220 | mkdir( dir.path().local8Bit(), 0700 ); |
224 | return dir.path() + "/" + "Categories" + ".xml"; | 221 | return dir.path() + "/" + "Categories" + ".xml"; |
225 | } | 222 | } |
226 | 223 | ||
227 | void CategoryEdit::kludge() | 224 | void CategoryEdit::kludge() |
228 | { | 225 | { |
229 | lvView->setMaximumHeight( 130 ); | 226 | lvView->setMaximumHeight( 130 ); |
230 | } | 227 | } |
diff --git a/library/categorymenu.cpp b/library/categorymenu.cpp index 5d7adf7..9bbb448 100644 --- a/library/categorymenu.cpp +++ b/library/categorymenu.cpp | |||
@@ -1,162 +1,160 @@ | |||
1 | /********************************************************************** | 1 | /********************************************************************** |
2 | ** Copyright (C) 2001 Trolltech AS. All rights reserved. | 2 | ** Copyright (C) 2001 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 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 | 20 | ||
21 | #include "categorymenu.h" | 21 | #include "categorymenu.h" |
22 | #include "backend/categories.h" | 22 | #include "backend/categories.h" |
23 | #include "categoryselect.h" | 23 | #include "categoryselect.h" |
24 | #include <qstring.h> | ||
25 | #include <qmap.h> | ||
26 | 24 | ||
27 | /*! | 25 | /*! |
28 | \class CategoryMenu | 26 | \class CategoryMenu |
29 | \brief The CategoryMenu widget aids in filtering records or files by Category. | 27 | \brief The CategoryMenu widget aids in filtering records or files by Category. |
30 | 28 | ||
31 | The CategoryMenu widget provides a popup menu that will make filtering records | 29 | The CategoryMenu widget provides a popup menu that will make filtering records |
32 | or files by category much easier. The widget will lookup the available | 30 | or files by category much easier. The widget will lookup the available |
33 | categories for an application, populate the menu, and keep a track of which | 31 | categories for an application, populate the menu, and keep a track of which |
34 | categories are being filtered against. A set of categories can be tested | 32 | categories are being filtered against. A set of categories can be tested |
35 | by the isSelected() function to see if a record or file containing those | 33 | by the isSelected() function to see if a record or file containing those |
36 | categories would be allowed through by the filter. | 34 | categories would be allowed through by the filter. |
37 | 35 | ||
38 | \warning Currently this class is not suitable for extending. | 36 | \warning Currently this class is not suitable for extending. |
39 | 37 | ||
40 | \ingroup qtopiaemb | 38 | \ingroup qtopiaemb |
41 | */ | 39 | */ |
42 | 40 | ||
43 | /*! | 41 | /*! |
44 | \fn void CategoryMenu::categoryChange() | 42 | \fn void CategoryMenu::categoryChange() |
45 | This signal is emitted when the user selects a different category in the | 43 | This signal is emitted when the user selects a different category in the |
46 | menu, hence changing what records or files should be selected. | 44 | menu, hence changing what records or files should be selected. |
47 | */ | 45 | */ |
48 | 46 | ||
49 | /*! | 47 | /*! |
50 | Creates a new CategoryMenu with \a parent and \a name. The menu will be | 48 | Creates a new CategoryMenu with \a parent and \a name. The menu will be |
51 | populated with the available categories for \a application. | 49 | populated with the available categories for \a application. |
52 | 50 | ||
53 | If \a globals is TRUE then it will also poplulate the menu with the | 51 | If \a globals is TRUE then it will also poplulate the menu with the |
54 | global categories. | 52 | global categories. |
55 | */ | 53 | */ |
56 | CategoryMenu::CategoryMenu( const QString &n, bool ig = TRUE, | 54 | CategoryMenu::CategoryMenu( const QString &n, bool ig = TRUE, |
57 | QWidget *parent, const char *name ) : | 55 | QWidget *parent, const char *name ) : |
58 | QPopupMenu(parent, name), | 56 | QPopupMenu(parent, name), |
59 | appName(n), | 57 | appName(n), |
60 | includeGlobal(ig) | 58 | includeGlobal(ig) |
61 | { | 59 | { |
62 | currentMid = 1; | 60 | currentMid = 1; |
63 | reload(); | 61 | reload(); |
64 | connect(this, SIGNAL(activated(int)), this, SLOT(mapMenuId(int))); | 62 | connect(this, SIGNAL(activated(int)), this, SLOT(mapMenuId(int))); |
65 | } | 63 | } |
66 | 64 | ||
67 | /*! | 65 | /*! |
68 | Destroys a CategoryMenu. | 66 | Destroys a CategoryMenu. |
69 | */ | 67 | */ |
70 | CategoryMenu::~CategoryMenu( ) | 68 | CategoryMenu::~CategoryMenu( ) |
71 | { | 69 | { |
72 | } | 70 | } |
73 | 71 | ||
74 | /*! | 72 | /*! |
75 | Repopulates the widget's list of available categories. | 73 | Repopulates the widget's list of available categories. |
76 | */ | 74 | */ |
77 | void CategoryMenu::reload() | 75 | void CategoryMenu::reload() |
78 | { | 76 | { |
79 | clear(); | 77 | clear(); |
80 | Categories c; | 78 | Categories c; |
81 | 79 | ||
82 | c.load(categoryFileName()); | 80 | c.load(categoryFileName()); |
83 | 81 | ||
84 | QStringList sl = c.labels(appName, includeGlobal); | 82 | QStringList sl = c.labels(appName, includeGlobal); |
85 | int mid = 1; | 83 | int mid = 1; |
86 | 84 | ||
87 | insertItem(tr("All"), mid); | 85 | insertItem(tr("All"), mid); |
88 | mid++; | 86 | mid++; |
89 | insertItem(tr("Unfiled"), mid); | 87 | insertItem(tr("Unfiled"), mid); |
90 | mid++; | 88 | mid++; |
91 | 89 | ||
92 | for (QStringList::Iterator it = sl.begin(); | 90 | for (QStringList::Iterator it = sl.begin(); |
93 | it != sl.end(); ++it ) { | 91 | it != sl.end(); ++it ) { |
94 | int cid = c.id(appName, *it); | 92 | int cid = c.id(appName, *it); |
95 | insertItem(*it, mid); | 93 | insertItem(*it, mid); |
96 | menuToId.insert(mid, cid); | 94 | menuToId.insert(mid, cid); |
97 | idToMenu.insert(cid, mid); | 95 | idToMenu.insert(cid, mid); |
98 | mid++; | 96 | mid++; |
99 | } | 97 | } |
100 | 98 | ||
101 | setItemChecked(currentMid, TRUE ); | 99 | setItemChecked(currentMid, TRUE ); |
102 | } | 100 | } |
103 | 101 | ||
104 | /*! | 102 | /*! |
105 | \internal | 103 | \internal |
106 | */ | 104 | */ |
107 | void CategoryMenu::mapMenuId(int id) | 105 | void CategoryMenu::mapMenuId(int id) |
108 | { | 106 | { |
109 | if (id == currentMid) | 107 | if (id == currentMid) |
110 | return; | 108 | return; |
111 | setItemChecked( currentMid, FALSE ); | 109 | setItemChecked( currentMid, FALSE ); |
112 | setItemChecked( id, TRUE ); | 110 | setItemChecked( id, TRUE ); |
113 | currentMid = id; | 111 | currentMid = id; |
114 | 112 | ||
115 | emit categoryChange(); | 113 | emit categoryChange(); |
116 | } | 114 | } |
117 | 115 | ||
118 | /*! | 116 | /*! |
119 | Returns TRUE if a record or file with the set of category ids \a cUids | 117 | Returns TRUE if a record or file with the set of category ids \a cUids |
120 | is allowed by the current selection in the CategoryMenu. | 118 | is allowed by the current selection in the CategoryMenu. |
121 | Otherwise returns FALSE. | 119 | Otherwise returns FALSE. |
122 | */ | 120 | */ |
123 | bool CategoryMenu::isSelected(const QArray<int> &cUids) const | 121 | bool CategoryMenu::isSelected(const QArray<int> &cUids) const |
124 | { | 122 | { |
125 | if (currentMid == 1) | 123 | if (currentMid == 1) |
126 | return TRUE; | 124 | return TRUE; |
127 | 125 | ||
128 | if (currentMid == 2 && cUids.count() == 0) | 126 | if (currentMid == 2 && cUids.count() == 0) |
129 | return TRUE; | 127 | return TRUE; |
130 | 128 | ||
131 | if (cUids.contains(menuToId[currentMid])) | 129 | if (cUids.contains(menuToId[currentMid])) |
132 | return TRUE; | 130 | return TRUE; |
133 | 131 | ||
134 | return FALSE; | 132 | return FALSE; |
135 | } | 133 | } |
136 | 134 | ||
137 | /*! | 135 | /*! |
138 | Sets the menu to have \a newCatUid as the currently selected Category. | 136 | Sets the menu to have \a newCatUid as the currently selected Category. |
139 | */ | 137 | */ |
140 | void CategoryMenu::setCurrentCategory( int newCatUid ) | 138 | void CategoryMenu::setCurrentCategory( int newCatUid ) |
141 | { | 139 | { |
142 | if (!idToMenu.contains(newCatUid)) | 140 | if (!idToMenu.contains(newCatUid)) |
143 | return; | 141 | return; |
144 | 142 | ||
145 | mapMenuId(idToMenu[newCatUid]); | 143 | mapMenuId(idToMenu[newCatUid]); |
146 | } | 144 | } |
147 | 145 | ||
148 | /*! | 146 | /*! |
149 | Sets the menu to allow all category sets. | 147 | Sets the menu to allow all category sets. |
150 | */ | 148 | */ |
151 | void CategoryMenu::setCurrentCategoryAll( ) | 149 | void CategoryMenu::setCurrentCategoryAll( ) |
152 | { | 150 | { |
153 | mapMenuId(1); | 151 | mapMenuId(1); |
154 | } | 152 | } |
155 | 153 | ||
156 | /*! | 154 | /*! |
157 | Sets the menu to allow only empty category sets. | 155 | Sets the menu to allow only empty category sets. |
158 | */ | 156 | */ |
159 | void CategoryMenu::setCurrentCategoryUnfiled( ) | 157 | void CategoryMenu::setCurrentCategoryUnfiled( ) |
160 | { | 158 | { |
161 | mapMenuId(2); | 159 | mapMenuId(2); |
162 | } | 160 | } |
diff --git a/library/config.cpp b/library/config.cpp index b28c771..8b60f60 100644 --- a/library/config.cpp +++ b/library/config.cpp | |||
@@ -1,407 +1,405 @@ | |||
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 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 | 20 | ||
21 | #include <qdir.h> | 21 | #include <qdir.h> |
22 | #include <qfile.h> | ||
23 | #include <qfileinfo.h> | ||
24 | #include <qmessagebox.h> | 22 | #include <qmessagebox.h> |
25 | #if QT_VERSION <= 230 && defined(QT_NO_CODECS) | 23 | #if QT_VERSION <= 230 && defined(QT_NO_CODECS) |
26 | #include <qtextcodec.h> | 24 | #include <qtextcodec.h> |
27 | #endif | 25 | #endif |
28 | #include <qtextstream.h> | 26 | #include <qtextstream.h> |
29 | 27 | ||
30 | #include <sys/stat.h> | 28 | #include <sys/stat.h> |
31 | #include <sys/types.h> | 29 | #include <sys/types.h> |
32 | #include <fcntl.h> | 30 | #include <fcntl.h> |
33 | #include <stdlib.h> | 31 | #include <stdlib.h> |
34 | #include <unistd.h> | 32 | #include <unistd.h> |
35 | 33 | ||
36 | #define QTOPIA_INTERNAL_LANGLIST | 34 | #define QTOPIA_INTERNAL_LANGLIST |
37 | #include "config.h" | 35 | #include "config.h" |
38 | #include "global.h" | 36 | #include "global.h" |
39 | 37 | ||
40 | 38 | ||
41 | /*! | 39 | /*! |
42 | \internal | 40 | \internal |
43 | */ | 41 | */ |
44 | QString Config::configFilename(const QString& name, Domain d) | 42 | QString Config::configFilename(const QString& name, Domain d) |
45 | { | 43 | { |
46 | switch (d) { | 44 | switch (d) { |
47 | case File: | 45 | case File: |
48 | return name; | 46 | return name; |
49 | case User: { | 47 | case User: { |
50 | QDir dir = (QString(getenv("HOME")) + "/Settings"); | 48 | QDir dir = (QString(getenv("HOME")) + "/Settings"); |
51 | if ( !dir.exists() ) | 49 | if ( !dir.exists() ) |
52 | mkdir(dir.path().local8Bit(),0700); | 50 | mkdir(dir.path().local8Bit(),0700); |
53 | return dir.path() + "/" + name + ".conf"; | 51 | return dir.path() + "/" + name + ".conf"; |
54 | } | 52 | } |
55 | } | 53 | } |
56 | return name; | 54 | return name; |
57 | } | 55 | } |
58 | 56 | ||
59 | /*! | 57 | /*! |
60 | \class Config config.h | 58 | \class Config config.h |
61 | \brief The Config class provides for saving application cofniguration state. | 59 | \brief The Config class provides for saving application cofniguration state. |
62 | 60 | ||
63 | You should keep a Config in existence only while you do not want others | 61 | You should keep a Config in existence only while you do not want others |
64 | to be able to change the state. There is no locking currently, but there | 62 | to be able to change the state. There is no locking currently, but there |
65 | may be in the future. | 63 | may be in the future. |
66 | */ | 64 | */ |
67 | 65 | ||
68 | /*! | 66 | /*! |
69 | \enum Config::ConfigGroup | 67 | \enum Config::ConfigGroup |
70 | \internal | 68 | \internal |
71 | */ | 69 | */ |
72 | 70 | ||
73 | /*! | 71 | /*! |
74 | \enum Config::Domain | 72 | \enum Config::Domain |
75 | 73 | ||
76 | \value File | 74 | \value File |
77 | \value User | 75 | \value User |
78 | 76 | ||
79 | See Config for details. | 77 | See Config for details. |
80 | */ | 78 | */ |
81 | 79 | ||
82 | /*! | 80 | /*! |
83 | Constructs a config that will load or create a configuration with the | 81 | Constructs a config that will load or create a configuration with the |
84 | given \a name in the given \a domain. | 82 | given \a name in the given \a domain. |
85 | 83 | ||
86 | You must call setGroup() before doing much else with the Config. | 84 | You must call setGroup() before doing much else with the Config. |
87 | 85 | ||
88 | In the default Domain, \e User, | 86 | In the default Domain, \e User, |
89 | the configuration is user-specific. \a name should not contain "/" in | 87 | the configuration is user-specific. \a name should not contain "/" in |
90 | this case, and in general should be the name of the C++ class that is | 88 | this case, and in general should be the name of the C++ class that is |
91 | primarily responsible for maintaining the configuration. | 89 | primarily responsible for maintaining the configuration. |
92 | 90 | ||
93 | In the File Domain, \a name is an absolute filename. | 91 | In the File Domain, \a name is an absolute filename. |
94 | */ | 92 | */ |
95 | Config::Config( const QString &name, Domain domain ) | 93 | Config::Config( const QString &name, Domain domain ) |
96 | : filename( configFilename(name,domain) ) | 94 | : filename( configFilename(name,domain) ) |
97 | { | 95 | { |
98 | git = groups.end(); | 96 | git = groups.end(); |
99 | read(); | 97 | read(); |
100 | QStringList l = Global::languageList(); | 98 | QStringList l = Global::languageList(); |
101 | lang = l[0]; | 99 | lang = l[0]; |
102 | glang = l[1]; | 100 | glang = l[1]; |
103 | } | 101 | } |
104 | 102 | ||
105 | 103 | ||
106 | // Sharp ROM compatibility | 104 | // Sharp ROM compatibility |
107 | Config::Config ( const QString &name, bool what ) | 105 | Config::Config ( const QString &name, bool what ) |
108 | : filename( configFilename(name,what ? User : File) ) | 106 | : filename( configFilename(name,what ? User : File) ) |
109 | { | 107 | { |
110 | git = groups.end(); | 108 | git = groups.end(); |
111 | read(); | 109 | read(); |
112 | QStringList l = Global::languageList(); | 110 | QStringList l = Global::languageList(); |
113 | lang = l[0]; | 111 | lang = l[0]; |
114 | glang = l[1]; | 112 | glang = l[1]; |
115 | } | 113 | } |
116 | 114 | ||
117 | /*! | 115 | /*! |
118 | Writes any changes to disk and destroys the in-memory object. | 116 | Writes any changes to disk and destroys the in-memory object. |
119 | */ | 117 | */ |
120 | Config::~Config() | 118 | Config::~Config() |
121 | { | 119 | { |
122 | if ( changed ) | 120 | if ( changed ) |
123 | write(); | 121 | write(); |
124 | } | 122 | } |
125 | 123 | ||
126 | /*! | 124 | /*! |
127 | Returns whether the current group has an entry called \a key. | 125 | Returns whether the current group has an entry called \a key. |
128 | */ | 126 | */ |
129 | bool Config::hasKey( const QString &key ) const | 127 | bool Config::hasKey( const QString &key ) const |
130 | { | 128 | { |
131 | if ( groups.end() == git ) | 129 | if ( groups.end() == git ) |
132 | return FALSE; | 130 | return FALSE; |
133 | ConfigGroup::ConstIterator it = ( *git ).find( key ); | 131 | ConfigGroup::ConstIterator it = ( *git ).find( key ); |
134 | return it != ( *git ).end(); | 132 | return it != ( *git ).end(); |
135 | } | 133 | } |
136 | 134 | ||
137 | /*! | 135 | /*! |
138 | Sets the current group for subsequent reading and writing of | 136 | Sets the current group for subsequent reading and writing of |
139 | entries to \a gname. Grouping allows the application to partition the namespace. | 137 | entries to \a gname. Grouping allows the application to partition the namespace. |
140 | 138 | ||
141 | This function must be called prior to any reading or writing | 139 | This function must be called prior to any reading or writing |
142 | of entries. | 140 | of entries. |
143 | 141 | ||
144 | The \a gname must not be empty. | 142 | The \a gname must not be empty. |
145 | */ | 143 | */ |
146 | void Config::setGroup( const QString &gname ) | 144 | void Config::setGroup( const QString &gname ) |
147 | { | 145 | { |
148 | QMap< QString, ConfigGroup>::Iterator it = groups.find( gname ); | 146 | QMap< QString, ConfigGroup>::Iterator it = groups.find( gname ); |
149 | if ( it == groups.end() ) { | 147 | if ( it == groups.end() ) { |
150 | git = groups.insert( gname, ConfigGroup() ); | 148 | git = groups.insert( gname, ConfigGroup() ); |
151 | changed = TRUE; | 149 | changed = TRUE; |
152 | return; | 150 | return; |
153 | } | 151 | } |
154 | git = it; | 152 | git = it; |
155 | } | 153 | } |
156 | 154 | ||
157 | /*! | 155 | /*! |
158 | Writes a (\a key, \a value) entry to the current group. | 156 | Writes a (\a key, \a value) entry to the current group. |
159 | 157 | ||
160 | \sa readEntry() | 158 | \sa readEntry() |
161 | */ | 159 | */ |
162 | void Config::writeEntry( const QString &key, const char* value ) | 160 | void Config::writeEntry( const QString &key, const char* value ) |
163 | { | 161 | { |
164 | writeEntry(key,QString(value)); | 162 | writeEntry(key,QString(value)); |
165 | } | 163 | } |
166 | 164 | ||
167 | /*! | 165 | /*! |
168 | Writes a (\a key, \a value) entry to the current group. | 166 | Writes a (\a key, \a value) entry to the current group. |
169 | 167 | ||
170 | \sa readEntry() | 168 | \sa readEntry() |
171 | */ | 169 | */ |
172 | void Config::writeEntry( const QString &key, const QString &value ) | 170 | void Config::writeEntry( const QString &key, const QString &value ) |
173 | { | 171 | { |
174 | if ( git == groups.end() ) { | 172 | if ( git == groups.end() ) { |
175 | qWarning( "no group set" ); | 173 | qWarning( "no group set" ); |
176 | return; | 174 | return; |
177 | } | 175 | } |
178 | if ( (*git)[key] != value ) { | 176 | if ( (*git)[key] != value ) { |
179 | ( *git ).insert( key, value ); | 177 | ( *git ).insert( key, value ); |
180 | changed = TRUE; | 178 | changed = TRUE; |
181 | } | 179 | } |
182 | } | 180 | } |
183 | 181 | ||
184 | /* | 182 | /* |
185 | Note that the degree of protection offered by the encryption here is | 183 | Note that the degree of protection offered by the encryption here is |
186 | only sufficient to avoid the most casual observation of the configuration | 184 | only sufficient to avoid the most casual observation of the configuration |
187 | files. People with access to the files can write down the contents and | 185 | files. People with access to the files can write down the contents and |
188 | decrypt it using this source code. | 186 | decrypt it using this source code. |
189 | 187 | ||
190 | Conceivably, and at some burden to the user, this encryption could | 188 | Conceivably, and at some burden to the user, this encryption could |
191 | be improved. | 189 | be improved. |
192 | */ | 190 | */ |
193 | static QString encipher(const QString& plain) | 191 | static QString encipher(const QString& plain) |
194 | { | 192 | { |
195 | // mainly, we make it long | 193 | // mainly, we make it long |
196 | QString cipher; | 194 | QString cipher; |
197 | int mix=28730492; | 195 | int mix=28730492; |
198 | for (int i=0; i<(int)plain.length(); i++) { | 196 | for (int i=0; i<(int)plain.length(); i++) { |
199 | int u = plain[i].unicode(); | 197 | int u = plain[i].unicode(); |
200 | int c = u ^ mix; | 198 | int c = u ^ mix; |
201 | QString x = QString::number(c,36); | 199 | QString x = QString::number(c,36); |
202 | cipher.append(QChar('a'+x.length())); | 200 | cipher.append(QChar('a'+x.length())); |
203 | cipher.append(x); | 201 | cipher.append(x); |
204 | mix *= u; | 202 | mix *= u; |
205 | } | 203 | } |
206 | return cipher; | 204 | return cipher; |
207 | } | 205 | } |
208 | 206 | ||
209 | static QString decipher(const QString& cipher) | 207 | static QString decipher(const QString& cipher) |
210 | { | 208 | { |
211 | QString plain; | 209 | QString plain; |
212 | int mix=28730492; | 210 | int mix=28730492; |
213 | for (int i=0; i<(int)cipher.length();) { | 211 | for (int i=0; i<(int)cipher.length();) { |
214 | int l = cipher[i].unicode()-'a'; | 212 | int l = cipher[i].unicode()-'a'; |
215 | QString x = cipher.mid(i+1,l); i+=l+1; | 213 | QString x = cipher.mid(i+1,l); i+=l+1; |
216 | int u = x.toInt(0,36) ^ mix; | 214 | int u = x.toInt(0,36) ^ mix; |
217 | plain.append(QChar(u)); | 215 | plain.append(QChar(u)); |
218 | mix *= u; | 216 | mix *= u; |
219 | } | 217 | } |
220 | return plain; | 218 | return plain; |
221 | } | 219 | } |
222 | 220 | ||
223 | /*! | 221 | /*! |
224 | Writes an encrypted (\a key, \a value) entry to the current group. | 222 | Writes an encrypted (\a key, \a value) entry to the current group. |
225 | 223 | ||
226 | Note that the degree of protection offered by the encryption is | 224 | Note that the degree of protection offered by the encryption is |
227 | only sufficient to avoid the most casual observation of the configuration | 225 | only sufficient to avoid the most casual observation of the configuration |
228 | files. | 226 | files. |
229 | 227 | ||
230 | \sa readEntry() | 228 | \sa readEntry() |
231 | */ | 229 | */ |
232 | void Config::writeEntryCrypt( const QString &key, const QString &value ) | 230 | void Config::writeEntryCrypt( const QString &key, const QString &value ) |
233 | { | 231 | { |
234 | if ( git == groups.end() ) { | 232 | if ( git == groups.end() ) { |
235 | qWarning( "no group set" ); | 233 | qWarning( "no group set" ); |
236 | return; | 234 | return; |
237 | } | 235 | } |
238 | QString evalue = encipher(value); | 236 | QString evalue = encipher(value); |
239 | if ( (*git)[key] != evalue ) { | 237 | if ( (*git)[key] != evalue ) { |
240 | ( *git ).insert( key, evalue ); | 238 | ( *git ).insert( key, evalue ); |
241 | changed = TRUE; | 239 | changed = TRUE; |
242 | } | 240 | } |
243 | } | 241 | } |
244 | 242 | ||
245 | /*! | 243 | /*! |
246 | Writes a (\a key, \a num) entry to the current group. | 244 | Writes a (\a key, \a num) entry to the current group. |
247 | 245 | ||
248 | \sa readNumEntry() | 246 | \sa readNumEntry() |
249 | */ | 247 | */ |
250 | void Config::writeEntry( const QString &key, int num ) | 248 | void Config::writeEntry( const QString &key, int num ) |
251 | { | 249 | { |
252 | QString s; | 250 | QString s; |
253 | s.setNum( num ); | 251 | s.setNum( num ); |
254 | writeEntry( key, s ); | 252 | writeEntry( key, s ); |
255 | } | 253 | } |
256 | 254 | ||
257 | #ifdef Q_HAS_BOOL_TYPE | 255 | #ifdef Q_HAS_BOOL_TYPE |
258 | /*! | 256 | /*! |
259 | Writes a (\a key, \a b) entry to the current group. This is equivalent | 257 | Writes a (\a key, \a b) entry to the current group. This is equivalent |
260 | to writing a 0 or 1 as an integer entry. | 258 | to writing a 0 or 1 as an integer entry. |
261 | 259 | ||
262 | \sa readBoolEntry() | 260 | \sa readBoolEntry() |
263 | */ | 261 | */ |
264 | void Config::writeEntry( const QString &key, bool b ) | 262 | void Config::writeEntry( const QString &key, bool b ) |
265 | { | 263 | { |
266 | QString s; | 264 | QString s; |
267 | s.setNum( ( int )b ); | 265 | s.setNum( ( int )b ); |
268 | writeEntry( key, s ); | 266 | writeEntry( key, s ); |
269 | } | 267 | } |
270 | #endif | 268 | #endif |
271 | 269 | ||
272 | /*! | 270 | /*! |
273 | Writes a (\a key, \a lst) entry to the current group. The list | 271 | Writes a (\a key, \a lst) entry to the current group. The list |
274 | is separated by \a sep, so the strings must not contain that character. | 272 | is separated by \a sep, so the strings must not contain that character. |
275 | 273 | ||
276 | \sa readListEntry() | 274 | \sa readListEntry() |
277 | */ | 275 | */ |
278 | void Config::writeEntry( const QString &key, const QStringList &lst, const QChar &sep ) | 276 | void Config::writeEntry( const QString &key, const QStringList &lst, const QChar &sep ) |
279 | { | 277 | { |
280 | QString s; | 278 | QString s; |
281 | QStringList::ConstIterator it = lst.begin(); | 279 | QStringList::ConstIterator it = lst.begin(); |
282 | for ( ; it != lst.end(); ++it ) | 280 | for ( ; it != lst.end(); ++it ) |
283 | s += *it + sep; | 281 | s += *it + sep; |
284 | writeEntry( key, s ); | 282 | writeEntry( key, s ); |
285 | } | 283 | } |
286 | 284 | ||
287 | /*! | 285 | /*! |
288 | Removes the \a key entry from the current group. Does nothing if | 286 | Removes the \a key entry from the current group. Does nothing if |
289 | there is no such entry. | 287 | there is no such entry. |
290 | */ | 288 | */ |
291 | 289 | ||
292 | void Config::removeEntry( const QString &key ) | 290 | void Config::removeEntry( const QString &key ) |
293 | { | 291 | { |
294 | if ( git == groups.end() ) { | 292 | if ( git == groups.end() ) { |
295 | qWarning( "no group set" ); | 293 | qWarning( "no group set" ); |
296 | return; | 294 | return; |
297 | } | 295 | } |
298 | ( *git ).remove( key ); | 296 | ( *git ).remove( key ); |
299 | changed = TRUE; | 297 | changed = TRUE; |
300 | } | 298 | } |
301 | 299 | ||
302 | /*! | 300 | /*! |
303 | \fn bool Config::operator == ( const Config & other ) const | 301 | \fn bool Config::operator == ( const Config & other ) const |
304 | 302 | ||
305 | Tests for equality with \a other. Config objects are equal if they refer to the same filename. | 303 | Tests for equality with \a other. Config objects are equal if they refer to the same filename. |
306 | */ | 304 | */ |
307 | 305 | ||
308 | /*! | 306 | /*! |
309 | \fn bool Config::operator != ( const Config & other ) const | 307 | \fn bool Config::operator != ( const Config & other ) const |
310 | 308 | ||
311 | Tests for inequality with \a other. Config objects are equal if they refer to the same filename. | 309 | Tests for inequality with \a other. Config objects are equal if they refer to the same filename. |
312 | */ | 310 | */ |
313 | 311 | ||
314 | /*! | 312 | /*! |
315 | \fn QString Config::readEntry( const QString &key, const QString &deflt ) const | 313 | \fn QString Config::readEntry( const QString &key, const QString &deflt ) const |
316 | 314 | ||
317 | Reads a string entry stored with \a key, defaulting to \a deflt if there is no entry. | 315 | Reads a string entry stored with \a key, defaulting to \a deflt if there is no entry. |
318 | */ | 316 | */ |
319 | 317 | ||
320 | /*! | 318 | /*! |
321 | \internal | 319 | \internal |
322 | For compatibility, non-const version. | 320 | For compatibility, non-const version. |
323 | */ | 321 | */ |
324 | QString Config::readEntry( const QString &key, const QString &deflt ) | 322 | QString Config::readEntry( const QString &key, const QString &deflt ) |
325 | { | 323 | { |
326 | QString res = readEntryDirect( key+"["+lang+"]" ); | 324 | QString res = readEntryDirect( key+"["+lang+"]" ); |
327 | if ( !res.isNull() ) | 325 | if ( !res.isNull() ) |
328 | return res; | 326 | return res; |
329 | if ( !glang.isEmpty() ) { | 327 | if ( !glang.isEmpty() ) { |
330 | res = readEntryDirect( key+"["+glang+"]" ); | 328 | res = readEntryDirect( key+"["+glang+"]" ); |
331 | if ( !res.isNull() ) | 329 | if ( !res.isNull() ) |
332 | return res; | 330 | return res; |
333 | } | 331 | } |
334 | return readEntryDirect( key, deflt ); | 332 | return readEntryDirect( key, deflt ); |
335 | } | 333 | } |
336 | 334 | ||
337 | /*! | 335 | /*! |
338 | \fn QString Config::readEntryCrypt( const QString &key, const QString &deflt ) const | 336 | \fn QString Config::readEntryCrypt( const QString &key, const QString &deflt ) const |
339 | 337 | ||
340 | Reads an encrypted string entry stored with \a key, defaulting to \a deflt if there is no entry. | 338 | Reads an encrypted string entry stored with \a key, defaulting to \a deflt if there is no entry. |
341 | */ | 339 | */ |
342 | 340 | ||
343 | /*! | 341 | /*! |
344 | \internal | 342 | \internal |
345 | For compatibility, non-const version. | 343 | For compatibility, non-const version. |
346 | */ | 344 | */ |
347 | QString Config::readEntryCrypt( const QString &key, const QString &deflt ) | 345 | QString Config::readEntryCrypt( const QString &key, const QString &deflt ) |
348 | { | 346 | { |
349 | QString res = readEntryDirect( key+"["+lang+"]" ); | 347 | QString res = readEntryDirect( key+"["+lang+"]" ); |
350 | if ( res.isNull() && glang.isEmpty() ) | 348 | if ( res.isNull() && glang.isEmpty() ) |
351 | res = readEntryDirect( key+"["+glang+"]" ); | 349 | res = readEntryDirect( key+"["+glang+"]" ); |
352 | if ( res.isNull() ) | 350 | if ( res.isNull() ) |
353 | res = readEntryDirect( key, QString::null ); | 351 | res = readEntryDirect( key, QString::null ); |
354 | if ( res.isNull() ) | 352 | if ( res.isNull() ) |
355 | return deflt; | 353 | return deflt; |
356 | return decipher(res); | 354 | return decipher(res); |
357 | } | 355 | } |
358 | 356 | ||
359 | /*! | 357 | /*! |
360 | \fn QString Config::readEntryDirect( const QString &key, const QString &deflt ) const | 358 | \fn QString Config::readEntryDirect( const QString &key, const QString &deflt ) const |
361 | \internal | 359 | \internal |
362 | */ | 360 | */ |
363 | 361 | ||
364 | /*! | 362 | /*! |
365 | \internal | 363 | \internal |
366 | For compatibility, non-const version. | 364 | For compatibility, non-const version. |
367 | */ | 365 | */ |
368 | QString Config::readEntryDirect( const QString &key, const QString &deflt ) | 366 | QString Config::readEntryDirect( const QString &key, const QString &deflt ) |
369 | { | 367 | { |
370 | if ( git == groups.end() ) { | 368 | if ( git == groups.end() ) { |
371 | //qWarning( "no group set" ); | 369 | //qWarning( "no group set" ); |
372 | return deflt; | 370 | return deflt; |
373 | } | 371 | } |
374 | ConfigGroup::ConstIterator it = ( *git ).find( key ); | 372 | ConfigGroup::ConstIterator it = ( *git ).find( key ); |
375 | if ( it != ( *git ).end() ) | 373 | if ( it != ( *git ).end() ) |
376 | return *it; | 374 | return *it; |
377 | else | 375 | else |
378 | return deflt; | 376 | return deflt; |
379 | } | 377 | } |
380 | 378 | ||
381 | /*! | 379 | /*! |
382 | \fn int Config::readNumEntry( const QString &key, int deflt ) const | 380 | \fn int Config::readNumEntry( const QString &key, int deflt ) const |
383 | Reads a numeric entry stored with \a key, defaulting to \a deflt if there is no entry. | 381 | Reads a numeric entry stored with \a key, defaulting to \a deflt if there is no entry. |
384 | */ | 382 | */ |
385 | 383 | ||
386 | /*! | 384 | /*! |
387 | \internal | 385 | \internal |
388 | For compatibility, non-const version. | 386 | For compatibility, non-const version. |
389 | */ | 387 | */ |
390 | int Config::readNumEntry( const QString &key, int deflt ) | 388 | int Config::readNumEntry( const QString &key, int deflt ) |
391 | { | 389 | { |
392 | QString s = readEntry( key ); | 390 | QString s = readEntry( key ); |
393 | if ( s.isEmpty() ) | 391 | if ( s.isEmpty() ) |
394 | return deflt; | 392 | return deflt; |
395 | else | 393 | else |
396 | return s.toInt(); | 394 | return s.toInt(); |
397 | } | 395 | } |
398 | 396 | ||
399 | /*! | 397 | /*! |
400 | \fn bool Config::readBoolEntry( const QString &key, bool deflt ) const | 398 | \fn bool Config::readBoolEntry( const QString &key, bool deflt ) const |
401 | Reads a bool entry stored with \a key, defaulting to \a deflt if there is no entry. | 399 | Reads a bool entry stored with \a key, defaulting to \a deflt if there is no entry. |
402 | */ | 400 | */ |
403 | 401 | ||
404 | /*! | 402 | /*! |
405 | \internal | 403 | \internal |
406 | For compatibility, non-const version. | 404 | For compatibility, non-const version. |
407 | */ | 405 | */ |
diff --git a/library/datebookdb.cpp b/library/datebookdb.cpp index 188d8e1..e4ec2bf 100644 --- a/library/datebookdb.cpp +++ b/library/datebookdb.cpp | |||
@@ -1,417 +1,412 @@ | |||
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 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 | 20 | ||
21 | #include <qasciidict.h> | 21 | #include <qasciidict.h> |
22 | #include <qfile.h> | ||
23 | #include <qmessagebox.h> | 22 | #include <qmessagebox.h> |
24 | #include <qstring.h> | ||
25 | #include <qtextcodec.h> | ||
26 | #include <qtextstream.h> | ||
27 | #include <qtl.h> | 23 | #include <qtl.h> |
28 | 24 | ||
29 | #include <qpe/alarmserver.h> | 25 | #include <qpe/alarmserver.h> |
30 | #include <qpe/global.h> | 26 | #include <qpe/global.h> |
31 | #include "datebookdb.h" | 27 | #include "datebookdb.h" |
32 | #include <qpe/stringutil.h> | 28 | #include <qpe/stringutil.h> |
33 | #include <qpe/timeconversion.h> | ||
34 | 29 | ||
35 | #include <errno.h> | 30 | #include <errno.h> |
36 | #include <stdlib.h> | 31 | #include <stdlib.h> |
37 | 32 | ||
38 | 33 | ||
39 | class DateBookDBPrivate | 34 | class DateBookDBPrivate |
40 | { | 35 | { |
41 | public: | 36 | public: |
42 | bool clean; // indcate whether we need to write to disk... | 37 | bool clean; // indcate whether we need to write to disk... |
43 | }; | 38 | }; |
44 | 39 | ||
45 | 40 | ||
46 | // Helper functions | 41 | // Helper functions |
47 | 42 | ||
48 | static QString dateBookJournalFile() | 43 | static QString dateBookJournalFile() |
49 | { | 44 | { |
50 | QString str = getenv("HOME"); | 45 | QString str = getenv("HOME"); |
51 | return QString( str +"/.caljournal" ); | 46 | return QString( str +"/.caljournal" ); |
52 | } | 47 | } |
53 | 48 | ||
54 | static QString dateBookFilename() | 49 | static QString dateBookFilename() |
55 | { | 50 | { |
56 | return Global::applicationFileName("datebook","datebook.xml"); | 51 | return Global::applicationFileName("datebook","datebook.xml"); |
57 | } | 52 | } |
58 | 53 | ||
59 | /* Calculating the next event of a recuring event is actually | 54 | /* Calculating the next event of a recuring event is actually |
60 | computationally inexpensive, esp. compared to checking each day | 55 | computationally inexpensive, esp. compared to checking each day |
61 | individually. There are bad worse cases for say the 29th of | 56 | individually. There are bad worse cases for say the 29th of |
62 | february or the 31st of some other months. However | 57 | february or the 31st of some other months. However |
63 | these are still bounded */ | 58 | these are still bounded */ |
64 | bool nextOccurance(const Event &e, const QDate &from, QDateTime &next) | 59 | bool nextOccurance(const Event &e, const QDate &from, QDateTime &next) |
65 | { | 60 | { |
66 | // easy checks, first are we too far in the future or too far in the past? | 61 | // easy checks, first are we too far in the future or too far in the past? |
67 | QDate tmpDate; | 62 | QDate tmpDate; |
68 | int freq = e.repeatPattern().frequency; | 63 | int freq = e.repeatPattern().frequency; |
69 | int diff, diff2, a; | 64 | int diff, diff2, a; |
70 | int iday, imonth, iyear; | 65 | int iday, imonth, iyear; |
71 | int dayOfWeek = 0; | 66 | int dayOfWeek = 0; |
72 | int firstOfWeek = 0; | 67 | int firstOfWeek = 0; |
73 | int weekOfMonth; | 68 | int weekOfMonth; |
74 | 69 | ||
75 | 70 | ||
76 | if (e.repeatPattern().hasEndDate && e.repeatPattern().endDate() < from) | 71 | if (e.repeatPattern().hasEndDate && e.repeatPattern().endDate() < from) |
77 | return FALSE; | 72 | return FALSE; |
78 | 73 | ||
79 | if (e.start() >= from) { | 74 | if (e.start() >= from) { |
80 | next = e.start(); | 75 | next = e.start(); |
81 | return TRUE; | 76 | return TRUE; |
82 | } | 77 | } |
83 | 78 | ||
84 | switch ( e.repeatPattern().type ) { | 79 | switch ( e.repeatPattern().type ) { |
85 | case Event::Weekly: | 80 | case Event::Weekly: |
86 | /* weekly is just daily by 7 */ | 81 | /* weekly is just daily by 7 */ |
87 | /* first convert the repeatPattern.Days() mask to the next | 82 | /* first convert the repeatPattern.Days() mask to the next |
88 | day of week valid after from */ | 83 | day of week valid after from */ |
89 | dayOfWeek = from.dayOfWeek(); | 84 | dayOfWeek = from.dayOfWeek(); |
90 | dayOfWeek--; /* we want 0-6, doco for above specs 1-7 */ | 85 | dayOfWeek--; /* we want 0-6, doco for above specs 1-7 */ |
91 | 86 | ||
92 | /* this is done in case freq > 1 and from in week not | 87 | /* this is done in case freq > 1 and from in week not |
93 | for this round */ | 88 | for this round */ |
94 | // firstOfWeek = 0; this is already done at decl. | 89 | // firstOfWeek = 0; this is already done at decl. |
95 | while(!((1 << firstOfWeek) & e.repeatPattern().days)) | 90 | while(!((1 << firstOfWeek) & e.repeatPattern().days)) |
96 | firstOfWeek++; | 91 | firstOfWeek++; |
97 | 92 | ||
98 | 93 | ||
99 | 94 | ||
100 | /* there is at least one 'day', or there would be no event */ | 95 | /* there is at least one 'day', or there would be no event */ |
101 | while(!((1 << (dayOfWeek % 7)) & e.repeatPattern().days)) | 96 | while(!((1 << (dayOfWeek % 7)) & e.repeatPattern().days)) |
102 | dayOfWeek++; | 97 | dayOfWeek++; |
103 | 98 | ||
104 | 99 | ||
105 | dayOfWeek = dayOfWeek % 7; /* the actual day of week */ | 100 | dayOfWeek = dayOfWeek % 7; /* the actual day of week */ |
106 | dayOfWeek -= e.start().date().dayOfWeek() -1; | 101 | dayOfWeek -= e.start().date().dayOfWeek() -1; |
107 | 102 | ||
108 | firstOfWeek = firstOfWeek % 7; /* the actual first of week */ | 103 | firstOfWeek = firstOfWeek % 7; /* the actual first of week */ |
109 | firstOfWeek -= e.start().date().dayOfWeek() -1; | 104 | firstOfWeek -= e.start().date().dayOfWeek() -1; |
110 | 105 | ||
111 | // dayOfWeek may be negitive now | 106 | // dayOfWeek may be negitive now |
112 | // day of week is number of days to add to start day | 107 | // day of week is number of days to add to start day |
113 | 108 | ||
114 | freq *= 7; | 109 | freq *= 7; |
115 | // FALL-THROUGH !!!!! | 110 | // FALL-THROUGH !!!!! |
116 | case Event::Daily: | 111 | case Event::Daily: |
117 | // the add is for the possible fall through from weekly */ | 112 | // the add is for the possible fall through from weekly */ |
118 | if(e.start().date().addDays(dayOfWeek) > from) { | 113 | if(e.start().date().addDays(dayOfWeek) > from) { |
119 | /* first week exception */ | 114 | /* first week exception */ |
120 | next = QDateTime(e.start().date().addDays(dayOfWeek), | 115 | next = QDateTime(e.start().date().addDays(dayOfWeek), |
121 | e.start().time()); | 116 | e.start().time()); |
122 | if ((next.date() > e.repeatPattern().endDate()) | 117 | if ((next.date() > e.repeatPattern().endDate()) |
123 | && e.repeatPattern().hasEndDate) | 118 | && e.repeatPattern().hasEndDate) |
124 | return FALSE; | 119 | return FALSE; |
125 | return TRUE; | 120 | return TRUE; |
126 | } | 121 | } |
127 | /* if from is middle of a non-week */ | 122 | /* if from is middle of a non-week */ |
128 | 123 | ||
129 | diff = e.start().date().addDays(dayOfWeek).daysTo(from) % freq; | 124 | diff = e.start().date().addDays(dayOfWeek).daysTo(from) % freq; |
130 | diff2 = e.start().date().addDays(firstOfWeek).daysTo(from) % freq; | 125 | diff2 = e.start().date().addDays(firstOfWeek).daysTo(from) % freq; |
131 | 126 | ||
132 | if(diff != 0) | 127 | if(diff != 0) |
133 | diff = freq - diff; | 128 | diff = freq - diff; |
134 | if(diff2 != 0) | 129 | if(diff2 != 0) |
135 | diff2 = freq - diff2; | 130 | diff2 = freq - diff2; |
136 | diff = QMIN(diff, diff2); | 131 | diff = QMIN(diff, diff2); |
137 | 132 | ||
138 | next = QDateTime(from.addDays(diff), e.start().time()); | 133 | next = QDateTime(from.addDays(diff), e.start().time()); |
139 | if ( (next.date() > e.repeatPattern().endDate()) | 134 | if ( (next.date() > e.repeatPattern().endDate()) |
140 | && e.repeatPattern().hasEndDate ) | 135 | && e.repeatPattern().hasEndDate ) |
141 | return FALSE; | 136 | return FALSE; |
142 | return TRUE; | 137 | return TRUE; |
143 | case Event::MonthlyDay: | 138 | case Event::MonthlyDay: |
144 | iday = from.day(); | 139 | iday = from.day(); |
145 | iyear = from.year(); | 140 | iyear = from.year(); |
146 | imonth = from.month(); | 141 | imonth = from.month(); |
147 | /* find equivelent day of month for this month */ | 142 | /* find equivelent day of month for this month */ |
148 | dayOfWeek = e.start().date().dayOfWeek(); | 143 | dayOfWeek = e.start().date().dayOfWeek(); |
149 | weekOfMonth = (e.start().date().day() - 1) / 7; | 144 | weekOfMonth = (e.start().date().day() - 1) / 7; |
150 | 145 | ||
151 | /* work out when the next valid month is */ | 146 | /* work out when the next valid month is */ |
152 | a = from.year() - e.start().date().year(); | 147 | a = from.year() - e.start().date().year(); |
153 | a *= 12; | 148 | a *= 12; |
154 | a = a + (imonth - e.start().date().month()); | 149 | a = a + (imonth - e.start().date().month()); |
155 | /* a is e.start()monthsFrom(from); */ | 150 | /* a is e.start()monthsFrom(from); */ |
156 | if(a % freq) { | 151 | if(a % freq) { |
157 | a = freq - (a % freq); | 152 | a = freq - (a % freq); |
158 | imonth = from.month() + a; | 153 | imonth = from.month() + a; |
159 | if (imonth > 12) { | 154 | if (imonth > 12) { |
160 | imonth--; | 155 | imonth--; |
161 | iyear += imonth / 12; | 156 | iyear += imonth / 12; |
162 | imonth = imonth % 12; | 157 | imonth = imonth % 12; |
163 | imonth++; | 158 | imonth++; |
164 | } | 159 | } |
165 | } | 160 | } |
166 | /* imonth is now the first month after or on | 161 | /* imonth is now the first month after or on |
167 | from that matches the frequency given */ | 162 | from that matches the frequency given */ |
168 | 163 | ||
169 | /* find for this month */ | 164 | /* find for this month */ |
170 | tmpDate = QDate( iyear, imonth, 1 ); | 165 | tmpDate = QDate( iyear, imonth, 1 ); |
171 | 166 | ||
172 | iday = 1; | 167 | iday = 1; |
173 | iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7; | 168 | iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7; |
174 | iday += 7 * weekOfMonth; | 169 | iday += 7 * weekOfMonth; |
175 | while (iday > tmpDate.daysInMonth()) { | 170 | while (iday > tmpDate.daysInMonth()) { |
176 | imonth += freq; | 171 | imonth += freq; |
177 | if (imonth > 12) { | 172 | if (imonth > 12) { |
178 | imonth--; | 173 | imonth--; |
179 | iyear += imonth / 12; | 174 | iyear += imonth / 12; |
180 | imonth = imonth % 12; | 175 | imonth = imonth % 12; |
181 | imonth++; | 176 | imonth++; |
182 | } | 177 | } |
183 | tmpDate = QDate( iyear, imonth, 1 ); | 178 | tmpDate = QDate( iyear, imonth, 1 ); |
184 | /* these loops could go for a while, check end case now */ | 179 | /* these loops could go for a while, check end case now */ |
185 | if ((tmpDate > e.repeatPattern().endDate()) && e.repeatPattern().hasEndDate) | 180 | if ((tmpDate > e.repeatPattern().endDate()) && e.repeatPattern().hasEndDate) |
186 | return FALSE; | 181 | return FALSE; |
187 | iday = 1; | 182 | iday = 1; |
188 | iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7; | 183 | iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7; |
189 | iday += 7 * weekOfMonth; | 184 | iday += 7 * weekOfMonth; |
190 | } | 185 | } |
191 | tmpDate = QDate(iyear, imonth, iday); | 186 | tmpDate = QDate(iyear, imonth, iday); |
192 | 187 | ||
193 | if (tmpDate >= from) { | 188 | if (tmpDate >= from) { |
194 | next = QDateTime(tmpDate, e.start().time()); | 189 | next = QDateTime(tmpDate, e.start().time()); |
195 | if ((next.date() > e.repeatPattern().endDate()) && e.repeatPattern().hasEndDate) | 190 | if ((next.date() > e.repeatPattern().endDate()) && e.repeatPattern().hasEndDate) |
196 | return FALSE; | 191 | return FALSE; |
197 | return TRUE; | 192 | return TRUE; |
198 | } | 193 | } |
199 | 194 | ||
200 | /* need to find the next iteration */ | 195 | /* need to find the next iteration */ |
201 | do { | 196 | do { |
202 | imonth += freq; | 197 | imonth += freq; |
203 | if (imonth > 12) { | 198 | if (imonth > 12) { |
204 | imonth--; | 199 | imonth--; |
205 | iyear += imonth / 12; | 200 | iyear += imonth / 12; |
206 | imonth = imonth % 12; | 201 | imonth = imonth % 12; |
207 | imonth++; | 202 | imonth++; |
208 | } | 203 | } |
209 | tmpDate = QDate( iyear, imonth, 1 ); | 204 | tmpDate = QDate( iyear, imonth, 1 ); |
210 | /* these loops could go for a while, check end case now */ | 205 | /* these loops could go for a while, check end case now */ |
211 | if ((tmpDate > e.repeatPattern().endDate()) && e.repeatPattern().hasEndDate) | 206 | if ((tmpDate > e.repeatPattern().endDate()) && e.repeatPattern().hasEndDate) |
212 | return FALSE; | 207 | return FALSE; |
213 | iday = 1; | 208 | iday = 1; |
214 | iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7; | 209 | iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7; |
215 | iday += 7 * weekOfMonth; | 210 | iday += 7 * weekOfMonth; |
216 | } while (iday > tmpDate.daysInMonth()); | 211 | } while (iday > tmpDate.daysInMonth()); |
217 | tmpDate = QDate(iyear, imonth, iday); | 212 | tmpDate = QDate(iyear, imonth, iday); |
218 | 213 | ||
219 | next = QDateTime(tmpDate, e.start().time()); | 214 | next = QDateTime(tmpDate, e.start().time()); |
220 | if ((next.date() > e.repeatPattern().endDate()) && e.repeatPattern().hasEndDate) | 215 | if ((next.date() > e.repeatPattern().endDate()) && e.repeatPattern().hasEndDate) |
221 | return FALSE; | 216 | return FALSE; |
222 | return TRUE; | 217 | return TRUE; |
223 | case Event::MonthlyDate: | 218 | case Event::MonthlyDate: |
224 | iday = e.start().date().day(); | 219 | iday = e.start().date().day(); |
225 | iyear = from.year(); | 220 | iyear = from.year(); |
226 | imonth = from.month(); | 221 | imonth = from.month(); |
227 | 222 | ||
228 | a = from.year() - e.start().date().year(); | 223 | a = from.year() - e.start().date().year(); |
229 | a *= 12; | 224 | a *= 12; |
230 | a = a + (imonth - e.start().date().month()); | 225 | a = a + (imonth - e.start().date().month()); |
231 | /* a is e.start()monthsFrom(from); */ | 226 | /* a is e.start()monthsFrom(from); */ |
232 | if(a % freq) { | 227 | if(a % freq) { |
233 | a = freq - (a % freq); | 228 | a = freq - (a % freq); |
234 | imonth = from.month() + a; | 229 | imonth = from.month() + a; |
235 | if (imonth > 12) { | 230 | if (imonth > 12) { |
236 | imonth--; | 231 | imonth--; |
237 | iyear += imonth / 12; | 232 | iyear += imonth / 12; |
238 | imonth = imonth % 12; | 233 | imonth = imonth % 12; |
239 | imonth++; | 234 | imonth++; |
240 | } | 235 | } |
241 | } | 236 | } |
242 | /* imonth is now the first month after or on | 237 | /* imonth is now the first month after or on |
243 | from that matches the frequencey given */ | 238 | from that matches the frequencey given */ |
244 | 239 | ||
245 | /* this could go for a while, worse case, 4*12 iterations, probably */ | 240 | /* this could go for a while, worse case, 4*12 iterations, probably */ |
246 | while(!QDate::isValid(iyear, imonth, iday) ) { | 241 | while(!QDate::isValid(iyear, imonth, iday) ) { |
247 | imonth += freq; | 242 | imonth += freq; |
248 | if (imonth > 12) { | 243 | if (imonth > 12) { |
249 | imonth--; | 244 | imonth--; |
250 | iyear += imonth / 12; | 245 | iyear += imonth / 12; |
251 | imonth = imonth % 12; | 246 | imonth = imonth % 12; |
252 | imonth++; | 247 | imonth++; |
253 | } | 248 | } |
254 | /* these loops could go for a while, check end case now */ | 249 | /* these loops could go for a while, check end case now */ |
255 | if ((QDate(iyear, imonth, 1) > e.repeatPattern().endDate()) && e.repeatPattern().hasEndDate) | 250 | if ((QDate(iyear, imonth, 1) > e.repeatPattern().endDate()) && e.repeatPattern().hasEndDate) |
256 | return FALSE; | 251 | return FALSE; |
257 | } | 252 | } |
258 | 253 | ||
259 | if(QDate(iyear, imonth, iday) >= from) { | 254 | if(QDate(iyear, imonth, iday) >= from) { |
260 | /* done */ | 255 | /* done */ |
261 | next = QDateTime(QDate(iyear, imonth, iday), | 256 | next = QDateTime(QDate(iyear, imonth, iday), |
262 | e.start().time()); | 257 | e.start().time()); |
263 | if ((next.date() > e.repeatPattern().endDate()) && e.repeatPattern().hasEndDate) | 258 | if ((next.date() > e.repeatPattern().endDate()) && e.repeatPattern().hasEndDate) |
264 | return FALSE; | 259 | return FALSE; |
265 | return TRUE; | 260 | return TRUE; |
266 | } | 261 | } |
267 | 262 | ||
268 | /* ok, need to cycle */ | 263 | /* ok, need to cycle */ |
269 | imonth += freq; | 264 | imonth += freq; |
270 | imonth--; | 265 | imonth--; |
271 | iyear += imonth / 12; | 266 | iyear += imonth / 12; |
272 | imonth = imonth % 12; | 267 | imonth = imonth % 12; |
273 | imonth++; | 268 | imonth++; |
274 | 269 | ||
275 | while(!QDate::isValid(iyear, imonth, iday) ) { | 270 | while(!QDate::isValid(iyear, imonth, iday) ) { |
276 | imonth += freq; | 271 | imonth += freq; |
277 | imonth--; | 272 | imonth--; |
278 | iyear += imonth / 12; | 273 | iyear += imonth / 12; |
279 | imonth = imonth % 12; | 274 | imonth = imonth % 12; |
280 | imonth++; | 275 | imonth++; |
281 | if ((QDate(iyear, imonth, 1) > e.repeatPattern().endDate()) && e.repeatPattern().hasEndDate) | 276 | if ((QDate(iyear, imonth, 1) > e.repeatPattern().endDate()) && e.repeatPattern().hasEndDate) |
282 | return FALSE; | 277 | return FALSE; |
283 | } | 278 | } |
284 | 279 | ||
285 | next = QDateTime(QDate(iyear, imonth, iday), e.start().time()); | 280 | next = QDateTime(QDate(iyear, imonth, iday), e.start().time()); |
286 | if ((next.date() > e.repeatPattern().endDate()) && e.repeatPattern().hasEndDate) | 281 | if ((next.date() > e.repeatPattern().endDate()) && e.repeatPattern().hasEndDate) |
287 | return FALSE; | 282 | return FALSE; |
288 | return TRUE; | 283 | return TRUE; |
289 | case Event::Yearly: | 284 | case Event::Yearly: |
290 | iday = e.start().date().day(); | 285 | iday = e.start().date().day(); |
291 | imonth = e.start().date().month(); | 286 | imonth = e.start().date().month(); |
292 | iyear = from.year(); // after all, we want to start in this year | 287 | iyear = from.year(); // after all, we want to start in this year |
293 | 288 | ||
294 | diff = 1; | 289 | diff = 1; |
295 | if(imonth == 2 && iday > 28) { | 290 | if(imonth == 2 && iday > 28) { |
296 | /* leap year, and it counts, calculate actual frequency */ | 291 | /* leap year, and it counts, calculate actual frequency */ |
297 | if(freq % 4) | 292 | if(freq % 4) |
298 | if (freq % 2) | 293 | if (freq % 2) |
299 | freq = freq * 4; | 294 | freq = freq * 4; |
300 | else | 295 | else |
301 | freq = freq * 2; | 296 | freq = freq * 2; |
302 | /* else divides by 4 already, leave freq alone */ | 297 | /* else divides by 4 already, leave freq alone */ |
303 | diff = 4; | 298 | diff = 4; |
304 | } | 299 | } |
305 | 300 | ||
306 | a = from.year() - e.start().date().year(); | 301 | a = from.year() - e.start().date().year(); |
307 | if(a % freq) { | 302 | if(a % freq) { |
308 | a = freq - (a % freq); | 303 | a = freq - (a % freq); |
309 | iyear = iyear + a; | 304 | iyear = iyear + a; |
310 | } | 305 | } |
311 | 306 | ||
312 | /* under the assumption we won't hit one of the special not-leap years twice */ | 307 | /* under the assumption we won't hit one of the special not-leap years twice */ |
313 | if(!QDate::isValid(iyear, imonth, iday)) { | 308 | if(!QDate::isValid(iyear, imonth, iday)) { |
314 | /* must have been skipping by leap years and hit one that wasn't, (e.g. 2100) */ | 309 | /* must have been skipping by leap years and hit one that wasn't, (e.g. 2100) */ |
315 | iyear += freq; | 310 | iyear += freq; |
316 | } | 311 | } |
317 | 312 | ||
318 | if(QDate(iyear, imonth, iday) >= from) { | 313 | if(QDate(iyear, imonth, iday) >= from) { |
319 | next = QDateTime(QDate(iyear, imonth, iday), | 314 | next = QDateTime(QDate(iyear, imonth, iday), |
320 | e.start().time()); | 315 | e.start().time()); |
321 | if ((next.date() > e.repeatPattern().endDate()) && e.repeatPattern().hasEndDate) | 316 | if ((next.date() > e.repeatPattern().endDate()) && e.repeatPattern().hasEndDate) |
322 | return FALSE; | 317 | return FALSE; |
323 | return TRUE; | 318 | return TRUE; |
324 | } | 319 | } |
325 | /* iyear == from.year(), need to advance again */ | 320 | /* iyear == from.year(), need to advance again */ |
326 | iyear += freq; | 321 | iyear += freq; |
327 | /* under the assumption we won't hit one of the special not-leap years twice */ | 322 | /* under the assumption we won't hit one of the special not-leap years twice */ |
328 | if(!QDate::isValid(iyear, imonth, iday)) { | 323 | if(!QDate::isValid(iyear, imonth, iday)) { |
329 | /* must have been skipping by leap years and hit one that wasn't, (e.g. 2100) */ | 324 | /* must have been skipping by leap years and hit one that wasn't, (e.g. 2100) */ |
330 | iyear += freq; | 325 | iyear += freq; |
331 | } | 326 | } |
332 | 327 | ||
333 | next = QDateTime(QDate(iyear, imonth, iday), e.start().time()); | 328 | next = QDateTime(QDate(iyear, imonth, iday), e.start().time()); |
334 | if ((next.date() > e.repeatPattern().endDate()) && e.repeatPattern().hasEndDate) | 329 | if ((next.date() > e.repeatPattern().endDate()) && e.repeatPattern().hasEndDate) |
335 | return FALSE; | 330 | return FALSE; |
336 | return TRUE; | 331 | return TRUE; |
337 | default: | 332 | default: |
338 | return FALSE; | 333 | return FALSE; |
339 | } | 334 | } |
340 | } | 335 | } |
341 | 336 | ||
342 | static bool nextAlarm( const Event &ev, QDateTime& when, int& warn) | 337 | static bool nextAlarm( const Event &ev, QDateTime& when, int& warn) |
343 | { | 338 | { |
344 | QDateTime now = QDateTime::currentDateTime(); | 339 | QDateTime now = QDateTime::currentDateTime(); |
345 | if ( ev.hasRepeat() ) { | 340 | if ( ev.hasRepeat() ) { |
346 | QDateTime ralarm; | 341 | QDateTime ralarm; |
347 | if (nextOccurance(ev, now.date(), ralarm)) { | 342 | if (nextOccurance(ev, now.date(), ralarm)) { |
348 | ralarm = ralarm.addSecs(-ev.alarmTime()*60); | 343 | ralarm = ralarm.addSecs(-ev.alarmTime()*60); |
349 | if ( ralarm > now ) { | 344 | if ( ralarm > now ) { |
350 | when = ralarm; | 345 | when = ralarm; |
351 | warn = ev.alarmTime(); | 346 | warn = ev.alarmTime(); |
352 | } else if ( nextOccurance(ev, now.date().addDays(1), ralarm) ) { | 347 | } else if ( nextOccurance(ev, now.date().addDays(1), ralarm) ) { |
353 | ralarm = ralarm.addSecs( -ev.alarmTime()*60 ); | 348 | ralarm = ralarm.addSecs( -ev.alarmTime()*60 ); |
354 | if ( ralarm > now ) { | 349 | if ( ralarm > now ) { |
355 | when = ralarm; | 350 | when = ralarm; |
356 | warn = ev.alarmTime(); | 351 | warn = ev.alarmTime(); |
357 | } | 352 | } |
358 | } | 353 | } |
359 | } | 354 | } |
360 | } else { | 355 | } else { |
361 | warn = ev.alarmTime(); | 356 | warn = ev.alarmTime(); |
362 | when = ev.start().addSecs( -ev.alarmTime()*60 ); | 357 | when = ev.start().addSecs( -ev.alarmTime()*60 ); |
363 | } | 358 | } |
364 | return when > now; | 359 | return when > now; |
365 | } | 360 | } |
366 | 361 | ||
367 | static void addEventAlarm( const Event &ev ) | 362 | static void addEventAlarm( const Event &ev ) |
368 | { | 363 | { |
369 | QDateTime when; | 364 | QDateTime when; |
370 | int warn; | 365 | int warn; |
371 | if ( nextAlarm(ev,when,warn) ) | 366 | if ( nextAlarm(ev,when,warn) ) |
372 | AlarmServer::addAlarm( when, | 367 | AlarmServer::addAlarm( when, |
373 | "QPE/Application/datebook", | 368 | "QPE/Application/datebook", |
374 | "alarm(QDateTime,int)", warn ); | 369 | "alarm(QDateTime,int)", warn ); |
375 | } | 370 | } |
376 | 371 | ||
377 | static void delEventAlarm( const Event &ev ) | 372 | static void delEventAlarm( const Event &ev ) |
378 | { | 373 | { |
379 | QDateTime when; | 374 | QDateTime when; |
380 | int warn; | 375 | int warn; |
381 | if ( nextAlarm(ev,when,warn) ) | 376 | if ( nextAlarm(ev,when,warn) ) |
382 | AlarmServer::deleteAlarm( when, | 377 | AlarmServer::deleteAlarm( when, |
383 | "QPE/Application/datebook", | 378 | "QPE/Application/datebook", |
384 | "alarm(QDateTime,int)", warn ); | 379 | "alarm(QDateTime,int)", warn ); |
385 | } | 380 | } |
386 | 381 | ||
387 | 382 | ||
388 | DateBookDB::DateBookDB() | 383 | DateBookDB::DateBookDB() |
389 | { | 384 | { |
390 | init(); | 385 | init(); |
391 | } | 386 | } |
392 | 387 | ||
393 | DateBookDB::~DateBookDB() | 388 | DateBookDB::~DateBookDB() |
394 | { | 389 | { |
395 | save(); | 390 | save(); |
396 | eventList.clear(); | 391 | eventList.clear(); |
397 | repeatEvents.clear(); | 392 | repeatEvents.clear(); |
398 | } | 393 | } |
399 | 394 | ||
400 | 395 | ||
401 | //#### Why is this code duplicated in getEffectiveEvents ????? | 396 | //#### Why is this code duplicated in getEffectiveEvents ????? |
402 | //#### Addendum. Don't use this function, lets faze it out if we can. | 397 | //#### Addendum. Don't use this function, lets faze it out if we can. |
403 | QValueList<Event> DateBookDB::getEvents( const QDate &from, const QDate &to ) | 398 | QValueList<Event> DateBookDB::getEvents( const QDate &from, const QDate &to ) |
404 | { | 399 | { |
405 | QValueList<Event> tmpList; | 400 | QValueList<Event> tmpList; |
406 | tmpList = getNonRepeatingEvents( from, to ); | 401 | tmpList = getNonRepeatingEvents( from, to ); |
407 | 402 | ||
408 | // check for repeating events... | 403 | // check for repeating events... |
409 | for (QValueList<Event>::ConstIterator it = repeatEvents.begin(); | 404 | for (QValueList<Event>::ConstIterator it = repeatEvents.begin(); |
410 | it != repeatEvents.end(); ++it) { | 405 | it != repeatEvents.end(); ++it) { |
411 | QDate itDate = from; | 406 | QDate itDate = from; |
412 | QDateTime due; | 407 | QDateTime due; |
413 | 408 | ||
414 | /* create a false end date, to short circuit on hard | 409 | /* create a false end date, to short circuit on hard |
415 | MonthlyDay recurences */ | 410 | MonthlyDay recurences */ |
416 | Event dummy_event = *it; | 411 | Event dummy_event = *it; |
417 | Event::RepeatPattern r = dummy_event.repeatPattern(); | 412 | Event::RepeatPattern r = dummy_event.repeatPattern(); |
diff --git a/library/datebookmonth.cpp b/library/datebookmonth.cpp index 728045f..76e022f 100644 --- a/library/datebookmonth.cpp +++ b/library/datebookmonth.cpp | |||
@@ -1,417 +1,412 @@ | |||
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 | #include "config.h" | 20 | #include "config.h" |
21 | #include "datebookmonth.h" | 21 | #include "datebookmonth.h" |
22 | #include "datebookdb.h" | 22 | #include "datebookdb.h" |
23 | #include <qtopia/private/event.h> | ||
24 | #include "resource.h" | 23 | #include "resource.h" |
25 | #include <qpe/qpeapplication.h> | 24 | #include <qpe/qpeapplication.h> |
26 | #include "timestring.h" | ||
27 | 25 | ||
28 | #include <qtoolbutton.h> | 26 | #include <qtoolbutton.h> |
29 | #include <qspinbox.h> | 27 | #include <qspinbox.h> |
30 | #include <qcombobox.h> | 28 | #include <qcombobox.h> |
31 | #include <qdatetime.h> | ||
32 | #include <qpainter.h> | ||
33 | #include <qpopupmenu.h> | ||
34 | #include <qvaluestack.h> | 29 | #include <qvaluestack.h> |
35 | #include <qwhatsthis.h> | 30 | #include <qwhatsthis.h> |
36 | 31 | ||
37 | 32 | ||
38 | DateBookMonthHeader::DateBookMonthHeader( QWidget *parent, const char *name ) | 33 | DateBookMonthHeader::DateBookMonthHeader( QWidget *parent, const char *name ) |
39 | : QHBox( parent, name ) | 34 | : QHBox( parent, name ) |
40 | { | 35 | { |
41 | setBackgroundMode( PaletteButton ); | 36 | setBackgroundMode( PaletteButton ); |
42 | 37 | ||
43 | begin = new QToolButton( this ); | 38 | begin = new QToolButton( this ); |
44 | begin->setFocusPolicy(NoFocus); | 39 | begin->setFocusPolicy(NoFocus); |
45 | begin->setPixmap( Resource::loadPixmap( "start" ) ); | 40 | begin->setPixmap( Resource::loadPixmap( "start" ) ); |
46 | begin->setAutoRaise( TRUE ); | 41 | begin->setAutoRaise( TRUE ); |
47 | begin->setFixedSize( begin->sizeHint() ); | 42 | begin->setFixedSize( begin->sizeHint() ); |
48 | QWhatsThis::add( begin, tr("Show January in the selected year") ); | 43 | QWhatsThis::add( begin, tr("Show January in the selected year") ); |
49 | 44 | ||
50 | back = new QToolButton( this ); | 45 | back = new QToolButton( this ); |
51 | back->setFocusPolicy(NoFocus); | 46 | back->setFocusPolicy(NoFocus); |
52 | back->setPixmap( Resource::loadPixmap( "back" ) ); | 47 | back->setPixmap( Resource::loadPixmap( "back" ) ); |
53 | back->setAutoRaise( TRUE ); | 48 | back->setAutoRaise( TRUE ); |
54 | back->setFixedSize( back->sizeHint() ); | 49 | back->setFixedSize( back->sizeHint() ); |
55 | QWhatsThis::add( back, tr("Show the previous month") ); | 50 | QWhatsThis::add( back, tr("Show the previous month") ); |
56 | 51 | ||
57 | month = new QComboBox( FALSE, this ); | 52 | month = new QComboBox( FALSE, this ); |
58 | for ( int i = 0; i < 12; ++i ) | 53 | for ( int i = 0; i < 12; ++i ) |
59 | month->insertItem( Calendar::nameOfMonth( i + 1 ) ); | 54 | month->insertItem( Calendar::nameOfMonth( i + 1 ) ); |
60 | 55 | ||
61 | year = new QSpinBox( 1752, 8000, 1, this ); | 56 | year = new QSpinBox( 1752, 8000, 1, this ); |
62 | 57 | ||
63 | next = new QToolButton( this ); | 58 | next = new QToolButton( this ); |
64 | next->setFocusPolicy(NoFocus); | 59 | next->setFocusPolicy(NoFocus); |
65 | next->setPixmap( Resource::loadPixmap( "forward" ) ); | 60 | next->setPixmap( Resource::loadPixmap( "forward" ) ); |
66 | next->setAutoRaise( TRUE ); | 61 | next->setAutoRaise( TRUE ); |
67 | next->setFixedSize( next->sizeHint() ); | 62 | next->setFixedSize( next->sizeHint() ); |
68 | QWhatsThis::add( next, tr("Show the next month") ); | 63 | QWhatsThis::add( next, tr("Show the next month") ); |
69 | 64 | ||
70 | end = new QToolButton( this ); | 65 | end = new QToolButton( this ); |
71 | end->setFocusPolicy(NoFocus); | 66 | end->setFocusPolicy(NoFocus); |
72 | end->setPixmap( Resource::loadPixmap( "finish" ) ); | 67 | end->setPixmap( Resource::loadPixmap( "finish" ) ); |
73 | end->setAutoRaise( TRUE ); | 68 | end->setAutoRaise( TRUE ); |
74 | end->setFixedSize( end->sizeHint() ); | 69 | end->setFixedSize( end->sizeHint() ); |
75 | QWhatsThis::add( end, tr("Show December in the selected year") ); | 70 | QWhatsThis::add( end, tr("Show December in the selected year") ); |
76 | 71 | ||
77 | connect( month, SIGNAL( activated( int ) ), | 72 | connect( month, SIGNAL( activated( int ) ), |
78 | this, SLOT( updateDate() ) ); | 73 | this, SLOT( updateDate() ) ); |
79 | connect( year, SIGNAL( valueChanged( int ) ), | 74 | connect( year, SIGNAL( valueChanged( int ) ), |
80 | this, SLOT( updateDate() ) ); | 75 | this, SLOT( updateDate() ) ); |
81 | connect( begin, SIGNAL( clicked() ), | 76 | connect( begin, SIGNAL( clicked() ), |
82 | this, SLOT( firstMonth() ) ); | 77 | this, SLOT( firstMonth() ) ); |
83 | connect( end, SIGNAL( clicked() ), | 78 | connect( end, SIGNAL( clicked() ), |
84 | this, SLOT( lastMonth() ) ); | 79 | this, SLOT( lastMonth() ) ); |
85 | connect( back, SIGNAL( clicked() ), | 80 | connect( back, SIGNAL( clicked() ), |
86 | this, SLOT( monthBack() ) ); | 81 | this, SLOT( monthBack() ) ); |
87 | connect( next, SIGNAL( clicked() ), | 82 | connect( next, SIGNAL( clicked() ), |
88 | this, SLOT( monthForward() ) ); | 83 | this, SLOT( monthForward() ) ); |
89 | back->setAutoRepeat( TRUE ); | 84 | back->setAutoRepeat( TRUE ); |
90 | next->setAutoRepeat( TRUE ); | 85 | next->setAutoRepeat( TRUE ); |
91 | } | 86 | } |
92 | 87 | ||
93 | 88 | ||
94 | DateBookMonthHeader::~DateBookMonthHeader() | 89 | DateBookMonthHeader::~DateBookMonthHeader() |
95 | { | 90 | { |
96 | 91 | ||
97 | } | 92 | } |
98 | 93 | ||
99 | void DateBookMonthHeader::updateDate() | 94 | void DateBookMonthHeader::updateDate() |
100 | { | 95 | { |
101 | emit dateChanged( year->value(), month->currentItem() + 1 ); | 96 | emit dateChanged( year->value(), month->currentItem() + 1 ); |
102 | } | 97 | } |
103 | 98 | ||
104 | void DateBookMonthHeader::firstMonth() | 99 | void DateBookMonthHeader::firstMonth() |
105 | { | 100 | { |
106 | emit dateChanged( year->value(), 1 ); | 101 | emit dateChanged( year->value(), 1 ); |
107 | month->setCurrentItem( 0 ); | 102 | month->setCurrentItem( 0 ); |
108 | } | 103 | } |
109 | 104 | ||
110 | void DateBookMonthHeader::lastMonth() | 105 | void DateBookMonthHeader::lastMonth() |
111 | { | 106 | { |
112 | emit dateChanged( year->value(), 12 ); | 107 | emit dateChanged( year->value(), 12 ); |
113 | month->setCurrentItem( 11 ); | 108 | month->setCurrentItem( 11 ); |
114 | } | 109 | } |
115 | 110 | ||
116 | void DateBookMonthHeader::monthBack() | 111 | void DateBookMonthHeader::monthBack() |
117 | { | 112 | { |
118 | if ( month->currentItem() > 0 ) { | 113 | if ( month->currentItem() > 0 ) { |
119 | emit dateChanged( year->value(), month->currentItem() ); | 114 | emit dateChanged( year->value(), month->currentItem() ); |
120 | month->setCurrentItem( month->currentItem() - 1 ); | 115 | month->setCurrentItem( month->currentItem() - 1 ); |
121 | } else { | 116 | } else { |
122 | emit dateChanged( year->value() - 1, 12 ); | 117 | emit dateChanged( year->value() - 1, 12 ); |
123 | // we have a signal set to a changed value in year so we only need to change | 118 | // we have a signal set to a changed value in year so we only need to change |
124 | // year to get the result... | 119 | // year to get the result... |
125 | month->setCurrentItem( 11 ); | 120 | month->setCurrentItem( 11 ); |
126 | year->setValue( year->value() - 1 ); | 121 | year->setValue( year->value() - 1 ); |
127 | } | 122 | } |
128 | } | 123 | } |
129 | 124 | ||
130 | void DateBookMonthHeader::monthForward() | 125 | void DateBookMonthHeader::monthForward() |
131 | { | 126 | { |
132 | if ( month->currentItem() < 11 ) { | 127 | if ( month->currentItem() < 11 ) { |
133 | emit dateChanged( year->value(), month->currentItem() + 2 ); | 128 | emit dateChanged( year->value(), month->currentItem() + 2 ); |
134 | month->setCurrentItem( month->currentItem() + 1 ); | 129 | month->setCurrentItem( month->currentItem() + 1 ); |
135 | } else { | 130 | } else { |
136 | // we have a signal set to a changed value in year so we only need to change | 131 | // we have a signal set to a changed value in year so we only need to change |
137 | // year to get the result... | 132 | // year to get the result... |
138 | month->setCurrentItem( 0 ); | 133 | month->setCurrentItem( 0 ); |
139 | year->setValue( year->value() + 1 ); | 134 | year->setValue( year->value() + 1 ); |
140 | } | 135 | } |
141 | } | 136 | } |
142 | 137 | ||
143 | void DateBookMonthHeader::setDate( int y, int m ) | 138 | void DateBookMonthHeader::setDate( int y, int m ) |
144 | { | 139 | { |
145 | year->setValue( y ); | 140 | year->setValue( y ); |
146 | month->setCurrentItem( m - 1 ); | 141 | month->setCurrentItem( m - 1 ); |
147 | } | 142 | } |
148 | 143 | ||
149 | //--------------------------------------------------------------------------- | 144 | //--------------------------------------------------------------------------- |
150 | 145 | ||
151 | class DateBookMonthTablePrivate | 146 | class DateBookMonthTablePrivate |
152 | { | 147 | { |
153 | public: | 148 | public: |
154 | DateBookMonthTablePrivate() {}; | 149 | DateBookMonthTablePrivate() {}; |
155 | ~DateBookMonthTablePrivate() { mMonthEvents.clear(); }; | 150 | ~DateBookMonthTablePrivate() { mMonthEvents.clear(); }; |
156 | 151 | ||
157 | QValueList<EffectiveEvent> mMonthEvents; | 152 | QValueList<EffectiveEvent> mMonthEvents; |
158 | bool onMonday; | 153 | bool onMonday; |
159 | }; | 154 | }; |
160 | 155 | ||
161 | DateBookMonthTable::DateBookMonthTable( QWidget *parent, const char *name, | 156 | DateBookMonthTable::DateBookMonthTable( QWidget *parent, const char *name, |
162 | DateBookDB *newDb ) | 157 | DateBookDB *newDb ) |
163 | : QTable( 6, 7, parent, name ), | 158 | : QTable( 6, 7, parent, name ), |
164 | db( newDb ) | 159 | db( newDb ) |
165 | { | 160 | { |
166 | d = new DateBookMonthTablePrivate(); | 161 | d = new DateBookMonthTablePrivate(); |
167 | selYear = -1; | 162 | selYear = -1; |
168 | selMonth = -1; | 163 | selMonth = -1; |
169 | selDay = -1; | 164 | selDay = -1; |
170 | 165 | ||
171 | /* init these as well make valgrind happy and be consistent with Qtopia1.6 -zecke */ | 166 | /* init these as well make valgrind happy and be consistent with Qtopia1.6 -zecke */ |
172 | year = -1; | 167 | year = -1; |
173 | month = -1; | 168 | month = -1; |
174 | day = -1; | 169 | day = -1; |
175 | 170 | ||
176 | Config cfg( "qpe" ); | 171 | Config cfg( "qpe" ); |
177 | cfg.setGroup( "Time" ); | 172 | cfg.setGroup( "Time" ); |
178 | d->onMonday = cfg.readBoolEntry( "MONDAY" ); | 173 | d->onMonday = cfg.readBoolEntry( "MONDAY" ); |
179 | 174 | ||
180 | horizontalHeader()->setResizeEnabled( FALSE ); | 175 | horizontalHeader()->setResizeEnabled( FALSE ); |
181 | // we have to do this here... or suffer the consequences later... | 176 | // we have to do this here... or suffer the consequences later... |
182 | for ( int i = 0; i < 7; i++ ){ | 177 | for ( int i = 0; i < 7; i++ ){ |
183 | horizontalHeader()->resizeSection( i, 30 ); | 178 | horizontalHeader()->resizeSection( i, 30 ); |
184 | setColumnStretchable( i, TRUE ); | 179 | setColumnStretchable( i, TRUE ); |
185 | } | 180 | } |
186 | setupLabels(); | 181 | setupLabels(); |
187 | 182 | ||
188 | verticalHeader()->hide(); | 183 | verticalHeader()->hide(); |
189 | setLeftMargin( 0 ); | 184 | setLeftMargin( 0 ); |
190 | for ( int i = 0; i < 6; ++i ) | 185 | for ( int i = 0; i < 6; ++i ) |
191 | setRowStretchable( i, TRUE ); | 186 | setRowStretchable( i, TRUE ); |
192 | 187 | ||
193 | setSelectionMode( NoSelection ); | 188 | setSelectionMode( NoSelection ); |
194 | 189 | ||
195 | connect( this, SIGNAL( clicked( int, int, int, const QPoint & ) ), | 190 | connect( this, SIGNAL( clicked( int, int, int, const QPoint & ) ), |
196 | this, SLOT( dayClicked( int, int ) ) ); | 191 | this, SLOT( dayClicked( int, int ) ) ); |
197 | connect( this, SIGNAL( currentChanged( int, int ) ), | 192 | connect( this, SIGNAL( currentChanged( int, int ) ), |
198 | this, SLOT( dragDay( int, int ) ) ); | 193 | this, SLOT( dragDay( int, int ) ) ); |
199 | setVScrollBarMode( AlwaysOff ); | 194 | setVScrollBarMode( AlwaysOff ); |
200 | setHScrollBarMode( AlwaysOff ); | 195 | setHScrollBarMode( AlwaysOff ); |
201 | } | 196 | } |
202 | 197 | ||
203 | DateBookMonthTable::~DateBookMonthTable() | 198 | DateBookMonthTable::~DateBookMonthTable() |
204 | { | 199 | { |
205 | monthsEvents.clear(); | 200 | monthsEvents.clear(); |
206 | delete d; | 201 | delete d; |
207 | } | 202 | } |
208 | 203 | ||
209 | void DateBookMonthTable::setDate(int y, int m, int d) | 204 | void DateBookMonthTable::setDate(int y, int m, int d) |
210 | { | 205 | { |
211 | if (month == m && year == y) { | 206 | if (month == m && year == y) { |
212 | if ( selYear == -1 ) | 207 | if ( selYear == -1 ) |
213 | year = selYear; | 208 | year = selYear; |
214 | if ( selMonth == -1 ) | 209 | if ( selMonth == -1 ) |
215 | month = selMonth; | 210 | month = selMonth; |
216 | int r1, c1, r2, c2; | 211 | int r1, c1, r2, c2; |
217 | findDay(selDay, r1, c1); | 212 | findDay(selDay, r1, c1); |
218 | selDay = day = d; | 213 | selDay = day = d; |
219 | findDay(selDay, r2, c2); | 214 | findDay(selDay, r2, c2); |
220 | setCurrentCell( r2, c2 ); | 215 | setCurrentCell( r2, c2 ); |
221 | //updateCell(r1,c1); | 216 | //updateCell(r1,c1); |
222 | //updateCell(r2,c2); | 217 | //updateCell(r2,c2); |
223 | } else { | 218 | } else { |
224 | selYear = year = y; | 219 | selYear = year = y; |
225 | selMonth = month = m; | 220 | selMonth = month = m; |
226 | selDay = day = d; | 221 | selDay = day = d; |
227 | setupTable(); | 222 | setupTable(); |
228 | } | 223 | } |
229 | } | 224 | } |
230 | 225 | ||
231 | void DateBookMonthTable::redraw() | 226 | void DateBookMonthTable::redraw() |
232 | { | 227 | { |
233 | setupLabels(); | 228 | setupLabels(); |
234 | setupTable(); | 229 | setupTable(); |
235 | } | 230 | } |
236 | 231 | ||
237 | void DateBookMonthTable::setWeekStart( bool onMonday ) | 232 | void DateBookMonthTable::setWeekStart( bool onMonday ) |
238 | { | 233 | { |
239 | d->onMonday = onMonday; | 234 | d->onMonday = onMonday; |
240 | setupLabels(); | 235 | setupLabels(); |
241 | setupTable(); | 236 | setupTable(); |
242 | } | 237 | } |
243 | 238 | ||
244 | void DateBookMonthTable::setupTable() | 239 | void DateBookMonthTable::setupTable() |
245 | { | 240 | { |
246 | QValueList<Calendar::Day> days = Calendar::daysOfMonth( year, month, d->onMonday ); | 241 | QValueList<Calendar::Day> days = Calendar::daysOfMonth( year, month, d->onMonday ); |
247 | QValueList<Calendar::Day>::Iterator it = days.begin(); | 242 | QValueList<Calendar::Day>::Iterator it = days.begin(); |
248 | int row = 0, col = 0; | 243 | int row = 0, col = 0; |
249 | int crow = 0; | 244 | int crow = 0; |
250 | int ccol = 0; | 245 | int ccol = 0; |
251 | for ( ; it != days.end(); ++it ) { | 246 | for ( ; it != days.end(); ++it ) { |
252 | DayItemMonth *i = (DayItemMonth *)item( row, col ); | 247 | DayItemMonth *i = (DayItemMonth *)item( row, col ); |
253 | if ( !i ) { | 248 | if ( !i ) { |
254 | i = new DayItemMonth( this, QTableItem::Never, "" ); | 249 | i = new DayItemMonth( this, QTableItem::Never, "" ); |
255 | setItem( row, col, i ); | 250 | setItem( row, col, i ); |
256 | } | 251 | } |
257 | Calendar::Day calDay = *it; | 252 | Calendar::Day calDay = *it; |
258 | i->clearEffEvents(); | 253 | i->clearEffEvents(); |
259 | i->setDay( calDay.date ); | 254 | i->setDay( calDay.date ); |
260 | i->setType( calDay.type ); | 255 | i->setType( calDay.type ); |
261 | if ( i->day() == day && calDay.type == Calendar::Day::ThisMonth ) { | 256 | if ( i->day() == day && calDay.type == Calendar::Day::ThisMonth ) { |
262 | crow = row; | 257 | crow = row; |
263 | ccol = col; | 258 | ccol = col; |
264 | } | 259 | } |
265 | 260 | ||
266 | updateCell( row, col ); | 261 | updateCell( row, col ); |
267 | 262 | ||
268 | if ( col == 6 ) { | 263 | if ( col == 6 ) { |
269 | ++row; | 264 | ++row; |
270 | col = 0; | 265 | col = 0; |
271 | } else { | 266 | } else { |
272 | ++col; | 267 | ++col; |
273 | } | 268 | } |
274 | } | 269 | } |
275 | setCurrentCell( crow, ccol ); | 270 | setCurrentCell( crow, ccol ); |
276 | getEvents(); | 271 | getEvents(); |
277 | } | 272 | } |
278 | 273 | ||
279 | void DateBookMonthTable::findDay( int day, int &row, int &col ) | 274 | void DateBookMonthTable::findDay( int day, int &row, int &col ) |
280 | { | 275 | { |
281 | QDate dtBegin( year, month, 1 ); | 276 | QDate dtBegin( year, month, 1 ); |
282 | int skips = dtBegin.dayOfWeek(); | 277 | int skips = dtBegin.dayOfWeek(); |
283 | int effective_day = day + skips - 1; // row/columns begin at 0 | 278 | int effective_day = day + skips - 1; // row/columns begin at 0 |
284 | // make an extra adjustment if we start on Mondays. | 279 | // make an extra adjustment if we start on Mondays. |
285 | if ( d->onMonday ) | 280 | if ( d->onMonday ) |
286 | effective_day--; | 281 | effective_day--; |
287 | row = effective_day / 7; | 282 | row = effective_day / 7; |
288 | col = effective_day % 7; | 283 | col = effective_day % 7; |
289 | } | 284 | } |
290 | 285 | ||
291 | void DateBookMonthTable::dayClicked( int row, int col ) | 286 | void DateBookMonthTable::dayClicked( int row, int col ) |
292 | { | 287 | { |
293 | changeDaySelection( row, col ); | 288 | changeDaySelection( row, col ); |
294 | emit dateClicked( selYear, selMonth, selDay ); | 289 | emit dateClicked( selYear, selMonth, selDay ); |
295 | } | 290 | } |
296 | 291 | ||
297 | void DateBookMonthTable::dragDay( int row, int col ) | 292 | void DateBookMonthTable::dragDay( int row, int col ) |
298 | { | 293 | { |
299 | changeDaySelection( row, col ); | 294 | changeDaySelection( row, col ); |
300 | } | 295 | } |
301 | 296 | ||
302 | void DateBookMonthTable::changeDaySelection( int row, int col ) | 297 | void DateBookMonthTable::changeDaySelection( int row, int col ) |
303 | { | 298 | { |
304 | DayItemMonth *i = (DayItemMonth*)item( row, col ); | 299 | DayItemMonth *i = (DayItemMonth*)item( row, col ); |
305 | if ( !i ) | 300 | if ( !i ) |
306 | return; | 301 | return; |
307 | switch ( i->type() ) { | 302 | switch ( i->type() ) { |
308 | case Calendar::Day::ThisMonth: | 303 | case Calendar::Day::ThisMonth: |
309 | selMonth = month; | 304 | selMonth = month; |
310 | break; | 305 | break; |
311 | case Calendar::Day::PrevMonth: | 306 | case Calendar::Day::PrevMonth: |
312 | selMonth = month-1; | 307 | selMonth = month-1; |
313 | break; | 308 | break; |
314 | default: | 309 | default: |
315 | selMonth = month+1; | 310 | selMonth = month+1; |
316 | } | 311 | } |
317 | 312 | ||
318 | selYear = year; | 313 | selYear = year; |
319 | if ( selMonth <= 0 ) { | 314 | if ( selMonth <= 0 ) { |
320 | selMonth = 12; | 315 | selMonth = 12; |
321 | selYear--; | 316 | selYear--; |
322 | } else if ( selMonth > 12 ) { | 317 | } else if ( selMonth > 12 ) { |
323 | selMonth = 1; | 318 | selMonth = 1; |
324 | selYear++; | 319 | selYear++; |
325 | } | 320 | } |
326 | selDay = i->day(); | 321 | selDay = i->day(); |
327 | } | 322 | } |
328 | 323 | ||
329 | 324 | ||
330 | void DateBookMonthTable::viewportMouseReleaseEvent( QMouseEvent * ) | 325 | void DateBookMonthTable::viewportMouseReleaseEvent( QMouseEvent * ) |
331 | { | 326 | { |
332 | dayClicked( currentRow(), currentColumn() ); | 327 | dayClicked( currentRow(), currentColumn() ); |
333 | } | 328 | } |
334 | 329 | ||
335 | void DateBookMonthTable::getEvents() | 330 | void DateBookMonthTable::getEvents() |
336 | { | 331 | { |
337 | if ( !db ) | 332 | if ( !db ) |
338 | return; | 333 | return; |
339 | 334 | ||
340 | QDate dtStart( year, month, 1 ); | 335 | QDate dtStart( year, month, 1 ); |
341 | d->mMonthEvents = db->getEffectiveEvents( dtStart, | 336 | d->mMonthEvents = db->getEffectiveEvents( dtStart, |
342 | QDate( year, month, | 337 | QDate( year, month, |
343 | dtStart.daysInMonth() ) ); | 338 | dtStart.daysInMonth() ) ); |
344 | QValueListIterator<EffectiveEvent> it = d->mMonthEvents.begin(); | 339 | QValueListIterator<EffectiveEvent> it = d->mMonthEvents.begin(); |
345 | // now that the events are sorted, basically go through the list, make | 340 | // now that the events are sorted, basically go through the list, make |
346 | // a small list for every day and set it for each item... | 341 | // a small list for every day and set it for each item... |
347 | // clear all the items... | 342 | // clear all the items... |
348 | while ( it != d->mMonthEvents.end() ) { | 343 | while ( it != d->mMonthEvents.end() ) { |
349 | QValueList<EffectiveEvent> dayEvent; | 344 | QValueList<EffectiveEvent> dayEvent; |
350 | EffectiveEvent e = *it; | 345 | EffectiveEvent e = *it; |
351 | ++it; | 346 | ++it; |
352 | dayEvent.append( e ); | 347 | dayEvent.append( e ); |
353 | while ( it != d->mMonthEvents.end() | 348 | while ( it != d->mMonthEvents.end() |
354 | && e.date() == (*it).date() ) { | 349 | && e.date() == (*it).date() ) { |
355 | dayEvent.append( *it ); | 350 | dayEvent.append( *it ); |
356 | ++it; | 351 | ++it; |
357 | } | 352 | } |
358 | int row, col; | 353 | int row, col; |
359 | findDay( e.date().day(), row, col ); | 354 | findDay( e.date().day(), row, col ); |
360 | DayItemMonth* w = static_cast<DayItemMonth*>( item( row, col ) ); | 355 | DayItemMonth* w = static_cast<DayItemMonth*>( item( row, col ) ); |
361 | w->setEvents( dayEvent ); | 356 | w->setEvents( dayEvent ); |
362 | updateCell( row, col ); | 357 | updateCell( row, col ); |
363 | dayEvent.clear(); | 358 | dayEvent.clear(); |
364 | } | 359 | } |
365 | } | 360 | } |
366 | 361 | ||
367 | 362 | ||
368 | void DateBookMonthTable::setupLabels() | 363 | void DateBookMonthTable::setupLabels() |
369 | { | 364 | { |
370 | for ( int i = 0; i < 7; ++i ) { | 365 | for ( int i = 0; i < 7; ++i ) { |
371 | // horizontalHeader()->resizeSection( i, 30 ); | 366 | // horizontalHeader()->resizeSection( i, 30 ); |
372 | // setColumnStretchable( i, TRUE ); | 367 | // setColumnStretchable( i, TRUE ); |
373 | if ( d->onMonday ) | 368 | if ( d->onMonday ) |
374 | horizontalHeader()->setLabel( i, Calendar::nameOfDay( i + 1 ) ); | 369 | horizontalHeader()->setLabel( i, Calendar::nameOfDay( i + 1 ) ); |
375 | else { | 370 | else { |
376 | if ( i == 0 ) | 371 | if ( i == 0 ) |
377 | horizontalHeader()->setLabel( i, Calendar::nameOfDay( 7 ) ); | 372 | horizontalHeader()->setLabel( i, Calendar::nameOfDay( 7 ) ); |
378 | else | 373 | else |
379 | horizontalHeader()->setLabel( i, Calendar::nameOfDay( i ) ); | 374 | horizontalHeader()->setLabel( i, Calendar::nameOfDay( i ) ); |
380 | } | 375 | } |
381 | } | 376 | } |
382 | } | 377 | } |
383 | 378 | ||
384 | 379 | ||
385 | //--------------------------------------------------------------------------- | 380 | //--------------------------------------------------------------------------- |
386 | 381 | ||
387 | DateBookMonth::DateBookMonth( QWidget *parent, const char *name, bool ac, | 382 | DateBookMonth::DateBookMonth( QWidget *parent, const char *name, bool ac, |
388 | DateBookDB *data ) | 383 | DateBookDB *data ) |
389 | : QVBox( parent, name ), | 384 | : QVBox( parent, name ), |
390 | autoClose( ac ) | 385 | autoClose( ac ) |
391 | { | 386 | { |
392 | setFocusPolicy(StrongFocus); | 387 | setFocusPolicy(StrongFocus); |
393 | year = QDate::currentDate().year(); | 388 | year = QDate::currentDate().year(); |
394 | month = QDate::currentDate().month(); | 389 | month = QDate::currentDate().month(); |
395 | day = QDate::currentDate().day(); | 390 | day = QDate::currentDate().day(); |
396 | header = new DateBookMonthHeader( this, "DateBookMonthHeader" ); | 391 | header = new DateBookMonthHeader( this, "DateBookMonthHeader" ); |
397 | table = new DateBookMonthTable( this, "DateBookMonthTable", data ); | 392 | table = new DateBookMonthTable( this, "DateBookMonthTable", data ); |
398 | header->setDate( year, month ); | 393 | header->setDate( year, month ); |
399 | table->setDate( year, month, QDate::currentDate().day() ); | 394 | table->setDate( year, month, QDate::currentDate().day() ); |
400 | header->setFocusPolicy(NoFocus); | 395 | header->setFocusPolicy(NoFocus); |
401 | table->setFocusPolicy(NoFocus); | 396 | table->setFocusPolicy(NoFocus); |
402 | connect( header, SIGNAL( dateChanged( int, int ) ), | 397 | connect( header, SIGNAL( dateChanged( int, int ) ), |
403 | this, SLOT( setDate( int, int ) ) ); | 398 | this, SLOT( setDate( int, int ) ) ); |
404 | connect( table, SIGNAL( dateClicked( int, int, int ) ), | 399 | connect( table, SIGNAL( dateClicked( int, int, int ) ), |
405 | this, SLOT( finalDate(int, int, int) ) ); | 400 | this, SLOT( finalDate(int, int, int) ) ); |
406 | connect( qApp, SIGNAL(weekChanged(bool)), this, | 401 | connect( qApp, SIGNAL(weekChanged(bool)), this, |
407 | SLOT(slotWeekChange(bool)) ); | 402 | SLOT(slotWeekChange(bool)) ); |
408 | table->setFocus(); | 403 | table->setFocus(); |
409 | } | 404 | } |
410 | 405 | ||
411 | DateBookMonth::~DateBookMonth() | 406 | DateBookMonth::~DateBookMonth() |
412 | { | 407 | { |
413 | 408 | ||
414 | } | 409 | } |
415 | 410 | ||
416 | void DateBookMonth::setDate( int y, int m ) | 411 | void DateBookMonth::setDate( int y, int m ) |
417 | { | 412 | { |
diff --git a/library/filemanager.cpp b/library/filemanager.cpp index 408be20..1e7384e 100644 --- a/library/filemanager.cpp +++ b/library/filemanager.cpp | |||
@@ -1,411 +1,408 @@ | |||
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 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 | #include "filemanager.h" | 20 | #include "filemanager.h" |
21 | #include "applnk.h" | 21 | #include "applnk.h" |
22 | 22 | ||
23 | #include <qdir.h> | ||
24 | #include <qfile.h> | ||
25 | #include <qfileinfo.h> | 23 | #include <qfileinfo.h> |
26 | #include <qtextstream.h> | 24 | #include <qtextstream.h> |
27 | #include <qtextcodec.h> | ||
28 | 25 | ||
29 | #include <errno.h> | 26 | #include <errno.h> |
30 | #include <stdlib.h> | 27 | #include <stdlib.h> |
31 | #include <unistd.h> | 28 | #include <unistd.h> |
32 | #include <sys/stat.h> | 29 | #include <sys/stat.h> |
33 | #include <dirent.h> | 30 | #include <dirent.h> |
34 | #ifdef Q_OS_MACX | 31 | #ifdef Q_OS_MACX |
35 | // MacOS X does not have sendfile.. :( | 32 | // MacOS X does not have sendfile.. :( |
36 | // But maybe in the future.. !? | 33 | // But maybe in the future.. !? |
37 | # ifdef SENDFILE | 34 | # ifdef SENDFILE |
38 | # include <sys/types.h> | 35 | # include <sys/types.h> |
39 | # include <sys/socket.h> | 36 | # include <sys/socket.h> |
40 | # endif | 37 | # endif |
41 | #else | 38 | #else |
42 | # include <sys/sendfile.h> | 39 | # include <sys/sendfile.h> |
43 | #endif /* Q_OS_MACX */ | 40 | #endif /* Q_OS_MACX */ |
44 | #include <fcntl.h> | 41 | #include <fcntl.h> |
45 | 42 | ||
46 | /*! | 43 | /*! |
47 | \class FileManager | 44 | \class FileManager |
48 | \brief The FileManager class assists with AppLnk input/output. | 45 | \brief The FileManager class assists with AppLnk input/output. |
49 | */ | 46 | */ |
50 | 47 | ||
51 | /*! | 48 | /*! |
52 | Constructs a FileManager. | 49 | Constructs a FileManager. |
53 | */ | 50 | */ |
54 | FileManager::FileManager() | 51 | FileManager::FileManager() |
55 | { | 52 | { |
56 | } | 53 | } |
57 | 54 | ||
58 | /*! | 55 | /*! |
59 | Destroys a FileManager. | 56 | Destroys a FileManager. |
60 | */ | 57 | */ |
61 | FileManager::~FileManager() | 58 | FileManager::~FileManager() |
62 | { | 59 | { |
63 | 60 | ||
64 | } | 61 | } |
65 | 62 | ||
66 | /*! | 63 | /*! |
67 | Saves \a data as the document specified by \a f. | 64 | Saves \a data as the document specified by \a f. |
68 | 65 | ||
69 | Returns whether the operation succeeded. | 66 | Returns whether the operation succeeded. |
70 | */ | 67 | */ |
71 | bool FileManager::saveFile( const DocLnk &f, const QByteArray &data ) | 68 | bool FileManager::saveFile( const DocLnk &f, const QByteArray &data ) |
72 | { | 69 | { |
73 | QString fn = f.file() + ".new"; | 70 | QString fn = f.file() + ".new"; |
74 | ensurePathExists( fn ); | 71 | ensurePathExists( fn ); |
75 | QFile fl( fn ); | 72 | QFile fl( fn ); |
76 | if ( !fl.open( IO_WriteOnly|IO_Raw ) ) { | 73 | if ( !fl.open( IO_WriteOnly|IO_Raw ) ) { |
77 | qWarning("open failed"); | 74 | qWarning("open failed"); |
78 | return FALSE; | 75 | return FALSE; |
79 | } | 76 | } |
80 | int total_written = fl.writeBlock( data ); | 77 | int total_written = fl.writeBlock( data ); |
81 | fl.close(); | 78 | fl.close(); |
82 | if ( total_written != int(data.size()) || !f.writeLink() ) { | 79 | if ( total_written != int(data.size()) || !f.writeLink() ) { |
83 | QFile::remove( fn ); | 80 | QFile::remove( fn ); |
84 | return FALSE; | 81 | return FALSE; |
85 | } | 82 | } |
86 | qDebug("total written %d out of %d", total_written, data.size()); | 83 | qDebug("total written %d out of %d", total_written, data.size()); |
87 | // else rename the file... | 84 | // else rename the file... |
88 | if ( !renameFile( fn.latin1(), f.file().latin1() ) ) { | 85 | if ( !renameFile( fn.latin1(), f.file().latin1() ) ) { |
89 | qWarning( "problem renaming file %s to %s, errno: %d", fn.latin1(), | 86 | qWarning( "problem renaming file %s to %s, errno: %d", fn.latin1(), |
90 | f.file().latin1(), errno ); | 87 | f.file().latin1(), errno ); |
91 | // remove the file... | 88 | // remove the file... |
92 | } | 89 | } |
93 | return TRUE; | 90 | return TRUE; |
94 | } | 91 | } |
95 | 92 | ||
96 | /*! | 93 | /*! |
97 | Saves \a text as the document specified by \a f. | 94 | Saves \a text as the document specified by \a f. |
98 | 95 | ||
99 | The text is saved in UTF8 format. | 96 | The text is saved in UTF8 format. |
100 | 97 | ||
101 | Returns whether the operation succeeded. | 98 | Returns whether the operation succeeded. |
102 | */ | 99 | */ |
103 | bool FileManager::saveFile( const DocLnk &f, const QString &text ) | 100 | bool FileManager::saveFile( const DocLnk &f, const QString &text ) |
104 | { | 101 | { |
105 | QString fn = f.file() + ".new"; | 102 | QString fn = f.file() + ".new"; |
106 | ensurePathExists( fn ); | 103 | ensurePathExists( fn ); |
107 | QFile fl( fn ); | 104 | QFile fl( fn ); |
108 | if ( !fl.open( IO_WriteOnly|IO_Raw ) ) { | 105 | if ( !fl.open( IO_WriteOnly|IO_Raw ) ) { |
109 | qWarning("open failed"); | 106 | qWarning("open failed"); |
110 | return FALSE; | 107 | return FALSE; |
111 | } | 108 | } |
112 | 109 | ||
113 | QCString cstr = text.utf8(); | 110 | QCString cstr = text.utf8(); |
114 | int total_written; | 111 | int total_written; |
115 | total_written = fl.writeBlock( cstr.data(), cstr.length() ); | 112 | total_written = fl.writeBlock( cstr.data(), cstr.length() ); |
116 | fl.close(); | 113 | fl.close(); |
117 | if ( total_written != int(cstr.length()) || !f.writeLink() ) { | 114 | if ( total_written != int(cstr.length()) || !f.writeLink() ) { |
118 | QFile::remove( fn ); | 115 | QFile::remove( fn ); |
119 | return FALSE; | 116 | return FALSE; |
120 | } | 117 | } |
121 | // okay now rename the file.. | 118 | // okay now rename the file.. |
122 | if ( !renameFile( fn.latin1(), f.file().latin1() ) ) { | 119 | if ( !renameFile( fn.latin1(), f.file().latin1() ) ) { |
123 | qWarning( "problem renaming file %s to %s, errno: %d", fn.latin1(), | 120 | qWarning( "problem renaming file %s to %s, errno: %d", fn.latin1(), |
124 | f.file().latin1(), errno ); | 121 | f.file().latin1(), errno ); |
125 | 122 | ||
126 | } | 123 | } |
127 | return TRUE; | 124 | return TRUE; |
128 | } | 125 | } |
129 | 126 | ||
130 | 127 | ||
131 | /*! | 128 | /*! |
132 | Loads \a text from the document specified by \a f. | 129 | Loads \a text from the document specified by \a f. |
133 | 130 | ||
134 | The text is required to be in UTF8 format. | 131 | The text is required to be in UTF8 format. |
135 | 132 | ||
136 | Returns whether the operation succeeded. | 133 | Returns whether the operation succeeded. |
137 | */ | 134 | */ |
138 | bool FileManager::loadFile( const DocLnk &f, QString &text ) | 135 | bool FileManager::loadFile( const DocLnk &f, QString &text ) |
139 | { | 136 | { |
140 | QString fn = f.file(); | 137 | QString fn = f.file(); |
141 | QFile fl( fn ); | 138 | QFile fl( fn ); |
142 | if ( !fl.open( IO_ReadOnly ) ) | 139 | if ( !fl.open( IO_ReadOnly ) ) |
143 | return FALSE; | 140 | return FALSE; |
144 | QTextStream ts( &fl ); | 141 | QTextStream ts( &fl ); |
145 | #if QT_VERSION <= 230 && defined(QT_NO_CODECS) | 142 | #if QT_VERSION <= 230 && defined(QT_NO_CODECS) |
146 | // The below should work, but doesn't in Qt 2.3.0 | 143 | // The below should work, but doesn't in Qt 2.3.0 |
147 | ts.setCodec( QTextCodec::codecForMib( 106 ) ); | 144 | ts.setCodec( QTextCodec::codecForMib( 106 ) ); |
148 | #else | 145 | #else |
149 | ts.setEncoding( QTextStream::UnicodeUTF8 ); | 146 | ts.setEncoding( QTextStream::UnicodeUTF8 ); |
150 | #endif | 147 | #endif |
151 | text = ts.read(); | 148 | text = ts.read(); |
152 | fl.close(); | 149 | fl.close(); |
153 | return TRUE; | 150 | return TRUE; |
154 | } | 151 | } |
155 | 152 | ||
156 | 153 | ||
157 | /*! | 154 | /*! |
158 | Loads \a ba from the document specified by \a f. | 155 | Loads \a ba from the document specified by \a f. |
159 | 156 | ||
160 | Returns whether the operation succeeded. | 157 | Returns whether the operation succeeded. |
161 | */ | 158 | */ |
162 | bool FileManager::loadFile( const DocLnk &f, QByteArray &ba ) | 159 | bool FileManager::loadFile( const DocLnk &f, QByteArray &ba ) |
163 | { | 160 | { |
164 | QString fn = f.file(); | 161 | QString fn = f.file(); |
165 | QFile fl( fn ); | 162 | QFile fl( fn ); |
166 | if ( !fl.open( IO_ReadOnly ) ) | 163 | if ( !fl.open( IO_ReadOnly ) ) |
167 | return FALSE; | 164 | return FALSE; |
168 | ba.resize( fl.size() ); | 165 | ba.resize( fl.size() ); |
169 | if ( fl.size() > 0 ) | 166 | if ( fl.size() > 0 ) |
170 | fl.readBlock( ba.data(), fl.size() ); | 167 | fl.readBlock( ba.data(), fl.size() ); |
171 | fl.close(); | 168 | fl.close(); |
172 | return TRUE; | 169 | return TRUE; |
173 | } | 170 | } |
174 | 171 | ||
175 | /*! | 172 | /*! |
176 | Copies the document specified by \a src to the document specified | 173 | Copies the document specified by \a src to the document specified |
177 | by \a dest. | 174 | by \a dest. |
178 | 175 | ||
179 | Returns whether the operation succeeded. | 176 | Returns whether the operation succeeded. |
180 | */ | 177 | */ |
181 | bool FileManager::copyFile( const AppLnk &src, const AppLnk &dest ) | 178 | bool FileManager::copyFile( const AppLnk &src, const AppLnk &dest ) |
182 | { | 179 | { |
183 | QFile sf( src.file() ); | 180 | QFile sf( src.file() ); |
184 | if ( !sf.open( IO_ReadOnly ) ) | 181 | if ( !sf.open( IO_ReadOnly ) ) |
185 | return FALSE; | 182 | return FALSE; |
186 | 183 | ||
187 | QString fn = dest.file() + ".new"; | 184 | QString fn = dest.file() + ".new"; |
188 | ensurePathExists( fn ); | 185 | ensurePathExists( fn ); |
189 | QFile df( fn ); | 186 | QFile df( fn ); |
190 | if ( !df.open( IO_WriteOnly|IO_Raw ) ) | 187 | if ( !df.open( IO_WriteOnly|IO_Raw ) ) |
191 | return FALSE; | 188 | return FALSE; |
192 | 189 | ||
193 | const int bufsize = 16384; | 190 | const int bufsize = 16384; |
194 | char buffer[bufsize]; | 191 | char buffer[bufsize]; |
195 | bool ok = TRUE; | 192 | bool ok = TRUE; |
196 | int bytesRead = 0; | 193 | int bytesRead = 0; |
197 | while ( ok && !sf.atEnd() ) { | 194 | while ( ok && !sf.atEnd() ) { |
198 | bytesRead = sf.readBlock( buffer, bufsize ); | 195 | bytesRead = sf.readBlock( buffer, bufsize ); |
199 | if ( bytesRead < 0 ) | 196 | if ( bytesRead < 0 ) |
200 | ok = FALSE; | 197 | ok = FALSE; |
201 | while ( ok && bytesRead > 0 ) { | 198 | while ( ok && bytesRead > 0 ) { |
202 | int bytesWritten = df.writeBlock( buffer, bytesRead ); | 199 | int bytesWritten = df.writeBlock( buffer, bytesRead ); |
203 | if ( bytesWritten < 0 ) | 200 | if ( bytesWritten < 0 ) |
204 | ok = FALSE; | 201 | ok = FALSE; |
205 | else | 202 | else |
206 | bytesRead -= bytesWritten; | 203 | bytesRead -= bytesWritten; |
207 | } | 204 | } |
208 | } | 205 | } |
209 | 206 | ||
210 | if ( ok ) | 207 | if ( ok ) |
211 | ok = dest.writeLink(); | 208 | ok = dest.writeLink(); |
212 | 209 | ||
213 | if ( ok ) { | 210 | if ( ok ) { |
214 | // okay now rename the file... | 211 | // okay now rename the file... |
215 | if ( !renameFile( fn.latin1(), dest.file().latin1() ) ) { | 212 | if ( !renameFile( fn.latin1(), dest.file().latin1() ) ) { |
216 | qWarning( "problem renaming file %s to %s, errno: %d", fn.latin1(), | 213 | qWarning( "problem renaming file %s to %s, errno: %d", fn.latin1(), |
217 | dest.file().latin1(), errno ); | 214 | dest.file().latin1(), errno ); |
218 | // remove the tmp file, otherwise, it will just lay around... | 215 | // remove the tmp file, otherwise, it will just lay around... |
219 | QFile::remove( fn.latin1() ); | 216 | QFile::remove( fn.latin1() ); |
220 | } | 217 | } |
221 | } else { | 218 | } else { |
222 | QFile::remove( fn.latin1() ); | 219 | QFile::remove( fn.latin1() ); |
223 | } | 220 | } |
224 | 221 | ||
225 | return ok; | 222 | return ok; |
226 | } | 223 | } |
227 | 224 | ||
228 | bool FileManager::copyFile( const QString & src, const QString & dest ) { | 225 | bool FileManager::copyFile( const QString & src, const QString & dest ) { |
229 | bool success = true; | 226 | bool success = true; |
230 | struct stat status; | 227 | struct stat status; |
231 | int read_fd=0; | 228 | int read_fd=0; |
232 | int write_fd=0; | 229 | int write_fd=0; |
233 | struct stat stat_buf; | 230 | struct stat stat_buf; |
234 | off_t offset = 0; | 231 | off_t offset = 0; |
235 | QFile srcFile(src); | 232 | QFile srcFile(src); |
236 | QFile destFile(dest); | 233 | QFile destFile(dest); |
237 | 234 | ||
238 | if(!srcFile.open( IO_ReadOnly|IO_Raw)) { | 235 | if(!srcFile.open( IO_ReadOnly|IO_Raw)) { |
239 | return success = false; | 236 | return success = false; |
240 | } | 237 | } |
241 | read_fd = srcFile.handle(); | 238 | read_fd = srcFile.handle(); |
242 | if(read_fd != -1) { | 239 | if(read_fd != -1) { |
243 | fstat (read_fd, &stat_buf); | 240 | fstat (read_fd, &stat_buf); |
244 | if( !destFile.open( IO_WriteOnly|IO_Raw ) ) | 241 | if( !destFile.open( IO_WriteOnly|IO_Raw ) ) |
245 | return success = false; | 242 | return success = false; |
246 | write_fd = destFile.handle(); | 243 | write_fd = destFile.handle(); |
247 | if(write_fd != -1) { | 244 | if(write_fd != -1) { |
248 | int err=0; | 245 | int err=0; |
249 | QString msg; | 246 | QString msg; |
250 | #ifdef Q_OS_MACX | 247 | #ifdef Q_OS_MACX |
251 | #ifdef SENDFILE | 248 | #ifdef SENDFILE |
252 | /* FreeBSD does support a different kind of | 249 | /* FreeBSD does support a different kind of |
253 | * sendfile. (eilers) | 250 | * sendfile. (eilers) |
254 | * I took this from Very Secure FTPd | 251 | * I took this from Very Secure FTPd |
255 | * Licence: GPL | 252 | * Licence: GPL |
256 | * Author: Chris Evans | 253 | * Author: Chris Evans |
257 | * sysdeputil.c | 254 | * sysdeputil.c |
258 | */ | 255 | */ |
259 | /* XXX - start_pos will truncate on 32-bit machines - can we | 256 | /* XXX - start_pos will truncate on 32-bit machines - can we |
260 | * say "start from current pos"? | 257 | * say "start from current pos"? |
261 | */ | 258 | */ |
262 | off_t written = 0; | 259 | off_t written = 0; |
263 | int retval = 0; | 260 | int retval = 0; |
264 | retval = sendfile(read_fd, write_fd, offset, stat_buf.st_size, NULL, | 261 | retval = sendfile(read_fd, write_fd, offset, stat_buf.st_size, NULL, |
265 | &written, 0); | 262 | &written, 0); |
266 | /* Translate to Linux-like retval */ | 263 | /* Translate to Linux-like retval */ |
267 | if (written > 0) | 264 | if (written > 0) |
268 | { | 265 | { |
269 | err = (int) written; | 266 | err = (int) written; |
270 | } | 267 | } |
271 | #else /* SENDFILE */ | 268 | #else /* SENDFILE */ |
272 | err == -1; | 269 | err == -1; |
273 | msg = "FAILURE: Using unsupported function \"sendfile()\" Need Workaround !!"; | 270 | msg = "FAILURE: Using unsupported function \"sendfile()\" Need Workaround !!"; |
274 | success = false; | 271 | success = false; |
275 | # warning "Need workaround for sendfile!!(eilers)" | 272 | # warning "Need workaround for sendfile!!(eilers)" |
276 | #endif /* SENDFILE */ | 273 | #endif /* SENDFILE */ |
277 | 274 | ||
278 | #else | 275 | #else |
279 | err = sendfile(write_fd, read_fd, &offset, stat_buf.st_size); | 276 | err = sendfile(write_fd, read_fd, &offset, stat_buf.st_size); |
280 | if( err == -1) { | 277 | if( err == -1) { |
281 | switch(err) { | 278 | switch(err) { |
282 | case EBADF : msg = "The input file was not opened for reading or the output file was not opened for writing. "; | 279 | case EBADF : msg = "The input file was not opened for reading or the output file was not opened for writing. "; |
283 | case EINVAL: msg = "Descriptor is not valid or locked. "; | 280 | case EINVAL: msg = "Descriptor is not valid or locked. "; |
284 | case ENOMEM: msg = "Insufficient memory to read from in_fd."; | 281 | case ENOMEM: msg = "Insufficient memory to read from in_fd."; |
285 | case EIO: msg = "Unspecified error while reading from in_fd."; | 282 | case EIO: msg = "Unspecified error while reading from in_fd."; |
286 | }; | 283 | }; |
287 | success = false; | 284 | success = false; |
288 | } | 285 | } |
289 | #endif /* Q_OS_MACX */ | 286 | #endif /* Q_OS_MACX */ |
290 | if( !success ) | 287 | if( !success ) |
291 | qWarning( msg ); | 288 | qWarning( msg ); |
292 | } else { | 289 | } else { |
293 | qWarning("open write failed %s, %s",src.latin1(), dest.latin1()); | 290 | qWarning("open write failed %s, %s",src.latin1(), dest.latin1()); |
294 | success = false; | 291 | success = false; |
295 | } | 292 | } |
296 | } else { | 293 | } else { |
297 | qWarning("open read failed %s, %s",src.latin1(), dest.latin1()); | 294 | qWarning("open read failed %s, %s",src.latin1(), dest.latin1()); |
298 | success = false; | 295 | success = false; |
299 | } | 296 | } |
300 | srcFile.close(); | 297 | srcFile.close(); |
301 | destFile.close(); | 298 | destFile.close(); |
302 | // Set file permissions | 299 | // Set file permissions |
303 | if( stat( (const char *) src, &status ) == 0 ) { | 300 | if( stat( (const char *) src, &status ) == 0 ) { |
304 | chmod( (const char *) dest, status.st_mode ); | 301 | chmod( (const char *) dest, status.st_mode ); |
305 | } | 302 | } |
306 | 303 | ||
307 | return success; | 304 | return success; |
308 | } | 305 | } |
309 | 306 | ||
310 | 307 | ||
311 | bool FileManager::renameFile( const QString & src, const QString & dest ) { | 308 | bool FileManager::renameFile( const QString & src, const QString & dest ) { |
312 | if(copyFile( src, dest )) { | 309 | if(copyFile( src, dest )) { |
313 | if(QFile::remove(src) ) { | 310 | if(QFile::remove(src) ) { |
314 | return true; | 311 | return true; |
315 | } | 312 | } |
316 | } | 313 | } |
317 | return false; | 314 | return false; |
318 | } | 315 | } |
319 | 316 | ||
320 | /* | 317 | /* |
321 | bool FileManager::copyFile( const QString & src, const QString & dest ) { | 318 | bool FileManager::copyFile( const QString & src, const QString & dest ) { |
322 | bool success = true; | 319 | bool success = true; |
323 | struct stat status; | 320 | struct stat status; |
324 | int read_fd=0; | 321 | int read_fd=0; |
325 | int write_fd=0; | 322 | int write_fd=0; |
326 | struct stat stat_buf; | 323 | struct stat stat_buf; |
327 | off_t offset = 0; | 324 | off_t offset = 0; |
328 | QFile srcFile(src); | 325 | QFile srcFile(src); |
329 | QFile destFile(dest); | 326 | QFile destFile(dest); |
330 | 327 | ||
331 | if(!srcFile.open( IO_ReadOnly|IO_Raw)) { | 328 | if(!srcFile.open( IO_ReadOnly|IO_Raw)) { |
332 | return success = false; | 329 | return success = false; |
333 | } | 330 | } |
334 | read_fd = srcFile.handle(); | 331 | read_fd = srcFile.handle(); |
335 | if(read_fd != -1) { | 332 | if(read_fd != -1) { |
336 | fstat (read_fd, &stat_buf); | 333 | fstat (read_fd, &stat_buf); |
337 | if( !destFile.open( IO_WriteOnly|IO_Raw ) ) | 334 | if( !destFile.open( IO_WriteOnly|IO_Raw ) ) |
338 | return success = false; | 335 | return success = false; |
339 | write_fd = destFile.handle(); | 336 | write_fd = destFile.handle(); |
340 | if(write_fd != -1) { | 337 | if(write_fd != -1) { |
341 | int err=0; | 338 | int err=0; |
342 | QString msg; | 339 | QString msg; |
343 | err = sendfile(write_fd, read_fd, &offset, stat_buf.st_size); | 340 | err = sendfile(write_fd, read_fd, &offset, stat_buf.st_size); |
344 | if( err == -1) { | 341 | if( err == -1) { |
345 | switch(err) { | 342 | switch(err) { |
346 | case EBADF : msg = "The input file was not opened for reading or the output file was not opened for writing. "; | 343 | case EBADF : msg = "The input file was not opened for reading or the output file was not opened for writing. "; |
347 | case EINVAL: msg = "Descriptor is not valid or locked. "; | 344 | case EINVAL: msg = "Descriptor is not valid or locked. "; |
348 | case ENOMEM: msg = "Insufficient memory to read from in_fd."; | 345 | case ENOMEM: msg = "Insufficient memory to read from in_fd."; |
349 | case EIO: msg = "Unspecified error while reading from in_fd."; | 346 | case EIO: msg = "Unspecified error while reading from in_fd."; |
350 | }; | 347 | }; |
351 | success = false; | 348 | success = false; |
352 | } | 349 | } |
353 | } else { | 350 | } else { |
354 | qWarning("open write failed %s, %s",src.latin1(), dest.latin1()); | 351 | qWarning("open write failed %s, %s",src.latin1(), dest.latin1()); |
355 | success = false; | 352 | success = false; |
356 | } | 353 | } |
357 | } else { | 354 | } else { |
358 | qWarning("open read failed %s, %s",src.latin1(), dest.latin1()); | 355 | qWarning("open read failed %s, %s",src.latin1(), dest.latin1()); |
359 | success = false; | 356 | success = false; |
360 | } | 357 | } |
361 | srcFile.close(); | 358 | srcFile.close(); |
362 | destFile.close(); | 359 | destFile.close(); |
363 | // Set file permissions | 360 | // Set file permissions |
364 | if( stat( (const char *) src, &status ) == 0 ) { | 361 | if( stat( (const char *) src, &status ) == 0 ) { |
365 | chmod( (const char *) dest, status.st_mode ); | 362 | chmod( (const char *) dest, status.st_mode ); |
366 | } | 363 | } |
367 | 364 | ||
368 | return success; | 365 | return success; |
369 | } | 366 | } |
370 | 367 | ||
371 | 368 | ||
372 | bool FileManager::renameFile( const QString & src, const QString & dest ) { | 369 | bool FileManager::renameFile( const QString & src, const QString & dest ) { |
373 | if(copyFile( src, dest )) { | 370 | if(copyFile( src, dest )) { |
374 | if(QFile::remove(src) ) { | 371 | if(QFile::remove(src) ) { |
375 | return true; | 372 | return true; |
376 | } | 373 | } |
377 | } | 374 | } |
378 | return false; | 375 | return false; |
379 | } | 376 | } |
380 | */ | 377 | */ |
381 | 378 | ||
382 | /*! | 379 | /*! |
383 | Opens the document specified by \a f as a readable QIODevice. | 380 | Opens the document specified by \a f as a readable QIODevice. |
384 | The caller must delete the return value. | 381 | The caller must delete the return value. |
385 | 382 | ||
386 | Returns 0 if the operation fails. | 383 | Returns 0 if the operation fails. |
387 | */ | 384 | */ |
388 | QIODevice* FileManager::openFile( const DocLnk& f ) | 385 | QIODevice* FileManager::openFile( const DocLnk& f ) |
389 | { | 386 | { |
390 | QString fn = f.file(); | 387 | QString fn = f.file(); |
391 | QFile* fl = new QFile( fn ); | 388 | QFile* fl = new QFile( fn ); |
392 | if ( !fl->open( IO_ReadOnly ) ) { | 389 | if ( !fl->open( IO_ReadOnly ) ) { |
393 | delete fl; | 390 | delete fl; |
394 | fl = 0; | 391 | fl = 0; |
395 | } | 392 | } |
396 | return fl; | 393 | return fl; |
397 | } | 394 | } |
398 | 395 | ||
399 | /*! | 396 | /*! |
400 | Opens the document specified by \a f as a writable QIODevice. | 397 | Opens the document specified by \a f as a writable QIODevice. |
401 | The caller must delete the return value. | 398 | The caller must delete the return value. |
402 | 399 | ||
403 | Returns 0 if the operation fails. | 400 | Returns 0 if the operation fails. |
404 | */ | 401 | */ |
405 | QIODevice* FileManager::saveFile( const DocLnk& f ) | 402 | QIODevice* FileManager::saveFile( const DocLnk& f ) |
406 | { | 403 | { |
407 | QString fn = f.file(); | 404 | QString fn = f.file(); |
408 | ensurePathExists( fn ); | 405 | ensurePathExists( fn ); |
409 | QFile* fl = new QFile( fn ); | 406 | QFile* fl = new QFile( fn ); |
410 | if ( fl->open( IO_WriteOnly ) ) { | 407 | if ( fl->open( IO_WriteOnly ) ) { |
411 | f.writeLink(); | 408 | f.writeLink(); |
diff --git a/library/fileselector.cpp b/library/fileselector.cpp index 4039243..7c29aba 100644 --- a/library/fileselector.cpp +++ b/library/fileselector.cpp | |||
@@ -1,419 +1,417 @@ | |||
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 | 20 | ||
21 | // WARNING: Do *NOT* define this yourself. The SL5xxx from SHARP does NOT | 21 | // WARNING: Do *NOT* define this yourself. The SL5xxx from SHARP does NOT |
22 | // have this class. | 22 | // have this class. |
23 | #define QTOPIA_INTERNAL_FSLP | 23 | #define QTOPIA_INTERNAL_FSLP |
24 | 24 | ||
25 | #include "fileselector.h" | 25 | #include "fileselector.h" |
26 | #include "fileselector_p.h" | 26 | #include "fileselector_p.h" |
27 | #include "global.h" | 27 | #include "global.h" |
28 | #include "resource.h" | 28 | #include "resource.h" |
29 | #include "config.h" | 29 | #include "config.h" |
30 | #include "applnk.h" | ||
31 | #include "storage.h" | 30 | #include "storage.h" |
32 | #include "qpemenubar.h" | 31 | #include "qpemenubar.h" |
33 | #include <qcopchannel_qws.h> | 32 | #include <qcopchannel_qws.h> |
34 | #include "lnkproperties.h" | 33 | #include "lnkproperties.h" |
35 | #include "applnk.h" | ||
36 | #include <qpe/qpeapplication.h> | 34 | #include <qpe/qpeapplication.h> |
37 | #include "categorymenu.h" | 35 | #include "categorymenu.h" |
38 | #include "categoryselect.h" | 36 | #include "categoryselect.h" |
39 | #include "mimetype.h" | 37 | #include "mimetype.h" |
40 | #include <qpe/categories.h> | 38 | #include <qpe/categories.h> |
41 | 39 | ||
42 | #include <stdlib.h> | 40 | #include <stdlib.h> |
43 | 41 | ||
44 | #include <qdir.h> | 42 | #include <qdir.h> |
45 | #include <qwidget.h> | 43 | #include <qwidget.h> |
46 | #include <qpopupmenu.h> | 44 | #include <qpopupmenu.h> |
47 | #include <qtoolbutton.h> | 45 | #include <qtoolbutton.h> |
48 | #include <qpushbutton.h> | 46 | #include <qpushbutton.h> |
49 | #include <qheader.h> | 47 | #include <qheader.h> |
50 | #include <qtooltip.h> | 48 | #include <qtooltip.h> |
51 | #include <qwhatsthis.h> | 49 | #include <qwhatsthis.h> |
52 | 50 | ||
53 | class TypeCombo : public QComboBox | 51 | class TypeCombo : public QComboBox |
54 | { | 52 | { |
55 | Q_OBJECT | 53 | Q_OBJECT |
56 | public: | 54 | public: |
57 | TypeCombo( QWidget *parent, const char *name=0 ) | 55 | TypeCombo( QWidget *parent, const char *name=0 ) |
58 | : QComboBox( parent, name ) | 56 | : QComboBox( parent, name ) |
59 | { | 57 | { |
60 | connect( this, SIGNAL(activated(int)), this, SLOT(selectType(int)) ); | 58 | connect( this, SIGNAL(activated(int)), this, SLOT(selectType(int)) ); |
61 | } | 59 | } |
62 | 60 | ||
63 | void reread( DocLnkSet &files, const QString &filter ); | 61 | void reread( DocLnkSet &files, const QString &filter ); |
64 | 62 | ||
65 | signals: | 63 | signals: |
66 | void selected( const QString & ); | 64 | void selected( const QString & ); |
67 | 65 | ||
68 | protected slots: | 66 | protected slots: |
69 | void selectType( int idx ) { | 67 | void selectType( int idx ) { |
70 | emit selected( typelist[idx] ); | 68 | emit selected( typelist[idx] ); |
71 | } | 69 | } |
72 | 70 | ||
73 | protected: | 71 | protected: |
74 | QStringList typelist; | 72 | QStringList typelist; |
75 | QString prev; | 73 | QString prev; |
76 | }; | 74 | }; |
77 | 75 | ||
78 | void TypeCombo::reread( DocLnkSet &files, const QString &filter ) | 76 | void TypeCombo::reread( DocLnkSet &files, const QString &filter ) |
79 | { | 77 | { |
80 | typelist.clear(); | 78 | typelist.clear(); |
81 | QStringList filters = QStringList::split( ';', filter ); | 79 | QStringList filters = QStringList::split( ';', filter ); |
82 | int pos = filter.find( '/' ); | 80 | int pos = filter.find( '/' ); |
83 | //### do for each filter | 81 | //### do for each filter |
84 | if ( filters.count() == 1 && pos >= 0 && filter[pos+1] != '*' ) { | 82 | if ( filters.count() == 1 && pos >= 0 && filter[pos+1] != '*' ) { |
85 | typelist.append( filter ); | 83 | typelist.append( filter ); |
86 | clear(); | 84 | clear(); |
87 | QString minor = filter.mid( pos+1 ); | 85 | QString minor = filter.mid( pos+1 ); |
88 | minor[0] = minor[0].upper(); | 86 | minor[0] = minor[0].upper(); |
89 | insertItem( tr("%1 files").arg(minor) ); | 87 | insertItem( tr("%1 files").arg(minor) ); |
90 | setCurrentItem(0); | 88 | setCurrentItem(0); |
91 | setEnabled( FALSE ); | 89 | setEnabled( FALSE ); |
92 | return; | 90 | return; |
93 | } | 91 | } |
94 | 92 | ||
95 | QListIterator<DocLnk> dit( files.children() ); | 93 | QListIterator<DocLnk> dit( files.children() ); |
96 | for ( ; dit.current(); ++dit ) { | 94 | for ( ; dit.current(); ++dit ) { |
97 | if ( !typelist.contains( (*dit)->type() ) ) | 95 | if ( !typelist.contains( (*dit)->type() ) ) |
98 | typelist.append( (*dit)->type() ); | 96 | typelist.append( (*dit)->type() ); |
99 | } | 97 | } |
100 | 98 | ||
101 | QStringList types; | 99 | QStringList types; |
102 | QStringList::ConstIterator it; | 100 | QStringList::ConstIterator it; |
103 | for (it = typelist.begin(); it!=typelist.end(); ++it) { | 101 | for (it = typelist.begin(); it!=typelist.end(); ++it) { |
104 | QString t = *it; | 102 | QString t = *it; |
105 | if ( t.left(12) == "application/" ) { | 103 | if ( t.left(12) == "application/" ) { |
106 | MimeType mt(t); | 104 | MimeType mt(t); |
107 | const AppLnk* app = mt.application(); | 105 | const AppLnk* app = mt.application(); |
108 | if ( app ) | 106 | if ( app ) |
109 | t = app->name(); | 107 | t = app->name(); |
110 | else | 108 | else |
111 | t = t.mid(12); | 109 | t = t.mid(12); |
112 | } else { | 110 | } else { |
113 | QString major, minor; | 111 | QString major, minor; |
114 | int pos = t.find( '/' ); | 112 | int pos = t.find( '/' ); |
115 | if ( pos >= 0 ) { | 113 | if ( pos >= 0 ) { |
116 | major = t.left( pos ); | 114 | major = t.left( pos ); |
117 | minor = t.mid( pos+1 ); | 115 | minor = t.mid( pos+1 ); |
118 | } | 116 | } |
119 | if ( minor.find( "x-" ) == 0 ) | 117 | if ( minor.find( "x-" ) == 0 ) |
120 | minor = minor.mid( 2 ); | 118 | minor = minor.mid( 2 ); |
121 | minor[0] = minor[0].upper(); | 119 | minor[0] = minor[0].upper(); |
122 | major[0] = major[0].upper(); | 120 | major[0] = major[0].upper(); |
123 | if ( filters.count() > 1 ) | 121 | if ( filters.count() > 1 ) |
124 | t = tr("%1 %2", "minor mimetype / major mimetype").arg(minor).arg(major); | 122 | t = tr("%1 %2", "minor mimetype / major mimetype").arg(minor).arg(major); |
125 | else | 123 | else |
126 | t = minor; | 124 | t = minor; |
127 | } | 125 | } |
128 | types += tr("%1 files").arg(t); | 126 | types += tr("%1 files").arg(t); |
129 | } | 127 | } |
130 | for (it = filters.begin(); it!=filters.end(); ++it) { | 128 | for (it = filters.begin(); it!=filters.end(); ++it) { |
131 | typelist.append( *it ); | 129 | typelist.append( *it ); |
132 | int pos = (*it).find( '/' ); | 130 | int pos = (*it).find( '/' ); |
133 | if ( pos >= 0 ) { | 131 | if ( pos >= 0 ) { |
134 | QString maj = (*it).left( pos ); | 132 | QString maj = (*it).left( pos ); |
135 | maj[0] = maj[0].upper(); | 133 | maj[0] = maj[0].upper(); |
136 | types << tr("All %1 files").arg(maj); | 134 | types << tr("All %1 files").arg(maj); |
137 | } | 135 | } |
138 | } | 136 | } |
139 | if ( filters.count() > 1 ) { | 137 | if ( filters.count() > 1 ) { |
140 | typelist.append( filter ); | 138 | typelist.append( filter ); |
141 | types << tr("All files"); | 139 | types << tr("All files"); |
142 | } | 140 | } |
143 | prev = currentText(); | 141 | prev = currentText(); |
144 | clear(); | 142 | clear(); |
145 | insertStringList(types); | 143 | insertStringList(types); |
146 | for (int i=0; i<count(); i++) { | 144 | for (int i=0; i<count(); i++) { |
147 | if ( text(i) == prev ) { | 145 | if ( text(i) == prev ) { |
148 | setCurrentItem(i); | 146 | setCurrentItem(i); |
149 | break; | 147 | break; |
150 | } | 148 | } |
151 | } | 149 | } |
152 | if ( prev.isNull() ) | 150 | if ( prev.isNull() ) |
153 | setCurrentItem(count()-1); | 151 | setCurrentItem(count()-1); |
154 | setEnabled( TRUE ); | 152 | setEnabled( TRUE ); |
155 | } | 153 | } |
156 | 154 | ||
157 | 155 | ||
158 | //=========================================================================== | 156 | //=========================================================================== |
159 | 157 | ||
160 | FileSelectorItem::FileSelectorItem( QListView *parent, const DocLnk &f ) | 158 | FileSelectorItem::FileSelectorItem( QListView *parent, const DocLnk &f ) |
161 | : QListViewItem( parent ), fl( f ) | 159 | : QListViewItem( parent ), fl( f ) |
162 | { | 160 | { |
163 | setText( 0, f.name() ); | 161 | setText( 0, f.name() ); |
164 | setPixmap( 0, f.pixmap() ); | 162 | setPixmap( 0, f.pixmap() ); |
165 | } | 163 | } |
166 | 164 | ||
167 | FileSelectorItem::~FileSelectorItem() | 165 | FileSelectorItem::~FileSelectorItem() |
168 | { | 166 | { |
169 | } | 167 | } |
170 | 168 | ||
171 | FileSelectorView::FileSelectorView( QWidget *parent, const char *name ) | 169 | FileSelectorView::FileSelectorView( QWidget *parent, const char *name ) |
172 | : QListView( parent, name ) | 170 | : QListView( parent, name ) |
173 | { | 171 | { |
174 | setAllColumnsShowFocus( TRUE ); | 172 | setAllColumnsShowFocus( TRUE ); |
175 | addColumn( tr( "Name" ) ); | 173 | addColumn( tr( "Name" ) ); |
176 | header()->hide(); | 174 | header()->hide(); |
177 | } | 175 | } |
178 | 176 | ||
179 | FileSelectorView::~FileSelectorView() | 177 | FileSelectorView::~FileSelectorView() |
180 | { | 178 | { |
181 | } | 179 | } |
182 | 180 | ||
183 | void FileSelectorView::keyPressEvent( QKeyEvent *e ) | 181 | void FileSelectorView::keyPressEvent( QKeyEvent *e ) |
184 | { | 182 | { |
185 | QString txt = e->text(); | 183 | QString txt = e->text(); |
186 | if (e->key() == Key_Space) | 184 | if (e->key() == Key_Space) |
187 | emit returnPressed( currentItem() ); | 185 | emit returnPressed( currentItem() ); |
188 | else if ( !txt.isNull() && txt[0] > ' ' && e->key() < 0x1000 ) | 186 | else if ( !txt.isNull() && txt[0] > ' ' && e->key() < 0x1000 ) |
189 | e->ignore(); | 187 | e->ignore(); |
190 | else | 188 | else |
191 | QListView::keyPressEvent(e); | 189 | QListView::keyPressEvent(e); |
192 | } | 190 | } |
193 | 191 | ||
194 | class NewDocItem : public FileSelectorItem | 192 | class NewDocItem : public FileSelectorItem |
195 | { | 193 | { |
196 | public: | 194 | public: |
197 | NewDocItem( QListView *parent, const DocLnk &f ) | 195 | NewDocItem( QListView *parent, const DocLnk &f ) |
198 | : FileSelectorItem( parent, f ) { | 196 | : FileSelectorItem( parent, f ) { |
199 | setText( 0, QObject::tr("New Document") ); | 197 | setText( 0, QObject::tr("New Document") ); |
200 | QImage img( Resource::loadImage( "new" ) ); | 198 | QImage img( Resource::loadImage( "new" ) ); |
201 | QPixmap pm; | 199 | QPixmap pm; |
202 | pm = img.smoothScale( AppLnk::smallIconSize(), AppLnk::smallIconSize() ); | 200 | pm = img.smoothScale( AppLnk::smallIconSize(), AppLnk::smallIconSize() ); |
203 | setPixmap( 0, pm ); | 201 | setPixmap( 0, pm ); |
204 | } | 202 | } |
205 | QString key ( int, bool ) const { | 203 | QString key ( int, bool ) const { |
206 | return QString("\n"); | 204 | return QString("\n"); |
207 | } | 205 | } |
208 | 206 | ||
209 | void paintCell( QPainter *p, const QColorGroup &cg, int column, int width, int alignment ) { | 207 | void paintCell( QPainter *p, const QColorGroup &cg, int column, int width, int alignment ) { |
210 | QFont oldFont = p->font(); | 208 | QFont oldFont = p->font(); |
211 | QFont newFont = p->font(); | 209 | QFont newFont = p->font(); |
212 | newFont.setWeight( QFont::Bold ); | 210 | newFont.setWeight( QFont::Bold ); |
213 | p->setFont( newFont ); | 211 | p->setFont( newFont ); |
214 | FileSelectorItem::paintCell( p, cg, column, width, alignment ); | 212 | FileSelectorItem::paintCell( p, cg, column, width, alignment ); |
215 | p->setFont( oldFont ); | 213 | p->setFont( oldFont ); |
216 | } | 214 | } |
217 | 215 | ||
218 | int width( const QFontMetrics &fm, const QListView *v, int c ) const { | 216 | int width( const QFontMetrics &fm, const QListView *v, int c ) const { |
219 | return FileSelectorItem::width( fm, v, c )*4/3; // allow for bold font | 217 | return FileSelectorItem::width( fm, v, c )*4/3; // allow for bold font |
220 | } | 218 | } |
221 | }; | 219 | }; |
222 | 220 | ||
223 | //=========================================================================== | 221 | //=========================================================================== |
224 | 222 | ||
225 | class FileSelectorPrivate | 223 | class FileSelectorPrivate |
226 | { | 224 | { |
227 | public: | 225 | public: |
228 | TypeCombo *typeCombo; | 226 | TypeCombo *typeCombo; |
229 | CategorySelect *catSelect; | 227 | CategorySelect *catSelect; |
230 | QValueList<QRegExp> mimeFilters; | 228 | QValueList<QRegExp> mimeFilters; |
231 | int catId; | 229 | int catId; |
232 | bool showNew; | 230 | bool showNew; |
233 | NewDocItem *newDocItem; | 231 | NewDocItem *newDocItem; |
234 | DocLnkSet files; | 232 | DocLnkSet files; |
235 | QHBox *toolbar; | 233 | QHBox *toolbar; |
236 | }; | 234 | }; |
237 | 235 | ||
238 | /*! | 236 | /*! |
239 | \class FileSelector fileselector.h | 237 | \class FileSelector fileselector.h |
240 | \brief The FileSelector widget allows the user to select DocLnk objects. | 238 | \brief The FileSelector widget allows the user to select DocLnk objects. |
241 | 239 | ||
242 | This class presents a file selection dialog to the user. This widget | 240 | This class presents a file selection dialog to the user. This widget |
243 | is usually the first widget seen in a \link docwidget.html | 241 | is usually the first widget seen in a \link docwidget.html |
244 | document-oriented application\endlink. The developer will most often | 242 | document-oriented application\endlink. The developer will most often |
245 | create this widget in combination with a <a | 243 | create this widget in combination with a <a |
246 | href="../qt/qwidgetstack.html"> QWidgetStack</a> and the appropriate | 244 | href="../qt/qwidgetstack.html"> QWidgetStack</a> and the appropriate |
247 | editor and/or viewer widget for their application. This widget | 245 | editor and/or viewer widget for their application. This widget |
248 | should be shown first and the user can the select which document | 246 | should be shown first and the user can the select which document |
249 | they wish to operate on. Please refer to the implementation of | 247 | they wish to operate on. Please refer to the implementation of |
250 | texteditor for an example of how to tie these classes together. | 248 | texteditor for an example of how to tie these classes together. |
251 | 249 | ||
252 | Use setNewVisible() depending on whether the application can be used | 250 | Use setNewVisible() depending on whether the application can be used |
253 | to create new files or not. Use setCloseVisible() depending on | 251 | to create new files or not. Use setCloseVisible() depending on |
254 | whether the user may leave the dialog without creating or selecting | 252 | whether the user may leave the dialog without creating or selecting |
255 | a document or not. The number of files in the view is available from | 253 | a document or not. The number of files in the view is available from |
256 | fileCount(). To force the view to be updated call reread(). | 254 | fileCount(). To force the view to be updated call reread(). |
257 | 255 | ||
258 | If the user presses the 'New Document' button the newSelected() | 256 | If the user presses the 'New Document' button the newSelected() |
259 | signal is emitted. If the user selects an existing file the | 257 | signal is emitted. If the user selects an existing file the |
260 | fileSelected() signal is emitted. The selected file's \link | 258 | fileSelected() signal is emitted. The selected file's \link |
261 | doclnk.html DocLnk\endlink is available from the selected() | 259 | doclnk.html DocLnk\endlink is available from the selected() |
262 | function. If the file selector is no longer necessary the closeMe() | 260 | function. If the file selector is no longer necessary the closeMe() |
263 | signal is emitted. | 261 | signal is emitted. |
264 | 262 | ||
265 | \ingroup qtopiaemb | 263 | \ingroup qtopiaemb |
266 | \sa FileManager | 264 | \sa FileManager |
267 | */ | 265 | */ |
268 | 266 | ||
269 | /*! | 267 | /*! |
270 | Constructs a FileSelector with mime filter \a f. | 268 | Constructs a FileSelector with mime filter \a f. |
271 | The standard Qt \a parent and \a name parameters are passed to the | 269 | The standard Qt \a parent and \a name parameters are passed to the |
272 | parent widget. | 270 | parent widget. |
273 | 271 | ||
274 | If \a newVisible is TRUE, the widget has a button to allow the user | 272 | If \a newVisible is TRUE, the widget has a button to allow the user |
275 | the create "new" documents; this is useful for applications that can | 273 | the create "new" documents; this is useful for applications that can |
276 | create and edit documents but not suitable for applications that | 274 | create and edit documents but not suitable for applications that |
277 | only provide viewing. | 275 | only provide viewing. |
278 | 276 | ||
279 | \a closeVisible is deprecated | 277 | \a closeVisible is deprecated |
280 | 278 | ||
281 | \sa DocLnkSet::DocLnkSet() | 279 | \sa DocLnkSet::DocLnkSet() |
282 | */ | 280 | */ |
283 | FileSelector::FileSelector( const QString &f, QWidget *parent, const char *name, bool newVisible, bool closeVisible ) | 281 | FileSelector::FileSelector( const QString &f, QWidget *parent, const char *name, bool newVisible, bool closeVisible ) |
284 | : QVBox( parent, name ), filter( f ) | 282 | : QVBox( parent, name ), filter( f ) |
285 | { | 283 | { |
286 | setMargin( 0 ); | 284 | setMargin( 0 ); |
287 | setSpacing( 0 ); | 285 | setSpacing( 0 ); |
288 | 286 | ||
289 | d = new FileSelectorPrivate(); | 287 | d = new FileSelectorPrivate(); |
290 | d->newDocItem = 0; | 288 | d->newDocItem = 0; |
291 | d->showNew = newVisible; | 289 | d->showNew = newVisible; |
292 | d->catId = -2; // All files | 290 | d->catId = -2; // All files |
293 | 291 | ||
294 | d->toolbar = new QHBox( this ); | 292 | d->toolbar = new QHBox( this ); |
295 | d->toolbar->setBackgroundMode( PaletteButton ); // same colour as toolbars | 293 | d->toolbar->setBackgroundMode( PaletteButton ); // same colour as toolbars |
296 | d->toolbar->setSpacing( 0 ); | 294 | d->toolbar->setSpacing( 0 ); |
297 | d->toolbar->hide(); | 295 | d->toolbar->hide(); |
298 | 296 | ||
299 | QWidget *spacer = new QWidget( d->toolbar ); | 297 | QWidget *spacer = new QWidget( d->toolbar ); |
300 | spacer->setBackgroundMode( PaletteButton ); | 298 | spacer->setBackgroundMode( PaletteButton ); |
301 | 299 | ||
302 | QToolButton *tb = new QToolButton( d->toolbar ); | 300 | QToolButton *tb = new QToolButton( d->toolbar ); |
303 | tb->setPixmap( Resource::loadPixmap( "close" ) ); | 301 | tb->setPixmap( Resource::loadPixmap( "close" ) ); |
304 | connect( tb, SIGNAL( clicked() ), this, SIGNAL( closeMe() ) ); | 302 | connect( tb, SIGNAL( clicked() ), this, SIGNAL( closeMe() ) ); |
305 | buttonClose = tb; | 303 | buttonClose = tb; |
306 | tb->setFixedSize( 18, 20 ); // tb->sizeHint() ); | 304 | tb->setFixedSize( 18, 20 ); // tb->sizeHint() ); |
307 | tb->setAutoRaise( TRUE ); | 305 | tb->setAutoRaise( TRUE ); |
308 | QToolTip::add( tb, tr( "Close the File Selector" ) ); | 306 | QToolTip::add( tb, tr( "Close the File Selector" ) ); |
309 | QPEMenuToolFocusManager::manager()->addWidget( tb ); | 307 | QPEMenuToolFocusManager::manager()->addWidget( tb ); |
310 | 308 | ||
311 | view = new FileSelectorView( this, "fileview" ); | 309 | view = new FileSelectorView( this, "fileview" ); |
312 | QPEApplication::setStylusOperation( view->viewport(), QPEApplication::RightOnHold ); | 310 | QPEApplication::setStylusOperation( view->viewport(), QPEApplication::RightOnHold ); |
313 | connect( view, SIGNAL( mouseButtonClicked( int, QListViewItem *, const QPoint &, int ) ), | 311 | connect( view, SIGNAL( mouseButtonClicked( int, QListViewItem *, const QPoint &, int ) ), |
314 | this, SLOT( fileClicked( int, QListViewItem *, const QPoint &, int ) ) ); | 312 | this, SLOT( fileClicked( int, QListViewItem *, const QPoint &, int ) ) ); |
315 | connect( view, SIGNAL( mouseButtonPressed( int, QListViewItem *, const QPoint &, int ) ), | 313 | connect( view, SIGNAL( mouseButtonPressed( int, QListViewItem *, const QPoint &, int ) ), |
316 | this, SLOT( filePressed( int, QListViewItem *, const QPoint &, int ) ) ); | 314 | this, SLOT( filePressed( int, QListViewItem *, const QPoint &, int ) ) ); |
317 | connect( view, SIGNAL( returnPressed( QListViewItem * ) ), | 315 | connect( view, SIGNAL( returnPressed( QListViewItem * ) ), |
318 | this, SLOT( fileClicked( QListViewItem * ) ) ); | 316 | this, SLOT( fileClicked( QListViewItem * ) ) ); |
319 | 317 | ||
320 | QHBox *hb = new QHBox( this ); | 318 | QHBox *hb = new QHBox( this ); |
321 | 319 | ||
322 | d->typeCombo = new TypeCombo( hb ); | 320 | d->typeCombo = new TypeCombo( hb ); |
323 | connect( d->typeCombo, SIGNAL(selected(const QString&)), | 321 | connect( d->typeCombo, SIGNAL(selected(const QString&)), |
324 | this, SLOT(typeSelected(const QString&)) ); | 322 | this, SLOT(typeSelected(const QString&)) ); |
325 | QWhatsThis::add( d->typeCombo, tr("Show documents of this type") ); | 323 | QWhatsThis::add( d->typeCombo, tr("Show documents of this type") ); |
326 | 324 | ||
327 | Categories c; | 325 | Categories c; |
328 | c.load(categoryFileName()); | 326 | c.load(categoryFileName()); |
329 | QArray<int> vl( 0 ); | 327 | QArray<int> vl( 0 ); |
330 | d->catSelect = new CategorySelect( hb ); | 328 | d->catSelect = new CategorySelect( hb ); |
331 | d->catSelect->setRemoveCategoryEdit( TRUE ); | 329 | d->catSelect->setRemoveCategoryEdit( TRUE ); |
332 | d->catSelect->setCategories( vl, "Document View", tr("Document View") ); | 330 | d->catSelect->setCategories( vl, "Document View", tr("Document View") ); |
333 | d->catSelect->setAllCategories( TRUE ); | 331 | d->catSelect->setAllCategories( TRUE ); |
334 | connect( d->catSelect, SIGNAL(signalSelected(int)), this, SLOT(catSelected(int)) ); | 332 | connect( d->catSelect, SIGNAL(signalSelected(int)), this, SLOT(catSelected(int)) ); |
335 | QWhatsThis::add( d->catSelect, tr("Show documents in this category") ); | 333 | QWhatsThis::add( d->catSelect, tr("Show documents in this category") ); |
336 | 334 | ||
337 | setCloseVisible( closeVisible ); | 335 | setCloseVisible( closeVisible ); |
338 | 336 | ||
339 | QCopChannel *channel = new QCopChannel( "QPE/Card", this ); | 337 | QCopChannel *channel = new QCopChannel( "QPE/Card", this ); |
340 | connect( channel, SIGNAL(received(const QCString &, const QByteArray &)), | 338 | connect( channel, SIGNAL(received(const QCString &, const QByteArray &)), |
341 | this, SLOT(cardMessage( const QCString &, const QByteArray &)) ); | 339 | this, SLOT(cardMessage( const QCString &, const QByteArray &)) ); |
342 | 340 | ||
343 | reread(); | 341 | reread(); |
344 | updateWhatsThis(); | 342 | updateWhatsThis(); |
345 | } | 343 | } |
346 | 344 | ||
347 | /*! | 345 | /*! |
348 | Destroys the widget. | 346 | Destroys the widget. |
349 | */ | 347 | */ |
350 | FileSelector::~FileSelector() | 348 | FileSelector::~FileSelector() |
351 | { | 349 | { |
352 | delete d; | 350 | delete d; |
353 | } | 351 | } |
354 | 352 | ||
355 | /*! | 353 | /*! |
356 | Returns the number of files in the view. If this is zero, an editor | 354 | Returns the number of files in the view. If this is zero, an editor |
357 | application might bypass the selector and immediately start with | 355 | application might bypass the selector and immediately start with |
358 | a "new" document. | 356 | a "new" document. |
359 | */ | 357 | */ |
360 | int FileSelector::fileCount() | 358 | int FileSelector::fileCount() |
361 | { | 359 | { |
362 | return d->files.children().count();; | 360 | return d->files.children().count();; |
363 | } | 361 | } |
364 | 362 | ||
365 | /*! | 363 | /*! |
366 | Calling this function is the programmatic equivalent of the user | 364 | Calling this function is the programmatic equivalent of the user |
367 | pressing the "new" button. | 365 | pressing the "new" button. |
368 | 366 | ||
369 | \sa newSelected(), closeMe() | 367 | \sa newSelected(), closeMe() |
370 | */ | 368 | */ |
371 | void FileSelector::createNew() | 369 | void FileSelector::createNew() |
372 | { | 370 | { |
373 | DocLnk f; | 371 | DocLnk f; |
374 | emit newSelected( f ); | 372 | emit newSelected( f ); |
375 | emit closeMe(); | 373 | emit closeMe(); |
376 | } | 374 | } |
377 | 375 | ||
378 | void FileSelector::fileClicked( int button, QListViewItem *i, const QPoint &, int ) | 376 | void FileSelector::fileClicked( int button, QListViewItem *i, const QPoint &, int ) |
379 | { | 377 | { |
380 | if ( !i ) | 378 | if ( !i ) |
381 | return; | 379 | return; |
382 | if ( button == Qt::LeftButton ) { | 380 | if ( button == Qt::LeftButton ) { |
383 | fileClicked( i ); | 381 | fileClicked( i ); |
384 | } | 382 | } |
385 | } | 383 | } |
386 | 384 | ||
387 | void FileSelector::filePressed( int button, QListViewItem *i, const QPoint &, int ) | 385 | void FileSelector::filePressed( int button, QListViewItem *i, const QPoint &, int ) |
388 | { | 386 | { |
389 | if ( !i || i == d->newDocItem ) | 387 | if ( !i || i == d->newDocItem ) |
390 | return; | 388 | return; |
391 | if ( button == Qt::RightButton ) { | 389 | if ( button == Qt::RightButton ) { |
392 | DocLnk l = ((FileSelectorItem *)i)->file(); | 390 | DocLnk l = ((FileSelectorItem *)i)->file(); |
393 | LnkProperties prop( &l ); | 391 | LnkProperties prop( &l ); |
394 | prop.showMaximized(); | 392 | prop.showMaximized(); |
395 | prop.exec(); | 393 | prop.exec(); |
396 | reread(); | 394 | reread(); |
397 | } | 395 | } |
398 | } | 396 | } |
399 | 397 | ||
400 | void FileSelector::fileClicked( QListViewItem *i ) | 398 | void FileSelector::fileClicked( QListViewItem *i ) |
401 | { | 399 | { |
402 | if ( !i ) | 400 | if ( !i ) |
403 | return; | 401 | return; |
404 | if ( i == d->newDocItem ) { | 402 | if ( i == d->newDocItem ) { |
405 | createNew(); | 403 | createNew(); |
406 | } else { | 404 | } else { |
407 | emit fileSelected( ( (FileSelectorItem*)i )->file() ); | 405 | emit fileSelected( ( (FileSelectorItem*)i )->file() ); |
408 | emit closeMe(); | 406 | emit closeMe(); |
409 | } | 407 | } |
410 | } | 408 | } |
411 | 409 | ||
412 | void FileSelector::typeSelected( const QString &type ) | 410 | void FileSelector::typeSelected( const QString &type ) |
413 | { | 411 | { |
414 | d->mimeFilters.clear(); | 412 | d->mimeFilters.clear(); |
415 | QStringList subFilter = QStringList::split(";", type); | 413 | QStringList subFilter = QStringList::split(";", type); |
416 | for( QStringList::Iterator it = subFilter.begin(); it != subFilter.end(); ++it ) | 414 | for( QStringList::Iterator it = subFilter.begin(); it != subFilter.end(); ++it ) |
417 | d->mimeFilters.append( QRegExp(*it, FALSE, TRUE) ); | 415 | d->mimeFilters.append( QRegExp(*it, FALSE, TRUE) ); |
418 | updateView(); | 416 | updateView(); |
419 | } | 417 | } |
diff --git a/library/finddialog.cpp b/library/finddialog.cpp index ddf41a7..64487c9 100644 --- a/library/finddialog.cpp +++ b/library/finddialog.cpp | |||
@@ -1,85 +1,84 @@ | |||
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 | 20 | ||
21 | // WARNING: Do *NOT* define this yourself. The SL5xxx from SHARP does NOT | 21 | // WARNING: Do *NOT* define this yourself. The SL5xxx from SHARP does NOT |
22 | // have this class. | 22 | // have this class. |
23 | #define QTOPIA_INTERNAL_FD | 23 | #define QTOPIA_INTERNAL_FD |
24 | 24 | ||
25 | #include "finddialog.h" | 25 | #include "finddialog.h" |
26 | #include "findwidget_p.h" | 26 | #include "findwidget_p.h" |
27 | 27 | ||
28 | #include <qlayout.h> | 28 | #include <qlayout.h> |
29 | #include <qpushbutton.h> | ||
30 | 29 | ||
31 | /*! | 30 | /*! |
32 | \class FindDialog finddialog.h | 31 | \class FindDialog finddialog.h |
33 | \brief A simple FindDialog | 32 | \brief A simple FindDialog |
34 | 33 | ||
35 | A find dialog. FIXME!!!! | 34 | A find dialog. FIXME!!!! |
36 | 35 | ||
37 | */ | 36 | */ |
38 | FindDialog::FindDialog( const QString &appName, QWidget *parent, | 37 | FindDialog::FindDialog( const QString &appName, QWidget *parent, |
39 | const char *name, bool modal ) | 38 | const char *name, bool modal ) |
40 | : QDialog( parent, name, modal ) | 39 | : QDialog( parent, name, modal ) |
41 | { | 40 | { |
42 | setCaption( tr("Find") ); | 41 | setCaption( tr("Find") ); |
43 | QVBoxLayout *vb; | 42 | QVBoxLayout *vb; |
44 | vb = new QVBoxLayout( this ); | 43 | vb = new QVBoxLayout( this ); |
45 | fw = new FindWidget( appName, this, "Find Widget" ); | 44 | fw = new FindWidget( appName, this, "Find Widget" ); |
46 | vb->addWidget( fw ); | 45 | vb->addWidget( fw ); |
47 | QObject::connect( fw, SIGNAL(signalFindClicked(const QString&, | 46 | QObject::connect( fw, SIGNAL(signalFindClicked(const QString&, |
48 | bool,bool,int)), | 47 | bool,bool,int)), |
49 | this, SIGNAL(signalFindClicked(const QString&, | 48 | this, SIGNAL(signalFindClicked(const QString&, |
50 | bool,bool,int)) ); | 49 | bool,bool,int)) ); |
51 | QObject::connect( fw, SIGNAL(signalFindClicked(const QString&,const QDate&, | 50 | QObject::connect( fw, SIGNAL(signalFindClicked(const QString&,const QDate&, |
52 | bool,bool,int)), | 51 | bool,bool,int)), |
53 | this, SIGNAL(signalFindClicked(const QString&, | 52 | this, SIGNAL(signalFindClicked(const QString&, |
54 | const QDate&,bool,bool,int)) ); | 53 | const QDate&,bool,bool,int)) ); |
55 | d = 0; | 54 | d = 0; |
56 | } | 55 | } |
57 | 56 | ||
58 | FindDialog::~FindDialog() | 57 | FindDialog::~FindDialog() |
59 | { | 58 | { |
60 | } | 59 | } |
61 | 60 | ||
62 | QString FindDialog::findText() const | 61 | QString FindDialog::findText() const |
63 | { | 62 | { |
64 | return fw->findText(); | 63 | return fw->findText(); |
65 | } | 64 | } |
66 | 65 | ||
67 | void FindDialog::setUseDate( bool show ) | 66 | void FindDialog::setUseDate( bool show ) |
68 | { | 67 | { |
69 | fw->setUseDate( show ); | 68 | fw->setUseDate( show ); |
70 | } | 69 | } |
71 | 70 | ||
72 | void FindDialog::setDate( const QDate &dt ) | 71 | void FindDialog::setDate( const QDate &dt ) |
73 | { | 72 | { |
74 | fw->setDate( dt ); | 73 | fw->setDate( dt ); |
75 | } | 74 | } |
76 | 75 | ||
77 | void FindDialog::slotNotFound() | 76 | void FindDialog::slotNotFound() |
78 | { | 77 | { |
79 | fw->slotNotFound(); | 78 | fw->slotNotFound(); |
80 | } | 79 | } |
81 | 80 | ||
82 | void FindDialog::slotWrapAround() | 81 | void FindDialog::slotWrapAround() |
83 | { | 82 | { |
84 | fw->slotWrapAround(); | 83 | fw->slotWrapAround(); |
85 | } | 84 | } |
diff --git a/library/findwidget_p.cpp b/library/findwidget_p.cpp index 287e125..e91d789 100644 --- a/library/findwidget_p.cpp +++ b/library/findwidget_p.cpp | |||
@@ -1,120 +1,114 @@ | |||
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 | 20 | ||
21 | #include "findwidget_p.h" | 21 | #include "findwidget_p.h" |
22 | 22 | ||
23 | #include <qpe/categories.h> | ||
24 | #include <qpe/categoryselect.h> | 23 | #include <qpe/categoryselect.h> |
25 | #include <qpe/datebookmonth.h> | 24 | #include <qpe/datebookmonth.h> |
26 | #include <qpe/timestring.h> | ||
27 | 25 | ||
28 | #include <qcheckbox.h> | 26 | #include <qcheckbox.h> |
29 | #include <qlabel.h> | 27 | #include <qlabel.h> |
30 | #include <qlineedit.h> | 28 | #include <qlineedit.h> |
31 | #include <qmessagebox.h> | ||
32 | #include <qpushbutton.h> | ||
33 | #include <qpopupmenu.h> | ||
34 | #include <qtoolbutton.h> | ||
35 | 29 | ||
36 | FindWidget::FindWidget( const QString &appName, QWidget *parent, | 30 | FindWidget::FindWidget( const QString &appName, QWidget *parent, |
37 | const char *name ) | 31 | const char *name ) |
38 | : FindWidgetBase( parent, name ), | 32 | : FindWidgetBase( parent, name ), |
39 | mStrApp( appName ), | 33 | mStrApp( appName ), |
40 | mDate( QDate::currentDate() ) | 34 | mDate( QDate::currentDate() ) |
41 | { | 35 | { |
42 | setMaximumSize( sizeHint() ); | 36 | setMaximumSize( sizeHint() ); |
43 | QArray<int> vl(0); | 37 | QArray<int> vl(0); |
44 | cmbCat->setCategories( vl, mStrApp ); | 38 | cmbCat->setCategories( vl, mStrApp ); |
45 | cmbCat->setRemoveCategoryEdit( TRUE ); | 39 | cmbCat->setRemoveCategoryEdit( TRUE ); |
46 | cmbCat->setAllCategories( TRUE ); | 40 | cmbCat->setAllCategories( TRUE ); |
47 | // hide junk for the moment... | 41 | // hide junk for the moment... |
48 | lblStartDate->hide(); | 42 | lblStartDate->hide(); |
49 | cmdStartDate->hide(); | 43 | cmdStartDate->hide(); |
50 | QPopupMenu *m1 = new QPopupMenu( this ); | 44 | QPopupMenu *m1 = new QPopupMenu( this ); |
51 | dtPicker = new DateBookMonth( m1, 0, TRUE ); | 45 | dtPicker = new DateBookMonth( m1, 0, TRUE ); |
52 | dtPicker->setDate( mDate.year(), mDate.month(), mDate.day() ); | 46 | dtPicker->setDate( mDate.year(), mDate.month(), mDate.day() ); |
53 | m1->insertItem( dtPicker ); | 47 | m1->insertItem( dtPicker ); |
54 | cmdStartDate->setPopup( m1 ); | 48 | cmdStartDate->setPopup( m1 ); |
55 | cmdStartDate->setText( TimeString::shortDate(mDate) ); | 49 | cmdStartDate->setText( TimeString::shortDate(mDate) ); |
56 | QObject::connect( dtPicker, SIGNAL(dateClicked(int, int, int)), | 50 | QObject::connect( dtPicker, SIGNAL(dateClicked(int, int, int)), |
57 | this, SLOT(slotDateChanged(int, int, int)) ); | 51 | this, SLOT(slotDateChanged(int, int, int)) ); |
58 | 52 | ||
59 | QObject::connect( cmdFind, SIGNAL(clicked()), | 53 | QObject::connect( cmdFind, SIGNAL(clicked()), |
60 | this, SLOT(slotFindClicked()) ); | 54 | this, SLOT(slotFindClicked()) ); |
61 | } | 55 | } |
62 | 56 | ||
63 | FindWidget::~FindWidget() | 57 | FindWidget::~FindWidget() |
64 | { | 58 | { |
65 | } | 59 | } |
66 | 60 | ||
67 | QString FindWidget::findText() const | 61 | QString FindWidget::findText() const |
68 | { | 62 | { |
69 | return txtFind->text(); | 63 | return txtFind->text(); |
70 | } | 64 | } |
71 | 65 | ||
72 | void FindWidget::slotFindClicked() | 66 | void FindWidget::slotFindClicked() |
73 | { | 67 | { |
74 | lblStatus->setText( "" ); | 68 | lblStatus->setText( "" ); |
75 | if ( cmdStartDate->isVisible() ) | 69 | if ( cmdStartDate->isVisible() ) |
76 | emit signalFindClicked( findText(), | 70 | emit signalFindClicked( findText(), |
77 | mDate, | 71 | mDate, |
78 | chkCase->isChecked(), | 72 | chkCase->isChecked(), |
79 | chkBackwards->isChecked(), | 73 | chkBackwards->isChecked(), |
80 | cmbCat->currentCategory() ); | 74 | cmbCat->currentCategory() ); |
81 | else | 75 | else |
82 | emit signalFindClicked( findText(), chkCase->isChecked(), | 76 | emit signalFindClicked( findText(), chkCase->isChecked(), |
83 | chkBackwards->isChecked(), | 77 | chkBackwards->isChecked(), |
84 | cmbCat->currentCategory() ); | 78 | cmbCat->currentCategory() ); |
85 | } | 79 | } |
86 | 80 | ||
87 | void FindWidget::setUseDate( bool show ) | 81 | void FindWidget::setUseDate( bool show ) |
88 | { | 82 | { |
89 | if ( show ) { | 83 | if ( show ) { |
90 | lblStartDate->show(); | 84 | lblStartDate->show(); |
91 | cmdStartDate->show(); | 85 | cmdStartDate->show(); |
92 | } else { | 86 | } else { |
93 | lblStartDate->hide(); | 87 | lblStartDate->hide(); |
94 | cmdStartDate->hide(); | 88 | cmdStartDate->hide(); |
95 | } | 89 | } |
96 | chkBackwards->setDisabled( show ); | 90 | chkBackwards->setDisabled( show ); |
97 | } | 91 | } |
98 | 92 | ||
99 | void FindWidget::setDate( const QDate &dt ) | 93 | void FindWidget::setDate( const QDate &dt ) |
100 | { | 94 | { |
101 | slotDateChanged( dt.year(), dt.month(), dt.day() ); | 95 | slotDateChanged( dt.year(), dt.month(), dt.day() ); |
102 | } | 96 | } |
103 | 97 | ||
104 | void FindWidget::slotNotFound() | 98 | void FindWidget::slotNotFound() |
105 | { | 99 | { |
106 | lblStatus->setText( tr("String Not Found.") ); | 100 | lblStatus->setText( tr("String Not Found.") ); |
107 | } | 101 | } |
108 | 102 | ||
109 | void FindWidget::slotWrapAround() | 103 | void FindWidget::slotWrapAround() |
110 | { | 104 | { |
111 | lblStatus->setText( tr("End reached, starting at %1", "Date using TimeString::shortDate") | 105 | lblStatus->setText( tr("End reached, starting at %1", "Date using TimeString::shortDate") |
112 | .arg(TimeString::shortDate( mDate ) ) ); | 106 | .arg(TimeString::shortDate( mDate ) ) ); |
113 | } | 107 | } |
114 | 108 | ||
115 | void FindWidget::slotDateChanged( int year, int month, int day ) | 109 | void FindWidget::slotDateChanged( int year, int month, int day ) |
116 | { | 110 | { |
117 | mDate.setYMD( year, month, day ); | 111 | mDate.setYMD( year, month, day ); |
118 | cmdStartDate->setText( TimeString::shortDate( mDate ) ); | 112 | cmdStartDate->setText( TimeString::shortDate( mDate ) ); |
119 | dtPicker->setDate( year, month, day ); | 113 | dtPicker->setDate( year, month, day ); |
120 | } | 114 | } |
diff --git a/library/fontdatabase.cpp b/library/fontdatabase.cpp index 2ad8e95..d94e338 100644 --- a/library/fontdatabase.cpp +++ b/library/fontdatabase.cpp | |||
@@ -1,253 +1,251 @@ | |||
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 | 20 | ||
21 | #include <qpe/qpeapplication.h> | 21 | #include <qpe/qpeapplication.h> |
22 | #include "fontfactoryinterface.h" | ||
23 | #include "fontdatabase.h" | 22 | #include "fontdatabase.h" |
24 | 23 | ||
25 | #include <qpe/qlibrary.h> | 24 | #include <qpe/qlibrary.h> |
26 | 25 | ||
27 | #include <qfontmanager_qws.h> | 26 | #include <qfontmanager_qws.h> |
28 | #include <qdir.h> | 27 | #include <qdir.h> |
29 | #include <qdict.h> | ||
30 | #include <stdio.h> | 28 | #include <stdio.h> |
31 | #include <stdlib.h> | 29 | #include <stdlib.h> |
32 | 30 | ||
33 | static QString fontDir() | 31 | static QString fontDir() |
34 | { | 32 | { |
35 | QString qtdir = getenv("QTDIR"); | 33 | QString qtdir = getenv("QTDIR"); |
36 | if ( qtdir.isEmpty() ) qtdir = "/usr/local/qt-embedded"; | 34 | if ( qtdir.isEmpty() ) qtdir = "/usr/local/qt-embedded"; |
37 | return qtdir+"/lib/fonts/"; | 35 | return qtdir+"/lib/fonts/"; |
38 | } | 36 | } |
39 | 37 | ||
40 | #ifdef QT_NO_FONTDATABASE | 38 | #ifdef QT_NO_FONTDATABASE |
41 | static QString fontFamily( const QString& key ) | 39 | static QString fontFamily( const QString& key ) |
42 | { | 40 | { |
43 | int u0 = key.find('_'); | 41 | int u0 = key.find('_'); |
44 | int u1 = key.find('_',u0+1); | 42 | int u1 = key.find('_',u0+1); |
45 | int u2 = key.find('_',u1+1); | 43 | int u2 = key.find('_',u1+1); |
46 | QString family = key.left(u0); | 44 | QString family = key.left(u0); |
47 | //int pointSize = key.mid(u0+1,u1-u0-1).toInt(); | 45 | //int pointSize = key.mid(u0+1,u1-u0-1).toInt(); |
48 | //int weight = key.mid(u1+1,u2-u1-1).toInt(); | 46 | //int weight = key.mid(u1+1,u2-u1-1).toInt(); |
49 | //bool italic = key.mid(u2-1,1) == "i"; | 47 | //bool italic = key.mid(u2-1,1) == "i"; |
50 | // #### ignores _t and _I fields | 48 | // #### ignores _t and _I fields |
51 | return family; | 49 | return family; |
52 | } | 50 | } |
53 | #endif | 51 | #endif |
54 | 52 | ||
55 | 53 | ||
56 | QValueList<FontFactory> *FontDatabase::factoryList = 0; | 54 | QValueList<FontFactory> *FontDatabase::factoryList = 0; |
57 | /*! | 55 | /*! |
58 | \class FontDatabase fontdatabase.h | 56 | \class FontDatabase fontdatabase.h |
59 | \brief The FontDatabase class provides information about available fonts. | 57 | \brief The FontDatabase class provides information about available fonts. |
60 | 58 | ||
61 | Most often you will simply want to query the database for the | 59 | Most often you will simply want to query the database for the |
62 | available font families(). | 60 | available font families(). |
63 | 61 | ||
64 | Use FontDatabase rather than QFontDatabase when you may need access | 62 | Use FontDatabase rather than QFontDatabase when you may need access |
65 | to fonts that are not normally available. For example, if the | 63 | to fonts that are not normally available. For example, if the |
66 | freetype library and the Qtopia freetype plugin are installed, | 64 | freetype library and the Qtopia freetype plugin are installed, |
67 | TrueType fonts will be available to your application. Font renderer | 65 | TrueType fonts will be available to your application. Font renderer |
68 | plugins have greater resource requirements than system fonts so they | 66 | plugins have greater resource requirements than system fonts so they |
69 | should be used only when necessary. You can force the loading of | 67 | should be used only when necessary. You can force the loading of |
70 | font renderer plugins with loadRenderers(). | 68 | font renderer plugins with loadRenderers(). |
71 | 69 | ||
72 | \ingroup qtopiaemb | 70 | \ingroup qtopiaemb |
73 | */ | 71 | */ |
74 | 72 | ||
75 | /*! | 73 | /*! |
76 | Constructs a FontDatabase object. | 74 | Constructs a FontDatabase object. |
77 | */ | 75 | */ |
78 | FontDatabase::FontDatabase() | 76 | FontDatabase::FontDatabase() |
79 | #ifndef QT_NO_FONTDATABASE | 77 | #ifndef QT_NO_FONTDATABASE |
80 | : QFontDatabase() | 78 | : QFontDatabase() |
81 | #endif | 79 | #endif |
82 | { | 80 | { |
83 | if ( !factoryList ) | 81 | if ( !factoryList ) |
84 | loadRenderers(); | 82 | loadRenderers(); |
85 | } | 83 | } |
86 | 84 | ||
87 | /*! | 85 | /*! |
88 | Returns a list of names of all the available font families. | 86 | Returns a list of names of all the available font families. |
89 | */ | 87 | */ |
90 | QStringList FontDatabase::families() const | 88 | QStringList FontDatabase::families() const |
91 | { | 89 | { |
92 | #ifndef QT_NO_FONTDATABASE | 90 | #ifndef QT_NO_FONTDATABASE |
93 | return QFontDatabase::families(); | 91 | return QFontDatabase::families(); |
94 | #else | 92 | #else |
95 | 93 | ||
96 | #ifndef QWS | 94 | #ifndef QWS |
97 | QStringList list; | 95 | QStringList list; |
98 | return list; | 96 | return list; |
99 | #else | 97 | #else |
100 | QStringList list; | 98 | QStringList list; |
101 | QDict<void> familyDict; | 99 | QDict<void> familyDict; |
102 | QDiskFont *qdf; | 100 | QDiskFont *qdf; |
103 | for ( qdf=qt_fontmanager->diskfonts.first(); qdf!=0; | 101 | for ( qdf=qt_fontmanager->diskfonts.first(); qdf!=0; |
104 | qdf=qt_fontmanager->diskfonts.next()) { | 102 | qdf=qt_fontmanager->diskfonts.next()) { |
105 | QString familyname = qdf->name; | 103 | QString familyname = qdf->name; |
106 | if ( !familyDict.find( familyname ) ) { | 104 | if ( !familyDict.find( familyname ) ) { |
107 | familyDict.insert( familyname, (void *)1 ); | 105 | familyDict.insert( familyname, (void *)1 ); |
108 | list.append( familyname ); | 106 | list.append( familyname ); |
109 | } | 107 | } |
110 | } | 108 | } |
111 | 109 | ||
112 | QDir dir(fontDir(),"*.qpf"); | 110 | QDir dir(fontDir(),"*.qpf"); |
113 | for (int i=0; i<(int)dir.count(); i++) { | 111 | for (int i=0; i<(int)dir.count(); i++) { |
114 | QString familyname = fontFamily(dir[i]); | 112 | QString familyname = fontFamily(dir[i]); |
115 | if ( !familyDict.find( familyname ) ) { | 113 | if ( !familyDict.find( familyname ) ) { |
116 | familyDict.insert( familyname, (void *)1 ); | 114 | familyDict.insert( familyname, (void *)1 ); |
117 | list.append( familyname ); | 115 | list.append( familyname ); |
118 | } | 116 | } |
119 | } | 117 | } |
120 | 118 | ||
121 | return list; | 119 | return list; |
122 | #endif | 120 | #endif |
123 | #endif | 121 | #endif |
124 | } | 122 | } |
125 | 123 | ||
126 | #ifdef QT_NO_FONTDATABASE | 124 | #ifdef QT_NO_FONTDATABASE |
127 | /*! | 125 | /*! |
128 | Returns a list of standard fontsizes. | 126 | Returns a list of standard fontsizes. |
129 | */ | 127 | */ |
130 | QValueList<int> FontDatabase::standardSizes() | 128 | QValueList<int> FontDatabase::standardSizes() |
131 | { | 129 | { |
132 | static int s[]={ 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, | 130 | static int s[]={ 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, |
133 | 36, 48, 72, 0 }; | 131 | 36, 48, 72, 0 }; |
134 | static bool first = TRUE; | 132 | static bool first = TRUE; |
135 | static QValueList<int> sList; | 133 | static QValueList<int> sList; |
136 | if ( first ) { | 134 | if ( first ) { |
137 | first = FALSE; | 135 | first = FALSE; |
138 | int i = 0; | 136 | int i = 0; |
139 | while( s[i] ) | 137 | while( s[i] ) |
140 | sList.append( s[i++] ); | 138 | sList.append( s[i++] ); |
141 | } | 139 | } |
142 | return sList; | 140 | return sList; |
143 | } | 141 | } |
144 | 142 | ||
145 | #endif | 143 | #endif |
146 | 144 | ||
147 | /*! | 145 | /*! |
148 | Load any font renderer plugins that are available and make the fonts | 146 | Load any font renderer plugins that are available and make the fonts |
149 | that the plugins can read available. | 147 | that the plugins can read available. |
150 | */ | 148 | */ |
151 | void FontDatabase::loadRenderers() | 149 | void FontDatabase::loadRenderers() |
152 | { | 150 | { |
153 | #ifndef QWS | 151 | #ifndef QWS |
154 | return; | 152 | return; |
155 | #else | 153 | #else |
156 | 154 | ||
157 | #ifndef QT_NO_COMPONENT | 155 | #ifndef QT_NO_COMPONENT |
158 | if ( !factoryList ) | 156 | if ( !factoryList ) |
159 | factoryList = new QValueList<FontFactory>; | 157 | factoryList = new QValueList<FontFactory>; |
160 | 158 | ||
161 | QValueList<FontFactory>::Iterator mit; | 159 | QValueList<FontFactory>::Iterator mit; |
162 | for ( mit = factoryList->begin(); mit != factoryList->end(); ++mit ) { | 160 | for ( mit = factoryList->begin(); mit != factoryList->end(); ++mit ) { |
163 | qt_fontmanager->factories.setAutoDelete( false ); | 161 | qt_fontmanager->factories.setAutoDelete( false ); |
164 | qt_fontmanager->factories.removeRef( (*mit).factory ); | 162 | qt_fontmanager->factories.removeRef( (*mit).factory ); |
165 | qt_fontmanager->factories.setAutoDelete( true ); | 163 | qt_fontmanager->factories.setAutoDelete( true ); |
166 | (*mit).interface->release(); | 164 | (*mit).interface->release(); |
167 | (*mit).library->unload(); | 165 | (*mit).library->unload(); |
168 | delete (*mit).library; | 166 | delete (*mit).library; |
169 | } | 167 | } |
170 | factoryList->clear(); | 168 | factoryList->clear(); |
171 | 169 | ||
172 | QString path = QPEApplication::qpeDir() + "/plugins/fontfactories"; | 170 | QString path = QPEApplication::qpeDir() + "/plugins/fontfactories"; |
173 | #ifdef Q_OS_MACX | 171 | #ifdef Q_OS_MACX |
174 | QDir dir( path, "lib*.dylib" ); | 172 | QDir dir( path, "lib*.dylib" ); |
175 | #else | 173 | #else |
176 | QDir dir( path, "lib*.so" ); | 174 | QDir dir( path, "lib*.so" ); |
177 | #endif | 175 | #endif |
178 | 176 | ||
179 | if ( !dir.exists()) | 177 | if ( !dir.exists()) |
180 | return; | 178 | return; |
181 | 179 | ||
182 | QStringList list = dir.entryList(); | 180 | QStringList list = dir.entryList(); |
183 | QStringList::Iterator it; | 181 | QStringList::Iterator it; |
184 | for ( it = list.begin(); it != list.end(); ++it ) { | 182 | for ( it = list.begin(); it != list.end(); ++it ) { |
185 | FontFactoryInterface *iface = 0; | 183 | FontFactoryInterface *iface = 0; |
186 | QLibrary *lib = new QLibrary( path + "/" + *it ); | 184 | QLibrary *lib = new QLibrary( path + "/" + *it ); |
187 | if ( lib->queryInterface( IID_FontFactory, (QUnknownInterface**)&iface ) == QS_OK ) { | 185 | if ( lib->queryInterface( IID_FontFactory, (QUnknownInterface**)&iface ) == QS_OK ) { |
188 | FontFactory factory; | 186 | FontFactory factory; |
189 | factory.library = lib; | 187 | factory.library = lib; |
190 | factory.interface = iface; | 188 | factory.interface = iface; |
191 | factory.factory = factory.interface->fontFactory(); | 189 | factory.factory = factory.interface->fontFactory(); |
192 | factoryList->append( factory ); | 190 | factoryList->append( factory ); |
193 | qt_fontmanager->factories.append( factory.factory ); | 191 | qt_fontmanager->factories.append( factory.factory ); |
194 | readFonts( factory.factory ); | 192 | readFonts( factory.factory ); |
195 | } else { | 193 | } else { |
196 | delete lib; | 194 | delete lib; |
197 | } | 195 | } |
198 | } | 196 | } |
199 | #endif | 197 | #endif |
200 | #endif | 198 | #endif |
201 | } | 199 | } |
202 | 200 | ||
203 | /*! | 201 | /*! |
204 | \internal | 202 | \internal |
205 | */ | 203 | */ |
206 | void FontDatabase::readFonts( QFontFactory *factory ) | 204 | void FontDatabase::readFonts( QFontFactory *factory ) |
207 | { | 205 | { |
208 | #ifndef QWS | 206 | #ifndef QWS |
209 | return; | 207 | return; |
210 | #else | 208 | #else |
211 | // Load in font definition file | 209 | // Load in font definition file |
212 | QString fn = fontDir() + "fontdir"; | 210 | QString fn = fontDir() + "fontdir"; |
213 | FILE* fontdef=fopen(fn.local8Bit(),"r"); | 211 | FILE* fontdef=fopen(fn.local8Bit(),"r"); |
214 | if(!fontdef) { | 212 | if(!fontdef) { |
215 | QCString temp=fn.local8Bit(); | 213 | QCString temp=fn.local8Bit(); |
216 | qWarning("Cannot find font definition file %s - is $QTDIR set correctly?", | 214 | qWarning("Cannot find font definition file %s - is $QTDIR set correctly?", |
217 | temp.data()); | 215 | temp.data()); |
218 | return; | 216 | return; |
219 | } | 217 | } |
220 | char buf[200]=""; | 218 | char buf[200]=""; |
221 | char name[200]=""; | 219 | char name[200]=""; |
222 | char render[200]=""; | 220 | char render[200]=""; |
223 | char file[200]=""; | 221 | char file[200]=""; |
224 | char flags[200]=""; | 222 | char flags[200]=""; |
225 | char isitalic[10]=""; | 223 | char isitalic[10]=""; |
226 | fgets(buf,200,fontdef); | 224 | fgets(buf,200,fontdef); |
227 | while(!feof(fontdef)) { | 225 | while(!feof(fontdef)) { |
228 | if ( buf[0] != '#' ) { | 226 | if ( buf[0] != '#' ) { |
229 | int weight=50; | 227 | int weight=50; |
230 | int size=0; | 228 | int size=0; |
231 | flags[0]=0; | 229 | flags[0]=0; |
232 | sscanf(buf,"%s %s %s %s %d %d %s",name,file,render,isitalic,&weight,&size,flags); | 230 | sscanf(buf,"%s %s %s %s %d %d %s",name,file,render,isitalic,&weight,&size,flags); |
233 | QString filename; | 231 | QString filename; |
234 | if ( file[0] != '/' ) | 232 | if ( file[0] != '/' ) |
235 | filename = fontDir(); | 233 | filename = fontDir(); |
236 | filename += file; | 234 | filename += file; |
237 | if ( QFile::exists(filename) ) { | 235 | if ( QFile::exists(filename) ) { |
238 | if( factory->name() == render ) { | 236 | if( factory->name() == render ) { |
239 | QDiskFont * qdf=new QDiskFont(factory,name,isitalic[0]=='y', | 237 | QDiskFont * qdf=new QDiskFont(factory,name,isitalic[0]=='y', |
240 | weight,size,flags,filename); | 238 | weight,size,flags,filename); |
241 | qt_fontmanager->diskfonts.append(qdf); | 239 | qt_fontmanager->diskfonts.append(qdf); |
242 | #if QT_VERSION >= 232 | 240 | #if QT_VERSION >= 232 |
243 | QFontDatabase::qwsAddDiskFont( qdf ); | 241 | QFontDatabase::qwsAddDiskFont( qdf ); |
244 | #endif | 242 | #endif |
245 | } | 243 | } |
246 | } | 244 | } |
247 | } | 245 | } |
248 | fgets(buf,200,fontdef); | 246 | fgets(buf,200,fontdef); |
249 | } | 247 | } |
250 | fclose(fontdef); | 248 | fclose(fontdef); |
251 | #endif | 249 | #endif |
252 | } | 250 | } |
253 | 251 | ||
diff --git a/library/global.cpp b/library/global.cpp index a627348..5ac969b 100644 --- a/library/global.cpp +++ b/library/global.cpp | |||
@@ -1,435 +1,433 @@ | |||
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 | #define QTOPIA_INTERNAL_LANGLIST | 20 | #define QTOPIA_INTERNAL_LANGLIST |
21 | #include <qpe/qpedebug.h> | 21 | #include <qpe/qpedebug.h> |
22 | #include <qpe/global.h> | 22 | #include <qpe/global.h> |
23 | #include <qpe/qdawg.h> | 23 | #include <qpe/qdawg.h> |
24 | #include <qpe/qpeapplication.h> | 24 | #include <qpe/qpeapplication.h> |
25 | #include <qpe/resource.h> | 25 | #include <qpe/resource.h> |
26 | #include <qpe/storage.h> | 26 | #include <qpe/storage.h> |
27 | #include <qpe/applnk.h> | 27 | #include <qpe/applnk.h> |
28 | #include <qpe/qcopenvelope_qws.h> | 28 | #include <qpe/qcopenvelope_qws.h> |
29 | #include <qpe/config.h> | 29 | #include <qpe/config.h> |
30 | 30 | ||
31 | #include <qfile.h> | ||
32 | #include <qlabel.h> | 31 | #include <qlabel.h> |
33 | #include <qtimer.h> | 32 | #include <qtimer.h> |
34 | #include <qmap.h> | 33 | #include <qmap.h> |
35 | #include <qdict.h> | 34 | #include <qdict.h> |
36 | #include <qdir.h> | 35 | #include <qdir.h> |
37 | #include <qmessagebox.h> | 36 | #include <qmessagebox.h> |
38 | #include <qregexp.h> | 37 | #include <qregexp.h> |
39 | 38 | ||
40 | #include <stdlib.h> | 39 | #include <stdlib.h> |
41 | #include <sys/stat.h> | 40 | #include <sys/stat.h> |
42 | #include <sys/wait.h> | 41 | #include <sys/wait.h> |
43 | #include <sys/types.h> | 42 | #include <sys/types.h> |
44 | #include <fcntl.h> | 43 | #include <fcntl.h> |
45 | #include <unistd.h> | 44 | #include <unistd.h> |
46 | #include <errno.h> | 45 | #include <errno.h> |
47 | 46 | ||
48 | #include <qwindowsystem_qws.h> // for qwsServer | 47 | #include <qwindowsystem_qws.h> // for qwsServer |
49 | #include <qdatetime.h> | 48 | #include <qdatetime.h> |
50 | 49 | ||
51 | #include <qfile.h> | ||
52 | 50 | ||
53 | //#include "quickexec_p.h" | 51 | //#include "quickexec_p.h" |
54 | 52 | ||
55 | class Emitter : public QObject { | 53 | class Emitter : public QObject { |
56 | Q_OBJECT | 54 | Q_OBJECT |
57 | public: | 55 | public: |
58 | Emitter( QWidget* receiver, const QString& document ) | 56 | Emitter( QWidget* receiver, const QString& document ) |
59 | { | 57 | { |
60 | connect(this, SIGNAL(setDocument(const QString&)), | 58 | connect(this, SIGNAL(setDocument(const QString&)), |
61 | receiver, SLOT(setDocument(const QString&))); | 59 | receiver, SLOT(setDocument(const QString&))); |
62 | emit setDocument(document); | 60 | emit setDocument(document); |
63 | disconnect(this, SIGNAL(setDocument(const QString&)), | 61 | disconnect(this, SIGNAL(setDocument(const QString&)), |
64 | receiver, SLOT(setDocument(const QString&))); | 62 | receiver, SLOT(setDocument(const QString&))); |
65 | } | 63 | } |
66 | 64 | ||
67 | signals: | 65 | signals: |
68 | void setDocument(const QString&); | 66 | void setDocument(const QString&); |
69 | }; | 67 | }; |
70 | 68 | ||
71 | 69 | ||
72 | class StartingAppList : public QObject { | 70 | class StartingAppList : public QObject { |
73 | Q_OBJECT | 71 | Q_OBJECT |
74 | public: | 72 | public: |
75 | static void add( const QString& name ); | 73 | static void add( const QString& name ); |
76 | static bool isStarting( const QString name ); | 74 | static bool isStarting( const QString name ); |
77 | private slots: | 75 | private slots: |
78 | void handleNewChannel( const QString &); | 76 | void handleNewChannel( const QString &); |
79 | private: | 77 | private: |
80 | StartingAppList( QObject *parent=0, const char* name=0 ) ; | 78 | StartingAppList( QObject *parent=0, const char* name=0 ) ; |
81 | 79 | ||
82 | QDict<QTime> dict; | 80 | QDict<QTime> dict; |
83 | static StartingAppList *appl; | 81 | static StartingAppList *appl; |
84 | }; | 82 | }; |
85 | 83 | ||
86 | StartingAppList* StartingAppList::appl = 0; | 84 | StartingAppList* StartingAppList::appl = 0; |
87 | 85 | ||
88 | StartingAppList::StartingAppList( QObject *parent, const char* name ) | 86 | StartingAppList::StartingAppList( QObject *parent, const char* name ) |
89 | :QObject( parent, name ) | 87 | :QObject( parent, name ) |
90 | { | 88 | { |
91 | #if QT_VERSION >= 232 && defined(QWS) | 89 | #if QT_VERSION >= 232 && defined(QWS) |
92 | connect( qwsServer, SIGNAL( newChannel(const QString&)), | 90 | connect( qwsServer, SIGNAL( newChannel(const QString&)), |
93 | this, SLOT( handleNewChannel(const QString&)) ); | 91 | this, SLOT( handleNewChannel(const QString&)) ); |
94 | #endif | 92 | #endif |
95 | dict.setAutoDelete( TRUE ); | 93 | dict.setAutoDelete( TRUE ); |
96 | } | 94 | } |
97 | 95 | ||
98 | void StartingAppList::add( const QString& name ) | 96 | void StartingAppList::add( const QString& name ) |
99 | { | 97 | { |
100 | #if QT_VERSION >= 232 && !defined(QT_NO_COP) | 98 | #if QT_VERSION >= 232 && !defined(QT_NO_COP) |
101 | if ( !appl ) | 99 | if ( !appl ) |
102 | appl = new StartingAppList; | 100 | appl = new StartingAppList; |
103 | QTime *t = new QTime; | 101 | QTime *t = new QTime; |
104 | t->start(); | 102 | t->start(); |
105 | appl->dict.insert( "QPE/Application/" + name, t ); | 103 | appl->dict.insert( "QPE/Application/" + name, t ); |
106 | #endif | 104 | #endif |
107 | } | 105 | } |
108 | 106 | ||
109 | bool StartingAppList::isStarting( const QString name ) | 107 | bool StartingAppList::isStarting( const QString name ) |
110 | { | 108 | { |
111 | #if QT_VERSION >= 232 && !defined(QT_NO_COP) | 109 | #if QT_VERSION >= 232 && !defined(QT_NO_COP) |
112 | if ( appl ) { | 110 | if ( appl ) { |
113 | QTime *t = appl->dict.find( "QPE/Application/" + name ); | 111 | QTime *t = appl->dict.find( "QPE/Application/" + name ); |
114 | if ( !t ) | 112 | if ( !t ) |
115 | return FALSE; | 113 | return FALSE; |
116 | if ( t->elapsed() > 10000 ) { | 114 | if ( t->elapsed() > 10000 ) { |
117 | // timeout in case of crash or something | 115 | // timeout in case of crash or something |
118 | appl->dict.remove( "QPE/Application/" + name ); | 116 | appl->dict.remove( "QPE/Application/" + name ); |
119 | return FALSE; | 117 | return FALSE; |
120 | } | 118 | } |
121 | return TRUE; | 119 | return TRUE; |
122 | } | 120 | } |
123 | #endif | 121 | #endif |
124 | return FALSE; | 122 | return FALSE; |
125 | } | 123 | } |
126 | 124 | ||
127 | void StartingAppList::handleNewChannel( const QString & name ) | 125 | void StartingAppList::handleNewChannel( const QString & name ) |
128 | { | 126 | { |
129 | #if QT_VERSION >= 232 && !defined(QT_NO_COP) | 127 | #if QT_VERSION >= 232 && !defined(QT_NO_COP) |
130 | dict.remove( name ); | 128 | dict.remove( name ); |
131 | #endif | 129 | #endif |
132 | } | 130 | } |
133 | 131 | ||
134 | static bool docDirCreated = FALSE; | 132 | static bool docDirCreated = FALSE; |
135 | static QDawg* fixed_dawg = 0; | 133 | static QDawg* fixed_dawg = 0; |
136 | static QDict<QDawg> *named_dawg = 0; | 134 | static QDict<QDawg> *named_dawg = 0; |
137 | 135 | ||
138 | static QString qpeDir() | 136 | static QString qpeDir() |
139 | { | 137 | { |
140 | QString dir = getenv("OPIEDIR"); | 138 | QString dir = getenv("OPIEDIR"); |
141 | if ( dir.isEmpty() ) dir = ".."; | 139 | if ( dir.isEmpty() ) dir = ".."; |
142 | return dir; | 140 | return dir; |
143 | } | 141 | } |
144 | 142 | ||
145 | static QString dictDir() | 143 | static QString dictDir() |
146 | { | 144 | { |
147 | return qpeDir() + "/etc/dict"; | 145 | return qpeDir() + "/etc/dict"; |
148 | } | 146 | } |
149 | 147 | ||
150 | /*! | 148 | /*! |
151 | \class Global global.h | 149 | \class Global global.h |
152 | \brief The Global class provides application-wide global functions. | 150 | \brief The Global class provides application-wide global functions. |
153 | 151 | ||
154 | The Global functions are grouped as follows: | 152 | The Global functions are grouped as follows: |
155 | \tableofcontents | 153 | \tableofcontents |
156 | 154 | ||
157 | \section1 User Interface | 155 | \section1 User Interface |
158 | 156 | ||
159 | The statusMessage() function provides short-duration messages to the | 157 | The statusMessage() function provides short-duration messages to the |
160 | user. The showInputMethod() function shows the current input method, | 158 | user. The showInputMethod() function shows the current input method, |
161 | and hideInputMethod() hides the input method. | 159 | and hideInputMethod() hides the input method. |
162 | 160 | ||
163 | \section1 Document related | 161 | \section1 Document related |
164 | 162 | ||
165 | The findDocuments() function creates a set of \link doclnk.html | 163 | The findDocuments() function creates a set of \link doclnk.html |
166 | DocLnk\endlink objects in a particular folder. | 164 | DocLnk\endlink objects in a particular folder. |
167 | 165 | ||
168 | \section1 Filesystem related | 166 | \section1 Filesystem related |
169 | 167 | ||
170 | Global provides an applicationFileName() function that returns the | 168 | Global provides an applicationFileName() function that returns the |
171 | full path of an application-specific file. | 169 | full path of an application-specific file. |
172 | 170 | ||
173 | The execute() function runs an application. | 171 | The execute() function runs an application. |
174 | 172 | ||
175 | \section1 Word list related | 173 | \section1 Word list related |
176 | 174 | ||
177 | A list of words relevant to the current locale is maintained by the | 175 | A list of words relevant to the current locale is maintained by the |
178 | system. The list is held in a \link qdawg.html DAWG\endlink | 176 | system. The list is held in a \link qdawg.html DAWG\endlink |
179 | (implemented by the QDawg class). This list is used, for example, by | 177 | (implemented by the QDawg class). This list is used, for example, by |
180 | the pickboard input method. | 178 | the pickboard input method. |
181 | 179 | ||
182 | The global QDawg is returned by fixedDawg(); this cannot be updated. | 180 | The global QDawg is returned by fixedDawg(); this cannot be updated. |
183 | An updatable copy of the global QDawg is returned by addedDawg(). | 181 | An updatable copy of the global QDawg is returned by addedDawg(). |
184 | Applications may have their own word lists stored in \l{QDawg}s | 182 | Applications may have their own word lists stored in \l{QDawg}s |
185 | which are returned by dawg(). Use addWords() to add words to the | 183 | which are returned by dawg(). Use addWords() to add words to the |
186 | updateable copy of the global QDawg or to named application | 184 | updateable copy of the global QDawg or to named application |
187 | \l{QDawg}s. | 185 | \l{QDawg}s. |
188 | 186 | ||
189 | \section1 Quoting | 187 | \section1 Quoting |
190 | 188 | ||
191 | The shellQuote() function quotes a string suitable for passing to a | 189 | The shellQuote() function quotes a string suitable for passing to a |
192 | shell. The stringQuote() function backslash escapes '\' and '"' | 190 | shell. The stringQuote() function backslash escapes '\' and '"' |
193 | characters. | 191 | characters. |
194 | 192 | ||
195 | \section1 Hardware | 193 | \section1 Hardware |
196 | 194 | ||
197 | The implementation of the writeHWClock() function depends on the AlarmServer | 195 | The implementation of the writeHWClock() function depends on the AlarmServer |
198 | implementation. If the AlarmServer is using atd the clock will be synced to | 196 | implementation. If the AlarmServer is using atd the clock will be synced to |
199 | hardware. If opie-alarm is used the hardware clock will be synced before | 197 | hardware. If opie-alarm is used the hardware clock will be synced before |
200 | suspending the device. opie-alarm is used by iPAQ and Zaurii implementation | 198 | suspending the device. opie-alarm is used by iPAQ and Zaurii implementation |
201 | 199 | ||
202 | \ingroup qtopiaemb | 200 | \ingroup qtopiaemb |
203 | */ | 201 | */ |
204 | 202 | ||
205 | /*! | 203 | /*! |
206 | \internal | 204 | \internal |
207 | */ | 205 | */ |
208 | Global::Global() | 206 | Global::Global() |
209 | { | 207 | { |
210 | } | 208 | } |
211 | 209 | ||
212 | /*! | 210 | /*! |
213 | Returns the unchangeable QDawg that contains general | 211 | Returns the unchangeable QDawg that contains general |
214 | words for the current locale. | 212 | words for the current locale. |
215 | 213 | ||
216 | \sa addedDawg() | 214 | \sa addedDawg() |
217 | */ | 215 | */ |
218 | const QDawg& Global::fixedDawg() | 216 | const QDawg& Global::fixedDawg() |
219 | { | 217 | { |
220 | if ( !fixed_dawg ) { | 218 | if ( !fixed_dawg ) { |
221 | if ( !docDirCreated ) | 219 | if ( !docDirCreated ) |
222 | createDocDir(); | 220 | createDocDir(); |
223 | 221 | ||
224 | fixed_dawg = new QDawg; | 222 | fixed_dawg = new QDawg; |
225 | QString dawgfilename = dictDir() + "/dawg"; | 223 | QString dawgfilename = dictDir() + "/dawg"; |
226 | QString words_lang; | 224 | QString words_lang; |
227 | QStringList langs = Global::languageList(); | 225 | QStringList langs = Global::languageList(); |
228 | for (QStringList::ConstIterator it = langs.begin(); it!=langs.end(); ++it) { | 226 | for (QStringList::ConstIterator it = langs.begin(); it!=langs.end(); ++it) { |
229 | QString lang = *it; | 227 | QString lang = *it; |
230 | words_lang = dictDir() + "/words." + lang; | 228 | words_lang = dictDir() + "/words." + lang; |
231 | QString dawgfilename_lang = dawgfilename + "." + lang; | 229 | QString dawgfilename_lang = dawgfilename + "." + lang; |
232 | if ( QFile::exists(dawgfilename_lang) || | 230 | if ( QFile::exists(dawgfilename_lang) || |
233 | QFile::exists(words_lang) ) { | 231 | QFile::exists(words_lang) ) { |
234 | dawgfilename = dawgfilename_lang; | 232 | dawgfilename = dawgfilename_lang; |
235 | break; | 233 | break; |
236 | } | 234 | } |
237 | } | 235 | } |
238 | QFile dawgfile(dawgfilename); | 236 | QFile dawgfile(dawgfilename); |
239 | 237 | ||
240 | if ( !dawgfile.exists() ) { | 238 | if ( !dawgfile.exists() ) { |
241 | QString fn = dictDir() + "/words"; | 239 | QString fn = dictDir() + "/words"; |
242 | if ( QFile::exists(words_lang) ) | 240 | if ( QFile::exists(words_lang) ) |
243 | fn = words_lang; | 241 | fn = words_lang; |
244 | QFile in(fn); | 242 | QFile in(fn); |
245 | if ( in.open(IO_ReadOnly) ) { | 243 | if ( in.open(IO_ReadOnly) ) { |
246 | fixed_dawg->createFromWords(&in); | 244 | fixed_dawg->createFromWords(&in); |
247 | dawgfile.open(IO_WriteOnly); | 245 | dawgfile.open(IO_WriteOnly); |
248 | fixed_dawg->write(&dawgfile); | 246 | fixed_dawg->write(&dawgfile); |
249 | dawgfile.close(); | 247 | dawgfile.close(); |
250 | } | 248 | } |
251 | } else { | 249 | } else { |
252 | fixed_dawg->readFile(dawgfilename); | 250 | fixed_dawg->readFile(dawgfilename); |
253 | } | 251 | } |
254 | } | 252 | } |
255 | 253 | ||
256 | return *fixed_dawg; | 254 | return *fixed_dawg; |
257 | } | 255 | } |
258 | 256 | ||
259 | /*! | 257 | /*! |
260 | Returns the changeable QDawg that contains general | 258 | Returns the changeable QDawg that contains general |
261 | words for the current locale. | 259 | words for the current locale. |
262 | 260 | ||
263 | \sa fixedDawg() | 261 | \sa fixedDawg() |
264 | */ | 262 | */ |
265 | const QDawg& Global::addedDawg() | 263 | const QDawg& Global::addedDawg() |
266 | { | 264 | { |
267 | return dawg("local"); | 265 | return dawg("local"); |
268 | } | 266 | } |
269 | 267 | ||
270 | /*! | 268 | /*! |
271 | Returns the QDawg with the given \a name. | 269 | Returns the QDawg with the given \a name. |
272 | This is an application-specific word list. | 270 | This is an application-specific word list. |
273 | 271 | ||
274 | \a name should not contain "/". | 272 | \a name should not contain "/". |
275 | */ | 273 | */ |
276 | const QDawg& Global::dawg(const QString& name) | 274 | const QDawg& Global::dawg(const QString& name) |
277 | { | 275 | { |
278 | createDocDir(); | 276 | createDocDir(); |
279 | if ( !named_dawg ) | 277 | if ( !named_dawg ) |
280 | named_dawg = new QDict<QDawg>; | 278 | named_dawg = new QDict<QDawg>; |
281 | QDawg* r = named_dawg->find(name); | 279 | QDawg* r = named_dawg->find(name); |
282 | if ( !r ) { | 280 | if ( !r ) { |
283 | r = new QDawg; | 281 | r = new QDawg; |
284 | named_dawg->insert(name,r); | 282 | named_dawg->insert(name,r); |
285 | QString dawgfilename = applicationFileName("Dictionary", name ) + ".dawg"; | 283 | QString dawgfilename = applicationFileName("Dictionary", name ) + ".dawg"; |
286 | QFile dawgfile(dawgfilename); | 284 | QFile dawgfile(dawgfilename); |
287 | if ( dawgfile.open(IO_ReadOnly) ) | 285 | if ( dawgfile.open(IO_ReadOnly) ) |
288 | r->readFile(dawgfilename); | 286 | r->readFile(dawgfilename); |
289 | } | 287 | } |
290 | return *r; | 288 | return *r; |
291 | } | 289 | } |
292 | 290 | ||
293 | /*! | 291 | /*! |
294 | \overload | 292 | \overload |
295 | Adds \a wordlist to the addedDawg(). | 293 | Adds \a wordlist to the addedDawg(). |
296 | 294 | ||
297 | Note that the addition of words persists between program executions | 295 | Note that the addition of words persists between program executions |
298 | (they are saved in the dictionary files), so you should confirm the | 296 | (they are saved in the dictionary files), so you should confirm the |
299 | words with the user before adding them. | 297 | words with the user before adding them. |
300 | */ | 298 | */ |
301 | void Global::addWords(const QStringList& wordlist) | 299 | void Global::addWords(const QStringList& wordlist) |
302 | { | 300 | { |
303 | addWords("local",wordlist); | 301 | addWords("local",wordlist); |
304 | } | 302 | } |
305 | 303 | ||
306 | /*! | 304 | /*! |
307 | \overload | 305 | \overload |
308 | Adds \a wordlist to the addedDawg(). | 306 | Adds \a wordlist to the addedDawg(). |
309 | 307 | ||
310 | Note that the addition of words persists between program executions | 308 | Note that the addition of words persists between program executions |
311 | (they are saved in the dictionary files), so you should confirm the | 309 | (they are saved in the dictionary files), so you should confirm the |
312 | words with the user before adding them. | 310 | words with the user before adding them. |
313 | */ | 311 | */ |
314 | void Global::addWords(const QString& dictname, const QStringList& wordlist) | 312 | void Global::addWords(const QString& dictname, const QStringList& wordlist) |
315 | { | 313 | { |
316 | QDawg& d = (QDawg&)dawg(dictname); | 314 | QDawg& d = (QDawg&)dawg(dictname); |
317 | QStringList all = d.allWords() + wordlist; | 315 | QStringList all = d.allWords() + wordlist; |
318 | d.createFromWords(all); | 316 | d.createFromWords(all); |
319 | 317 | ||
320 | QString dawgfilename = applicationFileName("Dictionary", dictname) + ".dawg"; | 318 | QString dawgfilename = applicationFileName("Dictionary", dictname) + ".dawg"; |
321 | QFile dawgfile(dawgfilename); | 319 | QFile dawgfile(dawgfilename); |
322 | if ( dawgfile.open(IO_WriteOnly) ) { | 320 | if ( dawgfile.open(IO_WriteOnly) ) { |
323 | d.write(&dawgfile); | 321 | d.write(&dawgfile); |
324 | dawgfile.close(); | 322 | dawgfile.close(); |
325 | } | 323 | } |
326 | 324 | ||
327 | // #### Re-read the dawg here if we use mmap(). | 325 | // #### Re-read the dawg here if we use mmap(). |
328 | 326 | ||
329 | // #### Signal other processes to re-read. | 327 | // #### Signal other processes to re-read. |
330 | } | 328 | } |
331 | 329 | ||
332 | 330 | ||
333 | /*! | 331 | /*! |
334 | Returns the full path for the application called \a appname, with the | 332 | Returns the full path for the application called \a appname, with the |
335 | given \a filename. Returns QString::null if there was a problem creating | 333 | given \a filename. Returns QString::null if there was a problem creating |
336 | the directory tree for \a appname. | 334 | the directory tree for \a appname. |
337 | If \a filename contains "/", it is the caller's responsibility to | 335 | If \a filename contains "/", it is the caller's responsibility to |
338 | ensure that those directories exist. | 336 | ensure that those directories exist. |
339 | */ | 337 | */ |
340 | QString Global::applicationFileName(const QString& appname, const QString& filename) | 338 | QString Global::applicationFileName(const QString& appname, const QString& filename) |
341 | { | 339 | { |
342 | QDir d; | 340 | QDir d; |
343 | QString r = getenv("HOME"); | 341 | QString r = getenv("HOME"); |
344 | r += "/Applications/"; | 342 | r += "/Applications/"; |
345 | if ( !QFile::exists( r ) ) | 343 | if ( !QFile::exists( r ) ) |
346 | if ( d.mkdir(r) == false ) | 344 | if ( d.mkdir(r) == false ) |
347 | return QString::null; | 345 | return QString::null; |
348 | r += appname; | 346 | r += appname; |
349 | if ( !QFile::exists( r ) ) | 347 | if ( !QFile::exists( r ) ) |
350 | if ( d.mkdir(r) == false ) | 348 | if ( d.mkdir(r) == false ) |
351 | return QString::null; | 349 | return QString::null; |
352 | r += "/"; r += filename; | 350 | r += "/"; r += filename; |
353 | return r; | 351 | return r; |
354 | } | 352 | } |
355 | 353 | ||
356 | /*! | 354 | /*! |
357 | \internal | 355 | \internal |
358 | */ | 356 | */ |
359 | void Global::createDocDir() | 357 | void Global::createDocDir() |
360 | { | 358 | { |
361 | if ( !docDirCreated ) { | 359 | if ( !docDirCreated ) { |
362 | docDirCreated = TRUE; | 360 | docDirCreated = TRUE; |
363 | mkdir( QPEApplication::documentDir().latin1(), 0755 ); | 361 | mkdir( QPEApplication::documentDir().latin1(), 0755 ); |
364 | } | 362 | } |
365 | } | 363 | } |
366 | 364 | ||
367 | 365 | ||
368 | /*! | 366 | /*! |
369 | Displays a status \a message to the user. This usually appears | 367 | Displays a status \a message to the user. This usually appears |
370 | in the taskbar for a short amount of time, then disappears. | 368 | in the taskbar for a short amount of time, then disappears. |
371 | */ | 369 | */ |
372 | void Global::statusMessage(const QString& message) | 370 | void Global::statusMessage(const QString& message) |
373 | { | 371 | { |
374 | #if !defined(QT_NO_COP) | 372 | #if !defined(QT_NO_COP) |
375 | QCopEnvelope e( "QPE/TaskBar", "message(QString)" ); | 373 | QCopEnvelope e( "QPE/TaskBar", "message(QString)" ); |
376 | e << message; | 374 | e << message; |
377 | #endif | 375 | #endif |
378 | } | 376 | } |
379 | 377 | ||
380 | /*! | 378 | /*! |
381 | \internal | 379 | \internal |
382 | */ | 380 | */ |
383 | void Global::applyStyle() | 381 | void Global::applyStyle() |
384 | { | 382 | { |
385 | #if !defined(QT_NO_COP) | 383 | #if !defined(QT_NO_COP) |
386 | QCopChannel::send( "QPE/System", "applyStyle()" ); | 384 | QCopChannel::send( "QPE/System", "applyStyle()" ); |
387 | #else | 385 | #else |
388 | ((QPEApplication *)qApp)->applyStyle(); // apply without needing QCop for floppy version | 386 | ((QPEApplication *)qApp)->applyStyle(); // apply without needing QCop for floppy version |
389 | #endif | 387 | #endif |
390 | } | 388 | } |
391 | 389 | ||
392 | /*! | 390 | /*! |
393 | \internal | 391 | \internal |
394 | */ | 392 | */ |
395 | QWidget *Global::shutdown( bool ) | 393 | QWidget *Global::shutdown( bool ) |
396 | { | 394 | { |
397 | #if !defined(QT_NO_COP) | 395 | #if !defined(QT_NO_COP) |
398 | QCopChannel::send( "QPE/System", "shutdown()" ); | 396 | QCopChannel::send( "QPE/System", "shutdown()" ); |
399 | #endif | 397 | #endif |
400 | return 0; | 398 | return 0; |
401 | } | 399 | } |
402 | 400 | ||
403 | /*! | 401 | /*! |
404 | \internal | 402 | \internal |
405 | */ | 403 | */ |
406 | QWidget *Global::restart( bool ) | 404 | QWidget *Global::restart( bool ) |
407 | { | 405 | { |
408 | #if !defined(QT_NO_COP) | 406 | #if !defined(QT_NO_COP) |
409 | QCopChannel::send( "QPE/System", "restart()" ); | 407 | QCopChannel::send( "QPE/System", "restart()" ); |
410 | #endif | 408 | #endif |
411 | return 0; | 409 | return 0; |
412 | } | 410 | } |
413 | 411 | ||
414 | /*! | 412 | /*! |
415 | Explicitly show the current input method. | 413 | Explicitly show the current input method. |
416 | 414 | ||
417 | Input methods are indicated in the taskbar by a small icon. If the | 415 | Input methods are indicated in the taskbar by a small icon. If the |
418 | input method is activated (shown) then it takes up some proportion | 416 | input method is activated (shown) then it takes up some proportion |
419 | of the bottom of the screen, to allow the user to interact (input | 417 | of the bottom of the screen, to allow the user to interact (input |
420 | characters) with it. | 418 | characters) with it. |
421 | 419 | ||
422 | \sa hideInputMethod() | 420 | \sa hideInputMethod() |
423 | */ | 421 | */ |
424 | void Global::showInputMethod() | 422 | void Global::showInputMethod() |
425 | { | 423 | { |
426 | #if !defined(QT_NO_COP) | 424 | #if !defined(QT_NO_COP) |
427 | QCopChannel::send( "QPE/TaskBar", "showInputMethod()" ); | 425 | QCopChannel::send( "QPE/TaskBar", "showInputMethod()" ); |
428 | #endif | 426 | #endif |
429 | } | 427 | } |
430 | 428 | ||
431 | /*! | 429 | /*! |
432 | Explicitly hide the current input method. | 430 | Explicitly hide the current input method. |
433 | 431 | ||
434 | The current input method is still indicated in the taskbar, but no | 432 | The current input method is still indicated in the taskbar, but no |
435 | longer takes up screen space, and can no longer be interacted with. | 433 | longer takes up screen space, and can no longer be interacted with. |
diff --git a/library/imageedit.cpp b/library/imageedit.cpp index caa538a..3a559f4 100644 --- a/library/imageedit.cpp +++ b/library/imageedit.cpp | |||
@@ -1,97 +1,96 @@ | |||
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 | #include "imageedit.h" | 20 | #include "imageedit.h" |
21 | #include <qpainter.h> | ||
22 | 21 | ||
23 | ImageEdit::ImageEdit( QWidget *parent, const char *name) | 22 | ImageEdit::ImageEdit( QWidget *parent, const char *name) |
24 | : QScrollView( parent, name, WNorthWestGravity | WResizeNoErase ), buffer() | 23 | : QScrollView( parent, name, WNorthWestGravity | WResizeNoErase ), buffer() |
25 | { | 24 | { |
26 | buffer.resize( size() ); | 25 | buffer.resize( size() ); |
27 | buffer.fill( colorGroup().color( QColorGroup::Base ) ); | 26 | buffer.fill( colorGroup().color( QColorGroup::Base ) ); |
28 | } | 27 | } |
29 | 28 | ||
30 | ImageEdit::~ImageEdit() | 29 | ImageEdit::~ImageEdit() |
31 | { | 30 | { |
32 | 31 | ||
33 | } | 32 | } |
34 | 33 | ||
35 | void ImageEdit::contentsMousePressEvent( QMouseEvent *e ) | 34 | void ImageEdit::contentsMousePressEvent( QMouseEvent *e ) |
36 | { | 35 | { |
37 | lastPos = e->pos(); | 36 | lastPos = e->pos(); |
38 | } | 37 | } |
39 | 38 | ||
40 | void ImageEdit::contentsMouseMoveEvent( QMouseEvent *e ) | 39 | void ImageEdit::contentsMouseMoveEvent( QMouseEvent *e ) |
41 | { | 40 | { |
42 | QPainter pw( viewport() ); | 41 | QPainter pw( viewport() ); |
43 | QPainter pb( &buffer ); | 42 | QPainter pb( &buffer ); |
44 | pb.drawLine( lastPos, e->pos() ); | 43 | pb.drawLine( lastPos, e->pos() ); |
45 | pw.drawLine( contentsToViewport( lastPos ), | 44 | pw.drawLine( contentsToViewport( lastPos ), |
46 | contentsToViewport( e->pos() ) ); | 45 | contentsToViewport( e->pos() ) ); |
47 | lastPos = e->pos(); | 46 | lastPos = e->pos(); |
48 | } | 47 | } |
49 | 48 | ||
50 | void ImageEdit::contentsMouseReleaseEvent( QMouseEvent * ) | 49 | void ImageEdit::contentsMouseReleaseEvent( QMouseEvent * ) |
51 | { | 50 | { |
52 | } | 51 | } |
53 | 52 | ||
54 | void ImageEdit::viewportResizeEvent( QResizeEvent *e ) | 53 | void ImageEdit::viewportResizeEvent( QResizeEvent *e ) |
55 | { | 54 | { |
56 | enlargeBuffer(e->size()); | 55 | enlargeBuffer(e->size()); |
57 | } | 56 | } |
58 | 57 | ||
59 | void ImageEdit::enlargeBuffer( const QSize& sz ) | 58 | void ImageEdit::enlargeBuffer( const QSize& sz ) |
60 | { | 59 | { |
61 | QSize osz = buffer.size(); | 60 | QSize osz = buffer.size(); |
62 | QSize nsz( QMAX( osz.width(), sz.width() ), QMAX( osz.height(), sz.height() ) ); | 61 | QSize nsz( QMAX( osz.width(), sz.width() ), QMAX( osz.height(), sz.height() ) ); |
63 | buffer.resize( nsz.width(), nsz.height() ); | 62 | buffer.resize( nsz.width(), nsz.height() ); |
64 | // clear new area | 63 | // clear new area |
65 | QPainter p( &buffer ); | 64 | QPainter p( &buffer ); |
66 | if ( sz.width() > osz.width() ) | 65 | if ( sz.width() > osz.width() ) |
67 | p.fillRect( osz.width(), 0, sz.width() - osz.width(), nsz.height(), colorGroup().color( QColorGroup::Base ) ); | 66 | p.fillRect( osz.width(), 0, sz.width() - osz.width(), nsz.height(), colorGroup().color( QColorGroup::Base ) ); |
68 | if ( sz.height() > osz.height() ) | 67 | if ( sz.height() > osz.height() ) |
69 | p.fillRect( 0, osz.height(), nsz.width(), sz.height() - osz.height(), colorGroup().color( QColorGroup::Base ) ); | 68 | p.fillRect( 0, osz.height(), nsz.width(), sz.height() - osz.height(), colorGroup().color( QColorGroup::Base ) ); |
70 | p.end(); | 69 | p.end(); |
71 | } | 70 | } |
72 | 71 | ||
73 | void ImageEdit::drawContents( QPainter *p, int cx, int cy, int cw, int ch ) | 72 | void ImageEdit::drawContents( QPainter *p, int cx, int cy, int cw, int ch ) |
74 | { | 73 | { |
75 | p->drawPixmap( cx, cy, buffer, cx, cy, cw, ch ); | 74 | p->drawPixmap( cx, cy, buffer, cx, cy, cw, ch ); |
76 | } | 75 | } |
77 | 76 | ||
78 | void ImageEdit::setPixmap( const QPixmap &pm ) | 77 | void ImageEdit::setPixmap( const QPixmap &pm ) |
79 | { | 78 | { |
80 | QSize osz = buffer.size(); | 79 | QSize osz = buffer.size(); |
81 | if ( pm.width() < osz.width() || pm.height() < osz.height() ) { | 80 | if ( pm.width() < osz.width() || pm.height() < osz.height() ) { |
82 | buffer.fill(white); | 81 | buffer.fill(white); |
83 | enlargeBuffer( pm.size() ); | 82 | enlargeBuffer( pm.size() ); |
84 | QPainter p(&buffer); | 83 | QPainter p(&buffer); |
85 | p.drawPixmap(0,0,pm); | 84 | p.drawPixmap(0,0,pm); |
86 | } else { | 85 | } else { |
87 | buffer = pm; | 86 | buffer = pm; |
88 | } | 87 | } |
89 | resizeContents( buffer.width(), buffer.height() ); | 88 | resizeContents( buffer.width(), buffer.height() ); |
90 | viewport()->repaint( FALSE ); | 89 | viewport()->repaint( FALSE ); |
91 | } | 90 | } |
92 | 91 | ||
93 | QPixmap ImageEdit::pixmap() const | 92 | QPixmap ImageEdit::pixmap() const |
94 | { | 93 | { |
95 | return buffer; | 94 | return buffer; |
96 | } | 95 | } |
97 | 96 | ||
diff --git a/library/ir.cpp b/library/ir.cpp index b5b726d..32c0925 100644 --- a/library/ir.cpp +++ b/library/ir.cpp | |||
@@ -1,118 +1,116 @@ | |||
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 | 20 | ||
21 | #include "ir.h" | 21 | #include "ir.h" |
22 | 22 | ||
23 | #include <qstring.h> | ||
24 | #include "qcopenvelope_qws.h" | 23 | #include "qcopenvelope_qws.h" |
25 | #include <qcopchannel_qws.h> | ||
26 | #include "applnk.h" | 24 | #include "applnk.h" |
27 | 25 | ||
28 | /*! | 26 | /*! |
29 | \class Ir ir.h | 27 | \class Ir ir.h |
30 | \brief The Ir class implements basic support for sending objects over an | 28 | \brief The Ir class implements basic support for sending objects over an |
31 | infrared communication link. | 29 | infrared communication link. |
32 | 30 | ||
33 | Both \link doclnk.html DocLnk\endlink objects and files can be | 31 | Both \link doclnk.html DocLnk\endlink objects and files can be |
34 | sent to another device via the infrared link using the send() | 32 | sent to another device via the infrared link using the send() |
35 | function. When the send has completed the done() signal is | 33 | function. When the send has completed the done() signal is |
36 | emitted. | 34 | emitted. |
37 | 35 | ||
38 | The supported() function returns whether the device supports | 36 | The supported() function returns whether the device supports |
39 | infrared communication or not. | 37 | infrared communication or not. |
40 | 38 | ||
41 | \ingroup qtopiaemb | 39 | \ingroup qtopiaemb |
42 | */ | 40 | */ |
43 | 41 | ||
44 | /*! | 42 | /*! |
45 | Constructs an Ir object. The \a parent and \a name classes are the | 43 | Constructs an Ir object. The \a parent and \a name classes are the |
46 | standard QObject parameters. | 44 | standard QObject parameters. |
47 | */ | 45 | */ |
48 | Ir::Ir( QObject *parent, const char *name ) | 46 | Ir::Ir( QObject *parent, const char *name ) |
49 | : QObject( parent, name ) | 47 | : QObject( parent, name ) |
50 | { | 48 | { |
51 | #ifndef QT_NO_COP | 49 | #ifndef QT_NO_COP |
52 | ch = new QCopChannel( "QPE/Obex" ); | 50 | ch = new QCopChannel( "QPE/Obex" ); |
53 | connect( ch, SIGNAL(received(const QCString &, const QByteArray &)), | 51 | connect( ch, SIGNAL(received(const QCString &, const QByteArray &)), |
54 | this, SLOT(obexMessage( const QCString &, const QByteArray &)) ); | 52 | this, SLOT(obexMessage( const QCString &, const QByteArray &)) ); |
55 | #endif | 53 | #endif |
56 | } | 54 | } |
57 | 55 | ||
58 | /*! | 56 | /*! |
59 | Returns TRUE if the system supports infrared communication; | 57 | Returns TRUE if the system supports infrared communication; |
60 | otherwise returns FALSE. | 58 | otherwise returns FALSE. |
61 | */ | 59 | */ |
62 | bool Ir::supported() | 60 | bool Ir::supported() |
63 | { | 61 | { |
64 | #ifndef QT_NO_COP | 62 | #ifndef QT_NO_COP |
65 | return QCopChannel::isRegistered( "QPE/Obex" ); | 63 | return QCopChannel::isRegistered( "QPE/Obex" ); |
66 | #endif | 64 | #endif |
67 | } | 65 | } |
68 | 66 | ||
69 | /*! | 67 | /*! |
70 | Sends the object in file \a fn over the infrared link. The \a | 68 | Sends the object in file \a fn over the infrared link. The \a |
71 | description is used in the text shown to the user while sending | 69 | description is used in the text shown to the user while sending |
72 | is in progress. The optional \a mimetype parameter specifies the | 70 | is in progress. The optional \a mimetype parameter specifies the |
73 | mimetype of the object. If this parameter is not set, it is | 71 | mimetype of the object. If this parameter is not set, it is |
74 | determined by the the filename's suffix. | 72 | determined by the the filename's suffix. |
75 | 73 | ||
76 | \sa done() | 74 | \sa done() |
77 | */ | 75 | */ |
78 | void Ir::send( const QString &fn, const QString &description, const QString &mimetype) | 76 | void Ir::send( const QString &fn, const QString &description, const QString &mimetype) |
79 | { | 77 | { |
80 | if ( !filename.isEmpty() ) return; | 78 | if ( !filename.isEmpty() ) return; |
81 | filename = fn; | 79 | filename = fn; |
82 | #ifndef QT_NO_COP | 80 | #ifndef QT_NO_COP |
83 | QCopEnvelope e("QPE/Obex", "send(QString,QString,QString)"); | 81 | QCopEnvelope e("QPE/Obex", "send(QString,QString,QString)"); |
84 | e << description << filename << mimetype; | 82 | e << description << filename << mimetype; |
85 | #endif | 83 | #endif |
86 | } | 84 | } |
87 | 85 | ||
88 | /*! | 86 | /*! |
89 | \overload | 87 | \overload |
90 | 88 | ||
91 | Uses the DocLnk::file() and DocLnk::type() of \a doc. | 89 | Uses the DocLnk::file() and DocLnk::type() of \a doc. |
92 | 90 | ||
93 | \sa done() | 91 | \sa done() |
94 | */ | 92 | */ |
95 | void Ir::send( const DocLnk &doc, const QString &description ) | 93 | void Ir::send( const DocLnk &doc, const QString &description ) |
96 | { | 94 | { |
97 | send( doc.file(), description, doc.type() ); | 95 | send( doc.file(), description, doc.type() ); |
98 | } | 96 | } |
99 | 97 | ||
100 | /*! | 98 | /*! |
101 | \fn Ir::done( Ir *ir ); | 99 | \fn Ir::done( Ir *ir ); |
102 | 100 | ||
103 | This signal is emitted by \a ir, when the send comand has been processed. | 101 | This signal is emitted by \a ir, when the send comand has been processed. |
104 | */ | 102 | */ |
105 | 103 | ||
106 | /*!\internal | 104 | /*!\internal |
107 | */ | 105 | */ |
108 | void Ir::obexMessage( const QCString &msg, const QByteArray &data) | 106 | void Ir::obexMessage( const QCString &msg, const QByteArray &data) |
109 | { | 107 | { |
110 | if ( msg == "done(QString)" ) { | 108 | if ( msg == "done(QString)" ) { |
111 | QString fn; | 109 | QString fn; |
112 | QDataStream stream( data, IO_ReadOnly ); | 110 | QDataStream stream( data, IO_ReadOnly ); |
113 | stream >> fn; | 111 | stream >> fn; |
114 | if ( fn == filename ) | 112 | if ( fn == filename ) |
115 | emit done( this ); | 113 | emit done( this ); |
116 | } | 114 | } |
117 | } | 115 | } |
118 | 116 | ||
diff --git a/library/lnkproperties.cpp b/library/lnkproperties.cpp index 8dca4ab..0661423 100644 --- a/library/lnkproperties.cpp +++ b/library/lnkproperties.cpp | |||
@@ -1,347 +1,346 @@ | |||
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 | 20 | ||
21 | // WARNING: Do *NOT* define this yourself. The SL5xxx from SHARP does NOT | 21 | // WARNING: Do *NOT* define this yourself. The SL5xxx from SHARP does NOT |
22 | // have this class. | 22 | // have this class. |
23 | #define QTOPIA_INTERNAL_FSLP | 23 | #define QTOPIA_INTERNAL_FSLP |
24 | #include "lnkproperties.h" | ||
25 | #include "lnkproperties.h" | ||
26 | #include "lnkpropertiesbase_p.h" | 24 | #include "lnkpropertiesbase_p.h" |
25 | #include "lnkproperties.h" | ||
27 | #include "ir.h" | 26 | #include "ir.h" |
28 | 27 | ||
29 | #include <qpe/qpeapplication.h> | 28 | #include <qpe/qpeapplication.h> |
30 | #include <qpe/applnk.h> | 29 | #include <qpe/applnk.h> |
31 | #include <qpe/global.h> | 30 | #include <qpe/global.h> |
32 | #include <qpe/categorywidget.h> | 31 | #include <qpe/categorywidget.h> |
33 | #include <qpe/qcopenvelope_qws.h> | 32 | #include <qpe/qcopenvelope_qws.h> |
34 | #include <qpe/filemanager.h> | 33 | #include <qpe/filemanager.h> |
35 | #include <qpe/config.h> | 34 | #include <qpe/config.h> |
36 | #include <qpe/storage.h> | 35 | #include <qpe/storage.h> |
37 | #include <qpe/qpemessagebox.h> | 36 | #include <qpe/qpemessagebox.h> |
38 | #include <qpe/mimetype.h> | 37 | #include <qpe/mimetype.h> |
39 | 38 | ||
40 | #include <qlineedit.h> | 39 | #include <qlineedit.h> |
41 | #include <qtoolbutton.h> | 40 | #include <qtoolbutton.h> |
42 | #include <qpushbutton.h> | 41 | #include <qpushbutton.h> |
43 | #include <qgroupbox.h> | 42 | #include <qgroupbox.h> |
44 | #include <qcheckbox.h> | 43 | #include <qcheckbox.h> |
45 | #include <qlabel.h> | 44 | #include <qlabel.h> |
46 | #include <qlayout.h> | 45 | #include <qlayout.h> |
47 | #include <qfile.h> | 46 | #include <qfile.h> |
48 | #include <qfileinfo.h> | 47 | #include <qfileinfo.h> |
49 | #include <qmessagebox.h> | 48 | #include <qmessagebox.h> |
50 | #include <qsize.h> | 49 | #include <qsize.h> |
51 | #include <qcombobox.h> | 50 | #include <qcombobox.h> |
52 | #include <qregexp.h> | 51 | #include <qregexp.h> |
53 | #include <qbuttongroup.h> | 52 | #include <qbuttongroup.h> |
54 | 53 | ||
55 | #include <stdlib.h> | 54 | #include <stdlib.h> |
56 | 55 | ||
57 | LnkProperties::LnkProperties( AppLnk* l, QWidget* parent ) | 56 | LnkProperties::LnkProperties( AppLnk* l, QWidget* parent ) |
58 | : QDialog( parent, 0, TRUE ), lnk(l), fileSize( 0 ) | 57 | : QDialog( parent, 0, TRUE ), lnk(l), fileSize( 0 ) |
59 | { | 58 | { |
60 | setCaption( tr("Properties") ); | 59 | setCaption( tr("Properties") ); |
61 | 60 | ||
62 | QVBoxLayout *vbox = new QVBoxLayout( this ); | 61 | QVBoxLayout *vbox = new QVBoxLayout( this ); |
63 | d = new LnkPropertiesBase( this ); | 62 | d = new LnkPropertiesBase( this ); |
64 | vbox->add( d ); | 63 | vbox->add( d ); |
65 | 64 | ||
66 | // hide custom rotation feature for now, need a new implementation to fit quicklauch, | 65 | // hide custom rotation feature for now, need a new implementation to fit quicklauch, |
67 | // is confusing for the user and doubtable useful since life rotation | 66 | // is confusing for the user and doubtable useful since life rotation |
68 | d->rotate->hide(); | 67 | d->rotate->hide(); |
69 | d->rotateButtons->hide(); | 68 | d->rotateButtons->hide(); |
70 | 69 | ||
71 | d->docname->setText(l->name()); | 70 | d->docname->setText(l->name()); |
72 | QString inf; | 71 | QString inf; |
73 | if ( l->type().isEmpty() ) { | 72 | if ( l->type().isEmpty() ) { |
74 | d->type->hide(); | 73 | d->type->hide(); |
75 | d->typeLabel->hide(); | 74 | d->typeLabel->hide(); |
76 | } else { | 75 | } else { |
77 | d->type->setText( l->type() ); | 76 | d->type->setText( l->type() ); |
78 | } | 77 | } |
79 | 78 | ||
80 | if ( l->comment().isEmpty() ) { | 79 | if ( l->comment().isEmpty() ) { |
81 | d->comment->hide(); | 80 | d->comment->hide(); |
82 | d->commentLabel->hide(); | 81 | d->commentLabel->hide(); |
83 | } else { | 82 | } else { |
84 | d->comment->setText( l->comment() ); | 83 | d->comment->setText( l->comment() ); |
85 | } | 84 | } |
86 | 85 | ||
87 | connect(d->beam,SIGNAL(clicked()),this,SLOT(beamLnk())); | 86 | connect(d->beam,SIGNAL(clicked()),this,SLOT(beamLnk())); |
88 | if ( lnk->type().contains('/') ) { // A document? (#### better predicate needed) | 87 | if ( lnk->type().contains('/') ) { // A document? (#### better predicate needed) |
89 | connect(d->unlink,SIGNAL(clicked()),this,SLOT(unlinkLnk())); | 88 | connect(d->unlink,SIGNAL(clicked()),this,SLOT(unlinkLnk())); |
90 | connect(d->duplicate,SIGNAL(clicked()),this,SLOT(duplicateLnk())); | 89 | connect(d->duplicate,SIGNAL(clicked()),this,SLOT(duplicateLnk())); |
91 | 90 | ||
92 | d->docname->setReadOnly( FALSE ); | 91 | d->docname->setReadOnly( FALSE ); |
93 | d->preload->hide(); | 92 | d->preload->hide(); |
94 | d->rotate->hide(); | 93 | d->rotate->hide(); |
95 | d->rotateButtons->hide(); | 94 | d->rotateButtons->hide(); |
96 | d->labelspacer->hide(); | 95 | d->labelspacer->hide(); |
97 | 96 | ||
98 | // ### THIS MUST GO, FIX WIERD BUG in QLAYOUT | 97 | // ### THIS MUST GO, FIX WIERD BUG in QLAYOUT |
99 | d->categoryEdit->kludge(); | 98 | d->categoryEdit->kludge(); |
100 | 99 | ||
101 | d->categoryEdit->setCategories( lnk->categories(), | 100 | d->categoryEdit->setCategories( lnk->categories(), |
102 | "Document View", | 101 | "Document View", |
103 | tr("Document View") ); | 102 | tr("Document View") ); |
104 | setupLocations(); | 103 | setupLocations(); |
105 | } else { | 104 | } else { |
106 | d->unlink->hide(); | 105 | d->unlink->hide(); |
107 | d->duplicate->hide(); | 106 | d->duplicate->hide(); |
108 | d->beam->hide(); | 107 | d->beam->hide(); |
109 | d->hline->hide(); | 108 | d->hline->hide(); |
110 | d->locationLabel->hide(); | 109 | d->locationLabel->hide(); |
111 | d->locationCombo->hide(); | 110 | d->locationCombo->hide(); |
112 | 111 | ||
113 | // Can't edit categories, since the app .desktop files are global, | 112 | // Can't edit categories, since the app .desktop files are global, |
114 | // possibly read-only. | 113 | // possibly read-only. |
115 | d->categoryEdit->hide(); | 114 | d->categoryEdit->hide(); |
116 | 115 | ||
117 | d->docname->setReadOnly( TRUE ); | 116 | d->docname->setReadOnly( TRUE ); |
118 | 117 | ||
119 | if ( l->property("CanFastload") == "0" ) | 118 | if ( l->property("CanFastload") == "0" ) |
120 | d->preload->hide(); | 119 | d->preload->hide(); |
121 | if ( !l->property("Rotation"). isEmpty ()) { | 120 | if ( !l->property("Rotation"). isEmpty ()) { |
122 | d->rotate->setChecked ( true ); | 121 | d->rotate->setChecked ( true ); |
123 | //don't use rotate buttons for now (see comment above) | 122 | //don't use rotate buttons for now (see comment above) |
124 | //d->rotateButtons->setButton((l->rotation().toInt()%360)/90); | 123 | //d->rotateButtons->setButton((l->rotation().toInt()%360)/90); |
125 | } | 124 | } |
126 | else { | 125 | else { |
127 | d->rotateButtons->setEnabled(false); | 126 | d->rotateButtons->setEnabled(false); |
128 | } | 127 | } |
129 | 128 | ||
130 | Config cfg("Launcher"); | 129 | Config cfg("Launcher"); |
131 | cfg.setGroup("Preload"); | 130 | cfg.setGroup("Preload"); |
132 | QStringList apps = cfg.readListEntry("Apps",','); | 131 | QStringList apps = cfg.readListEntry("Apps",','); |
133 | d->preload->setChecked( apps.contains(l->exec()) ); | 132 | d->preload->setChecked( apps.contains(l->exec()) ); |
134 | if ( Global::isBuiltinCommand(lnk->exec()) ) | 133 | if ( Global::isBuiltinCommand(lnk->exec()) ) |
135 | d->preload->hide(); // builtins are always fast | 134 | d->preload->hide(); // builtins are always fast |
136 | 135 | ||
137 | currentLocation = 0; // apps not movable (yet) | 136 | currentLocation = 0; // apps not movable (yet) |
138 | } | 137 | } |
139 | } | 138 | } |
140 | 139 | ||
141 | LnkProperties::~LnkProperties() | 140 | LnkProperties::~LnkProperties() |
142 | { | 141 | { |
143 | } | 142 | } |
144 | 143 | ||
145 | void LnkProperties::unlinkLnk() | 144 | void LnkProperties::unlinkLnk() |
146 | { | 145 | { |
147 | if ( QPEMessageBox::confirmDelete( this, tr("Delete"), lnk->name() ) ) { | 146 | if ( QPEMessageBox::confirmDelete( this, tr("Delete"), lnk->name() ) ) { |
148 | lnk->removeFiles(); | 147 | lnk->removeFiles(); |
149 | if ( QFile::exists(lnk->file()) ) { | 148 | if ( QFile::exists(lnk->file()) ) { |
150 | QMessageBox::warning( this, tr("Delete"), tr("File deletion failed.") ); | 149 | QMessageBox::warning( this, tr("Delete"), tr("File deletion failed.") ); |
151 | } else { | 150 | } else { |
152 | reject(); | 151 | reject(); |
153 | } | 152 | } |
154 | } | 153 | } |
155 | } | 154 | } |
156 | 155 | ||
157 | void LnkProperties::setupLocations() | 156 | void LnkProperties::setupLocations() |
158 | { | 157 | { |
159 | QFileInfo fi( lnk->file() ); | 158 | QFileInfo fi( lnk->file() ); |
160 | fileSize = fi.size(); | 159 | fileSize = fi.size(); |
161 | StorageInfo storage; | 160 | StorageInfo storage; |
162 | const QList<FileSystem> &fs = storage.fileSystems(); | 161 | const QList<FileSystem> &fs = storage.fileSystems(); |
163 | QListIterator<FileSystem> it ( fs ); | 162 | QListIterator<FileSystem> it ( fs ); |
164 | QString s; | 163 | QString s; |
165 | QString homeDir = getenv("HOME"); | 164 | QString homeDir = getenv("HOME"); |
166 | QString hardDiskHome; | 165 | QString hardDiskHome; |
167 | QString hardDiskPath; | 166 | QString hardDiskPath; |
168 | int index = 0; | 167 | int index = 0; |
169 | currentLocation = -1; | 168 | currentLocation = -1; |
170 | for ( ; it.current(); ++it ) { | 169 | for ( ; it.current(); ++it ) { |
171 | // we add 10k to the file size so we are sure we can also save the desktop file | 170 | // we add 10k to the file size so we are sure we can also save the desktop file |
172 | if ( (ulong)(*it)->availBlocks() * (ulong)(*it)->blockSize() > (ulong)fileSize + 10000 ) { | 171 | if ( (ulong)(*it)->availBlocks() * (ulong)(*it)->blockSize() > (ulong)fileSize + 10000 ) { |
173 | if ( (*it)->isRemovable() || | 172 | if ( (*it)->isRemovable() || |
174 | (*it)->disk() == "/dev/mtdblock1" || | 173 | (*it)->disk() == "/dev/mtdblock1" || |
175 | (*it)->disk() == "/dev/mtdblock/1" || | 174 | (*it)->disk() == "/dev/mtdblock/1" || |
176 | (*it)->disk().left(13) == "/dev/mtdblock" || | 175 | (*it)->disk().left(13) == "/dev/mtdblock" || |
177 | (*it)->disk() == "/dev/mtdblock6" || | 176 | (*it)->disk() == "/dev/mtdblock6" || |
178 | (*it )->disk() == "/dev/root" || | 177 | (*it )->disk() == "/dev/root" || |
179 | (*it)->disk() == "tmpfs" ) { | 178 | (*it)->disk() == "tmpfs" ) { |
180 | d->locationCombo->insertItem( (*it)->name(), index ); | 179 | d->locationCombo->insertItem( (*it)->name(), index ); |
181 | locations.append( ( ((*it)->isRemovable() || | 180 | locations.append( ( ((*it)->isRemovable() || |
182 | (*it)->disk() == "/dev/mtdblock6" || | 181 | (*it)->disk() == "/dev/mtdblock6" || |
183 | (*it)->disk() == "tmpfs" ) | 182 | (*it)->disk() == "tmpfs" ) |
184 | ? (*it)->path() : homeDir) ); | 183 | ? (*it)->path() : homeDir) ); |
185 | if ( lnk->file().contains( (*it)->path() ) ) { | 184 | if ( lnk->file().contains( (*it)->path() ) ) { |
186 | d->locationCombo->setCurrentItem( index ); | 185 | d->locationCombo->setCurrentItem( index ); |
187 | currentLocation = index; | 186 | currentLocation = index; |
188 | } | 187 | } |
189 | index++; | 188 | index++; |
190 | } else if ( (*it)->name().contains( tr("Hard Disk") ) && | 189 | } else if ( (*it)->name().contains( tr("Hard Disk") ) && |
191 | homeDir.contains( (*it)->path() ) && | 190 | homeDir.contains( (*it)->path() ) && |
192 | (*it)->path().length() > hardDiskHome.length() ) { | 191 | (*it)->path().length() > hardDiskHome.length() ) { |
193 | hardDiskHome = (*it)->name(); | 192 | hardDiskHome = (*it)->name(); |
194 | hardDiskPath = (*it)->path(); | 193 | hardDiskPath = (*it)->path(); |
195 | } | 194 | } |
196 | } | 195 | } |
197 | } | 196 | } |
198 | if ( !hardDiskHome.isEmpty() ) { | 197 | if ( !hardDiskHome.isEmpty() ) { |
199 | d->locationCombo->insertItem( hardDiskHome ); | 198 | d->locationCombo->insertItem( hardDiskHome ); |
200 | locations.append( hardDiskPath ); | 199 | locations.append( hardDiskPath ); |
201 | if ( currentLocation == -1 ) { // assume it's the hard disk | 200 | if ( currentLocation == -1 ) { // assume it's the hard disk |
202 | d->locationCombo->setCurrentItem( index ); | 201 | d->locationCombo->setCurrentItem( index ); |
203 | currentLocation = index; | 202 | currentLocation = index; |
204 | } | 203 | } |
205 | } | 204 | } |
206 | } | 205 | } |
207 | 206 | ||
208 | void LnkProperties::duplicateLnk() | 207 | void LnkProperties::duplicateLnk() |
209 | { | 208 | { |
210 | // The duplicate takes the new properties. | 209 | // The duplicate takes the new properties. |
211 | DocLnk newdoc( *((DocLnk *)lnk) ); | 210 | DocLnk newdoc( *((DocLnk *)lnk) ); |
212 | if ( d->docname->text() == lnk->name() ) | 211 | if ( d->docname->text() == lnk->name() ) |
213 | newdoc.setName(tr("Copy of ")+d->docname->text()); | 212 | newdoc.setName(tr("Copy of ")+d->docname->text()); |
214 | else | 213 | else |
215 | newdoc.setName(d->docname->text()); | 214 | newdoc.setName(d->docname->text()); |
216 | 215 | ||
217 | if ( !copyFile( newdoc ) ) { | 216 | if ( !copyFile( newdoc ) ) { |
218 | QMessageBox::warning( this, tr("Duplicate"), tr("File copy failed.") ); | 217 | QMessageBox::warning( this, tr("Duplicate"), tr("File copy failed.") ); |
219 | return; | 218 | return; |
220 | } | 219 | } |
221 | reject(); | 220 | reject(); |
222 | } | 221 | } |
223 | 222 | ||
224 | bool LnkProperties::moveLnk() | 223 | bool LnkProperties::moveLnk() |
225 | { | 224 | { |
226 | DocLnk newdoc( *((DocLnk *)lnk) ); | 225 | DocLnk newdoc( *((DocLnk *)lnk) ); |
227 | newdoc.setName(d->docname->text()); | 226 | newdoc.setName(d->docname->text()); |
228 | 227 | ||
229 | if ( !copyFile( newdoc ) ) { | 228 | if ( !copyFile( newdoc ) ) { |
230 | QMessageBox::warning( this, tr("Details"), tr("Moving Document failed.") ); | 229 | QMessageBox::warning( this, tr("Details"), tr("Moving Document failed.") ); |
231 | return FALSE; | 230 | return FALSE; |
232 | } | 231 | } |
233 | // remove old lnk | 232 | // remove old lnk |
234 | lnk->removeFiles(); | 233 | lnk->removeFiles(); |
235 | 234 | ||
236 | return TRUE; | 235 | return TRUE; |
237 | } | 236 | } |
238 | 237 | ||
239 | void LnkProperties::beamLnk() | 238 | void LnkProperties::beamLnk() |
240 | { | 239 | { |
241 | Ir ir; | 240 | Ir ir; |
242 | DocLnk doc( *((DocLnk *)lnk) ); | 241 | DocLnk doc( *((DocLnk *)lnk) ); |
243 | doc.setName(d->docname->text()); | 242 | doc.setName(d->docname->text()); |
244 | reject(); | 243 | reject(); |
245 | ir.send( doc, doc.comment() ); | 244 | ir.send( doc, doc.comment() ); |
246 | } | 245 | } |
247 | 246 | ||
248 | bool LnkProperties::copyFile( DocLnk &newdoc ) | 247 | bool LnkProperties::copyFile( DocLnk &newdoc ) |
249 | { | 248 | { |
250 | const char *linkExtn = ".desktop"; | 249 | const char *linkExtn = ".desktop"; |
251 | QString fileExtn; | 250 | QString fileExtn; |
252 | int extnPos = lnk->file().findRev( '.' ); | 251 | int extnPos = lnk->file().findRev( '.' ); |
253 | if ( extnPos > 0 ) | 252 | if ( extnPos > 0 ) |
254 | fileExtn = lnk->file().mid( extnPos ); | 253 | fileExtn = lnk->file().mid( extnPos ); |
255 | 254 | ||
256 | QString safename = newdoc.name(); | 255 | QString safename = newdoc.name(); |
257 | safename.replace(QRegExp("/"),"_"); | 256 | safename.replace(QRegExp("/"),"_"); |
258 | 257 | ||
259 | QString fn = locations[ d->locationCombo->currentItem() ] | 258 | QString fn = locations[ d->locationCombo->currentItem() ] |
260 | + "/Documents/" + newdoc.type() + "/" + safename; | 259 | + "/Documents/" + newdoc.type() + "/" + safename; |
261 | if ( QFile::exists(fn + fileExtn) || QFile::exists(fn + linkExtn) ) { | 260 | if ( QFile::exists(fn + fileExtn) || QFile::exists(fn + linkExtn) ) { |
262 | int n=1; | 261 | int n=1; |
263 | QString nn = fn + "_" + QString::number(n); | 262 | QString nn = fn + "_" + QString::number(n); |
264 | while ( QFile::exists(nn+fileExtn) || QFile::exists(nn+linkExtn) ) { | 263 | while ( QFile::exists(nn+fileExtn) || QFile::exists(nn+linkExtn) ) { |
265 | n++; | 264 | n++; |
266 | nn = fn + "_" + QString::number(n); | 265 | nn = fn + "_" + QString::number(n); |
267 | } | 266 | } |
268 | fn = nn; | 267 | fn = nn; |
269 | } | 268 | } |
270 | newdoc.setFile( fn + fileExtn ); | 269 | newdoc.setFile( fn + fileExtn ); |
271 | newdoc.setLinkFile( fn + linkExtn ); | 270 | newdoc.setLinkFile( fn + linkExtn ); |
272 | 271 | ||
273 | // Copy file | 272 | // Copy file |
274 | FileManager fm; | 273 | FileManager fm; |
275 | if ( !fm.copyFile( *lnk, newdoc ) ) | 274 | if ( !fm.copyFile( *lnk, newdoc ) ) |
276 | return FALSE; | 275 | return FALSE; |
277 | return TRUE; | 276 | return TRUE; |
278 | } | 277 | } |
279 | 278 | ||
280 | void LnkProperties::done(int ok) | 279 | void LnkProperties::done(int ok) |
281 | { | 280 | { |
282 | if ( ok ) { | 281 | if ( ok ) { |
283 | bool changed=FALSE; | 282 | bool changed=FALSE; |
284 | bool reloadMime=FALSE; | 283 | bool reloadMime=FALSE; |
285 | 284 | ||
286 | if ( lnk->name() != d->docname->text() ) { | 285 | if ( lnk->name() != d->docname->text() ) { |
287 | lnk->setName(d->docname->text()); | 286 | lnk->setName(d->docname->text()); |
288 | changed=TRUE; | 287 | changed=TRUE; |
289 | } | 288 | } |
290 | if ( d->categoryEdit->isVisible() ) { | 289 | if ( d->categoryEdit->isVisible() ) { |
291 | QArray<int> tmp = d->categoryEdit->newCategories(); | 290 | QArray<int> tmp = d->categoryEdit->newCategories(); |
292 | if ( lnk->categories() != tmp ) { | 291 | if ( lnk->categories() != tmp ) { |
293 | lnk->setCategories( tmp ); | 292 | lnk->setCategories( tmp ); |
294 | changed = TRUE; | 293 | changed = TRUE; |
295 | } | 294 | } |
296 | } | 295 | } |
297 | if ( !d->rotate->isHidden()) { | 296 | if ( !d->rotate->isHidden()) { |
298 | QString newrot; | 297 | QString newrot; |
299 | 298 | ||
300 | if ( d->rotate->isChecked() ) { | 299 | if ( d->rotate->isChecked() ) { |
301 | int rot=0; | 300 | int rot=0; |
302 | for(; rot<4; rot++) { | 301 | for(; rot<4; rot++) { |
303 | if (d->rotateButtons->find(rot)->isOn()) | 302 | if (d->rotateButtons->find(rot)->isOn()) |
304 | break; | 303 | break; |
305 | } | 304 | } |
306 | newrot = QString::number((rot*90)%360); | 305 | newrot = QString::number((rot*90)%360); |
307 | } | 306 | } |
308 | if ( newrot != lnk->rotation() ) { | 307 | if ( newrot != lnk->rotation() ) { |
309 | lnk-> setRotation(newrot); | 308 | lnk-> setRotation(newrot); |
310 | changed = TRUE; | 309 | changed = TRUE; |
311 | reloadMime = TRUE; | 310 | reloadMime = TRUE; |
312 | } | 311 | } |
313 | } | 312 | } |
314 | if ( d->preload->isHidden() && d->locationCombo->currentItem() != currentLocation ) { | 313 | if ( d->preload->isHidden() && d->locationCombo->currentItem() != currentLocation ) { |
315 | moveLnk(); | 314 | moveLnk(); |
316 | } else if ( changed ) { | 315 | } else if ( changed ) { |
317 | lnk->writeLink(); | 316 | lnk->writeLink(); |
318 | } | 317 | } |
319 | 318 | ||
320 | if ( !d->preload->isHidden() ) { | 319 | if ( !d->preload->isHidden() ) { |
321 | Config cfg("Launcher"); | 320 | Config cfg("Launcher"); |
322 | cfg.setGroup("Preload"); | 321 | cfg.setGroup("Preload"); |
323 | QStringList apps = cfg.readListEntry("Apps",','); | 322 | QStringList apps = cfg.readListEntry("Apps",','); |
324 | QString exe = lnk->exec(); | 323 | QString exe = lnk->exec(); |
325 | if ( apps.contains(exe) != d->preload->isChecked() ) { | 324 | if ( apps.contains(exe) != d->preload->isChecked() ) { |
326 | if ( d->preload->isChecked() ) { | 325 | if ( d->preload->isChecked() ) { |
327 | apps.append(exe); | 326 | apps.append(exe); |
328 | #ifndef QT_NO_COP | 327 | #ifndef QT_NO_COP |
329 | QCopEnvelope e("QPE/Application/"+exe.local8Bit(), | 328 | QCopEnvelope e("QPE/Application/"+exe.local8Bit(), |
330 | "enablePreload()"); | 329 | "enablePreload()"); |
331 | #endif | 330 | #endif |
332 | } else { | 331 | } else { |
333 | apps.remove(exe); | 332 | apps.remove(exe); |
334 | #ifndef QT_NO_COP | 333 | #ifndef QT_NO_COP |
335 | QCopEnvelope e("QPE/Application/"+exe.local8Bit(), | 334 | QCopEnvelope e("QPE/Application/"+exe.local8Bit(), |
336 | "quitIfInvisible()"); | 335 | "quitIfInvisible()"); |
337 | #endif | 336 | #endif |
338 | } | 337 | } |
339 | cfg.writeEntry("Apps",apps,','); | 338 | cfg.writeEntry("Apps",apps,','); |
340 | } | 339 | } |
341 | } | 340 | } |
342 | if ( reloadMime ) | 341 | if ( reloadMime ) |
343 | MimeType::updateApplications ( ); | 342 | MimeType::updateApplications ( ); |
344 | } | 343 | } |
345 | QDialog::done( ok ); | 344 | QDialog::done( ok ); |
346 | } | 345 | } |
347 | 346 | ||
diff --git a/library/mimetype.cpp b/library/mimetype.cpp index d0a578e..23de70b 100644 --- a/library/mimetype.cpp +++ b/library/mimetype.cpp | |||
@@ -1,370 +1,366 @@ | |||
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 | 20 | ||
21 | #define QTOPIA_INTERNAL_MIMEEXT | 21 | #define QTOPIA_INTERNAL_MIMEEXT |
22 | #include "mimetype.h" | 22 | #include "mimetype.h" |
23 | #include "applnk.h" | 23 | #include "applnk.h" |
24 | #include "resource.h" | 24 | #include "resource.h" |
25 | #include <qpe/qpeapplication.h> | 25 | #include <qpe/qpeapplication.h> |
26 | #include "config.h" | 26 | #include "config.h" |
27 | 27 | ||
28 | #include <qfile.h> | 28 | #include <qfile.h> |
29 | #include <qdict.h> | ||
30 | #include <qregexp.h> | ||
31 | #include <qstringlist.h> | ||
32 | #include <qtextstream.h> | 29 | #include <qtextstream.h> |
33 | #include <qmap.h> | ||
34 | 30 | ||
35 | 31 | ||
36 | static void cleanupMime() | 32 | static void cleanupMime() |
37 | { | 33 | { |
38 | MimeType::clear(); | 34 | MimeType::clear(); |
39 | } | 35 | } |
40 | 36 | ||
41 | class MimeTypeData { | 37 | class MimeTypeData { |
42 | public: | 38 | public: |
43 | MimeTypeData(const QString& i) : | 39 | MimeTypeData(const QString& i) : |
44 | id(i) | 40 | id(i) |
45 | { | 41 | { |
46 | apps.setAutoDelete(TRUE); | 42 | apps.setAutoDelete(TRUE); |
47 | } | 43 | } |
48 | QString id; | 44 | QString id; |
49 | QString extension; | 45 | QString extension; |
50 | QList<AppLnk> apps; | 46 | QList<AppLnk> apps; |
51 | 47 | ||
52 | QString description() | 48 | QString description() |
53 | { | 49 | { |
54 | if ( desc.isEmpty() ) | 50 | if ( desc.isEmpty() ) |
55 | desc = QPEApplication::tr("%1 document").arg(apps.first()->name()); | 51 | desc = QPEApplication::tr("%1 document").arg(apps.first()->name()); |
56 | return desc; | 52 | return desc; |
57 | } | 53 | } |
58 | 54 | ||
59 | QPixmap regIcon() | 55 | QPixmap regIcon() |
60 | { | 56 | { |
61 | if ( regicon.isNull() ) | 57 | if ( regicon.isNull() ) |
62 | loadPixmaps(); | 58 | loadPixmaps(); |
63 | return regicon; | 59 | return regicon; |
64 | } | 60 | } |
65 | 61 | ||
66 | QPixmap bigIcon() | 62 | QPixmap bigIcon() |
67 | { | 63 | { |
68 | if ( bigicon.isNull() ) | 64 | if ( bigicon.isNull() ) |
69 | loadPixmaps(); | 65 | loadPixmaps(); |
70 | return bigicon; | 66 | return bigicon; |
71 | } | 67 | } |
72 | 68 | ||
73 | private: | 69 | private: |
74 | void loadPixmaps() | 70 | void loadPixmaps() |
75 | { | 71 | { |
76 | if ( apps.count() ) { | 72 | if ( apps.count() ) { |
77 | QString icon; | 73 | QString icon; |
78 | for (AppLnk* lnk = apps.first(); icon.isNull() && lnk; lnk=apps.next()) { | 74 | for (AppLnk* lnk = apps.first(); icon.isNull() && lnk; lnk=apps.next()) { |
79 | QStringList icons = lnk->mimeTypeIcons(); | 75 | QStringList icons = lnk->mimeTypeIcons(); |
80 | if ( icons.count() ) { | 76 | if ( icons.count() ) { |
81 | QStringList types = lnk->mimeTypes(); | 77 | QStringList types = lnk->mimeTypes(); |
82 | for (QStringList::ConstIterator t=types.begin(),i=icons.begin(); t!=types.end() && i!=icons.end(); ++i,++t) { | 78 | for (QStringList::ConstIterator t=types.begin(),i=icons.begin(); t!=types.end() && i!=icons.end(); ++i,++t) { |
83 | if ( *t == id ) { | 79 | if ( *t == id ) { |
84 | icon = *i; | 80 | icon = *i; |
85 | break; | 81 | break; |
86 | } | 82 | } |
87 | } | 83 | } |
88 | } | 84 | } |
89 | } | 85 | } |
90 | if ( icon.isNull() ) { | 86 | if ( icon.isNull() ) { |
91 | AppLnk* lnk = apps.first(); | 87 | AppLnk* lnk = apps.first(); |
92 | regicon = lnk->pixmap(); | 88 | regicon = lnk->pixmap(); |
93 | bigicon = lnk->bigPixmap(); | 89 | bigicon = lnk->bigPixmap(); |
94 | } else { | 90 | } else { |
95 | QImage unscaledIcon = Resource::loadImage( icon ); | 91 | QImage unscaledIcon = Resource::loadImage( icon ); |
96 | regicon.convertFromImage( unscaledIcon.smoothScale( AppLnk::smallIconSize(), AppLnk::smallIconSize() ) ); | 92 | regicon.convertFromImage( unscaledIcon.smoothScale( AppLnk::smallIconSize(), AppLnk::smallIconSize() ) ); |
97 | bigicon.convertFromImage( unscaledIcon.smoothScale( AppLnk::bigIconSize(), AppLnk::bigIconSize() ) ); | 93 | bigicon.convertFromImage( unscaledIcon.smoothScale( AppLnk::bigIconSize(), AppLnk::bigIconSize() ) ); |
98 | } | 94 | } |
99 | } | 95 | } |
100 | } | 96 | } |
101 | 97 | ||
102 | QPixmap regicon; | 98 | QPixmap regicon; |
103 | QPixmap bigicon; | 99 | QPixmap bigicon; |
104 | QString desc; | 100 | QString desc; |
105 | }; | 101 | }; |
106 | 102 | ||
107 | class MimeType::Private : public QDict<MimeTypeData> { | 103 | class MimeType::Private : public QDict<MimeTypeData> { |
108 | public: | 104 | public: |
109 | Private() {} | 105 | Private() {} |
110 | ~Private() {} | 106 | ~Private() {} |
111 | 107 | ||
112 | // ... | 108 | // ... |
113 | }; | 109 | }; |
114 | 110 | ||
115 | MimeType::Private* MimeType::d=0; | 111 | MimeType::Private* MimeType::d=0; |
116 | static QMap<QString,QString> *typeFor = 0; | 112 | static QMap<QString,QString> *typeFor = 0; |
117 | static QMap<QString,QStringList> *extFor = 0; | 113 | static QMap<QString,QStringList> *extFor = 0; |
118 | 114 | ||
119 | MimeType::Private& MimeType::data() | 115 | MimeType::Private& MimeType::data() |
120 | { | 116 | { |
121 | if ( !d ) { | 117 | if ( !d ) { |
122 | d = new Private; | 118 | d = new Private; |
123 | d->setAutoDelete(TRUE); | 119 | d->setAutoDelete(TRUE); |
124 | static bool setCleanup = FALSE; | 120 | static bool setCleanup = FALSE; |
125 | if ( !setCleanup ) { | 121 | if ( !setCleanup ) { |
126 | qAddPostRoutine( cleanupMime ); | 122 | qAddPostRoutine( cleanupMime ); |
127 | setCleanup = TRUE; | 123 | setCleanup = TRUE; |
128 | } | 124 | } |
129 | } | 125 | } |
130 | return *d; | 126 | return *d; |
131 | } | 127 | } |
132 | 128 | ||
133 | /*! | 129 | /*! |
134 | \class MimeType mimetype.h | 130 | \class MimeType mimetype.h |
135 | \brief The MimeType class provides MIME type information. | 131 | \brief The MimeType class provides MIME type information. |
136 | 132 | ||
137 | A MimeType object is a light-weight value which | 133 | A MimeType object is a light-weight value which |
138 | provides information about a MIME type. | 134 | provides information about a MIME type. |
139 | 135 | ||
140 | \ingroup qtopiaemb | 136 | \ingroup qtopiaemb |
141 | */ | 137 | */ |
142 | 138 | ||
143 | /*! | 139 | /*! |
144 | Constructs a MimeType. | 140 | Constructs a MimeType. |
145 | Normally, \a ext_or_id is a MIME type, | 141 | Normally, \a ext_or_id is a MIME type, |
146 | but if \a ext_or_id starts with / or contains no /, | 142 | but if \a ext_or_id starts with / or contains no /, |
147 | it is interpretted as a filename and the | 143 | it is interpretted as a filename and the |
148 | extension (eg. .txt) is used as the | 144 | extension (eg. .txt) is used as the |
149 | MIME type. | 145 | MIME type. |
150 | */ | 146 | */ |
151 | MimeType::MimeType( const QString& ext_or_id ) | 147 | MimeType::MimeType( const QString& ext_or_id ) |
152 | { | 148 | { |
153 | init(ext_or_id); | 149 | init(ext_or_id); |
154 | } | 150 | } |
155 | 151 | ||
156 | /*! | 152 | /*! |
157 | Constructs a MimeType from the type() of \a lnk. | 153 | Constructs a MimeType from the type() of \a lnk. |
158 | */ | 154 | */ |
159 | MimeType::MimeType( const DocLnk& lnk ) | 155 | MimeType::MimeType( const DocLnk& lnk ) |
160 | { | 156 | { |
161 | init(lnk.type()); | 157 | init(lnk.type()); |
162 | } | 158 | } |
163 | 159 | ||
164 | /*! | 160 | /*! |
165 | Returns the MIME type identifier. | 161 | Returns the MIME type identifier. |
166 | */ | 162 | */ |
167 | QString MimeType::id() const | 163 | QString MimeType::id() const |
168 | { | 164 | { |
169 | return i; | 165 | return i; |
170 | } | 166 | } |
171 | 167 | ||
172 | /*! | 168 | /*! |
173 | Returns a description of the MIME Type. This is usually based | 169 | Returns a description of the MIME Type. This is usually based |
174 | on the application() associated with the type. | 170 | on the application() associated with the type. |
175 | */ | 171 | */ |
176 | QString MimeType::description() const | 172 | QString MimeType::description() const |
177 | { | 173 | { |
178 | MimeTypeData* d = data(i); | 174 | MimeTypeData* d = data(i); |
179 | return d ? d->description() : QString::null; | 175 | return d ? d->description() : QString::null; |
180 | } | 176 | } |
181 | 177 | ||
182 | /*! | 178 | /*! |
183 | Returns a small QPixmap appropriate for the MIME type. | 179 | Returns a small QPixmap appropriate for the MIME type. |
184 | */ | 180 | */ |
185 | QPixmap MimeType::pixmap() const | 181 | QPixmap MimeType::pixmap() const |
186 | { | 182 | { |
187 | MimeTypeData* d = data(i); | 183 | MimeTypeData* d = data(i); |
188 | return d ? d->regIcon() : QPixmap(); | 184 | return d ? d->regIcon() : QPixmap(); |
189 | } | 185 | } |
190 | 186 | ||
191 | /*! | 187 | /*! |
192 | \internal | 188 | \internal |
193 | This function is not generally available. | 189 | This function is not generally available. |
194 | */ | 190 | */ |
195 | QString MimeType::extension() const | 191 | QString MimeType::extension() const |
196 | { | 192 | { |
197 | return extensions().first(); | 193 | return extensions().first(); |
198 | } | 194 | } |
199 | 195 | ||
200 | 196 | ||
201 | /*! | 197 | /*! |
202 | \internal | 198 | \internal |
203 | This function is not generally available. | 199 | This function is not generally available. |
204 | */ | 200 | */ |
205 | QStringList MimeType::extensions() const | 201 | QStringList MimeType::extensions() const |
206 | { | 202 | { |
207 | loadExtensions(); | 203 | loadExtensions(); |
208 | return *(*extFor).find(i); | 204 | return *(*extFor).find(i); |
209 | } | 205 | } |
210 | 206 | ||
211 | /*! | 207 | /*! |
212 | Returns a larger QPixmap appropriate for the MIME type. | 208 | Returns a larger QPixmap appropriate for the MIME type. |
213 | */ | 209 | */ |
214 | QPixmap MimeType::bigPixmap() const | 210 | QPixmap MimeType::bigPixmap() const |
215 | { | 211 | { |
216 | MimeTypeData* d = data(i); | 212 | MimeTypeData* d = data(i); |
217 | return d ? d->bigIcon() : QPixmap(); | 213 | return d ? d->bigIcon() : QPixmap(); |
218 | } | 214 | } |
219 | 215 | ||
220 | /*! | 216 | /*! |
221 | Returns the AppLnk defining the application associated | 217 | Returns the AppLnk defining the application associated |
222 | with this MIME type, or 0 if none is associated. | 218 | with this MIME type, or 0 if none is associated. |
223 | 219 | ||
224 | The caller must not retain the pointer, | 220 | The caller must not retain the pointer, |
225 | but of course you can dereference it to take a copy if needed. | 221 | but of course you can dereference it to take a copy if needed. |
226 | 222 | ||
227 | \sa Service::binding() | 223 | \sa Service::binding() |
228 | */ | 224 | */ |
229 | const AppLnk* MimeType::application() const | 225 | const AppLnk* MimeType::application() const |
230 | { | 226 | { |
231 | MimeTypeData* d = data(i); | 227 | MimeTypeData* d = data(i); |
232 | return d ? d->apps.first() : 0; | 228 | return d ? d->apps.first() : 0; |
233 | } | 229 | } |
234 | 230 | ||
235 | static QString serviceBinding(const QString& service) | 231 | static QString serviceBinding(const QString& service) |
236 | { | 232 | { |
237 | // Copied from qtopiaservices | 233 | // Copied from qtopiaservices |
238 | QString svrc = service; | 234 | QString svrc = service; |
239 | for (int i=0; i<(int)svrc.length(); i++) | 235 | for (int i=0; i<(int)svrc.length(); i++) |
240 | if ( svrc[i]=='/' ) svrc[i] = '-'; | 236 | if ( svrc[i]=='/' ) svrc[i] = '-'; |
241 | return "Service-"+svrc; | 237 | return "Service-"+svrc; |
242 | } | 238 | } |
243 | 239 | ||
244 | /*! | 240 | /*! |
245 | \internal | 241 | \internal |
246 | */ | 242 | */ |
247 | void MimeType::registerApp( const AppLnk& lnk ) | 243 | void MimeType::registerApp( const AppLnk& lnk ) |
248 | { | 244 | { |
249 | QStringList list = lnk.mimeTypes(); | 245 | QStringList list = lnk.mimeTypes(); |
250 | for (QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) { | 246 | for (QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) { |
251 | MimeTypeData* cur = data()[*it]; | 247 | MimeTypeData* cur = data()[*it]; |
252 | AppLnk* l = new AppLnk(lnk); | 248 | AppLnk* l = new AppLnk(lnk); |
253 | if ( !cur ) { | 249 | if ( !cur ) { |
254 | cur = new MimeTypeData( *it ); | 250 | cur = new MimeTypeData( *it ); |
255 | data().insert( *it, cur ); | 251 | data().insert( *it, cur ); |
256 | cur->apps.append(l); | 252 | cur->apps.append(l); |
257 | } else if ( cur->apps.count() ) { | 253 | } else if ( cur->apps.count() ) { |
258 | Config binding(serviceBinding("Open/"+*it)); | 254 | Config binding(serviceBinding("Open/"+*it)); |
259 | binding.setGroup("Service"); | 255 | binding.setGroup("Service"); |
260 | QString def = binding.readEntry("default"); | 256 | QString def = binding.readEntry("default"); |
261 | if ( l->exec() == def ) | 257 | if ( l->exec() == def ) |
262 | cur->apps.prepend(l); | 258 | cur->apps.prepend(l); |
263 | else | 259 | else |
264 | cur->apps.append(l); | 260 | cur->apps.append(l); |
265 | } else { | 261 | } else { |
266 | cur->apps.append(l); | 262 | cur->apps.append(l); |
267 | } | 263 | } |
268 | } | 264 | } |
269 | } | 265 | } |
270 | 266 | ||
271 | /*! | 267 | /*! |
272 | \internal | 268 | \internal |
273 | */ | 269 | */ |
274 | void MimeType::clear() | 270 | void MimeType::clear() |
275 | { | 271 | { |
276 | delete d; | 272 | delete d; |
277 | d = 0; | 273 | d = 0; |
278 | } | 274 | } |
279 | 275 | ||
280 | void MimeType::loadExtensions() | 276 | void MimeType::loadExtensions() |
281 | { | 277 | { |
282 | if ( !typeFor ) { | 278 | if ( !typeFor ) { |
283 | extFor = new QMap<QString,QStringList>; | 279 | extFor = new QMap<QString,QStringList>; |
284 | typeFor = new QMap<QString,QString>; | 280 | typeFor = new QMap<QString,QString>; |
285 | loadExtensions("/etc/mime.types"); | 281 | loadExtensions("/etc/mime.types"); |
286 | loadExtensions(QPEApplication::qpeDir()+"etc/mime.types"); | 282 | loadExtensions(QPEApplication::qpeDir()+"etc/mime.types"); |
287 | } | 283 | } |
288 | } | 284 | } |
289 | 285 | ||
290 | void MimeType::loadExtensions(const QString& filename) | 286 | void MimeType::loadExtensions(const QString& filename) |
291 | { | 287 | { |
292 | QFile file(filename); | 288 | QFile file(filename); |
293 | if ( file.open(IO_ReadOnly) ) { | 289 | if ( file.open(IO_ReadOnly) ) { |
294 | QTextStream in(&file); | 290 | QTextStream in(&file); |
295 | QRegExp space("[ \t]+"); | 291 | QRegExp space("[ \t]+"); |
296 | while (!in.atEnd()) { | 292 | while (!in.atEnd()) { |
297 | QStringList tokens = QStringList::split(space, in.readLine()); | 293 | QStringList tokens = QStringList::split(space, in.readLine()); |
298 | QStringList::ConstIterator it = tokens.begin(); | 294 | QStringList::ConstIterator it = tokens.begin(); |
299 | if ( it != tokens.end() ) { | 295 | if ( it != tokens.end() ) { |
300 | QString id = *it; ++it; | 296 | QString id = *it; ++it; |
301 | // new override old (though left overrides right) | 297 | // new override old (though left overrides right) |
302 | QStringList exts = (*extFor)[id]; | 298 | QStringList exts = (*extFor)[id]; |
303 | QStringList newexts; | 299 | QStringList newexts; |
304 | while ( it != tokens.end() ) { | 300 | while ( it != tokens.end() ) { |
305 | exts.remove(*it); | 301 | exts.remove(*it); |
306 | if ( !newexts.contains(*it) ) | 302 | if ( !newexts.contains(*it) ) |
307 | newexts.append(*it); | 303 | newexts.append(*it); |
308 | (*typeFor)[*it] = id; | 304 | (*typeFor)[*it] = id; |
309 | ++it; | 305 | ++it; |
310 | } | 306 | } |
311 | (*extFor)[id] = newexts + exts; | 307 | (*extFor)[id] = newexts + exts; |
312 | } | 308 | } |
313 | } | 309 | } |
314 | } | 310 | } |
315 | } | 311 | } |
316 | 312 | ||
317 | void MimeType::init( const QString& ext_or_id ) | 313 | void MimeType::init( const QString& ext_or_id ) |
318 | { | 314 | { |
319 | if ( ext_or_id[0] != '/' && ext_or_id.contains('/') ) { | 315 | if ( ext_or_id[0] != '/' && ext_or_id.contains('/') ) { |
320 | i = ext_or_id.lower(); | 316 | i = ext_or_id.lower(); |
321 | } else { | 317 | } else { |
322 | loadExtensions(); | 318 | loadExtensions(); |
323 | int dot = ext_or_id.findRev('.'); | 319 | int dot = ext_or_id.findRev('.'); |
324 | QString ext = dot >= 0 ? ext_or_id.mid(dot+1) : ext_or_id; | 320 | QString ext = dot >= 0 ? ext_or_id.mid(dot+1) : ext_or_id; |
325 | i = (*typeFor)[ext.lower()]; | 321 | i = (*typeFor)[ext.lower()]; |
326 | if ( i.isNull() ) | 322 | if ( i.isNull() ) |
327 | i = "application/octet-stream"; | 323 | i = "application/octet-stream"; |
328 | } | 324 | } |
329 | static bool appsUpdated = FALSE; | 325 | static bool appsUpdated = FALSE; |
330 | if ( !appsUpdated ) { | 326 | if ( !appsUpdated ) { |
331 | appsUpdated = TRUE; | 327 | appsUpdated = TRUE; |
332 | updateApplications(); | 328 | updateApplications(); |
333 | } | 329 | } |
334 | } | 330 | } |
335 | 331 | ||
336 | MimeTypeData* MimeType::data(const QString& id) | 332 | MimeTypeData* MimeType::data(const QString& id) |
337 | { | 333 | { |
338 | MimeTypeData* d = data()[id]; | 334 | MimeTypeData* d = data()[id]; |
339 | if ( !d ) { | 335 | if ( !d ) { |
340 | int s = id.find('/'); | 336 | int s = id.find('/'); |
341 | QString idw = id.left(s)+"/*"; | 337 | QString idw = id.left(s)+"/*"; |
342 | d = data()[idw]; | 338 | d = data()[idw]; |
343 | } | 339 | } |
344 | return d; | 340 | return d; |
345 | } | 341 | } |
346 | 342 | ||
347 | /*! | 343 | /*! |
348 | Returns a Qtopia folder containing application definitions. | 344 | Returns a Qtopia folder containing application definitions. |
349 | */ | 345 | */ |
350 | QString MimeType::appsFolderName() | 346 | QString MimeType::appsFolderName() |
351 | { | 347 | { |
352 | return QPEApplication::qpeDir() + "apps"; | 348 | return QPEApplication::qpeDir() + "apps"; |
353 | } | 349 | } |
354 | 350 | ||
355 | /*! | 351 | /*! |
356 | Reloads application definitions. | 352 | Reloads application definitions. |
357 | */ | 353 | */ |
358 | void MimeType::updateApplications() | 354 | void MimeType::updateApplications() |
359 | { | 355 | { |
360 | clear(); | 356 | clear(); |
361 | AppLnkSet apps( appsFolderName() ); | 357 | AppLnkSet apps( appsFolderName() ); |
362 | updateApplications(&apps); | 358 | updateApplications(&apps); |
363 | } | 359 | } |
364 | 360 | ||
365 | void MimeType::updateApplications(AppLnkSet* folder) | 361 | void MimeType::updateApplications(AppLnkSet* folder) |
366 | { | 362 | { |
367 | for ( QListIterator<AppLnk> it( folder->children() ); it.current(); ++it ) { | 363 | for ( QListIterator<AppLnk> it( folder->children() ); it.current(); ++it ) { |
368 | registerApp(*it.current()); | 364 | registerApp(*it.current()); |
369 | } | 365 | } |
370 | } | 366 | } |
diff --git a/library/qcopenvelope_qws.cpp b/library/qcopenvelope_qws.cpp index 0aac32b..8f58787 100644 --- a/library/qcopenvelope_qws.cpp +++ b/library/qcopenvelope_qws.cpp | |||
@@ -1,147 +1,145 @@ | |||
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 | 20 | ||
21 | #ifndef QT_NO_COP | 21 | #ifndef QT_NO_COP |
22 | #include "qcopenvelope_qws.h" | 22 | #include "qcopenvelope_qws.h" |
23 | #endif | 23 | #endif |
24 | #include "global.h" | ||
25 | #include <qbuffer.h> | 24 | #include <qbuffer.h> |
26 | #include <qdatastream.h> | ||
27 | #include <qfile.h> | 25 | #include <qfile.h> |
28 | #include <unistd.h> | 26 | #include <unistd.h> |
29 | #include <errno.h> | 27 | #include <errno.h> |
30 | #include <sys/file.h> | 28 | #include <sys/file.h> |
31 | #include <sys/types.h> | 29 | #include <sys/types.h> |
32 | #include <sys/stat.h> | 30 | #include <sys/stat.h> |
33 | #include <time.h> | 31 | #include <time.h> |
34 | 32 | ||
35 | #ifndef QT_NO_COP | 33 | #ifndef QT_NO_COP |
36 | 34 | ||
37 | /*! | 35 | /*! |
38 | \class QCopEnvelope qcopenvelope_qws.h | 36 | \class QCopEnvelope qcopenvelope_qws.h |
39 | \brief The QCopEnvelope class encapsulates and sends QCop messages | 37 | \brief The QCopEnvelope class encapsulates and sends QCop messages |
40 | over QCopChannels. | 38 | over QCopChannels. |
41 | 39 | ||
42 | QCop messages allow applications to communicate with each other. | 40 | QCop messages allow applications to communicate with each other. |
43 | These messages are sent using QCopEnvelope, and received by connecting | 41 | These messages are sent using QCopEnvelope, and received by connecting |
44 | to a QCopChannel. | 42 | to a QCopChannel. |
45 | 43 | ||
46 | To send a message, use the following protocol: | 44 | To send a message, use the following protocol: |
47 | 45 | ||
48 | \code | 46 | \code |
49 | QCopEnvelope e(channelname, messagename); | 47 | QCopEnvelope e(channelname, messagename); |
50 | e << parameter1 << parameter2 << ...; | 48 | e << parameter1 << parameter2 << ...; |
51 | \endcode | 49 | \endcode |
52 | 50 | ||
53 | For messages without parameters, simply use: | 51 | For messages without parameters, simply use: |
54 | 52 | ||
55 | \code | 53 | \code |
56 | QCopEnvelope e(channelname, messagename); | 54 | QCopEnvelope e(channelname, messagename); |
57 | \endcode | 55 | \endcode |
58 | 56 | ||
59 | (Do not try to simplify this further as it may confuse some | 57 | (Do not try to simplify this further as it may confuse some |
60 | compilers.) | 58 | compilers.) |
61 | 59 | ||
62 | The \c{channelname} of channels within Qtopia all start with "QPE/". | 60 | The \c{channelname} of channels within Qtopia all start with "QPE/". |
63 | The \c{messagename} is a function identifier followed by a list of types | 61 | The \c{messagename} is a function identifier followed by a list of types |
64 | in parentheses. There is no whitespace in the message name. | 62 | in parentheses. There is no whitespace in the message name. |
65 | 63 | ||
66 | To receive a message, you will generally just use your application's | 64 | To receive a message, you will generally just use your application's |
67 | predefined QPE/Application/\e{appname} channel | 65 | predefined QPE/Application/\e{appname} channel |
68 | (see QPEApplication::appMessage()), but you can make another channel | 66 | (see QPEApplication::appMessage()), but you can make another channel |
69 | and connect it to a slot like this: | 67 | and connect it to a slot like this: |
70 | 68 | ||
71 | \code | 69 | \code |
72 | myChannel = new QCopChannel( "QPE/FooBar", this ); | 70 | myChannel = new QCopChannel( "QPE/FooBar", this ); |
73 | connect( myChannel, SIGNAL(received(const QCString &, const QByteArray &)), | 71 | connect( myChannel, SIGNAL(received(const QCString &, const QByteArray &)), |
74 | this, SLOT(fooBarMessage( const QCString &, const QByteArray &)) ); | 72 | this, SLOT(fooBarMessage( const QCString &, const QByteArray &)) ); |
75 | \endcode | 73 | \endcode |
76 | 74 | ||
77 | See also, the \link qcop.html list of Qtopia messages\endlink. | 75 | See also, the \link qcop.html list of Qtopia messages\endlink. |
78 | */ | 76 | */ |
79 | 77 | ||
80 | /*! | 78 | /*! |
81 | Constructs a QCopEnvelope that will write \a message to \a channel. | 79 | Constructs a QCopEnvelope that will write \a message to \a channel. |
82 | If \a message has parameters, you must then use operator<<() to | 80 | If \a message has parameters, you must then use operator<<() to |
83 | add these parameters to the envelope. | 81 | add these parameters to the envelope. |
84 | */ | 82 | */ |
85 | QCopEnvelope::QCopEnvelope( const QCString& channel, const QCString& message ) : | 83 | QCopEnvelope::QCopEnvelope( const QCString& channel, const QCString& message ) : |
86 | QDataStream(new QBuffer), | 84 | QDataStream(new QBuffer), |
87 | ch(channel), msg(message) | 85 | ch(channel), msg(message) |
88 | { | 86 | { |
89 | device()->open(IO_WriteOnly); | 87 | device()->open(IO_WriteOnly); |
90 | } | 88 | } |
91 | 89 | ||
92 | /*! | 90 | /*! |
93 | Writes the message and then destroys the QCopEnvelope. | 91 | Writes the message and then destroys the QCopEnvelope. |
94 | */ | 92 | */ |
95 | QCopEnvelope::~QCopEnvelope() | 93 | QCopEnvelope::~QCopEnvelope() |
96 | { | 94 | { |
97 | QByteArray data = ((QBuffer*)device())->buffer(); | 95 | QByteArray data = ((QBuffer*)device())->buffer(); |
98 | const int pref=16; | 96 | const int pref=16; |
99 | if ( qstrncmp(ch.data(),"QPE/Application/",pref)==0 ) { | 97 | if ( qstrncmp(ch.data(),"QPE/Application/",pref)==0 ) { |
100 | QString qcopfn("/tmp/qcop-msg-"); | 98 | QString qcopfn("/tmp/qcop-msg-"); |
101 | qcopfn += ch.mid(pref); | 99 | qcopfn += ch.mid(pref); |
102 | QFile qcopfile(qcopfn); | 100 | QFile qcopfile(qcopfn); |
103 | 101 | ||
104 | if ( qcopfile.open(IO_WriteOnly | IO_Append) ) { | 102 | if ( qcopfile.open(IO_WriteOnly | IO_Append) ) { |
105 | #ifndef Q_OS_WIN32 | 103 | #ifndef Q_OS_WIN32 |
106 | if(flock(qcopfile.handle(), LOCK_EX)) { | 104 | if(flock(qcopfile.handle(), LOCK_EX)) { |
107 | /* some error occurred */ | 105 | /* some error occurred */ |
108 | qWarning(QString("Failed to obtain file lock on %1 (%2)") | 106 | qWarning(QString("Failed to obtain file lock on %1 (%2)") |
109 | .arg(qcopfn).arg( errno )); | 107 | .arg(qcopfn).arg( errno )); |
110 | } | 108 | } |
111 | #endif | 109 | #endif |
112 | { | 110 | { |
113 | QDataStream ds(&qcopfile); | 111 | QDataStream ds(&qcopfile); |
114 | ds << ch << msg << data; | 112 | ds << ch << msg << data; |
115 | qcopfile.flush(); | 113 | qcopfile.flush(); |
116 | #ifndef Q_OS_WIN32 | 114 | #ifndef Q_OS_WIN32 |
117 | flock(qcopfile.handle(), LOCK_UN); | 115 | flock(qcopfile.handle(), LOCK_UN); |
118 | #endif | 116 | #endif |
119 | qcopfile.close(); | 117 | qcopfile.close(); |
120 | } | 118 | } |
121 | 119 | ||
122 | QByteArray b; | 120 | QByteArray b; |
123 | QDataStream stream(b, IO_WriteOnly); | 121 | QDataStream stream(b, IO_WriteOnly); |
124 | stream << QString(ch.mid(pref)); | 122 | stream << QString(ch.mid(pref)); |
125 | QCopChannel::send("QPE/Server", "processQCop(QString)", b); | 123 | QCopChannel::send("QPE/Server", "processQCop(QString)", b); |
126 | delete device(); | 124 | delete device(); |
127 | return; | 125 | return; |
128 | } else { | 126 | } else { |
129 | qWarning(QString("Failed to open file %1") | 127 | qWarning(QString("Failed to open file %1") |
130 | .arg(qcopfn)); | 128 | .arg(qcopfn)); |
131 | } // endif open | 129 | } // endif open |
132 | } | 130 | } |
133 | else if (qstrncmp(ch.data(), "QPE/SOAP/", 9) == 0) { | 131 | else if (qstrncmp(ch.data(), "QPE/SOAP/", 9) == 0) { |
134 | // If this is a message that should go along the SOAP channel, we move the | 132 | // If this is a message that should go along the SOAP channel, we move the |
135 | // endpoint URL to the data section. | 133 | // endpoint URL to the data section. |
136 | QString endpoint = ch.mid(9); | 134 | QString endpoint = ch.mid(9); |
137 | 135 | ||
138 | ch = "QPE/SOAP"; | 136 | ch = "QPE/SOAP"; |
139 | // Since byte arrays are explicitly shared, this is appended to the data variable.. | 137 | // Since byte arrays are explicitly shared, this is appended to the data variable.. |
140 | *this << endpoint; | 138 | *this << endpoint; |
141 | } | 139 | } |
142 | 140 | ||
143 | QCopChannel::send(ch,msg,data); | 141 | QCopChannel::send(ch,msg,data); |
144 | delete device(); | 142 | delete device(); |
145 | } | 143 | } |
146 | 144 | ||
147 | #endif | 145 | #endif |
diff --git a/library/qdawg.cpp b/library/qdawg.cpp index af5dc82..2ea5734 100644 --- a/library/qdawg.cpp +++ b/library/qdawg.cpp | |||
@@ -1,407 +1,405 @@ | |||
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 | #include "qdawg.h" | 20 | #include "qdawg.h" |
21 | #include <qintdict.h> | 21 | #include <qintdict.h> |
22 | #include <qvaluelist.h> | ||
23 | #include <qtextstream.h> | ||
24 | #include <qfile.h> | 22 | #include <qfile.h> |
25 | #include <qtl.h> | 23 | #include <qtl.h> |
26 | 24 | ||
27 | #include <limits.h> | 25 | #include <limits.h> |
28 | #include <stdio.h> | 26 | #include <stdio.h> |
29 | 27 | ||
30 | // for mmap | 28 | // for mmap |
31 | #include <sys/types.h> | 29 | #include <sys/types.h> |
32 | #include <sys/stat.h> | 30 | #include <sys/stat.h> |
33 | #include <sys/mman.h> | 31 | #include <sys/mman.h> |
34 | #include <fcntl.h> | 32 | #include <fcntl.h> |
35 | #include <errno.h> | 33 | #include <errno.h> |
36 | #include <unistd.h> | 34 | #include <unistd.h> |
37 | 35 | ||
38 | class QDawgPrivate; | 36 | class QDawgPrivate; |
39 | class QTrie; | 37 | class QTrie; |
40 | 38 | ||
41 | typedef QValueList<QTrie*> TrieClub; | 39 | typedef QValueList<QTrie*> TrieClub; |
42 | typedef QIntDict<TrieClub> TrieClubDirectory; | 40 | typedef QIntDict<TrieClub> TrieClubDirectory; |
43 | 41 | ||
44 | class TriePtr { | 42 | class TriePtr { |
45 | public: | 43 | public: |
46 | QChar letter; | 44 | QChar letter; |
47 | QTrie* p; | 45 | QTrie* p; |
48 | int operator <(const TriePtr& o) const; | 46 | int operator <(const TriePtr& o) const; |
49 | int operator >(const TriePtr& o) const; | 47 | int operator >(const TriePtr& o) const; |
50 | int operator <=(const TriePtr& o) const; | 48 | int operator <=(const TriePtr& o) const; |
51 | }; | 49 | }; |
52 | 50 | ||
53 | class TrieList : public QValueList<TriePtr> { | 51 | class TrieList : public QValueList<TriePtr> { |
54 | bool sorted; | 52 | bool sorted; |
55 | public: | 53 | public: |
56 | TrieList() | 54 | TrieList() |
57 | { | 55 | { |
58 | sorted=TRUE; | 56 | sorted=TRUE; |
59 | } | 57 | } |
60 | 58 | ||
61 | QTrie* findAdd(QChar c); | 59 | QTrie* findAdd(QChar c); |
62 | bool equal(TrieList& l); | 60 | bool equal(TrieList& l); |
63 | 61 | ||
64 | void sort() | 62 | void sort() |
65 | { | 63 | { |
66 | if ( !sorted ) { | 64 | if ( !sorted ) { |
67 | qHeapSort(*this); | 65 | qHeapSort(*this); |
68 | sorted = TRUE; | 66 | sorted = TRUE; |
69 | } | 67 | } |
70 | } | 68 | } |
71 | }; | 69 | }; |
72 | 70 | ||
73 | // A fast but memory-wasting temporary class. The Dawg is the goal. | 71 | // A fast but memory-wasting temporary class. The Dawg is the goal. |
74 | class QTrie { | 72 | class QTrie { |
75 | public: | 73 | public: |
76 | QTrie(); | 74 | QTrie(); |
77 | ~QTrie(); | 75 | ~QTrie(); |
78 | 76 | ||
79 | void insertWord(const QString& s, uint index=0); | 77 | void insertWord(const QString& s, uint index=0); |
80 | bool equal(QTrie* o); | 78 | bool equal(QTrie* o); |
81 | void dump(int indent=0); | 79 | void dump(int indent=0); |
82 | 80 | ||
83 | private: | 81 | private: |
84 | TrieList children; | 82 | TrieList children; |
85 | bool isword; | 83 | bool isword; |
86 | 84 | ||
87 | friend class QDawgPrivate; | 85 | friend class QDawgPrivate; |
88 | int maxdepth; | 86 | int maxdepth; |
89 | int decendants; | 87 | int decendants; |
90 | int key; | 88 | int key; |
91 | void distributeKeys(TrieClubDirectory& directory); | 89 | void distributeKeys(TrieClubDirectory& directory); |
92 | QTrie* clubLeader(TrieClubDirectory& directory); | 90 | QTrie* clubLeader(TrieClubDirectory& directory); |
93 | int collectKeys(); | 91 | int collectKeys(); |
94 | friend class TriePtr; | 92 | friend class TriePtr; |
95 | friend class TrieList; | 93 | friend class TrieList; |
96 | }; | 94 | }; |
97 | 95 | ||
98 | QTrie::QTrie() | 96 | QTrie::QTrie() |
99 | { | 97 | { |
100 | key = 0; | 98 | key = 0; |
101 | isword = FALSE; | 99 | isword = FALSE; |
102 | } | 100 | } |
103 | 101 | ||
104 | QTrie::~QTrie() | 102 | QTrie::~QTrie() |
105 | { | 103 | { |
106 | // NOTE: we do not delete the children - after conversion to DAWG | 104 | // NOTE: we do not delete the children - after conversion to DAWG |
107 | // it's too difficult. The QTrie's are deleted via the directory. | 105 | // it's too difficult. The QTrie's are deleted via the directory. |
108 | } | 106 | } |
109 | 107 | ||
110 | void QTrie::insertWord(const QString& s, uint index) | 108 | void QTrie::insertWord(const QString& s, uint index) |
111 | { | 109 | { |
112 | if ( index == s.length() ) { | 110 | if ( index == s.length() ) { |
113 | isword = TRUE; | 111 | isword = TRUE; |
114 | } else { | 112 | } else { |
115 | QTrie* t = children.findAdd(s[index]); | 113 | QTrie* t = children.findAdd(s[index]); |
116 | t->insertWord(s,index+1); | 114 | t->insertWord(s,index+1); |
117 | } | 115 | } |
118 | } | 116 | } |
119 | 117 | ||
120 | bool QTrie::equal(QTrie* o) | 118 | bool QTrie::equal(QTrie* o) |
121 | { | 119 | { |
122 | if ( o == this ) return TRUE; | 120 | if ( o == this ) return TRUE; |
123 | if ( isword != o->isword ) | 121 | if ( isword != o->isword ) |
124 | return FALSE; | 122 | return FALSE; |
125 | return children.equal(o->children); | 123 | return children.equal(o->children); |
126 | } | 124 | } |
127 | 125 | ||
128 | void QTrie::dump(int indent) | 126 | void QTrie::dump(int indent) |
129 | { | 127 | { |
130 | for (TrieList::Iterator it=children.begin(); it!=children.end(); ++it) { | 128 | for (TrieList::Iterator it=children.begin(); it!=children.end(); ++it) { |
131 | QTrie* s = (*it).p; | 129 | QTrie* s = (*it).p; |
132 | for (int in=0; in<indent; in++) | 130 | for (int in=0; in<indent; in++) |
133 | fputc(' ',stderr); | 131 | fputc(' ',stderr); |
134 | fprintf(stderr," %c %d %s %p\n",(*it).letter.unicode(), | 132 | fprintf(stderr," %c %d %s %p\n",(*it).letter.unicode(), |
135 | s->key,s->isword?"word":"",s); | 133 | s->key,s->isword?"word":"",s); |
136 | s->dump(indent+2); | 134 | s->dump(indent+2); |
137 | } | 135 | } |
138 | } | 136 | } |
139 | 137 | ||
140 | void QTrie::distributeKeys(TrieClubDirectory& directory) | 138 | void QTrie::distributeKeys(TrieClubDirectory& directory) |
141 | { | 139 | { |
142 | maxdepth = INT_MIN; | 140 | maxdepth = INT_MIN; |
143 | decendants = children.count(); | 141 | decendants = children.count(); |
144 | key = 0; | 142 | key = 0; |
145 | for (TrieList::Iterator it=children.begin(); it!=children.end(); ++it) { | 143 | for (TrieList::Iterator it=children.begin(); it!=children.end(); ++it) { |
146 | QTrie* s = (*it).p; | 144 | QTrie* s = (*it).p; |
147 | QChar l = (*it).letter; | 145 | QChar l = (*it).letter; |
148 | s->distributeKeys(directory); | 146 | s->distributeKeys(directory); |
149 | key = key*64+l.unicode()+s->key*5; | 147 | key = key*64+l.unicode()+s->key*5; |
150 | decendants += s->decendants; | 148 | decendants += s->decendants; |
151 | if ( s->maxdepth+1 > maxdepth ) | 149 | if ( s->maxdepth+1 > maxdepth ) |
152 | maxdepth = s->maxdepth+1; | 150 | maxdepth = s->maxdepth+1; |
153 | } | 151 | } |
154 | if ( decendants ) { | 152 | if ( decendants ) { |
155 | key += decendants + maxdepth*256 + children.count() * 65536; | 153 | key += decendants + maxdepth*256 + children.count() * 65536; |
156 | if ( !key ) key++; // unlikely | 154 | if ( !key ) key++; // unlikely |
157 | } | 155 | } |
158 | TrieClub* c = directory[key]; | 156 | TrieClub* c = directory[key]; |
159 | if ( !c ) directory.insert(key, (c = new TrieClub) ); | 157 | if ( !c ) directory.insert(key, (c = new TrieClub) ); |
160 | c->prepend(this); | 158 | c->prepend(this); |
161 | } | 159 | } |
162 | 160 | ||
163 | QTrie* QTrie::clubLeader(TrieClubDirectory& directory) | 161 | QTrie* QTrie::clubLeader(TrieClubDirectory& directory) |
164 | { | 162 | { |
165 | if ( !key ) return directory[0]->first(); | 163 | if ( !key ) return directory[0]->first(); |
166 | for (TrieList::Iterator it=children.begin(); it!=children.end(); ++it) { | 164 | for (TrieList::Iterator it=children.begin(); it!=children.end(); ++it) { |
167 | QTrie* t= (*it).p->clubLeader(directory); | 165 | QTrie* t= (*it).p->clubLeader(directory); |
168 | (*it).p = t; | 166 | (*it).p = t; |
169 | } | 167 | } |
170 | TrieClub *club = directory[key]; | 168 | TrieClub *club = directory[key]; |
171 | for (TrieClub::Iterator it = club->begin(); it != club->end(); ++it) { | 169 | for (TrieClub::Iterator it = club->begin(); it != club->end(); ++it) { |
172 | QTrie* o = *it; | 170 | QTrie* o = *it; |
173 | if ( o->equal(this) ) | 171 | if ( o->equal(this) ) |
174 | return o; | 172 | return o; |
175 | } | 173 | } |
176 | return this; | 174 | return this; |
177 | } | 175 | } |
178 | 176 | ||
179 | int QTrie::collectKeys() | 177 | int QTrie::collectKeys() |
180 | { | 178 | { |
181 | int n=0; | 179 | int n=0; |
182 | if ( key ) key=0,n+=children.count(); | 180 | if ( key ) key=0,n+=children.count(); |
183 | for (TrieList::Iterator it=children.begin(); it!=children.end(); ++it) | 181 | for (TrieList::Iterator it=children.begin(); it!=children.end(); ++it) |
184 | n += (*it).p->collectKeys(); | 182 | n += (*it).p->collectKeys(); |
185 | return n; | 183 | return n; |
186 | } | 184 | } |
187 | 185 | ||
188 | int TriePtr::operator <(const TriePtr& o) const | 186 | int TriePtr::operator <(const TriePtr& o) const |
189 | { return letter < o.letter; } | 187 | { return letter < o.letter; } |
190 | int TriePtr::operator >(const TriePtr& o) const | 188 | int TriePtr::operator >(const TriePtr& o) const |
191 | { return letter > o.letter; } | 189 | { return letter > o.letter; } |
192 | int TriePtr::operator <=(const TriePtr& o) const | 190 | int TriePtr::operator <=(const TriePtr& o) const |
193 | { return letter <= o.letter; } | 191 | { return letter <= o.letter; } |
194 | 192 | ||
195 | bool TrieList::equal(TrieList& l) | 193 | bool TrieList::equal(TrieList& l) |
196 | { | 194 | { |
197 | if ( count() != l.count() ) | 195 | if ( count() != l.count() ) |
198 | return FALSE; | 196 | return FALSE; |
199 | sort(); l.sort(); | 197 | sort(); l.sort(); |
200 | ConstIterator it2 = begin(); | 198 | ConstIterator it2 = begin(); |
201 | ConstIterator it = l.begin(); | 199 | ConstIterator it = l.begin(); |
202 | for( ; it != l.end(); ++it, ++it2 ) | 200 | for( ; it != l.end(); ++it, ++it2 ) |
203 | if ( (*it).letter != (*it2).letter || ! (*it).p->equal((*it2).p) ) | 201 | if ( (*it).letter != (*it2).letter || ! (*it).p->equal((*it2).p) ) |
204 | return FALSE; | 202 | return FALSE; |
205 | return TRUE; | 203 | return TRUE; |
206 | } | 204 | } |
207 | QTrie* TrieList::findAdd(QChar c) | 205 | QTrie* TrieList::findAdd(QChar c) |
208 | { | 206 | { |
209 | for (Iterator it=begin(); it!=end(); ++it) { | 207 | for (Iterator it=begin(); it!=end(); ++it) { |
210 | if ( (*it).letter == c ) | 208 | if ( (*it).letter == c ) |
211 | return (*it).p; | 209 | return (*it).p; |
212 | } | 210 | } |
213 | TriePtr p; | 211 | TriePtr p; |
214 | p.p = new QTrie; | 212 | p.p = new QTrie; |
215 | p.letter = c; | 213 | p.letter = c; |
216 | prepend(p); | 214 | prepend(p); |
217 | sorted=FALSE; | 215 | sorted=FALSE; |
218 | sort(); | 216 | sort(); |
219 | return p.p; | 217 | return p.p; |
220 | } | 218 | } |
221 | 219 | ||
222 | static const char* dawg_sig = "QDAWG100"; | 220 | static const char* dawg_sig = "QDAWG100"; |
223 | 221 | ||
224 | class QDawgPrivate { | 222 | class QDawgPrivate { |
225 | public: | 223 | public: |
226 | QDawgPrivate(QIODevice* dev) | 224 | QDawgPrivate(QIODevice* dev) |
227 | { | 225 | { |
228 | QDataStream ds(dev); | 226 | QDataStream ds(dev); |
229 | char sig[8]; | 227 | char sig[8]; |
230 | ds.readRawBytes(sig,8); | 228 | ds.readRawBytes(sig,8); |
231 | if ( !strncmp(dawg_sig,sig,8) ) { | 229 | if ( !strncmp(dawg_sig,sig,8) ) { |
232 | uint n; | 230 | uint n; |
233 | char* nn; | 231 | char* nn; |
234 | ds.readBytes(nn,n); | 232 | ds.readBytes(nn,n); |
235 | 233 | ||
236 | // #### endianness problem ignored. | 234 | // #### endianness problem ignored. |
237 | node = (QDawg::Node*)nn; | 235 | node = (QDawg::Node*)nn; |
238 | nodes = n / sizeof(QDawg::Node); | 236 | nodes = n / sizeof(QDawg::Node); |
239 | } else { | 237 | } else { |
240 | node = 0; | 238 | node = 0; |
241 | } | 239 | } |
242 | } | 240 | } |
243 | 241 | ||
244 | bool ok() const { return node; } | 242 | bool ok() const { return node; } |
245 | 243 | ||
246 | QDawgPrivate(uchar* mem) | 244 | QDawgPrivate(uchar* mem) |
247 | { | 245 | { |
248 | if ( !strncmp(dawg_sig,(char*)mem,8) ) { | 246 | if ( !strncmp(dawg_sig,(char*)mem,8) ) { |
249 | mem += 8; | 247 | mem += 8; |
250 | 248 | ||
251 | int n = ((mem[0]*256+mem[1])*256+mem[2])*256+mem[3]; | 249 | int n = ((mem[0]*256+mem[1])*256+mem[2])*256+mem[3]; |
252 | mem += 4; | 250 | mem += 4; |
253 | 251 | ||
254 | // #### endianness problem ignored. | 252 | // #### endianness problem ignored. |
255 | node = (QDawg::Node*)((char*)mem); | 253 | node = (QDawg::Node*)((char*)mem); |
256 | nodes = n / sizeof(QDawg::Node); | 254 | nodes = n / sizeof(QDawg::Node); |
257 | } | 255 | } |
258 | } | 256 | } |
259 | 257 | ||
260 | QDawgPrivate(QTrie* t) // destroys the QTrie. | 258 | QDawgPrivate(QTrie* t) // destroys the QTrie. |
261 | { | 259 | { |
262 | TrieClubDirectory directory(9973); | 260 | TrieClubDirectory directory(9973); |
263 | t->distributeKeys(directory); | 261 | t->distributeKeys(directory); |
264 | QTrie* l = t->clubLeader(directory); | 262 | QTrie* l = t->clubLeader(directory); |
265 | ASSERT(l==t); | 263 | ASSERT(l==t); |
266 | generateArray(t); | 264 | generateArray(t); |
267 | 265 | ||
268 | TrieClub *club; | 266 | TrieClub *club; |
269 | for (QIntDictIterator<TrieClub> dit(directory); (club=dit); ++dit) | 267 | for (QIntDictIterator<TrieClub> dit(directory); (club=dit); ++dit) |
270 | { | 268 | { |
271 | for (TrieClub::Iterator it = club->begin(); it != club->end(); ++it) { | 269 | for (TrieClub::Iterator it = club->begin(); it != club->end(); ++it) { |
272 | delete *it; | 270 | delete *it; |
273 | } | 271 | } |
274 | delete club; | 272 | delete club; |
275 | } | 273 | } |
276 | } | 274 | } |
277 | 275 | ||
278 | bool write(QIODevice* dev) | 276 | bool write(QIODevice* dev) |
279 | { | 277 | { |
280 | QDataStream ds(dev); | 278 | QDataStream ds(dev); |
281 | ds.writeRawBytes(dawg_sig,8); | 279 | ds.writeRawBytes(dawg_sig,8); |
282 | // #### endianness problem ignored. | 280 | // #### endianness problem ignored. |
283 | ds.writeBytes((char*)node,sizeof(QDawg::Node)*nodes); | 281 | ds.writeBytes((char*)node,sizeof(QDawg::Node)*nodes); |
284 | return dev->state() == IO_Ok; | 282 | return dev->state() == IO_Ok; |
285 | } | 283 | } |
286 | 284 | ||
287 | void dumpWords(int nid=0, int index=0) | 285 | void dumpWords(int nid=0, int index=0) |
288 | { | 286 | { |
289 | static char word[256]; // ick latin1 | 287 | static char word[256]; // ick latin1 |
290 | int i=0; | 288 | int i=0; |
291 | do { | 289 | do { |
292 | QDawg::Node& n = node[nid+i]; | 290 | QDawg::Node& n = node[nid+i]; |
293 | word[index] = n.let; | 291 | word[index] = n.let; |
294 | if ( n.isword ) | 292 | if ( n.isword ) |
295 | fprintf(stderr,"%.*s\n",index+1,word); | 293 | fprintf(stderr,"%.*s\n",index+1,word); |
296 | if ( n.offset ) dumpWords(n.offset+nid+i,index+1); | 294 | if ( n.offset ) dumpWords(n.offset+nid+i,index+1); |
297 | } while (!node[nid+i++].islast); | 295 | } while (!node[nid+i++].islast); |
298 | } | 296 | } |
299 | 297 | ||
300 | void dump(int nid=0, int indent=0) | 298 | void dump(int nid=0, int indent=0) |
301 | { | 299 | { |
302 | int i=0; | 300 | int i=0; |
303 | do { | 301 | do { |
304 | QDawg::Node& n = node[nid+i]; | 302 | QDawg::Node& n = node[nid+i]; |
305 | fprintf(stderr,"%d: ",nid+i); | 303 | fprintf(stderr,"%d: ",nid+i); |
306 | for (int in=0; in<indent; in++) | 304 | for (int in=0; in<indent; in++) |
307 | fputc(' ',stderr); | 305 | fputc(' ',stderr); |
308 | fprintf(stderr," %c %d %d %d\n",n.let, | 306 | fprintf(stderr," %c %d %d %d\n",n.let, |
309 | n.isword,n.islast,n.offset); | 307 | n.isword,n.islast,n.offset); |
310 | if ( n.offset ) dump(n.offset+nid+i,indent+2); | 308 | if ( n.offset ) dump(n.offset+nid+i,indent+2); |
311 | } while (!node[nid+i++].islast); | 309 | } while (!node[nid+i++].islast); |
312 | } | 310 | } |
313 | 311 | ||
314 | int countWords(int nid=0) | 312 | int countWords(int nid=0) |
315 | { | 313 | { |
316 | int t=0; | 314 | int t=0; |
317 | int i=0; | 315 | int i=0; |
318 | do { | 316 | do { |
319 | QDawg::Node& n = node[nid+i]; | 317 | QDawg::Node& n = node[nid+i]; |
320 | if ( n.isword ) | 318 | if ( n.isword ) |
321 | t++; | 319 | t++; |
322 | if ( n.offset ) | 320 | if ( n.offset ) |
323 | t+=countWords(n.offset+nid+i); | 321 | t+=countWords(n.offset+nid+i); |
324 | } while (!node[nid+i++].islast); | 322 | } while (!node[nid+i++].islast); |
325 | return t; | 323 | return t; |
326 | } | 324 | } |
327 | 325 | ||
328 | bool contains(const QString& s, int nid=0, int index=0) const | 326 | bool contains(const QString& s, int nid=0, int index=0) const |
329 | { | 327 | { |
330 | int i=0; | 328 | int i=0; |
331 | do { | 329 | do { |
332 | QDawg::Node& n = node[nid+i]; | 330 | QDawg::Node& n = node[nid+i]; |
333 | if ( s[index] == QChar((ushort)n.let) ) { | 331 | if ( s[index] == QChar((ushort)n.let) ) { |
334 | if ( n.isword && index == (int)s.length()-1 ) | 332 | if ( n.isword && index == (int)s.length()-1 ) |
335 | return TRUE; | 333 | return TRUE; |
336 | if ( n.offset ) | 334 | if ( n.offset ) |
337 | return contains(s,n.offset+nid+i,index+1); | 335 | return contains(s,n.offset+nid+i,index+1); |
338 | } | 336 | } |
339 | } while (!node[nid+i++].islast); | 337 | } while (!node[nid+i++].islast); |
340 | return FALSE; | 338 | return FALSE; |
341 | } | 339 | } |
342 | 340 | ||
343 | void appendAllWords(QStringList& list, int nid=0, QString s="") const | 341 | void appendAllWords(QStringList& list, int nid=0, QString s="") const |
344 | { | 342 | { |
345 | int i=0; | 343 | int i=0; |
346 | int next = s.length(); | 344 | int next = s.length(); |
347 | do { | 345 | do { |
348 | QDawg::Node& n = node[nid+i]; | 346 | QDawg::Node& n = node[nid+i]; |
349 | s[next] = QChar((ushort)n.let); | 347 | s[next] = QChar((ushort)n.let); |
350 | if ( n.isword ) | 348 | if ( n.isword ) |
351 | list.append(s); | 349 | list.append(s); |
352 | if ( n.offset ) | 350 | if ( n.offset ) |
353 | appendAllWords(list, n.offset+nid+i, s); | 351 | appendAllWords(list, n.offset+nid+i, s); |
354 | } while (!node[nid+i++].islast); | 352 | } while (!node[nid+i++].islast); |
355 | } | 353 | } |
356 | 354 | ||
357 | const QDawg::Node* root() { return node; } | 355 | const QDawg::Node* root() { return node; } |
358 | 356 | ||
359 | private: | 357 | private: |
360 | void generateArray(QTrie* t) | 358 | void generateArray(QTrie* t) |
361 | { | 359 | { |
362 | nodes = 0; | 360 | nodes = 0; |
363 | int n = t->collectKeys(); | 361 | int n = t->collectKeys(); |
364 | node = new QDawg::Node[n]; | 362 | node = new QDawg::Node[n]; |
365 | appendToArray(t); | 363 | appendToArray(t); |
366 | ASSERT(n == nodes); | 364 | ASSERT(n == nodes); |
367 | } | 365 | } |
368 | 366 | ||
369 | int appendToArray(QTrie* t) | 367 | int appendToArray(QTrie* t) |
370 | { | 368 | { |
371 | if ( !t->key ) { | 369 | if ( !t->key ) { |
372 | if ( !t->children.count() ) | 370 | if ( !t->children.count() ) |
373 | return 0; | 371 | return 0; |
374 | t->key = nodes; | 372 | t->key = nodes; |
375 | nodes += t->children.count(); | 373 | nodes += t->children.count(); |
376 | QDawg::Node* n = &node[t->key-1]; | 374 | QDawg::Node* n = &node[t->key-1]; |
377 | int here = t->key; | 375 | int here = t->key; |
378 | for (TrieList::Iterator it=t->children.begin(); it!=t->children.end(); ++it) { | 376 | for (TrieList::Iterator it=t->children.begin(); it!=t->children.end(); ++it) { |
379 | QTrie* s = (*it).p; | 377 | QTrie* s = (*it).p; |
380 | ++n; | 378 | ++n; |
381 | n->let = (*it).letter.unicode(); | 379 | n->let = (*it).letter.unicode(); |
382 | n->isword = s->isword; | 380 | n->isword = s->isword; |
383 | n->islast = 0; | 381 | n->islast = 0; |
384 | n->offset = appendToArray(s); | 382 | n->offset = appendToArray(s); |
385 | if ( n->offset ) { | 383 | if ( n->offset ) { |
386 | int t = n->offset-here; | 384 | int t = n->offset-here; |
387 | n->offset=t; | 385 | n->offset=t; |
388 | if ( n->offset != t ) | 386 | if ( n->offset != t ) |
389 | qWarning("Overflow: too many words"); | 387 | qWarning("Overflow: too many words"); |
390 | } | 388 | } |
391 | here++; | 389 | here++; |
392 | } | 390 | } |
393 | n->islast = 1; | 391 | n->islast = 1; |
394 | } | 392 | } |
395 | return t->key; | 393 | return t->key; |
396 | } | 394 | } |
397 | 395 | ||
398 | private: | 396 | private: |
399 | int nodes; | 397 | int nodes; |
400 | QDawg::Node *node; | 398 | QDawg::Node *node; |
401 | }; | 399 | }; |
402 | 400 | ||
403 | /*! | 401 | /*! |
404 | \class QDawg qdawg.h | 402 | \class QDawg qdawg.h |
405 | \brief The QDawg class provides an implementation of a Directed Acyclic Word Graph. | 403 | \brief The QDawg class provides an implementation of a Directed Acyclic Word Graph. |
406 | 404 | ||
407 | A DAWG provides very fast look-up of words in a word list. | 405 | A DAWG provides very fast look-up of words in a word list. |
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp index c7ef2b7..262221e 100644 --- a/library/qpeapplication.cpp +++ b/library/qpeapplication.cpp | |||
@@ -721,769 +721,768 @@ QPEApplication::QPEApplication( int & argc, char **argv, Type t ) | |||
721 | setVolume(); | 721 | setVolume(); |
722 | } | 722 | } |
723 | 723 | ||
724 | installEventFilter( this ); | 724 | installEventFilter( this ); |
725 | 725 | ||
726 | QPEMenuToolFocusManager::initialize(); | 726 | QPEMenuToolFocusManager::initialize(); |
727 | 727 | ||
728 | #ifdef QT_NO_QWS_CURSOR | 728 | #ifdef QT_NO_QWS_CURSOR |
729 | // if we have no cursor, probably don't want tooltips | 729 | // if we have no cursor, probably don't want tooltips |
730 | QToolTip::setEnabled( FALSE ); | 730 | QToolTip::setEnabled( FALSE ); |
731 | #endif | 731 | #endif |
732 | } | 732 | } |
733 | 733 | ||
734 | 734 | ||
735 | #ifdef QTOPIA_INTERNAL_INITAPP | 735 | #ifdef QTOPIA_INTERNAL_INITAPP |
736 | void QPEApplication::initApp( int argc, char **argv ) | 736 | void QPEApplication::initApp( int argc, char **argv ) |
737 | { | 737 | { |
738 | delete pidChannel; | 738 | delete pidChannel; |
739 | d->keep_running = TRUE; | 739 | d->keep_running = TRUE; |
740 | d->preloaded = FALSE; | 740 | d->preloaded = FALSE; |
741 | d->forceshow = FALSE; | 741 | d->forceshow = FALSE; |
742 | 742 | ||
743 | QCString channel = QCString(argv[0]); | 743 | QCString channel = QCString(argv[0]); |
744 | 744 | ||
745 | channel.replace(QRegExp(".*/"),""); | 745 | channel.replace(QRegExp(".*/"),""); |
746 | d->appName = channel; | 746 | d->appName = channel; |
747 | 747 | ||
748 | #if QT_VERSION > 235 | 748 | #if QT_VERSION > 235 |
749 | qt_fbdpy->setIdentity( channel ); // In Qt/E 2.3.6 | 749 | qt_fbdpy->setIdentity( channel ); // In Qt/E 2.3.6 |
750 | #endif | 750 | #endif |
751 | 751 | ||
752 | channel = "QPE/Application/" + channel; | 752 | channel = "QPE/Application/" + channel; |
753 | pidChannel = new QCopChannel( channel, this); | 753 | pidChannel = new QCopChannel( channel, this); |
754 | connect( pidChannel, SIGNAL(received(const QCString &, const QByteArray &)), | 754 | connect( pidChannel, SIGNAL(received(const QCString &, const QByteArray &)), |
755 | this, SLOT(pidMessage(const QCString &, const QByteArray &))); | 755 | this, SLOT(pidMessage(const QCString &, const QByteArray &))); |
756 | 756 | ||
757 | 757 | ||
758 | 758 | ||
759 | processQCopFile(); | 759 | processQCopFile(); |
760 | d->keep_running = d->qcopq.isEmpty(); | 760 | d->keep_running = d->qcopq.isEmpty(); |
761 | 761 | ||
762 | for (int a=0; a<argc; a++) { | 762 | for (int a=0; a<argc; a++) { |
763 | if ( qstrcmp(argv[a],"-preload")==0 ) { | 763 | if ( qstrcmp(argv[a],"-preload")==0 ) { |
764 | argv[a] = argv[a+1]; | 764 | argv[a] = argv[a+1]; |
765 | a++; | 765 | a++; |
766 | d->preloaded = TRUE; | 766 | d->preloaded = TRUE; |
767 | argc-=1; | 767 | argc-=1; |
768 | } else if ( qstrcmp(argv[a],"-preload-show")==0 ) { | 768 | } else if ( qstrcmp(argv[a],"-preload-show")==0 ) { |
769 | argv[a] = argv[a+1]; | 769 | argv[a] = argv[a+1]; |
770 | a++; | 770 | a++; |
771 | d->preloaded = TRUE; | 771 | d->preloaded = TRUE; |
772 | d->forceshow = TRUE; | 772 | d->forceshow = TRUE; |
773 | argc-=1; | 773 | argc-=1; |
774 | } | 774 | } |
775 | } | 775 | } |
776 | 776 | ||
777 | /* overide stored arguments */ | 777 | /* overide stored arguments */ |
778 | setArgs(argc, argv); | 778 | setArgs(argc, argv); |
779 | 779 | ||
780 | /* install translation here */ | 780 | /* install translation here */ |
781 | for ( QStringList::ConstIterator it = d->langs.begin(); it != d->langs.end(); ++it ) | 781 | for ( QStringList::ConstIterator it = d->langs.begin(); it != d->langs.end(); ++it ) |
782 | installTranslation( (*it) + "/" + d->appName + ".qm" ); | 782 | installTranslation( (*it) + "/" + d->appName + ".qm" ); |
783 | } | 783 | } |
784 | #endif | 784 | #endif |
785 | 785 | ||
786 | 786 | ||
787 | static QPtrDict<void>* inputMethodDict = 0; | 787 | static QPtrDict<void>* inputMethodDict = 0; |
788 | static void createInputMethodDict() | 788 | static void createInputMethodDict() |
789 | { | 789 | { |
790 | if ( !inputMethodDict ) | 790 | if ( !inputMethodDict ) |
791 | inputMethodDict = new QPtrDict<void>; | 791 | inputMethodDict = new QPtrDict<void>; |
792 | } | 792 | } |
793 | 793 | ||
794 | /*! | 794 | /*! |
795 | Returns the currently set hint to the system as to whether | 795 | Returns the currently set hint to the system as to whether |
796 | widget \a w has any use for text input methods. | 796 | widget \a w has any use for text input methods. |
797 | 797 | ||
798 | 798 | ||
799 | \sa setInputMethodHint() InputMethodHint | 799 | \sa setInputMethodHint() InputMethodHint |
800 | */ | 800 | */ |
801 | QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget * w ) | 801 | QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget * w ) |
802 | { | 802 | { |
803 | if ( inputMethodDict && w ) | 803 | if ( inputMethodDict && w ) |
804 | return ( InputMethodHint ) ( int ) inputMethodDict->find( w ); | 804 | return ( InputMethodHint ) ( int ) inputMethodDict->find( w ); |
805 | return Normal; | 805 | return Normal; |
806 | } | 806 | } |
807 | 807 | ||
808 | /*! | 808 | /*! |
809 | \enum QPEApplication::InputMethodHint | 809 | \enum QPEApplication::InputMethodHint |
810 | 810 | ||
811 | \value Normal the application sometimes needs text input (the default). | 811 | \value Normal the application sometimes needs text input (the default). |
812 | \value AlwaysOff the application never needs text input. | 812 | \value AlwaysOff the application never needs text input. |
813 | \value AlwaysOn the application always needs text input. | 813 | \value AlwaysOn the application always needs text input. |
814 | */ | 814 | */ |
815 | 815 | ||
816 | /*! | 816 | /*! |
817 | Hints to the system that widget \a w has use for text input methods | 817 | Hints to the system that widget \a w has use for text input methods |
818 | as specified by \a mode. | 818 | as specified by \a mode. |
819 | 819 | ||
820 | \sa inputMethodHint() InputMethodHint | 820 | \sa inputMethodHint() InputMethodHint |
821 | */ | 821 | */ |
822 | void QPEApplication::setInputMethodHint( QWidget * w, InputMethodHint mode ) | 822 | void QPEApplication::setInputMethodHint( QWidget * w, InputMethodHint mode ) |
823 | { | 823 | { |
824 | createInputMethodDict(); | 824 | createInputMethodDict(); |
825 | if ( mode == Normal ) { | 825 | if ( mode == Normal ) { |
826 | inputMethodDict->remove | 826 | inputMethodDict->remove |
827 | ( w ); | 827 | ( w ); |
828 | } | 828 | } |
829 | else { | 829 | else { |
830 | inputMethodDict->insert( w, ( void* ) mode ); | 830 | inputMethodDict->insert( w, ( void* ) mode ); |
831 | } | 831 | } |
832 | } | 832 | } |
833 | 833 | ||
834 | class HackDialog : public QDialog | 834 | class HackDialog : public QDialog |
835 | { | 835 | { |
836 | public: | 836 | public: |
837 | void acceptIt() | 837 | void acceptIt() |
838 | { | 838 | { |
839 | accept(); | 839 | accept(); |
840 | } | 840 | } |
841 | void rejectIt() | 841 | void rejectIt() |
842 | { | 842 | { |
843 | reject(); | 843 | reject(); |
844 | } | 844 | } |
845 | }; | 845 | }; |
846 | 846 | ||
847 | 847 | ||
848 | void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key ) | 848 | void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key ) |
849 | { | 849 | { |
850 | // specialised actions for certain widgets. May want to | 850 | // specialised actions for certain widgets. May want to |
851 | // add more stuff here. | 851 | // add more stuff here. |
852 | if ( activePopupWidget() && activePopupWidget() ->inherits( "QListBox" ) | 852 | if ( activePopupWidget() && activePopupWidget() ->inherits( "QListBox" ) |
853 | && activePopupWidget() ->parentWidget() | 853 | && activePopupWidget() ->parentWidget() |
854 | && activePopupWidget() ->parentWidget() ->inherits( "QComboBox" ) ) | 854 | && activePopupWidget() ->parentWidget() ->inherits( "QComboBox" ) ) |
855 | key = Qt::Key_Return; | 855 | key = Qt::Key_Return; |
856 | 856 | ||
857 | if ( activePopupWidget() && activePopupWidget() ->inherits( "QPopupMenu" ) ) | 857 | if ( activePopupWidget() && activePopupWidget() ->inherits( "QPopupMenu" ) ) |
858 | key = Qt::Key_Return; | 858 | key = Qt::Key_Return; |
859 | 859 | ||
860 | #ifdef QWS | 860 | #ifdef QWS |
861 | 861 | ||
862 | ke->simpleData.keycode = key; | 862 | ke->simpleData.keycode = key; |
863 | #endif | 863 | #endif |
864 | } | 864 | } |
865 | 865 | ||
866 | class HackWidget : public QWidget | 866 | class HackWidget : public QWidget |
867 | { | 867 | { |
868 | public: | 868 | public: |
869 | bool needsOk() | 869 | bool needsOk() |
870 | { | 870 | { |
871 | return ( getWState() & WState_Reserved1 ); | 871 | return ( getWState() & WState_Reserved1 ); |
872 | } | 872 | } |
873 | }; | 873 | }; |
874 | 874 | ||
875 | /*! | 875 | /*! |
876 | \internal | 876 | \internal |
877 | */ | 877 | */ |
878 | 878 | ||
879 | #ifdef QWS | 879 | #ifdef QWS |
880 | bool QPEApplication::qwsEventFilter( QWSEvent * e ) | 880 | bool QPEApplication::qwsEventFilter( QWSEvent * e ) |
881 | { | 881 | { |
882 | if ( !d->notbusysent && e->type == QWSEvent::Focus ) { | 882 | if ( !d->notbusysent && e->type == QWSEvent::Focus ) { |
883 | if ( qApp->type() != QApplication::GuiServer ) { | 883 | if ( qApp->type() != QApplication::GuiServer ) { |
884 | QCopEnvelope e( "QPE/System", "notBusy(QString)" ); | 884 | QCopEnvelope e( "QPE/System", "notBusy(QString)" ); |
885 | e << d->appName; | 885 | e << d->appName; |
886 | } | 886 | } |
887 | d->notbusysent = TRUE; | 887 | d->notbusysent = TRUE; |
888 | } | 888 | } |
889 | if ( type() == GuiServer ) { | 889 | if ( type() == GuiServer ) { |
890 | switch ( e->type ) { | 890 | switch ( e->type ) { |
891 | case QWSEvent::Mouse: | 891 | case QWSEvent::Mouse: |
892 | if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) ) | 892 | if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) ) |
893 | emit clientMoused(); | 893 | emit clientMoused(); |
894 | break; | 894 | break; |
895 | default: | 895 | default: |
896 | break; | 896 | break; |
897 | } | 897 | } |
898 | } | 898 | } |
899 | if ( e->type == QWSEvent::Key ) { | 899 | if ( e->type == QWSEvent::Key ) { |
900 | QWSKeyEvent *ke = ( QWSKeyEvent * ) e; | 900 | QWSKeyEvent *ke = ( QWSKeyEvent * ) e; |
901 | if ( ke->simpleData.keycode == Qt::Key_F33 ) { | 901 | if ( ke->simpleData.keycode == Qt::Key_F33 ) { |
902 | // Use special "OK" key to press "OK" on top level widgets | 902 | // Use special "OK" key to press "OK" on top level widgets |
903 | QWidget * active = activeWindow(); | 903 | QWidget * active = activeWindow(); |
904 | QWidget *popup = 0; | 904 | QWidget *popup = 0; |
905 | if ( active && active->isPopup() ) { | 905 | if ( active && active->isPopup() ) { |
906 | popup = active; | 906 | popup = active; |
907 | active = active->parentWidget(); | 907 | active = active->parentWidget(); |
908 | } | 908 | } |
909 | if ( active && ( int ) active->winId() == ke->simpleData.window && | 909 | if ( active && ( int ) active->winId() == ke->simpleData.window && |
910 | !active->testWFlags( WStyle_Customize | WType_Popup | WType_Desktop ) ) { | 910 | !active->testWFlags( WStyle_Customize | WType_Popup | WType_Desktop ) ) { |
911 | if ( ke->simpleData.is_press ) { | 911 | if ( ke->simpleData.is_press ) { |
912 | if ( popup ) | 912 | if ( popup ) |
913 | popup->close(); | 913 | popup->close(); |
914 | if ( active->inherits( "QDialog" ) ) { | 914 | if ( active->inherits( "QDialog" ) ) { |
915 | HackDialog * d = ( HackDialog * ) active; | 915 | HackDialog * d = ( HackDialog * ) active; |
916 | d->acceptIt(); | 916 | d->acceptIt(); |
917 | return TRUE; | 917 | return TRUE; |
918 | } | 918 | } |
919 | else if ( ( ( HackWidget * ) active ) ->needsOk() ) { | 919 | else if ( ( ( HackWidget * ) active ) ->needsOk() ) { |
920 | QSignal s; | 920 | QSignal s; |
921 | s.connect( active, SLOT( accept() ) ); | 921 | s.connect( active, SLOT( accept() ) ); |
922 | s.activate(); | 922 | s.activate(); |
923 | } | 923 | } |
924 | else { | 924 | else { |
925 | // do the same as with the select key: Map to the default action of the widget: | 925 | // do the same as with the select key: Map to the default action of the widget: |
926 | mapToDefaultAction( ke, Qt::Key_Return ); | 926 | mapToDefaultAction( ke, Qt::Key_Return ); |
927 | } | 927 | } |
928 | } | 928 | } |
929 | } | 929 | } |
930 | } | 930 | } |
931 | else if ( ke->simpleData.keycode == Qt::Key_F30 ) { | 931 | else if ( ke->simpleData.keycode == Qt::Key_F30 ) { |
932 | // Use special "select" key to do whatever default action a widget has | 932 | // Use special "select" key to do whatever default action a widget has |
933 | mapToDefaultAction( ke, Qt::Key_Space ); | 933 | mapToDefaultAction( ke, Qt::Key_Space ); |
934 | } | 934 | } |
935 | else if ( ke->simpleData.keycode == Qt::Key_Escape && | 935 | else if ( ke->simpleData.keycode == Qt::Key_Escape && |
936 | ke->simpleData.is_press ) { | 936 | ke->simpleData.is_press ) { |
937 | // Escape key closes app if focus on toplevel | 937 | // Escape key closes app if focus on toplevel |
938 | QWidget * active = activeWindow(); | 938 | QWidget * active = activeWindow(); |
939 | if ( active && active->testWFlags( WType_TopLevel ) && | 939 | if ( active && active->testWFlags( WType_TopLevel ) && |
940 | ( int ) active->winId() == ke->simpleData.window && | 940 | ( int ) active->winId() == ke->simpleData.window && |
941 | !active->testWFlags( WStyle_Dialog | WStyle_Customize | WType_Popup | WType_Desktop ) ) { | 941 | !active->testWFlags( WStyle_Dialog | WStyle_Customize | WType_Popup | WType_Desktop ) ) { |
942 | if ( active->inherits( "QDialog" ) ) { | 942 | if ( active->inherits( "QDialog" ) ) { |
943 | HackDialog * d = ( HackDialog * ) active; | 943 | HackDialog * d = ( HackDialog * ) active; |
944 | d->rejectIt(); | 944 | d->rejectIt(); |
945 | return TRUE; | 945 | return TRUE; |
946 | } | 946 | } |
947 | else if ( strcmp( argv() [ 0 ], "embeddedkonsole" ) != 0 ) { | 947 | else if ( strcmp( argv() [ 0 ], "embeddedkonsole" ) != 0 ) { |
948 | active->close(); | 948 | active->close(); |
949 | } | 949 | } |
950 | } | 950 | } |
951 | } | 951 | } |
952 | else if ( ke->simpleData.keycode >= Qt::Key_F1 && ke->simpleData.keycode <= Qt::Key_F29 ) { | 952 | else if ( ke->simpleData.keycode >= Qt::Key_F1 && ke->simpleData.keycode <= Qt::Key_F29 ) { |
953 | // this should be if ( ODevice::inst ( )-> buttonForKeycode ( ... )) | 953 | // this should be if ( ODevice::inst ( )-> buttonForKeycode ( ... )) |
954 | // but we cannot access libopie function within libqpe :( | 954 | // but we cannot access libopie function within libqpe :( |
955 | 955 | ||
956 | QWidget * active = activeWindow ( ); | 956 | QWidget * active = activeWindow ( ); |
957 | if ( active && ((int) active-> winId ( ) == ke-> simpleData.window )) { | 957 | if ( active && ((int) active-> winId ( ) == ke-> simpleData.window )) { |
958 | if ( d-> kbgrabbed ) { // we grabbed the keyboard | 958 | if ( d-> kbgrabbed ) { // we grabbed the keyboard |
959 | QChar ch ( ke-> simpleData.unicode ); | 959 | QChar ch ( ke-> simpleData.unicode ); |
960 | QKeyEvent qke ( ke-> simpleData. is_press ? QEvent::KeyPress : QEvent::KeyRelease, | 960 | QKeyEvent qke ( ke-> simpleData. is_press ? QEvent::KeyPress : QEvent::KeyRelease, |
961 | ke-> simpleData.keycode, | 961 | ke-> simpleData.keycode, |
962 | ch. latin1 ( ), | 962 | ch. latin1 ( ), |
963 | ke-> simpleData.modifiers, | 963 | ke-> simpleData.modifiers, |
964 | QString ( ch ), | 964 | QString ( ch ), |
965 | ke-> simpleData.is_auto_repeat, 1 ); | 965 | ke-> simpleData.is_auto_repeat, 1 ); |
966 | 966 | ||
967 | QObject *which = QWidget::keyboardGrabber ( ); | 967 | QObject *which = QWidget::keyboardGrabber ( ); |
968 | if ( !which ) | 968 | if ( !which ) |
969 | which = QApplication::focusWidget ( ); | 969 | which = QApplication::focusWidget ( ); |
970 | if ( !which ) | 970 | if ( !which ) |
971 | which = QApplication::activeWindow ( ); | 971 | which = QApplication::activeWindow ( ); |
972 | if ( !which ) | 972 | if ( !which ) |
973 | which = qApp; | 973 | which = qApp; |
974 | 974 | ||
975 | QApplication::sendEvent ( which, &qke ); | 975 | QApplication::sendEvent ( which, &qke ); |
976 | } | 976 | } |
977 | else { // we didn't grab the keyboard, so send the event to the launcher | 977 | else { // we didn't grab the keyboard, so send the event to the launcher |
978 | QCopEnvelope e ( "QPE/Launcher", "deviceButton(int,int,int)" ); | 978 | QCopEnvelope e ( "QPE/Launcher", "deviceButton(int,int,int)" ); |
979 | e << int( ke-> simpleData.keycode ) << int( ke-> simpleData. is_press ) << int( ke-> simpleData.is_auto_repeat ); | 979 | e << int( ke-> simpleData.keycode ) << int( ke-> simpleData. is_press ) << int( ke-> simpleData.is_auto_repeat ); |
980 | } | 980 | } |
981 | } | 981 | } |
982 | return true; | 982 | return true; |
983 | } | 983 | } |
984 | } | 984 | } |
985 | if ( e->type == QWSEvent::Focus ) { | 985 | if ( e->type == QWSEvent::Focus ) { |
986 | QWSFocusEvent * fe = ( QWSFocusEvent* ) e; | 986 | QWSFocusEvent * fe = ( QWSFocusEvent* ) e; |
987 | if ( !fe->simpleData.get_focus ) { | 987 | if ( !fe->simpleData.get_focus ) { |
988 | QWidget * active = activeWindow(); | 988 | QWidget * active = activeWindow(); |
989 | while ( active && active->isPopup() ) { | 989 | while ( active && active->isPopup() ) { |
990 | active->close(); | 990 | active->close(); |
991 | active = activeWindow(); | 991 | active = activeWindow(); |
992 | } | 992 | } |
993 | } | 993 | } |
994 | else { | 994 | else { |
995 | // make sure our modal widget is ALWAYS on top | 995 | // make sure our modal widget is ALWAYS on top |
996 | QWidget *topm = activeModalWidget(); | 996 | QWidget *topm = activeModalWidget(); |
997 | if ( topm ) { | 997 | if ( topm ) { |
998 | topm->raise(); | 998 | topm->raise(); |
999 | } | 999 | } |
1000 | } | 1000 | } |
1001 | if ( fe->simpleData.get_focus && inputMethodDict ) { | 1001 | if ( fe->simpleData.get_focus && inputMethodDict ) { |
1002 | InputMethodHint m = inputMethodHint( QWidget::find( e->window() ) ); | 1002 | InputMethodHint m = inputMethodHint( QWidget::find( e->window() ) ); |
1003 | if ( m == AlwaysOff ) | 1003 | if ( m == AlwaysOff ) |
1004 | Global::hideInputMethod(); | 1004 | Global::hideInputMethod(); |
1005 | if ( m == AlwaysOn ) | 1005 | if ( m == AlwaysOn ) |
1006 | Global::showInputMethod(); | 1006 | Global::showInputMethod(); |
1007 | } | 1007 | } |
1008 | } | 1008 | } |
1009 | 1009 | ||
1010 | 1010 | ||
1011 | return QApplication::qwsEventFilter( e ); | 1011 | return QApplication::qwsEventFilter( e ); |
1012 | } | 1012 | } |
1013 | #endif | 1013 | #endif |
1014 | 1014 | ||
1015 | /*! | 1015 | /*! |
1016 | Destroys the QPEApplication. | 1016 | Destroys the QPEApplication. |
1017 | */ | 1017 | */ |
1018 | QPEApplication::~QPEApplication() | 1018 | QPEApplication::~QPEApplication() |
1019 | { | 1019 | { |
1020 | ungrabKeyboard(); | 1020 | ungrabKeyboard(); |
1021 | #if defined(Q_WS_QWS) && !defined(QT_NO_COP) | 1021 | #if defined(Q_WS_QWS) && !defined(QT_NO_COP) |
1022 | // Need to delete QCopChannels early, since the display will | 1022 | // Need to delete QCopChannels early, since the display will |
1023 | // be gone by the time we get to ~QObject(). | 1023 | // be gone by the time we get to ~QObject(). |
1024 | delete sysChannel; | 1024 | delete sysChannel; |
1025 | delete pidChannel; | 1025 | delete pidChannel; |
1026 | #endif | 1026 | #endif |
1027 | 1027 | ||
1028 | delete d; | 1028 | delete d; |
1029 | } | 1029 | } |
1030 | 1030 | ||
1031 | /*! | 1031 | /*! |
1032 | Returns <tt>$OPIEDIR/</tt>. | 1032 | Returns <tt>$OPIEDIR/</tt>. |
1033 | */ | 1033 | */ |
1034 | QString QPEApplication::qpeDir() | 1034 | QString QPEApplication::qpeDir() |
1035 | { | 1035 | { |
1036 | const char * base = getenv( "OPIEDIR" ); | 1036 | const char * base = getenv( "OPIEDIR" ); |
1037 | if ( base ) | 1037 | if ( base ) |
1038 | return QString( base ) + "/"; | 1038 | return QString( base ) + "/"; |
1039 | 1039 | ||
1040 | return QString( "../" ); | 1040 | return QString( "../" ); |
1041 | } | 1041 | } |
1042 | 1042 | ||
1043 | /*! | 1043 | /*! |
1044 | Returns the user's current Document directory. There is a trailing "/". | 1044 | Returns the user's current Document directory. There is a trailing "/". |
1045 | .. well, it does now,, and there's no trailing '/' | 1045 | .. well, it does now,, and there's no trailing '/' |
1046 | */ | 1046 | */ |
1047 | QString QPEApplication::documentDir() | 1047 | QString QPEApplication::documentDir() |
1048 | { | 1048 | { |
1049 | const char* base = getenv( "HOME"); | 1049 | const char* base = getenv( "HOME"); |
1050 | if ( base ) | 1050 | if ( base ) |
1051 | return QString( base ) + "/Documents"; | 1051 | return QString( base ) + "/Documents"; |
1052 | 1052 | ||
1053 | return QString( "../Documents" ); | 1053 | return QString( "../Documents" ); |
1054 | } | 1054 | } |
1055 | 1055 | ||
1056 | static int deforient = -1; | 1056 | static int deforient = -1; |
1057 | 1057 | ||
1058 | /*! | 1058 | /*! |
1059 | \internal | 1059 | \internal |
1060 | */ | 1060 | */ |
1061 | int QPEApplication::defaultRotation() | 1061 | int QPEApplication::defaultRotation() |
1062 | { | 1062 | { |
1063 | if ( deforient < 0 ) { | 1063 | if ( deforient < 0 ) { |
1064 | QString d = getenv( "QWS_DISPLAY" ); | 1064 | QString d = getenv( "QWS_DISPLAY" ); |
1065 | if ( d.contains( "Rot90" ) ) { | 1065 | if ( d.contains( "Rot90" ) ) { |
1066 | deforient = 90; | 1066 | deforient = 90; |
1067 | } | 1067 | } |
1068 | else if ( d.contains( "Rot180" ) ) { | 1068 | else if ( d.contains( "Rot180" ) ) { |
1069 | deforient = 180; | 1069 | deforient = 180; |
1070 | } | 1070 | } |
1071 | else if ( d.contains( "Rot270" ) ) { | 1071 | else if ( d.contains( "Rot270" ) ) { |
1072 | deforient = 270; | 1072 | deforient = 270; |
1073 | } | 1073 | } |
1074 | else { | 1074 | else { |
1075 | deforient = 0; | 1075 | deforient = 0; |
1076 | } | 1076 | } |
1077 | } | 1077 | } |
1078 | return deforient; | 1078 | return deforient; |
1079 | } | 1079 | } |
1080 | 1080 | ||
1081 | /*! | 1081 | /*! |
1082 | \internal | 1082 | \internal |
1083 | */ | 1083 | */ |
1084 | void QPEApplication::setDefaultRotation( int r ) | 1084 | void QPEApplication::setDefaultRotation( int r ) |
1085 | { | 1085 | { |
1086 | if ( qApp->type() == GuiServer ) { | 1086 | if ( qApp->type() == GuiServer ) { |
1087 | deforient = r; | 1087 | deforient = r; |
1088 | setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 ); | 1088 | setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 ); |
1089 | Config config("qpe"); | 1089 | Config config("qpe"); |
1090 | config.setGroup( "Rotation" ); | 1090 | config.setGroup( "Rotation" ); |
1091 | config.writeEntry( "Rot", r ); | 1091 | config.writeEntry( "Rot", r ); |
1092 | } | 1092 | } |
1093 | else { | 1093 | else { |
1094 | #ifndef QT_NO_COP | 1094 | #ifndef QT_NO_COP |
1095 | { QCopEnvelope e( "QPE/System", "setDefaultRotation(int)" ); | 1095 | { QCopEnvelope e( "QPE/System", "setDefaultRotation(int)" ); |
1096 | e << r; | 1096 | e << r; |
1097 | } | 1097 | } |
1098 | #endif | 1098 | #endif |
1099 | 1099 | ||
1100 | } | 1100 | } |
1101 | } | 1101 | } |
1102 | 1102 | ||
1103 | #include <qgfx_qws.h> | 1103 | #include <qgfx_qws.h> |
1104 | #include <qwindowsystem_qws.h> | 1104 | #include <qwindowsystem_qws.h> |
1105 | #include <qpixmapcache.h> | ||
1106 | 1105 | ||
1107 | extern void qws_clearLoadedFonts(); | 1106 | extern void qws_clearLoadedFonts(); |
1108 | 1107 | ||
1109 | void QPEApplication::setCurrentMode( int x, int y, int depth ) | 1108 | void QPEApplication::setCurrentMode( int x, int y, int depth ) |
1110 | { | 1109 | { |
1111 | // Reset the caches | 1110 | // Reset the caches |
1112 | qws_clearLoadedFonts(); | 1111 | qws_clearLoadedFonts(); |
1113 | QPixmapCache::clear(); | 1112 | QPixmapCache::clear(); |
1114 | 1113 | ||
1115 | // Change the screen mode | 1114 | // Change the screen mode |
1116 | qt_screen->setMode(x, y, depth); | 1115 | qt_screen->setMode(x, y, depth); |
1117 | 1116 | ||
1118 | if ( qApp->type() == GuiServer ) { | 1117 | if ( qApp->type() == GuiServer ) { |
1119 | // Reconfigure the GuiServer | 1118 | // Reconfigure the GuiServer |
1120 | qwsServer->beginDisplayReconfigure(); | 1119 | qwsServer->beginDisplayReconfigure(); |
1121 | qwsServer->endDisplayReconfigure(); | 1120 | qwsServer->endDisplayReconfigure(); |
1122 | 1121 | ||
1123 | // Get all the running apps to reset | 1122 | // Get all the running apps to reset |
1124 | QCopEnvelope env( "QPE/System", "reset()" ); | 1123 | QCopEnvelope env( "QPE/System", "reset()" ); |
1125 | } | 1124 | } |
1126 | } | 1125 | } |
1127 | 1126 | ||
1128 | void QPEApplication::reset() { | 1127 | void QPEApplication::reset() { |
1129 | // Reconnect to the screen | 1128 | // Reconnect to the screen |
1130 | qt_screen->disconnect(); | 1129 | qt_screen->disconnect(); |
1131 | qt_screen->connect( QString::null ); | 1130 | qt_screen->connect( QString::null ); |
1132 | 1131 | ||
1133 | // Redraw everything | 1132 | // Redraw everything |
1134 | applyStyle(); | 1133 | applyStyle(); |
1135 | } | 1134 | } |
1136 | 1135 | ||
1137 | /*! | 1136 | /*! |
1138 | \internal | 1137 | \internal |
1139 | */ | 1138 | */ |
1140 | void QPEApplication::applyStyle() | 1139 | void QPEApplication::applyStyle() |
1141 | { | 1140 | { |
1142 | Config config( "qpe" ); | 1141 | Config config( "qpe" ); |
1143 | config.setGroup( "Appearance" ); | 1142 | config.setGroup( "Appearance" ); |
1144 | 1143 | ||
1145 | #if QT_VERSION > 233 | 1144 | #if QT_VERSION > 233 |
1146 | #if !defined(OPIE_NO_OVERRIDE_QT) | 1145 | #if !defined(OPIE_NO_OVERRIDE_QT) |
1147 | // don't block ourselves ... | 1146 | // don't block ourselves ... |
1148 | Opie::force_appearance = 0; | 1147 | Opie::force_appearance = 0; |
1149 | 1148 | ||
1150 | static QString appname = Opie::binaryName ( ); | 1149 | static QString appname = Opie::binaryName ( ); |
1151 | 1150 | ||
1152 | QStringList ex = config. readListEntry ( "NoStyle", ';' ); | 1151 | QStringList ex = config. readListEntry ( "NoStyle", ';' ); |
1153 | int nostyle = 0; | 1152 | int nostyle = 0; |
1154 | for ( QStringList::Iterator it = ex. begin ( ); it != ex. end ( ); ++it ) { | 1153 | for ( QStringList::Iterator it = ex. begin ( ); it != ex. end ( ); ++it ) { |
1155 | if ( QRegExp (( *it ). mid ( 1 ), false, true ). find ( appname, 0 ) >= 0 ) { | 1154 | if ( QRegExp (( *it ). mid ( 1 ), false, true ). find ( appname, 0 ) >= 0 ) { |
1156 | nostyle = ( *it ). left ( 1 ). toInt ( 0, 32 ); | 1155 | nostyle = ( *it ). left ( 1 ). toInt ( 0, 32 ); |
1157 | break; | 1156 | break; |
1158 | } | 1157 | } |
1159 | } | 1158 | } |
1160 | #else | 1159 | #else |
1161 | int nostyle = 0; | 1160 | int nostyle = 0; |
1162 | #endif | 1161 | #endif |
1163 | 1162 | ||
1164 | // Widget style | 1163 | // Widget style |
1165 | QString style = config.readEntry( "Style", "FlatStyle" ); | 1164 | QString style = config.readEntry( "Style", "FlatStyle" ); |
1166 | 1165 | ||
1167 | // don't set a custom style | 1166 | // don't set a custom style |
1168 | if ( nostyle & Opie::Force_Style ) | 1167 | if ( nostyle & Opie::Force_Style ) |
1169 | style = "FlatStyle"; | 1168 | style = "FlatStyle"; |
1170 | 1169 | ||
1171 | internalSetStyle ( style ); | 1170 | internalSetStyle ( style ); |
1172 | 1171 | ||
1173 | // Colors - from /etc/colors/Liquid.scheme | 1172 | // Colors - from /etc/colors/Liquid.scheme |
1174 | QColor bgcolor( config.readEntry( "Background", "#E0E0E0" ) ); | 1173 | QColor bgcolor( config.readEntry( "Background", "#E0E0E0" ) ); |
1175 | QColor btncolor( config.readEntry( "Button", "#96c8fa" ) ); | 1174 | QColor btncolor( config.readEntry( "Button", "#96c8fa" ) ); |
1176 | QPalette pal( btncolor, bgcolor ); | 1175 | QPalette pal( btncolor, bgcolor ); |
1177 | QString color = config.readEntry( "Highlight", "#73adef" ); | 1176 | QString color = config.readEntry( "Highlight", "#73adef" ); |
1178 | pal.setColor( QColorGroup::Highlight, QColor( color ) ); | 1177 | pal.setColor( QColorGroup::Highlight, QColor( color ) ); |
1179 | color = config.readEntry( "HighlightedText", "#FFFFFF" ); | 1178 | color = config.readEntry( "HighlightedText", "#FFFFFF" ); |
1180 | pal.setColor( QColorGroup::HighlightedText, QColor( color ) ); | 1179 | pal.setColor( QColorGroup::HighlightedText, QColor( color ) ); |
1181 | color = config.readEntry( "Text", "#000000" ); | 1180 | color = config.readEntry( "Text", "#000000" ); |
1182 | pal.setColor( QColorGroup::Text, QColor( color ) ); | 1181 | pal.setColor( QColorGroup::Text, QColor( color ) ); |
1183 | color = config.readEntry( "ButtonText", "#000000" ); | 1182 | color = config.readEntry( "ButtonText", "#000000" ); |
1184 | pal.setColor( QPalette::Active, QColorGroup::ButtonText, QColor( color ) ); | 1183 | pal.setColor( QPalette::Active, QColorGroup::ButtonText, QColor( color ) ); |
1185 | color = config.readEntry( "Base", "#FFFFFF" ); | 1184 | color = config.readEntry( "Base", "#FFFFFF" ); |
1186 | pal.setColor( QColorGroup::Base, QColor( color ) ); | 1185 | pal.setColor( QColorGroup::Base, QColor( color ) ); |
1187 | 1186 | ||
1188 | pal.setColor( QPalette::Disabled, QColorGroup::Text, | 1187 | pal.setColor( QPalette::Disabled, QColorGroup::Text, |
1189 | pal.color( QPalette::Active, QColorGroup::Background ).dark() ); | 1188 | pal.color( QPalette::Active, QColorGroup::Background ).dark() ); |
1190 | 1189 | ||
1191 | setPalette( pal, TRUE ); | 1190 | setPalette( pal, TRUE ); |
1192 | 1191 | ||
1193 | // Window Decoration | 1192 | // Window Decoration |
1194 | QString dec = config.readEntry( "Decoration", "Flat" ); | 1193 | QString dec = config.readEntry( "Decoration", "Flat" ); |
1195 | 1194 | ||
1196 | // don't set a custom deco | 1195 | // don't set a custom deco |
1197 | if ( nostyle & Opie::Force_Decoration ) | 1196 | if ( nostyle & Opie::Force_Decoration ) |
1198 | dec = ""; | 1197 | dec = ""; |
1199 | 1198 | ||
1200 | //qDebug ( "Setting Deco: %s -- old %s (%d)", dec.latin1(), d-> decorationName.latin1(), nostyle); | 1199 | //qDebug ( "Setting Deco: %s -- old %s (%d)", dec.latin1(), d-> decorationName.latin1(), nostyle); |
1201 | 1200 | ||
1202 | if ( dec != d->decorationName ) { | 1201 | if ( dec != d->decorationName ) { |
1203 | qwsSetDecoration( new QPEDecoration( dec ) ); | 1202 | qwsSetDecoration( new QPEDecoration( dec ) ); |
1204 | d->decorationName = dec; | 1203 | d->decorationName = dec; |
1205 | } | 1204 | } |
1206 | 1205 | ||
1207 | // Font | 1206 | // Font |
1208 | QString ff = config.readEntry( "FontFamily", font().family() ); | 1207 | QString ff = config.readEntry( "FontFamily", font().family() ); |
1209 | int fs = config.readNumEntry( "FontSize", font().pointSize() ); | 1208 | int fs = config.readNumEntry( "FontSize", font().pointSize() ); |
1210 | 1209 | ||
1211 | // don't set a custom font | 1210 | // don't set a custom font |
1212 | if ( nostyle & Opie::Force_Font ) { | 1211 | if ( nostyle & Opie::Force_Font ) { |
1213 | ff = "Vera"; | 1212 | ff = "Vera"; |
1214 | fs = 10; | 1213 | fs = 10; |
1215 | } | 1214 | } |
1216 | 1215 | ||
1217 | setFont ( QFont ( ff, fs ), true ); | 1216 | setFont ( QFont ( ff, fs ), true ); |
1218 | 1217 | ||
1219 | #if !defined(OPIE_NO_OVERRIDE_QT) | 1218 | #if !defined(OPIE_NO_OVERRIDE_QT) |
1220 | // revert to global blocking policy ... | 1219 | // revert to global blocking policy ... |
1221 | Opie::force_appearance = config. readBoolEntry ( "ForceStyle", false ) ? Opie::Force_All : Opie::Force_None; | 1220 | Opie::force_appearance = config. readBoolEntry ( "ForceStyle", false ) ? Opie::Force_All : Opie::Force_None; |
1222 | Opie::force_appearance &= ~nostyle; | 1221 | Opie::force_appearance &= ~nostyle; |
1223 | #endif | 1222 | #endif |
1224 | #endif | 1223 | #endif |
1225 | } | 1224 | } |
1226 | 1225 | ||
1227 | void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data ) | 1226 | void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data ) |
1228 | { | 1227 | { |
1229 | #ifdef Q_WS_QWS | 1228 | #ifdef Q_WS_QWS |
1230 | QDataStream stream( data, IO_ReadOnly ); | 1229 | QDataStream stream( data, IO_ReadOnly ); |
1231 | if ( msg == "applyStyle()" ) { | 1230 | if ( msg == "applyStyle()" ) { |
1232 | applyStyle(); | 1231 | applyStyle(); |
1233 | } | 1232 | } |
1234 | else if ( msg == "toggleApplicationMenu()" ) { | 1233 | else if ( msg == "toggleApplicationMenu()" ) { |
1235 | QWidget *active = activeWindow ( ); | 1234 | QWidget *active = activeWindow ( ); |
1236 | 1235 | ||
1237 | if ( active ) { | 1236 | if ( active ) { |
1238 | QPEMenuToolFocusManager *man = QPEMenuToolFocusManager::manager ( ); | 1237 | QPEMenuToolFocusManager *man = QPEMenuToolFocusManager::manager ( ); |
1239 | bool oldactive = man-> isActive ( ); | 1238 | bool oldactive = man-> isActive ( ); |
1240 | 1239 | ||
1241 | man-> setActive( !man-> isActive() ); | 1240 | man-> setActive( !man-> isActive() ); |
1242 | 1241 | ||
1243 | if ( !oldactive && !man-> isActive ( )) { // no menubar to toggle -> try O-Menu | 1242 | if ( !oldactive && !man-> isActive ( )) { // no menubar to toggle -> try O-Menu |
1244 | QCopEnvelope e ( "QPE/TaskBar", "toggleStartMenu()" ); | 1243 | QCopEnvelope e ( "QPE/TaskBar", "toggleStartMenu()" ); |
1245 | } | 1244 | } |
1246 | } | 1245 | } |
1247 | } | 1246 | } |
1248 | else if ( msg == "setDefaultRotation(int)" ) { | 1247 | else if ( msg == "setDefaultRotation(int)" ) { |
1249 | if ( type() == GuiServer ) { | 1248 | if ( type() == GuiServer ) { |
1250 | int r; | 1249 | int r; |
1251 | stream >> r; | 1250 | stream >> r; |
1252 | setDefaultRotation( r ); | 1251 | setDefaultRotation( r ); |
1253 | } | 1252 | } |
1254 | } | 1253 | } |
1255 | else if ( msg == "setCurrentMode(int,int,int)" ) { // Added: 2003-06-11 by Tim Ansell <mithro@mithis.net> | 1254 | else if ( msg == "setCurrentMode(int,int,int)" ) { // Added: 2003-06-11 by Tim Ansell <mithro@mithis.net> |
1256 | if ( type() == GuiServer ) { | 1255 | if ( type() == GuiServer ) { |
1257 | int x, y, depth; | 1256 | int x, y, depth; |
1258 | stream >> x; | 1257 | stream >> x; |
1259 | stream >> y; | 1258 | stream >> y; |
1260 | stream >> depth; | 1259 | stream >> depth; |
1261 | setCurrentMode( x, y, depth ); | 1260 | setCurrentMode( x, y, depth ); |
1262 | } | 1261 | } |
1263 | } | 1262 | } |
1264 | else if ( msg == "reset()" ) { | 1263 | else if ( msg == "reset()" ) { |
1265 | if ( type() != GuiServer ) | 1264 | if ( type() != GuiServer ) |
1266 | reset(); | 1265 | reset(); |
1267 | } | 1266 | } |
1268 | else if ( msg == "setCurrentRotation(int)" ) { | 1267 | else if ( msg == "setCurrentRotation(int)" ) { |
1269 | int r; | 1268 | int r; |
1270 | stream >> r; | 1269 | stream >> r; |
1271 | setCurrentRotation( r ); | 1270 | setCurrentRotation( r ); |
1272 | } | 1271 | } |
1273 | else if ( msg == "shutdown()" ) { | 1272 | else if ( msg == "shutdown()" ) { |
1274 | if ( type() == GuiServer ) | 1273 | if ( type() == GuiServer ) |
1275 | shutdown(); | 1274 | shutdown(); |
1276 | } | 1275 | } |
1277 | else if ( msg == "quit()" ) { | 1276 | else if ( msg == "quit()" ) { |
1278 | if ( type() != GuiServer ) | 1277 | if ( type() != GuiServer ) |
1279 | tryQuit(); | 1278 | tryQuit(); |
1280 | } | 1279 | } |
1281 | else if ( msg == "forceQuit()" ) { | 1280 | else if ( msg == "forceQuit()" ) { |
1282 | if ( type() != GuiServer ) | 1281 | if ( type() != GuiServer ) |
1283 | quit(); | 1282 | quit(); |
1284 | } | 1283 | } |
1285 | else if ( msg == "restart()" ) { | 1284 | else if ( msg == "restart()" ) { |
1286 | if ( type() == GuiServer ) | 1285 | if ( type() == GuiServer ) |
1287 | restart(); | 1286 | restart(); |
1288 | } | 1287 | } |
1289 | else if ( msg == "language(QString)" ) { | 1288 | else if ( msg == "language(QString)" ) { |
1290 | if ( type() == GuiServer ) { | 1289 | if ( type() == GuiServer ) { |
1291 | QString l; | 1290 | QString l; |
1292 | stream >> l; | 1291 | stream >> l; |
1293 | QString cl = getenv( "LANG" ); | 1292 | QString cl = getenv( "LANG" ); |
1294 | if ( cl != l ) { | 1293 | if ( cl != l ) { |
1295 | if ( l.isNull() ) | 1294 | if ( l.isNull() ) |
1296 | unsetenv( "LANG" ); | 1295 | unsetenv( "LANG" ); |
1297 | else | 1296 | else |
1298 | setenv( "LANG", l.latin1(), 1 ); | 1297 | setenv( "LANG", l.latin1(), 1 ); |
1299 | restart(); | 1298 | restart(); |
1300 | } | 1299 | } |
1301 | } | 1300 | } |
1302 | } | 1301 | } |
1303 | else if ( msg == "timeChange(QString)" ) { | 1302 | else if ( msg == "timeChange(QString)" ) { |
1304 | QString t; | 1303 | QString t; |
1305 | stream >> t; | 1304 | stream >> t; |
1306 | if ( t.isNull() ) | 1305 | if ( t.isNull() ) |
1307 | unsetenv( "TZ" ); | 1306 | unsetenv( "TZ" ); |
1308 | else | 1307 | else |
1309 | setenv( "TZ", t.latin1(), 1 ); | 1308 | setenv( "TZ", t.latin1(), 1 ); |
1310 | // emit the signal so everyone else knows... | 1309 | // emit the signal so everyone else knows... |
1311 | emit timeChanged(); | 1310 | emit timeChanged(); |
1312 | } | 1311 | } |
1313 | else if ( msg == "addAlarm(QDateTime,QCString,QCString,int)" ) { | 1312 | else if ( msg == "addAlarm(QDateTime,QCString,QCString,int)" ) { |
1314 | if ( type() == GuiServer ) { | 1313 | if ( type() == GuiServer ) { |
1315 | QDateTime when; | 1314 | QDateTime when; |
1316 | QCString channel, message; | 1315 | QCString channel, message; |
1317 | int data; | 1316 | int data; |
1318 | stream >> when >> channel >> message >> data; | 1317 | stream >> when >> channel >> message >> data; |
1319 | AlarmServer::addAlarm( when, channel, message, data ); | 1318 | AlarmServer::addAlarm( when, channel, message, data ); |
1320 | } | 1319 | } |
1321 | } | 1320 | } |
1322 | else if ( msg == "deleteAlarm(QDateTime,QCString,QCString,int)" ) { | 1321 | else if ( msg == "deleteAlarm(QDateTime,QCString,QCString,int)" ) { |
1323 | if ( type() == GuiServer ) { | 1322 | if ( type() == GuiServer ) { |
1324 | QDateTime when; | 1323 | QDateTime when; |
1325 | QCString channel, message; | 1324 | QCString channel, message; |
1326 | int data; | 1325 | int data; |
1327 | stream >> when >> channel >> message >> data; | 1326 | stream >> when >> channel >> message >> data; |
1328 | AlarmServer::deleteAlarm( when, channel, message, data ); | 1327 | AlarmServer::deleteAlarm( when, channel, message, data ); |
1329 | } | 1328 | } |
1330 | } | 1329 | } |
1331 | else if ( msg == "clockChange(bool)" ) { | 1330 | else if ( msg == "clockChange(bool)" ) { |
1332 | int tmp; | 1331 | int tmp; |
1333 | stream >> tmp; | 1332 | stream >> tmp; |
1334 | emit clockChanged( tmp ); | 1333 | emit clockChanged( tmp ); |
1335 | } | 1334 | } |
1336 | else if ( msg == "weekChange(bool)" ) { | 1335 | else if ( msg == "weekChange(bool)" ) { |
1337 | int tmp; | 1336 | int tmp; |
1338 | stream >> tmp; | 1337 | stream >> tmp; |
1339 | emit weekChanged( tmp ); | 1338 | emit weekChanged( tmp ); |
1340 | } | 1339 | } |
1341 | else if ( msg == "setDateFormat(DateFormat)" ) { | 1340 | else if ( msg == "setDateFormat(DateFormat)" ) { |
1342 | DateFormat tmp; | 1341 | DateFormat tmp; |
1343 | stream >> tmp; | 1342 | stream >> tmp; |
1344 | emit dateFormatChanged( tmp ); | 1343 | emit dateFormatChanged( tmp ); |
1345 | } | 1344 | } |
1346 | else if ( msg == "setVolume(int,int)" ) { | 1345 | else if ( msg == "setVolume(int,int)" ) { |
1347 | int t, v; | 1346 | int t, v; |
1348 | stream >> t >> v; | 1347 | stream >> t >> v; |
1349 | setVolume( t, v ); | 1348 | setVolume( t, v ); |
1350 | emit volumeChanged( muted ); | 1349 | emit volumeChanged( muted ); |
1351 | } | 1350 | } |
1352 | else if ( msg == "volumeChange(bool)" ) { | 1351 | else if ( msg == "volumeChange(bool)" ) { |
1353 | stream >> muted; | 1352 | stream >> muted; |
1354 | setVolume(); | 1353 | setVolume(); |
1355 | emit volumeChanged( muted ); | 1354 | emit volumeChanged( muted ); |
1356 | } | 1355 | } |
1357 | else if ( msg == "setMic(int,int)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com> | 1356 | else if ( msg == "setMic(int,int)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com> |
1358 | int t, v; | 1357 | int t, v; |
1359 | stream >> t >> v; | 1358 | stream >> t >> v; |
1360 | setMic( t, v ); | 1359 | setMic( t, v ); |
1361 | emit micChanged( micMuted ); | 1360 | emit micChanged( micMuted ); |
1362 | } | 1361 | } |
1363 | else if ( msg == "micChange(bool)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com> | 1362 | else if ( msg == "micChange(bool)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com> |
1364 | stream >> micMuted; | 1363 | stream >> micMuted; |
1365 | setMic(); | 1364 | setMic(); |
1366 | emit micChanged( micMuted ); | 1365 | emit micChanged( micMuted ); |
1367 | } | 1366 | } |
1368 | else if ( msg == "setBass(int,int)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org> | 1367 | else if ( msg == "setBass(int,int)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org> |
1369 | int t, v; | 1368 | int t, v; |
1370 | stream >> t >> v; | 1369 | stream >> t >> v; |
1371 | setBass( t, v ); | 1370 | setBass( t, v ); |
1372 | } | 1371 | } |
1373 | else if ( msg == "bassChange(bool)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org> | 1372 | else if ( msg == "bassChange(bool)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org> |
1374 | setBass(); | 1373 | setBass(); |
1375 | } | 1374 | } |
1376 | else if ( msg == "setTreble(int,int)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org> | 1375 | else if ( msg == "setTreble(int,int)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org> |
1377 | int t, v; | 1376 | int t, v; |
1378 | stream >> t >> v; | 1377 | stream >> t >> v; |
1379 | setTreble( t, v ); | 1378 | setTreble( t, v ); |
1380 | } | 1379 | } |
1381 | else if ( msg == "trebleChange(bool)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org> | 1380 | else if ( msg == "trebleChange(bool)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org> |
1382 | setTreble(); | 1381 | setTreble(); |
1383 | } else if ( msg == "getMarkedText()" ) { | 1382 | } else if ( msg == "getMarkedText()" ) { |
1384 | if ( type() == GuiServer ) { | 1383 | if ( type() == GuiServer ) { |
1385 | const ushort unicode = 'C'-'@'; | 1384 | const ushort unicode = 'C'-'@'; |
1386 | const int scan = Key_C; | 1385 | const int scan = Key_C; |
1387 | qwsServer->processKeyEvent( unicode, scan, ControlButton, TRUE, FALSE ); | 1386 | qwsServer->processKeyEvent( unicode, scan, ControlButton, TRUE, FALSE ); |
1388 | qwsServer->processKeyEvent( unicode, scan, ControlButton, FALSE, FALSE ); | 1387 | qwsServer->processKeyEvent( unicode, scan, ControlButton, FALSE, FALSE ); |
1389 | } | 1388 | } |
1390 | } else if ( msg == "newChannel(QString)") { | 1389 | } else if ( msg == "newChannel(QString)") { |
1391 | QString myChannel = "QPE/Application/" + d->appName; | 1390 | QString myChannel = "QPE/Application/" + d->appName; |
1392 | QString channel; | 1391 | QString channel; |
1393 | stream >> channel; | 1392 | stream >> channel; |
1394 | if (channel == myChannel) { | 1393 | if (channel == myChannel) { |
1395 | processQCopFile(); | 1394 | processQCopFile(); |
1396 | d->sendQCopQ(); | 1395 | d->sendQCopQ(); |
1397 | } | 1396 | } |
1398 | } | 1397 | } |
1399 | 1398 | ||
1400 | 1399 | ||
1401 | #endif | 1400 | #endif |
1402 | } | 1401 | } |
1403 | 1402 | ||
1404 | 1403 | ||
1405 | 1404 | ||
1406 | 1405 | ||
1407 | 1406 | ||
1408 | /*! | 1407 | /*! |
1409 | \internal | 1408 | \internal |
1410 | */ | 1409 | */ |
1411 | bool QPEApplication::raiseAppropriateWindow() | 1410 | bool QPEApplication::raiseAppropriateWindow() |
1412 | { | 1411 | { |
1413 | bool r=FALSE; | 1412 | bool r=FALSE; |
1414 | 1413 | ||
1415 | // 1. Raise the main widget | 1414 | // 1. Raise the main widget |
1416 | QWidget *top = d->qpe_main_widget; | 1415 | QWidget *top = d->qpe_main_widget; |
1417 | if ( !top ) top = mainWidget(); | 1416 | if ( !top ) top = mainWidget(); |
1418 | 1417 | ||
1419 | if ( top && d->keep_running ) { | 1418 | if ( top && d->keep_running ) { |
1420 | if ( top->isVisible() ) | 1419 | if ( top->isVisible() ) |
1421 | r = TRUE; | 1420 | r = TRUE; |
1422 | else if (d->preloaded) { | 1421 | else if (d->preloaded) { |
1423 | // We are preloaded and not visible.. pretend we just started.. | 1422 | // We are preloaded and not visible.. pretend we just started.. |
1424 | #ifndef QT_NO_COP | 1423 | #ifndef QT_NO_COP |
1425 | QCopEnvelope e("QPE/System", "fastAppShowing(QString)"); | 1424 | QCopEnvelope e("QPE/System", "fastAppShowing(QString)"); |
1426 | e << d->appName; | 1425 | e << d->appName; |
1427 | #endif | 1426 | #endif |
1428 | } | 1427 | } |
1429 | 1428 | ||
1430 | d->show_mx(top,d->nomaximize, d->appName); | 1429 | d->show_mx(top,d->nomaximize, d->appName); |
1431 | top->raise(); | 1430 | top->raise(); |
1432 | } | 1431 | } |
1433 | 1432 | ||
1434 | QWidget *topm = activeModalWidget(); | 1433 | QWidget *topm = activeModalWidget(); |
1435 | 1434 | ||
1436 | // 2. Raise any parentless widgets (except top and topm, as they | 1435 | // 2. Raise any parentless widgets (except top and topm, as they |
1437 | // are raised before and after this loop). Order from most | 1436 | // are raised before and after this loop). Order from most |
1438 | // recently raised as deepest to least recently as top, so | 1437 | // recently raised as deepest to least recently as top, so |
1439 | // that repeated calls cycle through widgets. | 1438 | // that repeated calls cycle through widgets. |
1440 | QWidgetList *list = topLevelWidgets(); | 1439 | QWidgetList *list = topLevelWidgets(); |
1441 | if ( list ) { | 1440 | if ( list ) { |
1442 | bool foundlast = FALSE; | 1441 | bool foundlast = FALSE; |
1443 | QWidget* topsub = 0; | 1442 | QWidget* topsub = 0; |
1444 | if ( d->lastraised ) { | 1443 | if ( d->lastraised ) { |
1445 | for (QWidget* w = list->first(); w; w = list->next()) { | 1444 | for (QWidget* w = list->first(); w; w = list->next()) { |
1446 | if ( !w->parentWidget() && w != topm && w->isVisible() && !w->isDesktop() ) { | 1445 | if ( !w->parentWidget() && w != topm && w->isVisible() && !w->isDesktop() ) { |
1447 | if ( w == d->lastraised ) | 1446 | if ( w == d->lastraised ) |
1448 | foundlast = TRUE; | 1447 | foundlast = TRUE; |
1449 | if ( foundlast ) { | 1448 | if ( foundlast ) { |
1450 | w->raise(); | 1449 | w->raise(); |
1451 | topsub = w; | 1450 | topsub = w; |
1452 | } | 1451 | } |
1453 | } | 1452 | } |
1454 | } | 1453 | } |
1455 | } | 1454 | } |
1456 | for (QWidget* w = list->first(); w; w = list->next()) { | 1455 | for (QWidget* w = list->first(); w; w = list->next()) { |
1457 | if ( !w->parentWidget() && w != topm && w->isVisible() && !w->isDesktop() ) { | 1456 | if ( !w->parentWidget() && w != topm && w->isVisible() && !w->isDesktop() ) { |
1458 | if ( w == d->lastraised ) | 1457 | if ( w == d->lastraised ) |
1459 | break; | 1458 | break; |
1460 | w->raise(); | 1459 | w->raise(); |
1461 | topsub = w; | 1460 | topsub = w; |
1462 | } | 1461 | } |
1463 | } | 1462 | } |
1464 | d->lastraised = topsub; | 1463 | d->lastraised = topsub; |
1465 | delete list; | 1464 | delete list; |
1466 | } | 1465 | } |
1467 | 1466 | ||
1468 | // 3. Raise the active modal widget. | 1467 | // 3. Raise the active modal widget. |
1469 | if ( topm && topm != top ) { | 1468 | if ( topm && topm != top ) { |
1470 | topm->show(); | 1469 | topm->show(); |
1471 | topm->raise(); | 1470 | topm->raise(); |
1472 | // If we haven't already handled the fastAppShowing message | 1471 | // If we haven't already handled the fastAppShowing message |
1473 | if (!top && d->preloaded) { | 1472 | if (!top && d->preloaded) { |
1474 | #ifndef QT_NO_COP | 1473 | #ifndef QT_NO_COP |
1475 | QCopEnvelope e("QPE/System", "fastAppShowing(QString)"); | 1474 | QCopEnvelope e("QPE/System", "fastAppShowing(QString)"); |
1476 | e << d->appName; | 1475 | e << d->appName; |
1477 | #endif | 1476 | #endif |
1478 | } | 1477 | } |
1479 | r = FALSE; | 1478 | r = FALSE; |
1480 | } | 1479 | } |
1481 | 1480 | ||
1482 | return r; | 1481 | return r; |
1483 | } | 1482 | } |
1484 | 1483 | ||
1485 | 1484 | ||
1486 | void QPEApplication::pidMessage( const QCString& msg, const QByteArray& data) | 1485 | void QPEApplication::pidMessage( const QCString& msg, const QByteArray& data) |
1487 | { | 1486 | { |
1488 | #ifdef Q_WS_QWS | 1487 | #ifdef Q_WS_QWS |
1489 | 1488 | ||
diff --git a/library/qpemenubar.cpp b/library/qpemenubar.cpp index 3e5bad5..1d8eff4 100644 --- a/library/qpemenubar.cpp +++ b/library/qpemenubar.cpp | |||
@@ -1,330 +1,329 @@ | |||
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 | 20 | ||
21 | #define INCLUDE_MENUITEM_DEF | 21 | #define INCLUDE_MENUITEM_DEF |
22 | 22 | ||
23 | #include "qpemenubar.h" | 23 | #include "qpemenubar.h" |
24 | #include <qapplication.h> | 24 | #include <qapplication.h> |
25 | #include <qguardedptr.h> | ||
26 | #include <qtimer.h> | 25 | #include <qtimer.h> |
27 | 26 | ||
28 | 27 | ||
29 | class QMenuBarHack : public QMenuBar | 28 | class QMenuBarHack : public QMenuBar |
30 | { | 29 | { |
31 | public: | 30 | public: |
32 | int activeItem() const { return actItem; } | 31 | int activeItem() const { return actItem; } |
33 | 32 | ||
34 | void goodbye() | 33 | void goodbye() |
35 | { | 34 | { |
36 | activateItemAt(-1); | 35 | activateItemAt(-1); |
37 | for ( unsigned int i = 0; i < count(); i++ ) { | 36 | for ( unsigned int i = 0; i < count(); i++ ) { |
38 | QMenuItem *mi = findItem( idAt(i) ); | 37 | QMenuItem *mi = findItem( idAt(i) ); |
39 | if ( mi->popup() ) { | 38 | if ( mi->popup() ) { |
40 | mi->popup()->hide(); | 39 | mi->popup()->hide(); |
41 | } | 40 | } |
42 | } | 41 | } |
43 | } | 42 | } |
44 | }; | 43 | }; |
45 | 44 | ||
46 | 45 | ||
47 | // Sharp ROM compatibility | 46 | // Sharp ROM compatibility |
48 | void QPEMenuToolFocusManager::setMenukeyEnabled ( bool ) | 47 | void QPEMenuToolFocusManager::setMenukeyEnabled ( bool ) |
49 | { | 48 | { |
50 | } | 49 | } |
51 | int QPEMenuBar::getOldFocus ( ) | 50 | int QPEMenuBar::getOldFocus ( ) |
52 | { | 51 | { |
53 | return 0; | 52 | return 0; |
54 | } | 53 | } |
55 | 54 | ||
56 | QPEMenuToolFocusManager *QPEMenuToolFocusManager::me = 0; | 55 | QPEMenuToolFocusManager *QPEMenuToolFocusManager::me = 0; |
57 | 56 | ||
58 | QPEMenuToolFocusManager::QPEMenuToolFocusManager() : QObject() | 57 | QPEMenuToolFocusManager::QPEMenuToolFocusManager() : QObject() |
59 | { | 58 | { |
60 | qApp->installEventFilter( this ); | 59 | qApp->installEventFilter( this ); |
61 | } | 60 | } |
62 | 61 | ||
63 | void QPEMenuToolFocusManager::addWidget( QWidget *w ) | 62 | void QPEMenuToolFocusManager::addWidget( QWidget *w ) |
64 | { | 63 | { |
65 | list.append( GuardedWidget(w) ); | 64 | list.append( GuardedWidget(w) ); |
66 | } | 65 | } |
67 | 66 | ||
68 | void QPEMenuToolFocusManager::removeWidget( QWidget *w ) | 67 | void QPEMenuToolFocusManager::removeWidget( QWidget *w ) |
69 | { | 68 | { |
70 | list.remove( GuardedWidget(w) ); | 69 | list.remove( GuardedWidget(w) ); |
71 | } | 70 | } |
72 | 71 | ||
73 | void QPEMenuToolFocusManager::setActive( bool a ) | 72 | void QPEMenuToolFocusManager::setActive( bool a ) |
74 | { | 73 | { |
75 | if ( a ) { | 74 | if ( a ) { |
76 | oldFocus = qApp->focusWidget(); | 75 | oldFocus = qApp->focusWidget(); |
77 | QValueList<GuardedWidget>::Iterator it; | 76 | QValueList<GuardedWidget>::Iterator it; |
78 | it = list.begin(); | 77 | it = list.begin(); |
79 | while ( it != list.end() ) { | 78 | while ( it != list.end() ) { |
80 | QWidget *w = (*it); | 79 | QWidget *w = (*it); |
81 | if ( w && w->isEnabled() && w->isVisible() && | 80 | if ( w && w->isEnabled() && w->isVisible() && |
82 | w->topLevelWidget() == qApp->activeWindow() ) { | 81 | w->topLevelWidget() == qApp->activeWindow() ) { |
83 | setFocus( w ); | 82 | setFocus( w ); |
84 | return; | 83 | return; |
85 | } | 84 | } |
86 | ++it; | 85 | ++it; |
87 | } | 86 | } |
88 | } else { | 87 | } else { |
89 | if ( inFocus ) { | 88 | if ( inFocus ) { |
90 | if ( inFocus->inherits( "QMenuBar" ) ) | 89 | if ( inFocus->inherits( "QMenuBar" ) ) |
91 | ((QMenuBarHack *)(QWidget *)inFocus)->goodbye(); | 90 | ((QMenuBarHack *)(QWidget *)inFocus)->goodbye(); |
92 | if ( inFocus->hasFocus() ) { | 91 | if ( inFocus->hasFocus() ) { |
93 | if ( oldFocus && oldFocus->isVisible() && oldFocus->isEnabled() ) { | 92 | if ( oldFocus && oldFocus->isVisible() && oldFocus->isEnabled() ) { |
94 | oldFocus->setFocus(); | 93 | oldFocus->setFocus(); |
95 | } else { | 94 | } else { |
96 | inFocus->clearFocus(); | 95 | inFocus->clearFocus(); |
97 | } | 96 | } |
98 | } | 97 | } |
99 | } | 98 | } |
100 | inFocus = 0; | 99 | inFocus = 0; |
101 | oldFocus = 0; | 100 | oldFocus = 0; |
102 | } | 101 | } |
103 | } | 102 | } |
104 | 103 | ||
105 | bool QPEMenuToolFocusManager::isActive() const | 104 | bool QPEMenuToolFocusManager::isActive() const |
106 | { | 105 | { |
107 | return !inFocus.isNull(); | 106 | return !inFocus.isNull(); |
108 | } | 107 | } |
109 | 108 | ||
110 | void QPEMenuToolFocusManager::moveFocus( bool next ) | 109 | void QPEMenuToolFocusManager::moveFocus( bool next ) |
111 | { | 110 | { |
112 | if ( !isActive() ) | 111 | if ( !isActive() ) |
113 | return; | 112 | return; |
114 | 113 | ||
115 | int n = list.count(); | 114 | int n = list.count(); |
116 | QValueList<GuardedWidget>::Iterator it; | 115 | QValueList<GuardedWidget>::Iterator it; |
117 | it = list.find( inFocus ); | 116 | it = list.find( inFocus ); |
118 | if ( it == list.end() ) | 117 | if ( it == list.end() ) |
119 | it = list.begin(); | 118 | it = list.begin(); |
120 | while ( --n ) { | 119 | while ( --n ) { |
121 | if ( next ) { | 120 | if ( next ) { |
122 | ++it; | 121 | ++it; |
123 | if ( it == list.end() ) | 122 | if ( it == list.end() ) |
124 | it = list.begin(); | 123 | it = list.begin(); |
125 | } else { | 124 | } else { |
126 | if ( it == list.begin() ) | 125 | if ( it == list.begin() ) |
127 | it = list.end(); | 126 | it = list.end(); |
128 | --it; | 127 | --it; |
129 | } | 128 | } |
130 | QWidget *w = (*it); | 129 | QWidget *w = (*it); |
131 | if ( w && w->isEnabled() && w->isVisible() && !w->inherits("QToolBarSeparator") && | 130 | if ( w && w->isEnabled() && w->isVisible() && !w->inherits("QToolBarSeparator") && |
132 | w->topLevelWidget() == qApp->activeWindow() ) { | 131 | w->topLevelWidget() == qApp->activeWindow() ) { |
133 | setFocus( w, next ); | 132 | setFocus( w, next ); |
134 | return; | 133 | return; |
135 | } | 134 | } |
136 | } | 135 | } |
137 | } | 136 | } |
138 | 137 | ||
139 | void QPEMenuToolFocusManager::initialize() | 138 | void QPEMenuToolFocusManager::initialize() |
140 | { | 139 | { |
141 | if ( !me ) | 140 | if ( !me ) |
142 | me = new QPEMenuToolFocusManager; | 141 | me = new QPEMenuToolFocusManager; |
143 | } | 142 | } |
144 | 143 | ||
145 | QPEMenuToolFocusManager *QPEMenuToolFocusManager::manager() | 144 | QPEMenuToolFocusManager *QPEMenuToolFocusManager::manager() |
146 | { | 145 | { |
147 | if ( !me ) | 146 | if ( !me ) |
148 | me = new QPEMenuToolFocusManager; | 147 | me = new QPEMenuToolFocusManager; |
149 | 148 | ||
150 | return me; | 149 | return me; |
151 | } | 150 | } |
152 | 151 | ||
153 | void QPEMenuToolFocusManager::setFocus( QWidget *w, bool next ) | 152 | void QPEMenuToolFocusManager::setFocus( QWidget *w, bool next ) |
154 | { | 153 | { |
155 | inFocus = w; | 154 | inFocus = w; |
156 | // qDebug( "Set focus on %s", w->className() ); | 155 | // qDebug( "Set focus on %s", w->className() ); |
157 | if ( inFocus->inherits( "QMenuBar" ) ) { | 156 | if ( inFocus->inherits( "QMenuBar" ) ) { |
158 | QMenuBar *mb = (QMenuBar *)(QWidget *)inFocus; | 157 | QMenuBar *mb = (QMenuBar *)(QWidget *)inFocus; |
159 | if ( next ) | 158 | if ( next ) |
160 | mb->activateItemAt( 0 ); | 159 | mb->activateItemAt( 0 ); |
161 | else | 160 | else |
162 | mb->activateItemAt( mb->count()-1 ); | 161 | mb->activateItemAt( mb->count()-1 ); |
163 | } | 162 | } |
164 | inFocus->setFocus(); | 163 | inFocus->setFocus(); |
165 | } | 164 | } |
166 | 165 | ||
167 | bool QPEMenuToolFocusManager::eventFilter( QObject *object, QEvent *event ) | 166 | bool QPEMenuToolFocusManager::eventFilter( QObject *object, QEvent *event ) |
168 | { | 167 | { |
169 | if ( event->type() == QEvent::KeyPress ) { | 168 | if ( event->type() == QEvent::KeyPress ) { |
170 | QKeyEvent *ke = (QKeyEvent *)event; | 169 | QKeyEvent *ke = (QKeyEvent *)event; |
171 | if ( isActive() ) { | 170 | if ( isActive() ) { |
172 | if ( object->inherits( "QButton" ) ) { | 171 | if ( object->inherits( "QButton" ) ) { |
173 | switch ( ke->key() ) { | 172 | switch ( ke->key() ) { |
174 | case Key_Left: | 173 | case Key_Left: |
175 | moveFocus( FALSE ); | 174 | moveFocus( FALSE ); |
176 | return TRUE; | 175 | return TRUE; |
177 | 176 | ||
178 | case Key_Right: | 177 | case Key_Right: |
179 | moveFocus( TRUE ); | 178 | moveFocus( TRUE ); |
180 | return TRUE; | 179 | return TRUE; |
181 | 180 | ||
182 | case Key_Up: | 181 | case Key_Up: |
183 | case Key_Down: | 182 | case Key_Down: |
184 | return TRUE; | 183 | return TRUE; |
185 | } | 184 | } |
186 | } else if ( object->inherits( "QPopupMenu" ) ) { | 185 | } else if ( object->inherits( "QPopupMenu" ) ) { |
187 | // Deactivate when a menu item is selected | 186 | // Deactivate when a menu item is selected |
188 | if ( ke->key() == Key_Enter || ke->key() == Key_Return || | 187 | if ( ke->key() == Key_Enter || ke->key() == Key_Return || |
189 | ke->key() == Key_Escape ) { | 188 | ke->key() == Key_Escape ) { |
190 | QTimer::singleShot( 0, this, SLOT(deactivate()) ); | 189 | QTimer::singleShot( 0, this, SLOT(deactivate()) ); |
191 | } | 190 | } |
192 | } else if ( object->inherits( "QMenuBar" ) ) { | 191 | } else if ( object->inherits( "QMenuBar" ) ) { |
193 | int dx = 0; | 192 | int dx = 0; |
194 | switch ( ke->key() ) { | 193 | switch ( ke->key() ) { |
195 | case Key_Left: | 194 | case Key_Left: |
196 | dx = -1; | 195 | dx = -1; |
197 | break; | 196 | break; |
198 | 197 | ||
199 | case Key_Right: | 198 | case Key_Right: |
200 | dx = 1; | 199 | dx = 1; |
201 | break; | 200 | break; |
202 | } | 201 | } |
203 | 202 | ||
204 | QMenuBarHack *mb = (QMenuBarHack *)object; | 203 | QMenuBarHack *mb = (QMenuBarHack *)object; |
205 | if ( dx && mb->activeItem() >= 0 ) { | 204 | if ( dx && mb->activeItem() >= 0 ) { |
206 | int i = mb->activeItem(); | 205 | int i = mb->activeItem(); |
207 | int c = mb->count(); | 206 | int c = mb->count(); |
208 | int n = c; | 207 | int n = c; |
209 | while ( n-- ) { | 208 | while ( n-- ) { |
210 | i = i + dx; | 209 | i = i + dx; |
211 | if ( i == c ) { | 210 | if ( i == c ) { |
212 | mb->goodbye(); | 211 | mb->goodbye(); |
213 | moveFocus( TRUE ); | 212 | moveFocus( TRUE ); |
214 | return TRUE; | 213 | return TRUE; |
215 | } else if ( i < 0 ) { | 214 | } else if ( i < 0 ) { |
216 | mb->goodbye(); | 215 | mb->goodbye(); |
217 | moveFocus( FALSE ); | 216 | moveFocus( FALSE ); |
218 | return TRUE; | 217 | return TRUE; |
219 | } | 218 | } |
220 | QMenuItem *mi = mb->findItem( mb->idAt(i) ); | 219 | QMenuItem *mi = mb->findItem( mb->idAt(i) ); |
221 | if ( mi->isEnabled() && !mi->isSeparator() ) { | 220 | if ( mi->isEnabled() && !mi->isSeparator() ) { |
222 | break; | 221 | break; |
223 | } | 222 | } |
224 | } | 223 | } |
225 | } | 224 | } |
226 | } | 225 | } |
227 | } | 226 | } |
228 | } else if ( event->type() == QEvent::KeyRelease ) { | 227 | } else if ( event->type() == QEvent::KeyRelease ) { |
229 | QKeyEvent *ke = (QKeyEvent *)event; | 228 | QKeyEvent *ke = (QKeyEvent *)event; |
230 | if ( isActive() ) { | 229 | if ( isActive() ) { |
231 | if ( object->inherits( "QButton" ) ) { | 230 | if ( object->inherits( "QButton" ) ) { |
232 | // Deactivate when a button is selected | 231 | // Deactivate when a button is selected |
233 | if ( ke->key() == Key_Space ) | 232 | if ( ke->key() == Key_Space ) |
234 | QTimer::singleShot( 0, this, SLOT(deactivate()) ); | 233 | QTimer::singleShot( 0, this, SLOT(deactivate()) ); |
235 | } | 234 | } |
236 | } | 235 | } |
237 | } else if ( event->type() == QEvent::FocusIn ) { | 236 | } else if ( event->type() == QEvent::FocusIn ) { |
238 | if ( isActive() ) { | 237 | if ( isActive() ) { |
239 | // A non-menu/tool widget has been selected - we're deactivated | 238 | // A non-menu/tool widget has been selected - we're deactivated |
240 | QWidget *w = (QWidget *)object; | 239 | QWidget *w = (QWidget *)object; |
241 | if ( !w->isPopup() && !list.contains( GuardedWidget( w ) ) ) { | 240 | if ( !w->isPopup() && !list.contains( GuardedWidget( w ) ) ) { |
242 | inFocus = 0; | 241 | inFocus = 0; |
243 | } | 242 | } |
244 | } | 243 | } |
245 | } else if ( event->type() == QEvent::Hide ) { | 244 | } else if ( event->type() == QEvent::Hide ) { |
246 | if ( isActive() ) { | 245 | if ( isActive() ) { |
247 | // Deaticvate if a menu/tool has been hidden | 246 | // Deaticvate if a menu/tool has been hidden |
248 | QWidget *w = (QWidget *)object; | 247 | QWidget *w = (QWidget *)object; |
249 | if ( !w->isPopup() && !list.contains( GuardedWidget( w ) ) ) { | 248 | if ( !w->isPopup() && !list.contains( GuardedWidget( w ) ) ) { |
250 | setActive( FALSE ); | 249 | setActive( FALSE ); |
251 | } | 250 | } |
252 | } | 251 | } |
253 | } else if ( event->type() == QEvent::ChildInserted ) { | 252 | } else if ( event->type() == QEvent::ChildInserted ) { |
254 | QChildEvent *ce = (QChildEvent *)event; | 253 | QChildEvent *ce = (QChildEvent *)event; |
255 | if ( ce->child()->isWidgetType() ) { | 254 | if ( ce->child()->isWidgetType() ) { |
256 | if ( ce->child()->inherits( "QMenuBar" ) ) { | 255 | if ( ce->child()->inherits( "QMenuBar" ) ) { |
257 | addWidget( (QWidget *)ce->child() ); | 256 | addWidget( (QWidget *)ce->child() ); |
258 | ce->child()->installEventFilter( this ); | 257 | ce->child()->installEventFilter( this ); |
259 | } else if ( object->inherits( "QToolBar" ) ) { | 258 | } else if ( object->inherits( "QToolBar" ) ) { |
260 | addWidget( (QWidget *)ce->child() ); | 259 | addWidget( (QWidget *)ce->child() ); |
261 | } | 260 | } |
262 | } | 261 | } |
263 | } else if ( event->type() == QEvent::ChildRemoved ) { | 262 | } else if ( event->type() == QEvent::ChildRemoved ) { |
264 | QChildEvent *ce = (QChildEvent *)event; | 263 | QChildEvent *ce = (QChildEvent *)event; |
265 | if ( ce->child()->isWidgetType() ) { | 264 | if ( ce->child()->isWidgetType() ) { |
266 | if ( ce->child()->inherits( "QMenuBar" ) ) { | 265 | if ( ce->child()->inherits( "QMenuBar" ) ) { |
267 | removeWidget( (QWidget *)ce->child() ); | 266 | removeWidget( (QWidget *)ce->child() ); |
268 | ce->child()->removeEventFilter( this ); | 267 | ce->child()->removeEventFilter( this ); |
269 | } else if ( object->inherits( "QToolBar" ) ) { | 268 | } else if ( object->inherits( "QToolBar" ) ) { |
270 | removeWidget( (QWidget *)ce->child() ); | 269 | removeWidget( (QWidget *)ce->child() ); |
271 | } | 270 | } |
272 | } | 271 | } |
273 | } | 272 | } |
274 | 273 | ||
275 | return FALSE; | 274 | return FALSE; |
276 | } | 275 | } |
277 | 276 | ||
278 | void QPEMenuToolFocusManager::deactivate() | 277 | void QPEMenuToolFocusManager::deactivate() |
279 | { | 278 | { |
280 | setActive( FALSE ); | 279 | setActive( FALSE ); |
281 | } | 280 | } |
282 | 281 | ||
283 | /*! | 282 | /*! |
284 | \class QPEMenuBar qpemenubar.h | 283 | \class QPEMenuBar qpemenubar.h |
285 | \brief The QPEMenuBar class is obsolete. Use QMenuBar instead. | 284 | \brief The QPEMenuBar class is obsolete. Use QMenuBar instead. |
286 | 285 | ||
287 | \obsolete | 286 | \obsolete |
288 | 287 | ||
289 | This class is obsolete. Use QMenuBar instead. | 288 | This class is obsolete. Use QMenuBar instead. |
290 | 289 | ||
291 | */ | 290 | */ |
292 | 291 | ||
293 | /*! | 292 | /*! |
294 | Constructs a QPEMenuBar just as you would construct | 293 | Constructs a QPEMenuBar just as you would construct |
295 | a QMenuBar, passing \a parent and \a name. | 294 | a QMenuBar, passing \a parent and \a name. |
296 | */ | 295 | */ |
297 | QPEMenuBar::QPEMenuBar( QWidget *parent, const char *name ) | 296 | QPEMenuBar::QPEMenuBar( QWidget *parent, const char *name ) |
298 | : QMenuBar( parent, name ) | 297 | : QMenuBar( parent, name ) |
299 | { | 298 | { |
300 | } | 299 | } |
301 | 300 | ||
302 | /*! | 301 | /*! |
303 | \reimp | 302 | \reimp |
304 | */ | 303 | */ |
305 | QPEMenuBar::~QPEMenuBar() | 304 | QPEMenuBar::~QPEMenuBar() |
306 | { | 305 | { |
307 | } | 306 | } |
308 | 307 | ||
309 | /*! | 308 | /*! |
310 | \internal | 309 | \internal |
311 | */ | 310 | */ |
312 | void QPEMenuBar::keyPressEvent( QKeyEvent *e ) | 311 | void QPEMenuBar::keyPressEvent( QKeyEvent *e ) |
313 | { | 312 | { |
314 | QMenuBar::keyPressEvent( e ); | 313 | QMenuBar::keyPressEvent( e ); |
315 | } | 314 | } |
316 | 315 | ||
317 | /*! | 316 | /*! |
318 | \internal | 317 | \internal |
319 | */ | 318 | */ |
320 | void QPEMenuBar::activateItem( int index ) { | 319 | void QPEMenuBar::activateItem( int index ) { |
321 | activateItemAt( index ); | 320 | activateItemAt( index ); |
322 | } | 321 | } |
323 | void QPEMenuBar::goodbye() { | 322 | void QPEMenuBar::goodbye() { |
324 | activateItemAt(-1); | 323 | activateItemAt(-1); |
325 | for ( uint i = 0; i < count(); i++ ) { | 324 | for ( uint i = 0; i < count(); i++ ) { |
326 | QMenuItem* mi = findItem( idAt(i) ); | 325 | QMenuItem* mi = findItem( idAt(i) ); |
327 | if (mi->popup() ) | 326 | if (mi->popup() ) |
328 | mi->popup()->hide(); | 327 | mi->popup()->hide(); |
329 | } | 328 | } |
330 | } | 329 | } |
diff --git a/library/qpestyle.cpp b/library/qpestyle.cpp index 665910c..b61ada4 100644 --- a/library/qpestyle.cpp +++ b/library/qpestyle.cpp | |||
@@ -1,409 +1,406 @@ | |||
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 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 | 20 | ||
21 | #include "qpestyle.h" | 21 | #include "qpestyle.h" |
22 | #include <qpe/qpeapplication.h> | ||
23 | #include <qpushbutton.h> | ||
24 | 22 | ||
25 | #include <qpainter.h> | ||
26 | 23 | ||
27 | #define QCOORDARRLEN(x) sizeof(x)/(sizeof(QCOORD)*2) | 24 | #define QCOORDARRLEN(x) sizeof(x)/(sizeof(QCOORD)*2) |
28 | 25 | ||
29 | #if QT_VERSION >= 300 | 26 | #if QT_VERSION >= 300 |
30 | 27 | ||
31 | #include <qdrawutil.h> | 28 | #include <qdrawutil.h> |
32 | #include <qcombobox.h> | 29 | #include <qcombobox.h> |
33 | #include <qtabbar.h> | 30 | #include <qtabbar.h> |
34 | 31 | ||
35 | QPEStyle::QPEStyle() | 32 | QPEStyle::QPEStyle() |
36 | { | 33 | { |
37 | } | 34 | } |
38 | 35 | ||
39 | QPEStyle::~QPEStyle() | 36 | QPEStyle::~QPEStyle() |
40 | { | 37 | { |
41 | } | 38 | } |
42 | 39 | ||
43 | void QPEStyle::drawPrimitive( PrimitiveElement pe, QPainter *p, const QRect &r, | 40 | void QPEStyle::drawPrimitive( PrimitiveElement pe, QPainter *p, const QRect &r, |
44 | const QColorGroup &cg, SFlags flags, const QStyleOption &data) const | 41 | const QColorGroup &cg, SFlags flags, const QStyleOption &data) const |
45 | { | 42 | { |
46 | switch ( pe ) { | 43 | switch ( pe ) { |
47 | case PE_ButtonTool: | 44 | case PE_ButtonTool: |
48 | { | 45 | { |
49 | QColorGroup mycg = cg; | 46 | QColorGroup mycg = cg; |
50 | if ( flags & Style_On ) { | 47 | if ( flags & Style_On ) { |
51 | QBrush fill( cg.mid(), Dense4Pattern ); | 48 | QBrush fill( cg.mid(), Dense4Pattern ); |
52 | mycg.setBrush( QColorGroup::Button, fill ); | 49 | mycg.setBrush( QColorGroup::Button, fill ); |
53 | } | 50 | } |
54 | drawPrimitive( PE_ButtonBevel, p, r, mycg, flags, data ); | 51 | drawPrimitive( PE_ButtonBevel, p, r, mycg, flags, data ); |
55 | break; | 52 | break; |
56 | } | 53 | } |
57 | case PE_ButtonCommand: | 54 | case PE_ButtonCommand: |
58 | case PE_ButtonDefault: | 55 | case PE_ButtonDefault: |
59 | case PE_ButtonBevel: | 56 | case PE_ButtonBevel: |
60 | case PE_HeaderSection: | 57 | case PE_HeaderSection: |
61 | { | 58 | { |
62 | QPen oldPen = p->pen(); | 59 | QPen oldPen = p->pen(); |
63 | p->fillRect( r.x()+1, r.y()+1, r.width()-2, r.height()-2, cg.brush(QColorGroup::Button) ); | 60 | p->fillRect( r.x()+1, r.y()+1, r.width()-2, r.height()-2, cg.brush(QColorGroup::Button) ); |
64 | 61 | ||
65 | int x2 = r.right(); | 62 | int x2 = r.right(); |
66 | int y2 = r.bottom(); | 63 | int y2 = r.bottom(); |
67 | 64 | ||
68 | if ( flags & (Style_Sunken | Style_Down | Style_On) ) | 65 | if ( flags & (Style_Sunken | Style_Down | Style_On) ) |
69 | p->setPen( cg.dark() ); | 66 | p->setPen( cg.dark() ); |
70 | else | 67 | else |
71 | p->setPen( cg.light() ); | 68 | p->setPen( cg.light() ); |
72 | p->drawLine( r.x(), r.y()+1, r.x(), y2-1 ); | 69 | p->drawLine( r.x(), r.y()+1, r.x(), y2-1 ); |
73 | p->drawLine( r.x()+1, r.y(), x2-1, r.y() ); | 70 | p->drawLine( r.x()+1, r.y(), x2-1, r.y() ); |
74 | 71 | ||
75 | if ( flags & (Style_Sunken | Style_Down | Style_On) ) | 72 | if ( flags & (Style_Sunken | Style_Down | Style_On) ) |
76 | p->setPen( cg.light() ); | 73 | p->setPen( cg.light() ); |
77 | else | 74 | else |
78 | p->setPen( cg.dark() ); | 75 | p->setPen( cg.dark() ); |
79 | p->drawLine( x2, r.y()+1, x2, y2-1 ); | 76 | p->drawLine( x2, r.y()+1, x2, y2-1 ); |
80 | p->drawLine( r.x()+1, y2, x2-1, y2 ); | 77 | p->drawLine( r.x()+1, y2, x2-1, y2 ); |
81 | p->setPen( oldPen ); | 78 | p->setPen( oldPen ); |
82 | break; | 79 | break; |
83 | } | 80 | } |
84 | case PE_FocusRect: | 81 | case PE_FocusRect: |
85 | break; | 82 | break; |
86 | case PE_Indicator: | 83 | case PE_Indicator: |
87 | { | 84 | { |
88 | QColorGroup mycg( cg ); | 85 | QColorGroup mycg( cg ); |
89 | QBrush fill; | 86 | QBrush fill; |
90 | if ( flags & Style_Down ) | 87 | if ( flags & Style_Down ) |
91 | fill = cg.brush( QColorGroup::Button ); | 88 | fill = cg.brush( QColorGroup::Button ); |
92 | else | 89 | else |
93 | fill = cg.brush( (flags&Style_Enabled) ? QColorGroup::Base : QColorGroup::Background ); | 90 | fill = cg.brush( (flags&Style_Enabled) ? QColorGroup::Base : QColorGroup::Background ); |
94 | mycg.setBrush( QColorGroup::Button, fill ); | 91 | mycg.setBrush( QColorGroup::Button, fill ); |
95 | if ( flags&Style_Enabled ) | 92 | if ( flags&Style_Enabled ) |
96 | flags |= Style_Sunken; | 93 | flags |= Style_Sunken; |
97 | drawPrimitive( PE_ButtonBevel, p, r, mycg, flags ); | 94 | drawPrimitive( PE_ButtonBevel, p, r, mycg, flags ); |
98 | if ( flags & Style_On ) { | 95 | if ( flags & Style_On ) { |
99 | QPointArray a( 7*2 ); | 96 | QPointArray a( 7*2 ); |
100 | int i, xx, yy; | 97 | int i, xx, yy; |
101 | xx = r.x()+3; | 98 | xx = r.x()+3; |
102 | yy = r.y()+5; | 99 | yy = r.y()+5; |
103 | for ( i=0; i<3; i++ ) { | 100 | for ( i=0; i<3; i++ ) { |
104 | a.setPoint( 2*i, xx, yy ); | 101 | a.setPoint( 2*i, xx, yy ); |
105 | a.setPoint( 2*i+1, xx, yy+2 ); | 102 | a.setPoint( 2*i+1, xx, yy+2 ); |
106 | xx++; yy++; | 103 | xx++; yy++; |
107 | } | 104 | } |
108 | yy -= 2; | 105 | yy -= 2; |
109 | for ( i=3; i<7; i++ ) { | 106 | for ( i=3; i<7; i++ ) { |
110 | a.setPoint( 2*i, xx, yy ); | 107 | a.setPoint( 2*i, xx, yy ); |
111 | a.setPoint( 2*i+1, xx, yy+2 ); | 108 | a.setPoint( 2*i+1, xx, yy+2 ); |
112 | xx++; yy--; | 109 | xx++; yy--; |
113 | } | 110 | } |
114 | if ( flags & Style_NoChange ) { | 111 | if ( flags & Style_NoChange ) { |
115 | p->setPen( mycg.dark() ); | 112 | p->setPen( mycg.dark() ); |
116 | } else { | 113 | } else { |
117 | p->setPen( mycg.text() ); | 114 | p->setPen( mycg.text() ); |
118 | } | 115 | } |
119 | p->drawLineSegments( a ); | 116 | p->drawLineSegments( a ); |
120 | } | 117 | } |
121 | break; | 118 | break; |
122 | } | 119 | } |
123 | case PE_ExclusiveIndicator: | 120 | case PE_ExclusiveIndicator: |
124 | { | 121 | { |
125 | static const QCOORD pts1[] = { // dark lines | 122 | static const QCOORD pts1[] = { // dark lines |
126 | 1,9, 1,8, 0,7, 0,4, 1,3, 1,2, 2,1, 3,1, 4,0, 7,0, 8,1, 9,1 }; | 123 | 1,9, 1,8, 0,7, 0,4, 1,3, 1,2, 2,1, 3,1, 4,0, 7,0, 8,1, 9,1 }; |
127 | static const QCOORD pts4[] = { // white lines | 124 | static const QCOORD pts4[] = { // white lines |
128 | 2,10, 3,10, 4,11, 7,11, 8,10, 9,10, 10,9, 10,8, 11,7, | 125 | 2,10, 3,10, 4,11, 7,11, 8,10, 9,10, 10,9, 10,8, 11,7, |
129 | 11,4, 10,3, 10,2 }; | 126 | 11,4, 10,3, 10,2 }; |
130 | static const QCOORD pts5[] = { // inner fill | 127 | static const QCOORD pts5[] = { // inner fill |
131 | 4,2, 7,2, 9,4, 9,7, 7,9, 4,9, 2,7, 2,4 }; | 128 | 4,2, 7,2, 9,4, 9,7, 7,9, 4,9, 2,7, 2,4 }; |
132 | 129 | ||
133 | int x, y, w, h; | 130 | int x, y, w, h; |
134 | r.rect( &x, &y, &w, &h ); | 131 | r.rect( &x, &y, &w, &h ); |
135 | p->eraseRect( x, y, w, h ); | 132 | p->eraseRect( x, y, w, h ); |
136 | QPointArray a( QCOORDARRLEN(pts1), pts1 ); | 133 | QPointArray a( QCOORDARRLEN(pts1), pts1 ); |
137 | a.translate( x, y ); | 134 | a.translate( x, y ); |
138 | p->setPen( cg.dark() ); | 135 | p->setPen( cg.dark() ); |
139 | p->drawPolyline( a ); | 136 | p->drawPolyline( a ); |
140 | a.setPoints( QCOORDARRLEN(pts4), pts4 ); | 137 | a.setPoints( QCOORDARRLEN(pts4), pts4 ); |
141 | a.translate( x, y ); | 138 | a.translate( x, y ); |
142 | p->setPen( cg.light() ); | 139 | p->setPen( cg.light() ); |
143 | p->drawPolyline( a ); | 140 | p->drawPolyline( a ); |
144 | a.setPoints( QCOORDARRLEN(pts5), pts5 ); | 141 | a.setPoints( QCOORDARRLEN(pts5), pts5 ); |
145 | a.translate( x, y ); | 142 | a.translate( x, y ); |
146 | QColor fillColor = ( flags&Style_Down || !(flags&Style_Enabled) ) ? cg.button() : cg.base(); | 143 | QColor fillColor = ( flags&Style_Down || !(flags&Style_Enabled) ) ? cg.button() : cg.base(); |
147 | p->setPen( fillColor ); | 144 | p->setPen( fillColor ); |
148 | p->setBrush( fillColor ) ; | 145 | p->setBrush( fillColor ) ; |
149 | p->drawPolygon( a ); | 146 | p->drawPolygon( a ); |
150 | if ( flags&Style_On ) { | 147 | if ( flags&Style_On ) { |
151 | p->setPen( NoPen ); | 148 | p->setPen( NoPen ); |
152 | p->setBrush( cg.text() ); | 149 | p->setBrush( cg.text() ); |
153 | p->drawRect( x+5, y+4, 2, 4 ); | 150 | p->drawRect( x+5, y+4, 2, 4 ); |
154 | p->drawRect( x+4, y+5, 4, 2 ); | 151 | p->drawRect( x+4, y+5, 4, 2 ); |
155 | } | 152 | } |
156 | break; | 153 | break; |
157 | } | 154 | } |
158 | default: | 155 | default: |
159 | QWindowsStyle::drawPrimitive( pe, p, r, cg, flags, data ); | 156 | QWindowsStyle::drawPrimitive( pe, p, r, cg, flags, data ); |
160 | break; | 157 | break; |
161 | } | 158 | } |
162 | } | 159 | } |
163 | 160 | ||
164 | void QPEStyle::drawControl( ControlElement ce, QPainter *p, | 161 | void QPEStyle::drawControl( ControlElement ce, QPainter *p, |
165 | const QWidget *widget, const QRect &r, | 162 | const QWidget *widget, const QRect &r, |
166 | const QColorGroup &cg, SFlags how, const QStyleOption &data) const | 163 | const QColorGroup &cg, SFlags how, const QStyleOption &data) const |
167 | { | 164 | { |
168 | switch ( ce ) { | 165 | switch ( ce ) { |
169 | case CE_PushButton: | 166 | case CE_PushButton: |
170 | { | 167 | { |
171 | const QPushButton *btn = (QPushButton*)widget; | 168 | const QPushButton *btn = (QPushButton*)widget; |
172 | SFlags flags; | 169 | SFlags flags; |
173 | flags = Style_Default; | 170 | flags = Style_Default; |
174 | if ( btn->isDown() ) | 171 | if ( btn->isDown() ) |
175 | flags |= Style_Down; | 172 | flags |= Style_Down; |
176 | if ( btn->isOn() ) | 173 | if ( btn->isOn() ) |
177 | flags |= Style_On; | 174 | flags |= Style_On; |
178 | if ( btn->isEnabled() ) | 175 | if ( btn->isEnabled() ) |
179 | flags |= Style_Enabled; | 176 | flags |= Style_Enabled; |
180 | if ( btn->isDefault() ) | 177 | if ( btn->isDefault() ) |
181 | flags |= Style_Default; | 178 | flags |= Style_Default; |
182 | if (! btn->isFlat() && !(flags & Style_Down)) | 179 | if (! btn->isFlat() && !(flags & Style_Down)) |
183 | flags |= Style_Raised; | 180 | flags |= Style_Raised; |
184 | p->setPen( cg.foreground() ); | 181 | p->setPen( cg.foreground() ); |
185 | p->setBrush( QBrush(cg.button(), NoBrush) ); | 182 | p->setBrush( QBrush(cg.button(), NoBrush) ); |
186 | QColorGroup mycg( cg ); | 183 | QColorGroup mycg( cg ); |
187 | if ( flags & Style_On ) { | 184 | if ( flags & Style_On ) { |
188 | QBrush fill = QBrush( cg.mid(), Dense4Pattern ); | 185 | QBrush fill = QBrush( cg.mid(), Dense4Pattern ); |
189 | mycg.setBrush( QColorGroup::Button, fill ); | 186 | mycg.setBrush( QColorGroup::Button, fill ); |
190 | } | 187 | } |
191 | drawPrimitive( PE_ButtonBevel, p, r, mycg, flags, data ); | 188 | drawPrimitive( PE_ButtonBevel, p, r, mycg, flags, data ); |
192 | break; | 189 | break; |
193 | } | 190 | } |
194 | case CE_TabBarTab: | 191 | case CE_TabBarTab: |
195 | { | 192 | { |
196 | if ( !widget || !widget->parentWidget() ) | 193 | if ( !widget || !widget->parentWidget() ) |
197 | break; | 194 | break; |
198 | 195 | ||
199 | const QTabBar *tb = (const QTabBar *) widget; | 196 | const QTabBar *tb = (const QTabBar *) widget; |
200 | bool selected = how & Style_Selected; | 197 | bool selected = how & Style_Selected; |
201 | 198 | ||
202 | QRect r2(r); | 199 | QRect r2(r); |
203 | if ( tb->shape() == QTabBar::RoundedAbove ) { | 200 | if ( tb->shape() == QTabBar::RoundedAbove ) { |
204 | p->setPen( cg.light() ); | 201 | p->setPen( cg.light() ); |
205 | p->drawLine( r2.left(), r2.bottom(), r2.right(), r2.bottom() ); | 202 | p->drawLine( r2.left(), r2.bottom(), r2.right(), r2.bottom() ); |
206 | if ( r2.left() == 0 ) | 203 | if ( r2.left() == 0 ) |
207 | p->drawPoint( tb->rect().bottomLeft() ); | 204 | p->drawPoint( tb->rect().bottomLeft() ); |
208 | else { | 205 | else { |
209 | p->setPen( cg.light() ); | 206 | p->setPen( cg.light() ); |
210 | p->drawLine( r2.left(), r2.bottom(), r2.right(), r2.bottom() ); | 207 | p->drawLine( r2.left(), r2.bottom(), r2.right(), r2.bottom() ); |
211 | } | 208 | } |
212 | 209 | ||
213 | if ( selected ) { | 210 | if ( selected ) { |
214 | p->setPen( cg.background() ); | 211 | p->setPen( cg.background() ); |
215 | p->drawLine( r2.left()+2, r2.top()+1, r2.right()-2, r2.top()+1 ); | 212 | p->drawLine( r2.left()+2, r2.top()+1, r2.right()-2, r2.top()+1 ); |
216 | p->fillRect( QRect( r2.left()+1, r2.top()+2, r2.width()-2, r2.height()-2), | 213 | p->fillRect( QRect( r2.left()+1, r2.top()+2, r2.width()-2, r2.height()-2), |
217 | cg.brush( QColorGroup::Background )); | 214 | cg.brush( QColorGroup::Background )); |
218 | } else { | 215 | } else { |
219 | r2.setRect( r2.left() + 2, r2.top() + 2, | 216 | r2.setRect( r2.left() + 2, r2.top() + 2, |
220 | r2.width() - 4, r2.height() - 2 ); | 217 | r2.width() - 4, r2.height() - 2 ); |
221 | p->setPen( cg.button() ); | 218 | p->setPen( cg.button() ); |
222 | p->drawLine( r2.left()+2, r2.top()+1, r2.right()-2, r2.top()+1 ); | 219 | p->drawLine( r2.left()+2, r2.top()+1, r2.right()-2, r2.top()+1 ); |
223 | p->fillRect( QRect( r2.left()+1, r2.top()+2, r2.width()-2, r2.height()-3), | 220 | p->fillRect( QRect( r2.left()+1, r2.top()+2, r2.width()-2, r2.height()-3), |
224 | cg.brush( QColorGroup::Button )); | 221 | cg.brush( QColorGroup::Button )); |
225 | 222 | ||
226 | //do shading; will not work for pixmap brushes | 223 | //do shading; will not work for pixmap brushes |
227 | QColor bg = cg.button(); | 224 | QColor bg = cg.button(); |
228 | // int h,s,v; | 225 | // int h,s,v; |
229 | // bg.hsv( &h, &s, &v ); | 226 | // bg.hsv( &h, &s, &v ); |
230 | int n = r2.height()/2; | 227 | int n = r2.height()/2; |
231 | int dark = 100; | 228 | int dark = 100; |
232 | for ( int i = 1; i < n; i++ ) { | 229 | for ( int i = 1; i < n; i++ ) { |
233 | dark = (dark * (100+(i*15)/n) )/100; | 230 | dark = (dark * (100+(i*15)/n) )/100; |
234 | p->setPen( bg.dark( dark ) ); | 231 | p->setPen( bg.dark( dark ) ); |
235 | int y = r2.bottom()-n+i; | 232 | int y = r2.bottom()-n+i; |
236 | int x1 = r2.left()+1; | 233 | int x1 = r2.left()+1; |
237 | int x2 = r2.right()-1; | 234 | int x2 = r2.right()-1; |
238 | p->drawLine( x1, y, x2, y ); | 235 | p->drawLine( x1, y, x2, y ); |
239 | } | 236 | } |
240 | } | 237 | } |
241 | 238 | ||
242 | p->setPen( cg.light() ); | 239 | p->setPen( cg.light() ); |
243 | p->drawLine( r2.left(), r2.bottom()-1, r2.left(), r2.top() + 2 ); | 240 | p->drawLine( r2.left(), r2.bottom()-1, r2.left(), r2.top() + 2 ); |
244 | p->drawPoint( r2.left()+1, r2.top() + 1 ); | 241 | p->drawPoint( r2.left()+1, r2.top() + 1 ); |
245 | p->drawLine( r2.left()+2, r2.top(), | 242 | p->drawLine( r2.left()+2, r2.top(), |
246 | r2.right() - 2, r2.top() ); | 243 | r2.right() - 2, r2.top() ); |
247 | 244 | ||
248 | p->setPen( cg.dark() ); | 245 | p->setPen( cg.dark() ); |
249 | p->drawPoint( r2.right() - 1, r2.top() + 1 ); | 246 | p->drawPoint( r2.right() - 1, r2.top() + 1 ); |
250 | p->drawLine( r2.right(), r2.top() + 2, r2.right(), r2.bottom() - 1); | 247 | p->drawLine( r2.right(), r2.top() + 2, r2.right(), r2.bottom() - 1); |
251 | } else if ( tb->shape() == QTabBar::RoundedBelow ) { | 248 | } else if ( tb->shape() == QTabBar::RoundedBelow ) { |
252 | if ( selected ) { | 249 | if ( selected ) { |
253 | p->setPen( cg.background() ); | 250 | p->setPen( cg.background() ); |
254 | p->drawLine( r2.left()+2, r2.bottom()-1, r2.right()-2, r2.bottom()-1 ); | 251 | p->drawLine( r2.left()+2, r2.bottom()-1, r2.right()-2, r2.bottom()-1 ); |
255 | p->fillRect( QRect( r2.left()+1, r2.top(), r2.width()-2, r2.height()-2), | 252 | p->fillRect( QRect( r2.left()+1, r2.top(), r2.width()-2, r2.height()-2), |
256 | tb->palette().normal().brush( QColorGroup::Background )); | 253 | tb->palette().normal().brush( QColorGroup::Background )); |
257 | } else { | 254 | } else { |
258 | p->setPen( cg.dark() ); | 255 | p->setPen( cg.dark() ); |
259 | p->drawLine( r2.left(), r2.top(), | 256 | p->drawLine( r2.left(), r2.top(), |
260 | r2.right(), r2.top() ); | 257 | r2.right(), r2.top() ); |
261 | r2.setRect( r2.left() + 2, r2.top(), | 258 | r2.setRect( r2.left() + 2, r2.top(), |
262 | r2.width() - 4, r2.height() - 2 ); | 259 | r2.width() - 4, r2.height() - 2 ); |
263 | p->setPen( cg.button() ); | 260 | p->setPen( cg.button() ); |
264 | p->drawLine( r2.left()+2, r2.bottom()-1, r2.right()-2, r2.bottom()-1 ); | 261 | p->drawLine( r2.left()+2, r2.bottom()-1, r2.right()-2, r2.bottom()-1 ); |
265 | p->fillRect( QRect( r2.left()+1, r2.top()+1, r2.width()-2, r2.height()-3), | 262 | p->fillRect( QRect( r2.left()+1, r2.top()+1, r2.width()-2, r2.height()-3), |
266 | tb->palette().normal().brush( QColorGroup::Button )); | 263 | tb->palette().normal().brush( QColorGroup::Button )); |
267 | } | 264 | } |
268 | 265 | ||
269 | p->setPen( cg.dark() ); | 266 | p->setPen( cg.dark() ); |
270 | p->drawLine( r2.right(), r2.top(), | 267 | p->drawLine( r2.right(), r2.top(), |
271 | r2.right(), r2.bottom() - 2 ); | 268 | r2.right(), r2.bottom() - 2 ); |
272 | p->drawPoint( r2.right() - 1, r2.bottom() - 1 ); | 269 | p->drawPoint( r2.right() - 1, r2.bottom() - 1 ); |
273 | p->drawLine( r2.right() - 2, r2.bottom(), | 270 | p->drawLine( r2.right() - 2, r2.bottom(), |
274 | r2.left() + 2, r2.bottom() ); | 271 | r2.left() + 2, r2.bottom() ); |
275 | 272 | ||
276 | p->setPen( cg.light() ); | 273 | p->setPen( cg.light() ); |
277 | p->drawLine( r2.left(), r2.top()+1, | 274 | p->drawLine( r2.left(), r2.top()+1, |
278 | r2.left(), r2.bottom() - 2 ); | 275 | r2.left(), r2.bottom() - 2 ); |
279 | p->drawPoint( r2.left() + 1, r2.bottom() - 1 ); | 276 | p->drawPoint( r2.left() + 1, r2.bottom() - 1 ); |
280 | if ( r2.left() == 0 ) | 277 | if ( r2.left() == 0 ) |
281 | p->drawPoint( tb->rect().topLeft() ); | 278 | p->drawPoint( tb->rect().topLeft() ); |
282 | 279 | ||
283 | } else { | 280 | } else { |
284 | QCommonStyle::drawControl( ce, p, widget, r, cg, how, data ); | 281 | QCommonStyle::drawControl( ce, p, widget, r, cg, how, data ); |
285 | } | 282 | } |
286 | break; | 283 | break; |
287 | } | 284 | } |
288 | default: | 285 | default: |
289 | QWindowsStyle::drawControl( ce, p, widget, r, cg, how, data ); | 286 | QWindowsStyle::drawControl( ce, p, widget, r, cg, how, data ); |
290 | break; | 287 | break; |
291 | } | 288 | } |
292 | } | 289 | } |
293 | 290 | ||
294 | void QPEStyle::drawComplexControl( ComplexControl control, QPainter *p, | 291 | void QPEStyle::drawComplexControl( ComplexControl control, QPainter *p, |
295 | const QWidget *widget, const QRect &r, | 292 | const QWidget *widget, const QRect &r, |
296 | const QColorGroup &cg, SFlags how, | 293 | const QColorGroup &cg, SFlags how, |
297 | SCFlags sub, SCFlags subActive, const QStyleOption &data) const | 294 | SCFlags sub, SCFlags subActive, const QStyleOption &data) const |
298 | { | 295 | { |
299 | switch ( control ) { | 296 | switch ( control ) { |
300 | case CC_ComboBox: | 297 | case CC_ComboBox: |
301 | if ( sub & SC_ComboBoxArrow ) { | 298 | if ( sub & SC_ComboBoxArrow ) { |
302 | SFlags flags = Style_Default; | 299 | SFlags flags = Style_Default; |
303 | 300 | ||
304 | drawPrimitive( PE_ButtonBevel, p, r, cg, flags, data ); | 301 | drawPrimitive( PE_ButtonBevel, p, r, cg, flags, data ); |
305 | 302 | ||
306 | QRect ar = | 303 | QRect ar = |
307 | QStyle::visualRect( querySubControlMetrics( CC_ComboBox, widget, | 304 | QStyle::visualRect( querySubControlMetrics( CC_ComboBox, widget, |
308 | SC_ComboBoxArrow ), widget ); | 305 | SC_ComboBoxArrow ), widget ); |
309 | 306 | ||
310 | if ( subActive == SC_ComboBoxArrow ) { | 307 | if ( subActive == SC_ComboBoxArrow ) { |
311 | p->setPen( cg.dark() ); | 308 | p->setPen( cg.dark() ); |
312 | p->setBrush( cg.brush( QColorGroup::Button ) ); | 309 | p->setBrush( cg.brush( QColorGroup::Button ) ); |
313 | p->drawRect( ar ); | 310 | p->drawRect( ar ); |
314 | } | 311 | } |
315 | 312 | ||
316 | ar.addCoords( 2, 2, -2, -2 ); | 313 | ar.addCoords( 2, 2, -2, -2 ); |
317 | if ( widget->isEnabled() ) | 314 | if ( widget->isEnabled() ) |
318 | flags |= Style_Enabled; | 315 | flags |= Style_Enabled; |
319 | 316 | ||
320 | if ( subActive & Style_Sunken ) { | 317 | if ( subActive & Style_Sunken ) { |
321 | flags |= Style_Sunken; | 318 | flags |= Style_Sunken; |
322 | } | 319 | } |
323 | drawPrimitive( PE_ArrowDown, p, ar, cg, flags ); | 320 | drawPrimitive( PE_ArrowDown, p, ar, cg, flags ); |
324 | } | 321 | } |
325 | 322 | ||
326 | if ( sub & SC_ComboBoxEditField ) { | 323 | if ( sub & SC_ComboBoxEditField ) { |
327 | const QComboBox * cb = (const QComboBox *) widget; | 324 | const QComboBox * cb = (const QComboBox *) widget; |
328 | QRect re = | 325 | QRect re = |
329 | QStyle::visualRect( querySubControlMetrics( CC_ComboBox, widget, | 326 | QStyle::visualRect( querySubControlMetrics( CC_ComboBox, widget, |
330 | SC_ComboBoxEditField ), widget ); | 327 | SC_ComboBoxEditField ), widget ); |
331 | if ( cb->hasFocus() && !cb->editable() ) | 328 | if ( cb->hasFocus() && !cb->editable() ) |
332 | p->fillRect( re.x(), re.y(), re.width(), re.height(), | 329 | p->fillRect( re.x(), re.y(), re.width(), re.height(), |
333 | cg.brush( QColorGroup::Highlight ) ); | 330 | cg.brush( QColorGroup::Highlight ) ); |
334 | 331 | ||
335 | if ( cb->hasFocus() ) { | 332 | if ( cb->hasFocus() ) { |
336 | p->setPen( cg.highlightedText() ); | 333 | p->setPen( cg.highlightedText() ); |
337 | p->setBackgroundColor( cg.highlight() ); | 334 | p->setBackgroundColor( cg.highlight() ); |
338 | 335 | ||
339 | } else { | 336 | } else { |
340 | p->setPen( cg.text() ); | 337 | p->setPen( cg.text() ); |
341 | p->setBackgroundColor( cg.background() ); | 338 | p->setBackgroundColor( cg.background() ); |
342 | } | 339 | } |
343 | 340 | ||
344 | if ( cb->hasFocus() && !cb->editable() ) { | 341 | if ( cb->hasFocus() && !cb->editable() ) { |
345 | QRect re = | 342 | QRect re = |
346 | QStyle::visualRect( subRect( SR_ComboBoxFocusRect, cb ), widget ); | 343 | QStyle::visualRect( subRect( SR_ComboBoxFocusRect, cb ), widget ); |
347 | drawPrimitive( PE_FocusRect, p, re, cg, Style_FocusAtBorder, QStyleOption(cg.highlight())); | 344 | drawPrimitive( PE_FocusRect, p, re, cg, Style_FocusAtBorder, QStyleOption(cg.highlight())); |
348 | } | 345 | } |
349 | } | 346 | } |
350 | break; | 347 | break; |
351 | default: | 348 | default: |
352 | QWindowsStyle::drawComplexControl( control, p, widget, r, cg, how, | 349 | QWindowsStyle::drawComplexControl( control, p, widget, r, cg, how, |
353 | sub, subActive, data ); | 350 | sub, subActive, data ); |
354 | break; | 351 | break; |
355 | } | 352 | } |
356 | } | 353 | } |
357 | 354 | ||
358 | int QPEStyle::pixelMetric( PixelMetric metric, const QWidget *widget ) const | 355 | int QPEStyle::pixelMetric( PixelMetric metric, const QWidget *widget ) const |
359 | { | 356 | { |
360 | int ret; | 357 | int ret; |
361 | switch( metric ) { | 358 | switch( metric ) { |
362 | case PM_ButtonMargin: | 359 | case PM_ButtonMargin: |
363 | ret = 2; | 360 | ret = 2; |
364 | break; | 361 | break; |
365 | case PM_DefaultFrameWidth: | 362 | case PM_DefaultFrameWidth: |
366 | ret = 1; | 363 | ret = 1; |
367 | break; | 364 | break; |
368 | case PM_ButtonDefaultIndicator: | 365 | case PM_ButtonDefaultIndicator: |
369 | ret = 2; | 366 | ret = 2; |
370 | break; | 367 | break; |
371 | case PM_ButtonShiftHorizontal: | 368 | case PM_ButtonShiftHorizontal: |
372 | case PM_ButtonShiftVertical: | 369 | case PM_ButtonShiftVertical: |
373 | ret = -1; | 370 | ret = -1; |
374 | break; | 371 | break; |
375 | case PM_IndicatorWidth: | 372 | case PM_IndicatorWidth: |
376 | ret = 15; | 373 | ret = 15; |
377 | break; | 374 | break; |
378 | case PM_IndicatorHeight: | 375 | case PM_IndicatorHeight: |
379 | ret = 13; | 376 | ret = 13; |
380 | break; | 377 | break; |
381 | case PM_ExclusiveIndicatorHeight: | 378 | case PM_ExclusiveIndicatorHeight: |
382 | case PM_ExclusiveIndicatorWidth: | 379 | case PM_ExclusiveIndicatorWidth: |
383 | ret = 15; | 380 | ret = 15; |
384 | break; | 381 | break; |
385 | case PM_ScrollBarExtent: | 382 | case PM_ScrollBarExtent: |
386 | ret = 13; | 383 | ret = 13; |
387 | break; | 384 | break; |
388 | case PM_SliderLength: | 385 | case PM_SliderLength: |
389 | ret = 12; | 386 | ret = 12; |
390 | break; | 387 | break; |
391 | default: | 388 | default: |
392 | ret = QWindowsStyle::pixelMetric( metric, widget ); | 389 | ret = QWindowsStyle::pixelMetric( metric, widget ); |
393 | break; | 390 | break; |
394 | } | 391 | } |
395 | return ret; | 392 | return ret; |
396 | } | 393 | } |
397 | 394 | ||
398 | QSize QPEStyle::sizeFromContents( ContentsType contents, const QWidget *widget, | 395 | QSize QPEStyle::sizeFromContents( ContentsType contents, const QWidget *widget, |
399 | const QSize &contentsSize, const QStyleOption &data) const | 396 | const QSize &contentsSize, const QStyleOption &data) const |
400 | { | 397 | { |
401 | QSize sz(contentsSize); | 398 | QSize sz(contentsSize); |
402 | 399 | ||
403 | switch ( contents ) { | 400 | switch ( contents ) { |
404 | case CT_PopupMenuItem: | 401 | case CT_PopupMenuItem: |
405 | { | 402 | { |
406 | if ( !widget || data.isDefault() ) | 403 | if ( !widget || data.isDefault() ) |
407 | break; | 404 | break; |
408 | sz = QWindowsStyle::sizeFromContents( contents, widget, contentsSize, data ); | 405 | sz = QWindowsStyle::sizeFromContents( contents, widget, contentsSize, data ); |
409 | sz = QSize( sz.width(), sz.height()-2 ); | 406 | sz = QSize( sz.width(), sz.height()-2 ); |
diff --git a/library/qpetoolbar.cpp b/library/qpetoolbar.cpp index 7f95eda..bd2c9b7 100644 --- a/library/qpetoolbar.cpp +++ b/library/qpetoolbar.cpp | |||
@@ -1,52 +1,50 @@ | |||
1 | /********************************************************************** | 1 | /********************************************************************** |
2 | ** Copyright (C) 2001 Trolltech AS. All rights reserved. | 2 | ** Copyright (C) 2001 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 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 | 20 | ||
21 | #include "qpetoolbar.h" | 21 | #include "qpetoolbar.h" |
22 | #include "qpemenubar.h" | ||
23 | #include <qtoolbutton.h> | ||
24 | 22 | ||
25 | /*! | 23 | /*! |
26 | \class QPEToolBar qpemenubar.h | 24 | \class QPEToolBar qpemenubar.h |
27 | \brief The QPEToolBar class is obsolete. Use QToolBar instead. | 25 | \brief The QPEToolBar class is obsolete. Use QToolBar instead. |
28 | 26 | ||
29 | \obsolete | 27 | \obsolete |
30 | 28 | ||
31 | The QPEToolBar class is obsolete. Use QToolBar instead. | 29 | The QPEToolBar class is obsolete. Use QToolBar instead. |
32 | 30 | ||
33 | \sa QToolBar | 31 | \sa QToolBar |
34 | */ | 32 | */ |
35 | 33 | ||
36 | /*! | 34 | /*! |
37 | Constructs a QPEToolBar just as you would construct | 35 | Constructs a QPEToolBar just as you would construct |
38 | a QToolBar, passing \a parent and \a name. | 36 | a QToolBar, passing \a parent and \a name. |
39 | */ | 37 | */ |
40 | QPEToolBar::QPEToolBar( QMainWindow *parent, const char *name ) | 38 | QPEToolBar::QPEToolBar( QMainWindow *parent, const char *name ) |
41 | : QToolBar( parent, name ) | 39 | : QToolBar( parent, name ) |
42 | { | 40 | { |
43 | } | 41 | } |
44 | 42 | ||
45 | /*! | 43 | /*! |
46 | \internal | 44 | \internal |
47 | */ | 45 | */ |
48 | void QPEToolBar::childEvent( QChildEvent *e ) | 46 | void QPEToolBar::childEvent( QChildEvent *e ) |
49 | { | 47 | { |
50 | QToolBar::childEvent( e ); | 48 | QToolBar::childEvent( e ); |
51 | } | 49 | } |
52 | 50 | ||
diff --git a/library/qt_override.cpp b/library/qt_override.cpp index df5a419..4d1f475 100644 --- a/library/qt_override.cpp +++ b/library/qt_override.cpp | |||
@@ -1,177 +1,175 @@ | |||
1 | 1 | ||
2 | #include <qpe/qpeapplication.h> | 2 | #include <qpe/qpeapplication.h> |
3 | #include <qwsdecoration_qws.h> | ||
4 | #include <qcommonstyle.h> | ||
5 | #include <qfontdatabase.h> | 3 | #include <qfontdatabase.h> |
6 | 4 | ||
7 | #include <unistd.h> | 5 | #include <unistd.h> |
8 | #include <stdlib.h> | 6 | #include <stdlib.h> |
9 | #include <stdio.h> | 7 | #include <stdio.h> |
10 | #include <limits.h> | 8 | #include <limits.h> |
11 | #include <sys/param.h> // for toolchains with old libc headers | 9 | #include <sys/param.h> // for toolchains with old libc headers |
12 | 10 | ||
13 | #include "qt_override_p.h" | 11 | #include "qt_override_p.h" |
14 | 12 | ||
15 | #if QT_VERSION > 233 | 13 | #if QT_VERSION > 233 |
16 | 14 | ||
17 | struct color_fix_t { | 15 | struct color_fix_t { |
18 | char *m_app; | 16 | char *m_app; |
19 | char *m_class; | 17 | char *m_class; |
20 | char *m_name; | 18 | char *m_name; |
21 | QColorGroup::ColorRole m_set; | 19 | QColorGroup::ColorRole m_set; |
22 | QColorGroup::ColorRole m_get; | 20 | QColorGroup::ColorRole m_get; |
23 | }; | 21 | }; |
24 | 22 | ||
25 | #ifndef OPIE_NO_OVERRIDE_QT | 23 | #ifndef OPIE_NO_OVERRIDE_QT |
26 | 24 | ||
27 | static const color_fix_t apps_that_need_special_colors [] = { | 25 | static const color_fix_t apps_that_need_special_colors [] = { |
28 | { "HancomMobileWord", "HTextEdit", 0, QColorGroup::Background, QColorGroup::Base }, | 26 | { "HancomMobileWord", "HTextEdit", 0, QColorGroup::Background, QColorGroup::Base }, |
29 | { "neocal", "Display", 0, QColorGroup::Background, QColorGroup::Base }, | 27 | { "neocal", "Display", 0, QColorGroup::Background, QColorGroup::Base }, |
30 | 28 | ||
31 | { 0, 0, 0, QColorGroup::Base, QColorGroup::Base } | 29 | { 0, 0, 0, QColorGroup::Base, QColorGroup::Base } |
32 | }; | 30 | }; |
33 | 31 | ||
34 | static const char * const apps_that_need_pointsizes_times_10 [] = { | 32 | static const char * const apps_that_need_pointsizes_times_10 [] = { |
35 | "HancomMobileWord", | 33 | "HancomMobileWord", |
36 | "hancomsheet", | 34 | "hancomsheet", |
37 | "HancomPresenterViewer", | 35 | "HancomPresenterViewer", |
38 | 36 | ||
39 | 0 | 37 | 0 |
40 | }; | 38 | }; |
41 | 39 | ||
42 | 40 | ||
43 | 41 | ||
44 | 42 | ||
45 | int Opie::force_appearance = 0; | 43 | int Opie::force_appearance = 0; |
46 | 44 | ||
47 | 45 | ||
48 | // Return the *real* name of the binary - not just a quick guess | 46 | // Return the *real* name of the binary - not just a quick guess |
49 | // by looking at argv [0] (which could be anything) | 47 | // by looking at argv [0] (which could be anything) |
50 | 48 | ||
51 | static void binaryNameFree ( ) | 49 | static void binaryNameFree ( ) |
52 | { | 50 | { |
53 | ::free ((void *) Opie::binaryName ( )); // we need to cast away the const here | 51 | ::free ((void *) Opie::binaryName ( )); // we need to cast away the const here |
54 | } | 52 | } |
55 | 53 | ||
56 | const char *Opie::binaryName ( ) | 54 | const char *Opie::binaryName ( ) |
57 | { | 55 | { |
58 | static const char *appname = 0; | 56 | static const char *appname = 0; |
59 | 57 | ||
60 | if ( !appname ) { | 58 | if ( !appname ) { |
61 | char dst [PATH_MAX + 1]; | 59 | char dst [PATH_MAX + 1]; |
62 | int l = ::readlink ( "/proc/self/exe", dst, PATH_MAX ); | 60 | int l = ::readlink ( "/proc/self/exe", dst, PATH_MAX ); |
63 | 61 | ||
64 | if ( l <= 0 ) | 62 | if ( l <= 0 ) |
65 | l = 0; | 63 | l = 0; |
66 | 64 | ||
67 | dst [l] = 0; | 65 | dst [l] = 0; |
68 | const char *b = ::strrchr ( dst, '/' ); | 66 | const char *b = ::strrchr ( dst, '/' ); |
69 | appname = ::strdup ( b ? b + 1 : dst ); | 67 | appname = ::strdup ( b ? b + 1 : dst ); |
70 | 68 | ||
71 | ::atexit ( binaryNameFree ); | 69 | ::atexit ( binaryNameFree ); |
72 | } | 70 | } |
73 | return appname; | 71 | return appname; |
74 | } | 72 | } |
75 | 73 | ||
76 | #else | 74 | #else |
77 | int Opie::force_appearance = 0; | 75 | int Opie::force_appearance = 0; |
78 | #endif | 76 | #endif |
79 | 77 | ||
80 | // Fix for a toolchain incompatibility (binaries compiled with | 78 | // Fix for a toolchain incompatibility (binaries compiled with |
81 | // old tcs using shared libs compiled with newer tcs) | 79 | // old tcs using shared libs compiled with newer tcs) |
82 | 80 | ||
83 | extern "C" { | 81 | extern "C" { |
84 | 82 | ||
85 | extern void __gmon_start__ ( ) __attribute__(( weak )); | 83 | extern void __gmon_start__ ( ) __attribute__(( weak )); |
86 | 84 | ||
87 | extern void __gmon_start__ ( ) | 85 | extern void __gmon_start__ ( ) |
88 | { | 86 | { |
89 | } | 87 | } |
90 | 88 | ||
91 | } | 89 | } |
92 | 90 | ||
93 | 91 | ||
94 | // Fix for apps, that use QPainter::eraseRect() which doesn't work with styles | 92 | // Fix for apps, that use QPainter::eraseRect() which doesn't work with styles |
95 | // that set a background pixmap (it would be easier to fix eraseRect(), but | 93 | // that set a background pixmap (it would be easier to fix eraseRect(), but |
96 | // TT made it an inline ...) | 94 | // TT made it an inline ...) |
97 | 95 | ||
98 | void QPEApplication::polish ( QWidget *w ) | 96 | void QPEApplication::polish ( QWidget *w ) |
99 | { | 97 | { |
100 | #ifndef OPIE_NO_OVERRIDE_QT | 98 | #ifndef OPIE_NO_OVERRIDE_QT |
101 | //qDebug ( "QPEApplication::polish()" ); | 99 | //qDebug ( "QPEApplication::polish()" ); |
102 | 100 | ||
103 | for ( const color_fix_t *ptr = apps_that_need_special_colors; ptr-> m_app; ptr++ ) { | 101 | for ( const color_fix_t *ptr = apps_that_need_special_colors; ptr-> m_app; ptr++ ) { |
104 | if (( ::strcmp ( Opie::binaryName ( ), ptr-> m_app ) == 0 ) && | 102 | if (( ::strcmp ( Opie::binaryName ( ), ptr-> m_app ) == 0 ) && |
105 | ( ptr-> m_class ? w-> inherits ( ptr-> m_class ) : true ) && | 103 | ( ptr-> m_class ? w-> inherits ( ptr-> m_class ) : true ) && |
106 | ( ptr-> m_name ? ( ::strcmp ( w-> name ( ), ptr-> m_name ) == 0 ) : true )) { | 104 | ( ptr-> m_name ? ( ::strcmp ( w-> name ( ), ptr-> m_name ) == 0 ) : true )) { |
107 | QPalette pal = w-> palette ( ); | 105 | QPalette pal = w-> palette ( ); |
108 | pal. setColor ( ptr-> m_set, pal. color ( QPalette::Active, ptr-> m_get )); | 106 | pal. setColor ( ptr-> m_set, pal. color ( QPalette::Active, ptr-> m_get )); |
109 | w-> setPalette ( pal ); | 107 | w-> setPalette ( pal ); |
110 | } | 108 | } |
111 | } | 109 | } |
112 | #endif | 110 | #endif |
113 | QApplication::polish ( w ); | 111 | QApplication::polish ( w ); |
114 | } | 112 | } |
115 | 113 | ||
116 | 114 | ||
117 | #ifndef OPIE_NO_OVERRIDE_QT | 115 | #ifndef OPIE_NO_OVERRIDE_QT |
118 | // Fix for the binary incompatibility that TT introduced in Qt/E 2.3.4 -- point sizes | 116 | // Fix for the binary incompatibility that TT introduced in Qt/E 2.3.4 -- point sizes |
119 | // were multiplied by 10 (which was incorrect) | 117 | // were multiplied by 10 (which was incorrect) |
120 | 118 | ||
121 | QValueList <int> QFontDatabase::pointSizes ( QString const &family, QString const &style, QString const &charset ) | 119 | QValueList <int> QFontDatabase::pointSizes ( QString const &family, QString const &style, QString const &charset ) |
122 | { | 120 | { |
123 | //qDebug ( "QFontDatabase::pointSizes()" ); | 121 | //qDebug ( "QFontDatabase::pointSizes()" ); |
124 | 122 | ||
125 | QValueList <int> sl = pointSizes_NonWeak ( family, style, charset ); | 123 | QValueList <int> sl = pointSizes_NonWeak ( family, style, charset ); |
126 | 124 | ||
127 | for ( const char * const *ptr = apps_that_need_pointsizes_times_10; *ptr; ptr++ ) { | 125 | for ( const char * const *ptr = apps_that_need_pointsizes_times_10; *ptr; ptr++ ) { |
128 | if ( ::strcmp ( Opie::binaryName ( ), *ptr ) == 0 ) { | 126 | if ( ::strcmp ( Opie::binaryName ( ), *ptr ) == 0 ) { |
129 | for ( QValueList <int>::Iterator it = sl. begin ( ); it != sl. end ( ); ++it ) | 127 | for ( QValueList <int>::Iterator it = sl. begin ( ); it != sl. end ( ); ++it ) |
130 | *it *= 10; | 128 | *it *= 10; |
131 | } | 129 | } |
132 | } | 130 | } |
133 | return sl; | 131 | return sl; |
134 | } | 132 | } |
135 | 133 | ||
136 | 134 | ||
137 | // Various style/font/color related overrides for weak symbols in Qt/E, | 135 | // Various style/font/color related overrides for weak symbols in Qt/E, |
138 | // which allows us to force the usage of the global Opie appearance. | 136 | // which allows us to force the usage of the global Opie appearance. |
139 | 137 | ||
140 | void QApplication::setStyle ( QStyle *style ) | 138 | void QApplication::setStyle ( QStyle *style ) |
141 | { | 139 | { |
142 | //qDebug ( "QApplication::setStyle()" ); | 140 | //qDebug ( "QApplication::setStyle()" ); |
143 | 141 | ||
144 | if ( Opie::force_appearance & Opie::Force_Style ) | 142 | if ( Opie::force_appearance & Opie::Force_Style ) |
145 | delete style; | 143 | delete style; |
146 | else | 144 | else |
147 | QApplication::setStyle_NonWeak ( style ); | 145 | QApplication::setStyle_NonWeak ( style ); |
148 | } | 146 | } |
149 | 147 | ||
150 | void QApplication::setPalette ( const QPalette &pal, bool informWidgets, const char *className ) | 148 | void QApplication::setPalette ( const QPalette &pal, bool informWidgets, const char *className ) |
151 | { | 149 | { |
152 | //qDebug ( "QApplication::setPalette()" ); | 150 | //qDebug ( "QApplication::setPalette()" ); |
153 | 151 | ||
154 | if (!( Opie::force_appearance & Opie::Force_Style )) | 152 | if (!( Opie::force_appearance & Opie::Force_Style )) |
155 | QApplication::setPalette_NonWeak ( pal, informWidgets, className ); | 153 | QApplication::setPalette_NonWeak ( pal, informWidgets, className ); |
156 | } | 154 | } |
157 | 155 | ||
158 | void QApplication::setFont ( const QFont &fnt, bool informWidgets, const char *className ) | 156 | void QApplication::setFont ( const QFont &fnt, bool informWidgets, const char *className ) |
159 | { | 157 | { |
160 | //qDebug ( "QApplication::setFont()" ); | 158 | //qDebug ( "QApplication::setFont()" ); |
161 | 159 | ||
162 | if (!( Opie::force_appearance & Opie::Force_Font )) | 160 | if (!( Opie::force_appearance & Opie::Force_Font )) |
163 | QApplication::setFont_NonWeak ( fnt, informWidgets, className ); | 161 | QApplication::setFont_NonWeak ( fnt, informWidgets, className ); |
164 | } | 162 | } |
165 | 163 | ||
166 | 164 | ||
167 | void QApplication::qwsSetDecoration ( QWSDecoration *deco ) | 165 | void QApplication::qwsSetDecoration ( QWSDecoration *deco ) |
168 | { | 166 | { |
169 | //qDebug ( "QApplication::qwsSetDecoration()" ); | 167 | //qDebug ( "QApplication::qwsSetDecoration()" ); |
170 | 168 | ||
171 | if ( Opie::force_appearance & Opie::Force_Decoration ) | 169 | if ( Opie::force_appearance & Opie::Force_Decoration ) |
172 | delete deco; | 170 | delete deco; |
173 | else | 171 | else |
174 | QApplication::qwsSetDecoration_NonWeak ( deco ); | 172 | QApplication::qwsSetDecoration_NonWeak ( deco ); |
175 | } | 173 | } |
176 | #endif | 174 | #endif |
177 | #endif | 175 | #endif |
diff --git a/library/resource.cpp b/library/resource.cpp index f70658d..cfa0d26 100644 --- a/library/resource.cpp +++ b/library/resource.cpp | |||
@@ -1,233 +1,230 @@ | |||
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 | 20 | ||
21 | #define QTOPIA_INTERNAL_MIMEEXT | 21 | #define QTOPIA_INTERNAL_MIMEEXT |
22 | #include <qpe/qpeapplication.h> | 22 | #include <qpe/qpeapplication.h> |
23 | #include "resource.h" | 23 | #include "resource.h" |
24 | #include "mimetype.h" | 24 | #include "mimetype.h" |
25 | #include <qdir.h> | 25 | #include <qdir.h> |
26 | #include <qfile.h> | ||
27 | #include <qregexp.h> | ||
28 | #include <qpixmapcache.h> | 26 | #include <qpixmapcache.h> |
29 | #include <qpainter.h> | ||
30 | 27 | ||
31 | // this namespace is just a workaround for a gcc bug | 28 | // this namespace is just a workaround for a gcc bug |
32 | // gcc exports inline functions in the generated file | 29 | // gcc exports inline functions in the generated file |
33 | // inlinepics_p.h | 30 | // inlinepics_p.h |
34 | 31 | ||
35 | namespace { | 32 | namespace { |
36 | #include "inlinepics_p.h" | 33 | #include "inlinepics_p.h" |
37 | } | 34 | } |
38 | 35 | ||
39 | static bool g_notUseSet = ::getenv("OVERWRITE_ICON_SET"); | 36 | static bool g_notUseSet = ::getenv("OVERWRITE_ICON_SET"); |
40 | 37 | ||
41 | /*! | 38 | /*! |
42 | \class Resource resource.h | 39 | \class Resource resource.h |
43 | \brief The Resource class provides access to named resources. | 40 | \brief The Resource class provides access to named resources. |
44 | 41 | ||
45 | The resources may be provided from files or other sources. | 42 | The resources may be provided from files or other sources. |
46 | 43 | ||
47 | The allSounds() function returns a list of all the sounds available. | 44 | The allSounds() function returns a list of all the sounds available. |
48 | A particular sound can be searched for using findSound(). | 45 | A particular sound can be searched for using findSound(). |
49 | 46 | ||
50 | Images can be loaded with loadImage(), loadPixmap(), loadBitmap() | 47 | Images can be loaded with loadImage(), loadPixmap(), loadBitmap() |
51 | and loadIconSet(). | 48 | and loadIconSet(). |
52 | 49 | ||
53 | \ingroup qtopiaemb | 50 | \ingroup qtopiaemb |
54 | */ | 51 | */ |
55 | 52 | ||
56 | /*! | 53 | /*! |
57 | \fn Resource::Resource() | 54 | \fn Resource::Resource() |
58 | \internal | 55 | \internal |
59 | */ | 56 | */ |
60 | 57 | ||
61 | /*! | 58 | /*! |
62 | Returns the QPixmap called \a pix. You should avoid including | 59 | Returns the QPixmap called \a pix. You should avoid including |
63 | any filename type extension (e.g. .png, .xpm). | 60 | any filename type extension (e.g. .png, .xpm). |
64 | */ | 61 | */ |
65 | QPixmap Resource::loadPixmap( const QString &pix ) | 62 | QPixmap Resource::loadPixmap( const QString &pix ) |
66 | { | 63 | { |
67 | QPixmap pm; | 64 | QPixmap pm; |
68 | QString key="QPE_"+pix; | 65 | QString key="QPE_"+pix; |
69 | if ( !QPixmapCache::find(key,pm) ) { | 66 | if ( !QPixmapCache::find(key,pm) ) { |
70 | pm.convertFromImage(loadImage(pix)); | 67 | pm.convertFromImage(loadImage(pix)); |
71 | QPixmapCache::insert(key,pm); | 68 | QPixmapCache::insert(key,pm); |
72 | } | 69 | } |
73 | return pm; | 70 | return pm; |
74 | } | 71 | } |
75 | 72 | ||
76 | /*! | 73 | /*! |
77 | Returns the QBitmap called \a pix. You should avoid including | 74 | Returns the QBitmap called \a pix. You should avoid including |
78 | any filename type extension (e.g. .png, .xpm). | 75 | any filename type extension (e.g. .png, .xpm). |
79 | */ | 76 | */ |
80 | QBitmap Resource::loadBitmap( const QString &pix ) | 77 | QBitmap Resource::loadBitmap( const QString &pix ) |
81 | { | 78 | { |
82 | QBitmap bm; | 79 | QBitmap bm; |
83 | bm = loadPixmap(pix); | 80 | bm = loadPixmap(pix); |
84 | return bm; | 81 | return bm; |
85 | } | 82 | } |
86 | 83 | ||
87 | /*! | 84 | /*! |
88 | Returns the filename of a pixmap called \a pix. You should avoid including | 85 | Returns the filename of a pixmap called \a pix. You should avoid including |
89 | any filename type extension (e.g. .png, .xpm). | 86 | any filename type extension (e.g. .png, .xpm). |
90 | 87 | ||
91 | Normally you will use loadPixmap() rather than this function. | 88 | Normally you will use loadPixmap() rather than this function. |
92 | */ | 89 | */ |
93 | QString Resource::findPixmap( const QString &pix ) | 90 | QString Resource::findPixmap( const QString &pix ) |
94 | { | 91 | { |
95 | QString picsPath = QPEApplication::qpeDir() + "pics/"; | 92 | QString picsPath = QPEApplication::qpeDir() + "pics/"; |
96 | 93 | ||
97 | QString f; | 94 | QString f; |
98 | 95 | ||
99 | // Common case optimizations... | 96 | // Common case optimizations... |
100 | f = picsPath + pix + ".png"; | 97 | f = picsPath + pix + ".png"; |
101 | if ( QFile( f ).exists() ) | 98 | if ( QFile( f ).exists() ) |
102 | return f; | 99 | return f; |
103 | f = picsPath + pix + ".xpm"; | 100 | f = picsPath + pix + ".xpm"; |
104 | if ( QFile( f ).exists() ) | 101 | if ( QFile( f ).exists() ) |
105 | return f; | 102 | return f; |
106 | 103 | ||
107 | 104 | ||
108 | // All formats... | 105 | // All formats... |
109 | QStrList fileFormats = QImageIO::inputFormats(); | 106 | QStrList fileFormats = QImageIO::inputFormats(); |
110 | QString ff = fileFormats.first(); | 107 | QString ff = fileFormats.first(); |
111 | while ( fileFormats.current() ) { | 108 | while ( fileFormats.current() ) { |
112 | QStringList exts = MimeType("image/"+ff.lower()).extensions(); | 109 | QStringList exts = MimeType("image/"+ff.lower()).extensions(); |
113 | for ( QStringList::ConstIterator it = exts.begin(); it!=exts.end(); ++it ) { | 110 | for ( QStringList::ConstIterator it = exts.begin(); it!=exts.end(); ++it ) { |
114 | QString f = picsPath + pix + "." + *it; | 111 | QString f = picsPath + pix + "." + *it; |
115 | if ( QFile(f).exists() ) | 112 | if ( QFile(f).exists() ) |
116 | return f; | 113 | return f; |
117 | } | 114 | } |
118 | ff = fileFormats.next(); | 115 | ff = fileFormats.next(); |
119 | } | 116 | } |
120 | 117 | ||
121 | // Finally, no (or existing) extension... | 118 | // Finally, no (or existing) extension... |
122 | if ( QFile( picsPath + pix ).exists() ) | 119 | if ( QFile( picsPath + pix ).exists() ) |
123 | return picsPath + pix; | 120 | return picsPath + pix; |
124 | 121 | ||
125 | //qDebug("Cannot find pixmap: %s", pix.latin1()); | 122 | //qDebug("Cannot find pixmap: %s", pix.latin1()); |
126 | return QString(); | 123 | return QString(); |
127 | } | 124 | } |
128 | 125 | ||
129 | /*! | 126 | /*! |
130 | Returns a sound file for a sound called \a name. | 127 | Returns a sound file for a sound called \a name. |
131 | 128 | ||
132 | You should avoid including any filename type extension (e.g. .wav), | 129 | You should avoid including any filename type extension (e.g. .wav), |
133 | as the system will search for only those fileformats which are supported | 130 | as the system will search for only those fileformats which are supported |
134 | by the library. | 131 | by the library. |
135 | 132 | ||
136 | Currently, only WAV files are supported. | 133 | Currently, only WAV files are supported. |
137 | */ | 134 | */ |
138 | QString Resource::findSound( const QString &name ) | 135 | QString Resource::findSound( const QString &name ) |
139 | { | 136 | { |
140 | QString picsPath = QPEApplication::qpeDir() + "sounds/"; | 137 | QString picsPath = QPEApplication::qpeDir() + "sounds/"; |
141 | 138 | ||
142 | QString result; | 139 | QString result; |
143 | if ( QFile( (result = picsPath + name + ".wav") ).exists() ) | 140 | if ( QFile( (result = picsPath + name + ".wav") ).exists() ) |
144 | return result; | 141 | return result; |
145 | 142 | ||
146 | return QString(); | 143 | return QString(); |
147 | } | 144 | } |
148 | 145 | ||
149 | /*! | 146 | /*! |
150 | Returns a list of all sound names. | 147 | Returns a list of all sound names. |
151 | */ | 148 | */ |
152 | QStringList Resource::allSounds() | 149 | QStringList Resource::allSounds() |
153 | { | 150 | { |
154 | QDir resourcedir( QPEApplication::qpeDir() + "sounds/", "*.wav" ); | 151 | QDir resourcedir( QPEApplication::qpeDir() + "sounds/", "*.wav" ); |
155 | QStringList entries = resourcedir.entryList(); | 152 | QStringList entries = resourcedir.entryList(); |
156 | QStringList result; | 153 | QStringList result; |
157 | for (QStringList::Iterator i=entries.begin(); i != entries.end(); ++i) | 154 | for (QStringList::Iterator i=entries.begin(); i != entries.end(); ++i) |
158 | result.append((*i).replace(QRegExp("\\.wav"),"")); | 155 | result.append((*i).replace(QRegExp("\\.wav"),"")); |
159 | return result; | 156 | return result; |
160 | } | 157 | } |
161 | 158 | ||
162 | static QImage load_image(const QString &name) | 159 | static QImage load_image(const QString &name) |
163 | { | 160 | { |
164 | if (g_notUseSet ) { | 161 | if (g_notUseSet ) { |
165 | // try file | 162 | // try file |
166 | QImage img; | 163 | QImage img; |
167 | QString f = Resource::findPixmap(name); | 164 | QString f = Resource::findPixmap(name); |
168 | if ( !f.isEmpty() ) | 165 | if ( !f.isEmpty() ) |
169 | img.load(f); | 166 | img.load(f); |
170 | if (img.isNull() ) | 167 | if (img.isNull() ) |
171 | img = qembed_findImage(name.latin1() ); | 168 | img = qembed_findImage(name.latin1() ); |
172 | return img; | 169 | return img; |
173 | } | 170 | } |
174 | else{ | 171 | else{ |
175 | QImage img = qembed_findImage(name.latin1()); | 172 | QImage img = qembed_findImage(name.latin1()); |
176 | 173 | ||
177 | if ( img.isNull() ) { | 174 | if ( img.isNull() ) { |
178 | // No inlined image, try file | 175 | // No inlined image, try file |
179 | QString f = Resource::findPixmap(name); | 176 | QString f = Resource::findPixmap(name); |
180 | if ( !f.isEmpty() ) | 177 | if ( !f.isEmpty() ) |
181 | img.load(f); | 178 | img.load(f); |
182 | } | 179 | } |
183 | return img; | 180 | return img; |
184 | } | 181 | } |
185 | } | 182 | } |
186 | 183 | ||
187 | /*! | 184 | /*! |
188 | Returns the QImage called \a name. You should avoid including | 185 | Returns the QImage called \a name. You should avoid including |
189 | any filename type extension (e.g. .png, .xpm). | 186 | any filename type extension (e.g. .png, .xpm). |
190 | */ | 187 | */ |
191 | QImage Resource::loadImage( const QString &name) | 188 | QImage Resource::loadImage( const QString &name) |
192 | { | 189 | { |
193 | #ifndef QT_NO_DEPTH_32// have alpha-blended pixmaps | 190 | #ifndef QT_NO_DEPTH_32// have alpha-blended pixmaps |
194 | static QImage last_enabled; | 191 | static QImage last_enabled; |
195 | static QString last_enabled_name; | 192 | static QString last_enabled_name; |
196 | if ( name == last_enabled_name ) | 193 | if ( name == last_enabled_name ) |
197 | return last_enabled; | 194 | return last_enabled; |
198 | #endif | 195 | #endif |
199 | QImage img = load_image(name); | 196 | QImage img = load_image(name); |
200 | #ifndef QT_NO_DEPTH_32// have alpha-blended pixmaps | 197 | #ifndef QT_NO_DEPTH_32// have alpha-blended pixmaps |
201 | if ( img.isNull() ) { | 198 | if ( img.isNull() ) { |
202 | // No file, try generating | 199 | // No file, try generating |
203 | if ( name[name.length()-1]=='d' && name.right(9)=="_disabled" ) { | 200 | if ( name[name.length()-1]=='d' && name.right(9)=="_disabled" ) { |
204 | last_enabled_name = name.left(name.length()-9); | 201 | last_enabled_name = name.left(name.length()-9); |
205 | last_enabled = load_image(last_enabled_name); | 202 | last_enabled = load_image(last_enabled_name); |
206 | if ( last_enabled.isNull() ) { | 203 | if ( last_enabled.isNull() ) { |
207 | last_enabled_name = QString::null; | 204 | last_enabled_name = QString::null; |
208 | } else { | 205 | } else { |
209 | img.detach(); | 206 | img.detach(); |
210 | img.create( last_enabled.width(), last_enabled.height(), 32 ); | 207 | img.create( last_enabled.width(), last_enabled.height(), 32 ); |
211 | for ( int y = 0; y < img.height(); y++ ) { | 208 | for ( int y = 0; y < img.height(); y++ ) { |
212 | for ( int x = 0; x < img.width(); x++ ) { | 209 | for ( int x = 0; x < img.width(); x++ ) { |
213 | QRgb p = last_enabled.pixel( x, y ); | 210 | QRgb p = last_enabled.pixel( x, y ); |
214 | int a = qAlpha(p)/3; | 211 | int a = qAlpha(p)/3; |
215 | int g = qGray(qRed(p),qGreen(p),qBlue(p)); | 212 | int g = qGray(qRed(p),qGreen(p),qBlue(p)); |
216 | img.setPixel( x, y, qRgba(g,g,g,a) ); | 213 | img.setPixel( x, y, qRgba(g,g,g,a) ); |
217 | } | 214 | } |
218 | } | 215 | } |
219 | img.setAlphaBuffer( TRUE ); | 216 | img.setAlphaBuffer( TRUE ); |
220 | } | 217 | } |
221 | } | 218 | } |
222 | } | 219 | } |
223 | #endif | 220 | #endif |
224 | return img; | 221 | return img; |
225 | } | 222 | } |
226 | 223 | ||
227 | /*! | 224 | /*! |
228 | \fn QIconSet Resource::loadIconSet( const QString &name ) | 225 | \fn QIconSet Resource::loadIconSet( const QString &name ) |
229 | 226 | ||
230 | Returns a QIconSet for the pixmap named \a name. A disabled icon is | 227 | Returns a QIconSet for the pixmap named \a name. A disabled icon is |
231 | generated that conforms to the Qtopia look & feel. You should avoid | 228 | generated that conforms to the Qtopia look & feel. You should avoid |
232 | including any filename type extension (eg. .png, .xpm). | 229 | including any filename type extension (eg. .png, .xpm). |
233 | */ | 230 | */ |
diff --git a/library/sound.cpp b/library/sound.cpp index 5b67995..ee2aabc 100644 --- a/library/sound.cpp +++ b/library/sound.cpp | |||
@@ -1,224 +1,222 @@ | |||
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 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 | 20 | ||
21 | #include <qpe/resource.h> | 21 | #include <qpe/resource.h> |
22 | #include <qpe/sound.h> | 22 | #include <qpe/sound.h> |
23 | #include <qpe/qcopenvelope_qws.h> | 23 | #include <qpe/qcopenvelope_qws.h> |
24 | 24 | ||
25 | #include <qsound.h> | 25 | #include <qsound.h> |
26 | #include <qfile.h> | 26 | #include <qfile.h> |
27 | 27 | ||
28 | #include <unistd.h> | 28 | #include <unistd.h> |
29 | #include <fcntl.h> | 29 | #include <fcntl.h> |
30 | #include <sys/ioctl.h> | 30 | #include <sys/ioctl.h> |
31 | 31 | ||
32 | #ifndef QT_NO_SOUND | 32 | #ifndef QT_NO_SOUND |
33 | #include <sys/soundcard.h> | 33 | #include <sys/soundcard.h> |
34 | #endif | 34 | #endif |
35 | 35 | ||
36 | #include "config.h" | ||
37 | #include <qmessagebox.h> | ||
38 | #ifndef QT_NO_SOUND | 36 | #ifndef QT_NO_SOUND |
39 | static int WAVsoundDuration(const QString& filename) | 37 | static int WAVsoundDuration(const QString& filename) |
40 | { | 38 | { |
41 | // bad solution | 39 | // bad solution |
42 | 40 | ||
43 | // most of this is copied from qsoundqss.cpp | 41 | // most of this is copied from qsoundqss.cpp |
44 | 42 | ||
45 | QFile input(filename); | 43 | QFile input(filename); |
46 | if ( !input.open(IO_ReadOnly) ) | 44 | if ( !input.open(IO_ReadOnly) ) |
47 | return 0; | 45 | return 0; |
48 | 46 | ||
49 | struct QRiffChunk { | 47 | struct QRiffChunk { |
50 | char id[4]; | 48 | char id[4]; |
51 | Q_UINT32 size; | 49 | Q_UINT32 size; |
52 | char data[4/*size*/]; | 50 | char data[4/*size*/]; |
53 | } chunk; | 51 | } chunk; |
54 | 52 | ||
55 | struct { | 53 | struct { |
56 | Q_INT16 formatTag; | 54 | Q_INT16 formatTag; |
57 | Q_INT16 channels; | 55 | Q_INT16 channels; |
58 | Q_INT32 samplesPerSec; | 56 | Q_INT32 samplesPerSec; |
59 | Q_INT32 avgBytesPerSec; | 57 | Q_INT32 avgBytesPerSec; |
60 | Q_INT16 blockAlign; | 58 | Q_INT16 blockAlign; |
61 | Q_INT16 wBitsPerSample; | 59 | Q_INT16 wBitsPerSample; |
62 | } chunkdata; | 60 | } chunkdata; |
63 | 61 | ||
64 | int total = 0; | 62 | int total = 0; |
65 | 63 | ||
66 | while(1) { | 64 | while(1) { |
67 | // Keep reading chunks... | 65 | // Keep reading chunks... |
68 | const int n = sizeof(chunk)-sizeof(chunk.data); | 66 | const int n = sizeof(chunk)-sizeof(chunk.data); |
69 | if ( input.readBlock((char*)&chunk,n) != n ) | 67 | if ( input.readBlock((char*)&chunk,n) != n ) |
70 | break; | 68 | break; |
71 | if ( qstrncmp(chunk.id,"data",4) == 0 ) { | 69 | if ( qstrncmp(chunk.id,"data",4) == 0 ) { |
72 | total += chunkdata.avgBytesPerSec ? | 70 | total += chunkdata.avgBytesPerSec ? |
73 | chunk.size * 1000 / chunkdata.avgBytesPerSec : 0; | 71 | chunk.size * 1000 / chunkdata.avgBytesPerSec : 0; |
74 | //qDebug("%d bytes of PCM (%dms)", chunk.size,chunkdata.avgBytesPerSec ? chunk.size * 1000 / chunkdata.avgBytesPerSec : 0); | 72 | //qDebug("%d bytes of PCM (%dms)", chunk.size,chunkdata.avgBytesPerSec ? chunk.size * 1000 / chunkdata.avgBytesPerSec : 0); |
75 | input.at(input.at()+chunk.size-4); | 73 | input.at(input.at()+chunk.size-4); |
76 | } else if ( qstrncmp(chunk.id,"RIFF",4) == 0 ) { | 74 | } else if ( qstrncmp(chunk.id,"RIFF",4) == 0 ) { |
77 | char d[4]; | 75 | char d[4]; |
78 | if ( input.readBlock(d,4) != 4 ) | 76 | if ( input.readBlock(d,4) != 4 ) |
79 | return 0; | 77 | return 0; |
80 | if ( qstrncmp(d,"WAVE",4) != 0 ) { | 78 | if ( qstrncmp(d,"WAVE",4) != 0 ) { |
81 | // skip | 79 | // skip |
82 | //qDebug("skip %.4s RIFF chunk",d); | 80 | //qDebug("skip %.4s RIFF chunk",d); |
83 | if ( chunk.size < 10000000 ) | 81 | if ( chunk.size < 10000000 ) |
84 | (void)input.at(input.at()+chunk.size-4); | 82 | (void)input.at(input.at()+chunk.size-4); |
85 | } | 83 | } |
86 | } else if ( qstrncmp(chunk.id,"fmt ",4) == 0 ) { | 84 | } else if ( qstrncmp(chunk.id,"fmt ",4) == 0 ) { |
87 | if ( input.readBlock((char*)&chunkdata,sizeof(chunkdata)) != sizeof(chunkdata) ) | 85 | if ( input.readBlock((char*)&chunkdata,sizeof(chunkdata)) != sizeof(chunkdata) ) |
88 | return 0; | 86 | return 0; |
89 | #define WAVE_FORMAT_PCM 1 | 87 | #define WAVE_FORMAT_PCM 1 |
90 | if ( chunkdata.formatTag != WAVE_FORMAT_PCM ) { | 88 | if ( chunkdata.formatTag != WAVE_FORMAT_PCM ) { |
91 | //qDebug("WAV file: UNSUPPORTED FORMAT %d",chunkdata.formatTag); | 89 | //qDebug("WAV file: UNSUPPORTED FORMAT %d",chunkdata.formatTag); |
92 | return 0; | 90 | return 0; |
93 | } | 91 | } |
94 | } else { | 92 | } else { |
95 | //qDebug("skip %.4s chunk",chunk.id); | 93 | //qDebug("skip %.4s chunk",chunk.id); |
96 | // ignored chunk | 94 | // ignored chunk |
97 | if ( chunk.size < 10000000 ) | 95 | if ( chunk.size < 10000000 ) |
98 | (void)input.at(input.at()+chunk.size); | 96 | (void)input.at(input.at()+chunk.size); |
99 | } | 97 | } |
100 | } | 98 | } |
101 | 99 | ||
102 | //qDebug("%dms",total); | 100 | //qDebug("%dms",total); |
103 | return total; | 101 | return total; |
104 | } | 102 | } |
105 | 103 | ||
106 | class SoundData : public QSound { | 104 | class SoundData : public QSound { |
107 | public: | 105 | public: |
108 | SoundData ( const QString& name ) : | 106 | SoundData ( const QString& name ) : |
109 | QSound ( Resource::findSound ( name )), | 107 | QSound ( Resource::findSound ( name )), |
110 | filename ( Resource::findSound ( name )) | 108 | filename ( Resource::findSound ( name )) |
111 | { | 109 | { |
112 | loopsleft=0; | 110 | loopsleft=0; |
113 | ms = WAVsoundDuration(filename); | 111 | ms = WAVsoundDuration(filename); |
114 | } | 112 | } |
115 | 113 | ||
116 | void playLoop ( int loopcnt = -1 ) | 114 | void playLoop ( int loopcnt = -1 ) |
117 | { | 115 | { |
118 | // needs server support | 116 | // needs server support |
119 | loopsleft = loopcnt; | 117 | loopsleft = loopcnt; |
120 | 118 | ||
121 | if ( ms ) | 119 | if ( ms ) |
122 | startTimer ( ms > 50 ? ms-50 : 0 ); // 50 for latency | 120 | startTimer ( ms > 50 ? ms-50 : 0 ); // 50 for latency |
123 | play ( ); | 121 | play ( ); |
124 | } | 122 | } |
125 | 123 | ||
126 | void timerEvent ( QTimerEvent *e ) | 124 | void timerEvent ( QTimerEvent *e ) |
127 | { | 125 | { |
128 | if ( loopsleft >= 0 ) { | 126 | if ( loopsleft >= 0 ) { |
129 | if ( --loopsleft <= 0 ) { | 127 | if ( --loopsleft <= 0 ) { |
130 | killTimer ( e-> timerId ( )); | 128 | killTimer ( e-> timerId ( )); |
131 | loopsleft = 0; | 129 | loopsleft = 0; |
132 | return; | 130 | return; |
133 | } | 131 | } |
134 | } | 132 | } |
135 | play(); | 133 | play(); |
136 | } | 134 | } |
137 | 135 | ||
138 | bool isFinished ( ) const | 136 | bool isFinished ( ) const |
139 | { | 137 | { |
140 | return ( loopsleft == 0 ); | 138 | return ( loopsleft == 0 ); |
141 | } | 139 | } |
142 | 140 | ||
143 | private: | 141 | private: |
144 | QString filename; | 142 | QString filename; |
145 | int loopsleft; | 143 | int loopsleft; |
146 | int ms; | 144 | int ms; |
147 | }; | 145 | }; |
148 | 146 | ||
149 | #endif | 147 | #endif |
150 | 148 | ||
151 | /*! Opens a wave sound file \a name for playing | 149 | /*! Opens a wave sound file \a name for playing |
152 | * Resource is used for finding the file | 150 | * Resource is used for finding the file |
153 | **/ | 151 | **/ |
154 | Sound::Sound(const QString& name) | 152 | Sound::Sound(const QString& name) |
155 | { | 153 | { |
156 | #ifndef QT_NO_SOUND | 154 | #ifndef QT_NO_SOUND |
157 | d = new SoundData(name); | 155 | d = new SoundData(name); |
158 | #endif | 156 | #endif |
159 | } | 157 | } |
160 | 158 | ||
161 | /*! Destroys the sound */ | 159 | /*! Destroys the sound */ |
162 | Sound::~Sound() | 160 | Sound::~Sound() |
163 | { | 161 | { |
164 | #ifndef QT_NO_SOUND | 162 | #ifndef QT_NO_SOUND |
165 | delete d; | 163 | delete d; |
166 | #endif | 164 | #endif |
167 | } | 165 | } |
168 | 166 | ||
169 | /*! Play the sound once */ | 167 | /*! Play the sound once */ |
170 | void Sound::play() | 168 | void Sound::play() |
171 | { | 169 | { |
172 | #ifndef QT_NO_SOUND | 170 | #ifndef QT_NO_SOUND |
173 | d->playLoop(1); | 171 | d->playLoop(1); |
174 | #endif | 172 | #endif |
175 | } | 173 | } |
176 | 174 | ||
177 | /*! Play the sound, repeatedly until stop() is called */ | 175 | /*! Play the sound, repeatedly until stop() is called */ |
178 | void Sound::playLoop() | 176 | void Sound::playLoop() |
179 | { | 177 | { |
180 | #ifndef QT_NO_SOUND | 178 | #ifndef QT_NO_SOUND |
181 | d->killTimers(); | 179 | d->killTimers(); |
182 | d->playLoop(); | 180 | d->playLoop(); |
183 | #endif | 181 | #endif |
184 | } | 182 | } |
185 | 183 | ||
186 | /*! Do not repeat the sound after it finishes. This will end a playLoop() */ | 184 | /*! Do not repeat the sound after it finishes. This will end a playLoop() */ |
187 | void Sound::stop() | 185 | void Sound::stop() |
188 | { | 186 | { |
189 | #ifndef QT_NO_SOUND | 187 | #ifndef QT_NO_SOUND |
190 | d->killTimers(); | 188 | d->killTimers(); |
191 | #endif | 189 | #endif |
192 | } | 190 | } |
193 | 191 | ||
194 | bool Sound::isFinished() const | 192 | bool Sound::isFinished() const |
195 | { | 193 | { |
196 | #ifndef QT_NO_SOUND | 194 | #ifndef QT_NO_SOUND |
197 | return d->isFinished(); | 195 | return d->isFinished(); |
198 | #else | 196 | #else |
199 | return true; | 197 | return true; |
200 | #endif | 198 | #endif |
201 | } | 199 | } |
202 | 200 | ||
203 | /*! Sounds the audible system alarm. This is used for applications such | 201 | /*! Sounds the audible system alarm. This is used for applications such |
204 | as Calendar when it needs to alarm the user of an event. | 202 | as Calendar when it needs to alarm the user of an event. |
205 | */ | 203 | */ |
206 | void Sound::soundAlarm() | 204 | void Sound::soundAlarm() |
207 | { | 205 | { |
208 | #ifndef QT_NO_COP | 206 | #ifndef QT_NO_COP |
209 | QCopEnvelope( "QPE/TaskBar", "soundAlarm()" ); | 207 | QCopEnvelope( "QPE/TaskBar", "soundAlarm()" ); |
210 | #endif | 208 | #endif |
211 | } | 209 | } |
212 | 210 | ||
213 | 211 | ||
214 | /*! \class Sound | 212 | /*! \class Sound |
215 | \brief The Sound class plays WAVE sound files and can invoke the audible alarm. | 213 | \brief The Sound class plays WAVE sound files and can invoke the audible alarm. |
216 | 214 | ||
217 | The Sound class is constructed with the .wav music file name. The Sound | 215 | The Sound class is constructed with the .wav music file name. The Sound |
218 | class retrieves the sound file from the shared Resource class. This class | 216 | class retrieves the sound file from the shared Resource class. This class |
219 | ties together QSound and the available sound resources. | 217 | ties together QSound and the available sound resources. |
220 | 218 | ||
221 | To sound an audible system alarm, call the static method soundAlarm() | 219 | To sound an audible system alarm, call the static method soundAlarm() |
222 | 220 | ||
223 | \ingroup qtopiaemb | 221 | \ingroup qtopiaemb |
224 | */ | 222 | */ |
diff --git a/library/storage.cpp b/library/storage.cpp index d98139b..0ea465b 100644 --- a/library/storage.cpp +++ b/library/storage.cpp | |||
@@ -1,405 +1,401 @@ | |||
1 | /********************************************************************** | 1 | /********************************************************************** |
2 | ** Copyright (C) Holger 'zecke' Freyther <freyther@kde.org> | 2 | ** Copyright (C) Holger 'zecke' Freyther <freyther@kde.org> |
3 | ** Copyright (C) Lorn Potter <llornkcor@handhelds.org> | 3 | ** Copyright (C) Lorn Potter <llornkcor@handhelds.org> |
4 | ** Copyright (C) 2000 Trolltech AS. All rights reserved. | 4 | ** Copyright (C) 2000 Trolltech AS. All rights reserved. |
5 | ** | 5 | ** |
6 | ** This file is part of Opie Environment. | 6 | ** This file is part of Opie Environment. |
7 | ** | 7 | ** |
8 | ** This file may be distributed and/or modified under the terms of the | 8 | ** This file may be distributed and/or modified under the terms of the |
9 | ** GNU General Public License version 2 as published by the Free Software | 9 | ** GNU General Public License version 2 as published by the Free Software |
10 | ** Foundation and appearing in the file LICENSE.GPL included in the | 10 | ** Foundation and appearing in the file LICENSE.GPL included in the |
11 | ** packaging of this file. | 11 | ** packaging of this file. |
12 | ** | 12 | ** |
13 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | 13 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE |
14 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | 14 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
15 | ** | 15 | ** |
16 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 16 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
17 | ** | 17 | ** |
18 | ** Contact info@trolltech.com if any conditions of this licensing are | 18 | ** Contact info@trolltech.com if any conditions of this licensing are |
19 | ** not clear to you. | 19 | ** not clear to you. |
20 | ** | 20 | ** |
21 | **********************************************************************/ | 21 | **********************************************************************/ |
22 | 22 | ||
23 | #include <qpe/storage.h> | 23 | #include <qpe/storage.h> |
24 | #include <qpe/custom.h> | ||
25 | 24 | ||
26 | #include <qfile.h> | ||
27 | #include <qtimer.h> | ||
28 | #include <qcopchannel_qws.h> | 25 | #include <qcopchannel_qws.h> |
29 | 26 | ||
30 | #include <stdio.h> | 27 | #include <stdio.h> |
31 | 28 | ||
32 | #if defined(_OS_LINUX_) || defined(Q_OS_LINUX) | 29 | #if defined(_OS_LINUX_) || defined(Q_OS_LINUX) |
33 | #include <sys/vfs.h> | 30 | #include <sys/vfs.h> |
34 | #include <mntent.h> | 31 | #include <mntent.h> |
35 | #endif | 32 | #endif |
36 | 33 | ||
37 | #ifdef Q_OS_MACX | 34 | #ifdef Q_OS_MACX |
38 | # include <sys/param.h> | 35 | # include <sys/param.h> |
39 | # include <sys/ucred.h> | 36 | # include <sys/ucred.h> |
40 | # include <sys/mount.h> | 37 | # include <sys/mount.h> |
41 | # include <stdio.h> // For strerror() | 38 | # include <stdio.h> // For strerror() |
42 | # include <errno.h> | 39 | # include <errno.h> |
43 | #endif /* Q_OS_MACX */ | 40 | #endif /* Q_OS_MACX */ |
44 | 41 | ||
45 | #include <qstringlist.h> | ||
46 | 42 | ||
47 | // Shouldn't be here ! (eilers) | 43 | // Shouldn't be here ! (eilers) |
48 | // #include <sys/vfs.h> | 44 | // #include <sys/vfs.h> |
49 | // #include <mntent.h> | 45 | // #include <mntent.h> |
50 | 46 | ||
51 | 47 | ||
52 | static bool isCF(const QString& m) | 48 | static bool isCF(const QString& m) |
53 | { | 49 | { |
54 | 50 | ||
55 | #ifndef Q_OS_MACX | 51 | #ifndef Q_OS_MACX |
56 | FILE* f = fopen("/var/run/stab", "r"); | 52 | FILE* f = fopen("/var/run/stab", "r"); |
57 | if (!f) f = fopen("/var/state/pcmcia/stab", "r"); | 53 | if (!f) f = fopen("/var/state/pcmcia/stab", "r"); |
58 | if (!f) f = fopen("/var/lib/pcmcia/stab", "r"); | 54 | if (!f) f = fopen("/var/lib/pcmcia/stab", "r"); |
59 | if ( f ) | 55 | if ( f ) |
60 | { | 56 | { |
61 | char line[1024]; | 57 | char line[1024]; |
62 | char devtype[80]; | 58 | char devtype[80]; |
63 | char devname[80]; | 59 | char devname[80]; |
64 | while ( fgets( line, 1024, f ) ) | 60 | while ( fgets( line, 1024, f ) ) |
65 | { | 61 | { |
66 | // 0 ide ide-cs 0 hda 3 0 | 62 | // 0 ide ide-cs 0 hda 3 0 |
67 | if ( sscanf(line,"%*d %s %*s %*s %s", devtype, devname )==2 ) | 63 | if ( sscanf(line,"%*d %s %*s %*s %s", devtype, devname )==2 ) |
68 | { | 64 | { |
69 | if ( QString(devtype) == "ide" && m.find(devname)>0 ) | 65 | if ( QString(devtype) == "ide" && m.find(devname)>0 ) |
70 | { | 66 | { |
71 | fclose(f); | 67 | fclose(f); |
72 | return TRUE; | 68 | return TRUE; |
73 | } | 69 | } |
74 | } | 70 | } |
75 | } | 71 | } |
76 | fclose(f); | 72 | fclose(f); |
77 | } | 73 | } |
78 | #endif /* Q_OS_MACX */ | 74 | #endif /* Q_OS_MACX */ |
79 | return FALSE; | 75 | return FALSE; |
80 | } | 76 | } |
81 | 77 | ||
82 | /*! \class StorageInfo storage.h | 78 | /*! \class StorageInfo storage.h |
83 | \brief The StorageInfo class describes the disks mounted on the file system. | 79 | \brief The StorageInfo class describes the disks mounted on the file system. |
84 | 80 | ||
85 | This class provides access to the mount information for the Linux | 81 | This class provides access to the mount information for the Linux |
86 | filesystem. Each mount point is represented by the FileSystem class. | 82 | filesystem. Each mount point is represented by the FileSystem class. |
87 | To ensure this class has the most up to date size information, call | 83 | To ensure this class has the most up to date size information, call |
88 | the update() method. Note that this will automatically be signaled | 84 | the update() method. Note that this will automatically be signaled |
89 | by the operating system when a disk has been mounted or unmounted. | 85 | by the operating system when a disk has been mounted or unmounted. |
90 | 86 | ||
91 | \ingroup qtopiaemb | 87 | \ingroup qtopiaemb |
92 | */ | 88 | */ |
93 | 89 | ||
94 | /*! Constructor that determines the current mount points of the filesystem. | 90 | /*! Constructor that determines the current mount points of the filesystem. |
95 | The standard \a parent parameters is passed on to QObject. | 91 | The standard \a parent parameters is passed on to QObject. |
96 | */ | 92 | */ |
97 | StorageInfo::StorageInfo( QObject *parent ) | 93 | StorageInfo::StorageInfo( QObject *parent ) |
98 | : QObject( parent ) | 94 | : QObject( parent ) |
99 | { | 95 | { |
100 | mFileSystems.setAutoDelete( TRUE ); | 96 | mFileSystems.setAutoDelete( TRUE ); |
101 | channel = new QCopChannel( "QPE/Card", this ); | 97 | channel = new QCopChannel( "QPE/Card", this ); |
102 | connect( channel, SIGNAL(received(const QCString &, const QByteArray &)), | 98 | connect( channel, SIGNAL(received(const QCString &, const QByteArray &)), |
103 | this, SLOT(cardMessage( const QCString &, const QByteArray &)) ); | 99 | this, SLOT(cardMessage( const QCString &, const QByteArray &)) ); |
104 | update(); | 100 | update(); |
105 | } | 101 | } |
106 | 102 | ||
107 | /*! Returns the longest matching FileSystem that starts with the | 103 | /*! Returns the longest matching FileSystem that starts with the |
108 | same prefix as \a filename as its mount point. | 104 | same prefix as \a filename as its mount point. |
109 | */ | 105 | */ |
110 | const FileSystem *StorageInfo::fileSystemOf( const QString &filename ) | 106 | const FileSystem *StorageInfo::fileSystemOf( const QString &filename ) |
111 | { | 107 | { |
112 | for (QListIterator<FileSystem> i(mFileSystems); i.current(); ++i) | 108 | for (QListIterator<FileSystem> i(mFileSystems); i.current(); ++i) |
113 | { | 109 | { |
114 | if ( filename.startsWith( (*i)->path() ) ) | 110 | if ( filename.startsWith( (*i)->path() ) ) |
115 | return (*i); | 111 | return (*i); |
116 | } | 112 | } |
117 | return 0; | 113 | return 0; |
118 | } | 114 | } |
119 | 115 | ||
120 | 116 | ||
121 | void StorageInfo::cardMessage( const QCString& msg, const QByteArray& ) | 117 | void StorageInfo::cardMessage( const QCString& msg, const QByteArray& ) |
122 | { | 118 | { |
123 | if ( msg == "mtabChanged()" ) | 119 | if ( msg == "mtabChanged()" ) |
124 | update(); | 120 | update(); |
125 | } | 121 | } |
126 | 122 | ||
127 | 123 | ||
128 | /*! Updates the mount and free space available information for each mount | 124 | /*! Updates the mount and free space available information for each mount |
129 | point. This method is automatically called when a disk is mounted or | 125 | point. This method is automatically called when a disk is mounted or |
130 | unmounted. | 126 | unmounted. |
131 | */ | 127 | */ |
132 | // cause of the lack of a d pointer we need | 128 | // cause of the lack of a d pointer we need |
133 | // to store informations in a config file :( | 129 | // to store informations in a config file :( |
134 | void StorageInfo::update() | 130 | void StorageInfo::update() |
135 | { | 131 | { |
136 | //qDebug("StorageInfo::updating"); | 132 | //qDebug("StorageInfo::updating"); |
137 | #if defined(_OS_LINUX_) || defined(Q_OS_LINUX) | 133 | #if defined(_OS_LINUX_) || defined(Q_OS_LINUX) |
138 | struct mntent *me; | 134 | struct mntent *me; |
139 | FILE *mntfp = setmntent( "/etc/mtab", "r" ); | 135 | FILE *mntfp = setmntent( "/etc/mtab", "r" ); |
140 | 136 | ||
141 | QStringList curdisks; | 137 | QStringList curdisks; |
142 | QStringList curopts; | 138 | QStringList curopts; |
143 | QStringList curfs; | 139 | QStringList curfs; |
144 | bool rebuild = FALSE; | 140 | bool rebuild = FALSE; |
145 | int n=0; | 141 | int n=0; |
146 | if ( mntfp ) | 142 | if ( mntfp ) |
147 | { | 143 | { |
148 | while ( (me = getmntent( mntfp )) != 0 ) | 144 | while ( (me = getmntent( mntfp )) != 0 ) |
149 | { | 145 | { |
150 | QString fs = me->mnt_fsname; | 146 | QString fs = me->mnt_fsname; |
151 | if ( fs.left(7)=="/dev/hd" || fs.left(7)=="/dev/sd" | 147 | if ( fs.left(7)=="/dev/hd" || fs.left(7)=="/dev/sd" |
152 | || fs.left(8)=="/dev/mtd" || fs.left(9) == "/dev/mmcd" | 148 | || fs.left(8)=="/dev/mtd" || fs.left(9) == "/dev/mmcd" |
153 | || fs.left( 14 ) == "/dev/mmc/part1" | 149 | || fs.left( 14 ) == "/dev/mmc/part1" |
154 | || fs.left(5)=="tmpfs" || fs.left(9)=="/dev/root" ) | 150 | || fs.left(5)=="tmpfs" || fs.left(9)=="/dev/root" ) |
155 | { | 151 | { |
156 | n++; | 152 | n++; |
157 | curdisks.append(fs); | 153 | curdisks.append(fs); |
158 | curopts.append( me->mnt_opts ); | 154 | curopts.append( me->mnt_opts ); |
159 | //qDebug("-->fs %s opts %s", fs.latin1(), me->mnt_opts ); | 155 | //qDebug("-->fs %s opts %s", fs.latin1(), me->mnt_opts ); |
160 | curfs.append( me->mnt_dir ); | 156 | curfs.append( me->mnt_dir ); |
161 | bool found = FALSE; | 157 | bool found = FALSE; |
162 | for (QListIterator<FileSystem> i(mFileSystems); i.current(); ++i) | 158 | for (QListIterator<FileSystem> i(mFileSystems); i.current(); ++i) |
163 | { | 159 | { |
164 | if ( (*i)->disk() == fs ) | 160 | if ( (*i)->disk() == fs ) |
165 | { | 161 | { |
166 | found = TRUE; | 162 | found = TRUE; |
167 | break; | 163 | break; |
168 | } | 164 | } |
169 | } | 165 | } |
170 | if ( !found ) | 166 | if ( !found ) |
171 | rebuild = TRUE; | 167 | rebuild = TRUE; |
172 | } | 168 | } |
173 | } | 169 | } |
174 | endmntent( mntfp ); | 170 | endmntent( mntfp ); |
175 | } | 171 | } |
176 | if ( rebuild || n != (int)mFileSystems.count() ) | 172 | if ( rebuild || n != (int)mFileSystems.count() ) |
177 | { | 173 | { |
178 | mFileSystems.clear(); | 174 | mFileSystems.clear(); |
179 | QStringList::ConstIterator it=curdisks.begin(); | 175 | QStringList::ConstIterator it=curdisks.begin(); |
180 | QStringList::ConstIterator fsit=curfs.begin(); | 176 | QStringList::ConstIterator fsit=curfs.begin(); |
181 | QStringList::ConstIterator optsIt=curopts.begin(); | 177 | QStringList::ConstIterator optsIt=curopts.begin(); |
182 | for (; it!=curdisks.end(); ++it, ++fsit, ++optsIt) | 178 | for (; it!=curdisks.end(); ++it, ++fsit, ++optsIt) |
183 | { | 179 | { |
184 | QString opts = *optsIt; | 180 | QString opts = *optsIt; |
185 | 181 | ||
186 | QString disk = *it; | 182 | QString disk = *it; |
187 | QString humanname; | 183 | QString humanname; |
188 | bool removable = FALSE; | 184 | bool removable = FALSE; |
189 | if ( isCF(disk) ) | 185 | if ( isCF(disk) ) |
190 | { | 186 | { |
191 | humanname = tr("CF Card"); | 187 | humanname = tr("CF Card"); |
192 | removable = TRUE; | 188 | removable = TRUE; |
193 | } | 189 | } |
194 | else if ( disk == "/dev/hda1" ) | 190 | else if ( disk == "/dev/hda1" ) |
195 | { | 191 | { |
196 | humanname = tr("Hard Disk"); | 192 | humanname = tr("Hard Disk"); |
197 | } | 193 | } |
198 | else if ( disk.left(9) == "/dev/mmcd" ) | 194 | else if ( disk.left(9) == "/dev/mmcd" ) |
199 | { | 195 | { |
200 | humanname = tr("SD Card"); | 196 | humanname = tr("SD Card"); |
201 | removable = TRUE; | 197 | removable = TRUE; |
202 | } | 198 | } |
203 | else if ( disk.left( 14 ) == "/dev/mmc/part1" ) | 199 | else if ( disk.left( 14 ) == "/dev/mmc/part1" ) |
204 | { | 200 | { |
205 | humanname = tr("MMC Card"); | 201 | humanname = tr("MMC Card"); |
206 | removable = TRUE; | 202 | removable = TRUE; |
207 | } | 203 | } |
208 | else if ( disk.left(7) == "/dev/hd" ) | 204 | else if ( disk.left(7) == "/dev/hd" ) |
209 | humanname = tr("Hard Disk") + " " + disk; | 205 | humanname = tr("Hard Disk") + " " + disk; |
210 | else if ( disk.left(7) == "/dev/sd" ) | 206 | else if ( disk.left(7) == "/dev/sd" ) |
211 | humanname = tr("SCSI Hard Disk") + " " + disk; | 207 | humanname = tr("SCSI Hard Disk") + " " + disk; |
212 | else if ( disk.left(14) == "/dev/mtdblock6" ) //openzaurus ramfs | 208 | else if ( disk.left(14) == "/dev/mtdblock6" ) //openzaurus ramfs |
213 | humanname = tr("Internal Memory"); | 209 | humanname = tr("Internal Memory"); |
214 | else if ( disk == "/dev/mtdblock1" || humanname == "/dev/mtdblock/1" ) | 210 | else if ( disk == "/dev/mtdblock1" || humanname == "/dev/mtdblock/1" ) |
215 | humanname = tr("Internal Storage"); | 211 | humanname = tr("Internal Storage"); |
216 | else if ( disk.left(14) == "/dev/mtdblock/" ) | 212 | else if ( disk.left(14) == "/dev/mtdblock/" ) |
217 | humanname = tr("Internal Storage") + " " + disk; | 213 | humanname = tr("Internal Storage") + " " + disk; |
218 | else if ( disk.left(13) == "/dev/mtdblock" ) | 214 | else if ( disk.left(13) == "/dev/mtdblock" ) |
219 | humanname = tr("Internal Storage") + " " + disk; | 215 | humanname = tr("Internal Storage") + " " + disk; |
220 | else if ( disk.left(9) == "/dev/root" ) | 216 | else if ( disk.left(9) == "/dev/root" ) |
221 | humanname = tr("Internal Storage") + " " + disk; | 217 | humanname = tr("Internal Storage") + " " + disk; |
222 | else if ( disk.left(5) == "tmpfs" ) //ipaqs /mnt/ramfs | 218 | else if ( disk.left(5) == "tmpfs" ) //ipaqs /mnt/ramfs |
223 | humanname = tr("Internal Memory"); | 219 | humanname = tr("Internal Memory"); |
224 | FileSystem *fs = new FileSystem( disk, *fsit, humanname, removable, opts ); | 220 | FileSystem *fs = new FileSystem( disk, *fsit, humanname, removable, opts ); |
225 | mFileSystems.append( fs ); | 221 | mFileSystems.append( fs ); |
226 | } | 222 | } |
227 | emit disksChanged(); | 223 | emit disksChanged(); |
228 | } | 224 | } |
229 | else | 225 | else |
230 | { | 226 | { |
231 | // just update them | 227 | // just update them |
232 | for (QListIterator<FileSystem> i(mFileSystems); i.current(); ++i) | 228 | for (QListIterator<FileSystem> i(mFileSystems); i.current(); ++i) |
233 | i.current()->update(); | 229 | i.current()->update(); |
234 | } | 230 | } |
235 | #endif | 231 | #endif |
236 | } | 232 | } |
237 | 233 | ||
238 | bool deviceTab( const char *device) | 234 | bool deviceTab( const char *device) |
239 | { | 235 | { |
240 | QString name = device; | 236 | QString name = device; |
241 | bool hasDevice=false; | 237 | bool hasDevice=false; |
242 | 238 | ||
243 | #ifdef Q_OS_MACX | 239 | #ifdef Q_OS_MACX |
244 | // Darwin (MacOS X) | 240 | // Darwin (MacOS X) |
245 | struct statfs** mntbufp; | 241 | struct statfs** mntbufp; |
246 | int count = 0; | 242 | int count = 0; |
247 | if ( ( count = getmntinfo( mntbufp, MNT_WAIT ) ) == 0 ) | 243 | if ( ( count = getmntinfo( mntbufp, MNT_WAIT ) ) == 0 ) |
248 | { | 244 | { |
249 | qWarning("deviceTab: Error in getmntinfo(): %s",strerror( errno ) ); | 245 | qWarning("deviceTab: Error in getmntinfo(): %s",strerror( errno ) ); |
250 | hasDevice = false; | 246 | hasDevice = false; |
251 | } | 247 | } |
252 | for( int i = 0; i < count; i++ ) | 248 | for( int i = 0; i < count; i++ ) |
253 | { | 249 | { |
254 | QString deviceName = mntbufp[i]->f_mntfromname; | 250 | QString deviceName = mntbufp[i]->f_mntfromname; |
255 | qDebug(deviceName); | 251 | qDebug(deviceName); |
256 | if( deviceName.left( name.length() ) == name ) | 252 | if( deviceName.left( name.length() ) == name ) |
257 | hasDevice = true; | 253 | hasDevice = true; |
258 | } | 254 | } |
259 | #else | 255 | #else |
260 | // Linux | 256 | // Linux |
261 | struct mntent *me; | 257 | struct mntent *me; |
262 | FILE *mntfp = setmntent( "/etc/mtab", "r" ); | 258 | FILE *mntfp = setmntent( "/etc/mtab", "r" ); |
263 | if ( mntfp ) | 259 | if ( mntfp ) |
264 | { | 260 | { |
265 | while ( (me = getmntent( mntfp )) != 0 ) | 261 | while ( (me = getmntent( mntfp )) != 0 ) |
266 | { | 262 | { |
267 | QString deviceName = me->mnt_fsname; | 263 | QString deviceName = me->mnt_fsname; |
268 | // qDebug(deviceName); | 264 | // qDebug(deviceName); |
269 | if( deviceName.left(name.length()) == name) | 265 | if( deviceName.left(name.length()) == name) |
270 | { | 266 | { |
271 | hasDevice = true; | 267 | hasDevice = true; |
272 | } | 268 | } |
273 | } | 269 | } |
274 | } | 270 | } |
275 | endmntent( mntfp ); | 271 | endmntent( mntfp ); |
276 | #endif /* Q_OS_MACX */ | 272 | #endif /* Q_OS_MACX */ |
277 | 273 | ||
278 | 274 | ||
279 | return hasDevice; | 275 | return hasDevice; |
280 | } | 276 | } |
281 | 277 | ||
282 | /*! | 278 | /*! |
283 | * @fn static bool StorageInfo::hasCf() | 279 | * @fn static bool StorageInfo::hasCf() |
284 | * @brief returns whether device has Cf mounted | 280 | * @brief returns whether device has Cf mounted |
285 | * | 281 | * |
286 | */ | 282 | */ |
287 | bool StorageInfo::hasCf() | 283 | bool StorageInfo::hasCf() |
288 | { | 284 | { |
289 | return deviceTab("/dev/hd"); | 285 | return deviceTab("/dev/hd"); |
290 | } | 286 | } |
291 | 287 | ||
292 | /*! | 288 | /*! |
293 | * @fn static bool StorageInfo::hasSd() | 289 | * @fn static bool StorageInfo::hasSd() |
294 | * @brief returns whether device has SD mounted | 290 | * @brief returns whether device has SD mounted |
295 | * | 291 | * |
296 | */ | 292 | */ |
297 | bool StorageInfo::hasSd() | 293 | bool StorageInfo::hasSd() |
298 | { | 294 | { |
299 | return deviceTab("/dev/mmcd"); | 295 | return deviceTab("/dev/mmcd"); |
300 | } | 296 | } |
301 | 297 | ||
302 | /*! | 298 | /*! |
303 | * @fn static bool StorageInfo::hasMmc() | 299 | * @fn static bool StorageInfo::hasMmc() |
304 | * @brief returns whether device has mmc mounted | 300 | * @brief returns whether device has mmc mounted |
305 | * | 301 | * |
306 | */ | 302 | */ |
307 | bool StorageInfo::hasMmc() | 303 | bool StorageInfo::hasMmc() |
308 | { | 304 | { |
309 | bool hasMmc=false; | 305 | bool hasMmc=false; |
310 | if( deviceTab("/dev/mmc/part")) | 306 | if( deviceTab("/dev/mmc/part")) |
311 | hasMmc=true; | 307 | hasMmc=true; |
312 | if( deviceTab("/dev/mmcd")) | 308 | if( deviceTab("/dev/mmcd")) |
313 | hasMmc=true; | 309 | hasMmc=true; |
314 | return hasMmc; | 310 | return hasMmc; |
315 | } | 311 | } |
316 | 312 | ||
317 | /*! \fn const QList<FileSystem> &StorageInfo::fileSystems() const | 313 | /*! \fn const QList<FileSystem> &StorageInfo::fileSystems() const |
318 | Returns a list of all available mounted file systems. | 314 | Returns a list of all available mounted file systems. |
319 | 315 | ||
320 | \warning This may change in Qtopia 3.x to return only relevant Qtopia file systems (and ignore mount points such as /tmp) | 316 | \warning This may change in Qtopia 3.x to return only relevant Qtopia file systems (and ignore mount points such as /tmp) |
321 | */ | 317 | */ |
322 | 318 | ||
323 | /*! \fn void StorageInfo::disksChanged() | 319 | /*! \fn void StorageInfo::disksChanged() |
324 | Gets emitted when a disk has been mounted or unmounted, such as when | 320 | Gets emitted when a disk has been mounted or unmounted, such as when |
325 | a CF c | 321 | a CF c |
326 | */ | 322 | */ |
327 | //--------------------------------------------------------------------------- | 323 | //--------------------------------------------------------------------------- |
328 | 324 | ||
329 | FileSystem::FileSystem( const QString &disk, const QString &path, const QString &name, bool rem, const QString &o ) | 325 | FileSystem::FileSystem( const QString &disk, const QString &path, const QString &name, bool rem, const QString &o ) |
330 | : fsdisk( disk ), fspath( path ), humanname( name ), blkSize(512), totalBlks(0), availBlks(0), removable( rem ), opts( o ) | 326 | : fsdisk( disk ), fspath( path ), humanname( name ), blkSize(512), totalBlks(0), availBlks(0), removable( rem ), opts( o ) |
331 | { | 327 | { |
332 | update(); | 328 | update(); |
333 | } | 329 | } |
334 | 330 | ||
335 | void FileSystem::update() | 331 | void FileSystem::update() |
336 | { | 332 | { |
337 | #if defined(_OS_LINUX_) || defined(Q_OS_LINUX) | 333 | #if defined(_OS_LINUX_) || defined(Q_OS_LINUX) |
338 | struct statfs fs; | 334 | struct statfs fs; |
339 | if ( !statfs( fspath.latin1(), &fs ) ) | 335 | if ( !statfs( fspath.latin1(), &fs ) ) |
340 | { | 336 | { |
341 | blkSize = fs.f_bsize; | 337 | blkSize = fs.f_bsize; |
342 | totalBlks = fs.f_blocks; | 338 | totalBlks = fs.f_blocks; |
343 | availBlks = fs.f_bavail; | 339 | availBlks = fs.f_bavail; |
344 | } | 340 | } |
345 | else | 341 | else |
346 | { | 342 | { |
347 | blkSize = 0; | 343 | blkSize = 0; |
348 | totalBlks = 0; | 344 | totalBlks = 0; |
349 | availBlks = 0; | 345 | availBlks = 0; |
350 | } | 346 | } |
351 | #endif | 347 | #endif |
352 | } | 348 | } |
353 | 349 | ||
354 | /*! \class FileSystem storage.h | 350 | /*! \class FileSystem storage.h |
355 | \brief The FileSystem class describes a single mount point. | 351 | \brief The FileSystem class describes a single mount point. |
356 | 352 | ||
357 | This class simply returns information about a mount point, including | 353 | This class simply returns information about a mount point, including |
358 | file system name, mount point, human readable name, size information | 354 | file system name, mount point, human readable name, size information |
359 | and mount options information. | 355 | and mount options information. |
360 | \ingroup qtopiaemb | 356 | \ingroup qtopiaemb |
361 | 357 | ||
362 | \sa StorageInfo | 358 | \sa StorageInfo |
363 | */ | 359 | */ |
364 | 360 | ||
365 | /*! \fn const QString &FileSystem::disk() const | 361 | /*! \fn const QString &FileSystem::disk() const |
366 | Returns the file system name, such as /dev/hda3 | 362 | Returns the file system name, such as /dev/hda3 |
367 | */ | 363 | */ |
368 | 364 | ||
369 | /*! \fn const QString &FileSystem::path() const | 365 | /*! \fn const QString &FileSystem::path() const |
370 | Returns the mount path, such as /home | 366 | Returns the mount path, such as /home |
371 | */ | 367 | */ |
372 | 368 | ||
373 | /*! \fn const QString &FileSystem::name() const | 369 | /*! \fn const QString &FileSystem::name() const |
374 | Returns the translated, human readable name for the mount directory. | 370 | Returns the translated, human readable name for the mount directory. |
375 | */ | 371 | */ |
376 | 372 | ||
377 | /*! \fn const QString &FileSystem::options() const | 373 | /*! \fn const QString &FileSystem::options() const |
378 | Returns the mount options | 374 | Returns the mount options |
379 | */ | 375 | */ |
380 | 376 | ||
381 | /*! \fn long FileSystem::blockSize() const | 377 | /*! \fn long FileSystem::blockSize() const |
382 | Returns the size of each block on the file system. | 378 | Returns the size of each block on the file system. |
383 | */ | 379 | */ |
384 | 380 | ||
385 | /*! \fn long FileSystem::totalBlocks() const | 381 | /*! \fn long FileSystem::totalBlocks() const |
386 | Returns the total number of blocks on the file system | 382 | Returns the total number of blocks on the file system |
387 | */ | 383 | */ |
388 | 384 | ||
389 | /*! \fn long FileSystem::availBlocks() const | 385 | /*! \fn long FileSystem::availBlocks() const |
390 | Returns the number of available blocks on the file system | 386 | Returns the number of available blocks on the file system |
391 | */ | 387 | */ |
392 | 388 | ||
393 | /*! \fn bool FileSystem::isRemovable() const | 389 | /*! \fn bool FileSystem::isRemovable() const |
394 | Returns flag whether the file system can be removed, such as a CF card | 390 | Returns flag whether the file system can be removed, such as a CF card |
395 | would be removable, but the internal memory wouldn't | 391 | would be removable, but the internal memory wouldn't |
396 | */ | 392 | */ |
397 | 393 | ||
398 | /*! \fn bool FileSystem::isWritable() const | 394 | /*! \fn bool FileSystem::isWritable() const |
399 | Returns flag whether the file system is mounted as writable or read-only. | 395 | Returns flag whether the file system is mounted as writable or read-only. |
400 | Returns FALSE if read-only, TRUE if read and write. | 396 | Returns FALSE if read-only, TRUE if read and write. |
401 | */ | 397 | */ |
402 | 398 | ||
403 | /*! \fn QStringList StorageInfo::fileSystemNames() const | 399 | /*! \fn QStringList StorageInfo::fileSystemNames() const |
404 | Returns a list of filesystem names. | 400 | Returns a list of filesystem names. |
405 | */ | 401 | */ |
diff --git a/library/tzselect.cpp b/library/tzselect.cpp index 4343eab..f28100b 100644 --- a/library/tzselect.cpp +++ b/library/tzselect.cpp | |||
@@ -1,303 +1,302 @@ | |||
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 | 20 | ||
21 | #define QTOPIA_INTERNAL_TZSELECT_INC_LOCAL | 21 | #define QTOPIA_INTERNAL_TZSELECT_INC_LOCAL |
22 | 22 | ||
23 | #include "tzselect.h" | 23 | #include "tzselect.h" |
24 | #include "resource.h" | 24 | #include "resource.h" |
25 | #include "global.h" | ||
26 | #include "config.h" | 25 | #include "config.h" |
27 | #include <qtoolbutton.h> | 26 | #include <qtoolbutton.h> |
28 | #include <qfile.h> | 27 | #include <qfile.h> |
29 | #include <stdlib.h> | 28 | #include <stdlib.h> |
30 | 29 | ||
31 | #include <qcopchannel_qws.h> | 30 | #include <qcopchannel_qws.h> |
32 | #include <qpe/qpeapplication.h> | 31 | #include <qpe/qpeapplication.h> |
33 | #include <qmessagebox.h> | 32 | #include <qmessagebox.h> |
34 | 33 | ||
35 | /*! | 34 | /*! |
36 | \class TimeZoneSelector | 35 | \class TimeZoneSelector |
37 | 36 | ||
38 | \brief The TimeZoneSelector widget allows users to configure their time zone information. | 37 | \brief The TimeZoneSelector widget allows users to configure their time zone information. |
39 | 38 | ||
40 | \ingroup qtopiaemb | 39 | \ingroup qtopiaemb |
41 | */ | 40 | */ |
42 | 41 | ||
43 | class TimeZoneSelectorPrivate | 42 | class TimeZoneSelectorPrivate |
44 | { | 43 | { |
45 | public: | 44 | public: |
46 | TimeZoneSelectorPrivate() : includeLocal(FALSE) {} | 45 | TimeZoneSelectorPrivate() : includeLocal(FALSE) {} |
47 | bool includeLocal; | 46 | bool includeLocal; |
48 | }; | 47 | }; |
49 | 48 | ||
50 | TZCombo::TZCombo( QWidget *p, const char* n ) | 49 | TZCombo::TZCombo( QWidget *p, const char* n ) |
51 | : QComboBox( p, n ) | 50 | : QComboBox( p, n ) |
52 | { | 51 | { |
53 | updateZones(); | 52 | updateZones(); |
54 | // check to see if TZ is set, if it is set the current item to that | 53 | // check to see if TZ is set, if it is set the current item to that |
55 | QString tz = getenv("TZ"); | 54 | QString tz = getenv("TZ"); |
56 | if (parent()->inherits("TimeZoneSelector")) { | 55 | if (parent()->inherits("TimeZoneSelector")) { |
57 | if ( ((TimeZoneSelector *)parent())->localIncluded() ) { | 56 | if ( ((TimeZoneSelector *)parent())->localIncluded() ) { |
58 | // overide to the 'local' type. | 57 | // overide to the 'local' type. |
59 | tz = "None"; | 58 | tz = "None"; |
60 | } | 59 | } |
61 | } | 60 | } |
62 | if ( !tz.isNull() ) { | 61 | if ( !tz.isNull() ) { |
63 | int n = 0, | 62 | int n = 0, |
64 | index = 0; | 63 | index = 0; |
65 | for ( QStringList::Iterator it=identifiers.begin(); | 64 | for ( QStringList::Iterator it=identifiers.begin(); |
66 | it!=identifiers.end(); ++it) { | 65 | it!=identifiers.end(); ++it) { |
67 | if ( *it == tz ) | 66 | if ( *it == tz ) |
68 | index = n; | 67 | index = n; |
69 | n++; | 68 | n++; |
70 | } | 69 | } |
71 | setCurrentItem(index); | 70 | setCurrentItem(index); |
72 | } else { | 71 | } else { |
73 | setCurrentItem(0); | 72 | setCurrentItem(0); |
74 | } | 73 | } |
75 | 74 | ||
76 | 75 | ||
77 | 76 | ||
78 | // listen on QPE/System | 77 | // listen on QPE/System |
79 | #if !defined(QT_NO_COP) | 78 | #if !defined(QT_NO_COP) |
80 | QCopChannel *channel = new QCopChannel( "QPE/System", this ); | 79 | QCopChannel *channel = new QCopChannel( "QPE/System", this ); |
81 | connect( channel, SIGNAL(received(const QCString&, const QByteArray&)), | 80 | connect( channel, SIGNAL(received(const QCString&, const QByteArray&)), |
82 | this, SLOT(handleSystemChannel(const QCString&, const QByteArray&)) ); | 81 | this, SLOT(handleSystemChannel(const QCString&, const QByteArray&)) ); |
83 | #endif | 82 | #endif |
84 | 83 | ||
85 | 84 | ||
86 | } | 85 | } |
87 | 86 | ||
88 | TZCombo::~TZCombo() | 87 | TZCombo::~TZCombo() |
89 | { | 88 | { |
90 | } | 89 | } |
91 | 90 | ||
92 | void TZCombo::updateZones() | 91 | void TZCombo::updateZones() |
93 | { | 92 | { |
94 | QString cur = currentText(); | 93 | QString cur = currentText(); |
95 | clear(); | 94 | clear(); |
96 | identifiers.clear(); | 95 | identifiers.clear(); |
97 | int curix=0; | 96 | int curix=0; |
98 | QString tz = getenv("TZ"); | 97 | QString tz = getenv("TZ"); |
99 | bool tzFound = FALSE; | 98 | bool tzFound = FALSE; |
100 | Config cfg("CityTime"); | 99 | Config cfg("CityTime"); |
101 | cfg.setGroup("TimeZones"); | 100 | cfg.setGroup("TimeZones"); |
102 | int listIndex = 0; | 101 | int listIndex = 0; |
103 | if (parent()->inherits("TimeZoneSelector")) { | 102 | if (parent()->inherits("TimeZoneSelector")) { |
104 | if ( ((TimeZoneSelector *)parent())->localIncluded() ) { | 103 | if ( ((TimeZoneSelector *)parent())->localIncluded() ) { |
105 | // overide to the 'local' type. | 104 | // overide to the 'local' type. |
106 | identifiers.append( "None" ); | 105 | identifiers.append( "None" ); |
107 | insertItem( tr("None") ); | 106 | insertItem( tr("None") ); |
108 | if ( cur == tr("None")) | 107 | if ( cur == tr("None")) |
109 | curix = 0; | 108 | curix = 0; |
110 | listIndex++; | 109 | listIndex++; |
111 | } | 110 | } |
112 | } | 111 | } |
113 | int cfgIndex = 0; | 112 | int cfgIndex = 0; |
114 | while (1) { | 113 | while (1) { |
115 | QString zn = cfg.readEntry("Zone"+QString::number(cfgIndex), QString::null); | 114 | QString zn = cfg.readEntry("Zone"+QString::number(cfgIndex), QString::null); |
116 | if ( zn.isNull() ) | 115 | if ( zn.isNull() ) |
117 | break; | 116 | break; |
118 | if ( zn == tz ) | 117 | if ( zn == tz ) |
119 | tzFound = TRUE; | 118 | tzFound = TRUE; |
120 | QString nm = cfg.readEntry("ZoneName"+QString::number(cfgIndex)); | 119 | QString nm = cfg.readEntry("ZoneName"+QString::number(cfgIndex)); |
121 | identifiers.append(zn); | 120 | identifiers.append(zn); |
122 | insertItem(nm); | 121 | insertItem(nm); |
123 | if ( nm == cur ) | 122 | if ( nm == cur ) |
124 | curix = listIndex; | 123 | curix = listIndex; |
125 | ++cfgIndex; | 124 | ++cfgIndex; |
126 | ++listIndex; | 125 | ++listIndex; |
127 | } | 126 | } |
128 | if ( !listIndex ) { | 127 | if ( !listIndex ) { |
129 | QStringList list = timezoneDefaults(); | 128 | QStringList list = timezoneDefaults(); |
130 | for ( QStringList::Iterator it = list.begin(); it!=list.end(); ++it ) { | 129 | for ( QStringList::Iterator it = list.begin(); it!=list.end(); ++it ) { |
131 | QString zn = *it; | 130 | QString zn = *it; |
132 | QString nm = *++it; | 131 | QString nm = *++it; |
133 | if ( zn == tz ) | 132 | if ( zn == tz ) |
134 | tzFound = TRUE; | 133 | tzFound = TRUE; |
135 | if ( nm == cur ) | 134 | if ( nm == cur ) |
136 | curix = listIndex; | 135 | curix = listIndex; |
137 | identifiers.append(zn); | 136 | identifiers.append(zn); |
138 | insertItem(nm); | 137 | insertItem(nm); |
139 | ++listIndex; | 138 | ++listIndex; |
140 | } | 139 | } |
141 | } | 140 | } |
142 | for (QStringList::Iterator it=extras.begin(); it!=extras.end(); ++it) { | 141 | for (QStringList::Iterator it=extras.begin(); it!=extras.end(); ++it) { |
143 | insertItem(*it); | 142 | insertItem(*it); |
144 | identifiers.append(*it); | 143 | identifiers.append(*it); |
145 | if ( *it == cur ) | 144 | if ( *it == cur ) |
146 | curix = listIndex; | 145 | curix = listIndex; |
147 | ++listIndex; | 146 | ++listIndex; |
148 | } | 147 | } |
149 | if ( !tzFound && !tz.isEmpty()) { | 148 | if ( !tzFound && !tz.isEmpty()) { |
150 | int i = tz.find( '/' ); | 149 | int i = tz.find( '/' ); |
151 | QString nm = tz.mid( i+1 ).replace(QRegExp("_"), " "); | 150 | QString nm = tz.mid( i+1 ).replace(QRegExp("_"), " "); |
152 | identifiers.append(tz); | 151 | identifiers.append(tz); |
153 | insertItem(nm); | 152 | insertItem(nm); |
154 | if ( nm == cur ) | 153 | if ( nm == cur ) |
155 | curix = listIndex; | 154 | curix = listIndex; |
156 | ++listIndex; | 155 | ++listIndex; |
157 | } | 156 | } |
158 | setCurrentItem(curix); | 157 | setCurrentItem(curix); |
159 | } | 158 | } |
160 | 159 | ||
161 | 160 | ||
162 | void TZCombo::keyPressEvent( QKeyEvent *e ) | 161 | void TZCombo::keyPressEvent( QKeyEvent *e ) |
163 | { | 162 | { |
164 | // ### should popup() in Qt 3.0 (it's virtual there) | 163 | // ### should popup() in Qt 3.0 (it's virtual there) |
165 | // updateZones(); | 164 | // updateZones(); |
166 | QComboBox::keyPressEvent(e); | 165 | QComboBox::keyPressEvent(e); |
167 | } | 166 | } |
168 | 167 | ||
169 | void TZCombo::mousePressEvent(QMouseEvent*e) | 168 | void TZCombo::mousePressEvent(QMouseEvent*e) |
170 | { | 169 | { |
171 | // ### should popup() in Qt 3.0 (it's virtual there) | 170 | // ### should popup() in Qt 3.0 (it's virtual there) |
172 | // updateZones(); | 171 | // updateZones(); |
173 | QComboBox::mousePressEvent(e); | 172 | QComboBox::mousePressEvent(e); |
174 | } | 173 | } |
175 | 174 | ||
176 | QString TZCombo::currZone() const | 175 | QString TZCombo::currZone() const |
177 | { | 176 | { |
178 | return identifiers[currentItem()]; | 177 | return identifiers[currentItem()]; |
179 | } | 178 | } |
180 | 179 | ||
181 | void TZCombo::setCurrZone( const QString& id ) | 180 | void TZCombo::setCurrZone( const QString& id ) |
182 | { | 181 | { |
183 | for (int i=0; i< count(); i++) { | 182 | for (int i=0; i< count(); i++) { |
184 | if ( identifiers[i] == id ) { | 183 | if ( identifiers[i] == id ) { |
185 | setCurrentItem(i); | 184 | setCurrentItem(i); |
186 | return; | 185 | return; |
187 | } | 186 | } |
188 | } | 187 | } |
189 | insertItem(id); | 188 | insertItem(id); |
190 | setCurrentItem( count() - 1); | 189 | setCurrentItem( count() - 1); |
191 | identifiers.append(id); | 190 | identifiers.append(id); |
192 | extras.append(id); | 191 | extras.append(id); |
193 | } | 192 | } |
194 | 193 | ||
195 | 194 | ||
196 | 195 | ||
197 | void TZCombo::handleSystemChannel(const QCString&msg, const QByteArray&) | 196 | void TZCombo::handleSystemChannel(const QCString&msg, const QByteArray&) |
198 | { | 197 | { |
199 | if ( msg == "timeZoneListChange()" ) { | 198 | if ( msg == "timeZoneListChange()" ) { |
200 | updateZones(); | 199 | updateZones(); |
201 | } | 200 | } |
202 | } | 201 | } |
203 | 202 | ||
204 | /*! | 203 | /*! |
205 | Creates a new TimeZoneSelector with parent \a p and name \a n. The combobox will be | 204 | Creates a new TimeZoneSelector with parent \a p and name \a n. The combobox will be |
206 | populated with the available timezones. | 205 | populated with the available timezones. |
207 | */ | 206 | */ |
208 | 207 | ||
209 | TimeZoneSelector::TimeZoneSelector(QWidget* p, const char* n) : | 208 | TimeZoneSelector::TimeZoneSelector(QWidget* p, const char* n) : |
210 | QHBox(p,n) | 209 | QHBox(p,n) |
211 | { | 210 | { |
212 | d = new TimeZoneSelectorPrivate(); | 211 | d = new TimeZoneSelectorPrivate(); |
213 | // build the combobox before we do any updates... | 212 | // build the combobox before we do any updates... |
214 | cmbTz = new TZCombo( this, "timezone combo" ); | 213 | cmbTz = new TZCombo( this, "timezone combo" ); |
215 | 214 | ||
216 | cmdTz = new QToolButton( this, "timezone button" ); | 215 | cmdTz = new QToolButton( this, "timezone button" ); |
217 | cmdTz->setIconSet( Resource::loadIconSet( "citytime_icon" ) ); | 216 | cmdTz->setIconSet( Resource::loadIconSet( "citytime_icon" ) ); |
218 | cmdTz->setMaximumSize( cmdTz->sizeHint() ); | 217 | cmdTz->setMaximumSize( cmdTz->sizeHint() ); |
219 | 218 | ||
220 | // set up a connection to catch a newly selected item and throw our | 219 | // set up a connection to catch a newly selected item and throw our |
221 | // signal | 220 | // signal |
222 | QObject::connect( cmbTz, SIGNAL( activated( int ) ), | 221 | QObject::connect( cmbTz, SIGNAL( activated( int ) ), |
223 | this, SLOT( slotTzActive( int ) ) ); | 222 | this, SLOT( slotTzActive( int ) ) ); |
224 | QObject::connect( cmdTz, SIGNAL( clicked() ), | 223 | QObject::connect( cmdTz, SIGNAL( clicked() ), |
225 | this, SLOT( slotExecute() ) ); | 224 | this, SLOT( slotExecute() ) ); |
226 | } | 225 | } |
227 | 226 | ||
228 | /*! | 227 | /*! |
229 | Destroys a TimeZoneSelector. | 228 | Destroys a TimeZoneSelector. |
230 | */ | 229 | */ |
231 | TimeZoneSelector::~TimeZoneSelector() | 230 | TimeZoneSelector::~TimeZoneSelector() |
232 | { | 231 | { |
233 | } | 232 | } |
234 | 233 | ||
235 | void TimeZoneSelector::setLocalIncluded(bool b) | 234 | void TimeZoneSelector::setLocalIncluded(bool b) |
236 | { | 235 | { |
237 | d->includeLocal = b; | 236 | d->includeLocal = b; |
238 | cmbTz->updateZones(); | 237 | cmbTz->updateZones(); |
239 | } | 238 | } |
240 | 239 | ||
241 | bool TimeZoneSelector::localIncluded() const | 240 | bool TimeZoneSelector::localIncluded() const |
242 | { | 241 | { |
243 | return d->includeLocal; | 242 | return d->includeLocal; |
244 | } | 243 | } |
245 | 244 | ||
246 | /*! | 245 | /*! |
247 | Returns the currently selected timezone as a string in location format, e.g. | 246 | Returns the currently selected timezone as a string in location format, e.g. |
248 | \code Australia/Brisbane \endcode | 247 | \code Australia/Brisbane \endcode |
249 | */ | 248 | */ |
250 | QString TimeZoneSelector::currentZone() const | 249 | QString TimeZoneSelector::currentZone() const |
251 | { | 250 | { |
252 | return cmbTz->currZone(); | 251 | return cmbTz->currZone(); |
253 | } | 252 | } |
254 | 253 | ||
255 | /*! | 254 | /*! |
256 | Sets the current timezone to \a id. | 255 | Sets the current timezone to \a id. |
257 | */ | 256 | */ |
258 | void TimeZoneSelector::setCurrentZone( const QString& id ) | 257 | void TimeZoneSelector::setCurrentZone( const QString& id ) |
259 | { | 258 | { |
260 | cmbTz->setCurrZone( id ); | 259 | cmbTz->setCurrZone( id ); |
261 | } | 260 | } |
262 | /*! \fn void TimeZoneSelector::signalNewTz( const QString& id ) | 261 | /*! \fn void TimeZoneSelector::signalNewTz( const QString& id ) |
263 | This signal is emitted when a timezone has been selected by the user. The id | 262 | This signal is emitted when a timezone has been selected by the user. The id |
264 | is a \l QString in location format, eg \code Australia/Brisbane \endcode | 263 | is a \l QString in location format, eg \code Australia/Brisbane \endcode |
265 | */ | 264 | */ |
266 | 265 | ||
267 | 266 | ||
268 | void TimeZoneSelector::slotTzActive( int ) | 267 | void TimeZoneSelector::slotTzActive( int ) |
269 | { | 268 | { |
270 | emit signalNewTz( cmbTz->currZone() ); | 269 | emit signalNewTz( cmbTz->currZone() ); |
271 | } | 270 | } |
272 | 271 | ||
273 | void TimeZoneSelector::slotExecute( void ) | 272 | void TimeZoneSelector::slotExecute( void ) |
274 | { | 273 | { |
275 | // execute the world time application... | 274 | // execute the world time application... |
276 | if (QFile::exists(QPEApplication::qpeDir()+"bin/citytime")) | 275 | if (QFile::exists(QPEApplication::qpeDir()+"bin/citytime")) |
277 | Global::execute( "citytime" ); | 276 | Global::execute( "citytime" ); |
278 | else | 277 | else |
279 | QMessageBox::warning(this,tr("citytime executable not found"), | 278 | QMessageBox::warning(this,tr("citytime executable not found"), |
280 | tr("In order to choose the time zones,\nplease install citytime.")); | 279 | tr("In order to choose the time zones,\nplease install citytime.")); |
281 | } | 280 | } |
282 | 281 | ||
283 | QStringList timezoneDefaults( void ) | 282 | QStringList timezoneDefaults( void ) |
284 | { | 283 | { |
285 | QStringList tzs; | 284 | QStringList tzs; |
286 | // load up the list just like the file format (citytime.cpp) | 285 | // load up the list just like the file format (citytime.cpp) |
287 | tzs.append( "America/New_York" ); | 286 | tzs.append( "America/New_York" ); |
288 | tzs.append( "New York" ); | 287 | tzs.append( "New York" ); |
289 | tzs.append( "America/Los_Angeles" ); | 288 | tzs.append( "America/Los_Angeles" ); |
290 | tzs.append( "Los Angeles" ); | 289 | tzs.append( "Los Angeles" ); |
291 | tzs.append( "Australia/Brisbane" ); | 290 | tzs.append( "Australia/Brisbane" ); |
292 | tzs.append( "Brisbane" ); | 291 | tzs.append( "Brisbane" ); |
293 | tzs.append( "Europe/Berlin" ); | 292 | tzs.append( "Europe/Berlin" ); |
294 | tzs.append( "Berlin" ); | 293 | tzs.append( "Berlin" ); |
295 | tzs.append( "Asia/Tokyo" ); | 294 | tzs.append( "Asia/Tokyo" ); |
296 | tzs.append( "Tokyo" ); | 295 | tzs.append( "Tokyo" ); |
297 | tzs.append( "America/Denver" ); | 296 | tzs.append( "America/Denver" ); |
298 | tzs.append( "Denver" ); | 297 | tzs.append( "Denver" ); |
299 | 298 | ||
300 | return tzs; | 299 | return tzs; |
301 | } | 300 | } |
302 | 301 | ||
303 | 302 | ||