25 files changed, 1 insertions, 67 deletions
diff --git a/libopie2/opiecore/odebug.cpp b/libopie2/opiecore/odebug.cpp index 4505ce7..a40ef53 100644 --- a/libopie2/opiecore/odebug.cpp +++ b/libopie2/opiecore/odebug.cpp | |||
@@ -1,631 +1,620 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | (C) 2003 Michael 'Mickey' Lauer (mickey@tm.informatik.uni-frankfurt.de) | 3 | (C) 2003 Michael 'Mickey' Lauer (mickey@tm.informatik.uni-frankfurt.de) |
4 | (C) 2002 Holger Freyther (freyther@kde.org) | 4 | (C) 2002 Holger Freyther (freyther@kde.org) |
5 | (C) 1997 Matthias Kalle Dalheimer (kalle@kde.org) | 5 | (C) 1997 Matthias Kalle Dalheimer (kalle@kde.org) |
6 | =. | 6 | =. |
7 | .=l. | 7 | .=l. |
8 | .>+-= | 8 | .>+-= |
9 | _;:, .> :=|. This program is free software; you can | 9 | _;:, .> :=|. This program is free software; you can |
10 | .> <`_, > . <= redistribute it and/or modify it under | 10 | .> <`_, > . <= redistribute it and/or modify it under |
11 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 11 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
12 | .="- .-=="i, .._ License as published by the Free Software | 12 | .="- .-=="i, .._ License as published by the Free Software |
13 | - . .-<_> .<> Foundation; either version 2 of the License, | 13 | - . .-<_> .<> Foundation; either version 2 of the License, |
14 | ._= =} : or (at your option) any later version. | 14 | ._= =} : or (at your option) any later version. |
15 | .%`+i> _;_. | 15 | .%`+i> _;_. |
16 | .i_,=:_. -<s. This program is distributed in the hope that | 16 | .i_,=:_. -<s. This program is distributed in the hope that |
17 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 17 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
18 | : .. .:, . . . without even the implied warranty of | 18 | : .. .:, . . . without even the implied warranty of |
19 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 19 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
20 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 20 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
21 | ..}^=.= = ; Library General Public License for more | 21 | ..}^=.= = ; Library General Public License for more |
22 | ++= -. .` .: details. | 22 | ++= -. .` .: details. |
23 | : = ...= . :.=- | 23 | : = ...= . :.=- |
24 | -. .:....=;==+<; You should have received a copy of the GNU | 24 | -. .:....=;==+<; You should have received a copy of the GNU |
25 | -_. . . )=. = Library General Public License along with | 25 | -_. . . )=. = Library General Public License along with |
26 | -- :-=` this library; see the file COPYING.LIB. | 26 | -- :-=` this library; see the file COPYING.LIB. |
27 | If not, write to the Free Software Foundation, | 27 | If not, write to the Free Software Foundation, |
28 | Inc., 59 Temple Place - Suite 330, | 28 | Inc., 59 Temple Place - Suite 330, |
29 | Boston, MA 02111-1307, USA. | 29 | Boston, MA 02111-1307, USA. |
30 | */ | 30 | */ |
31 | 31 | ||
32 | // Include this header without OPIE_NO_DEBUG defined to avoid having the oDebugInfo | 32 | // Include this header without OPIE_NO_DEBUG defined to avoid having the oDebugInfo |
33 | // functions inlined to noops (which would then conflict with their definition here). | 33 | // functions inlined to noops (which would then conflict with their definition here). |
34 | 34 | ||
35 | #include <opie2/odebug.h> | 35 | #include <opie2/odebug.h> |
36 | 36 | ||
37 | #ifdef OPIE_NO_DEBUG | 37 | #ifdef OPIE_NO_DEBUG |
38 | #undef odDebug | 38 | #undef odDebug |
39 | #undef odBacktrace | 39 | #undef odBacktrace |
40 | #endif | 40 | #endif |
41 | 41 | ||
42 | /* OPIE */ | 42 | /* OPIE */ |
43 | 43 | ||
44 | #include <opie2/oapplication.h> | 44 | #include <opie2/oapplication.h> |
45 | #include <opie2/oglobalsettings.h> | 45 | #include <opie2/oglobalsettings.h> |
46 | #include <opie2/oconfig.h> | 46 | #include <opie2/oconfig.h> |
47 | 47 | ||
48 | /* QT */ | 48 | /* QT */ |
49 | 49 | ||
50 | #include <qbrush.h> | ||
51 | #include <qdatetime.h> | ||
52 | #include <qfile.h> | 50 | #include <qfile.h> |
53 | #include <qhostaddress.h> | ||
54 | #include <qmessagebox.h> | 51 | #include <qmessagebox.h> |
55 | #include <qintdict.h> | ||
56 | #include <qpoint.h> | ||
57 | #include <qrect.h> | ||
58 | #include <qregion.h> | ||
59 | #include <qsize.h> | ||
60 | #include <qsocketdevice.h> | 52 | #include <qsocketdevice.h> |
61 | #include <qstring.h> | ||
62 | #include <qstringlist.h> | ||
63 | #include <qtextstream.h> | ||
64 | 53 | ||
65 | /* UNIX */ | 54 | /* UNIX */ |
66 | 55 | ||
67 | #include <stdlib.h> // abort | 56 | #include <stdlib.h> // abort |
68 | #include <unistd.h> // getpid | 57 | #include <unistd.h> // getpid |
69 | #include <stdarg.h> // vararg stuff | 58 | #include <stdarg.h> // vararg stuff |
70 | #include <ctype.h> // isprint | 59 | #include <ctype.h> // isprint |
71 | #include <syslog.h> | 60 | #include <syslog.h> |
72 | #include <errno.h> | 61 | #include <errno.h> |
73 | #include <string.h> | 62 | #include <string.h> |
74 | 63 | ||
75 | #ifndef OPIE_NO_BACKTRACE | 64 | #ifndef OPIE_NO_BACKTRACE |
76 | #include <execinfo.h> | 65 | #include <execinfo.h> |
77 | #endif | 66 | #endif |
78 | 67 | ||
79 | 68 | ||
80 | /*====================================================================================== | 69 | /*====================================================================================== |
81 | * debug levels | 70 | * debug levels |
82 | *======================================================================================*/ | 71 | *======================================================================================*/ |
83 | 72 | ||
84 | enum DebugLevels { | 73 | enum DebugLevels { |
85 | ODEBUG_INFO = 0, | 74 | ODEBUG_INFO = 0, |
86 | ODEBUG_WARN = 1, | 75 | ODEBUG_WARN = 1, |
87 | ODEBUG_ERROR = 2, | 76 | ODEBUG_ERROR = 2, |
88 | ODEBUG_FATAL = 3 | 77 | ODEBUG_FATAL = 3 |
89 | }; | 78 | }; |
90 | 79 | ||
91 | /*====================================================================================== | 80 | /*====================================================================================== |
92 | * oDebug private data | 81 | * oDebug private data |
93 | *======================================================================================*/ | 82 | *======================================================================================*/ |
94 | 83 | ||
95 | /*====================================================================================== | 84 | /*====================================================================================== |
96 | * the main debug function | 85 | * the main debug function |
97 | *======================================================================================*/ | 86 | *======================================================================================*/ |
98 | 87 | ||
99 | static void oDebugBackend( unsigned short level, unsigned int area, const char *data) | 88 | static void oDebugBackend( unsigned short level, unsigned int area, const char *data) |
100 | { | 89 | { |
101 | //qDebug( "oDebugBackend: Level=%d, Area=%d, Data=%s", level, area, data ); | 90 | //qDebug( "oDebugBackend: Level=%d, Area=%d, Data=%s", level, area, data ); |
102 | 91 | ||
103 | // ML: OPIE doesn't use areacodes at the moment. See the KDE debug classes for an | 92 | // ML: OPIE doesn't use areacodes at the moment. See the KDE debug classes for an |
104 | // ML: example use. I think it's not necessary to implement such a strategy here. | 93 | // ML: example use. I think it's not necessary to implement such a strategy here. |
105 | // ML: Comments? | 94 | // ML: Comments? |
106 | 95 | ||
107 | int priority = 0; | 96 | int priority = 0; |
108 | QString caption; | 97 | QString caption; |
109 | QString lev; | 98 | QString lev; |
110 | switch( level ) | 99 | switch( level ) |
111 | { | 100 | { |
112 | case ODEBUG_INFO: lev = "(Info)"; caption = "Info"; priority = LOG_INFO; break; | 101 | case ODEBUG_INFO: lev = "(Info)"; caption = "Info"; priority = LOG_INFO; break; |
113 | case ODEBUG_WARN: lev = "(Warn)"; caption = "Warning"; priority = LOG_WARNING; break; | 102 | case ODEBUG_WARN: lev = "(Warn)"; caption = "Warning"; priority = LOG_WARNING; break; |
114 | case ODEBUG_FATAL: lev = "(Fatal)"; caption = "Fatal Error"; priority = LOG_CRIT; break; | 103 | case ODEBUG_FATAL: lev = "(Fatal)"; caption = "Fatal Error"; priority = LOG_CRIT; break; |
115 | default: qDebug( "oDebugBackend: Warning: Unknown debug level! - defaulting to ODEBUG_ERROR." ); | 104 | default: qDebug( "oDebugBackend: Warning: Unknown debug level! - defaulting to ODEBUG_ERROR." ); |
116 | case ODEBUG_ERROR: lev = "(Error)"; caption = "Error"; priority = LOG_ERR; break; | 105 | case ODEBUG_ERROR: lev = "(Error)"; caption = "Error"; priority = LOG_ERR; break; |
117 | } | 106 | } |
118 | 107 | ||
119 | short output = OGlobalSettings::debugMode(); | 108 | short output = OGlobalSettings::debugMode(); |
120 | if (!oApp && (output == 1)) | 109 | if (!oApp && (output == 1)) |
121 | { | 110 | { |
122 | qDebug( "oDebugBackend: Warning: no oapplication object - can't use MsgBox" ); | 111 | qDebug( "oDebugBackend: Warning: no oapplication object - can't use MsgBox" ); |
123 | output = 2; // need an application object to use MsgBox | 112 | output = 2; // need an application object to use MsgBox |
124 | } | 113 | } |
125 | 114 | ||
126 | // gcc 2.9x is dumb and sucks... can you hear it? | 115 | // gcc 2.9x is dumb and sucks... can you hear it? |
127 | //QString areaName = (oApp) ? oApp->appName() : "<unknown>"; | 116 | //QString areaName = (oApp) ? oApp->appName() : "<unknown>"; |
128 | QString areaName; | 117 | QString areaName; |
129 | if ( oApp ) areaName = oApp->appName(); | 118 | if ( oApp ) areaName = oApp->appName(); |
130 | else areaName = "<unknown>"; | 119 | else areaName = "<unknown>"; |
131 | 120 | ||
132 | // Output | 121 | // Output |
133 | switch( output ) | 122 | switch( output ) |
134 | { | 123 | { |
135 | case -1: // ignore | 124 | case -1: // ignore |
136 | { | 125 | { |
137 | return; | 126 | return; |
138 | } | 127 | } |
139 | case 0: // File | 128 | case 0: // File |
140 | { | 129 | { |
141 | QString outputFilename = OGlobalSettings::debugOutput(); | 130 | QString outputFilename = OGlobalSettings::debugOutput(); |
142 | 131 | ||
143 | const int BUFSIZE = 4096; | 132 | const int BUFSIZE = 4096; |
144 | char buf[BUFSIZE] = ""; | 133 | char buf[BUFSIZE] = ""; |
145 | buf[BUFSIZE-1] = '\0'; | 134 | buf[BUFSIZE-1] = '\0'; |
146 | int nSize; | 135 | int nSize; |
147 | 136 | ||
148 | nSize = snprintf( buf, BUFSIZE-1, "%s: %s", (const char*) areaName, data); | 137 | nSize = snprintf( buf, BUFSIZE-1, "%s: %s", (const char*) areaName, data); |
149 | 138 | ||
150 | QFile outputFile( outputFilename ); | 139 | QFile outputFile( outputFilename ); |
151 | if ( outputFile.open( IO_WriteOnly | IO_Append ) ) | 140 | if ( outputFile.open( IO_WriteOnly | IO_Append ) ) |
152 | { | 141 | { |
153 | if ( ( nSize == -1 ) || ( nSize >= BUFSIZE ) ) | 142 | if ( ( nSize == -1 ) || ( nSize >= BUFSIZE ) ) |
154 | { | 143 | { |
155 | outputFile.writeBlock( buf, BUFSIZE-1 ); | 144 | outputFile.writeBlock( buf, BUFSIZE-1 ); |
156 | } | 145 | } |
157 | else | 146 | else |
158 | { | 147 | { |
159 | outputFile.writeBlock( buf, nSize ); | 148 | outputFile.writeBlock( buf, nSize ); |
160 | } | 149 | } |
161 | } | 150 | } |
162 | else | 151 | else |
163 | { | 152 | { |
164 | qDebug( "ODebug: can't write to file '%s' (%s)", (const char*) outputFilename, strerror(errno) ); | 153 | qDebug( "ODebug: can't write to file '%s' (%s)", (const char*) outputFilename, strerror(errno) ); |
165 | } | 154 | } |
166 | break; | 155 | break; |
167 | } // automatic close of file here | 156 | } // automatic close of file here |
168 | 157 | ||
169 | case 1: // Message Box | 158 | case 1: // Message Box |
170 | { | 159 | { |
171 | // Since we are in opiecore here, we cannot use OMsgBox and use | 160 | // Since we are in opiecore here, we cannot use OMsgBox and use |
172 | // QMessageBox instead | 161 | // QMessageBox instead |
173 | 162 | ||
174 | caption += QString("(") + areaName + ")"; | 163 | caption += QString("(") + areaName + ")"; |
175 | QMessageBox::warning( 0L, caption, data, ("&OK") ); // tr? | 164 | QMessageBox::warning( 0L, caption, data, ("&OK") ); // tr? |
176 | break; | 165 | break; |
177 | } | 166 | } |
178 | 167 | ||
179 | case 2: // Shell | 168 | case 2: // Shell |
180 | { | 169 | { |
181 | FILE *output = stderr; | 170 | FILE *output = stderr; |
182 | fprintf( output, "%s: ", (const char*) areaName ); | 171 | fprintf( output, "%s: ", (const char*) areaName ); |
183 | fputs( data, output); | 172 | fputs( data, output); |
184 | break; | 173 | break; |
185 | } | 174 | } |
186 | 175 | ||
187 | case 3: // syslog | 176 | case 3: // syslog |
188 | { | 177 | { |
189 | syslog( priority, "%s", data); | 178 | syslog( priority, "%s", data); |
190 | break; | 179 | break; |
191 | } | 180 | } |
192 | 181 | ||
193 | case 4: // socket | 182 | case 4: // socket |
194 | { | 183 | { |
195 | QString destination = OGlobalSettings::debugOutput(); | 184 | QString destination = OGlobalSettings::debugOutput(); |
196 | if ( destination && destination.find(":") != -1 ) | 185 | if ( destination && destination.find(":") != -1 ) |
197 | { | 186 | { |
198 | QString host = destination.left( destination.find(":") ); | 187 | QString host = destination.left( destination.find(":") ); |
199 | QString port = destination.right( destination.length()-host.length()-1 ); | 188 | QString port = destination.right( destination.length()-host.length()-1 ); |
200 | QHostAddress addr; | 189 | QHostAddress addr; |
201 | addr.setAddress( host ); | 190 | addr.setAddress( host ); |
202 | // TODO: sanity check the address | 191 | // TODO: sanity check the address |
203 | QString line; | 192 | QString line; |
204 | line.sprintf( "%s: %s", (const char*) areaName, (const char*) data ); | 193 | line.sprintf( "%s: %s", (const char*) areaName, (const char*) data ); |
205 | QSocketDevice s( QSocketDevice::Datagram ); | 194 | QSocketDevice s( QSocketDevice::Datagram ); |
206 | int result = s.writeBlock( (const char*) line, line.length(), addr, port.toInt() ); | 195 | int result = s.writeBlock( (const char*) line, line.length(), addr, port.toInt() ); |
207 | if ( result == -1 ) | 196 | if ( result == -1 ) |
208 | { | 197 | { |
209 | qDebug( "ODebug: can't send to address '%s:%d' (%s)", (const char*) host, port.toInt(), strerror(errno) ); | 198 | qDebug( "ODebug: can't send to address '%s:%d' (%s)", (const char*) host, port.toInt(), strerror(errno) ); |
210 | } | 199 | } |
211 | } | 200 | } |
212 | break; | 201 | break; |
213 | } | 202 | } |
214 | } | 203 | } |
215 | 204 | ||
216 | // check if we should abort | 205 | // check if we should abort |
217 | 206 | ||
218 | /* | 207 | /* |
219 | 208 | ||
220 | if( ( nLevel == ODEBUG_FATAL ) | 209 | if( ( nLevel == ODEBUG_FATAL ) |
221 | && ( !oDebug_data->config || oDebug_data->config->readNumEntry( "AbortFatal", 1 ) ) ) | 210 | && ( !oDebug_data->config || oDebug_data->config->readNumEntry( "AbortFatal", 1 ) ) ) |
222 | abort(); | 211 | abort(); |
223 | 212 | ||
224 | */ | 213 | */ |
225 | } | 214 | } |
226 | 215 | ||
227 | /*====================================================================================== | 216 | /*====================================================================================== |
228 | * odbgstream | 217 | * odbgstream |
229 | *======================================================================================*/ | 218 | *======================================================================================*/ |
230 | 219 | ||
231 | odbgstream& perror( odbgstream &s) | 220 | odbgstream& perror( odbgstream &s) |
232 | { | 221 | { |
233 | return s << QString::fromLocal8Bit(strerror(errno)); | 222 | return s << QString::fromLocal8Bit(strerror(errno)); |
234 | } | 223 | } |
235 | 224 | ||
236 | odbgstream odDebug(int area) | 225 | odbgstream odDebug(int area) |
237 | { | 226 | { |
238 | return odbgstream(area, ODEBUG_INFO); | 227 | return odbgstream(area, ODEBUG_INFO); |
239 | } | 228 | } |
240 | odbgstream odDebug(bool cond, int area) | 229 | odbgstream odDebug(bool cond, int area) |
241 | { | 230 | { |
242 | if (cond) return odbgstream(area, ODEBUG_INFO); | 231 | if (cond) return odbgstream(area, ODEBUG_INFO); |
243 | else return odbgstream(0, 0, false); | 232 | else return odbgstream(0, 0, false); |
244 | } | 233 | } |
245 | 234 | ||
246 | odbgstream odError(int area) | 235 | odbgstream odError(int area) |
247 | { | 236 | { |
248 | return odbgstream("ERROR: ", area, ODEBUG_ERROR); | 237 | return odbgstream("ERROR: ", area, ODEBUG_ERROR); |
249 | } | 238 | } |
250 | 239 | ||
251 | odbgstream odError(bool cond, int area) | 240 | odbgstream odError(bool cond, int area) |
252 | { | 241 | { |
253 | if (cond) return odbgstream("ERROR: ", area, ODEBUG_ERROR); else return odbgstream(0,0,false); | 242 | if (cond) return odbgstream("ERROR: ", area, ODEBUG_ERROR); else return odbgstream(0,0,false); |
254 | } | 243 | } |
255 | 244 | ||
256 | odbgstream odWarning(int area) | 245 | odbgstream odWarning(int area) |
257 | { | 246 | { |
258 | return odbgstream("WARNING: ", area, ODEBUG_WARN); | 247 | return odbgstream("WARNING: ", area, ODEBUG_WARN); |
259 | } | 248 | } |
260 | 249 | ||
261 | odbgstream odWarning(bool cond, int area) | 250 | odbgstream odWarning(bool cond, int area) |
262 | { | 251 | { |
263 | if (cond) return odbgstream("WARNING: ", area, ODEBUG_WARN); else return odbgstream(0,0,false); | 252 | if (cond) return odbgstream("WARNING: ", area, ODEBUG_WARN); else return odbgstream(0,0,false); |
264 | } | 253 | } |
265 | 254 | ||
266 | odbgstream odFatal(int area) | 255 | odbgstream odFatal(int area) |
267 | { | 256 | { |
268 | return odbgstream("FATAL: ", area, ODEBUG_FATAL); | 257 | return odbgstream("FATAL: ", area, ODEBUG_FATAL); |
269 | } | 258 | } |
270 | 259 | ||
271 | odbgstream odFatal(bool cond, int area) | 260 | odbgstream odFatal(bool cond, int area) |
272 | { | 261 | { |
273 | if (cond) return odbgstream("FATAL: ", area, ODEBUG_FATAL); else return odbgstream(0,0,false); | 262 | if (cond) return odbgstream("FATAL: ", area, ODEBUG_FATAL); else return odbgstream(0,0,false); |
274 | } | 263 | } |
275 | 264 | ||
276 | odbgstream::odbgstream(unsigned int _area, unsigned int _level, bool _print) | 265 | odbgstream::odbgstream(unsigned int _area, unsigned int _level, bool _print) |
277 | :area(_area), level(_level), print(_print) | 266 | :area(_area), level(_level), print(_print) |
278 | { | 267 | { |
279 | } | 268 | } |
280 | 269 | ||
281 | 270 | ||
282 | odbgstream::odbgstream(const char * initialString, unsigned int _area, unsigned int _level, bool _print) | 271 | odbgstream::odbgstream(const char * initialString, unsigned int _area, unsigned int _level, bool _print) |
283 | :output(QString::fromLatin1(initialString)), area(_area), level(_level), print(_print) | 272 | :output(QString::fromLatin1(initialString)), area(_area), level(_level), print(_print) |
284 | { | 273 | { |
285 | } | 274 | } |
286 | 275 | ||
287 | 276 | ||
288 | odbgstream::odbgstream(odbgstream &str) | 277 | odbgstream::odbgstream(odbgstream &str) |
289 | :output(str.output), area(str.area), level(str.level), print(str.print) | 278 | :output(str.output), area(str.area), level(str.level), print(str.print) |
290 | { | 279 | { |
291 | str.output.truncate(0); | 280 | str.output.truncate(0); |
292 | } | 281 | } |
293 | 282 | ||
294 | 283 | ||
295 | odbgstream::odbgstream(const odbgstream &str) | 284 | odbgstream::odbgstream(const odbgstream &str) |
296 | :output(str.output), area(str.area), level(str.level), print(str.print) | 285 | :output(str.output), area(str.area), level(str.level), print(str.print) |
297 | { | 286 | { |
298 | } | 287 | } |
299 | 288 | ||
300 | odbgstream& odbgstream::operator<<(bool i) | 289 | odbgstream& odbgstream::operator<<(bool i) |
301 | { | 290 | { |
302 | if (!print) return *this; | 291 | if (!print) return *this; |
303 | output += QString::fromLatin1(i ? "true" : "false"); | 292 | output += QString::fromLatin1(i ? "true" : "false"); |
304 | return *this; | 293 | return *this; |
305 | } | 294 | } |
306 | 295 | ||
307 | 296 | ||
308 | odbgstream& odbgstream::operator<<(short i) | 297 | odbgstream& odbgstream::operator<<(short i) |
309 | { | 298 | { |
310 | if (!print) return *this; | 299 | if (!print) return *this; |
311 | QString tmp; tmp.setNum(i); output += tmp; | 300 | QString tmp; tmp.setNum(i); output += tmp; |
312 | return *this; | 301 | return *this; |
313 | } | 302 | } |
314 | 303 | ||
315 | 304 | ||
316 | odbgstream& odbgstream::operator<<(unsigned short i) | 305 | odbgstream& odbgstream::operator<<(unsigned short i) |
317 | { | 306 | { |
318 | if (!print) return *this; | 307 | if (!print) return *this; |
319 | QString tmp; tmp.setNum(i); output += tmp; | 308 | QString tmp; tmp.setNum(i); output += tmp; |
320 | return *this; | 309 | return *this; |
321 | } | 310 | } |
322 | 311 | ||
323 | 312 | ||
324 | odbgstream& odbgstream::operator<<(unsigned char i) | 313 | odbgstream& odbgstream::operator<<(unsigned char i) |
325 | { | 314 | { |
326 | return operator<<( static_cast<char>( i ) ); | 315 | return operator<<( static_cast<char>( i ) ); |
327 | } | 316 | } |
328 | 317 | ||
329 | 318 | ||
330 | odbgstream& odbgstream::operator<<(int i) | 319 | odbgstream& odbgstream::operator<<(int i) |
331 | { | 320 | { |
332 | if (!print) return *this; | 321 | if (!print) return *this; |
333 | QString tmp; tmp.setNum(i); output += tmp; | 322 | QString tmp; tmp.setNum(i); output += tmp; |
334 | return *this; | 323 | return *this; |
335 | } | 324 | } |
336 | 325 | ||
337 | 326 | ||
338 | odbgstream& odbgstream::operator<<(unsigned int i) | 327 | odbgstream& odbgstream::operator<<(unsigned int i) |
339 | { | 328 | { |
340 | if (!print) return *this; | 329 | if (!print) return *this; |
341 | QString tmp; tmp.setNum(i); output += tmp; | 330 | QString tmp; tmp.setNum(i); output += tmp; |
342 | return *this; | 331 | return *this; |
343 | } | 332 | } |
344 | 333 | ||
345 | 334 | ||
346 | odbgstream& odbgstream::operator<<(long i) | 335 | odbgstream& odbgstream::operator<<(long i) |
347 | { | 336 | { |
348 | if (!print) return *this; | 337 | if (!print) return *this; |
349 | QString tmp; tmp.setNum(i); output += tmp; | 338 | QString tmp; tmp.setNum(i); output += tmp; |
350 | return *this; | 339 | return *this; |
351 | } | 340 | } |
352 | 341 | ||
353 | 342 | ||
354 | odbgstream& odbgstream::operator<<(unsigned long i) | 343 | odbgstream& odbgstream::operator<<(unsigned long i) |
355 | { | 344 | { |
356 | if (!print) return *this; | 345 | if (!print) return *this; |
357 | QString tmp; tmp.setNum(i); output += tmp; | 346 | QString tmp; tmp.setNum(i); output += tmp; |
358 | return *this; | 347 | return *this; |
359 | } | 348 | } |
360 | 349 | ||
361 | 350 | ||
362 | odbgstream& odbgstream::operator<<(const QString& string) | 351 | odbgstream& odbgstream::operator<<(const QString& string) |
363 | { | 352 | { |
364 | if (!print) return *this; | 353 | if (!print) return *this; |
365 | output += string; | 354 | output += string; |
366 | if (output.at(output.length() -1 ) == '\n') | 355 | if (output.at(output.length() -1 ) == '\n') |
367 | flush(); | 356 | flush(); |
368 | return *this; | 357 | return *this; |
369 | } | 358 | } |
370 | 359 | ||
371 | 360 | ||
372 | odbgstream& odbgstream::operator<<(const char *string) | 361 | odbgstream& odbgstream::operator<<(const char *string) |
373 | { | 362 | { |
374 | if (!print) return *this; | 363 | if (!print) return *this; |
375 | output += QString::fromUtf8(string); | 364 | output += QString::fromUtf8(string); |
376 | if (output.at(output.length() - 1) == '\n') | 365 | if (output.at(output.length() - 1) == '\n') |
377 | flush(); | 366 | flush(); |
378 | return *this; | 367 | return *this; |
379 | } | 368 | } |
380 | 369 | ||
381 | 370 | ||
382 | odbgstream& odbgstream::operator<<(const QCString& string) | 371 | odbgstream& odbgstream::operator<<(const QCString& string) |
383 | { | 372 | { |
384 | *this << string.data(); | 373 | *this << string.data(); |
385 | return *this; | 374 | return *this; |
386 | } | 375 | } |
387 | 376 | ||
388 | 377 | ||
389 | odbgstream& odbgstream::operator<<(const void * p) | 378 | odbgstream& odbgstream::operator<<(const void * p) |
390 | { | 379 | { |
391 | form("%p", p); | 380 | form("%p", p); |
392 | return *this; | 381 | return *this; |
393 | } | 382 | } |
394 | 383 | ||
395 | odbgstream& odbgstream::operator<<(double d) | 384 | odbgstream& odbgstream::operator<<(double d) |
396 | { | 385 | { |
397 | QString tmp; tmp.setNum(d); output += tmp; | 386 | QString tmp; tmp.setNum(d); output += tmp; |
398 | return *this; | 387 | return *this; |
399 | } | 388 | } |
400 | 389 | ||
401 | /* | 390 | /* |
402 | odbgstream::odbgstream &form(const char *format, ...) | 391 | odbgstream::odbgstream &form(const char *format, ...) |
403 | #ifdef __GNUC__ | 392 | #ifdef __GNUC__ |
404 | __attribute__ ( ( format ( printf, 2, 3 ) ) ) | 393 | __attribute__ ( ( format ( printf, 2, 3 ) ) ) |
405 | #endif | 394 | #endif |
406 | ; | 395 | ; |
407 | */ | 396 | */ |
408 | 397 | ||
409 | void odbgstream::flush() | 398 | void odbgstream::flush() |
410 | { | 399 | { |
411 | if ( output.isEmpty() || !print ) | 400 | if ( output.isEmpty() || !print ) |
412 | { | 401 | { |
413 | return; | 402 | return; |
414 | } | 403 | } |
415 | else | 404 | else |
416 | { | 405 | { |
417 | oDebugBackend( level, area, output.local8Bit().data() ); | 406 | oDebugBackend( level, area, output.local8Bit().data() ); |
418 | output = QString::null; | 407 | output = QString::null; |
419 | } | 408 | } |
420 | } | 409 | } |
421 | 410 | ||
422 | odbgstream& odbgstream::form(const char *format, ...) | 411 | odbgstream& odbgstream::form(const char *format, ...) |
423 | { | 412 | { |
424 | char buf[4096]; | 413 | char buf[4096]; |
425 | va_list arguments; | 414 | va_list arguments; |
426 | va_start( arguments, format ); | 415 | va_start( arguments, format ); |
427 | buf[sizeof(buf)-1] = '\0'; | 416 | buf[sizeof(buf)-1] = '\0'; |
428 | vsnprintf( buf, sizeof(buf)-1, format, arguments ); | 417 | vsnprintf( buf, sizeof(buf)-1, format, arguments ); |
429 | va_end(arguments); | 418 | va_end(arguments); |
430 | *this << buf; | 419 | *this << buf; |
431 | return *this; | 420 | return *this; |
432 | } | 421 | } |
433 | 422 | ||
434 | odbgstream::~odbgstream() | 423 | odbgstream::~odbgstream() |
435 | { | 424 | { |
436 | if (!output.isEmpty()) | 425 | if (!output.isEmpty()) |
437 | { | 426 | { |
438 | fprintf(stderr, "ASSERT: debug output not ended with \\n\n"); | 427 | fprintf(stderr, "ASSERT: debug output not ended with \\n\n"); |
439 | *this << "\n"; | 428 | *this << "\n"; |
440 | } | 429 | } |
441 | } | 430 | } |
442 | 431 | ||
443 | odbgstream& odbgstream::operator<<(char ch) | 432 | odbgstream& odbgstream::operator<<(char ch) |
444 | { | 433 | { |
445 | if (!print) return *this; | 434 | if (!print) return *this; |
446 | if (!isprint(ch)) | 435 | if (!isprint(ch)) |
447 | { | 436 | { |
448 | output += "\\x" + QString::number( static_cast<uint>( ch ) + 0x100, 16 ).right(2); | 437 | output += "\\x" + QString::number( static_cast<uint>( ch ) + 0x100, 16 ).right(2); |
449 | } | 438 | } |
450 | else | 439 | else |
451 | { | 440 | { |
452 | output += ch; | 441 | output += ch; |
453 | if (ch == '\n') flush(); | 442 | if (ch == '\n') flush(); |
454 | } | 443 | } |
455 | return *this; | 444 | return *this; |
456 | } | 445 | } |
457 | 446 | ||
458 | odbgstream& odbgstream::operator<<( QWidget* widget ) | 447 | odbgstream& odbgstream::operator<<( QWidget* widget ) |
459 | { | 448 | { |
460 | QString string, temp; | 449 | QString string, temp; |
461 | // ----- | 450 | // ----- |
462 | if(widget==0) | 451 | if(widget==0) |
463 | { | 452 | { |
464 | string=(QString)"[Null pointer]"; | 453 | string=(QString)"[Null pointer]"; |
465 | } else | 454 | } else |
466 | { | 455 | { |
467 | temp.setNum((ulong)widget, 16); | 456 | temp.setNum((ulong)widget, 16); |
468 | string=(QString)"["+widget->className()+" pointer " + "(0x" + temp + ")"; | 457 | string=(QString)"["+widget->className()+" pointer " + "(0x" + temp + ")"; |
469 | if(widget->name(0)==0) | 458 | if(widget->name(0)==0) |
470 | { | 459 | { |
471 | string += " to unnamed widget, "; | 460 | string += " to unnamed widget, "; |
472 | } else | 461 | } else |
473 | { | 462 | { |
474 | string += (QString)" to widget " + widget->name() + ", "; | 463 | string += (QString)" to widget " + widget->name() + ", "; |
475 | } | 464 | } |
476 | string += "geometry=" | 465 | string += "geometry=" |
477 | + QString().setNum(widget->width()) | 466 | + QString().setNum(widget->width()) |
478 | + "x"+QString().setNum(widget->height()) | 467 | + "x"+QString().setNum(widget->height()) |
479 | + "+"+QString().setNum(widget->x()) | 468 | + "+"+QString().setNum(widget->x()) |
480 | + "+"+QString().setNum(widget->y()) | 469 | + "+"+QString().setNum(widget->y()) |
481 | + "]"; | 470 | + "]"; |
482 | } | 471 | } |
483 | if (!print) return *this; | 472 | if (!print) return *this; |
484 | 473 | ||
485 | output += string; | 474 | output += string; |
486 | if (output.at(output.length()-1) == '\n') | 475 | if (output.at(output.length()-1) == '\n') |
487 | { | 476 | { |
488 | flush(); | 477 | flush(); |
489 | } | 478 | } |
490 | return *this; | 479 | return *this; |
491 | } | 480 | } |
492 | 481 | ||
493 | /* | 482 | /* |
494 | * either use 'output' directly and do the flush if needed | 483 | * either use 'output' directly and do the flush if needed |
495 | * or use the QString operator which calls the char* operator | 484 | * or use the QString operator which calls the char* operator |
496 | * | 485 | * |
497 | */ | 486 | */ |
498 | odbgstream& odbgstream::operator<<( const QDateTime& time) | 487 | odbgstream& odbgstream::operator<<( const QDateTime& time) |
499 | { | 488 | { |
500 | *this << time.toString(); | 489 | *this << time.toString(); |
501 | return *this; | 490 | return *this; |
502 | } | 491 | } |
503 | 492 | ||
504 | 493 | ||
505 | odbgstream& odbgstream::operator<<( const QDate& date) | 494 | odbgstream& odbgstream::operator<<( const QDate& date) |
506 | { | 495 | { |
507 | *this << date.toString(); | 496 | *this << date.toString(); |
508 | 497 | ||
509 | return *this; | 498 | return *this; |
510 | } | 499 | } |
511 | 500 | ||
512 | 501 | ||
513 | odbgstream& odbgstream::operator<<( const QTime& time ) | 502 | odbgstream& odbgstream::operator<<( const QTime& time ) |
514 | { | 503 | { |
515 | *this << time.toString(); | 504 | *this << time.toString(); |
516 | return *this; | 505 | return *this; |
517 | } | 506 | } |
518 | 507 | ||
519 | 508 | ||
520 | odbgstream& odbgstream::operator<<( const QPoint& p ) | 509 | odbgstream& odbgstream::operator<<( const QPoint& p ) |
521 | { | 510 | { |
522 | *this << "(" << p.x() << ", " << p.y() << ")"; | 511 | *this << "(" << p.x() << ", " << p.y() << ")"; |
523 | return *this; | 512 | return *this; |
524 | } | 513 | } |
525 | 514 | ||
526 | 515 | ||
527 | odbgstream& odbgstream::operator<<( const QSize& s ) | 516 | odbgstream& odbgstream::operator<<( const QSize& s ) |
528 | { | 517 | { |
529 | *this << "[" << s.width() << "x" << s.height() << "]"; | 518 | *this << "[" << s.width() << "x" << s.height() << "]"; |
530 | return *this; | 519 | return *this; |
531 | } | 520 | } |
532 | 521 | ||
533 | 522 | ||
534 | odbgstream& odbgstream::operator<<( const QRect& r ) | 523 | odbgstream& odbgstream::operator<<( const QRect& r ) |
535 | { | 524 | { |
536 | *this << "[" << r.left() << ", " << r.top() << " - " << r.right() << ", " << r.bottom() << "]"; | 525 | *this << "[" << r.left() << ", " << r.top() << " - " << r.right() << ", " << r.bottom() << "]"; |
537 | return *this; | 526 | return *this; |
538 | } | 527 | } |
539 | 528 | ||
540 | 529 | ||
541 | odbgstream& odbgstream::operator<<( const QRegion& reg ) | 530 | odbgstream& odbgstream::operator<<( const QRegion& reg ) |
542 | { | 531 | { |
543 | /* Qt2 doesn't have a QMemArray... :( | 532 | /* Qt2 doesn't have a QMemArray... :( |
544 | *this << "[ "; | 533 | *this << "[ "; |
545 | QMemArray<QRect>rs=reg.rects(); | 534 | QMemArray<QRect>rs=reg.rects(); |
546 | for (uint i=0;i<rs.size();++i) | 535 | for (uint i=0;i<rs.size();++i) |
547 | *this << QString("[%1, %2 - %3, %4] ").arg(rs[i].left()).arg(rs[i].top()).arg(rs[i].right()).arg(rs[i].bottom() ) ; | 536 | *this << QString("[%1, %2 - %3, %4] ").arg(rs[i].left()).arg(rs[i].top()).arg(rs[i].right()).arg(rs[i].bottom() ) ; |
548 | *this <<"]"; | 537 | *this <<"]"; |
549 | */ | 538 | */ |
550 | return *this; | 539 | return *this; |
551 | } | 540 | } |
552 | 541 | ||
553 | 542 | ||
554 | odbgstream& odbgstream::operator<<( const QStringList& l ) | 543 | odbgstream& odbgstream::operator<<( const QStringList& l ) |
555 | { | 544 | { |
556 | *this << "("; | 545 | *this << "("; |
557 | *this << l.join(","); | 546 | *this << l.join(","); |
558 | *this << ")"; | 547 | *this << ")"; |
559 | 548 | ||
560 | return *this; | 549 | return *this; |
561 | } | 550 | } |
562 | 551 | ||
563 | 552 | ||
564 | odbgstream& odbgstream::operator<<( const QColor& c ) | 553 | odbgstream& odbgstream::operator<<( const QColor& c ) |
565 | { | 554 | { |
566 | if ( c.isValid() ) | 555 | if ( c.isValid() ) |
567 | *this << c.name(); | 556 | *this << c.name(); |
568 | else | 557 | else |
569 | *this << "(invalid/default)"; | 558 | *this << "(invalid/default)"; |
570 | return *this; | 559 | return *this; |
571 | } | 560 | } |
572 | 561 | ||
573 | 562 | ||
574 | odbgstream& odbgstream::operator<<( const QBrush& b) | 563 | odbgstream& odbgstream::operator<<( const QBrush& b) |
575 | { | 564 | { |
576 | static const char* const s_brushStyles[] = { | 565 | static const char* const s_brushStyles[] = { |
577 | "NoBrush", "SolidPattern", "Dense1Pattern", "Dense2Pattern", "Dense3Pattern", | 566 | "NoBrush", "SolidPattern", "Dense1Pattern", "Dense2Pattern", "Dense3Pattern", |
578 | "Dense4Pattern", "Dense5Pattern", "Dense6Pattern", "Dense7Pattern", | 567 | "Dense4Pattern", "Dense5Pattern", "Dense6Pattern", "Dense7Pattern", |
579 | "HorPattern", "VerPattern", "CrossPattern", "BDiagPattern", "FDiagPattern", | 568 | "HorPattern", "VerPattern", "CrossPattern", "BDiagPattern", "FDiagPattern", |
580 | "DiagCrossPattern" }; | 569 | "DiagCrossPattern" }; |
581 | 570 | ||
582 | *this <<"[ style: "; | 571 | *this <<"[ style: "; |
583 | *this <<s_brushStyles[ b.style() ]; | 572 | *this <<s_brushStyles[ b.style() ]; |
584 | *this <<" color: "; | 573 | *this <<" color: "; |
585 | // can't use operator<<(str, b.color()) because that terminates a odbgstream (flushes) | 574 | // can't use operator<<(str, b.color()) because that terminates a odbgstream (flushes) |
586 | if ( b.color().isValid() ) | 575 | if ( b.color().isValid() ) |
587 | *this <<b.color().name() ; | 576 | *this <<b.color().name() ; |
588 | else | 577 | else |
589 | *this <<"(invalid/default)"; | 578 | *this <<"(invalid/default)"; |
590 | if ( b.pixmap() ) | 579 | if ( b.pixmap() ) |
591 | *this <<" has a pixmap"; | 580 | *this <<" has a pixmap"; |
592 | *this <<" ]"; | 581 | *this <<" ]"; |
593 | return *this; | 582 | return *this; |
594 | } | 583 | } |
595 | 584 | ||
596 | 585 | ||
597 | 586 | ||
598 | QString odBacktrace( int levels ) | 587 | QString odBacktrace( int levels ) |
599 | { | 588 | { |
600 | QString s; | 589 | QString s; |
601 | #ifndef OPIE_NO_BACKTRACE | 590 | #ifndef OPIE_NO_BACKTRACE |
602 | void* trace[256]; | 591 | void* trace[256]; |
603 | int n = backtrace(trace, 256); | 592 | int n = backtrace(trace, 256); |
604 | char** strings = backtrace_symbols (trace, n); | 593 | char** strings = backtrace_symbols (trace, n); |
605 | 594 | ||
606 | if ( levels != -1 ) | 595 | if ( levels != -1 ) |
607 | n = QMIN( n, levels ); | 596 | n = QMIN( n, levels ); |
608 | s = "[\n"; | 597 | s = "[\n"; |
609 | 598 | ||
610 | for (int i = 0; i < n; ++i) | 599 | for (int i = 0; i < n; ++i) |
611 | s += QString::number(i) + | 600 | s += QString::number(i) + |
612 | QString::fromLatin1(": ") + | 601 | QString::fromLatin1(": ") + |
613 | QString::fromLatin1(strings[i]) + QString::fromLatin1("\n"); | 602 | QString::fromLatin1(strings[i]) + QString::fromLatin1("\n"); |
614 | s += "]\n"; | 603 | s += "]\n"; |
615 | free (strings); | 604 | free (strings); |
616 | #endif | 605 | #endif |
617 | return s; | 606 | return s; |
618 | } | 607 | } |
619 | 608 | ||
620 | void odClearDebugConfig() | 609 | void odClearDebugConfig() |
621 | { | 610 | { |
622 | /* | 611 | /* |
623 | delete oDebug_data->config; | 612 | delete oDebug_data->config; |
624 | oDebug_data->config = 0; | 613 | oDebug_data->config = 0; |
625 | */ | 614 | */ |
626 | } | 615 | } |
627 | 616 | ||
628 | #ifdef OPIE_NO_DEBUG | 617 | #ifdef OPIE_NO_DEBUG |
629 | #define odDebug ondDebug | 618 | #define odDebug ondDebug |
630 | #define odBacktrace ondBacktrace | 619 | #define odBacktrace ondBacktrace |
631 | #endif | 620 | #endif |
diff --git a/libopie2/opiecore/oglobal.cpp b/libopie2/opiecore/oglobal.cpp index 879e80f..1aa206e 100644 --- a/libopie2/opiecore/oglobal.cpp +++ b/libopie2/opiecore/oglobal.cpp | |||
@@ -1,411 +1,410 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) 2003 Michael 'Mickey' Lauer <mickey@Vanille.de> | 3 | Copyright (C) 2003 Michael 'Mickey' Lauer <mickey@Vanille.de> |
4 | =. Copyright (C) 2004 Holger 'zecke' Freyther <zecke@handhelds.org> | 4 | =. Copyright (C) 2004 Holger 'zecke' Freyther <zecke@handhelds.org> |
5 | .=l. | 5 | .=l. |
6 | .>+-= | 6 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 7 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 8 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 11 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 12 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include <opie2/oglobal.h> | 30 | #include <opie2/oglobal.h> |
31 | 31 | ||
32 | #include <qfile.h> | ||
33 | #include <qtextstream.h> | 32 | #include <qtextstream.h> |
34 | #include <qdir.h> | 33 | #include <qdir.h> |
35 | #include <qpe/mimetype.h> | 34 | #include <qpe/mimetype.h> |
36 | #include <qpe/qpeapplication.h> | 35 | #include <qpe/qpeapplication.h> |
37 | #include <qpe/storage.h> | 36 | #include <qpe/storage.h> |
38 | 37 | ||
39 | #include <unistd.h> | 38 | #include <unistd.h> |
40 | #include <sys/types.h> | 39 | #include <sys/types.h> |
41 | 40 | ||
42 | static const char Base64EncMap[64] = | 41 | static const char Base64EncMap[64] = |
43 | { | 42 | { |
44 | 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, | 43 | 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, |
45 | 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, | 44 | 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, |
46 | 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, | 45 | 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, |
47 | 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, | 46 | 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, |
48 | 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, | 47 | 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, |
49 | 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, | 48 | 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, |
50 | 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, | 49 | 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, |
51 | 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2B, 0x2F | 50 | 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2B, 0x2F |
52 | }; | 51 | }; |
53 | 52 | ||
54 | static char Base64DecMap[128] = | 53 | static char Base64DecMap[128] = |
55 | { | 54 | { |
56 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 55 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
57 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 56 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
58 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 57 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
59 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 58 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
60 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 59 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
61 | 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3F, | 60 | 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3F, |
62 | 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, | 61 | 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, |
63 | 0x3C, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 62 | 0x3C, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
64 | 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, | 63 | 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, |
65 | 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, | 64 | 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, |
66 | 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, | 65 | 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, |
67 | 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, | 66 | 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, |
68 | 0x00, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, | 67 | 0x00, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, |
69 | 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, | 68 | 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, |
70 | 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, | 69 | 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, |
71 | 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00 | 70 | 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00 |
72 | }; | 71 | }; |
73 | 72 | ||
74 | 73 | ||
75 | OConfig* OGlobal::_config = 0; | 74 | OConfig* OGlobal::_config = 0; |
76 | OConfig* OGlobal::_qpe_config = 0; | 75 | OConfig* OGlobal::_qpe_config = 0; |
77 | 76 | ||
78 | OConfig* OGlobal::config() | 77 | OConfig* OGlobal::config() |
79 | { | 78 | { |
80 | if ( !OGlobal::_config ) | 79 | if ( !OGlobal::_config ) |
81 | { | 80 | { |
82 | // odebug classes are reading config, so can't use them here! | 81 | // odebug classes are reading config, so can't use them here! |
83 | qDebug( "OGlobal::creating global configuration instance." ); | 82 | qDebug( "OGlobal::creating global configuration instance." ); |
84 | OGlobal::_config = new OConfig( "global" ); | 83 | OGlobal::_config = new OConfig( "global" ); |
85 | } | 84 | } |
86 | return OGlobal::_config; | 85 | return OGlobal::_config; |
87 | } | 86 | } |
88 | 87 | ||
89 | 88 | ||
90 | /** | 89 | /** |
91 | * Return the internal builtin Global::Command object | 90 | * Return the internal builtin Global::Command object |
92 | * | 91 | * |
93 | */ | 92 | */ |
94 | Global::Command* OGlobal::builtinCommands() { | 93 | Global::Command* OGlobal::builtinCommands() { |
95 | return builtin; | 94 | return builtin; |
96 | } | 95 | } |
97 | 96 | ||
98 | 97 | ||
99 | /** | 98 | /** |
100 | * Return the internal builtin QGuardedPtr<QWidget> object | 99 | * Return the internal builtin QGuardedPtr<QWidget> object |
101 | */ | 100 | */ |
102 | QGuardedPtr<QWidget>* OGlobal::builtinRunning() { | 101 | QGuardedPtr<QWidget>* OGlobal::builtinRunning() { |
103 | return running; | 102 | return running; |
104 | } | 103 | } |
105 | 104 | ||
106 | 105 | ||
107 | /** | 106 | /** |
108 | * \brief generate a new UUID as QString | 107 | * \brief generate a new UUID as QString |
109 | * Return a new UUID as QString. UUID are global unique | 108 | * Return a new UUID as QString. UUID are global unique |
110 | * | 109 | * |
111 | * | 110 | * |
112 | * @return the UUID or QString::null | 111 | * @return the UUID or QString::null |
113 | */ | 112 | */ |
114 | QString OGlobal::generateUuid() { | 113 | QString OGlobal::generateUuid() { |
115 | QFile file( "/proc/sys/kernel/random/uuid" ); | 114 | QFile file( "/proc/sys/kernel/random/uuid" ); |
116 | if (!file.open(IO_ReadOnly ) ) | 115 | if (!file.open(IO_ReadOnly ) ) |
117 | return QString::null; | 116 | return QString::null; |
118 | 117 | ||
119 | QTextStream stream(&file); | 118 | QTextStream stream(&file); |
120 | 119 | ||
121 | return "{" + stream.read().stripWhiteSpace() + "}"; | 120 | return "{" + stream.read().stripWhiteSpace() + "}"; |
122 | } | 121 | } |
123 | 122 | ||
124 | 123 | ||
125 | /** | 124 | /** |
126 | * \brief Encode a QByteArray in base64 | 125 | * \brief Encode a QByteArray in base64 |
127 | * | 126 | * |
128 | * An Implementation of the RF1521 base64 encoding. | 127 | * An Implementation of the RF1521 base64 encoding. |
129 | * | 128 | * |
130 | * The boolean argument determines if the encoded data is | 129 | * The boolean argument determines if the encoded data is |
131 | * going to be restricted to 76 characters or less per line | 130 | * going to be restricted to 76 characters or less per line |
132 | * as specified by RFC 2045. If @p insertLFs is true, then | 131 | * as specified by RFC 2045. If @p insertLFs is true, then |
133 | * there will be 76 characters or less per line. | 132 | * there will be 76 characters or less per line. |
134 | * | 133 | * |
135 | * If you use this to create a QCString remember that it is null terminated! | 134 | * If you use this to create a QCString remember that it is null terminated! |
136 | * \code | 135 | * \code |
137 | * QByteArray ar = OGlobal::encodeBase64(&array); | 136 | * QByteArray ar = OGlobal::encodeBase64(&array); |
138 | * QCString str(ar.data(),ar.size()+1); // the NUL at the end | 137 | * QCString str(ar.data(),ar.size()+1); // the NUL at the end |
139 | * | 138 | * |
140 | * \endcode | 139 | * \endcode |
141 | * | 140 | * |
142 | * @param in The QByteArray to encode | 141 | * @param in The QByteArray to encode |
143 | * @param insertLFs Limit number of characters per line | 142 | * @param insertLFs Limit number of characters per line |
144 | * @return The argument as base64 encoded or QByteArray() if in.isEmpty() | 143 | * @return The argument as base64 encoded or QByteArray() if in.isEmpty() |
145 | * @see QByteArray | 144 | * @see QByteArray |
146 | * @see QArray | 145 | * @see QArray |
147 | * @see QMemArray | 146 | * @see QMemArray |
148 | * @see QCString | 147 | * @see QCString |
149 | */ | 148 | */ |
150 | /* | 149 | /* |
151 | * LGPL by Rik Hemsely of the KDE Project. taken from kmdcodec.cpp | 150 | * LGPL by Rik Hemsely of the KDE Project. taken from kmdcodec.cpp |
152 | */ | 151 | */ |
153 | QByteArray OGlobal::encodeBase64(const QByteArray& in, bool insertLFs ) { | 152 | QByteArray OGlobal::encodeBase64(const QByteArray& in, bool insertLFs ) { |
154 | if ( in.isEmpty() ) | 153 | if ( in.isEmpty() ) |
155 | return QByteArray(); | 154 | return QByteArray(); |
156 | 155 | ||
157 | unsigned int sidx = 0; | 156 | unsigned int sidx = 0; |
158 | unsigned int didx = 0; | 157 | unsigned int didx = 0; |
159 | const char* data = in.data(); | 158 | const char* data = in.data(); |
160 | const unsigned int len = in.size(); | 159 | const unsigned int len = in.size(); |
161 | 160 | ||
162 | unsigned int out_len = ((len+2)/3)*4; | 161 | unsigned int out_len = ((len+2)/3)*4; |
163 | 162 | ||
164 | // Deal with the 76 characters or less per | 163 | // Deal with the 76 characters or less per |
165 | // line limit specified in RFC 2045 on a | 164 | // line limit specified in RFC 2045 on a |
166 | // pre request basis. | 165 | // pre request basis. |
167 | insertLFs = (insertLFs && out_len > 76); | 166 | insertLFs = (insertLFs && out_len > 76); |
168 | if ( insertLFs ) | 167 | if ( insertLFs ) |
169 | out_len += ((out_len-1)/76); | 168 | out_len += ((out_len-1)/76); |
170 | 169 | ||
171 | int count = 0; | 170 | int count = 0; |
172 | QByteArray out( out_len ); | 171 | QByteArray out( out_len ); |
173 | 172 | ||
174 | // 3-byte to 4-byte conversion + 0-63 to ascii printable conversion | 173 | // 3-byte to 4-byte conversion + 0-63 to ascii printable conversion |
175 | if ( len > 1 ) | 174 | if ( len > 1 ) |
176 | { | 175 | { |
177 | while (sidx < len-2) | 176 | while (sidx < len-2) |
178 | { | 177 | { |
179 | if ( insertLFs ) | 178 | if ( insertLFs ) |
180 | { | 179 | { |
181 | if ( count && (count%76) == 0 ) | 180 | if ( count && (count%76) == 0 ) |
182 | out[didx++] = '\n'; | 181 | out[didx++] = '\n'; |
183 | count += 4; | 182 | count += 4; |
184 | } | 183 | } |
185 | out[didx++] = Base64EncMap[(data[sidx] >> 2) & 077]; | 184 | out[didx++] = Base64EncMap[(data[sidx] >> 2) & 077]; |
186 | out[didx++] = Base64EncMap[(data[sidx+1] >> 4) & 017 | | 185 | out[didx++] = Base64EncMap[(data[sidx+1] >> 4) & 017 | |
187 | (data[sidx] << 4) & 077]; | 186 | (data[sidx] << 4) & 077]; |
188 | out[didx++] = Base64EncMap[(data[sidx+2] >> 6) & 003 | | 187 | out[didx++] = Base64EncMap[(data[sidx+2] >> 6) & 003 | |
189 | (data[sidx+1] << 2) & 077]; | 188 | (data[sidx+1] << 2) & 077]; |
190 | out[didx++] = Base64EncMap[data[sidx+2] & 077]; | 189 | out[didx++] = Base64EncMap[data[sidx+2] & 077]; |
191 | sidx += 3; | 190 | sidx += 3; |
192 | } | 191 | } |
193 | } | 192 | } |
194 | 193 | ||
195 | if (sidx < len) | 194 | if (sidx < len) |
196 | { | 195 | { |
197 | if ( insertLFs && (count > 0) && (count%76) == 0 ) | 196 | if ( insertLFs && (count > 0) && (count%76) == 0 ) |
198 | out[didx++] = '\n'; | 197 | out[didx++] = '\n'; |
199 | 198 | ||
200 | out[didx++] = Base64EncMap[(data[sidx] >> 2) & 077]; | 199 | out[didx++] = Base64EncMap[(data[sidx] >> 2) & 077]; |
201 | if (sidx < len-1) | 200 | if (sidx < len-1) |
202 | { | 201 | { |
203 | out[didx++] = Base64EncMap[(data[sidx+1] >> 4) & 017 | | 202 | out[didx++] = Base64EncMap[(data[sidx+1] >> 4) & 017 | |
204 | (data[sidx] << 4) & 077]; | 203 | (data[sidx] << 4) & 077]; |
205 | out[didx++] = Base64EncMap[(data[sidx+1] << 2) & 077]; | 204 | out[didx++] = Base64EncMap[(data[sidx+1] << 2) & 077]; |
206 | } | 205 | } |
207 | else | 206 | else |
208 | { | 207 | { |
209 | out[didx++] = Base64EncMap[(data[sidx] << 4) & 077]; | 208 | out[didx++] = Base64EncMap[(data[sidx] << 4) & 077]; |
210 | } | 209 | } |
211 | } | 210 | } |
212 | 211 | ||
213 | // Add padding | 212 | // Add padding |
214 | while (didx < out.size()) | 213 | while (didx < out.size()) |
215 | { | 214 | { |
216 | out[didx] = '='; | 215 | out[didx] = '='; |
217 | didx++; | 216 | didx++; |
218 | } | 217 | } |
219 | 218 | ||
220 | return out; | 219 | return out; |
221 | } | 220 | } |
222 | 221 | ||
223 | /** | 222 | /** |
224 | * Decodes the given data that was encoded with the base64 | 223 | * Decodes the given data that was encoded with the base64 |
225 | * algorithm. | 224 | * algorithm. |
226 | * | 225 | * |
227 | * | 226 | * |
228 | * @param in the encoded data to be decoded. | 227 | * @param in the encoded data to be decoded. |
229 | * @return the decoded QByteArray or QByteArray() in case of failure | 228 | * @return the decoded QByteArray or QByteArray() in case of failure |
230 | * @see OGlobal::encodeBase64 | 229 | * @see OGlobal::encodeBase64 |
231 | */ | 230 | */ |
232 | QByteArray OGlobal::decodeBase64( const QByteArray& in) { | 231 | QByteArray OGlobal::decodeBase64( const QByteArray& in) { |
233 | if ( in.isEmpty() ) | 232 | if ( in.isEmpty() ) |
234 | return QByteArray(); | 233 | return QByteArray(); |
235 | 234 | ||
236 | QByteArray out; | 235 | QByteArray out; |
237 | unsigned int count = 0; | 236 | unsigned int count = 0; |
238 | unsigned int len = in.size(), tail = len; | 237 | unsigned int len = in.size(), tail = len; |
239 | const char* data = in.data(); | 238 | const char* data = in.data(); |
240 | 239 | ||
241 | // Deal with possible *nix "BEGIN" marker!! | 240 | // Deal with possible *nix "BEGIN" marker!! |
242 | while ( count < len && (data[count] == '\n' || data[count] == '\r' || | 241 | while ( count < len && (data[count] == '\n' || data[count] == '\r' || |
243 | data[count] == '\t' || data[count] == ' ') ) | 242 | data[count] == '\t' || data[count] == ' ') ) |
244 | count++; | 243 | count++; |
245 | 244 | ||
246 | if ( strncasecmp(data+count, "begin", 5) == 0 ) | 245 | if ( strncasecmp(data+count, "begin", 5) == 0 ) |
247 | { | 246 | { |
248 | count += 5; | 247 | count += 5; |
249 | while ( count < len && data[count] != '\n' && data[count] != '\r' ) | 248 | while ( count < len && data[count] != '\n' && data[count] != '\r' ) |
250 | count++; | 249 | count++; |
251 | 250 | ||
252 | while ( count < len && (data[count] == '\n' || data[count] == '\r') ) | 251 | while ( count < len && (data[count] == '\n' || data[count] == '\r') ) |
253 | count ++; | 252 | count ++; |
254 | 253 | ||
255 | data += count; | 254 | data += count; |
256 | tail = (len -= count); | 255 | tail = (len -= count); |
257 | } | 256 | } |
258 | 257 | ||
259 | // Find the tail end of the actual encoded data even if | 258 | // Find the tail end of the actual encoded data even if |
260 | // there is/are trailing CR and/or LF. | 259 | // there is/are trailing CR and/or LF. |
261 | while ( data[tail-1] == '=' || data[tail-1] == '\n' || | 260 | while ( data[tail-1] == '=' || data[tail-1] == '\n' || |
262 | data[tail-1] == '\r' ) | 261 | data[tail-1] == '\r' ) |
263 | if ( data[--tail] != '=' ) len = tail; | 262 | if ( data[--tail] != '=' ) len = tail; |
264 | 263 | ||
265 | unsigned int outIdx = 0; | 264 | unsigned int outIdx = 0; |
266 | out.resize( (count=len) ); | 265 | out.resize( (count=len) ); |
267 | for (unsigned int idx = 0; idx < count; idx++) | 266 | for (unsigned int idx = 0; idx < count; idx++) |
268 | { | 267 | { |
269 | // Adhere to RFC 2045 and ignore characters | 268 | // Adhere to RFC 2045 and ignore characters |
270 | // that are not part of the encoding table. | 269 | // that are not part of the encoding table. |
271 | unsigned char ch = data[idx]; | 270 | unsigned char ch = data[idx]; |
272 | if ( (ch > 47 && ch < 58) || (ch > 64 && ch < 91 ) || | 271 | if ( (ch > 47 && ch < 58) || (ch > 64 && ch < 91 ) || |
273 | (ch > 96 && ch < 123)|| ch == '+' || ch == '/' || ch == '=') | 272 | (ch > 96 && ch < 123)|| ch == '+' || ch == '/' || ch == '=') |
274 | { | 273 | { |
275 | out[outIdx++] = Base64DecMap[ch]; | 274 | out[outIdx++] = Base64DecMap[ch]; |
276 | } | 275 | } |
277 | else | 276 | else |
278 | { | 277 | { |
279 | len--; | 278 | len--; |
280 | tail--; | 279 | tail--; |
281 | } | 280 | } |
282 | } | 281 | } |
283 | 282 | ||
284 | // kdDebug() << "Tail size = " << tail << ", Length size = " << len << endl; | 283 | // kdDebug() << "Tail size = " << tail << ", Length size = " << len << endl; |
285 | 284 | ||
286 | // 4-byte to 3-byte conversion | 285 | // 4-byte to 3-byte conversion |
287 | len = (tail>(len/4)) ? tail-(len/4) : 0; | 286 | len = (tail>(len/4)) ? tail-(len/4) : 0; |
288 | unsigned int sidx = 0, didx = 0; | 287 | unsigned int sidx = 0, didx = 0; |
289 | if ( len > 1 ) | 288 | if ( len > 1 ) |
290 | { | 289 | { |
291 | while (didx < len-2) | 290 | while (didx < len-2) |
292 | { | 291 | { |
293 | out[didx] = (((out[sidx] << 2) & 255) | ((out[sidx+1] >> 4) & 003)); | 292 | out[didx] = (((out[sidx] << 2) & 255) | ((out[sidx+1] >> 4) & 003)); |
294 | out[didx+1] = (((out[sidx+1] << 4) & 255) | ((out[sidx+2] >> 2) & 017)); | 293 | out[didx+1] = (((out[sidx+1] << 4) & 255) | ((out[sidx+2] >> 2) & 017)); |
295 | out[didx+2] = (((out[sidx+2] << 6) & 255) | (out[sidx+3] & 077)); | 294 | out[didx+2] = (((out[sidx+2] << 6) & 255) | (out[sidx+3] & 077)); |
296 | sidx += 4; | 295 | sidx += 4; |
297 | didx += 3; | 296 | didx += 3; |
298 | } | 297 | } |
299 | } | 298 | } |
300 | 299 | ||
301 | if (didx < len) | 300 | if (didx < len) |
302 | out[didx] = (((out[sidx] << 2) & 255) | ((out[sidx+1] >> 4) & 003)); | 301 | out[didx] = (((out[sidx] << 2) & 255) | ((out[sidx+1] >> 4) & 003)); |
303 | 302 | ||
304 | if (++didx < len ) | 303 | if (++didx < len ) |
305 | out[didx] = (((out[sidx+1] << 4) & 255) | ((out[sidx+2] >> 2) & 017)); | 304 | out[didx] = (((out[sidx+1] << 4) & 255) | ((out[sidx+2] >> 2) & 017)); |
306 | 305 | ||
307 | // Resize the output buffer | 306 | // Resize the output buffer |
308 | if ( len == 0 || len < out.size() ) | 307 | if ( len == 0 || len < out.size() ) |
309 | out.resize(len); | 308 | out.resize(len); |
310 | 309 | ||
311 | return out; | 310 | return out; |
312 | } | 311 | } |
313 | 312 | ||
314 | bool OGlobal::isAppLnkFileName( const QString& str ) | 313 | bool OGlobal::isAppLnkFileName( const QString& str ) |
315 | { | 314 | { |
316 | if (str.length()==0||str.at(str.length()-1)==QDir::separator()) return false; | 315 | if (str.length()==0||str.at(str.length()-1)==QDir::separator()) return false; |
317 | return str.startsWith(MimeType::appsFolderName()+QDir::separator()); | 316 | return str.startsWith(MimeType::appsFolderName()+QDir::separator()); |
318 | } | 317 | } |
319 | 318 | ||
320 | /* ToDo: | 319 | /* ToDo: |
321 | * This fun should check the document-path value for the mounted media | 320 | * This fun should check the document-path value for the mounted media |
322 | * which has to be implemented later. this moment we just check for a | 321 | * which has to be implemented later. this moment we just check for a |
323 | * mounted media name. | 322 | * mounted media name. |
324 | */ | 323 | */ |
325 | bool OGlobal::isDocumentFileName( const QString& file ) | 324 | bool OGlobal::isDocumentFileName( const QString& file ) |
326 | { | 325 | { |
327 | if (file.length()==0||file.at(file.length()-1)==QDir::separator()) return false; | 326 | if (file.length()==0||file.at(file.length()-1)==QDir::separator()) return false; |
328 | if (file.startsWith(QPEApplication::documentDir()+QDir::separator())) return true; | 327 | if (file.startsWith(QPEApplication::documentDir()+QDir::separator())) return true; |
329 | StorageInfo si; | 328 | StorageInfo si; |
330 | QList< FileSystem > fl = si.fileSystems(); | 329 | QList< FileSystem > fl = si.fileSystems(); |
331 | FileSystem*fs; | 330 | FileSystem*fs; |
332 | for (fs = fl.first();fs!=0;fs=fl.next()) { | 331 | for (fs = fl.first();fs!=0;fs=fl.next()) { |
333 | if (fs->isRemovable()&&file.startsWith(fs->name()+QDir::separator())) | 332 | if (fs->isRemovable()&&file.startsWith(fs->name()+QDir::separator())) |
334 | return true; | 333 | return true; |
335 | } | 334 | } |
336 | if (file.startsWith(homeDirPath())+"/Documents/") return true; | 335 | if (file.startsWith(homeDirPath())+"/Documents/") return true; |
337 | return false; | 336 | return false; |
338 | } | 337 | } |
339 | 338 | ||
340 | QString OGlobal::tempDirPath() | 339 | QString OGlobal::tempDirPath() |
341 | { | 340 | { |
342 | static QString defstring="/tmp"; | 341 | static QString defstring="/tmp"; |
343 | char * tmpp = 0; | 342 | char * tmpp = 0; |
344 | if ( (tmpp=getenv("TEMP"))) { | 343 | if ( (tmpp=getenv("TEMP"))) { |
345 | return tmpp; | 344 | return tmpp; |
346 | } | 345 | } |
347 | return defstring; | 346 | return defstring; |
348 | } | 347 | } |
349 | 348 | ||
350 | QString OGlobal::homeDirPath() | 349 | QString OGlobal::homeDirPath() |
351 | { | 350 | { |
352 | char * tmpp = getenv("HOME"); | 351 | char * tmpp = getenv("HOME"); |
353 | return (tmpp?tmpp:"/"); | 352 | return (tmpp?tmpp:"/"); |
354 | } | 353 | } |
355 | 354 | ||
356 | bool OGlobal::weekStartsOnMonday() | 355 | bool OGlobal::weekStartsOnMonday() |
357 | { | 356 | { |
358 | OConfig*conf=OGlobal::qpe_config(); | 357 | OConfig*conf=OGlobal::qpe_config(); |
359 | if (!conf)return false; | 358 | if (!conf)return false; |
360 | conf->setGroup("Time"); | 359 | conf->setGroup("Time"); |
361 | return conf->readBoolEntry("MONDAY",true); | 360 | return conf->readBoolEntry("MONDAY",true); |
362 | } | 361 | } |
363 | 362 | ||
364 | void OGlobal::setWeekStartsOnMonday( bool what) | 363 | void OGlobal::setWeekStartsOnMonday( bool what) |
365 | { | 364 | { |
366 | OConfig*conf=OGlobal::qpe_config(); | 365 | OConfig*conf=OGlobal::qpe_config(); |
367 | if (!conf)return; | 366 | if (!conf)return; |
368 | conf->setGroup("Time"); | 367 | conf->setGroup("Time"); |
369 | return conf->writeEntry("MONDAY",what); | 368 | return conf->writeEntry("MONDAY",what); |
370 | } | 369 | } |
371 | 370 | ||
372 | bool OGlobal::useAMPM() | 371 | bool OGlobal::useAMPM() |
373 | { | 372 | { |
374 | OConfig*conf=OGlobal::qpe_config(); | 373 | OConfig*conf=OGlobal::qpe_config(); |
375 | if (!conf)return false; | 374 | if (!conf)return false; |
376 | conf->setGroup("Time"); | 375 | conf->setGroup("Time"); |
377 | return conf->readBoolEntry("AMPM",false); | 376 | return conf->readBoolEntry("AMPM",false); |
378 | } | 377 | } |
379 | 378 | ||
380 | void OGlobal::setUseAMPM( bool what) | 379 | void OGlobal::setUseAMPM( bool what) |
381 | { | 380 | { |
382 | OConfig*conf=OGlobal::qpe_config(); | 381 | OConfig*conf=OGlobal::qpe_config(); |
383 | if (!conf)return; | 382 | if (!conf)return; |
384 | conf->setGroup("Time"); | 383 | conf->setGroup("Time"); |
385 | return conf->writeEntry("AMPM",what); | 384 | return conf->writeEntry("AMPM",what); |
386 | } | 385 | } |
387 | 386 | ||
388 | OConfig* OGlobal::qpe_config() | 387 | OConfig* OGlobal::qpe_config() |
389 | { | 388 | { |
390 | if ( !OGlobal::_qpe_config ) { | 389 | if ( !OGlobal::_qpe_config ) { |
391 | OGlobal::_qpe_config = new OConfig( "qpe" ); | 390 | OGlobal::_qpe_config = new OConfig( "qpe" ); |
392 | } | 391 | } |
393 | return OGlobal::_qpe_config; | 392 | return OGlobal::_qpe_config; |
394 | } | 393 | } |
395 | 394 | ||
396 | bool OGlobal::truncateFile( QFile &f, off_t size ) | 395 | bool OGlobal::truncateFile( QFile &f, off_t size ) |
397 | { | 396 | { |
398 | /* or should we let enlarge Files? then remove this | 397 | /* or should we let enlarge Files? then remove this |
399 | f.size()< part! - Alwin | 398 | f.size()< part! - Alwin |
400 | */ | 399 | */ |
401 | if (!f.exists()||f.size()<(unsigned)size) return false; | 400 | if (!f.exists()||f.size()<(unsigned)size) return false; |
402 | bool closeit=false; | 401 | bool closeit=false; |
403 | if (!f.isOpen()) { | 402 | if (!f.isOpen()) { |
404 | closeit=true; | 403 | closeit=true; |
405 | f.open(IO_Raw | IO_ReadWrite | IO_Append); | 404 | f.open(IO_Raw | IO_ReadWrite | IO_Append); |
406 | } | 405 | } |
407 | if (!f.isOpen()) { return false; } | 406 | if (!f.isOpen()) { return false; } |
408 | int r = ftruncate(f.handle(),size); | 407 | int r = ftruncate(f.handle(),size); |
409 | if (closeit) f.close(); | 408 | if (closeit) f.close(); |
410 | return r==0; | 409 | return r==0; |
411 | } | 410 | } |
diff --git a/libopie2/opiecore/oglobalsettings.cpp b/libopie2/opiecore/oglobalsettings.cpp index 66adbd0..192e55b 100644 --- a/libopie2/opiecore/oglobalsettings.cpp +++ b/libopie2/opiecore/oglobalsettings.cpp | |||
@@ -1,548 +1,545 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | 3 | ||
4 | Copyright (C) 2003 Michael Lauer <mickey@tm.informatik.uni-frankfurt.de> | 4 | Copyright (C) 2003 Michael Lauer <mickey@tm.informatik.uni-frankfurt.de> |
5 | Inspired by the KDE globalsettings which are | 5 | Inspired by the KDE globalsettings which are |
6 | Copyright (C) 2000 David Faure <faure@kde.org> | 6 | Copyright (C) 2000 David Faure <faure@kde.org> |
7 | =. | 7 | =. |
8 | .=l. | 8 | .=l. |
9 | .>+-= | 9 | .>+-= |
10 | _;:, .> :=|. This program is free software; you can | 10 | _;:, .> :=|. This program is free software; you can |
11 | .> <`_, > . <= redistribute it and/or modify it under | 11 | .> <`_, > . <= redistribute it and/or modify it under |
12 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 12 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
13 | .="- .-=="i, .._ License as published by the Free Software | 13 | .="- .-=="i, .._ License as published by the Free Software |
14 | - . .-<_> .<> Foundation; either version 2 of the License, | 14 | - . .-<_> .<> Foundation; either version 2 of the License, |
15 | ._= =} : or (at your option) any later version. | 15 | ._= =} : or (at your option) any later version. |
16 | .%`+i> _;_. | 16 | .%`+i> _;_. |
17 | .i_,=:_. -<s. This program is distributed in the hope that | 17 | .i_,=:_. -<s. This program is distributed in the hope that |
18 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 18 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
19 | : .. .:, . . . without even the implied warranty of | 19 | : .. .:, . . . without even the implied warranty of |
20 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 20 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
21 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 21 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
22 | ..}^=.= = ; Library General Public License for more | 22 | ..}^=.= = ; Library General Public License for more |
23 | ++= -. .` .: details. | 23 | ++= -. .` .: details. |
24 | : = ...= . :.=- | 24 | : = ...= . :.=- |
25 | -. .:....=;==+<; You should have received a copy of the GNU | 25 | -. .:....=;==+<; You should have received a copy of the GNU |
26 | -_. . . )=. = Library General Public License along with | 26 | -_. . . )=. = Library General Public License along with |
27 | -- :-=` this library; see the file COPYING.LIB. | 27 | -- :-=` this library; see the file COPYING.LIB. |
28 | If not, write to the Free Software Foundation, | 28 | If not, write to the Free Software Foundation, |
29 | Inc., 59 Temple Place - Suite 330, | 29 | Inc., 59 Temple Place - Suite 330, |
30 | Boston, MA 02111-1307, USA. | 30 | Boston, MA 02111-1307, USA. |
31 | */ | 31 | */ |
32 | 32 | ||
33 | /* OPIE */ | 33 | /* OPIE */ |
34 | 34 | ||
35 | #include <opie2/oglobalsettings.h> | 35 | #include <opie2/oglobalsettings.h> |
36 | #include <opie2/oconfig.h> | 36 | #include <opie2/oconfig.h> |
37 | #include <opie2/oglobal.h> | 37 | #include <opie2/oglobal.h> |
38 | 38 | ||
39 | /* QT */ | 39 | /* QT */ |
40 | 40 | ||
41 | #include <qobject.h> | ||
42 | #include <qdir.h> | 41 | #include <qdir.h> |
43 | #include <qpixmap.h> | ||
44 | #include <qfontinfo.h> | ||
45 | 42 | ||
46 | /* UNIX */ | 43 | /* UNIX */ |
47 | 44 | ||
48 | #include <stdlib.h> | 45 | #include <stdlib.h> |
49 | 46 | ||
50 | QString* OGlobalSettings::s_desktopPath = 0; | 47 | QString* OGlobalSettings::s_desktopPath = 0; |
51 | QString* OGlobalSettings::s_autostartPath = 0; | 48 | QString* OGlobalSettings::s_autostartPath = 0; |
52 | QString* OGlobalSettings::s_trashPath = 0; | 49 | QString* OGlobalSettings::s_trashPath = 0; |
53 | QString* OGlobalSettings::s_documentPath = 0; | 50 | QString* OGlobalSettings::s_documentPath = 0; |
54 | QFont *OGlobalSettings::_generalFont = 0; | 51 | QFont *OGlobalSettings::_generalFont = 0; |
55 | QFont *OGlobalSettings::_fixedFont = 0; | 52 | QFont *OGlobalSettings::_fixedFont = 0; |
56 | QFont *OGlobalSettings::_toolBarFont = 0; | 53 | QFont *OGlobalSettings::_toolBarFont = 0; |
57 | QFont *OGlobalSettings::_menuFont = 0; | 54 | QFont *OGlobalSettings::_menuFont = 0; |
58 | QFont *OGlobalSettings::_windowTitleFont = 0; | 55 | QFont *OGlobalSettings::_windowTitleFont = 0; |
59 | QFont *OGlobalSettings::_taskbarFont = 0; | 56 | QFont *OGlobalSettings::_taskbarFont = 0; |
60 | 57 | ||
61 | QColor *OGlobalSettings::OpieGray = 0; | 58 | QColor *OGlobalSettings::OpieGray = 0; |
62 | QColor *OGlobalSettings::OpieHighlight = 0; | 59 | QColor *OGlobalSettings::OpieHighlight = 0; |
63 | QColor *OGlobalSettings::OpieAlternate = 0; | 60 | QColor *OGlobalSettings::OpieAlternate = 0; |
64 | 61 | ||
65 | OGlobalSettings::OMouseSettings *OGlobalSettings::s_mouseSettings = 0; | 62 | OGlobalSettings::OMouseSettings *OGlobalSettings::s_mouseSettings = 0; |
66 | 63 | ||
67 | //FIXME: Add manipulators to the accessors | 64 | //FIXME: Add manipulators to the accessors |
68 | 65 | ||
69 | int OGlobalSettings::dndEventDelay() | 66 | int OGlobalSettings::dndEventDelay() |
70 | { | 67 | { |
71 | OConfig *c = OGlobal::config(); | 68 | OConfig *c = OGlobal::config(); |
72 | OConfigGroupSaver cgs( c, "General" ); | 69 | OConfigGroupSaver cgs( c, "General" ); |
73 | return c->readNumEntry("DndDelay", 2); | 70 | return c->readNumEntry("DndDelay", 2); |
74 | } | 71 | } |
75 | 72 | ||
76 | bool OGlobalSettings::singleClick() | 73 | bool OGlobalSettings::singleClick() |
77 | { | 74 | { |
78 | OConfig *c = OGlobal::config(); | 75 | OConfig *c = OGlobal::config(); |
79 | OConfigGroupSaver cgs( c, "OPIE" ); | 76 | OConfigGroupSaver cgs( c, "OPIE" ); |
80 | return c->readBoolEntry("SingleClick", OPIE_DEFAULT_SINGLECLICK); | 77 | return c->readBoolEntry("SingleClick", OPIE_DEFAULT_SINGLECLICK); |
81 | } | 78 | } |
82 | 79 | ||
83 | bool OGlobalSettings::insertTearOffHandle() | 80 | bool OGlobalSettings::insertTearOffHandle() |
84 | { | 81 | { |
85 | OConfig *c = OGlobal::config(); | 82 | OConfig *c = OGlobal::config(); |
86 | OConfigGroupSaver cgs( c, "OPIE" ); | 83 | OConfigGroupSaver cgs( c, "OPIE" ); |
87 | return c->readBoolEntry("InsertTearOffHandle", OPIE_DEFAULT_INSERTTEAROFFHANDLES); | 84 | return c->readBoolEntry("InsertTearOffHandle", OPIE_DEFAULT_INSERTTEAROFFHANDLES); |
88 | } | 85 | } |
89 | 86 | ||
90 | bool OGlobalSettings::changeCursorOverIcon() | 87 | bool OGlobalSettings::changeCursorOverIcon() |
91 | { | 88 | { |
92 | OConfig *c = OGlobal::config(); | 89 | OConfig *c = OGlobal::config(); |
93 | OConfigGroupSaver cgs( c, "OPIE" ); | 90 | OConfigGroupSaver cgs( c, "OPIE" ); |
94 | return c->readBoolEntry("ChangeCursor", OPIE_DEFAULT_CHANGECURSOR); | 91 | return c->readBoolEntry("ChangeCursor", OPIE_DEFAULT_CHANGECURSOR); |
95 | } | 92 | } |
96 | 93 | ||
97 | bool OGlobalSettings::visualActivate() | 94 | bool OGlobalSettings::visualActivate() |
98 | { | 95 | { |
99 | OConfig *c = OGlobal::config(); | 96 | OConfig *c = OGlobal::config(); |
100 | OConfigGroupSaver cgs( c, "OPIE" ); | 97 | OConfigGroupSaver cgs( c, "OPIE" ); |
101 | return c->readBoolEntry("VisualActivate", OPIE_DEFAULT_VISUAL_ACTIVATE); | 98 | return c->readBoolEntry("VisualActivate", OPIE_DEFAULT_VISUAL_ACTIVATE); |
102 | } | 99 | } |
103 | 100 | ||
104 | unsigned int OGlobalSettings::visualActivateSpeed() | 101 | unsigned int OGlobalSettings::visualActivateSpeed() |
105 | { | 102 | { |
106 | OConfig *c = OGlobal::config(); | 103 | OConfig *c = OGlobal::config(); |
107 | OConfigGroupSaver cgs( c, "OPIE" ); | 104 | OConfigGroupSaver cgs( c, "OPIE" ); |
108 | return | 105 | return |
109 | c->readNumEntry( | 106 | c->readNumEntry( |
110 | "VisualActivateSpeed", | 107 | "VisualActivateSpeed", |
111 | OPIE_DEFAULT_VISUAL_ACTIVATE_SPEED | 108 | OPIE_DEFAULT_VISUAL_ACTIVATE_SPEED |
112 | ); | 109 | ); |
113 | } | 110 | } |
114 | 111 | ||
115 | int OGlobalSettings::autoSelectDelay() | 112 | int OGlobalSettings::autoSelectDelay() |
116 | { | 113 | { |
117 | OConfig *c = OGlobal::config(); | 114 | OConfig *c = OGlobal::config(); |
118 | OConfigGroupSaver cgs( c, "OPIE" ); | 115 | OConfigGroupSaver cgs( c, "OPIE" ); |
119 | return c->readNumEntry("AutoSelectDelay", OPIE_DEFAULT_AUTOSELECTDELAY); | 116 | return c->readNumEntry("AutoSelectDelay", OPIE_DEFAULT_AUTOSELECTDELAY); |
120 | } | 117 | } |
121 | 118 | ||
122 | OGlobalSettings::Completion OGlobalSettings::completionMode() | 119 | OGlobalSettings::Completion OGlobalSettings::completionMode() |
123 | { | 120 | { |
124 | int completion; | 121 | int completion; |
125 | OConfig *c = OGlobal::config(); | 122 | OConfig *c = OGlobal::config(); |
126 | OConfigGroupSaver cgs( c, "General" ); | 123 | OConfigGroupSaver cgs( c, "General" ); |
127 | completion = c->readNumEntry("completionMode", -1); | 124 | completion = c->readNumEntry("completionMode", -1); |
128 | if ((completion < (int) CompletionNone) || | 125 | if ((completion < (int) CompletionNone) || |
129 | (completion > (int) CompletionPopupAuto)) | 126 | (completion > (int) CompletionPopupAuto)) |
130 | { | 127 | { |
131 | completion = (int) CompletionPopup; // Default | 128 | completion = (int) CompletionPopup; // Default |
132 | } | 129 | } |
133 | return (Completion) completion; | 130 | return (Completion) completion; |
134 | } | 131 | } |
135 | 132 | ||
136 | 133 | ||
137 | bool OGlobalSettings::showContextMenusOnPress () | 134 | bool OGlobalSettings::showContextMenusOnPress () |
138 | { | 135 | { |
139 | OConfig *c = OGlobal::config(); | 136 | OConfig *c = OGlobal::config(); |
140 | OConfigGroupSaver cgs (c, "ContextMenus"); | 137 | OConfigGroupSaver cgs (c, "ContextMenus"); |
141 | 138 | ||
142 | return cgs.config()->readBoolEntry("ShowOnPress", true); | 139 | return cgs.config()->readBoolEntry("ShowOnPress", true); |
143 | } | 140 | } |
144 | 141 | ||
145 | 142 | ||
146 | int OGlobalSettings::contextMenuKey () | 143 | int OGlobalSettings::contextMenuKey () |
147 | { | 144 | { |
148 | OConfig *c = OGlobal::config(); | 145 | OConfig *c = OGlobal::config(); |
149 | OConfigGroupSaver cgs (c, "Shortcuts"); | 146 | OConfigGroupSaver cgs (c, "Shortcuts"); |
150 | 147 | ||
151 | //OShortcut cut (cgs.config()->readEntry ("PopupMenuContext", "Menu")); | 148 | //OShortcut cut (cgs.config()->readEntry ("PopupMenuContext", "Menu")); |
152 | //return cut.keyCodeQt(); | 149 | //return cut.keyCodeQt(); |
153 | 150 | ||
154 | return 0; // FIXME | 151 | return 0; // FIXME |
155 | } | 152 | } |
156 | 153 | ||
157 | 154 | ||
158 | OGlobalSettings::Debug OGlobalSettings::debugMode() | 155 | OGlobalSettings::Debug OGlobalSettings::debugMode() |
159 | { | 156 | { |
160 | OConfig *c = OGlobal::config(); | 157 | OConfig *c = OGlobal::config(); |
161 | OConfigGroupSaver cgs( c, "General" ); | 158 | OConfigGroupSaver cgs( c, "General" ); |
162 | int debug = c->readNumEntry( "debugMode", -1 ); | 159 | int debug = c->readNumEntry( "debugMode", -1 ); |
163 | if ( (debug < (int) DebugNone) || (debug > (int) DebugSocket) ) | 160 | if ( (debug < (int) DebugNone) || (debug > (int) DebugSocket) ) |
164 | { | 161 | { |
165 | debug = (int) DebugStdErr; // Default | 162 | debug = (int) DebugStdErr; // Default |
166 | } | 163 | } |
167 | return (Debug) debug; | 164 | return (Debug) debug; |
168 | } | 165 | } |
169 | 166 | ||
170 | 167 | ||
171 | QString OGlobalSettings::debugOutput() | 168 | QString OGlobalSettings::debugOutput() |
172 | { | 169 | { |
173 | OConfig *c = OGlobal::config(); | 170 | OConfig *c = OGlobal::config(); |
174 | OConfigGroupSaver cgs( c, "General" ); | 171 | OConfigGroupSaver cgs( c, "General" ); |
175 | QString deflt = QString::null; | 172 | QString deflt = QString::null; |
176 | switch( debugMode() ) | 173 | switch( debugMode() ) |
177 | { | 174 | { |
178 | case DebugNone: break; // no additional information needed | 175 | case DebugNone: break; // no additional information needed |
179 | case DebugFiles: deflt = "/var/log/opiedebug.log"; break; // file to save output in | 176 | case DebugFiles: deflt = "/var/log/opiedebug.log"; break; // file to save output in |
180 | case DebugMsgBox: break; // no additional information needed | 177 | case DebugMsgBox: break; // no additional information needed |
181 | case DebugStdErr: break; // no additional information needed | 178 | case DebugStdErr: break; // no additional information needed |
182 | case DebugSysLog: break; // no additional information needed | 179 | case DebugSysLog: break; // no additional information needed |
183 | case DebugSocket: deflt = "127.0.0.1:8913"; break; // address to send packets to | 180 | case DebugSocket: deflt = "127.0.0.1:8913"; break; // address to send packets to |
184 | } | 181 | } |
185 | 182 | ||
186 | return c->readEntry( "debugOutput"+ QString::number(debugMode()), deflt ); | 183 | return c->readEntry( "debugOutput"+ QString::number(debugMode()), deflt ); |
187 | } | 184 | } |
188 | 185 | ||
189 | 186 | ||
190 | QColor OGlobalSettings::toolBarHighlightColor() | 187 | QColor OGlobalSettings::toolBarHighlightColor() |
191 | { | 188 | { |
192 | initColors(); | 189 | initColors(); |
193 | OConfig *c = OGlobal::config(); | 190 | OConfig *c = OGlobal::config(); |
194 | OConfigGroupSaver cgs( c, QString::fromLatin1("Toolbar style") ); | 191 | OConfigGroupSaver cgs( c, QString::fromLatin1("Toolbar style") ); |
195 | return c->readColorEntry("HighlightColor", OpieHighlight); | 192 | return c->readColorEntry("HighlightColor", OpieHighlight); |
196 | } | 193 | } |
197 | 194 | ||
198 | QColor OGlobalSettings::inactiveTitleColor() | 195 | QColor OGlobalSettings::inactiveTitleColor() |
199 | { | 196 | { |
200 | if (!OpieGray) OpieGray = new QColor(220, 220, 220); | 197 | if (!OpieGray) OpieGray = new QColor(220, 220, 220); |
201 | OConfig *c = OGlobal::config(); | 198 | OConfig *c = OGlobal::config(); |
202 | OConfigGroupSaver cgs( c, QString::fromLatin1("WM") ); | 199 | OConfigGroupSaver cgs( c, QString::fromLatin1("WM") ); |
203 | return c->readColorEntry( "inactiveBackground", OpieGray ); | 200 | return c->readColorEntry( "inactiveBackground", OpieGray ); |
204 | } | 201 | } |
205 | 202 | ||
206 | QColor OGlobalSettings::inactiveTextColor() | 203 | QColor OGlobalSettings::inactiveTextColor() |
207 | { | 204 | { |
208 | OConfig *c = OGlobal::config(); | 205 | OConfig *c = OGlobal::config(); |
209 | OConfigGroupSaver cgs( c, QString::fromLatin1("WM") ); | 206 | OConfigGroupSaver cgs( c, QString::fromLatin1("WM") ); |
210 | return c->readColorEntry( "inactiveForeground", &Qt::darkGray ); | 207 | return c->readColorEntry( "inactiveForeground", &Qt::darkGray ); |
211 | } | 208 | } |
212 | 209 | ||
213 | QColor OGlobalSettings::activeTitleColor() | 210 | QColor OGlobalSettings::activeTitleColor() |
214 | { | 211 | { |
215 | initColors(); | 212 | initColors(); |
216 | OConfig *c = OGlobal::config(); | 213 | OConfig *c = OGlobal::config(); |
217 | OConfigGroupSaver cgs( c, QString::fromLatin1("WM") ); | 214 | OConfigGroupSaver cgs( c, QString::fromLatin1("WM") ); |
218 | return c->readColorEntry( "activeBackground", OpieHighlight); | 215 | return c->readColorEntry( "activeBackground", OpieHighlight); |
219 | } | 216 | } |
220 | 217 | ||
221 | QColor OGlobalSettings::activeTextColor() | 218 | QColor OGlobalSettings::activeTextColor() |
222 | { | 219 | { |
223 | OConfig *c = OGlobal::config(); | 220 | OConfig *c = OGlobal::config(); |
224 | OConfigGroupSaver cgs( c, QString::fromLatin1("WM") ); | 221 | OConfigGroupSaver cgs( c, QString::fromLatin1("WM") ); |
225 | return c->readColorEntry( "activeForeground", &Qt::white ); | 222 | return c->readColorEntry( "activeForeground", &Qt::white ); |
226 | } | 223 | } |
227 | 224 | ||
228 | int OGlobalSettings::contrast() | 225 | int OGlobalSettings::contrast() |
229 | { | 226 | { |
230 | OConfig *c = OGlobal::config(); | 227 | OConfig *c = OGlobal::config(); |
231 | OConfigGroupSaver cgs( c, QString::fromLatin1("OPIE") ); | 228 | OConfigGroupSaver cgs( c, QString::fromLatin1("OPIE") ); |
232 | return c->readNumEntry( "contrast", 7 ); | 229 | return c->readNumEntry( "contrast", 7 ); |
233 | } | 230 | } |
234 | 231 | ||
235 | // following functions should work in OPIE - how to sync with appearance changes? | 232 | // following functions should work in OPIE - how to sync with appearance changes? |
236 | 233 | ||
237 | QColor OGlobalSettings::baseColor() | 234 | QColor OGlobalSettings::baseColor() |
238 | { | 235 | { |
239 | OConfig *c = OGlobal::config(); | 236 | OConfig *c = OGlobal::config(); |
240 | OConfigGroupSaver cgs( c, QString::fromLatin1("Appearance") ); | 237 | OConfigGroupSaver cgs( c, QString::fromLatin1("Appearance") ); |
241 | return c->readColorEntry( "Base", &Qt::white ); | 238 | return c->readColorEntry( "Base", &Qt::white ); |
242 | } | 239 | } |
243 | 240 | ||
244 | QColor OGlobalSettings::textColor() | 241 | QColor OGlobalSettings::textColor() |
245 | { | 242 | { |
246 | OConfig *c = OGlobal::config(); | 243 | OConfig *c = OGlobal::config(); |
247 | OConfigGroupSaver cgs( c, QString::fromLatin1("Appearance") ); | 244 | OConfigGroupSaver cgs( c, QString::fromLatin1("Appearance") ); |
248 | return c->readColorEntry( "Text", &Qt::black ); | 245 | return c->readColorEntry( "Text", &Qt::black ); |
249 | } | 246 | } |
250 | 247 | ||
251 | QColor OGlobalSettings::highlightedTextColor() | 248 | QColor OGlobalSettings::highlightedTextColor() |
252 | { | 249 | { |
253 | OConfig *c = OGlobal::config(); | 250 | OConfig *c = OGlobal::config(); |
254 | OConfigGroupSaver cgs( c, QString::fromLatin1("Appearance") ); | 251 | OConfigGroupSaver cgs( c, QString::fromLatin1("Appearance") ); |
255 | return c->readColorEntry( "HighlightedText", &Qt::white ); | 252 | return c->readColorEntry( "HighlightedText", &Qt::white ); |
256 | } | 253 | } |
257 | 254 | ||
258 | QColor OGlobalSettings::highlightColor() | 255 | QColor OGlobalSettings::highlightColor() |
259 | { | 256 | { |
260 | initColors(); | 257 | initColors(); |
261 | OConfig *c = OGlobal::config(); | 258 | OConfig *c = OGlobal::config(); |
262 | OConfigGroupSaver cgs( c, QString::fromLatin1("Appearance") ); | 259 | OConfigGroupSaver cgs( c, QString::fromLatin1("Appearance") ); |
263 | return c->readColorEntry( "Highlight", OpieHighlight ); | 260 | return c->readColorEntry( "Highlight", OpieHighlight ); |
264 | } | 261 | } |
265 | 262 | ||
266 | QColor OGlobalSettings::alternateBackgroundColor() | 263 | QColor OGlobalSettings::alternateBackgroundColor() |
267 | { | 264 | { |
268 | initColors(); | 265 | initColors(); |
269 | OConfig *c = OGlobal::config(); | 266 | OConfig *c = OGlobal::config(); |
270 | OConfigGroupSaver cgs( c, QString::fromLatin1("Appearance") ); | 267 | OConfigGroupSaver cgs( c, QString::fromLatin1("Appearance") ); |
271 | *OpieAlternate = calculateAlternateBackgroundColor( baseColor() ); | 268 | *OpieAlternate = calculateAlternateBackgroundColor( baseColor() ); |
272 | return c->readColorEntry( "alternateBackground", OpieAlternate ); | 269 | return c->readColorEntry( "alternateBackground", OpieAlternate ); |
273 | } | 270 | } |
274 | 271 | ||
275 | QColor OGlobalSettings::calculateAlternateBackgroundColor(const QColor& base) | 272 | QColor OGlobalSettings::calculateAlternateBackgroundColor(const QColor& base) |
276 | { | 273 | { |
277 | if (base == Qt::white) | 274 | if (base == Qt::white) |
278 | return QColor(238,246,255); | 275 | return QColor(238,246,255); |
279 | else | 276 | else |
280 | { | 277 | { |
281 | int h, s, v; | 278 | int h, s, v; |
282 | base.hsv( &h, &s, &v ); | 279 | base.hsv( &h, &s, &v ); |
283 | if (v > 128) | 280 | if (v > 128) |
284 | return base.dark(106); | 281 | return base.dark(106); |
285 | else if (base != Qt::black) | 282 | else if (base != Qt::black) |
286 | return base.light(110); | 283 | return base.light(110); |
287 | 284 | ||
288 | return QColor(32,32,32); | 285 | return QColor(32,32,32); |
289 | } | 286 | } |
290 | } | 287 | } |
291 | 288 | ||
292 | QColor OGlobalSettings::linkColor() | 289 | QColor OGlobalSettings::linkColor() |
293 | { | 290 | { |
294 | initColors(); | 291 | initColors(); |
295 | OConfig *c = OGlobal::config(); | 292 | OConfig *c = OGlobal::config(); |
296 | OConfigGroupSaver cgs( c, QString::fromLatin1("Appearance") ); | 293 | OConfigGroupSaver cgs( c, QString::fromLatin1("Appearance") ); |
297 | return c->readColorEntry( "linkColor", OpieGray ); | 294 | return c->readColorEntry( "linkColor", OpieGray ); |
298 | } | 295 | } |
299 | 296 | ||
300 | QColor OGlobalSettings::visitedLinkColor() | 297 | QColor OGlobalSettings::visitedLinkColor() |
301 | { | 298 | { |
302 | OConfig *c = OGlobal::config(); | 299 | OConfig *c = OGlobal::config(); |
303 | OConfigGroupSaver cgs( c, QString::fromLatin1("Appearance") ); | 300 | OConfigGroupSaver cgs( c, QString::fromLatin1("Appearance") ); |
304 | return c->readColorEntry( "visitedLinkColor", &Qt::magenta ); | 301 | return c->readColorEntry( "visitedLinkColor", &Qt::magenta ); |
305 | } | 302 | } |
306 | 303 | ||
307 | // FIXME: font stuff currently uses a different format in OPIE, so the | 304 | // FIXME: font stuff currently uses a different format in OPIE, so the |
308 | // functions below are not yet applicable. The whole font stuff for OPIE | 305 | // functions below are not yet applicable. The whole font stuff for OPIE |
309 | // has to be revised anyway | 306 | // has to be revised anyway |
310 | 307 | ||
311 | QFont OGlobalSettings::generalFont() | 308 | QFont OGlobalSettings::generalFont() |
312 | { | 309 | { |
313 | if (_generalFont) | 310 | if (_generalFont) |
314 | return *_generalFont; | 311 | return *_generalFont; |
315 | 312 | ||
316 | _generalFont = new QFont("helvetica", 10); | 313 | _generalFont = new QFont("helvetica", 10); |
317 | _generalFont->setPixelSize(10); | 314 | _generalFont->setPixelSize(10); |
318 | _generalFont->setStyleHint(QFont::SansSerif); | 315 | _generalFont->setStyleHint(QFont::SansSerif); |
319 | 316 | ||
320 | OConfig *c = OGlobal::config(); | 317 | OConfig *c = OGlobal::config(); |
321 | OConfigGroupSaver cgs( c, QString::fromLatin1("Appearance") ); | 318 | OConfigGroupSaver cgs( c, QString::fromLatin1("Appearance") ); |
322 | *_generalFont = c->readFontEntry("font", _generalFont); | 319 | *_generalFont = c->readFontEntry("font", _generalFont); |
323 | 320 | ||
324 | return *_generalFont; | 321 | return *_generalFont; |
325 | } | 322 | } |
326 | 323 | ||
327 | QFont OGlobalSettings::fixedFont() | 324 | QFont OGlobalSettings::fixedFont() |
328 | { | 325 | { |
329 | if (_fixedFont) | 326 | if (_fixedFont) |
330 | return *_fixedFont; | 327 | return *_fixedFont; |
331 | 328 | ||
332 | _fixedFont = new QFont("courier", 12); | 329 | _fixedFont = new QFont("courier", 12); |
333 | _fixedFont->setPixelSize(12); | 330 | _fixedFont->setPixelSize(12); |
334 | _fixedFont->setStyleHint(QFont::TypeWriter); | 331 | _fixedFont->setStyleHint(QFont::TypeWriter); |
335 | 332 | ||
336 | OConfig *c = OGlobal::config(); | 333 | OConfig *c = OGlobal::config(); |
337 | OConfigGroupSaver cgs( c, QString::fromLatin1("General") ); | 334 | OConfigGroupSaver cgs( c, QString::fromLatin1("General") ); |
338 | *_fixedFont = c->readFontEntry("fixed", _fixedFont); | 335 | *_fixedFont = c->readFontEntry("fixed", _fixedFont); |
339 | 336 | ||
340 | return *_fixedFont; | 337 | return *_fixedFont; |
341 | } | 338 | } |
342 | 339 | ||
343 | QFont OGlobalSettings::toolBarFont() | 340 | QFont OGlobalSettings::toolBarFont() |
344 | { | 341 | { |
345 | if(_toolBarFont) | 342 | if(_toolBarFont) |
346 | return *_toolBarFont; | 343 | return *_toolBarFont; |
347 | 344 | ||
348 | _toolBarFont = new QFont("helvetica", 10); | 345 | _toolBarFont = new QFont("helvetica", 10); |
349 | _toolBarFont->setPixelSize(10); | 346 | _toolBarFont->setPixelSize(10); |
350 | _toolBarFont->setStyleHint(QFont::SansSerif); | 347 | _toolBarFont->setStyleHint(QFont::SansSerif); |
351 | 348 | ||
352 | OConfig *c = OGlobal::config(); | 349 | OConfig *c = OGlobal::config(); |
353 | OConfigGroupSaver cgs( c, QString::fromLatin1("General") ); | 350 | OConfigGroupSaver cgs( c, QString::fromLatin1("General") ); |
354 | *_toolBarFont = c->readFontEntry("toolBarFont", _toolBarFont); | 351 | *_toolBarFont = c->readFontEntry("toolBarFont", _toolBarFont); |
355 | 352 | ||
356 | return *_toolBarFont; | 353 | return *_toolBarFont; |
357 | } | 354 | } |
358 | 355 | ||
359 | QFont OGlobalSettings::menuFont() | 356 | QFont OGlobalSettings::menuFont() |
360 | { | 357 | { |
361 | if(_menuFont) | 358 | if(_menuFont) |
362 | return *_menuFont; | 359 | return *_menuFont; |
363 | 360 | ||
364 | _menuFont = new QFont("helvetica", 12); | 361 | _menuFont = new QFont("helvetica", 12); |
365 | _menuFont->setPixelSize(12); | 362 | _menuFont->setPixelSize(12); |
366 | _menuFont->setStyleHint(QFont::SansSerif); | 363 | _menuFont->setStyleHint(QFont::SansSerif); |
367 | 364 | ||
368 | OConfig *c = OGlobal::config(); | 365 | OConfig *c = OGlobal::config(); |
369 | OConfigGroupSaver cgs( c, QString::fromLatin1("General") ); | 366 | OConfigGroupSaver cgs( c, QString::fromLatin1("General") ); |
370 | *_menuFont = c->readFontEntry("menuFont", _menuFont); | 367 | *_menuFont = c->readFontEntry("menuFont", _menuFont); |
371 | 368 | ||
372 | return *_menuFont; | 369 | return *_menuFont; |
373 | } | 370 | } |
374 | 371 | ||
375 | QFont OGlobalSettings::windowTitleFont() | 372 | QFont OGlobalSettings::windowTitleFont() |
376 | { | 373 | { |
377 | if(_windowTitleFont) | 374 | if(_windowTitleFont) |
378 | return *_windowTitleFont; | 375 | return *_windowTitleFont; |
379 | 376 | ||
380 | _windowTitleFont = new QFont("helvetica", 12, QFont::Bold); | 377 | _windowTitleFont = new QFont("helvetica", 12, QFont::Bold); |
381 | _windowTitleFont->setPixelSize(12); | 378 | _windowTitleFont->setPixelSize(12); |
382 | _windowTitleFont->setStyleHint(QFont::SansSerif); | 379 | _windowTitleFont->setStyleHint(QFont::SansSerif); |
383 | 380 | ||
384 | OConfig *c = OGlobal::config(); | 381 | OConfig *c = OGlobal::config(); |
385 | OConfigGroupSaver cgs( c, QString::fromLatin1("WM") ); | 382 | OConfigGroupSaver cgs( c, QString::fromLatin1("WM") ); |
386 | *_windowTitleFont = c->readFontEntry("activeFont", _windowTitleFont); // inconsistency | 383 | *_windowTitleFont = c->readFontEntry("activeFont", _windowTitleFont); // inconsistency |
387 | 384 | ||
388 | return *_windowTitleFont; | 385 | return *_windowTitleFont; |
389 | } | 386 | } |
390 | 387 | ||
391 | QFont OGlobalSettings::taskbarFont() | 388 | QFont OGlobalSettings::taskbarFont() |
392 | { | 389 | { |
393 | if(_taskbarFont) | 390 | if(_taskbarFont) |
394 | return *_taskbarFont; | 391 | return *_taskbarFont; |
395 | 392 | ||
396 | _taskbarFont = new QFont("helvetica", 8); | 393 | _taskbarFont = new QFont("helvetica", 8); |
397 | _taskbarFont->setPixelSize(8); | 394 | _taskbarFont->setPixelSize(8); |
398 | _taskbarFont->setStyleHint(QFont::SansSerif); | 395 | _taskbarFont->setStyleHint(QFont::SansSerif); |
399 | 396 | ||
400 | OConfig *c = OGlobal::config(); | 397 | OConfig *c = OGlobal::config(); |
401 | OConfigGroupSaver cgs( c, QString::fromLatin1("General") ); | 398 | OConfigGroupSaver cgs( c, QString::fromLatin1("General") ); |
402 | *_taskbarFont = c->readFontEntry("taskbarFont", _taskbarFont); | 399 | *_taskbarFont = c->readFontEntry("taskbarFont", _taskbarFont); |
403 | 400 | ||
404 | return *_taskbarFont; | 401 | return *_taskbarFont; |
405 | } | 402 | } |
406 | 403 | ||
407 | // FIXME: the whole path stuff has to be revised for OPIE | 404 | // FIXME: the whole path stuff has to be revised for OPIE |
408 | 405 | ||
409 | void OGlobalSettings::initStatic() // should be called initPaths(). Don't put anything else here. | 406 | void OGlobalSettings::initStatic() // should be called initPaths(). Don't put anything else here. |
410 | { | 407 | { |
411 | if ( s_desktopPath != 0 ) | 408 | if ( s_desktopPath != 0 ) |
412 | return; | 409 | return; |
413 | 410 | ||
414 | s_desktopPath = new QString(); | 411 | s_desktopPath = new QString(); |
415 | s_autostartPath = new QString(); | 412 | s_autostartPath = new QString(); |
416 | s_trashPath = new QString(); | 413 | s_trashPath = new QString(); |
417 | s_documentPath = new QString(); | 414 | s_documentPath = new QString(); |
418 | 415 | ||
419 | OConfig *config = OGlobal::config(); | 416 | OConfig *config = OGlobal::config(); |
420 | //bool dollarExpansion = config->isDollarExpansion(); | 417 | //bool dollarExpansion = config->isDollarExpansion(); |
421 | //config->setDollarExpansion(true); | 418 | //config->setDollarExpansion(true); |
422 | OConfigGroupSaver cgs( config, "Paths" ); | 419 | OConfigGroupSaver cgs( config, "Paths" ); |
423 | 420 | ||
424 | // Desktop Path | 421 | // Desktop Path |
425 | *s_desktopPath = QDir::homeDirPath() + "/" + "Desktop" + "/"; | 422 | *s_desktopPath = QDir::homeDirPath() + "/" + "Desktop" + "/"; |
426 | *s_desktopPath = config->readEntry( "Desktop", *s_desktopPath); | 423 | *s_desktopPath = config->readEntry( "Desktop", *s_desktopPath); |
427 | if ( (*s_desktopPath)[0] != '/' ) | 424 | if ( (*s_desktopPath)[0] != '/' ) |
428 | s_desktopPath->prepend( QDir::homeDirPath() + "/" ); | 425 | s_desktopPath->prepend( QDir::homeDirPath() + "/" ); |
429 | *s_desktopPath = QDir::cleanDirPath( *s_desktopPath ); | 426 | *s_desktopPath = QDir::cleanDirPath( *s_desktopPath ); |
430 | if ( s_desktopPath->right(1) != "/") | 427 | if ( s_desktopPath->right(1) != "/") |
431 | *s_desktopPath += "/"; | 428 | *s_desktopPath += "/"; |
432 | 429 | ||
433 | // Trash Path | 430 | // Trash Path |
434 | *s_trashPath = *s_desktopPath + QObject::tr("Trash") + "/"; | 431 | *s_trashPath = *s_desktopPath + QObject::tr("Trash") + "/"; |
435 | *s_trashPath = config->readEntry( "Trash" , *s_trashPath); | 432 | *s_trashPath = config->readEntry( "Trash" , *s_trashPath); |
436 | if ( (*s_trashPath)[0] != '/' ) | 433 | if ( (*s_trashPath)[0] != '/' ) |
437 | s_trashPath->prepend( QDir::homeDirPath() + "/" ); | 434 | s_trashPath->prepend( QDir::homeDirPath() + "/" ); |
438 | *s_trashPath = QDir::cleanDirPath( *s_trashPath ); | 435 | *s_trashPath = QDir::cleanDirPath( *s_trashPath ); |
439 | if ( s_trashPath->right(1) != "/") | 436 | if ( s_trashPath->right(1) != "/") |
440 | *s_trashPath += "/"; | 437 | *s_trashPath += "/"; |
441 | // We need to save it in any case, in case the language changes later on, | 438 | // We need to save it in any case, in case the language changes later on, |
442 | if ( !config->hasKey( "Trash" ) ) | 439 | if ( !config->hasKey( "Trash" ) ) |
443 | { | 440 | { |
444 | //config->writePathEntry( "Trash", *s_trashPath, true, true ); | 441 | //config->writePathEntry( "Trash", *s_trashPath, true, true ); |
445 | config->writeEntry( "Trash", *s_trashPath ); | 442 | config->writeEntry( "Trash", *s_trashPath ); |
446 | //config->sync(); | 443 | //config->sync(); |
447 | } | 444 | } |
448 | 445 | ||
449 | /* // Autostart Path | 446 | /* // Autostart Path |
450 | *s_autostartPath = OGlobal::dirs()->localkdedir() + "Autostart" + "/"; | 447 | *s_autostartPath = OGlobal::dirs()->localkdedir() + "Autostart" + "/"; |
451 | *s_autostartPath = config->readEntry( "Autostart" , *s_autostartPath); | 448 | *s_autostartPath = config->readEntry( "Autostart" , *s_autostartPath); |
452 | if ( (*s_autostartPath)[0] != '/' ) | 449 | if ( (*s_autostartPath)[0] != '/' ) |
453 | s_autostartPath->prepend( QDir::homeDirPath() + "/" ); | 450 | s_autostartPath->prepend( QDir::homeDirPath() + "/" ); |
454 | *s_autostartPath = QDir::cleanDirPath( *s_autostartPath ); | 451 | *s_autostartPath = QDir::cleanDirPath( *s_autostartPath ); |
455 | if ( s_autostartPath->right(1) != "/") | 452 | if ( s_autostartPath->right(1) != "/") |
456 | *s_autostartPath += "/"; | 453 | *s_autostartPath += "/"; |
457 | */ | 454 | */ |
458 | // Document Path | 455 | // Document Path |
459 | *s_documentPath = QString::null; | 456 | *s_documentPath = QString::null; |
460 | *s_documentPath = config->readEntry( "Documents" , *s_documentPath); | 457 | *s_documentPath = config->readEntry( "Documents" , *s_documentPath); |
461 | if ( (*s_documentPath)[0] != '/' ) | 458 | if ( (*s_documentPath)[0] != '/' ) |
462 | s_documentPath->prepend( QDir::homeDirPath() + "/" ); | 459 | s_documentPath->prepend( QDir::homeDirPath() + "/" ); |
463 | *s_documentPath = QDir::cleanDirPath( *s_documentPath ); | 460 | *s_documentPath = QDir::cleanDirPath( *s_documentPath ); |
464 | if ( s_documentPath->right(1) != "/") | 461 | if ( s_documentPath->right(1) != "/") |
465 | *s_documentPath += "/"; | 462 | *s_documentPath += "/"; |
466 | 463 | ||
467 | //config->setDollarExpansion(dollarExpansion); | 464 | //config->setDollarExpansion(dollarExpansion); |
468 | 465 | ||
469 | // Make sure this app gets the notifications about those paths | 466 | // Make sure this app gets the notifications about those paths |
470 | //if (kapp) | 467 | //if (kapp) |
471 | //kapp->addKipcEventMask(KIPC::SettingsChanged); | 468 | //kapp->addKipcEventMask(KIPC::SettingsChanged); |
472 | } | 469 | } |
473 | 470 | ||
474 | void OGlobalSettings::initColors() | 471 | void OGlobalSettings::initColors() |
475 | { | 472 | { |
476 | if ( !OpieHighlight ) OpieHighlight = new QColor( 156, 118, 32 ); | 473 | if ( !OpieHighlight ) OpieHighlight = new QColor( 156, 118, 32 ); |
477 | if ( !OpieAlternate ) OpieAlternate = new QColor( 238, 246, 255 ); | 474 | if ( !OpieAlternate ) OpieAlternate = new QColor( 238, 246, 255 ); |
478 | if ( !OpieGray ) OpieGray = new QColor( 220, 210, 215 ); | 475 | if ( !OpieGray ) OpieGray = new QColor( 220, 210, 215 ); |
479 | } | 476 | } |
480 | 477 | ||
481 | void OGlobalSettings::rereadFontSettings() | 478 | void OGlobalSettings::rereadFontSettings() |
482 | { | 479 | { |
483 | delete _generalFont; | 480 | delete _generalFont; |
484 | _generalFont = 0L; | 481 | _generalFont = 0L; |
485 | delete _fixedFont; | 482 | delete _fixedFont; |
486 | _fixedFont = 0L; | 483 | _fixedFont = 0L; |
487 | delete _menuFont; | 484 | delete _menuFont; |
488 | _menuFont = 0L; | 485 | _menuFont = 0L; |
489 | delete _toolBarFont; | 486 | delete _toolBarFont; |
490 | _toolBarFont = 0L; | 487 | _toolBarFont = 0L; |
491 | delete _windowTitleFont; | 488 | delete _windowTitleFont; |
492 | _windowTitleFont = 0L; | 489 | _windowTitleFont = 0L; |
493 | delete _taskbarFont; | 490 | delete _taskbarFont; |
494 | _taskbarFont = 0L; | 491 | _taskbarFont = 0L; |
495 | } | 492 | } |
496 | 493 | ||
497 | void OGlobalSettings::rereadPathSettings() | 494 | void OGlobalSettings::rereadPathSettings() |
498 | { | 495 | { |
499 | qDebug( "OGlobalSettings::rereadPathSettings" ); | 496 | qDebug( "OGlobalSettings::rereadPathSettings" ); |
500 | delete s_autostartPath; | 497 | delete s_autostartPath; |
501 | s_autostartPath = 0L; | 498 | s_autostartPath = 0L; |
502 | delete s_trashPath; | 499 | delete s_trashPath; |
503 | s_trashPath = 0L; | 500 | s_trashPath = 0L; |
504 | delete s_desktopPath; | 501 | delete s_desktopPath; |
505 | s_desktopPath = 0L; | 502 | s_desktopPath = 0L; |
506 | delete s_documentPath; | 503 | delete s_documentPath; |
507 | s_documentPath = 0L; | 504 | s_documentPath = 0L; |
508 | } | 505 | } |
509 | 506 | ||
510 | OGlobalSettings::OMouseSettings & OGlobalSettings::mouseSettings() | 507 | OGlobalSettings::OMouseSettings & OGlobalSettings::mouseSettings() |
511 | { | 508 | { |
512 | if ( ! s_mouseSettings ) | 509 | if ( ! s_mouseSettings ) |
513 | { | 510 | { |
514 | s_mouseSettings = new OMouseSettings; | 511 | s_mouseSettings = new OMouseSettings; |
515 | OMouseSettings & s = *s_mouseSettings; // for convenience | 512 | OMouseSettings & s = *s_mouseSettings; // for convenience |
516 | 513 | ||
517 | OConfigGroupSaver cgs( OGlobal::config(), "Mouse" ); | 514 | OConfigGroupSaver cgs( OGlobal::config(), "Mouse" ); |
518 | QString setting = OGlobal::config()->readEntry("MouseButtonMapping"); | 515 | QString setting = OGlobal::config()->readEntry("MouseButtonMapping"); |
519 | if (setting == "RightHanded") | 516 | if (setting == "RightHanded") |
520 | s.handed = OMouseSettings::RightHanded; | 517 | s.handed = OMouseSettings::RightHanded; |
521 | else if (setting == "LeftHanded") | 518 | else if (setting == "LeftHanded") |
522 | s.handed = OMouseSettings::LeftHanded; | 519 | s.handed = OMouseSettings::LeftHanded; |
523 | else | 520 | else |
524 | { | 521 | { |
525 | 522 | ||
526 | // FIXME: Implement for Opie / Qt Embedded | 523 | // FIXME: Implement for Opie / Qt Embedded |
527 | 524 | ||
528 | } | 525 | } |
529 | } | 526 | } |
530 | return *s_mouseSettings; | 527 | return *s_mouseSettings; |
531 | } | 528 | } |
532 | 529 | ||
533 | void OGlobalSettings::rereadMouseSettings() | 530 | void OGlobalSettings::rereadMouseSettings() |
534 | { | 531 | { |
535 | delete s_mouseSettings; | 532 | delete s_mouseSettings; |
536 | s_mouseSettings = 0L; | 533 | s_mouseSettings = 0L; |
537 | } | 534 | } |
538 | 535 | ||
539 | // FIXME: This won't be necessary, or will it? :-D | 536 | // FIXME: This won't be necessary, or will it? :-D |
540 | 537 | ||
541 | bool OGlobalSettings::isMultiHead() | 538 | bool OGlobalSettings::isMultiHead() |
542 | { | 539 | { |
543 | QCString multiHead = getenv("OPIE_MULTIHEAD"); | 540 | QCString multiHead = getenv("OPIE_MULTIHEAD"); |
544 | if (!multiHead.isEmpty()) { | 541 | if (!multiHead.isEmpty()) { |
545 | return (multiHead.lower() == "true"); | 542 | return (multiHead.lower() == "true"); |
546 | } | 543 | } |
547 | return false; | 544 | return false; |
548 | } | 545 | } |
diff --git a/libopie2/opiecore/oprocctrl.cpp b/libopie2/opiecore/oprocctrl.cpp index b3d57c8..0403526 100644 --- a/libopie2/opiecore/oprocctrl.cpp +++ b/libopie2/opiecore/oprocctrl.cpp | |||
@@ -1,284 +1,283 @@ | |||
1 | /* This file is part of the KDE libraries | 1 | /* This file is part of the KDE libraries |
2 | Copyright (C) 1997 Christian Czezakte (e9025461@student.tuwien.ac.at) | 2 | Copyright (C) 1997 Christian Czezakte (e9025461@student.tuwien.ac.at) |
3 | 3 | ||
4 | This library is free software; you can redistribute it and/or | 4 | This library is free software; you can redistribute it and/or |
5 | modify it under the terms of the GNU Library General Public | 5 | modify it under the terms of the GNU Library General Public |
6 | License as published by the Free Software Foundation; either | 6 | License as published by the Free Software Foundation; either |
7 | version 2 of the License, or (at your option) any later version. | 7 | version 2 of the License, or (at your option) any later version. |
8 | 8 | ||
9 | This library is distributed in the hope that it will be useful, | 9 | This library is distributed in the hope that it will be useful, |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
12 | Library General Public License for more details. | 12 | Library General Public License for more details. |
13 | 13 | ||
14 | You should have received a copy of the GNU Library General Public License | 14 | You should have received a copy of the GNU Library General Public License |
15 | along with this library; see the file COPYING.LIB. If not, write to | 15 | along with this library; see the file COPYING.LIB. If not, write to |
16 | the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | 16 | the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
17 | Boston, MA 02111-1307, USA. | 17 | Boston, MA 02111-1307, USA. |
18 | */ | 18 | */ |
19 | // | 19 | // |
20 | // KPROCESSCONTROLLER -- A helper class for KProcess | 20 | // KPROCESSCONTROLLER -- A helper class for KProcess |
21 | // | 21 | // |
22 | // version 0.3.1, Jan, 8th 1997 | 22 | // version 0.3.1, Jan, 8th 1997 |
23 | // | 23 | // |
24 | // (C) Christian Czezatke | 24 | // (C) Christian Czezatke |
25 | // e9025461@student.tuwien.ac.at | 25 | // e9025461@student.tuwien.ac.at |
26 | // Ported by Holger Freyther | 26 | // Ported by Holger Freyther |
27 | // | 27 | // |
28 | 28 | ||
29 | //#include <config.h> | 29 | //#include <config.h> |
30 | 30 | ||
31 | #include <sys/types.h> | 31 | #include <sys/types.h> |
32 | #include <sys/socket.h> | 32 | #include <sys/socket.h> |
33 | 33 | ||
34 | #include <errno.h> | 34 | #include <errno.h> |
35 | #include <fcntl.h> | 35 | #include <fcntl.h> |
36 | #include <stdio.h> | 36 | #include <stdio.h> |
37 | #include <string.h> | 37 | #include <string.h> |
38 | #include <unistd.h> | 38 | #include <unistd.h> |
39 | #include <assert.h> | 39 | #include <assert.h> |
40 | 40 | ||
41 | #include <qsocketnotifier.h> | 41 | #include <qsocketnotifier.h> |
42 | #include "oprocess.h" | ||
43 | #include "oprocctrl.h" | 42 | #include "oprocctrl.h" |
44 | 43 | ||
45 | OProcessController *OProcessController::theOProcessController = 0; | 44 | OProcessController *OProcessController::theOProcessController = 0; |
46 | 45 | ||
47 | struct sigaction OProcessController::oldChildHandlerData; | 46 | struct sigaction OProcessController::oldChildHandlerData; |
48 | bool OProcessController::handlerSet = false; | 47 | bool OProcessController::handlerSet = false; |
49 | 48 | ||
50 | OProcessController::OProcessController() | 49 | OProcessController::OProcessController() |
51 | { | 50 | { |
52 | assert( theOProcessController == 0 ); | 51 | assert( theOProcessController == 0 ); |
53 | 52 | ||
54 | if (0 > pipe(fd)) | 53 | if (0 > pipe(fd)) |
55 | printf(strerror(errno)); | 54 | printf(strerror(errno)); |
56 | 55 | ||
57 | notifier = new QSocketNotifier(fd[0], QSocketNotifier::Read); | 56 | notifier = new QSocketNotifier(fd[0], QSocketNotifier::Read); |
58 | notifier->setEnabled(true); | 57 | notifier->setEnabled(true); |
59 | QObject::connect(notifier, SIGNAL(activated(int)), | 58 | QObject::connect(notifier, SIGNAL(activated(int)), |
60 | this, SLOT(slotDoHousekeeping(int))); | 59 | this, SLOT(slotDoHousekeeping(int))); |
61 | connect( &delayedChildrenCleanupTimer, SIGNAL( timeout()), | 60 | connect( &delayedChildrenCleanupTimer, SIGNAL( timeout()), |
62 | SLOT( delayedChildrenCleanup())); | 61 | SLOT( delayedChildrenCleanup())); |
63 | 62 | ||
64 | theOProcessController = this; | 63 | theOProcessController = this; |
65 | 64 | ||
66 | setupHandlers(); | 65 | setupHandlers(); |
67 | } | 66 | } |
68 | 67 | ||
69 | 68 | ||
70 | void OProcessController::setupHandlers() | 69 | void OProcessController::setupHandlers() |
71 | { | 70 | { |
72 | if( handlerSet ) | 71 | if( handlerSet ) |
73 | return; | 72 | return; |
74 | struct sigaction act; | 73 | struct sigaction act; |
75 | act.sa_handler=theSigCHLDHandler; | 74 | act.sa_handler=theSigCHLDHandler; |
76 | sigemptyset(&(act.sa_mask)); | 75 | sigemptyset(&(act.sa_mask)); |
77 | sigaddset(&(act.sa_mask), SIGCHLD); | 76 | sigaddset(&(act.sa_mask), SIGCHLD); |
78 | // Make sure we don't block this signal. gdb tends to do that :-( | 77 | // Make sure we don't block this signal. gdb tends to do that :-( |
79 | sigprocmask(SIG_UNBLOCK, &(act.sa_mask), 0); | 78 | sigprocmask(SIG_UNBLOCK, &(act.sa_mask), 0); |
80 | 79 | ||
81 | act.sa_flags = SA_NOCLDSTOP; | 80 | act.sa_flags = SA_NOCLDSTOP; |
82 | 81 | ||
83 | // CC: take care of SunOS which automatically restarts interrupted system | 82 | // CC: take care of SunOS which automatically restarts interrupted system |
84 | // calls (and thus does not have SA_RESTART) | 83 | // calls (and thus does not have SA_RESTART) |
85 | 84 | ||
86 | #ifdef SA_RESTART | 85 | #ifdef SA_RESTART |
87 | act.sa_flags |= SA_RESTART; | 86 | act.sa_flags |= SA_RESTART; |
88 | #endif | 87 | #endif |
89 | 88 | ||
90 | sigaction( SIGCHLD, &act, &oldChildHandlerData ); | 89 | sigaction( SIGCHLD, &act, &oldChildHandlerData ); |
91 | 90 | ||
92 | act.sa_handler=SIG_IGN; | 91 | act.sa_handler=SIG_IGN; |
93 | sigemptyset(&(act.sa_mask)); | 92 | sigemptyset(&(act.sa_mask)); |
94 | sigaddset(&(act.sa_mask), SIGPIPE); | 93 | sigaddset(&(act.sa_mask), SIGPIPE); |
95 | act.sa_flags = 0; | 94 | act.sa_flags = 0; |
96 | sigaction( SIGPIPE, &act, 0L); | 95 | sigaction( SIGPIPE, &act, 0L); |
97 | handlerSet = true; | 96 | handlerSet = true; |
98 | } | 97 | } |
99 | 98 | ||
100 | void OProcessController::resetHandlers() | 99 | void OProcessController::resetHandlers() |
101 | { | 100 | { |
102 | if( !handlerSet ) | 101 | if( !handlerSet ) |
103 | return; | 102 | return; |
104 | sigaction( SIGCHLD, &oldChildHandlerData, 0 ); | 103 | sigaction( SIGCHLD, &oldChildHandlerData, 0 ); |
105 | // there should be no problem with SIGPIPE staying SIG_IGN | 104 | // there should be no problem with SIGPIPE staying SIG_IGN |
106 | handlerSet = false; | 105 | handlerSet = false; |
107 | } | 106 | } |
108 | 107 | ||
109 | // block SIGCHLD handler, because it accesses processList | 108 | // block SIGCHLD handler, because it accesses processList |
110 | void OProcessController::addOProcess( OProcess* p ) | 109 | void OProcessController::addOProcess( OProcess* p ) |
111 | { | 110 | { |
112 | sigset_t newset, oldset; | 111 | sigset_t newset, oldset; |
113 | sigemptyset( &newset ); | 112 | sigemptyset( &newset ); |
114 | sigaddset( &newset, SIGCHLD ); | 113 | sigaddset( &newset, SIGCHLD ); |
115 | sigprocmask( SIG_BLOCK, &newset, &oldset ); | 114 | sigprocmask( SIG_BLOCK, &newset, &oldset ); |
116 | processList.append( p ); | 115 | processList.append( p ); |
117 | sigprocmask( SIG_SETMASK, &oldset, 0 ); | 116 | sigprocmask( SIG_SETMASK, &oldset, 0 ); |
118 | } | 117 | } |
119 | 118 | ||
120 | void OProcessController::removeOProcess( OProcess* p ) | 119 | void OProcessController::removeOProcess( OProcess* p ) |
121 | { | 120 | { |
122 | sigset_t newset, oldset; | 121 | sigset_t newset, oldset; |
123 | sigemptyset( &newset ); | 122 | sigemptyset( &newset ); |
124 | sigaddset( &newset, SIGCHLD ); | 123 | sigaddset( &newset, SIGCHLD ); |
125 | sigprocmask( SIG_BLOCK, &newset, &oldset ); | 124 | sigprocmask( SIG_BLOCK, &newset, &oldset ); |
126 | processList.remove( p ); | 125 | processList.remove( p ); |
127 | sigprocmask( SIG_SETMASK, &oldset, 0 ); | 126 | sigprocmask( SIG_SETMASK, &oldset, 0 ); |
128 | } | 127 | } |
129 | 128 | ||
130 | //using a struct which contains both the pid and the status makes it easier to write | 129 | //using a struct which contains both the pid and the status makes it easier to write |
131 | //and read the data into the pipe | 130 | //and read the data into the pipe |
132 | //especially this solves a problem which appeared on my box where slotDoHouseKeeping() received | 131 | //especially this solves a problem which appeared on my box where slotDoHouseKeeping() received |
133 | //only 4 bytes (with some debug output around the write()'s it received all 8 bytes) | 132 | //only 4 bytes (with some debug output around the write()'s it received all 8 bytes) |
134 | //don't know why this happened, but when writing all 8 bytes at once it works here, aleXXX | 133 | //don't know why this happened, but when writing all 8 bytes at once it works here, aleXXX |
135 | struct waitdata | 134 | struct waitdata |
136 | { | 135 | { |
137 | pid_t pid; | 136 | pid_t pid; |
138 | int status; | 137 | int status; |
139 | }; | 138 | }; |
140 | 139 | ||
141 | void OProcessController::theSigCHLDHandler(int arg) | 140 | void OProcessController::theSigCHLDHandler(int arg) |
142 | { | 141 | { |
143 | struct waitdata wd; | 142 | struct waitdata wd; |
144 | // int status; | 143 | // int status; |
145 | // pid_t this_pid; | 144 | // pid_t this_pid; |
146 | int saved_errno; | 145 | int saved_errno; |
147 | 146 | ||
148 | saved_errno = errno; | 147 | saved_errno = errno; |
149 | // since waitpid and write change errno, we have to save it and restore it | 148 | // since waitpid and write change errno, we have to save it and restore it |
150 | // (Richard Stevens, Advanced programming in the Unix Environment) | 149 | // (Richard Stevens, Advanced programming in the Unix Environment) |
151 | 150 | ||
152 | bool found = false; | 151 | bool found = false; |
153 | if( theOProcessController != 0 ) | 152 | if( theOProcessController != 0 ) |
154 | { | 153 | { |
155 | // iterating the list doesn't perform any system call | 154 | // iterating the list doesn't perform any system call |
156 | for( QValueList<OProcess*>::ConstIterator it = theOProcessController->processList.begin(); | 155 | for( QValueList<OProcess*>::ConstIterator it = theOProcessController->processList.begin(); |
157 | it != theOProcessController->processList.end(); | 156 | it != theOProcessController->processList.end(); |
158 | ++it ) | 157 | ++it ) |
159 | { | 158 | { |
160 | if( !(*it)->isRunning()) | 159 | if( !(*it)->isRunning()) |
161 | continue; | 160 | continue; |
162 | wd.pid = waitpid( (*it)->pid(), &wd.status, WNOHANG ); | 161 | wd.pid = waitpid( (*it)->pid(), &wd.status, WNOHANG ); |
163 | if ( wd.pid > 0 ) | 162 | if ( wd.pid > 0 ) |
164 | { | 163 | { |
165 | ::write(theOProcessController->fd[1], &wd, sizeof(wd)); | 164 | ::write(theOProcessController->fd[1], &wd, sizeof(wd)); |
166 | found = true; | 165 | found = true; |
167 | } | 166 | } |
168 | } | 167 | } |
169 | } | 168 | } |
170 | if( !found && oldChildHandlerData.sa_handler != SIG_IGN | 169 | if( !found && oldChildHandlerData.sa_handler != SIG_IGN |
171 | && oldChildHandlerData.sa_handler != SIG_DFL ) | 170 | && oldChildHandlerData.sa_handler != SIG_DFL ) |
172 | oldChildHandlerData.sa_handler( arg ); // call the old handler | 171 | oldChildHandlerData.sa_handler( arg ); // call the old handler |
173 | // handle the rest | 172 | // handle the rest |
174 | if( theOProcessController != 0 ) | 173 | if( theOProcessController != 0 ) |
175 | { | 174 | { |
176 | static const struct waitdata dwd = { 0, 0 } | 175 | static const struct waitdata dwd = { 0, 0 } |
177 | ; // delayed waitpid() | 176 | ; // delayed waitpid() |
178 | ::write(theOProcessController->fd[1], &dwd, sizeof(dwd)); | 177 | ::write(theOProcessController->fd[1], &dwd, sizeof(dwd)); |
179 | } | 178 | } |
180 | else | 179 | else |
181 | { | 180 | { |
182 | int dummy; | 181 | int dummy; |
183 | while( waitpid( -1, &dummy, WNOHANG ) > 0 ) | 182 | while( waitpid( -1, &dummy, WNOHANG ) > 0 ) |
184 | ; | 183 | ; |
185 | } | 184 | } |
186 | 185 | ||
187 | errno = saved_errno; | 186 | errno = saved_errno; |
188 | } | 187 | } |
189 | 188 | ||
190 | 189 | ||
191 | 190 | ||
192 | void OProcessController::slotDoHousekeeping(int ) | 191 | void OProcessController::slotDoHousekeeping(int ) |
193 | { | 192 | { |
194 | unsigned int bytes_read = 0; | 193 | unsigned int bytes_read = 0; |
195 | unsigned int errcnt=0; | 194 | unsigned int errcnt=0; |
196 | // read pid and status from the pipe. | 195 | // read pid and status from the pipe. |
197 | struct waitdata wd; | 196 | struct waitdata wd; |
198 | while ((bytes_read < sizeof(wd)) && (errcnt < 50)) | 197 | while ((bytes_read < sizeof(wd)) && (errcnt < 50)) |
199 | { | 198 | { |
200 | int r = ::read(fd[0], ((char *)&wd) + bytes_read, sizeof(wd) - bytes_read); | 199 | int r = ::read(fd[0], ((char *)&wd) + bytes_read, sizeof(wd) - bytes_read); |
201 | if (r > 0) bytes_read += r; | 200 | if (r > 0) bytes_read += r; |
202 | else if (r < 0) errcnt++; | 201 | else if (r < 0) errcnt++; |
203 | } | 202 | } |
204 | if (errcnt >= 50) | 203 | if (errcnt >= 50) |
205 | { | 204 | { |
206 | fprintf(stderr, | 205 | fprintf(stderr, |
207 | "Error: Max. error count for pipe read " | 206 | "Error: Max. error count for pipe read " |
208 | "exceeded in OProcessController::slotDoHousekeeping\n"); | 207 | "exceeded in OProcessController::slotDoHousekeeping\n"); |
209 | return; // it makes no sense to continue here! | 208 | return; // it makes no sense to continue here! |
210 | } | 209 | } |
211 | if (bytes_read != sizeof(wd)) | 210 | if (bytes_read != sizeof(wd)) |
212 | { | 211 | { |
213 | fprintf(stderr, | 212 | fprintf(stderr, |
214 | "Error: Could not read info from signal handler %d <> %d!\n", | 213 | "Error: Could not read info from signal handler %d <> %d!\n", |
215 | bytes_read, sizeof(wd)); | 214 | bytes_read, sizeof(wd)); |
216 | return; // it makes no sense to continue here! | 215 | return; // it makes no sense to continue here! |
217 | } | 216 | } |
218 | if (wd.pid==0) | 217 | if (wd.pid==0) |
219 | { // special case, see delayedChildrenCleanup() | 218 | { // special case, see delayedChildrenCleanup() |
220 | delayedChildrenCleanupTimer.start( 1000, true ); | 219 | delayedChildrenCleanupTimer.start( 1000, true ); |
221 | return; | 220 | return; |
222 | } | 221 | } |
223 | 222 | ||
224 | for( QValueList<OProcess*>::ConstIterator it = processList.begin(); | 223 | for( QValueList<OProcess*>::ConstIterator it = processList.begin(); |
225 | it != processList.end(); | 224 | it != processList.end(); |
226 | ++it ) | 225 | ++it ) |
227 | { | 226 | { |
228 | OProcess* proc = *it; | 227 | OProcess* proc = *it; |
229 | if (proc->pid() == wd.pid) | 228 | if (proc->pid() == wd.pid) |
230 | { | 229 | { |
231 | // process has exited, so do emit the respective events | 230 | // process has exited, so do emit the respective events |
232 | if (proc->run_mode == OProcess::Block) | 231 | if (proc->run_mode == OProcess::Block) |
233 | { | 232 | { |
234 | // If the reads are done blocking then set the status in proc | 233 | // If the reads are done blocking then set the status in proc |
235 | // but do nothing else because OProcess will perform the other | 234 | // but do nothing else because OProcess will perform the other |
236 | // actions of processHasExited. | 235 | // actions of processHasExited. |
237 | proc->status = wd.status; | 236 | proc->status = wd.status; |
238 | proc->runs = false; | 237 | proc->runs = false; |
239 | } | 238 | } |
240 | else | 239 | else |
241 | { | 240 | { |
242 | proc->processHasExited(wd.status); | 241 | proc->processHasExited(wd.status); |
243 | } | 242 | } |
244 | return; | 243 | return; |
245 | } | 244 | } |
246 | } | 245 | } |
247 | } | 246 | } |
248 | 247 | ||
249 | // this is needed e.g. for popen(), which calls waitpid() checking | 248 | // this is needed e.g. for popen(), which calls waitpid() checking |
250 | // for its forked child, if we did waitpid() directly in the SIGCHLD | 249 | // for its forked child, if we did waitpid() directly in the SIGCHLD |
251 | // handler, popen()'s waitpid() call would fail | 250 | // handler, popen()'s waitpid() call would fail |
252 | void OProcessController::delayedChildrenCleanup() | 251 | void OProcessController::delayedChildrenCleanup() |
253 | { | 252 | { |
254 | struct waitdata wd; | 253 | struct waitdata wd; |
255 | while(( wd.pid = waitpid( -1, &wd.status, WNOHANG ) ) > 0 ) | 254 | while(( wd.pid = waitpid( -1, &wd.status, WNOHANG ) ) > 0 ) |
256 | { | 255 | { |
257 | for( QValueList<OProcess*>::ConstIterator it = processList.begin(); | 256 | for( QValueList<OProcess*>::ConstIterator it = processList.begin(); |
258 | it != processList.end(); | 257 | it != processList.end(); |
259 | ++it ) | 258 | ++it ) |
260 | { | 259 | { |
261 | if( !(*it)->isRunning() || (*it)->pid() != wd.pid ) | 260 | if( !(*it)->isRunning() || (*it)->pid() != wd.pid ) |
262 | continue; | 261 | continue; |
263 | // it's OProcess, handle it | 262 | // it's OProcess, handle it |
264 | ::write(fd[1], &wd, sizeof(wd)); | 263 | ::write(fd[1], &wd, sizeof(wd)); |
265 | break; | 264 | break; |
266 | } | 265 | } |
267 | } | 266 | } |
268 | } | 267 | } |
269 | 268 | ||
270 | OProcessController::~OProcessController() | 269 | OProcessController::~OProcessController() |
271 | { | 270 | { |
272 | assert( theOProcessController == this ); | 271 | assert( theOProcessController == this ); |
273 | resetHandlers(); | 272 | resetHandlers(); |
274 | 273 | ||
275 | notifier->setEnabled(false); | 274 | notifier->setEnabled(false); |
276 | 275 | ||
277 | close(fd[0]); | 276 | close(fd[0]); |
278 | close(fd[1]); | 277 | close(fd[1]); |
279 | 278 | ||
280 | delete notifier; | 279 | delete notifier; |
281 | theOProcessController = 0; | 280 | theOProcessController = 0; |
282 | } | 281 | } |
283 | 282 | ||
284 | //#include "kprocctrl.moc" | 283 | //#include "kprocctrl.moc" |
diff --git a/libopie2/opiecore/oprocess.cpp b/libopie2/opiecore/oprocess.cpp index 83677aa..0a361a1 100644 --- a/libopie2/opiecore/oprocess.cpp +++ b/libopie2/opiecore/oprocess.cpp | |||
@@ -1,945 +1,943 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) 2002-2004 Holger Freyther <zecke@handhelds.org> | 3 | Copyright (C) 2002-2004 Holger Freyther <zecke@handhelds.org> |
4 | and The Opie Team <opie-devel@handhelds.org> | 4 | and The Opie Team <opie-devel@handhelds.org> |
5 | =. Based on KProcess (C) 1997 Christian Czezatke (e9025461@student.tuwien.ac.at) | 5 | =. Based on KProcess (C) 1997 Christian Czezatke (e9025461@student.tuwien.ac.at) |
6 | .=l. | 6 | .=l. |
7 | .>+-= | 7 | .>+-= |
8 | _;:, .> :=|. This program is free software; you can | 8 | _;:, .> :=|. This program is free software; you can |
9 | .> <`_, > . <= redistribute it and/or modify it under | 9 | .> <`_, > . <= redistribute it and/or modify it under |
10 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 10 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
11 | .="- .-=="i, .._ License as published by the Free Software | 11 | .="- .-=="i, .._ License as published by the Free Software |
12 | - . .-<_> .<> Foundation; either version 2 of the License, | 12 | - . .-<_> .<> Foundation; either version 2 of the License, |
13 | ._= =} : or (at your option) any later version. | 13 | ._= =} : or (at your option) any later version. |
14 | .%`+i> _;_. | 14 | .%`+i> _;_. |
15 | .i_,=:_. -<s. This program is distributed in the hope that | 15 | .i_,=:_. -<s. This program is distributed in the hope that |
16 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 16 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
17 | : .. .:, . . . without even the implied warranty of | 17 | : .. .:, . . . without even the implied warranty of |
18 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 18 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
19 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 19 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
20 | ..}^=.= = ; Library General Public License for more | 20 | ..}^=.= = ; Library General Public License for more |
21 | ++= -. .` .: details. | 21 | ++= -. .` .: details. |
22 | : = ...= . :.=- | 22 | : = ...= . :.=- |
23 | -. .:....=;==+<; You should have received a copy of the GNU | 23 | -. .:....=;==+<; You should have received a copy of the GNU |
24 | -_. . . )=. = Library General Public License along with | 24 | -_. . . )=. = Library General Public License along with |
25 | -- :-=` this library; see the file COPYING.LIB. | 25 | -- :-=` this library; see the file COPYING.LIB. |
26 | If not, write to the Free Software Foundation, | 26 | If not, write to the Free Software Foundation, |
27 | Inc., 59 Temple Place - Suite 330, | 27 | Inc., 59 Temple Place - Suite 330, |
28 | Boston, MA 02111-1307, USA. | 28 | Boston, MA 02111-1307, USA. |
29 | */ | 29 | */ |
30 | 30 | ||
31 | #include "oprocctrl.h" | 31 | #include "oprocctrl.h" |
32 | 32 | ||
33 | /* OPIE */ | 33 | /* OPIE */ |
34 | #include <opie2/oprocess.h> | 34 | #include <opie2/oprocess.h> |
35 | 35 | ||
36 | /* QT */ | 36 | /* QT */ |
37 | 37 | ||
38 | #include <qapplication.h> | 38 | #include <qapplication.h> |
39 | #include <qdir.h> | 39 | #include <qdir.h> |
40 | #include <qfile.h> | ||
41 | #include <qmap.h> | 40 | #include <qmap.h> |
42 | #include <qregexp.h> | ||
43 | #include <qsocketnotifier.h> | 41 | #include <qsocketnotifier.h> |
44 | #include <qtextstream.h> | 42 | #include <qtextstream.h> |
45 | 43 | ||
46 | /* STD */ | 44 | /* STD */ |
47 | #include <errno.h> | 45 | #include <errno.h> |
48 | #include <fcntl.h> | 46 | #include <fcntl.h> |
49 | #include <pwd.h> | 47 | #include <pwd.h> |
50 | #include <stdlib.h> | 48 | #include <stdlib.h> |
51 | #include <signal.h> | 49 | #include <signal.h> |
52 | #include <stdio.h> | 50 | #include <stdio.h> |
53 | #include <string.h> | 51 | #include <string.h> |
54 | #include <sys/time.h> | 52 | #include <sys/time.h> |
55 | #include <sys/types.h> | 53 | #include <sys/types.h> |
56 | #include <sys/stat.h> | 54 | #include <sys/stat.h> |
57 | #include <sys/socket.h> | 55 | #include <sys/socket.h> |
58 | #include <unistd.h> | 56 | #include <unistd.h> |
59 | #ifdef HAVE_SYS_SELECT_H | 57 | #ifdef HAVE_SYS_SELECT_H |
60 | #include <sys/select.h> | 58 | #include <sys/select.h> |
61 | #endif | 59 | #endif |
62 | #ifdef HAVE_INITGROUPS | 60 | #ifdef HAVE_INITGROUPS |
63 | #include <grp.h> | 61 | #include <grp.h> |
64 | #endif | 62 | #endif |
65 | 63 | ||
66 | class OProcessPrivate | 64 | class OProcessPrivate |
67 | { | 65 | { |
68 | public: | 66 | public: |
69 | OProcessPrivate() : useShell( false ) | 67 | OProcessPrivate() : useShell( false ) |
70 | { } | 68 | { } |
71 | 69 | ||
72 | bool useShell; | 70 | bool useShell; |
73 | QMap<QString, QString> env; | 71 | QMap<QString, QString> env; |
74 | QString wd; | 72 | QString wd; |
75 | QCString shell; | 73 | QCString shell; |
76 | }; | 74 | }; |
77 | 75 | ||
78 | 76 | ||
79 | OProcess::OProcess( QObject *parent, const char *name ) | 77 | OProcess::OProcess( QObject *parent, const char *name ) |
80 | : QObject( parent, name ) | 78 | : QObject( parent, name ) |
81 | { | 79 | { |
82 | init ( ); | 80 | init ( ); |
83 | } | 81 | } |
84 | 82 | ||
85 | OProcess::OProcess( const QString &arg0, QObject *parent, const char *name ) | 83 | OProcess::OProcess( const QString &arg0, QObject *parent, const char *name ) |
86 | : QObject( parent, name ) | 84 | : QObject( parent, name ) |
87 | { | 85 | { |
88 | init ( ); | 86 | init ( ); |
89 | *this << arg0; | 87 | *this << arg0; |
90 | } | 88 | } |
91 | 89 | ||
92 | OProcess::OProcess( const QStringList &args, QObject *parent, const char *name ) | 90 | OProcess::OProcess( const QStringList &args, QObject *parent, const char *name ) |
93 | : QObject( parent, name ) | 91 | : QObject( parent, name ) |
94 | { | 92 | { |
95 | init ( ); | 93 | init ( ); |
96 | *this << args; | 94 | *this << args; |
97 | } | 95 | } |
98 | 96 | ||
99 | void OProcess::init ( ) | 97 | void OProcess::init ( ) |
100 | { | 98 | { |
101 | run_mode = NotifyOnExit; | 99 | run_mode = NotifyOnExit; |
102 | runs = false; | 100 | runs = false; |
103 | pid_ = 0; | 101 | pid_ = 0; |
104 | status = 0; | 102 | status = 0; |
105 | keepPrivs = false; | 103 | keepPrivs = false; |
106 | innot = 0; | 104 | innot = 0; |
107 | outnot = 0; | 105 | outnot = 0; |
108 | errnot = 0; | 106 | errnot = 0; |
109 | communication = NoCommunication; | 107 | communication = NoCommunication; |
110 | input_data = 0; | 108 | input_data = 0; |
111 | input_sent = 0; | 109 | input_sent = 0; |
112 | input_total = 0; | 110 | input_total = 0; |
113 | d = 0; | 111 | d = 0; |
114 | 112 | ||
115 | if ( 0 == OProcessController::theOProcessController ) | 113 | if ( 0 == OProcessController::theOProcessController ) |
116 | { | 114 | { |
117 | ( void ) new OProcessController(); | 115 | ( void ) new OProcessController(); |
118 | CHECK_PTR( OProcessController::theOProcessController ); | 116 | CHECK_PTR( OProcessController::theOProcessController ); |
119 | } | 117 | } |
120 | 118 | ||
121 | OProcessController::theOProcessController->addOProcess( this ); | 119 | OProcessController::theOProcessController->addOProcess( this ); |
122 | out[ 0 ] = out[ 1 ] = -1; | 120 | out[ 0 ] = out[ 1 ] = -1; |
123 | in[ 0 ] = in[ 1 ] = -1; | 121 | in[ 0 ] = in[ 1 ] = -1; |
124 | err[ 0 ] = err[ 1 ] = -1; | 122 | err[ 0 ] = err[ 1 ] = -1; |
125 | } | 123 | } |
126 | 124 | ||
127 | void OProcess::setEnvironment( const QString &name, const QString &value ) | 125 | void OProcess::setEnvironment( const QString &name, const QString &value ) |
128 | { | 126 | { |
129 | if ( !d ) | 127 | if ( !d ) |
130 | d = new OProcessPrivate; | 128 | d = new OProcessPrivate; |
131 | d->env.insert( name, value ); | 129 | d->env.insert( name, value ); |
132 | } | 130 | } |
133 | 131 | ||
134 | void OProcess::setWorkingDirectory( const QString &dir ) | 132 | void OProcess::setWorkingDirectory( const QString &dir ) |
135 | { | 133 | { |
136 | if ( !d ) | 134 | if ( !d ) |
137 | d = new OProcessPrivate; | 135 | d = new OProcessPrivate; |
138 | d->wd = dir; | 136 | d->wd = dir; |
139 | } | 137 | } |
140 | 138 | ||
141 | void OProcess::setupEnvironment() | 139 | void OProcess::setupEnvironment() |
142 | { | 140 | { |
143 | if ( d ) | 141 | if ( d ) |
144 | { | 142 | { |
145 | QMap<QString, QString>::Iterator it; | 143 | QMap<QString, QString>::Iterator it; |
146 | for ( it = d->env.begin(); it != d->env.end(); ++it ) | 144 | for ( it = d->env.begin(); it != d->env.end(); ++it ) |
147 | setenv( QFile::encodeName( it.key() ).data(), | 145 | setenv( QFile::encodeName( it.key() ).data(), |
148 | QFile::encodeName( it.data() ).data(), 1 ); | 146 | QFile::encodeName( it.data() ).data(), 1 ); |
149 | if ( !d->wd.isEmpty() ) | 147 | if ( !d->wd.isEmpty() ) |
150 | chdir( QFile::encodeName( d->wd ).data() ); | 148 | chdir( QFile::encodeName( d->wd ).data() ); |
151 | } | 149 | } |
152 | } | 150 | } |
153 | 151 | ||
154 | void OProcess::setRunPrivileged( bool keepPrivileges ) | 152 | void OProcess::setRunPrivileged( bool keepPrivileges ) |
155 | { | 153 | { |
156 | keepPrivs = keepPrivileges; | 154 | keepPrivs = keepPrivileges; |
157 | } | 155 | } |
158 | 156 | ||
159 | bool OProcess::runPrivileged() const | 157 | bool OProcess::runPrivileged() const |
160 | { | 158 | { |
161 | return keepPrivs; | 159 | return keepPrivs; |
162 | } | 160 | } |
163 | 161 | ||
164 | OProcess::~OProcess() | 162 | OProcess::~OProcess() |
165 | { | 163 | { |
166 | // destroying the OProcess instance sends a SIGKILL to the | 164 | // destroying the OProcess instance sends a SIGKILL to the |
167 | // child process (if it is running) after removing it from the | 165 | // child process (if it is running) after removing it from the |
168 | // list of valid processes (if the process is not started as | 166 | // list of valid processes (if the process is not started as |
169 | // "DontCare") | 167 | // "DontCare") |
170 | 168 | ||
171 | OProcessController::theOProcessController->removeOProcess( this ); | 169 | OProcessController::theOProcessController->removeOProcess( this ); |
172 | // this must happen before we kill the child | 170 | // this must happen before we kill the child |
173 | // TODO: block the signal while removing the current process from the process list | 171 | // TODO: block the signal while removing the current process from the process list |
174 | 172 | ||
175 | if ( runs && ( run_mode != DontCare ) ) | 173 | if ( runs && ( run_mode != DontCare ) ) |
176 | kill( SIGKILL ); | 174 | kill( SIGKILL ); |
177 | 175 | ||
178 | // Clean up open fd's and socket notifiers. | 176 | // Clean up open fd's and socket notifiers. |
179 | closeStdin(); | 177 | closeStdin(); |
180 | closeStdout(); | 178 | closeStdout(); |
181 | closeStderr(); | 179 | closeStderr(); |
182 | 180 | ||
183 | // TODO: restore SIGCHLD and SIGPIPE handler if this is the last OProcess | 181 | // TODO: restore SIGCHLD and SIGPIPE handler if this is the last OProcess |
184 | delete d; | 182 | delete d; |
185 | } | 183 | } |
186 | 184 | ||
187 | void OProcess::detach() | 185 | void OProcess::detach() |
188 | { | 186 | { |
189 | OProcessController::theOProcessController->removeOProcess( this ); | 187 | OProcessController::theOProcessController->removeOProcess( this ); |
190 | 188 | ||
191 | runs = false; | 189 | runs = false; |
192 | pid_ = 0; | 190 | pid_ = 0; |
193 | 191 | ||
194 | // Clean up open fd's and socket notifiers. | 192 | // Clean up open fd's and socket notifiers. |
195 | closeStdin(); | 193 | closeStdin(); |
196 | closeStdout(); | 194 | closeStdout(); |
197 | closeStderr(); | 195 | closeStderr(); |
198 | } | 196 | } |
199 | 197 | ||
200 | bool OProcess::setExecutable( const QString& proc ) | 198 | bool OProcess::setExecutable( const QString& proc ) |
201 | { | 199 | { |
202 | if ( runs ) | 200 | if ( runs ) |
203 | return false; | 201 | return false; |
204 | 202 | ||
205 | if ( proc.isEmpty() ) | 203 | if ( proc.isEmpty() ) |
206 | return false; | 204 | return false; |
207 | 205 | ||
208 | if ( !arguments.isEmpty() ) | 206 | if ( !arguments.isEmpty() ) |
209 | arguments.remove( arguments.begin() ); | 207 | arguments.remove( arguments.begin() ); |
210 | arguments.prepend( QFile::encodeName( proc ) ); | 208 | arguments.prepend( QFile::encodeName( proc ) ); |
211 | 209 | ||
212 | return true; | 210 | return true; |
213 | } | 211 | } |
214 | 212 | ||
215 | OProcess &OProcess::operator<<( const QStringList& args ) | 213 | OProcess &OProcess::operator<<( const QStringList& args ) |
216 | { | 214 | { |
217 | QStringList::ConstIterator it = args.begin(); | 215 | QStringList::ConstIterator it = args.begin(); |
218 | for ( ; it != args.end() ; ++it ) | 216 | for ( ; it != args.end() ; ++it ) |
219 | arguments.append( QFile::encodeName( *it ) ); | 217 | arguments.append( QFile::encodeName( *it ) ); |
220 | return *this; | 218 | return *this; |
221 | } | 219 | } |
222 | 220 | ||
223 | OProcess &OProcess::operator<<( const QCString& arg ) | 221 | OProcess &OProcess::operator<<( const QCString& arg ) |
224 | { | 222 | { |
225 | return operator<< ( arg.data() ); | 223 | return operator<< ( arg.data() ); |
226 | } | 224 | } |
227 | 225 | ||
228 | OProcess &OProcess::operator<<( const char* arg ) | 226 | OProcess &OProcess::operator<<( const char* arg ) |
229 | { | 227 | { |
230 | arguments.append( arg ); | 228 | arguments.append( arg ); |
231 | return *this; | 229 | return *this; |
232 | } | 230 | } |
233 | 231 | ||
234 | OProcess &OProcess::operator<<( const QString& arg ) | 232 | OProcess &OProcess::operator<<( const QString& arg ) |
235 | { | 233 | { |
236 | arguments.append( QFile::encodeName( arg ) ); | 234 | arguments.append( QFile::encodeName( arg ) ); |
237 | return *this; | 235 | return *this; |
238 | } | 236 | } |
239 | 237 | ||
240 | void OProcess::clearArguments() | 238 | void OProcess::clearArguments() |
241 | { | 239 | { |
242 | arguments.clear(); | 240 | arguments.clear(); |
243 | } | 241 | } |
244 | 242 | ||
245 | bool OProcess::start( RunMode runmode, Communication comm ) | 243 | bool OProcess::start( RunMode runmode, Communication comm ) |
246 | { | 244 | { |
247 | uint i; | 245 | uint i; |
248 | uint n = arguments.count(); | 246 | uint n = arguments.count(); |
249 | char **arglist; | 247 | char **arglist; |
250 | 248 | ||
251 | if ( runs || ( 0 == n ) ) | 249 | if ( runs || ( 0 == n ) ) |
252 | { | 250 | { |
253 | return false; // cannot start a process that is already running | 251 | return false; // cannot start a process that is already running |
254 | // or if no executable has been assigned | 252 | // or if no executable has been assigned |
255 | } | 253 | } |
256 | run_mode = runmode; | 254 | run_mode = runmode; |
257 | status = 0; | 255 | status = 0; |
258 | 256 | ||
259 | QCString shellCmd; | 257 | QCString shellCmd; |
260 | if ( d && d->useShell ) | 258 | if ( d && d->useShell ) |
261 | { | 259 | { |
262 | if ( d->shell.isEmpty() ) | 260 | if ( d->shell.isEmpty() ) |
263 | { | 261 | { |
264 | qWarning( "Could not find a valid shell" ); | 262 | qWarning( "Could not find a valid shell" ); |
265 | return false; | 263 | return false; |
266 | } | 264 | } |
267 | 265 | ||
268 | arglist = static_cast<char **>( malloc( ( 4 ) * sizeof( char * ) ) ); | 266 | arglist = static_cast<char **>( malloc( ( 4 ) * sizeof( char * ) ) ); |
269 | for ( i = 0; i < n; i++ ) | 267 | for ( i = 0; i < n; i++ ) |
270 | { | 268 | { |
271 | shellCmd += arguments[ i ]; | 269 | shellCmd += arguments[ i ]; |
272 | shellCmd += " "; // CC: to separate the arguments | 270 | shellCmd += " "; // CC: to separate the arguments |
273 | } | 271 | } |
274 | 272 | ||
275 | arglist[ 0 ] = d->shell.data(); | 273 | arglist[ 0 ] = d->shell.data(); |
276 | arglist[ 1 ] = ( char * ) "-c"; | 274 | arglist[ 1 ] = ( char * ) "-c"; |
277 | arglist[ 2 ] = shellCmd.data(); | 275 | arglist[ 2 ] = shellCmd.data(); |
278 | arglist[ 3 ] = 0; | 276 | arglist[ 3 ] = 0; |
279 | } | 277 | } |
280 | else | 278 | else |
281 | { | 279 | { |
282 | arglist = static_cast<char **>( malloc( ( n + 1 ) * sizeof( char * ) ) ); | 280 | arglist = static_cast<char **>( malloc( ( n + 1 ) * sizeof( char * ) ) ); |
283 | for ( i = 0; i < n; i++ ) | 281 | for ( i = 0; i < n; i++ ) |
284 | arglist[ i ] = arguments[ i ].data(); | 282 | arglist[ i ] = arguments[ i ].data(); |
285 | arglist[ n ] = 0; | 283 | arglist[ n ] = 0; |
286 | } | 284 | } |
287 | 285 | ||
288 | if ( !setupCommunication( comm ) ) | 286 | if ( !setupCommunication( comm ) ) |
289 | qWarning( "Could not setup Communication!" ); | 287 | qWarning( "Could not setup Communication!" ); |
290 | 288 | ||
291 | // We do this in the parent because if we do it in the child process | 289 | // We do this in the parent because if we do it in the child process |
292 | // gdb gets confused when the application runs from gdb. | 290 | // gdb gets confused when the application runs from gdb. |
293 | uid_t uid = getuid(); | 291 | uid_t uid = getuid(); |
294 | gid_t gid = getgid(); | 292 | gid_t gid = getgid(); |
295 | #ifdef HAVE_INITGROUPS | 293 | #ifdef HAVE_INITGROUPS |
296 | 294 | ||
297 | struct passwd *pw = getpwuid( uid ); | 295 | struct passwd *pw = getpwuid( uid ); |
298 | #endif | 296 | #endif |
299 | 297 | ||
300 | int fd[ 2 ]; | 298 | int fd[ 2 ]; |
301 | if ( 0 > pipe( fd ) ) | 299 | if ( 0 > pipe( fd ) ) |
302 | { | 300 | { |
303 | fd[ 0 ] = fd[ 1 ] = 0; // Pipe failed.. continue | 301 | fd[ 0 ] = fd[ 1 ] = 0; // Pipe failed.. continue |
304 | } | 302 | } |
305 | 303 | ||
306 | runs = true; | 304 | runs = true; |
307 | 305 | ||
308 | QApplication::flushX(); | 306 | QApplication::flushX(); |
309 | 307 | ||
310 | // WABA: Note that we use fork() and not vfork() because | 308 | // WABA: Note that we use fork() and not vfork() because |
311 | // vfork() has unclear semantics and is not standardized. | 309 | // vfork() has unclear semantics and is not standardized. |
312 | pid_ = fork(); | 310 | pid_ = fork(); |
313 | 311 | ||
314 | if ( 0 == pid_ ) | 312 | if ( 0 == pid_ ) |
315 | { | 313 | { |
316 | if ( fd[ 0 ] ) | 314 | if ( fd[ 0 ] ) |
317 | close( fd[ 0 ] ); | 315 | close( fd[ 0 ] ); |
318 | if ( !runPrivileged() ) | 316 | if ( !runPrivileged() ) |
319 | { | 317 | { |
320 | setgid( gid ); | 318 | setgid( gid ); |
321 | #if defined( HAVE_INITGROUPS) | 319 | #if defined( HAVE_INITGROUPS) |
322 | 320 | ||
323 | if ( pw ) | 321 | if ( pw ) |
324 | initgroups( pw->pw_name, pw->pw_gid ); | 322 | initgroups( pw->pw_name, pw->pw_gid ); |
325 | #endif | 323 | #endif |
326 | 324 | ||
327 | setuid( uid ); | 325 | setuid( uid ); |
328 | } | 326 | } |
329 | // The child process | 327 | // The child process |
330 | if ( !commSetupDoneC() ) | 328 | if ( !commSetupDoneC() ) |
331 | qWarning( "Could not finish comm setup in child!" ); | 329 | qWarning( "Could not finish comm setup in child!" ); |
332 | 330 | ||
333 | setupEnvironment(); | 331 | setupEnvironment(); |
334 | 332 | ||
335 | // Matthias | 333 | // Matthias |
336 | if ( run_mode == DontCare ) | 334 | if ( run_mode == DontCare ) |
337 | setpgid( 0, 0 ); | 335 | setpgid( 0, 0 ); |
338 | // restore default SIGPIPE handler (Harri) | 336 | // restore default SIGPIPE handler (Harri) |
339 | struct sigaction act; | 337 | struct sigaction act; |
340 | sigemptyset( &( act.sa_mask ) ); | 338 | sigemptyset( &( act.sa_mask ) ); |
341 | sigaddset( &( act.sa_mask ), SIGPIPE ); | 339 | sigaddset( &( act.sa_mask ), SIGPIPE ); |
342 | act.sa_handler = SIG_DFL; | 340 | act.sa_handler = SIG_DFL; |
343 | act.sa_flags = 0; | 341 | act.sa_flags = 0; |
344 | sigaction( SIGPIPE, &act, 0L ); | 342 | sigaction( SIGPIPE, &act, 0L ); |
345 | 343 | ||
346 | // We set the close on exec flag. | 344 | // We set the close on exec flag. |
347 | // Closing of fd[1] indicates that the execvp succeeded! | 345 | // Closing of fd[1] indicates that the execvp succeeded! |
348 | if ( fd[ 1 ] ) | 346 | if ( fd[ 1 ] ) |
349 | fcntl( fd[ 1 ], F_SETFD, FD_CLOEXEC ); | 347 | fcntl( fd[ 1 ], F_SETFD, FD_CLOEXEC ); |
350 | execvp( arglist[ 0 ], arglist ); | 348 | execvp( arglist[ 0 ], arglist ); |
351 | char resultByte = 1; | 349 | char resultByte = 1; |
352 | if ( fd[ 1 ] ) | 350 | if ( fd[ 1 ] ) |
353 | write( fd[ 1 ], &resultByte, 1 ); | 351 | write( fd[ 1 ], &resultByte, 1 ); |
354 | _exit( -1 ); | 352 | _exit( -1 ); |
355 | } | 353 | } |
356 | else if ( -1 == pid_ ) | 354 | else if ( -1 == pid_ ) |
357 | { | 355 | { |
358 | // forking failed | 356 | // forking failed |
359 | 357 | ||
360 | runs = false; | 358 | runs = false; |
361 | free( arglist ); | 359 | free( arglist ); |
362 | return false; | 360 | return false; |
363 | } | 361 | } |
364 | else | 362 | else |
365 | { | 363 | { |
366 | if ( fd[ 1 ] ) | 364 | if ( fd[ 1 ] ) |
367 | close( fd[ 1 ] ); | 365 | close( fd[ 1 ] ); |
368 | // the parent continues here | 366 | // the parent continues here |
369 | 367 | ||
370 | // Discard any data for stdin that might still be there | 368 | // Discard any data for stdin that might still be there |
371 | input_data = 0; | 369 | input_data = 0; |
372 | 370 | ||
373 | // Check whether client could be started. | 371 | // Check whether client could be started. |
374 | if ( fd[ 0 ] ) | 372 | if ( fd[ 0 ] ) |
375 | for ( ;; ) | 373 | for ( ;; ) |
376 | { | 374 | { |
377 | char resultByte; | 375 | char resultByte; |
378 | int n = ::read( fd[ 0 ], &resultByte, 1 ); | 376 | int n = ::read( fd[ 0 ], &resultByte, 1 ); |
379 | if ( n == 1 ) | 377 | if ( n == 1 ) |
380 | { | 378 | { |
381 | // Error | 379 | // Error |
382 | runs = false; | 380 | runs = false; |
383 | close( fd[ 0 ] ); | 381 | close( fd[ 0 ] ); |
384 | free( arglist ); | 382 | free( arglist ); |
385 | pid_ = 0; | 383 | pid_ = 0; |
386 | return false; | 384 | return false; |
387 | } | 385 | } |
388 | if ( n == -1 ) | 386 | if ( n == -1 ) |
389 | { | 387 | { |
390 | if ( ( errno == ECHILD ) || ( errno == EINTR ) ) | 388 | if ( ( errno == ECHILD ) || ( errno == EINTR ) ) |
391 | continue; // Ignore | 389 | continue; // Ignore |
392 | } | 390 | } |
393 | break; // success | 391 | break; // success |
394 | } | 392 | } |
395 | if ( fd[ 0 ] ) | 393 | if ( fd[ 0 ] ) |
396 | close( fd[ 0 ] ); | 394 | close( fd[ 0 ] ); |
397 | 395 | ||
398 | if ( !commSetupDoneP() ) // finish communication socket setup for the parent | 396 | if ( !commSetupDoneP() ) // finish communication socket setup for the parent |
399 | qWarning( "Could not finish comm setup in parent!" ); | 397 | qWarning( "Could not finish comm setup in parent!" ); |
400 | 398 | ||
401 | if ( run_mode == Block ) | 399 | if ( run_mode == Block ) |
402 | { | 400 | { |
403 | commClose(); | 401 | commClose(); |
404 | 402 | ||
405 | // The SIGCHLD handler of the process controller will catch | 403 | // The SIGCHLD handler of the process controller will catch |
406 | // the exit and set the status | 404 | // the exit and set the status |
407 | while ( runs ) | 405 | while ( runs ) |
408 | { | 406 | { |
409 | OProcessController::theOProcessController-> | 407 | OProcessController::theOProcessController-> |
410 | slotDoHousekeeping( 0 ); | 408 | slotDoHousekeeping( 0 ); |
411 | } | 409 | } |
412 | runs = FALSE; | 410 | runs = FALSE; |
413 | emit processExited( this ); | 411 | emit processExited( this ); |
414 | } | 412 | } |
415 | } | 413 | } |
416 | free( arglist ); | 414 | free( arglist ); |
417 | return true; | 415 | return true; |
418 | } | 416 | } |
419 | 417 | ||
420 | 418 | ||
421 | 419 | ||
422 | bool OProcess::kill( int signo ) | 420 | bool OProcess::kill( int signo ) |
423 | { | 421 | { |
424 | bool rv = false; | 422 | bool rv = false; |
425 | 423 | ||
426 | if ( 0 != pid_ ) | 424 | if ( 0 != pid_ ) |
427 | rv = ( -1 != ::kill( pid_, signo ) ); | 425 | rv = ( -1 != ::kill( pid_, signo ) ); |
428 | // probably store errno somewhere... | 426 | // probably store errno somewhere... |
429 | return rv; | 427 | return rv; |
430 | } | 428 | } |
431 | 429 | ||
432 | bool OProcess::isRunning() const | 430 | bool OProcess::isRunning() const |
433 | { | 431 | { |
434 | return runs; | 432 | return runs; |
435 | } | 433 | } |
436 | 434 | ||
437 | pid_t OProcess::pid() const | 435 | pid_t OProcess::pid() const |
438 | { | 436 | { |
439 | return pid_; | 437 | return pid_; |
440 | } | 438 | } |
441 | 439 | ||
442 | bool OProcess::normalExit() const | 440 | bool OProcess::normalExit() const |
443 | { | 441 | { |
444 | int _status = status; | 442 | int _status = status; |
445 | return ( pid_ != 0 ) && ( !runs ) && ( WIFEXITED( ( _status ) ) ); | 443 | return ( pid_ != 0 ) && ( !runs ) && ( WIFEXITED( ( _status ) ) ); |
446 | } | 444 | } |
447 | 445 | ||
448 | int OProcess::exitStatus() const | 446 | int OProcess::exitStatus() const |
449 | { | 447 | { |
450 | int _status = status; | 448 | int _status = status; |
451 | return WEXITSTATUS( ( _status ) ); | 449 | return WEXITSTATUS( ( _status ) ); |
452 | } | 450 | } |
453 | 451 | ||
454 | bool OProcess::writeStdin( const char *buffer, int buflen ) | 452 | bool OProcess::writeStdin( const char *buffer, int buflen ) |
455 | { | 453 | { |
456 | bool rv; | 454 | bool rv; |
457 | 455 | ||
458 | // if there is still data pending, writing new data | 456 | // if there is still data pending, writing new data |
459 | // to stdout is not allowed (since it could also confuse | 457 | // to stdout is not allowed (since it could also confuse |
460 | // kprocess... | 458 | // kprocess... |
461 | if ( 0 != input_data ) | 459 | if ( 0 != input_data ) |
462 | return false; | 460 | return false; |
463 | 461 | ||
464 | if ( runs && ( communication & Stdin ) ) | 462 | if ( runs && ( communication & Stdin ) ) |
465 | { | 463 | { |
466 | input_data = buffer; | 464 | input_data = buffer; |
467 | input_sent = 0; | 465 | input_sent = 0; |
468 | input_total = buflen; | 466 | input_total = buflen; |
469 | slotSendData( 0 ); | 467 | slotSendData( 0 ); |
470 | innot->setEnabled( true ); | 468 | innot->setEnabled( true ); |
471 | rv = true; | 469 | rv = true; |
472 | } | 470 | } |
473 | else | 471 | else |
474 | rv = false; | 472 | rv = false; |
475 | return rv; | 473 | return rv; |
476 | } | 474 | } |
477 | 475 | ||
478 | void OProcess::flushStdin ( ) | 476 | void OProcess::flushStdin ( ) |
479 | { | 477 | { |
480 | if ( !input_data || ( input_sent == input_total ) ) | 478 | if ( !input_data || ( input_sent == input_total ) ) |
481 | return ; | 479 | return ; |
482 | 480 | ||
483 | int d1, d2; | 481 | int d1, d2; |
484 | 482 | ||
485 | do | 483 | do |
486 | { | 484 | { |
487 | d1 = input_total - input_sent; | 485 | d1 = input_total - input_sent; |
488 | slotSendData ( 0 ); | 486 | slotSendData ( 0 ); |
489 | d2 = input_total - input_sent; | 487 | d2 = input_total - input_sent; |
490 | } | 488 | } |
491 | while ( d2 <= d1 ); | 489 | while ( d2 <= d1 ); |
492 | } | 490 | } |
493 | 491 | ||
494 | void OProcess::suspend() | 492 | void OProcess::suspend() |
495 | { | 493 | { |
496 | if ( ( communication & Stdout ) && outnot ) | 494 | if ( ( communication & Stdout ) && outnot ) |
497 | outnot->setEnabled( false ); | 495 | outnot->setEnabled( false ); |
498 | } | 496 | } |
499 | 497 | ||
500 | void OProcess::resume() | 498 | void OProcess::resume() |
501 | { | 499 | { |
502 | if ( ( communication & Stdout ) && outnot ) | 500 | if ( ( communication & Stdout ) && outnot ) |
503 | outnot->setEnabled( true ); | 501 | outnot->setEnabled( true ); |
504 | } | 502 | } |
505 | 503 | ||
506 | bool OProcess::closeStdin() | 504 | bool OProcess::closeStdin() |
507 | { | 505 | { |
508 | bool rv; | 506 | bool rv; |
509 | 507 | ||
510 | if ( communication & Stdin ) | 508 | if ( communication & Stdin ) |
511 | { | 509 | { |
512 | communication = ( Communication ) ( communication & ~Stdin ); | 510 | communication = ( Communication ) ( communication & ~Stdin ); |
513 | delete innot; | 511 | delete innot; |
514 | innot = 0; | 512 | innot = 0; |
515 | close( in[ 1 ] ); | 513 | close( in[ 1 ] ); |
516 | rv = true; | 514 | rv = true; |
517 | } | 515 | } |
518 | else | 516 | else |
519 | rv = false; | 517 | rv = false; |
520 | return rv; | 518 | return rv; |
521 | } | 519 | } |
522 | 520 | ||
523 | bool OProcess::closeStdout() | 521 | bool OProcess::closeStdout() |
524 | { | 522 | { |
525 | bool rv; | 523 | bool rv; |
526 | 524 | ||
527 | if ( communication & Stdout ) | 525 | if ( communication & Stdout ) |
528 | { | 526 | { |
529 | communication = ( Communication ) ( communication & ~Stdout ); | 527 | communication = ( Communication ) ( communication & ~Stdout ); |
530 | delete outnot; | 528 | delete outnot; |
531 | outnot = 0; | 529 | outnot = 0; |
532 | close( out[ 0 ] ); | 530 | close( out[ 0 ] ); |
533 | rv = true; | 531 | rv = true; |
534 | } | 532 | } |
535 | else | 533 | else |
536 | rv = false; | 534 | rv = false; |
537 | return rv; | 535 | return rv; |
538 | } | 536 | } |
539 | 537 | ||
540 | bool OProcess::closeStderr() | 538 | bool OProcess::closeStderr() |
541 | { | 539 | { |
542 | bool rv; | 540 | bool rv; |
543 | 541 | ||
544 | if ( communication & Stderr ) | 542 | if ( communication & Stderr ) |
545 | { | 543 | { |
546 | communication = static_cast<Communication>( communication & ~Stderr ); | 544 | communication = static_cast<Communication>( communication & ~Stderr ); |
547 | delete errnot; | 545 | delete errnot; |
548 | errnot = 0; | 546 | errnot = 0; |
549 | close( err[ 0 ] ); | 547 | close( err[ 0 ] ); |
550 | rv = true; | 548 | rv = true; |
551 | } | 549 | } |
552 | else | 550 | else |
553 | rv = false; | 551 | rv = false; |
554 | return rv; | 552 | return rv; |
555 | } | 553 | } |
556 | 554 | ||
557 | void OProcess::slotChildOutput( int fdno ) | 555 | void OProcess::slotChildOutput( int fdno ) |
558 | { | 556 | { |
559 | if ( !childOutput( fdno ) ) | 557 | if ( !childOutput( fdno ) ) |
560 | closeStdout(); | 558 | closeStdout(); |
561 | } | 559 | } |
562 | 560 | ||
563 | void OProcess::slotChildError( int fdno ) | 561 | void OProcess::slotChildError( int fdno ) |
564 | { | 562 | { |
565 | if ( !childError( fdno ) ) | 563 | if ( !childError( fdno ) ) |
566 | closeStderr(); | 564 | closeStderr(); |
567 | } | 565 | } |
568 | 566 | ||
569 | void OProcess::slotSendData( int ) | 567 | void OProcess::slotSendData( int ) |
570 | { | 568 | { |
571 | if ( input_sent == input_total ) | 569 | if ( input_sent == input_total ) |
572 | { | 570 | { |
573 | innot->setEnabled( false ); | 571 | innot->setEnabled( false ); |
574 | input_data = 0; | 572 | input_data = 0; |
575 | emit wroteStdin( this ); | 573 | emit wroteStdin( this ); |
576 | } | 574 | } |
577 | else | 575 | else |
578 | input_sent += ::write( in[ 1 ], input_data + input_sent, input_total - input_sent ); | 576 | input_sent += ::write( in[ 1 ], input_data + input_sent, input_total - input_sent ); |
579 | } | 577 | } |
580 | 578 | ||
581 | void OProcess::processHasExited( int state ) | 579 | void OProcess::processHasExited( int state ) |
582 | { | 580 | { |
583 | if ( runs ) | 581 | if ( runs ) |
584 | { | 582 | { |
585 | runs = false; | 583 | runs = false; |
586 | status = state; | 584 | status = state; |
587 | 585 | ||
588 | commClose(); // cleanup communication sockets | 586 | commClose(); // cleanup communication sockets |
589 | 587 | ||
590 | // also emit a signal if the process was run Blocking | 588 | // also emit a signal if the process was run Blocking |
591 | if ( DontCare != run_mode ) | 589 | if ( DontCare != run_mode ) |
592 | { | 590 | { |
593 | emit processExited( this ); | 591 | emit processExited( this ); |
594 | } | 592 | } |
595 | } | 593 | } |
596 | } | 594 | } |
597 | 595 | ||
598 | int OProcess::childOutput( int fdno ) | 596 | int OProcess::childOutput( int fdno ) |
599 | { | 597 | { |
600 | if ( communication & NoRead ) | 598 | if ( communication & NoRead ) |
601 | { | 599 | { |
602 | int len = -1; | 600 | int len = -1; |
603 | emit receivedStdout( fdno, len ); | 601 | emit receivedStdout( fdno, len ); |
604 | errno = 0; // Make sure errno doesn't read "EAGAIN" | 602 | errno = 0; // Make sure errno doesn't read "EAGAIN" |
605 | return len; | 603 | return len; |
606 | } | 604 | } |
607 | else | 605 | else |
608 | { | 606 | { |
609 | char buffer[ 1024 ]; | 607 | char buffer[ 1024 ]; |
610 | int len; | 608 | int len; |
611 | 609 | ||
612 | len = ::read( fdno, buffer, 1024 ); | 610 | len = ::read( fdno, buffer, 1024 ); |
613 | 611 | ||
614 | if ( 0 < len ) | 612 | if ( 0 < len ) |
615 | { | 613 | { |
616 | emit receivedStdout( this, buffer, len ); | 614 | emit receivedStdout( this, buffer, len ); |
617 | } | 615 | } |
618 | return len; | 616 | return len; |
619 | } | 617 | } |
620 | } | 618 | } |
621 | 619 | ||
622 | int OProcess::childError( int fdno ) | 620 | int OProcess::childError( int fdno ) |
623 | { | 621 | { |
624 | char buffer[ 1024 ]; | 622 | char buffer[ 1024 ]; |
625 | int len; | 623 | int len; |
626 | 624 | ||
627 | len = ::read( fdno, buffer, 1024 ); | 625 | len = ::read( fdno, buffer, 1024 ); |
628 | 626 | ||
629 | if ( 0 < len ) | 627 | if ( 0 < len ) |
630 | emit receivedStderr( this, buffer, len ); | 628 | emit receivedStderr( this, buffer, len ); |
631 | return len; | 629 | return len; |
632 | } | 630 | } |
633 | 631 | ||
634 | int OProcess::setupCommunication( Communication comm ) | 632 | int OProcess::setupCommunication( Communication comm ) |
635 | { | 633 | { |
636 | int ok; | 634 | int ok; |
637 | 635 | ||
638 | communication = comm; | 636 | communication = comm; |
639 | 637 | ||
640 | ok = 1; | 638 | ok = 1; |
641 | if ( comm & Stdin ) | 639 | if ( comm & Stdin ) |
642 | ok &= socketpair( AF_UNIX, SOCK_STREAM, 0, in ) >= 0; | 640 | ok &= socketpair( AF_UNIX, SOCK_STREAM, 0, in ) >= 0; |
643 | 641 | ||
644 | if ( comm & Stdout ) | 642 | if ( comm & Stdout ) |
645 | ok &= socketpair( AF_UNIX, SOCK_STREAM, 0, out ) >= 0; | 643 | ok &= socketpair( AF_UNIX, SOCK_STREAM, 0, out ) >= 0; |
646 | 644 | ||
647 | if ( comm & Stderr ) | 645 | if ( comm & Stderr ) |
648 | ok &= socketpair( AF_UNIX, SOCK_STREAM, 0, err ) >= 0; | 646 | ok &= socketpair( AF_UNIX, SOCK_STREAM, 0, err ) >= 0; |
649 | 647 | ||
650 | return ok; | 648 | return ok; |
651 | } | 649 | } |
652 | 650 | ||
653 | int OProcess::commSetupDoneP() | 651 | int OProcess::commSetupDoneP() |
654 | { | 652 | { |
655 | int ok = 1; | 653 | int ok = 1; |
656 | 654 | ||
657 | if ( communication != NoCommunication ) | 655 | if ( communication != NoCommunication ) |
658 | { | 656 | { |
659 | if ( communication & Stdin ) | 657 | if ( communication & Stdin ) |
660 | close( in[ 0 ] ); | 658 | close( in[ 0 ] ); |
661 | if ( communication & Stdout ) | 659 | if ( communication & Stdout ) |
662 | close( out[ 1 ] ); | 660 | close( out[ 1 ] ); |
663 | if ( communication & Stderr ) | 661 | if ( communication & Stderr ) |
664 | close( err[ 1 ] ); | 662 | close( err[ 1 ] ); |
665 | 663 | ||
666 | // Don't create socket notifiers and set the sockets non-blocking if | 664 | // Don't create socket notifiers and set the sockets non-blocking if |
667 | // blocking is requested. | 665 | // blocking is requested. |
668 | if ( run_mode == Block ) | 666 | if ( run_mode == Block ) |
669 | return ok; | 667 | return ok; |
670 | 668 | ||
671 | if ( communication & Stdin ) | 669 | if ( communication & Stdin ) |
672 | { | 670 | { |
673 | // ok &= (-1 != fcntl(in[1], F_SETFL, O_NONBLOCK)); | 671 | // ok &= (-1 != fcntl(in[1], F_SETFL, O_NONBLOCK)); |
674 | innot = new QSocketNotifier( in[ 1 ], QSocketNotifier::Write, this ); | 672 | innot = new QSocketNotifier( in[ 1 ], QSocketNotifier::Write, this ); |
675 | CHECK_PTR( innot ); | 673 | CHECK_PTR( innot ); |
676 | innot->setEnabled( false ); // will be enabled when data has to be sent | 674 | innot->setEnabled( false ); // will be enabled when data has to be sent |
677 | QObject::connect( innot, SIGNAL( activated( int ) ), | 675 | QObject::connect( innot, SIGNAL( activated( int ) ), |
678 | this, SLOT( slotSendData( int ) ) ); | 676 | this, SLOT( slotSendData( int ) ) ); |
679 | } | 677 | } |
680 | 678 | ||
681 | if ( communication & Stdout ) | 679 | if ( communication & Stdout ) |
682 | { | 680 | { |
683 | // ok &= (-1 != fcntl(out[0], F_SETFL, O_NONBLOCK)); | 681 | // ok &= (-1 != fcntl(out[0], F_SETFL, O_NONBLOCK)); |
684 | outnot = new QSocketNotifier( out[ 0 ], QSocketNotifier::Read, this ); | 682 | outnot = new QSocketNotifier( out[ 0 ], QSocketNotifier::Read, this ); |
685 | CHECK_PTR( outnot ); | 683 | CHECK_PTR( outnot ); |
686 | QObject::connect( outnot, SIGNAL( activated( int ) ), | 684 | QObject::connect( outnot, SIGNAL( activated( int ) ), |
687 | this, SLOT( slotChildOutput( int ) ) ); | 685 | this, SLOT( slotChildOutput( int ) ) ); |
688 | if ( communication & NoRead ) | 686 | if ( communication & NoRead ) |
689 | suspend(); | 687 | suspend(); |
690 | } | 688 | } |
691 | 689 | ||
692 | if ( communication & Stderr ) | 690 | if ( communication & Stderr ) |
693 | { | 691 | { |
694 | // ok &= (-1 != fcntl(err[0], F_SETFL, O_NONBLOCK)); | 692 | // ok &= (-1 != fcntl(err[0], F_SETFL, O_NONBLOCK)); |
695 | errnot = new QSocketNotifier( err[ 0 ], QSocketNotifier::Read, this ); | 693 | errnot = new QSocketNotifier( err[ 0 ], QSocketNotifier::Read, this ); |
696 | CHECK_PTR( errnot ); | 694 | CHECK_PTR( errnot ); |
697 | QObject::connect( errnot, SIGNAL( activated( int ) ), | 695 | QObject::connect( errnot, SIGNAL( activated( int ) ), |
698 | this, SLOT( slotChildError( int ) ) ); | 696 | this, SLOT( slotChildError( int ) ) ); |
699 | } | 697 | } |
700 | } | 698 | } |
701 | return ok; | 699 | return ok; |
702 | } | 700 | } |
703 | 701 | ||
704 | int OProcess::commSetupDoneC() | 702 | int OProcess::commSetupDoneC() |
705 | { | 703 | { |
706 | int ok = 1; | 704 | int ok = 1; |
707 | struct linger so; | 705 | struct linger so; |
708 | memset( &so, 0, sizeof( so ) ); | 706 | memset( &so, 0, sizeof( so ) ); |
709 | 707 | ||
710 | if ( communication & Stdin ) | 708 | if ( communication & Stdin ) |
711 | close( in[ 1 ] ); | 709 | close( in[ 1 ] ); |
712 | if ( communication & Stdout ) | 710 | if ( communication & Stdout ) |
713 | close( out[ 0 ] ); | 711 | close( out[ 0 ] ); |
714 | if ( communication & Stderr ) | 712 | if ( communication & Stderr ) |
715 | close( err[ 0 ] ); | 713 | close( err[ 0 ] ); |
716 | 714 | ||
717 | if ( communication & Stdin ) | 715 | if ( communication & Stdin ) |
718 | ok &= dup2( in[ 0 ], STDIN_FILENO ) != -1; | 716 | ok &= dup2( in[ 0 ], STDIN_FILENO ) != -1; |
719 | else | 717 | else |
720 | { | 718 | { |
721 | int null_fd = open( "/dev/null", O_RDONLY ); | 719 | int null_fd = open( "/dev/null", O_RDONLY ); |
722 | ok &= dup2( null_fd, STDIN_FILENO ) != -1; | 720 | ok &= dup2( null_fd, STDIN_FILENO ) != -1; |
723 | close( null_fd ); | 721 | close( null_fd ); |
724 | } | 722 | } |
725 | if ( communication & Stdout ) | 723 | if ( communication & Stdout ) |
726 | { | 724 | { |
727 | ok &= dup2( out[ 1 ], STDOUT_FILENO ) != -1; | 725 | ok &= dup2( out[ 1 ], STDOUT_FILENO ) != -1; |
728 | ok &= !setsockopt( out[ 1 ], SOL_SOCKET, SO_LINGER, ( char* ) & so, sizeof( so ) ); | 726 | ok &= !setsockopt( out[ 1 ], SOL_SOCKET, SO_LINGER, ( char* ) & so, sizeof( so ) ); |
729 | } | 727 | } |
730 | else | 728 | else |
731 | { | 729 | { |
732 | int null_fd = open( "/dev/null", O_WRONLY ); | 730 | int null_fd = open( "/dev/null", O_WRONLY ); |
733 | ok &= dup2( null_fd, STDOUT_FILENO ) != -1; | 731 | ok &= dup2( null_fd, STDOUT_FILENO ) != -1; |
734 | close( null_fd ); | 732 | close( null_fd ); |
735 | } | 733 | } |
736 | if ( communication & Stderr ) | 734 | if ( communication & Stderr ) |
737 | { | 735 | { |
738 | ok &= dup2( err[ 1 ], STDERR_FILENO ) != -1; | 736 | ok &= dup2( err[ 1 ], STDERR_FILENO ) != -1; |
739 | ok &= !setsockopt( err[ 1 ], SOL_SOCKET, SO_LINGER, reinterpret_cast<char *>( &so ), sizeof( so ) ); | 737 | ok &= !setsockopt( err[ 1 ], SOL_SOCKET, SO_LINGER, reinterpret_cast<char *>( &so ), sizeof( so ) ); |
740 | } | 738 | } |
741 | else | 739 | else |
742 | { | 740 | { |
743 | int null_fd = open( "/dev/null", O_WRONLY ); | 741 | int null_fd = open( "/dev/null", O_WRONLY ); |
744 | ok &= dup2( null_fd, STDERR_FILENO ) != -1; | 742 | ok &= dup2( null_fd, STDERR_FILENO ) != -1; |
745 | close( null_fd ); | 743 | close( null_fd ); |
746 | } | 744 | } |
747 | return ok; | 745 | return ok; |
748 | } | 746 | } |
749 | 747 | ||
750 | void OProcess::commClose() | 748 | void OProcess::commClose() |
751 | { | 749 | { |
752 | if ( NoCommunication != communication ) | 750 | if ( NoCommunication != communication ) |
753 | { | 751 | { |
754 | bool b_in = ( communication & Stdin ); | 752 | bool b_in = ( communication & Stdin ); |
755 | bool b_out = ( communication & Stdout ); | 753 | bool b_out = ( communication & Stdout ); |
756 | bool b_err = ( communication & Stderr ); | 754 | bool b_err = ( communication & Stderr ); |
757 | if ( b_in ) | 755 | if ( b_in ) |
758 | delete innot; | 756 | delete innot; |
759 | 757 | ||
760 | if ( b_out || b_err ) | 758 | if ( b_out || b_err ) |
761 | { | 759 | { |
762 | // If both channels are being read we need to make sure that one socket buffer | 760 | // If both channels are being read we need to make sure that one socket buffer |
763 | // doesn't fill up whilst we are waiting for data on the other (causing a deadlock). | 761 | // doesn't fill up whilst we are waiting for data on the other (causing a deadlock). |
764 | // Hence we need to use select. | 762 | // Hence we need to use select. |
765 | 763 | ||
766 | // Once one or other of the channels has reached EOF (or given an error) go back | 764 | // Once one or other of the channels has reached EOF (or given an error) go back |
767 | // to the usual mechanism. | 765 | // to the usual mechanism. |
768 | 766 | ||
769 | int fds_ready = 1; | 767 | int fds_ready = 1; |
770 | fd_set rfds; | 768 | fd_set rfds; |
771 | 769 | ||
772 | int max_fd = 0; | 770 | int max_fd = 0; |
773 | if ( b_out ) | 771 | if ( b_out ) |
774 | { | 772 | { |
775 | fcntl( out[ 0 ], F_SETFL, O_NONBLOCK ); | 773 | fcntl( out[ 0 ], F_SETFL, O_NONBLOCK ); |
776 | if ( out[ 0 ] > max_fd ) | 774 | if ( out[ 0 ] > max_fd ) |
777 | max_fd = out[ 0 ]; | 775 | max_fd = out[ 0 ]; |
778 | delete outnot; | 776 | delete outnot; |
779 | outnot = 0; | 777 | outnot = 0; |
780 | } | 778 | } |
781 | if ( b_err ) | 779 | if ( b_err ) |
782 | { | 780 | { |
783 | fcntl( err[ 0 ], F_SETFL, O_NONBLOCK ); | 781 | fcntl( err[ 0 ], F_SETFL, O_NONBLOCK ); |
784 | if ( err[ 0 ] > max_fd ) | 782 | if ( err[ 0 ] > max_fd ) |
785 | max_fd = err[ 0 ]; | 783 | max_fd = err[ 0 ]; |
786 | delete errnot; | 784 | delete errnot; |
787 | errnot = 0; | 785 | errnot = 0; |
788 | } | 786 | } |
789 | 787 | ||
790 | 788 | ||
791 | while ( b_out || b_err ) | 789 | while ( b_out || b_err ) |
792 | { | 790 | { |
793 | // * If the process is still running we block until we | 791 | // * If the process is still running we block until we |
794 | // receive data. (p_timeout = 0, no timeout) | 792 | // receive data. (p_timeout = 0, no timeout) |
795 | // * If the process has already exited, we only check | 793 | // * If the process has already exited, we only check |
796 | // the available data, we don't wait for more. | 794 | // the available data, we don't wait for more. |
797 | // (p_timeout = &timeout, timeout immediately) | 795 | // (p_timeout = &timeout, timeout immediately) |
798 | struct timeval timeout; | 796 | struct timeval timeout; |
799 | timeout.tv_sec = 0; | 797 | timeout.tv_sec = 0; |
800 | timeout.tv_usec = 0; | 798 | timeout.tv_usec = 0; |
801 | struct timeval *p_timeout = runs ? 0 : &timeout; | 799 | struct timeval *p_timeout = runs ? 0 : &timeout; |
802 | 800 | ||
803 | FD_ZERO( &rfds ); | 801 | FD_ZERO( &rfds ); |
804 | if ( b_out ) | 802 | if ( b_out ) |
805 | FD_SET( out[ 0 ], &rfds ); | 803 | FD_SET( out[ 0 ], &rfds ); |
806 | 804 | ||
807 | if ( b_err ) | 805 | if ( b_err ) |
808 | FD_SET( err[ 0 ], &rfds ); | 806 | FD_SET( err[ 0 ], &rfds ); |
809 | 807 | ||
810 | fds_ready = select( max_fd + 1, &rfds, 0, 0, p_timeout ); | 808 | fds_ready = select( max_fd + 1, &rfds, 0, 0, p_timeout ); |
811 | if ( fds_ready <= 0 ) | 809 | if ( fds_ready <= 0 ) |
812 | break; | 810 | break; |
813 | 811 | ||
814 | if ( b_out && FD_ISSET( out[ 0 ], &rfds ) ) | 812 | if ( b_out && FD_ISSET( out[ 0 ], &rfds ) ) |
815 | { | 813 | { |
816 | int ret = 1; | 814 | int ret = 1; |
817 | while ( ret > 0 ) | 815 | while ( ret > 0 ) |
818 | ret = childOutput( out[ 0 ] ); | 816 | ret = childOutput( out[ 0 ] ); |
819 | if ( ( ret == -1 && errno != EAGAIN ) || ret == 0 ) | 817 | if ( ( ret == -1 && errno != EAGAIN ) || ret == 0 ) |
820 | b_out = false; | 818 | b_out = false; |
821 | } | 819 | } |
822 | 820 | ||
823 | if ( b_err && FD_ISSET( err[ 0 ], &rfds ) ) | 821 | if ( b_err && FD_ISSET( err[ 0 ], &rfds ) ) |
824 | { | 822 | { |
825 | int ret = 1; | 823 | int ret = 1; |
826 | while ( ret > 0 ) | 824 | while ( ret > 0 ) |
827 | ret = childError( err[ 0 ] ); | 825 | ret = childError( err[ 0 ] ); |
828 | if ( ( ret == -1 && errno != EAGAIN ) || ret == 0 ) | 826 | if ( ( ret == -1 && errno != EAGAIN ) || ret == 0 ) |
829 | b_err = false; | 827 | b_err = false; |
830 | } | 828 | } |
831 | } | 829 | } |
832 | } | 830 | } |
833 | 831 | ||
834 | if ( b_in ) | 832 | if ( b_in ) |
835 | { | 833 | { |
836 | communication = ( Communication ) ( communication & ~Stdin ); | 834 | communication = ( Communication ) ( communication & ~Stdin ); |
837 | close( in[ 1 ] ); | 835 | close( in[ 1 ] ); |
838 | } | 836 | } |
839 | if ( b_out ) | 837 | if ( b_out ) |
840 | { | 838 | { |
841 | communication = ( Communication ) ( communication & ~Stdout ); | 839 | communication = ( Communication ) ( communication & ~Stdout ); |
842 | close( out[ 0 ] ); | 840 | close( out[ 0 ] ); |
843 | } | 841 | } |
844 | if ( b_err ) | 842 | if ( b_err ) |
845 | { | 843 | { |
846 | communication = ( Communication ) ( communication & ~Stderr ); | 844 | communication = ( Communication ) ( communication & ~Stderr ); |
847 | close( err[ 0 ] ); | 845 | close( err[ 0 ] ); |
848 | } | 846 | } |
849 | } | 847 | } |
850 | } | 848 | } |
851 | 849 | ||
852 | void OProcess::setUseShell( bool useShell, const char *shell ) | 850 | void OProcess::setUseShell( bool useShell, const char *shell ) |
853 | { | 851 | { |
854 | if ( !d ) | 852 | if ( !d ) |
855 | d = new OProcessPrivate; | 853 | d = new OProcessPrivate; |
856 | d->useShell = useShell; | 854 | d->useShell = useShell; |
857 | d->shell = shell; | 855 | d->shell = shell; |
858 | if ( d->shell.isEmpty() ) | 856 | if ( d->shell.isEmpty() ) |
859 | d->shell = searchShell(); | 857 | d->shell = searchShell(); |
860 | } | 858 | } |
861 | 859 | ||
862 | QString OProcess::quote( const QString &arg ) | 860 | QString OProcess::quote( const QString &arg ) |
863 | { | 861 | { |
864 | QString res = arg; | 862 | QString res = arg; |
865 | res.replace( QRegExp( QString::fromLatin1( "\'" ) ), | 863 | res.replace( QRegExp( QString::fromLatin1( "\'" ) ), |
866 | QString::fromLatin1( "'\"'\"'" ) ); | 864 | QString::fromLatin1( "'\"'\"'" ) ); |
867 | res.prepend( '\'' ); | 865 | res.prepend( '\'' ); |
868 | res.append( '\'' ); | 866 | res.append( '\'' ); |
869 | return res; | 867 | return res; |
870 | } | 868 | } |
871 | 869 | ||
872 | QCString OProcess::searchShell() | 870 | QCString OProcess::searchShell() |
873 | { | 871 | { |
874 | QCString tmpShell = QCString( getenv( "SHELL" ) ).stripWhiteSpace(); | 872 | QCString tmpShell = QCString( getenv( "SHELL" ) ).stripWhiteSpace(); |
875 | if ( !isExecutable( tmpShell ) ) | 873 | if ( !isExecutable( tmpShell ) ) |
876 | { | 874 | { |
877 | tmpShell = "/bin/sh"; | 875 | tmpShell = "/bin/sh"; |
878 | } | 876 | } |
879 | 877 | ||
880 | return tmpShell; | 878 | return tmpShell; |
881 | } | 879 | } |
882 | 880 | ||
883 | bool OProcess::isExecutable( const QCString &filename ) | 881 | bool OProcess::isExecutable( const QCString &filename ) |
884 | { | 882 | { |
885 | struct stat fileinfo; | 883 | struct stat fileinfo; |
886 | 884 | ||
887 | if ( filename.isEmpty() ) | 885 | if ( filename.isEmpty() ) |
888 | return false; | 886 | return false; |
889 | 887 | ||
890 | // CC: we've got a valid filename, now let's see whether we can execute that file | 888 | // CC: we've got a valid filename, now let's see whether we can execute that file |
891 | 889 | ||
892 | if ( -1 == stat( filename.data(), &fileinfo ) ) | 890 | if ( -1 == stat( filename.data(), &fileinfo ) ) |
893 | return false; | 891 | return false; |
894 | // CC: return false if the file does not exist | 892 | // CC: return false if the file does not exist |
895 | 893 | ||
896 | // CC: anyway, we cannot execute directories, block/character devices, fifos or sockets | 894 | // CC: anyway, we cannot execute directories, block/character devices, fifos or sockets |
897 | if ( ( S_ISDIR( fileinfo.st_mode ) ) || | 895 | if ( ( S_ISDIR( fileinfo.st_mode ) ) || |
898 | ( S_ISCHR( fileinfo.st_mode ) ) || | 896 | ( S_ISCHR( fileinfo.st_mode ) ) || |
899 | ( S_ISBLK( fileinfo.st_mode ) ) || | 897 | ( S_ISBLK( fileinfo.st_mode ) ) || |
900 | #ifdef S_ISSOCK | 898 | #ifdef S_ISSOCK |
901 | // CC: SYSVR4 systems don't have that macro | 899 | // CC: SYSVR4 systems don't have that macro |
902 | ( S_ISSOCK( fileinfo.st_mode ) ) || | 900 | ( S_ISSOCK( fileinfo.st_mode ) ) || |
903 | #endif | 901 | #endif |
904 | ( S_ISFIFO( fileinfo.st_mode ) ) || | 902 | ( S_ISFIFO( fileinfo.st_mode ) ) || |
905 | ( S_ISDIR( fileinfo.st_mode ) ) ) | 903 | ( S_ISDIR( fileinfo.st_mode ) ) ) |
906 | { | 904 | { |
907 | return false; | 905 | return false; |
908 | } | 906 | } |
909 | 907 | ||
910 | // CC: now check for permission to execute the file | 908 | // CC: now check for permission to execute the file |
911 | if ( access( filename.data(), X_OK ) != 0 ) | 909 | if ( access( filename.data(), X_OK ) != 0 ) |
912 | return false; | 910 | return false; |
913 | 911 | ||
914 | // CC: we've passed all the tests... | 912 | // CC: we've passed all the tests... |
915 | return true; | 913 | return true; |
916 | } | 914 | } |
917 | 915 | ||
918 | int OProcess::processPID( const QString& process ) | 916 | int OProcess::processPID( const QString& process ) |
919 | { | 917 | { |
920 | QString line; | 918 | QString line; |
921 | QDir d = QDir( "/proc" ); | 919 | QDir d = QDir( "/proc" ); |
922 | QStringList dirs = d.entryList( QDir::Dirs ); | 920 | QStringList dirs = d.entryList( QDir::Dirs ); |
923 | QStringList::Iterator it; | 921 | QStringList::Iterator it; |
924 | for ( it = dirs.begin(); it != dirs.end(); ++it ) | 922 | for ( it = dirs.begin(); it != dirs.end(); ++it ) |
925 | { | 923 | { |
926 | //qDebug( "next entry: %s", (const char*) *it ); | 924 | //qDebug( "next entry: %s", (const char*) *it ); |
927 | QFile file( "/proc/"+*it+"/cmdline" ); | 925 | QFile file( "/proc/"+*it+"/cmdline" ); |
928 | file.open( IO_ReadOnly ); | 926 | file.open( IO_ReadOnly ); |
929 | if ( !file.isOpen() ) continue; | 927 | if ( !file.isOpen() ) continue; |
930 | QTextStream t( &file ); | 928 | QTextStream t( &file ); |
931 | line = t.readLine(); | 929 | line = t.readLine(); |
932 | //qDebug( "cmdline = %s", (const char*) line ); | 930 | //qDebug( "cmdline = %s", (const char*) line ); |
933 | if ( line.contains( process ) ) break; //FIXME: That may find also other process, if the name is not long enough ;) | 931 | if ( line.contains( process ) ) break; //FIXME: That may find also other process, if the name is not long enough ;) |
934 | } | 932 | } |
935 | if ( line.contains( process ) ) | 933 | if ( line.contains( process ) ) |
936 | { | 934 | { |
937 | //qDebug( "found process id #%d", (*it).toInt() ); | 935 | //qDebug( "found process id #%d", (*it).toInt() ); |
938 | return (*it).toInt(); | 936 | return (*it).toInt(); |
939 | } | 937 | } |
940 | else | 938 | else |
941 | { | 939 | { |
942 | //qDebug( "process '%s' not found", (const char*) process ); | 940 | //qDebug( "process '%s' not found", (const char*) process ); |
943 | return 0; | 941 | return 0; |
944 | } | 942 | } |
945 | } | 943 | } |
diff --git a/libopie2/opiedb/osqlbackendmanager.cpp b/libopie2/opiedb/osqlbackendmanager.cpp index 0f261b9..95ed77b 100644 --- a/libopie2/opiedb/osqlbackendmanager.cpp +++ b/libopie2/opiedb/osqlbackendmanager.cpp | |||
@@ -1,99 +1,98 @@ | |||
1 | #include <qdir.h> | 1 | #include <qdir.h> |
2 | #include <qfile.h> | ||
3 | #include <qmap.h> | 2 | #include <qmap.h> |
4 | 3 | ||
5 | #include "osqlbackendmanager.h" | 4 | #include "osqlbackendmanager.h" |
6 | 5 | ||
7 | namespace { | 6 | namespace { |
8 | class Config { | 7 | class Config { |
9 | typedef QMap<QString, QString> List; | 8 | typedef QMap<QString, QString> List; |
10 | public: | 9 | public: |
11 | Config( const QString& fileName ); | 10 | Config( const QString& fileName ); |
12 | /** | 11 | /** |
13 | * Quite simple layout in nature | 12 | * Quite simple layout in nature |
14 | * BeginFile | 13 | * BeginFile |
15 | * Key = Value | 14 | * Key = Value |
16 | */ | 15 | */ |
17 | bool load(); | 16 | bool load(); |
18 | QString value( const QString& key ); | 17 | QString value( const QString& key ); |
19 | private: | 18 | private: |
20 | List m_list; | 19 | List m_list; |
21 | QString m_fileName; | 20 | QString m_fileName; |
22 | }; | 21 | }; |
23 | Config::Config( const QString& fileName ) | 22 | Config::Config( const QString& fileName ) |
24 | : m_fileName( fileName ) { | 23 | : m_fileName( fileName ) { |
25 | } | 24 | } |
26 | 25 | ||
27 | bool Config::load() { | 26 | bool Config::load() { |
28 | if (!QFile::exists( m_fileName ) ) | 27 | if (!QFile::exists( m_fileName ) ) |
29 | return false; | 28 | return false; |
30 | QFile file( m_fileName ); | 29 | QFile file( m_fileName ); |
31 | if (!file.open(IO_ReadOnly ) ) | 30 | if (!file.open(IO_ReadOnly ) ) |
32 | return false; | 31 | return false; |
33 | QStringList list = QStringList::split( '\n', file.readAll() ); | 32 | QStringList list = QStringList::split( '\n', file.readAll() ); |
34 | QStringList::Iterator it; | 33 | QStringList::Iterator it; |
35 | QString line; | 34 | QString line; |
36 | for (it = list.begin(); it != list.end(); ++it ) { | 35 | for (it = list.begin(); it != list.end(); ++it ) { |
37 | line = (*it).stripWhiteSpace(); | 36 | line = (*it).stripWhiteSpace(); |
38 | qWarning("Anonymous::Config:" + line ); | 37 | qWarning("Anonymous::Config:" + line ); |
39 | QStringList test = QStringList::split(' ', line ); | 38 | QStringList test = QStringList::split(' ', line ); |
40 | m_list.insert( test[0], test[2] ); | 39 | m_list.insert( test[0], test[2] ); |
41 | } | 40 | } |
42 | return true; | 41 | return true; |
43 | } | 42 | } |
44 | QString Config::value( const QString& key ) { | 43 | QString Config::value( const QString& key ) { |
45 | return m_list[key]; | 44 | return m_list[key]; |
46 | } | 45 | } |
47 | }; | 46 | }; |
48 | OSQLBackEndManager::OSQLBackEndManager( const QStringList& path ) | 47 | OSQLBackEndManager::OSQLBackEndManager( const QStringList& path ) |
49 | :m_path( path ) | 48 | :m_path( path ) |
50 | { | 49 | { |
51 | } | 50 | } |
52 | OSQLBackEndManager::~OSQLBackEndManager() { | 51 | OSQLBackEndManager::~OSQLBackEndManager() { |
53 | } | 52 | } |
54 | /** | 53 | /** |
55 | * scan dirs | 54 | * scan dirs |
56 | */ | 55 | */ |
57 | OSQLBackEnd::ValueList OSQLBackEndManager::scan() { | 56 | OSQLBackEnd::ValueList OSQLBackEndManager::scan() { |
58 | OSQLBackEnd::ValueList list; | 57 | OSQLBackEnd::ValueList list; |
59 | if (!m_path.isEmpty() ) { | 58 | if (!m_path.isEmpty() ) { |
60 | QStringList::Iterator it; | 59 | QStringList::Iterator it; |
61 | for ( it = m_path.begin(); it != m_path.end(); ++it ) { | 60 | for ( it = m_path.begin(); it != m_path.end(); ++it ) { |
62 | list += scanDir( (*it) ); | 61 | list += scanDir( (*it) ); |
63 | } | 62 | } |
64 | } | 63 | } |
65 | return list; | 64 | return list; |
66 | } | 65 | } |
67 | /** | 66 | /** |
68 | * scan a specified dir for *.osql | 67 | * scan a specified dir for *.osql |
69 | */ | 68 | */ |
70 | OSQLBackEnd::ValueList OSQLBackEndManager::scanDir( const QString& dirName ) { | 69 | OSQLBackEnd::ValueList OSQLBackEndManager::scanDir( const QString& dirName ) { |
71 | OSQLBackEnd::ValueList list; | 70 | OSQLBackEnd::ValueList list; |
72 | QDir dir( dirName ); | 71 | QDir dir( dirName ); |
73 | if (dir.exists() ) { | 72 | if (dir.exists() ) { |
74 | QStringList files = dir.entryList( "*.osql" ); | 73 | QStringList files = dir.entryList( "*.osql" ); |
75 | QStringList::Iterator it; | 74 | QStringList::Iterator it; |
76 | for ( it = files.begin(); it != files.end(); ++it ) { | 75 | for ( it = files.begin(); it != files.end(); ++it ) { |
77 | list.append( file2backend( (*it) ) ); | 76 | list.append( file2backend( (*it) ) ); |
78 | } | 77 | } |
79 | } | 78 | } |
80 | return list; | 79 | return list; |
81 | } | 80 | } |
82 | 81 | ||
83 | /** | 82 | /** |
84 | * read a config file and convert it to a OSQLBackEnd | 83 | * read a config file and convert it to a OSQLBackEnd |
85 | */ | 84 | */ |
86 | OSQLBackEnd OSQLBackEndManager::file2backend( const QString& file ) { | 85 | OSQLBackEnd OSQLBackEndManager::file2backend( const QString& file ) { |
87 | OSQLBackEnd end; | 86 | OSQLBackEnd end; |
88 | qWarning("fileName: " + file ); | 87 | qWarning("fileName: " + file ); |
89 | Config cfg( file ); | 88 | Config cfg( file ); |
90 | if (cfg.load() ) { | 89 | if (cfg.load() ) { |
91 | end.setName( cfg.value( "Name") ); | 90 | end.setName( cfg.value( "Name") ); |
92 | end.setVendor( cfg.value("Vendor") ); | 91 | end.setVendor( cfg.value("Vendor") ); |
93 | end.setLicense( cfg.value("License") ); | 92 | end.setLicense( cfg.value("License") ); |
94 | end.setLibrary( cfg.value("Library").local8Bit() ); | 93 | end.setLibrary( cfg.value("Library").local8Bit() ); |
95 | end.setDefault( cfg.value("Default").toInt() ); | 94 | end.setDefault( cfg.value("Default").toInt() ); |
96 | end.setPreference( cfg.value("Preference").toInt() ); | 95 | end.setPreference( cfg.value("Preference").toInt() ); |
97 | } | 96 | } |
98 | return end; | 97 | return end; |
99 | } | 98 | } |
diff --git a/libopie2/opiedb/osqlitedriver.cpp b/libopie2/opiedb/osqlitedriver.cpp index b857534..6141504 100644 --- a/libopie2/opiedb/osqlitedriver.cpp +++ b/libopie2/opiedb/osqlitedriver.cpp | |||
@@ -1,189 +1,188 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | 3 | ||
4 | =. | 4 | =. |
5 | .=l. | 5 | .=l. |
6 | .>+-= | 6 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 7 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 8 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 11 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 12 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | 28 | ||
29 | */ | 29 | */ |
30 | 30 | ||
31 | #include "osqlresult.h" | ||
32 | #include "osqlquery.h" | 31 | #include "osqlquery.h" |
33 | #include "osqlitedriver.h" | 32 | #include "osqlitedriver.h" |
34 | 33 | ||
35 | #include <opie2/odebug.h> | 34 | #include <opie2/odebug.h> |
36 | 35 | ||
37 | #include <stdlib.h> | 36 | #include <stdlib.h> |
38 | 37 | ||
39 | // fromLocal8Bit() does not work as expected. Thus it | 38 | // fromLocal8Bit() does not work as expected. Thus it |
40 | // is replaced by fromLatin1() (eilers) | 39 | // is replaced by fromLatin1() (eilers) |
41 | #define __BUGGY_LOCAL8BIT_ | 40 | #define __BUGGY_LOCAL8BIT_ |
42 | 41 | ||
43 | 42 | ||
44 | namespace { | 43 | namespace { |
45 | struct Query { | 44 | struct Query { |
46 | OSQLError::ValueList errors; | 45 | OSQLError::ValueList errors; |
47 | OSQLResultItem::ValueList items; | 46 | OSQLResultItem::ValueList items; |
48 | OSQLiteDriver *driver; | 47 | OSQLiteDriver *driver; |
49 | }; | 48 | }; |
50 | } | 49 | } |
51 | 50 | ||
52 | 51 | ||
53 | OSQLiteDriver::OSQLiteDriver( QLibrary *lib ) | 52 | OSQLiteDriver::OSQLiteDriver( QLibrary *lib ) |
54 | : OSQLDriver( lib ) | 53 | : OSQLDriver( lib ) |
55 | { | 54 | { |
56 | m_sqlite = 0l; | 55 | m_sqlite = 0l; |
57 | } | 56 | } |
58 | 57 | ||
59 | 58 | ||
60 | OSQLiteDriver::~OSQLiteDriver() { | 59 | OSQLiteDriver::~OSQLiteDriver() { |
61 | close(); | 60 | close(); |
62 | } | 61 | } |
63 | 62 | ||
64 | 63 | ||
65 | QString OSQLiteDriver::id()const { | 64 | QString OSQLiteDriver::id()const { |
66 | return QString::fromLatin1("SQLite"); | 65 | return QString::fromLatin1("SQLite"); |
67 | } | 66 | } |
68 | 67 | ||
69 | void OSQLiteDriver::setUserName( const QString& ) {} | 68 | void OSQLiteDriver::setUserName( const QString& ) {} |
70 | 69 | ||
71 | 70 | ||
72 | void OSQLiteDriver::setPassword( const QString& ) {} | 71 | void OSQLiteDriver::setPassword( const QString& ) {} |
73 | 72 | ||
74 | 73 | ||
75 | void OSQLiteDriver::setUrl( const QString& url ) { | 74 | void OSQLiteDriver::setUrl( const QString& url ) { |
76 | m_url = url; | 75 | m_url = url; |
77 | } | 76 | } |
78 | 77 | ||
79 | 78 | ||
80 | void OSQLiteDriver::setOptions( const QStringList& ) { | 79 | void OSQLiteDriver::setOptions( const QStringList& ) { |
81 | } | 80 | } |
82 | 81 | ||
83 | 82 | ||
84 | /* | 83 | /* |
85 | * try to open a db specified via setUrl | 84 | * try to open a db specified via setUrl |
86 | * and options | 85 | * and options |
87 | */ | 86 | */ |
88 | bool OSQLiteDriver::open() { | 87 | bool OSQLiteDriver::open() { |
89 | char *error; | 88 | char *error; |
90 | odebug << "OSQLiteDriver::open: about to open" << oendl; | 89 | odebug << "OSQLiteDriver::open: about to open" << oendl; |
91 | m_sqlite = sqlite_open(m_url.local8Bit(), | 90 | m_sqlite = sqlite_open(m_url.local8Bit(), |
92 | 0, | 91 | 0, |
93 | &error ); | 92 | &error ); |
94 | 93 | ||
95 | /* failed to open */ | 94 | /* failed to open */ |
96 | if (m_sqlite == 0l ) { | 95 | if (m_sqlite == 0l ) { |
97 | // FIXME set the last error | 96 | // FIXME set the last error |
98 | owarn << "OSQLiteDriver::open: " << error << oendl; | 97 | owarn << "OSQLiteDriver::open: " << error << oendl; |
99 | free( error ); | 98 | free( error ); |
100 | return false; | 99 | return false; |
101 | } | 100 | } |
102 | return true; | 101 | return true; |
103 | } | 102 | } |
104 | 103 | ||
105 | 104 | ||
106 | /* close the db | 105 | /* close the db |
107 | * sqlite closes them without | 106 | * sqlite closes them without |
108 | * telling failure or success | 107 | * telling failure or success |
109 | */ | 108 | */ |
110 | bool OSQLiteDriver::close() { | 109 | bool OSQLiteDriver::close() { |
111 | if (m_sqlite ) | 110 | if (m_sqlite ) |
112 | sqlite_close( m_sqlite ), m_sqlite=0l; | 111 | sqlite_close( m_sqlite ), m_sqlite=0l; |
113 | 112 | ||
114 | return true; | 113 | return true; |
115 | } | 114 | } |
116 | 115 | ||
117 | 116 | ||
118 | /* Query */ | 117 | /* Query */ |
119 | OSQLResult OSQLiteDriver::query( OSQLQuery* qu) { | 118 | OSQLResult OSQLiteDriver::query( OSQLQuery* qu) { |
120 | if ( !m_sqlite ) { | 119 | if ( !m_sqlite ) { |
121 | // FIXME set error code | 120 | // FIXME set error code |
122 | OSQLResult result( OSQLResult::Failure ); | 121 | OSQLResult result( OSQLResult::Failure ); |
123 | return result; | 122 | return result; |
124 | } | 123 | } |
125 | Query query; | 124 | Query query; |
126 | query.driver = this; | 125 | query.driver = this; |
127 | char *err; | 126 | char *err; |
128 | /* SQLITE_OK 0 if return code > 0 == failure */ | 127 | /* SQLITE_OK 0 if return code > 0 == failure */ |
129 | if ( sqlite_exec(m_sqlite, qu->query(),&call_back, &query, &err) > 0 ) { | 128 | if ( sqlite_exec(m_sqlite, qu->query(),&call_back, &query, &err) > 0 ) { |
130 | owarn << "OSQLiteDriver::query: Error while executing" << oendl; | 129 | owarn << "OSQLiteDriver::query: Error while executing" << oendl; |
131 | free(err ); | 130 | free(err ); |
132 | // FixMe Errors | 131 | // FixMe Errors |
133 | } | 132 | } |
134 | 133 | ||
135 | OSQLResult result(OSQLResult::Success, | 134 | OSQLResult result(OSQLResult::Success, |
136 | query.items, | 135 | query.items, |
137 | query.errors ); | 136 | query.errors ); |
138 | return result; | 137 | return result; |
139 | } | 138 | } |
140 | 139 | ||
141 | 140 | ||
142 | OSQLTable::ValueList OSQLiteDriver::tables() const { | 141 | OSQLTable::ValueList OSQLiteDriver::tables() const { |
143 | 142 | ||
144 | } | 143 | } |
145 | 144 | ||
146 | 145 | ||
147 | OSQLError OSQLiteDriver::lastError() { | 146 | OSQLError OSQLiteDriver::lastError() { |
148 | OSQLError error; | 147 | OSQLError error; |
149 | return error; | 148 | return error; |
150 | }; | 149 | }; |
151 | 150 | ||
152 | 151 | ||
153 | /* handle a callback add the row to the global | 152 | /* handle a callback add the row to the global |
154 | * OSQLResultItem | 153 | * OSQLResultItem |
155 | */ | 154 | */ |
156 | int OSQLiteDriver::handleCallBack( int, char**, char** ) { | 155 | int OSQLiteDriver::handleCallBack( int, char**, char** ) { |
157 | return 0; | 156 | return 0; |
158 | } | 157 | } |
159 | 158 | ||
160 | 159 | ||
161 | /* callback_handler add the values to the list*/ | 160 | /* callback_handler add the values to the list*/ |
162 | int OSQLiteDriver::call_back( void* voi, int argc, | 161 | int OSQLiteDriver::call_back( void* voi, int argc, |
163 | char** argv, char** columns) { | 162 | char** argv, char** columns) { |
164 | Query* qu = (Query*)voi; | 163 | Query* qu = (Query*)voi; |
165 | 164 | ||
166 | //copy them over to a OSQLResultItem | 165 | //copy them over to a OSQLResultItem |
167 | QMap<QString, QString> tableString; | 166 | QMap<QString, QString> tableString; |
168 | QMap<int, QString> tableInt; | 167 | QMap<int, QString> tableInt; |
169 | for (int i = 0; i < argc; i++ ) { | 168 | for (int i = 0; i < argc; i++ ) { |
170 | 169 | ||
171 | #ifdef __BUGGY_LOCAL8BIT_ | 170 | #ifdef __BUGGY_LOCAL8BIT_ |
172 | tableInt.insert( i, QString::fromLatin1( argv[i] ) ); | 171 | tableInt.insert( i, QString::fromLatin1( argv[i] ) ); |
173 | tableString.insert( QString::fromLatin1( columns[i] ), | 172 | tableString.insert( QString::fromLatin1( columns[i] ), |
174 | QString::fromLatin1( argv[i] ) ); | 173 | QString::fromLatin1( argv[i] ) ); |
175 | #else | 174 | #else |
176 | tableInt.insert( i, QString::fromLocal8Bit( argv[i] ) ); | 175 | tableInt.insert( i, QString::fromLocal8Bit( argv[i] ) ); |
177 | tableString.insert( QString::fromLocal8Bit( columns[i] ), | 176 | tableString.insert( QString::fromLocal8Bit( columns[i] ), |
178 | QString::fromLocal8Bit( argv[i] ) ); | 177 | QString::fromLocal8Bit( argv[i] ) ); |
179 | #endif | 178 | #endif |
180 | } | 179 | } |
181 | OSQLResultItem item( tableString, tableInt ); | 180 | OSQLResultItem item( tableString, tableInt ); |
182 | qu->items.append( item ); | 181 | qu->items.append( item ); |
183 | 182 | ||
184 | return ((Query*)voi)->driver->handleCallBack( argc, | 183 | return ((Query*)voi)->driver->handleCallBack( argc, |
185 | argv, | 184 | argv, |
186 | columns ); | 185 | columns ); |
187 | 186 | ||
188 | 187 | ||
189 | } | 188 | } |
diff --git a/libopie2/opiedb/osqlmanager.cpp b/libopie2/opiedb/osqlmanager.cpp index b0fea04..766ebe1 100644 --- a/libopie2/opiedb/osqlmanager.cpp +++ b/libopie2/opiedb/osqlmanager.cpp | |||
@@ -1,83 +1,81 @@ | |||
1 | 1 | ||
2 | #include <stdlib.h> | 2 | #include <stdlib.h> |
3 | 3 | ||
4 | #include "osqlbackend.h" | ||
5 | #include "osqldriver.h" | ||
6 | #include "osqlmanager.h" | 4 | #include "osqlmanager.h" |
7 | #include "osqlbackendmanager.h" | 5 | #include "osqlbackendmanager.h" |
8 | #include "osqlitedriver.h" | 6 | #include "osqlitedriver.h" |
9 | 7 | ||
10 | OSQLManager::OSQLManager() { | 8 | OSQLManager::OSQLManager() { |
11 | } | 9 | } |
12 | OSQLBackEnd::ValueList OSQLManager::queryBackEnd() { | 10 | OSQLBackEnd::ValueList OSQLManager::queryBackEnd() { |
13 | m_list.clear(); | 11 | m_list.clear(); |
14 | QString opie = QString::fromLatin1( getenv("OPIEDIR") ); | 12 | QString opie = QString::fromLatin1( getenv("OPIEDIR") ); |
15 | QString qpe = QString::fromLatin1( getenv("QPEDIR") ); | 13 | QString qpe = QString::fromLatin1( getenv("QPEDIR") ); |
16 | 14 | ||
17 | if ( !m_path.contains(opie) && !opie.isEmpty() ) | 15 | if ( !m_path.contains(opie) && !opie.isEmpty() ) |
18 | m_path << opie; | 16 | m_path << opie; |
19 | if ( !m_path.contains(qpe) && !qpe.isEmpty() ) | 17 | if ( !m_path.contains(qpe) && !qpe.isEmpty() ) |
20 | m_path << qpe; | 18 | m_path << qpe; |
21 | 19 | ||
22 | OSQLBackEndManager mng( m_path ); | 20 | OSQLBackEndManager mng( m_path ); |
23 | m_list = mng.scan(); | 21 | m_list = mng.scan(); |
24 | m_list += builtIn(); | 22 | m_list += builtIn(); |
25 | 23 | ||
26 | return m_list; | 24 | return m_list; |
27 | } | 25 | } |
28 | /* | 26 | /* |
29 | * loading dso's is currently not enabled due problems with QLibrary | 27 | * loading dso's is currently not enabled due problems with QLibrary |
30 | * beeing in libqpe and not libqte | 28 | * beeing in libqpe and not libqte |
31 | */ | 29 | */ |
32 | OSQLDriver* OSQLManager::load( const QString& name ) { | 30 | OSQLDriver* OSQLManager::load( const QString& name ) { |
33 | OSQLDriver* driver = 0l; | 31 | OSQLDriver* driver = 0l; |
34 | 32 | ||
35 | if ( name == "SQLite" ) { | 33 | if ( name == "SQLite" ) { |
36 | driver = new OSQLiteDriver(); | 34 | driver = new OSQLiteDriver(); |
37 | } | 35 | } |
38 | return driver; | 36 | return driver; |
39 | } | 37 | } |
40 | /* | 38 | /* |
41 | * same as above | 39 | * same as above |
42 | */ | 40 | */ |
43 | OSQLDriver* OSQLManager::load( const OSQLBackEnd& end) { | 41 | OSQLDriver* OSQLManager::load( const OSQLBackEnd& end) { |
44 | OSQLDriver *driver = 0l; | 42 | OSQLDriver *driver = 0l; |
45 | if ( end.library() == "builtin" && | 43 | if ( end.library() == "builtin" && |
46 | end.name() == "SQLite" ) | 44 | end.name() == "SQLite" ) |
47 | driver = new OSQLiteDriver(); | 45 | driver = new OSQLiteDriver(); |
48 | 46 | ||
49 | return driver; | 47 | return driver; |
50 | } | 48 | } |
51 | /* | 49 | /* |
52 | * let's find the a default with the highes preference | 50 | * let's find the a default with the highes preference |
53 | */ | 51 | */ |
54 | OSQLDriver* OSQLManager::standard() { | 52 | OSQLDriver* OSQLManager::standard() { |
55 | OSQLDriver* driver =0l; | 53 | OSQLDriver* driver =0l; |
56 | if ( m_list.isEmpty() ) queryBackEnd(); | 54 | if ( m_list.isEmpty() ) queryBackEnd(); |
57 | OSQLBackEnd::ValueList::Iterator it; | 55 | OSQLBackEnd::ValueList::Iterator it; |
58 | OSQLBackEnd back; | 56 | OSQLBackEnd back; |
59 | for ( it = m_list.begin(); it != m_list.end(); ++it ) { | 57 | for ( it = m_list.begin(); it != m_list.end(); ++it ) { |
60 | if ( (*it).isDefault() && | 58 | if ( (*it).isDefault() && |
61 | back.preference() < (*it).preference() ) { | 59 | back.preference() < (*it).preference() ) { |
62 | back = (*it); | 60 | back = (*it); |
63 | } | 61 | } |
64 | } | 62 | } |
65 | driver = load( back ); | 63 | driver = load( back ); |
66 | return driver; | 64 | return driver; |
67 | } | 65 | } |
68 | void OSQLManager::registerPath( const QString& path ) { | 66 | void OSQLManager::registerPath( const QString& path ) { |
69 | m_path << path; | 67 | m_path << path; |
70 | } | 68 | } |
71 | bool OSQLManager::unregisterPath( const QString& path ) { | 69 | bool OSQLManager::unregisterPath( const QString& path ) { |
72 | m_path.remove( path ); | 70 | m_path.remove( path ); |
73 | return true; | 71 | return true; |
74 | } | 72 | } |
75 | OSQLBackEnd::ValueList OSQLManager::builtIn()const { | 73 | OSQLBackEnd::ValueList OSQLManager::builtIn()const { |
76 | OSQLBackEnd::ValueList list; | 74 | OSQLBackEnd::ValueList list; |
77 | // create the OSQLiteBackend | 75 | // create the OSQLiteBackend |
78 | OSQLBackEnd back("SQLite","Opie e.V.","GPL", "builtin" ); | 76 | OSQLBackEnd back("SQLite","Opie e.V.","GPL", "builtin" ); |
79 | back.setDefault( true ); | 77 | back.setDefault( true ); |
80 | back.setPreference( 50 ); | 78 | back.setPreference( 50 ); |
81 | list.append( back ); | 79 | list.append( back ); |
82 | return list; | 80 | return list; |
83 | } | 81 | } |
diff --git a/libopie2/opiedb/osqlresult.cpp b/libopie2/opiedb/osqlresult.cpp index 490fb45..42da356 100644 --- a/libopie2/opiedb/osqlresult.cpp +++ b/libopie2/opiedb/osqlresult.cpp | |||
@@ -1,127 +1,126 @@ | |||
1 | 1 | ||
2 | #include "osqlquery.h" | ||
3 | #include "osqlresult.h" | 2 | #include "osqlresult.h" |
4 | 3 | ||
5 | OSQLResultItem::OSQLResultItem( const TableString& string, | 4 | OSQLResultItem::OSQLResultItem( const TableString& string, |
6 | const TableInt& Int) | 5 | const TableInt& Int) |
7 | : m_string( string ), m_int( Int ) | 6 | : m_string( string ), m_int( Int ) |
8 | { | 7 | { |
9 | 8 | ||
10 | } | 9 | } |
11 | OSQLResultItem::~OSQLResultItem() { | 10 | OSQLResultItem::~OSQLResultItem() { |
12 | } | 11 | } |
13 | OSQLResultItem::OSQLResultItem( const OSQLResultItem& item) { | 12 | OSQLResultItem::OSQLResultItem( const OSQLResultItem& item) { |
14 | *this = item; | 13 | *this = item; |
15 | } | 14 | } |
16 | OSQLResultItem &OSQLResultItem::operator=( const OSQLResultItem& other) { | 15 | OSQLResultItem &OSQLResultItem::operator=( const OSQLResultItem& other) { |
17 | m_string = other.m_string; | 16 | m_string = other.m_string; |
18 | m_int = other.m_int; | 17 | m_int = other.m_int; |
19 | return *this; | 18 | return *this; |
20 | } | 19 | } |
21 | OSQLResultItem::TableString OSQLResultItem::tableString()const{ | 20 | OSQLResultItem::TableString OSQLResultItem::tableString()const{ |
22 | return m_string; | 21 | return m_string; |
23 | } | 22 | } |
24 | OSQLResultItem::TableInt OSQLResultItem::tableInt()const { | 23 | OSQLResultItem::TableInt OSQLResultItem::tableInt()const { |
25 | return m_int; | 24 | return m_int; |
26 | } | 25 | } |
27 | QString OSQLResultItem::data( const QString& columnName, bool *ok ) { | 26 | QString OSQLResultItem::data( const QString& columnName, bool *ok ) { |
28 | TableString::Iterator it = m_string.find( columnName ); | 27 | TableString::Iterator it = m_string.find( columnName ); |
29 | 28 | ||
30 | /* if found */ | 29 | /* if found */ |
31 | if ( it != m_string.end() ) { | 30 | if ( it != m_string.end() ) { |
32 | if ( ok ) *ok = true; | 31 | if ( ok ) *ok = true; |
33 | return it.data(); | 32 | return it.data(); |
34 | }else{ | 33 | }else{ |
35 | if ( ok ) *ok = false; | 34 | if ( ok ) *ok = false; |
36 | return QString::null; | 35 | return QString::null; |
37 | } | 36 | } |
38 | 37 | ||
39 | } | 38 | } |
40 | QString OSQLResultItem::data( int column, bool *ok ) { | 39 | QString OSQLResultItem::data( int column, bool *ok ) { |
41 | TableInt::Iterator it = m_int.find( column ); | 40 | TableInt::Iterator it = m_int.find( column ); |
42 | 41 | ||
43 | /* if found */ | 42 | /* if found */ |
44 | if ( it != m_int.end() ) { | 43 | if ( it != m_int.end() ) { |
45 | if ( ok ) *ok = true; | 44 | if ( ok ) *ok = true; |
46 | return it.data(); | 45 | return it.data(); |
47 | }else{ | 46 | }else{ |
48 | if ( ok ) *ok = false; | 47 | if ( ok ) *ok = false; |
49 | return QString::null; | 48 | return QString::null; |
50 | } | 49 | } |
51 | } | 50 | } |
52 | /* | 51 | /* |
53 | * DateFormat is 'YYYY-MM-DD' | 52 | * DateFormat is 'YYYY-MM-DD' |
54 | */ | 53 | */ |
55 | QDate OSQLResultItem::dataToDate( const QString& column, bool *ok ) { | 54 | QDate OSQLResultItem::dataToDate( const QString& column, bool *ok ) { |
56 | QDate date = QDate::currentDate(); | 55 | QDate date = QDate::currentDate(); |
57 | QString str = data( column, ok ); | 56 | QString str = data( column, ok ); |
58 | if (!str.isEmpty() ) { | 57 | if (!str.isEmpty() ) { |
59 | ;// convert | 58 | ;// convert |
60 | } | 59 | } |
61 | return date; | 60 | return date; |
62 | } | 61 | } |
63 | QDate OSQLResultItem::dataToDate( int column, bool *ok ) { | 62 | QDate OSQLResultItem::dataToDate( int column, bool *ok ) { |
64 | QDate date = QDate::currentDate(); | 63 | QDate date = QDate::currentDate(); |
65 | QString str = data( column, ok ); | 64 | QString str = data( column, ok ); |
66 | if (!str.isEmpty() ) { | 65 | if (!str.isEmpty() ) { |
67 | ;// convert | 66 | ;// convert |
68 | } | 67 | } |
69 | return date; | 68 | return date; |
70 | 69 | ||
71 | } | 70 | } |
72 | QDateTime OSQLResultItem::dataToDateTime( const QString& column, bool *ok ) { | 71 | QDateTime OSQLResultItem::dataToDateTime( const QString& column, bool *ok ) { |
73 | QDateTime time = QDateTime::currentDateTime(); | 72 | QDateTime time = QDateTime::currentDateTime(); |
74 | return time; | 73 | return time; |
75 | } | 74 | } |
76 | QDateTime OSQLResultItem::dataToDateTime( int column, bool *ok ) { | 75 | QDateTime OSQLResultItem::dataToDateTime( int column, bool *ok ) { |
77 | QDateTime time = QDateTime::currentDateTime(); | 76 | QDateTime time = QDateTime::currentDateTime(); |
78 | return time; | 77 | return time; |
79 | } | 78 | } |
80 | 79 | ||
81 | OSQLResult::OSQLResult( enum State state, | 80 | OSQLResult::OSQLResult( enum State state, |
82 | const OSQLResultItem::ValueList& list, | 81 | const OSQLResultItem::ValueList& list, |
83 | const OSQLError::ValueList& error ) | 82 | const OSQLError::ValueList& error ) |
84 | : m_state( state ), m_list( list ), m_error( error ) | 83 | : m_state( state ), m_list( list ), m_error( error ) |
85 | { | 84 | { |
86 | 85 | ||
87 | } | 86 | } |
88 | OSQLResult::~OSQLResult() { | 87 | OSQLResult::~OSQLResult() { |
89 | 88 | ||
90 | } | 89 | } |
91 | OSQLResult::State OSQLResult::state()const { | 90 | OSQLResult::State OSQLResult::state()const { |
92 | return m_state; | 91 | return m_state; |
93 | } | 92 | } |
94 | void OSQLResult::setState( OSQLResult::State state ) { | 93 | void OSQLResult::setState( OSQLResult::State state ) { |
95 | m_state = state; | 94 | m_state = state; |
96 | } | 95 | } |
97 | OSQLError::ValueList OSQLResult::errors()const { | 96 | OSQLError::ValueList OSQLResult::errors()const { |
98 | return m_error; | 97 | return m_error; |
99 | } | 98 | } |
100 | void OSQLResult::setErrors( const OSQLError::ValueList& err ) { | 99 | void OSQLResult::setErrors( const OSQLError::ValueList& err ) { |
101 | m_error = err; | 100 | m_error = err; |
102 | } | 101 | } |
103 | OSQLResultItem::ValueList OSQLResult::results()const { | 102 | OSQLResultItem::ValueList OSQLResult::results()const { |
104 | return m_list; | 103 | return m_list; |
105 | } | 104 | } |
106 | void OSQLResult::setResults( const OSQLResultItem::ValueList& result ) { | 105 | void OSQLResult::setResults( const OSQLResultItem::ValueList& result ) { |
107 | m_list = result; | 106 | m_list = result; |
108 | } | 107 | } |
109 | OSQLResultItem OSQLResult::first() { | 108 | OSQLResultItem OSQLResult::first() { |
110 | it = m_list.begin(); | 109 | it = m_list.begin(); |
111 | return (*it); | 110 | return (*it); |
112 | } | 111 | } |
113 | OSQLResultItem OSQLResult::next(){ | 112 | OSQLResultItem OSQLResult::next(){ |
114 | ++it; | 113 | ++it; |
115 | return (*it); | 114 | return (*it); |
116 | } | 115 | } |
117 | bool OSQLResult::atEnd(){ | 116 | bool OSQLResult::atEnd(){ |
118 | if ( it == m_list.end() ) | 117 | if ( it == m_list.end() ) |
119 | return true; | 118 | return true; |
120 | 119 | ||
121 | return false; | 120 | return false; |
122 | } | 121 | } |
123 | OSQLResultItem::ValueList::ConstIterator OSQLResult::iterator()const { | 122 | OSQLResultItem::ValueList::ConstIterator OSQLResult::iterator()const { |
124 | OSQLResultItem::ValueList::ConstIterator it; | 123 | OSQLResultItem::ValueList::ConstIterator it; |
125 | it = m_list.begin(); | 124 | it = m_list.begin(); |
126 | return it; | 125 | return it; |
127 | } | 126 | } |
diff --git a/libopie2/opiemm/osoundsystem.cpp b/libopie2/opiemm/osoundsystem.cpp index ca63389..51e088c 100644 --- a/libopie2/opiemm/osoundsystem.cpp +++ b/libopie2/opiemm/osoundsystem.cpp | |||
@@ -1,314 +1,313 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | 3 | ||
4 | (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> | 4 | (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> |
5 | =. | 5 | =. |
6 | .=l. | 6 | .=l. |
7 | .>+-= | 7 | .>+-= |
8 | _;:, .> :=|. This program is free software; you can | 8 | _;:, .> :=|. This program is free software; you can |
9 | .> <`_, > . <= redistribute it and/or modify it under | 9 | .> <`_, > . <= redistribute it and/or modify it under |
10 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 10 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
11 | .="- .-=="i, .._ License as published by the Free Software | 11 | .="- .-=="i, .._ License as published by the Free Software |
12 | - . .-<_> .<> Foundation; either version 2 of the License, | 12 | - . .-<_> .<> Foundation; either version 2 of the License, |
13 | ._= =} : or (at your option) any later version. | 13 | ._= =} : or (at your option) any later version. |
14 | .%`+i> _;_. | 14 | .%`+i> _;_. |
15 | .i_,=:_. -<s. This program is distributed in the hope that | 15 | .i_,=:_. -<s. This program is distributed in the hope that |
16 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 16 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
17 | : .. .:, . . . without even the implied warranty of | 17 | : .. .:, . . . without even the implied warranty of |
18 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 18 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
19 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 19 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
20 | ..}^=.= = ; Library General Public License for more | 20 | ..}^=.= = ; Library General Public License for more |
21 | ++= -. .` .: details. | 21 | ++= -. .` .: details. |
22 | : = ...= . :.=- | 22 | : = ...= . :.=- |
23 | -. .:....=;==+<; You should have received a copy of the GNU | 23 | -. .:....=;==+<; You should have received a copy of the GNU |
24 | -_. . . )=. = Library General Public License along with | 24 | -_. . . )=. = Library General Public License along with |
25 | -- :-=` this library; see the file COPYING.LIB. | 25 | -- :-=` this library; see the file COPYING.LIB. |
26 | If not, write to the Free Software Foundation, | 26 | If not, write to the Free Software Foundation, |
27 | Inc., 59 Temple Place - Suite 330, | 27 | Inc., 59 Temple Place - Suite 330, |
28 | Boston, MA 02111-1307, USA. | 28 | Boston, MA 02111-1307, USA. |
29 | 29 | ||
30 | */ | 30 | */ |
31 | 31 | ||
32 | #include <opie2/osoundsystem.h> | 32 | #include <opie2/osoundsystem.h> |
33 | #include <opie2/odebug.h> | 33 | #include <opie2/odebug.h> |
34 | 34 | ||
35 | #include <errno.h> | 35 | #include <errno.h> |
36 | #include <fcntl.h> | 36 | #include <fcntl.h> |
37 | #include <string.h> | 37 | #include <string.h> |
38 | #include <sys/ioctl.h> | 38 | #include <sys/ioctl.h> |
39 | #include <sys/types.h> | 39 | #include <sys/types.h> |
40 | #include <sys/soundcard.h> | 40 | #include <sys/soundcard.h> |
41 | #include <sys/stat.h> | 41 | #include <sys/stat.h> |
42 | 42 | ||
43 | #include <qstringlist.h> | ||
44 | 43 | ||
45 | /*====================================================================================== | 44 | /*====================================================================================== |
46 | * OSoundSystem | 45 | * OSoundSystem |
47 | *======================================================================================*/ | 46 | *======================================================================================*/ |
48 | 47 | ||
49 | OSoundSystem* OSoundSystem::_instance = 0; | 48 | OSoundSystem* OSoundSystem::_instance = 0; |
50 | 49 | ||
51 | OSoundSystem::OSoundSystem() | 50 | OSoundSystem::OSoundSystem() |
52 | { | 51 | { |
53 | odebug << "OSoundSystem::OSoundSystem()" << oendl; | 52 | odebug << "OSoundSystem::OSoundSystem()" << oendl; |
54 | synchronize(); | 53 | synchronize(); |
55 | } | 54 | } |
56 | 55 | ||
57 | void OSoundSystem::synchronize() | 56 | void OSoundSystem::synchronize() |
58 | { | 57 | { |
59 | // gather available interfaces by inspecting /dev | 58 | // gather available interfaces by inspecting /dev |
60 | //FIXME: we could use SIOCGIFCONF here, but we aren't interested in virtual (e.g. eth0:0) devices | 59 | //FIXME: we could use SIOCGIFCONF here, but we aren't interested in virtual (e.g. eth0:0) devices |
61 | //FIXME: Use SIOCGIFCONF anway, because we can disable listing of aliased devices | 60 | //FIXME: Use SIOCGIFCONF anway, because we can disable listing of aliased devices |
62 | 61 | ||
63 | _interfaces.clear(); | 62 | _interfaces.clear(); |
64 | _interfaces.insert( "soundcard", new OSoundCard( this, "soundcard" ) ); | 63 | _interfaces.insert( "soundcard", new OSoundCard( this, "soundcard" ) ); |
65 | 64 | ||
66 | 65 | ||
67 | /* | 66 | /* |
68 | 67 | ||
69 | QString str; | 68 | QString str; |
70 | QFile f( "/dev/sound" ); | 69 | QFile f( "/dev/sound" ); |
71 | bool hasFile = f.open( IO_ReadOnly ); | 70 | bool hasFile = f.open( IO_ReadOnly ); |
72 | if ( !hasFile ) | 71 | if ( !hasFile ) |
73 | { | 72 | { |
74 | odebug << "OSoundSystem: /dev/sound not existing. No sound devices available" << oendl; | 73 | odebug << "OSoundSystem: /dev/sound not existing. No sound devices available" << oendl; |
75 | return; | 74 | return; |
76 | } | 75 | } |
77 | QTextStream s( &f ); | 76 | QTextStream s( &f ); |
78 | s.readLine(); | 77 | s.readLine(); |
79 | s.readLine(); | 78 | s.readLine(); |
80 | while ( !s.atEnd() ) | 79 | while ( !s.atEnd() ) |
81 | { | 80 | { |
82 | s >> str; | 81 | s >> str; |
83 | str.truncate( str.find( ':' ) ); | 82 | str.truncate( str.find( ':' ) ); |
84 | qDebug( "OSoundSystem: found interface '%s'", (const char*) str ); | 83 | qDebug( "OSoundSystem: found interface '%s'", (const char*) str ); |
85 | OAudioInterface* iface; | 84 | OAudioInterface* iface; |
86 | iface = new OAudioInterface( this, (const char*) str ); | 85 | iface = new OAudioInterface( this, (const char*) str ); |
87 | 86 | ||
88 | _interfaces.insert( str, iface ); | 87 | _interfaces.insert( str, iface ); |
89 | s.readLine(); | 88 | s.readLine(); |
90 | } | 89 | } |
91 | */ | 90 | */ |
92 | } | 91 | } |
93 | 92 | ||
94 | 93 | ||
95 | int OSoundSystem::count() const | 94 | int OSoundSystem::count() const |
96 | { | 95 | { |
97 | return _interfaces.count(); | 96 | return _interfaces.count(); |
98 | } | 97 | } |
99 | 98 | ||
100 | 99 | ||
101 | OSoundCard* OSoundSystem::card( const QString& iface ) const | 100 | OSoundCard* OSoundSystem::card( const QString& iface ) const |
102 | { | 101 | { |
103 | return _interfaces[iface]; | 102 | return _interfaces[iface]; |
104 | } | 103 | } |
105 | 104 | ||
106 | 105 | ||
107 | OSoundSystem* OSoundSystem::instance() | 106 | OSoundSystem* OSoundSystem::instance() |
108 | { | 107 | { |
109 | if ( !_instance ) _instance = new OSoundSystem(); | 108 | if ( !_instance ) _instance = new OSoundSystem(); |
110 | return _instance; | 109 | return _instance; |
111 | } | 110 | } |
112 | 111 | ||
113 | 112 | ||
114 | OSoundSystem::CardIterator OSoundSystem::iterator() const | 113 | OSoundSystem::CardIterator OSoundSystem::iterator() const |
115 | { | 114 | { |
116 | return OSoundSystem::CardIterator( _interfaces ); | 115 | return OSoundSystem::CardIterator( _interfaces ); |
117 | } | 116 | } |
118 | 117 | ||
119 | 118 | ||
120 | /*====================================================================================== | 119 | /*====================================================================================== |
121 | * OSoundCard | 120 | * OSoundCard |
122 | *======================================================================================*/ | 121 | *======================================================================================*/ |
123 | 122 | ||
124 | OSoundCard::OSoundCard( QObject* parent, const char* name ) | 123 | OSoundCard::OSoundCard( QObject* parent, const char* name ) |
125 | :QObject( parent, name ), _audio( 0 ), _mixer( 0 ) | 124 | :QObject( parent, name ), _audio( 0 ), _mixer( 0 ) |
126 | { | 125 | { |
127 | odebug << "OSoundCard::OSoundCard()" << oendl; | 126 | odebug << "OSoundCard::OSoundCard()" << oendl; |
128 | init(); | 127 | init(); |
129 | } | 128 | } |
130 | 129 | ||
131 | 130 | ||
132 | OSoundCard::~OSoundCard() | 131 | OSoundCard::~OSoundCard() |
133 | { | 132 | { |
134 | } | 133 | } |
135 | 134 | ||
136 | 135 | ||
137 | void OSoundCard::init() | 136 | void OSoundCard::init() |
138 | { | 137 | { |
139 | _audio = new OAudioInterface( this, "/dev/dsp" ); | 138 | _audio = new OAudioInterface( this, "/dev/dsp" ); |
140 | _mixer = new OMixerInterface( this, "/dev/mixer" ); | 139 | _mixer = new OMixerInterface( this, "/dev/mixer" ); |
141 | } | 140 | } |
142 | 141 | ||
143 | 142 | ||
144 | /*====================================================================================== | 143 | /*====================================================================================== |
145 | * OAudioInterface | 144 | * OAudioInterface |
146 | *======================================================================================*/ | 145 | *======================================================================================*/ |
147 | 146 | ||
148 | OAudioInterface::OAudioInterface( QObject* parent, const char* name ) | 147 | OAudioInterface::OAudioInterface( QObject* parent, const char* name ) |
149 | :QObject( parent, name ) | 148 | :QObject( parent, name ) |
150 | { | 149 | { |
151 | odebug << "OAudioInterface::OAudioInterface()" << oendl; | 150 | odebug << "OAudioInterface::OAudioInterface()" << oendl; |
152 | init(); | 151 | init(); |
153 | } | 152 | } |
154 | 153 | ||
155 | 154 | ||
156 | OAudioInterface::~OAudioInterface() | 155 | OAudioInterface::~OAudioInterface() |
157 | { | 156 | { |
158 | } | 157 | } |
159 | 158 | ||
160 | 159 | ||
161 | void OAudioInterface::init() | 160 | void OAudioInterface::init() |
162 | { | 161 | { |
163 | 162 | ||
164 | 163 | ||
165 | } | 164 | } |
166 | 165 | ||
167 | 166 | ||
168 | /*====================================================================================== | 167 | /*====================================================================================== |
169 | * OMixerInterface | 168 | * OMixerInterface |
170 | *======================================================================================*/ | 169 | *======================================================================================*/ |
171 | 170 | ||
172 | OMixerInterface::OMixerInterface( QObject* parent, const char* name ) | 171 | OMixerInterface::OMixerInterface( QObject* parent, const char* name ) |
173 | :QObject( parent, name ) | 172 | :QObject( parent, name ) |
174 | { | 173 | { |
175 | odebug << "OMixerInterface::OMixerInterface()" << oendl; | 174 | odebug << "OMixerInterface::OMixerInterface()" << oendl; |
176 | init(); | 175 | init(); |
177 | } | 176 | } |
178 | 177 | ||
179 | 178 | ||
180 | OMixerInterface::~OMixerInterface() | 179 | OMixerInterface::~OMixerInterface() |
181 | { | 180 | { |
182 | } | 181 | } |
183 | 182 | ||
184 | 183 | ||
185 | void OMixerInterface::init() | 184 | void OMixerInterface::init() |
186 | { | 185 | { |
187 | // open the device | 186 | // open the device |
188 | _fd = ::open( name(), O_RDWR ); | 187 | _fd = ::open( name(), O_RDWR ); |
189 | if ( _fd == -1 ) | 188 | if ( _fd == -1 ) |
190 | { | 189 | { |
191 | owarn << "OMixerInterface::init(): Can't open mixer." << oendl; | 190 | owarn << "OMixerInterface::init(): Can't open mixer." << oendl; |
192 | return; | 191 | return; |
193 | } | 192 | } |
194 | 193 | ||
195 | // construct the device capabilities | 194 | // construct the device capabilities |
196 | int devmask = 0; | 195 | int devmask = 0; |
197 | if ( ioctl( _fd, SOUND_MIXER_READ_DEVMASK, &devmask ) != -1 ) | 196 | if ( ioctl( _fd, SOUND_MIXER_READ_DEVMASK, &devmask ) != -1 ) |
198 | { | 197 | { |
199 | if ( devmask & ( 1 << SOUND_MIXER_VOLUME ) ) _channels.insert( "PlayVolume", SOUND_MIXER_VOLUME ); | 198 | if ( devmask & ( 1 << SOUND_MIXER_VOLUME ) ) _channels.insert( "PlayVolume", SOUND_MIXER_VOLUME ); |
200 | if ( devmask & ( 1 << SOUND_MIXER_BASS ) ) _channels.insert( "PlayBass", SOUND_MIXER_BASS ); | 199 | if ( devmask & ( 1 << SOUND_MIXER_BASS ) ) _channels.insert( "PlayBass", SOUND_MIXER_BASS ); |
201 | if ( devmask & ( 1 << SOUND_MIXER_TREBLE ) ) _channels.insert( "PlayTreble", SOUND_MIXER_TREBLE ); | 200 | if ( devmask & ( 1 << SOUND_MIXER_TREBLE ) ) _channels.insert( "PlayTreble", SOUND_MIXER_TREBLE ); |
202 | if ( devmask & ( 1 << SOUND_MIXER_SYNTH ) ) _channels.insert( "PlaySynth", SOUND_MIXER_SYNTH ); | 201 | if ( devmask & ( 1 << SOUND_MIXER_SYNTH ) ) _channels.insert( "PlaySynth", SOUND_MIXER_SYNTH ); |
203 | if ( devmask & ( 1 << SOUND_MIXER_PCM ) ) _channels.insert( "PlayPCM", SOUND_MIXER_PCM ); | 202 | if ( devmask & ( 1 << SOUND_MIXER_PCM ) ) _channels.insert( "PlayPCM", SOUND_MIXER_PCM ); |
204 | if ( devmask & ( 1 << SOUND_MIXER_SPEAKER ) ) _channels.insert( "PlaySpeaker", SOUND_MIXER_SPEAKER ); | 203 | if ( devmask & ( 1 << SOUND_MIXER_SPEAKER ) ) _channels.insert( "PlaySpeaker", SOUND_MIXER_SPEAKER ); |
205 | if ( devmask & ( 1 << SOUND_MIXER_LINE ) ) _channels.insert( "PlayLine", SOUND_MIXER_LINE ); | 204 | if ( devmask & ( 1 << SOUND_MIXER_LINE ) ) _channels.insert( "PlayLine", SOUND_MIXER_LINE ); |
206 | if ( devmask & ( 1 << SOUND_MIXER_MIC ) ) _channels.insert( "PlayMic", SOUND_MIXER_MIC ); | 205 | if ( devmask & ( 1 << SOUND_MIXER_MIC ) ) _channels.insert( "PlayMic", SOUND_MIXER_MIC ); |
207 | if ( devmask & ( 1 << SOUND_MIXER_CD ) ) _channels.insert( "PlayCD", SOUND_MIXER_CD ); | 206 | if ( devmask & ( 1 << SOUND_MIXER_CD ) ) _channels.insert( "PlayCD", SOUND_MIXER_CD ); |
208 | if ( devmask & ( 1 << SOUND_MIXER_IMIX ) ) _channels.insert( "PlayInputMix", SOUND_MIXER_IMIX ); | 207 | if ( devmask & ( 1 << SOUND_MIXER_IMIX ) ) _channels.insert( "PlayInputMix", SOUND_MIXER_IMIX ); |
209 | if ( devmask & ( 1 << SOUND_MIXER_ALTPCM ) ) _channels.insert( "PlayAltPCM", SOUND_MIXER_ALTPCM ); | 208 | if ( devmask & ( 1 << SOUND_MIXER_ALTPCM ) ) _channels.insert( "PlayAltPCM", SOUND_MIXER_ALTPCM ); |
210 | if ( devmask & ( 1 << SOUND_MIXER_RECLEV ) ) _channels.insert( "PlayRecord", SOUND_MIXER_RECLEV ); | 209 | if ( devmask & ( 1 << SOUND_MIXER_RECLEV ) ) _channels.insert( "PlayRecord", SOUND_MIXER_RECLEV ); |
211 | if ( devmask & ( 1 << SOUND_MIXER_IGAIN ) ) _channels.insert( "PlayInputGain", SOUND_MIXER_IGAIN ); | 210 | if ( devmask & ( 1 << SOUND_MIXER_IGAIN ) ) _channels.insert( "PlayInputGain", SOUND_MIXER_IGAIN ); |
212 | if ( devmask & ( 1 << SOUND_MIXER_OGAIN ) ) _channels.insert( "PlayOutputGain", SOUND_MIXER_OGAIN ); | 211 | if ( devmask & ( 1 << SOUND_MIXER_OGAIN ) ) _channels.insert( "PlayOutputGain", SOUND_MIXER_OGAIN ); |
213 | //odebug << "devmask available and constructed." << oendl; | 212 | //odebug << "devmask available and constructed." << oendl; |
214 | } | 213 | } |
215 | 214 | ||
216 | devmask = 0; | 215 | devmask = 0; |
217 | if ( ioctl( _fd, SOUND_MIXER_READ_RECMASK, &devmask ) != -1 ) | 216 | if ( ioctl( _fd, SOUND_MIXER_READ_RECMASK, &devmask ) != -1 ) |
218 | { | 217 | { |
219 | if ( devmask & ( 1 << SOUND_MIXER_VOLUME ) ) _channels.insert( "RecVolume", SOUND_MIXER_VOLUME ); | 218 | if ( devmask & ( 1 << SOUND_MIXER_VOLUME ) ) _channels.insert( "RecVolume", SOUND_MIXER_VOLUME ); |
220 | if ( devmask & ( 1 << SOUND_MIXER_BASS ) ) _channels.insert( "RecBass", SOUND_MIXER_BASS ); | 219 | if ( devmask & ( 1 << SOUND_MIXER_BASS ) ) _channels.insert( "RecBass", SOUND_MIXER_BASS ); |
221 | if ( devmask & ( 1 << SOUND_MIXER_TREBLE ) ) _channels.insert( "RecTreble", SOUND_MIXER_TREBLE ); | 220 | if ( devmask & ( 1 << SOUND_MIXER_TREBLE ) ) _channels.insert( "RecTreble", SOUND_MIXER_TREBLE ); |
222 | if ( devmask & ( 1 << SOUND_MIXER_SYNTH ) ) _channels.insert( "RecSynth", SOUND_MIXER_SYNTH ); | 221 | if ( devmask & ( 1 << SOUND_MIXER_SYNTH ) ) _channels.insert( "RecSynth", SOUND_MIXER_SYNTH ); |
223 | if ( devmask & ( 1 << SOUND_MIXER_PCM ) ) _channels.insert( "RecPCM", SOUND_MIXER_PCM ); | 222 | if ( devmask & ( 1 << SOUND_MIXER_PCM ) ) _channels.insert( "RecPCM", SOUND_MIXER_PCM ); |
224 | if ( devmask & ( 1 << SOUND_MIXER_SPEAKER ) ) _channels.insert( "RecSpeaker", SOUND_MIXER_SPEAKER ); | 223 | if ( devmask & ( 1 << SOUND_MIXER_SPEAKER ) ) _channels.insert( "RecSpeaker", SOUND_MIXER_SPEAKER ); |
225 | if ( devmask & ( 1 << SOUND_MIXER_LINE ) ) _channels.insert( "RecLine", SOUND_MIXER_LINE ); | 224 | if ( devmask & ( 1 << SOUND_MIXER_LINE ) ) _channels.insert( "RecLine", SOUND_MIXER_LINE ); |
226 | if ( devmask & ( 1 << SOUND_MIXER_MIC ) ) _channels.insert( "RecMic", SOUND_MIXER_MIC ); | 225 | if ( devmask & ( 1 << SOUND_MIXER_MIC ) ) _channels.insert( "RecMic", SOUND_MIXER_MIC ); |
227 | if ( devmask & ( 1 << SOUND_MIXER_CD ) ) _channels.insert( "RecCD", SOUND_MIXER_CD ); | 226 | if ( devmask & ( 1 << SOUND_MIXER_CD ) ) _channels.insert( "RecCD", SOUND_MIXER_CD ); |
228 | if ( devmask & ( 1 << SOUND_MIXER_IMIX ) ) _channels.insert( "RecInputMix", SOUND_MIXER_IMIX ); | 227 | if ( devmask & ( 1 << SOUND_MIXER_IMIX ) ) _channels.insert( "RecInputMix", SOUND_MIXER_IMIX ); |
229 | if ( devmask & ( 1 << SOUND_MIXER_ALTPCM ) ) _channels.insert( "RecAltPCM", SOUND_MIXER_ALTPCM ); | 228 | if ( devmask & ( 1 << SOUND_MIXER_ALTPCM ) ) _channels.insert( "RecAltPCM", SOUND_MIXER_ALTPCM ); |
230 | if ( devmask & ( 1 << SOUND_MIXER_RECLEV ) ) _channels.insert( "RecRecord", SOUND_MIXER_RECLEV ); | 229 | if ( devmask & ( 1 << SOUND_MIXER_RECLEV ) ) _channels.insert( "RecRecord", SOUND_MIXER_RECLEV ); |
231 | if ( devmask & ( 1 << SOUND_MIXER_IGAIN ) ) _channels.insert( "RecInputGain", SOUND_MIXER_IGAIN ); | 230 | if ( devmask & ( 1 << SOUND_MIXER_IGAIN ) ) _channels.insert( "RecInputGain", SOUND_MIXER_IGAIN ); |
232 | if ( devmask & ( 1 << SOUND_MIXER_OGAIN ) ) _channels.insert( "RecOutputGain", SOUND_MIXER_OGAIN ); | 231 | if ( devmask & ( 1 << SOUND_MIXER_OGAIN ) ) _channels.insert( "RecOutputGain", SOUND_MIXER_OGAIN ); |
233 | //odebug << "recmask available and constructed." << oendl; | 232 | //odebug << "recmask available and constructed." << oendl; |
234 | } | 233 | } |
235 | 234 | ||
236 | /* ChannelIterator it; | 235 | /* ChannelIterator it; |
237 | for ( it = _channels.begin(); it != _channels.end(); ++it ) | 236 | for ( it = _channels.begin(); it != _channels.end(); ++it ) |
238 | { | 237 | { |
239 | qDebug( "Channel %s available (bit %d)", (const char*) it.key(), it.data() ); | 238 | qDebug( "Channel %s available (bit %d)", (const char*) it.key(), it.data() ); |
240 | qDebug( " +--- Volume: %02d | %02d", volume( it.key() ) & 0xff, volume( it.key() ) >> 8 ); | 239 | qDebug( " +--- Volume: %02d | %02d", volume( it.key() ) & 0xff, volume( it.key() ) >> 8 ); |
241 | } | 240 | } |
242 | */ | 241 | */ |
243 | } | 242 | } |
244 | 243 | ||
245 | QStringList OMixerInterface::allChannels() const | 244 | QStringList OMixerInterface::allChannels() const |
246 | { | 245 | { |
247 | ChannelIterator it = _channels.begin(); | 246 | ChannelIterator it = _channels.begin(); |
248 | QStringList channels; | 247 | QStringList channels; |
249 | while ( it != _channels.end() ) | 248 | while ( it != _channels.end() ) |
250 | { | 249 | { |
251 | channels += it.key(); | 250 | channels += it.key(); |
252 | it++; | 251 | it++; |
253 | } | 252 | } |
254 | return channels; | 253 | return channels; |
255 | } | 254 | } |
256 | 255 | ||
257 | 256 | ||
258 | QStringList OMixerInterface::recChannels() const | 257 | QStringList OMixerInterface::recChannels() const |
259 | { | 258 | { |
260 | owarn << "NYI" << oendl; | 259 | owarn << "NYI" << oendl; |
261 | } | 260 | } |
262 | 261 | ||
263 | 262 | ||
264 | QStringList OMixerInterface::playChannels() const | 263 | QStringList OMixerInterface::playChannels() const |
265 | { | 264 | { |
266 | owarn << "NYI" << oendl; | 265 | owarn << "NYI" << oendl; |
267 | } | 266 | } |
268 | 267 | ||
269 | 268 | ||
270 | bool OMixerInterface::hasChannel( const QString& channel ) | 269 | bool OMixerInterface::hasChannel( const QString& channel ) |
271 | { | 270 | { |
272 | return _channels.contains( channel ); | 271 | return _channels.contains( channel ); |
273 | } | 272 | } |
274 | 273 | ||
275 | 274 | ||
276 | void OMixerInterface::setVolume( const QString& channel, int left, int right ) | 275 | void OMixerInterface::setVolume( const QString& channel, int left, int right ) |
277 | { | 276 | { |
278 | int volume = left; | 277 | int volume = left; |
279 | volume |= ( right == -1 ) ? left << 8 : right << 8; | 278 | volume |= ( right == -1 ) ? left << 8 : right << 8; |
280 | 279 | ||
281 | if ( _channels.contains( channel ) ) | 280 | if ( _channels.contains( channel ) ) |
282 | { | 281 | { |
283 | int result = ioctl( _fd, MIXER_WRITE( _channels[channel] ), &volume ); | 282 | int result = ioctl( _fd, MIXER_WRITE( _channels[channel] ), &volume ); |
284 | if ( result == -1 ) | 283 | if ( result == -1 ) |
285 | { | 284 | { |
286 | owarn << "Can't set volume: " << strerror( errno ) << oendl; | 285 | owarn << "Can't set volume: " << strerror( errno ) << oendl; |
287 | } | 286 | } |
288 | else | 287 | else |
289 | { | 288 | { |
290 | if ( result & 0xff != left ) | 289 | if ( result & 0xff != left ) |
291 | { | 290 | { |
292 | owarn << "Device adjusted volume from " << left << " to " << (result & 0xff) << oendl; | 291 | owarn << "Device adjusted volume from " << left << " to " << (result & 0xff) << oendl; |
293 | } | 292 | } |
294 | } | 293 | } |
295 | } | 294 | } |
296 | } | 295 | } |
297 | 296 | ||
298 | 297 | ||
299 | int OMixerInterface::volume( const QString& channel ) const | 298 | int OMixerInterface::volume( const QString& channel ) const |
300 | { | 299 | { |
301 | int volume; | 300 | int volume; |
302 | 301 | ||
303 | if ( _channels.contains( channel ) ) | 302 | if ( _channels.contains( channel ) ) |
304 | { | 303 | { |
305 | if ( ioctl( _fd, MIXER_READ( _channels[channel] ), &volume ) == -1 ) | 304 | if ( ioctl( _fd, MIXER_READ( _channels[channel] ), &volume ) == -1 ) |
306 | { | 305 | { |
307 | owarn << "Can't get volume: " << strerror( errno ) << oendl; | 306 | owarn << "Can't get volume: " << strerror( errno ) << oendl; |
308 | } | 307 | } |
309 | else return volume; | 308 | else return volume; |
310 | } | 309 | } |
311 | return -1; | 310 | return -1; |
312 | } | 311 | } |
313 | 312 | ||
314 | 313 | ||
diff --git a/libopie2/opienet/omanufacturerdb.cpp b/libopie2/opienet/omanufacturerdb.cpp index 2da549c..b93b752 100644 --- a/libopie2/opienet/omanufacturerdb.cpp +++ b/libopie2/opienet/omanufacturerdb.cpp | |||
@@ -1,136 +1,135 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | (C) 2003 Michael 'Mickey' Lauer <mickey@Vanille.de> | 3 | (C) 2003 Michael 'Mickey' Lauer <mickey@Vanille.de> |
4 | =. | 4 | =. |
5 | .=l. | 5 | .=l. |
6 | .>+-= | 6 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 7 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 8 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 11 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 12 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | 28 | ||
29 | */ | 29 | */ |
30 | 30 | ||
31 | #include "omanufacturerdb.h" | 31 | #include "omanufacturerdb.h" |
32 | 32 | ||
33 | #define OPIE_IMPROVE_GUI_LATENCY 1 | 33 | #define OPIE_IMPROVE_GUI_LATENCY 1 |
34 | 34 | ||
35 | /* OPIE */ | 35 | /* OPIE */ |
36 | #include <opie2/odebug.h> | 36 | #include <opie2/odebug.h> |
37 | #ifdef OPIE_IMPROVE_GUI_LATENCY | 37 | #ifdef OPIE_IMPROVE_GUI_LATENCY |
38 | #include <qpe/global.h> | 38 | #include <qpe/global.h> |
39 | #endif | 39 | #endif |
40 | 40 | ||
41 | /* QT */ | 41 | /* QT */ |
42 | #include <qapplication.h> | 42 | #include <qapplication.h> |
43 | #include <qstring.h> | ||
44 | #include <qfile.h> | 43 | #include <qfile.h> |
45 | #include <qtextstream.h> | 44 | #include <qtextstream.h> |
46 | 45 | ||
47 | OManufacturerDB* OManufacturerDB::_instance = 0; | 46 | OManufacturerDB* OManufacturerDB::_instance = 0; |
48 | 47 | ||
49 | OManufacturerDB* OManufacturerDB::instance() | 48 | OManufacturerDB* OManufacturerDB::instance() |
50 | { | 49 | { |
51 | if ( !OManufacturerDB::_instance ) | 50 | if ( !OManufacturerDB::_instance ) |
52 | { | 51 | { |
53 | odebug << "OManufacturerDB::instance(): creating OManufacturerDB..." << oendl; | 52 | odebug << "OManufacturerDB::instance(): creating OManufacturerDB..." << oendl; |
54 | _instance = new OManufacturerDB(); | 53 | _instance = new OManufacturerDB(); |
55 | } | 54 | } |
56 | return _instance; | 55 | return _instance; |
57 | } | 56 | } |
58 | 57 | ||
59 | 58 | ||
60 | OManufacturerDB::OManufacturerDB() | 59 | OManufacturerDB::OManufacturerDB() |
61 | { | 60 | { |
62 | #ifdef OPIE_IMPROVE_GUI_LATENCY | 61 | #ifdef OPIE_IMPROVE_GUI_LATENCY |
63 | Global::statusMessage( "Reading Manufacturers..." ); | 62 | Global::statusMessage( "Reading Manufacturers..." ); |
64 | #endif | 63 | #endif |
65 | QString filename( "/etc/manufacturers" ); | 64 | QString filename( "/etc/manufacturers" ); |
66 | odebug << "OManufacturerDB: trying to read " << filename << oendl; | 65 | odebug << "OManufacturerDB: trying to read " << filename << oendl; |
67 | if ( !QFile::exists( filename ) ) | 66 | if ( !QFile::exists( filename ) ) |
68 | { | 67 | { |
69 | filename = "/opt/QtPalmtop/etc/manufacturers"; | 68 | filename = "/opt/QtPalmtop/etc/manufacturers"; |
70 | odebug << "OManufacturerDB: trying to read " << filename << oendl; | 69 | odebug << "OManufacturerDB: trying to read " << filename << oendl; |
71 | if ( !QFile::exists( filename ) ) | 70 | if ( !QFile::exists( filename ) ) |
72 | { | 71 | { |
73 | filename = "/usr/share/wellenreiter/manufacturers"; | 72 | filename = "/usr/share/wellenreiter/manufacturers"; |
74 | odebug << "OManufacturerDB: trying to read " << filename << oendl; | 73 | odebug << "OManufacturerDB: trying to read " << filename << oendl; |
75 | } | 74 | } |
76 | } | 75 | } |
77 | 76 | ||
78 | QFile file( filename ); | 77 | QFile file( filename ); |
79 | bool hasFile = file.open( IO_ReadOnly ); | 78 | bool hasFile = file.open( IO_ReadOnly ); |
80 | if (!hasFile) | 79 | if (!hasFile) |
81 | { | 80 | { |
82 | owarn << "OManufacturerDB: no valid manufacturer list found." << oendl; | 81 | owarn << "OManufacturerDB: no valid manufacturer list found." << oendl; |
83 | } | 82 | } |
84 | else | 83 | else |
85 | { | 84 | { |
86 | odebug << "OManufacturerDB: found manufacturer list in " << filename << oendl; | 85 | odebug << "OManufacturerDB: found manufacturer list in " << filename << oendl; |
87 | QTextStream s( &file ); | 86 | QTextStream s( &file ); |
88 | QString addr; | 87 | QString addr; |
89 | QString manu; | 88 | QString manu; |
90 | QString extManu; | 89 | QString extManu; |
91 | #ifdef OPIE_IMPROVE_GUI_LATENCY | 90 | #ifdef OPIE_IMPROVE_GUI_LATENCY |
92 | int counter = 0; | 91 | int counter = 0; |
93 | #endif | 92 | #endif |
94 | while (!s.atEnd()) | 93 | while (!s.atEnd()) |
95 | { | 94 | { |
96 | s >> addr; | 95 | s >> addr; |
97 | s >> manu; | 96 | s >> manu; |
98 | s >> extManu; | 97 | s >> extManu; |
99 | 98 | ||
100 | manufacturers.insert( addr, manu ); | 99 | manufacturers.insert( addr, manu ); |
101 | manufacturersExt.insert( addr, extManu ); | 100 | manufacturersExt.insert( addr, extManu ); |
102 | // odebug << "OmanufacturerDB: parse '" << addr << "' as '" << manu << "' (" << extManu << ")" << oendl; | 101 | // odebug << "OmanufacturerDB: parse '" << addr << "' as '" << manu << "' (" << extManu << ")" << oendl; |
103 | #ifdef OPIE_IMPROVE_GUI_LATENCY | 102 | #ifdef OPIE_IMPROVE_GUI_LATENCY |
104 | counter++; | 103 | counter++; |
105 | if ( counter == 50 ) | 104 | if ( counter == 50 ) |
106 | { | 105 | { |
107 | qApp->processEvents(); | 106 | qApp->processEvents(); |
108 | counter = 0; | 107 | counter = 0; |
109 | } | 108 | } |
110 | #endif | 109 | #endif |
111 | } | 110 | } |
112 | odebug << "OManufacturerDB: manufacturer list completed." << oendl; | 111 | odebug << "OManufacturerDB: manufacturer list completed." << oendl; |
113 | #ifdef OPIE_IMPROVE_GUI_LATENCY | 112 | #ifdef OPIE_IMPROVE_GUI_LATENCY |
114 | Global::statusMessage( "Manufacturers Complete..." ); | 113 | Global::statusMessage( "Manufacturers Complete..." ); |
115 | #endif | 114 | #endif |
116 | } | 115 | } |
117 | } | 116 | } |
118 | 117 | ||
119 | 118 | ||
120 | OManufacturerDB::~OManufacturerDB() | 119 | OManufacturerDB::~OManufacturerDB() |
121 | { | 120 | { |
122 | } | 121 | } |
123 | 122 | ||
124 | 123 | ||
125 | const QString& OManufacturerDB::lookup( const QString& macaddr ) const | 124 | const QString& OManufacturerDB::lookup( const QString& macaddr ) const |
126 | { | 125 | { |
127 | return manufacturers[macaddr.upper().left(8)]; | 126 | return manufacturers[macaddr.upper().left(8)]; |
128 | } | 127 | } |
129 | 128 | ||
130 | 129 | ||
131 | const QString& OManufacturerDB::lookupExt( const QString& macaddr ) const | 130 | const QString& OManufacturerDB::lookupExt( const QString& macaddr ) const |
132 | { | 131 | { |
133 | QMap<QString,QString>::ConstIterator it = manufacturersExt.find( macaddr.upper().left(8) ); | 132 | QMap<QString,QString>::ConstIterator it = manufacturersExt.find( macaddr.upper().left(8) ); |
134 | return it == manufacturersExt.end() ? lookup( macaddr ) : *it; | 133 | return it == manufacturersExt.end() ? lookup( macaddr ) : *it; |
135 | } | 134 | } |
136 | 135 | ||
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp index 0adba68..5d92b8f 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp +++ b/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp | |||
@@ -1,751 +1,749 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) Stefan Eilers (Eilers.Stefan@epost.de) | 3 | Copyright (C) Stefan Eilers (Eilers.Stefan@epost.de) |
4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> | 4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> |
5 | .=l. | 5 | .=l. |
6 | .>+-= | 6 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 7 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 8 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 11 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 12 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | /* | 29 | /* |
30 | * XML Backend for the OPIE-Contact Database. | 30 | * XML Backend for the OPIE-Contact Database. |
31 | */ | 31 | */ |
32 | 32 | ||
33 | #include <opie2/ocontactaccessbackend_xml.h> | 33 | #include <opie2/ocontactaccessbackend_xml.h> |
34 | 34 | ||
35 | #include <qasciidict.h> | 35 | #include <qasciidict.h> |
36 | #include <qdatetime.h> | ||
37 | #include <qfile.h> | 36 | #include <qfile.h> |
38 | #include <qfileinfo.h> | 37 | #include <qfileinfo.h> |
39 | #include <qregexp.h> | 38 | #include <qregexp.h> |
40 | #include <qarray.h> | 39 | #include <qarray.h> |
41 | #include <qmap.h> | 40 | #include <qmap.h> |
42 | #include <qdatetime.h> | ||
43 | 41 | ||
44 | #include <qpe/global.h> | 42 | #include <qpe/global.h> |
45 | 43 | ||
46 | #include <opie2/xmltree.h> | 44 | #include <opie2/xmltree.h> |
47 | #include <opie2/ocontactaccessbackend.h> | 45 | #include <opie2/ocontactaccessbackend.h> |
48 | #include <opie2/ocontactaccess.h> | 46 | #include <opie2/ocontactaccess.h> |
49 | 47 | ||
50 | #include <stdlib.h> | 48 | #include <stdlib.h> |
51 | #include <errno.h> | 49 | #include <errno.h> |
52 | 50 | ||
53 | using namespace Opie; | 51 | using namespace Opie; |
54 | 52 | ||
55 | 53 | ||
56 | namespace Opie { | 54 | namespace Opie { |
57 | OPimContactAccessBackend_XML::OPimContactAccessBackend_XML ( const QString& appname, const QString& filename ): | 55 | OPimContactAccessBackend_XML::OPimContactAccessBackend_XML ( const QString& appname, const QString& filename ): |
58 | m_changed( false ) | 56 | m_changed( false ) |
59 | { | 57 | { |
60 | // Just m_contactlist should call delete if an entry | 58 | // Just m_contactlist should call delete if an entry |
61 | // is removed. | 59 | // is removed. |
62 | m_contactList.setAutoDelete( true ); | 60 | m_contactList.setAutoDelete( true ); |
63 | m_uidToContact.setAutoDelete( false ); | 61 | m_uidToContact.setAutoDelete( false ); |
64 | 62 | ||
65 | m_appName = appname; | 63 | m_appName = appname; |
66 | 64 | ||
67 | /* Set journalfile name ... */ | 65 | /* Set journalfile name ... */ |
68 | m_journalName = getenv("HOME"); | 66 | m_journalName = getenv("HOME"); |
69 | m_journalName +="/.abjournal" + appname; | 67 | m_journalName +="/.abjournal" + appname; |
70 | 68 | ||
71 | /* Expecting to access the default filename if nothing else is set */ | 69 | /* Expecting to access the default filename if nothing else is set */ |
72 | if ( filename.isEmpty() ){ | 70 | if ( filename.isEmpty() ){ |
73 | m_fileName = Global::applicationFileName( "addressbook","addressbook.xml" ); | 71 | m_fileName = Global::applicationFileName( "addressbook","addressbook.xml" ); |
74 | } else | 72 | } else |
75 | m_fileName = filename; | 73 | m_fileName = filename; |
76 | 74 | ||
77 | /* Load Database now */ | 75 | /* Load Database now */ |
78 | load (); | 76 | load (); |
79 | } | 77 | } |
80 | 78 | ||
81 | bool OPimContactAccessBackend_XML::save() | 79 | bool OPimContactAccessBackend_XML::save() |
82 | { | 80 | { |
83 | 81 | ||
84 | if ( !m_changed ) | 82 | if ( !m_changed ) |
85 | return true; | 83 | return true; |
86 | 84 | ||
87 | QString strNewFile = m_fileName + ".new"; | 85 | QString strNewFile = m_fileName + ".new"; |
88 | QFile f( strNewFile ); | 86 | QFile f( strNewFile ); |
89 | if ( !f.open( IO_WriteOnly|IO_Raw ) ) | 87 | if ( !f.open( IO_WriteOnly|IO_Raw ) ) |
90 | return false; | 88 | return false; |
91 | 89 | ||
92 | int total_written; | 90 | int total_written; |
93 | int idx_offset = 0; | 91 | int idx_offset = 0; |
94 | QString out; | 92 | QString out; |
95 | 93 | ||
96 | // Write Header | 94 | // Write Header |
97 | out = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE Addressbook ><AddressBook>\n" | 95 | out = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE Addressbook ><AddressBook>\n" |
98 | " <Groups>\n" | 96 | " <Groups>\n" |
99 | " </Groups>\n" | 97 | " </Groups>\n" |
100 | " <Contacts>\n"; | 98 | " <Contacts>\n"; |
101 | QCString cstr = out.utf8(); | 99 | QCString cstr = out.utf8(); |
102 | f.writeBlock( cstr.data(), cstr.length() ); | 100 | f.writeBlock( cstr.data(), cstr.length() ); |
103 | idx_offset += cstr.length(); | 101 | idx_offset += cstr.length(); |
104 | out = ""; | 102 | out = ""; |
105 | 103 | ||
106 | // Write all contacts | 104 | // Write all contacts |
107 | QListIterator<OPimContact> it( m_contactList ); | 105 | QListIterator<OPimContact> it( m_contactList ); |
108 | for ( ; it.current(); ++it ) { | 106 | for ( ; it.current(); ++it ) { |
109 | // qWarning(" Uid %d at Offset: %x", (*it)->uid(), idx_offset ); | 107 | // qWarning(" Uid %d at Offset: %x", (*it)->uid(), idx_offset ); |
110 | out += "<Contact "; | 108 | out += "<Contact "; |
111 | (*it)->save( out ); | 109 | (*it)->save( out ); |
112 | out += "/>\n"; | 110 | out += "/>\n"; |
113 | cstr = out.utf8(); | 111 | cstr = out.utf8(); |
114 | total_written = f.writeBlock( cstr.data(), cstr.length() ); | 112 | total_written = f.writeBlock( cstr.data(), cstr.length() ); |
115 | idx_offset += cstr.length(); | 113 | idx_offset += cstr.length(); |
116 | if ( total_written != int(cstr.length()) ) { | 114 | if ( total_written != int(cstr.length()) ) { |
117 | f.close(); | 115 | f.close(); |
118 | QFile::remove( strNewFile ); | 116 | QFile::remove( strNewFile ); |
119 | return false; | 117 | return false; |
120 | } | 118 | } |
121 | out = ""; | 119 | out = ""; |
122 | } | 120 | } |
123 | out += " </Contacts>\n</AddressBook>\n"; | 121 | out += " </Contacts>\n</AddressBook>\n"; |
124 | 122 | ||
125 | // Write Footer | 123 | // Write Footer |
126 | cstr = out.utf8(); | 124 | cstr = out.utf8(); |
127 | total_written = f.writeBlock( cstr.data(), cstr.length() ); | 125 | total_written = f.writeBlock( cstr.data(), cstr.length() ); |
128 | if ( total_written != int( cstr.length() ) ) { | 126 | if ( total_written != int( cstr.length() ) ) { |
129 | f.close(); | 127 | f.close(); |
130 | QFile::remove( strNewFile ); | 128 | QFile::remove( strNewFile ); |
131 | return false; | 129 | return false; |
132 | } | 130 | } |
133 | f.close(); | 131 | f.close(); |
134 | 132 | ||
135 | // move the file over, I'm just going to use the system call | 133 | // move the file over, I'm just going to use the system call |
136 | // because, I don't feel like using QDir. | 134 | // because, I don't feel like using QDir. |
137 | if ( ::rename( strNewFile.latin1(), m_fileName.latin1() ) < 0 ) { | 135 | if ( ::rename( strNewFile.latin1(), m_fileName.latin1() ) < 0 ) { |
138 | qWarning( "problem renaming file %s to %s, errno: %d", | 136 | qWarning( "problem renaming file %s to %s, errno: %d", |
139 | strNewFile.latin1(), m_journalName.latin1(), errno ); | 137 | strNewFile.latin1(), m_journalName.latin1(), errno ); |
140 | // remove the tmp file... | 138 | // remove the tmp file... |
141 | QFile::remove( strNewFile ); | 139 | QFile::remove( strNewFile ); |
142 | } | 140 | } |
143 | 141 | ||
144 | /* The journalfile should be removed now... */ | 142 | /* The journalfile should be removed now... */ |
145 | removeJournal(); | 143 | removeJournal(); |
146 | 144 | ||
147 | m_changed = false; | 145 | m_changed = false; |
148 | return true; | 146 | return true; |
149 | } | 147 | } |
150 | 148 | ||
151 | bool OPimContactAccessBackend_XML::load () | 149 | bool OPimContactAccessBackend_XML::load () |
152 | { | 150 | { |
153 | m_contactList.clear(); | 151 | m_contactList.clear(); |
154 | m_uidToContact.clear(); | 152 | m_uidToContact.clear(); |
155 | 153 | ||
156 | /* Load XML-File and journal if it exists */ | 154 | /* Load XML-File and journal if it exists */ |
157 | if ( !load ( m_fileName, false ) ) | 155 | if ( !load ( m_fileName, false ) ) |
158 | return false; | 156 | return false; |
159 | /* The returncode of the journalfile is ignored due to the | 157 | /* The returncode of the journalfile is ignored due to the |
160 | * fact that it does not exist when this class is instantiated ! | 158 | * fact that it does not exist when this class is instantiated ! |
161 | * But there may such a file exist, if the application crashed. | 159 | * But there may such a file exist, if the application crashed. |
162 | * Therefore we try to load it to get the changes before the # | 160 | * Therefore we try to load it to get the changes before the # |
163 | * crash happened... | 161 | * crash happened... |
164 | */ | 162 | */ |
165 | load (m_journalName, true); | 163 | load (m_journalName, true); |
166 | 164 | ||
167 | return true; | 165 | return true; |
168 | } | 166 | } |
169 | 167 | ||
170 | void OPimContactAccessBackend_XML::clear () | 168 | void OPimContactAccessBackend_XML::clear () |
171 | { | 169 | { |
172 | m_contactList.clear(); | 170 | m_contactList.clear(); |
173 | m_uidToContact.clear(); | 171 | m_uidToContact.clear(); |
174 | 172 | ||
175 | m_changed = false; | 173 | m_changed = false; |
176 | } | 174 | } |
177 | 175 | ||
178 | bool OPimContactAccessBackend_XML::wasChangedExternally() | 176 | bool OPimContactAccessBackend_XML::wasChangedExternally() |
179 | { | 177 | { |
180 | QFileInfo fi( m_fileName ); | 178 | QFileInfo fi( m_fileName ); |
181 | 179 | ||
182 | QDateTime lastmod = fi.lastModified (); | 180 | QDateTime lastmod = fi.lastModified (); |
183 | 181 | ||
184 | return (lastmod != m_readtime); | 182 | return (lastmod != m_readtime); |
185 | } | 183 | } |
186 | 184 | ||
187 | QArray<int> OPimContactAccessBackend_XML::allRecords() const | 185 | QArray<int> OPimContactAccessBackend_XML::allRecords() const |
188 | { | 186 | { |
189 | QArray<int> uid_list( m_contactList.count() ); | 187 | QArray<int> uid_list( m_contactList.count() ); |
190 | 188 | ||
191 | uint counter = 0; | 189 | uint counter = 0; |
192 | QListIterator<OPimContact> it( m_contactList ); | 190 | QListIterator<OPimContact> it( m_contactList ); |
193 | for( ; it.current(); ++it ){ | 191 | for( ; it.current(); ++it ){ |
194 | uid_list[counter++] = (*it)->uid(); | 192 | uid_list[counter++] = (*it)->uid(); |
195 | } | 193 | } |
196 | 194 | ||
197 | return ( uid_list ); | 195 | return ( uid_list ); |
198 | } | 196 | } |
199 | 197 | ||
200 | OPimContact OPimContactAccessBackend_XML::find ( int uid ) const | 198 | OPimContact OPimContactAccessBackend_XML::find ( int uid ) const |
201 | { | 199 | { |
202 | OPimContact foundContact; //Create empty contact | 200 | OPimContact foundContact; //Create empty contact |
203 | 201 | ||
204 | OPimContact* found = m_uidToContact.find( QString().setNum( uid ) ); | 202 | OPimContact* found = m_uidToContact.find( QString().setNum( uid ) ); |
205 | 203 | ||
206 | if ( found ){ | 204 | if ( found ){ |
207 | foundContact = *found; | 205 | foundContact = *found; |
208 | } | 206 | } |
209 | 207 | ||
210 | return ( foundContact ); | 208 | return ( foundContact ); |
211 | } | 209 | } |
212 | 210 | ||
213 | QArray<int> OPimContactAccessBackend_XML::queryByExample ( const OPimContact &query, int settings, | 211 | QArray<int> OPimContactAccessBackend_XML::queryByExample ( const OPimContact &query, int settings, |
214 | const QDateTime& d ) | 212 | const QDateTime& d ) |
215 | { | 213 | { |
216 | 214 | ||
217 | QArray<int> m_currentQuery( m_contactList.count() ); | 215 | QArray<int> m_currentQuery( m_contactList.count() ); |
218 | QListIterator<OPimContact> it( m_contactList ); | 216 | QListIterator<OPimContact> it( m_contactList ); |
219 | uint arraycounter = 0; | 217 | uint arraycounter = 0; |
220 | 218 | ||
221 | for( ; it.current(); ++it ){ | 219 | for( ; it.current(); ++it ){ |
222 | /* Search all fields and compare them with query object. Store them into list | 220 | /* Search all fields and compare them with query object. Store them into list |
223 | * if all fields matches. | 221 | * if all fields matches. |
224 | */ | 222 | */ |
225 | QDate* queryDate = 0l; | 223 | QDate* queryDate = 0l; |
226 | QDate* checkDate = 0l; | 224 | QDate* checkDate = 0l; |
227 | bool allcorrect = true; | 225 | bool allcorrect = true; |
228 | for ( int i = 0; i < Qtopia::Groups; i++ ) { | 226 | for ( int i = 0; i < Qtopia::Groups; i++ ) { |
229 | // Birthday and anniversary are special nonstring fields and should | 227 | // Birthday and anniversary are special nonstring fields and should |
230 | // be handled specially | 228 | // be handled specially |
231 | switch ( i ){ | 229 | switch ( i ){ |
232 | case Qtopia::Birthday: | 230 | case Qtopia::Birthday: |
233 | queryDate = new QDate( query.birthday() ); | 231 | queryDate = new QDate( query.birthday() ); |
234 | checkDate = new QDate( (*it)->birthday() ); | 232 | checkDate = new QDate( (*it)->birthday() ); |
235 | case Qtopia::Anniversary: | 233 | case Qtopia::Anniversary: |
236 | if ( queryDate == 0l ){ | 234 | if ( queryDate == 0l ){ |
237 | queryDate = new QDate( query.anniversary() ); | 235 | queryDate = new QDate( query.anniversary() ); |
238 | checkDate = new QDate( (*it)->anniversary() ); | 236 | checkDate = new QDate( (*it)->anniversary() ); |
239 | } | 237 | } |
240 | 238 | ||
241 | if ( queryDate->isValid() ){ | 239 | if ( queryDate->isValid() ){ |
242 | if( checkDate->isValid() ){ | 240 | if( checkDate->isValid() ){ |
243 | if ( settings & OPimContactAccess::DateYear ){ | 241 | if ( settings & OPimContactAccess::DateYear ){ |
244 | if ( queryDate->year() != checkDate->year() ) | 242 | if ( queryDate->year() != checkDate->year() ) |
245 | allcorrect = false; | 243 | allcorrect = false; |
246 | } | 244 | } |
247 | if ( settings & OPimContactAccess::DateMonth ){ | 245 | if ( settings & OPimContactAccess::DateMonth ){ |
248 | if ( queryDate->month() != checkDate->month() ) | 246 | if ( queryDate->month() != checkDate->month() ) |
249 | allcorrect = false; | 247 | allcorrect = false; |
250 | } | 248 | } |
251 | if ( settings & OPimContactAccess::DateDay ){ | 249 | if ( settings & OPimContactAccess::DateDay ){ |
252 | if ( queryDate->day() != checkDate->day() ) | 250 | if ( queryDate->day() != checkDate->day() ) |
253 | allcorrect = false; | 251 | allcorrect = false; |
254 | } | 252 | } |
255 | if ( settings & OPimContactAccess::DateDiff ) { | 253 | if ( settings & OPimContactAccess::DateDiff ) { |
256 | QDate current; | 254 | QDate current; |
257 | // If we get an additional date, we | 255 | // If we get an additional date, we |
258 | // will take this date instead of | 256 | // will take this date instead of |
259 | // the current one.. | 257 | // the current one.. |
260 | if ( !d.date().isValid() ) | 258 | if ( !d.date().isValid() ) |
261 | current = QDate::currentDate(); | 259 | current = QDate::currentDate(); |
262 | else | 260 | else |
263 | current = d.date(); | 261 | current = d.date(); |
264 | 262 | ||
265 | // We have to equalize the year, otherwise | 263 | // We have to equalize the year, otherwise |
266 | // the search will fail.. | 264 | // the search will fail.. |
267 | checkDate->setYMD( current.year(), | 265 | checkDate->setYMD( current.year(), |
268 | checkDate->month(), | 266 | checkDate->month(), |
269 | checkDate->day() ); | 267 | checkDate->day() ); |
270 | if ( *checkDate < current ) | 268 | if ( *checkDate < current ) |
271 | checkDate->setYMD( current.year()+1, | 269 | checkDate->setYMD( current.year()+1, |
272 | checkDate->month(), | 270 | checkDate->month(), |
273 | checkDate->day() ); | 271 | checkDate->day() ); |
274 | 272 | ||
275 | // Check whether the birthday/anniversary date is between | 273 | // Check whether the birthday/anniversary date is between |
276 | // the current/given date and the maximum date | 274 | // the current/given date and the maximum date |
277 | // ( maximum time range ) ! | 275 | // ( maximum time range ) ! |
278 | qWarning("Checking if %s is between %s and %s ! ", | 276 | qWarning("Checking if %s is between %s and %s ! ", |
279 | checkDate->toString().latin1(), | 277 | checkDate->toString().latin1(), |
280 | current.toString().latin1(), | 278 | current.toString().latin1(), |
281 | queryDate->toString().latin1() ); | 279 | queryDate->toString().latin1() ); |
282 | if ( current.daysTo( *queryDate ) >= 0 ){ | 280 | if ( current.daysTo( *queryDate ) >= 0 ){ |
283 | if ( !( ( *checkDate >= current ) && | 281 | if ( !( ( *checkDate >= current ) && |
284 | ( *checkDate <= *queryDate ) ) ){ | 282 | ( *checkDate <= *queryDate ) ) ){ |
285 | allcorrect = false; | 283 | allcorrect = false; |
286 | qWarning (" Nope!.."); | 284 | qWarning (" Nope!.."); |
287 | } | 285 | } |
288 | } | 286 | } |
289 | } | 287 | } |
290 | } else{ | 288 | } else{ |
291 | // checkDate is invalid. Therefore this entry is always rejected | 289 | // checkDate is invalid. Therefore this entry is always rejected |
292 | allcorrect = false; | 290 | allcorrect = false; |
293 | } | 291 | } |
294 | } | 292 | } |
295 | 293 | ||
296 | delete queryDate; | 294 | delete queryDate; |
297 | queryDate = 0l; | 295 | queryDate = 0l; |
298 | delete checkDate; | 296 | delete checkDate; |
299 | checkDate = 0l; | 297 | checkDate = 0l; |
300 | break; | 298 | break; |
301 | default: | 299 | default: |
302 | /* Just compare fields which are not empty in the query object */ | 300 | /* Just compare fields which are not empty in the query object */ |
303 | if ( !query.field(i).isEmpty() ){ | 301 | if ( !query.field(i).isEmpty() ){ |
304 | switch ( settings & ~( OPimContactAccess::IgnoreCase | 302 | switch ( settings & ~( OPimContactAccess::IgnoreCase |
305 | | OPimContactAccess::DateDiff | 303 | | OPimContactAccess::DateDiff |
306 | | OPimContactAccess::DateYear | 304 | | OPimContactAccess::DateYear |
307 | | OPimContactAccess::DateMonth | 305 | | OPimContactAccess::DateMonth |
308 | | OPimContactAccess::DateDay | 306 | | OPimContactAccess::DateDay |
309 | | OPimContactAccess::MatchOne | 307 | | OPimContactAccess::MatchOne |
310 | ) ){ | 308 | ) ){ |
311 | 309 | ||
312 | case OPimContactAccess::RegExp:{ | 310 | case OPimContactAccess::RegExp:{ |
313 | QRegExp expr ( query.field(i), | 311 | QRegExp expr ( query.field(i), |
314 | !(settings & OPimContactAccess::IgnoreCase), | 312 | !(settings & OPimContactAccess::IgnoreCase), |
315 | false ); | 313 | false ); |
316 | if ( expr.find ( (*it)->field(i), 0 ) == -1 ) | 314 | if ( expr.find ( (*it)->field(i), 0 ) == -1 ) |
317 | allcorrect = false; | 315 | allcorrect = false; |
318 | } | 316 | } |
319 | break; | 317 | break; |
320 | case OPimContactAccess::WildCards:{ | 318 | case OPimContactAccess::WildCards:{ |
321 | QRegExp expr ( query.field(i), | 319 | QRegExp expr ( query.field(i), |
322 | !(settings & OPimContactAccess::IgnoreCase), | 320 | !(settings & OPimContactAccess::IgnoreCase), |
323 | true ); | 321 | true ); |
324 | if ( expr.find ( (*it)->field(i), 0 ) == -1 ) | 322 | if ( expr.find ( (*it)->field(i), 0 ) == -1 ) |
325 | allcorrect = false; | 323 | allcorrect = false; |
326 | } | 324 | } |
327 | break; | 325 | break; |
328 | case OPimContactAccess::ExactMatch:{ | 326 | case OPimContactAccess::ExactMatch:{ |
329 | if (settings & OPimContactAccess::IgnoreCase){ | 327 | if (settings & OPimContactAccess::IgnoreCase){ |
330 | if ( query.field(i).upper() != | 328 | if ( query.field(i).upper() != |
331 | (*it)->field(i).upper() ) | 329 | (*it)->field(i).upper() ) |
332 | allcorrect = false; | 330 | allcorrect = false; |
333 | }else{ | 331 | }else{ |
334 | if ( query.field(i) != (*it)->field(i) ) | 332 | if ( query.field(i) != (*it)->field(i) ) |
335 | allcorrect = false; | 333 | allcorrect = false; |
336 | } | 334 | } |
337 | } | 335 | } |
338 | break; | 336 | break; |
339 | } | 337 | } |
340 | } | 338 | } |
341 | } | 339 | } |
342 | } | 340 | } |
343 | if ( allcorrect ){ | 341 | if ( allcorrect ){ |
344 | m_currentQuery[arraycounter++] = (*it)->uid(); | 342 | m_currentQuery[arraycounter++] = (*it)->uid(); |
345 | } | 343 | } |
346 | } | 344 | } |
347 | 345 | ||
348 | // Shrink to fit.. | 346 | // Shrink to fit.. |
349 | m_currentQuery.resize(arraycounter); | 347 | m_currentQuery.resize(arraycounter); |
350 | 348 | ||
351 | return m_currentQuery; | 349 | return m_currentQuery; |
352 | } | 350 | } |
353 | 351 | ||
354 | QArray<int> OPimContactAccessBackend_XML::matchRegexp( const QRegExp &r ) const | 352 | QArray<int> OPimContactAccessBackend_XML::matchRegexp( const QRegExp &r ) const |
355 | { | 353 | { |
356 | QArray<int> m_currentQuery( m_contactList.count() ); | 354 | QArray<int> m_currentQuery( m_contactList.count() ); |
357 | QListIterator<OPimContact> it( m_contactList ); | 355 | QListIterator<OPimContact> it( m_contactList ); |
358 | uint arraycounter = 0; | 356 | uint arraycounter = 0; |
359 | 357 | ||
360 | for( ; it.current(); ++it ){ | 358 | for( ; it.current(); ++it ){ |
361 | if ( (*it)->match( r ) ){ | 359 | if ( (*it)->match( r ) ){ |
362 | m_currentQuery[arraycounter++] = (*it)->uid(); | 360 | m_currentQuery[arraycounter++] = (*it)->uid(); |
363 | } | 361 | } |
364 | 362 | ||
365 | } | 363 | } |
366 | // Shrink to fit.. | 364 | // Shrink to fit.. |
367 | m_currentQuery.resize(arraycounter); | 365 | m_currentQuery.resize(arraycounter); |
368 | 366 | ||
369 | return m_currentQuery; | 367 | return m_currentQuery; |
370 | } | 368 | } |
371 | 369 | ||
372 | const uint OPimContactAccessBackend_XML::querySettings() | 370 | const uint OPimContactAccessBackend_XML::querySettings() |
373 | { | 371 | { |
374 | return ( OPimContactAccess::WildCards | 372 | return ( OPimContactAccess::WildCards |
375 | | OPimContactAccess::IgnoreCase | 373 | | OPimContactAccess::IgnoreCase |
376 | | OPimContactAccess::RegExp | 374 | | OPimContactAccess::RegExp |
377 | | OPimContactAccess::ExactMatch | 375 | | OPimContactAccess::ExactMatch |
378 | | OPimContactAccess::DateDiff | 376 | | OPimContactAccess::DateDiff |
379 | | OPimContactAccess::DateYear | 377 | | OPimContactAccess::DateYear |
380 | | OPimContactAccess::DateMonth | 378 | | OPimContactAccess::DateMonth |
381 | | OPimContactAccess::DateDay | 379 | | OPimContactAccess::DateDay |
382 | ); | 380 | ); |
383 | } | 381 | } |
384 | 382 | ||
385 | bool OPimContactAccessBackend_XML::hasQuerySettings (uint querySettings) const | 383 | bool OPimContactAccessBackend_XML::hasQuerySettings (uint querySettings) const |
386 | { | 384 | { |
387 | /* OPimContactAccess::IgnoreCase, DateDiff, DateYear, DateMonth, DateDay | 385 | /* OPimContactAccess::IgnoreCase, DateDiff, DateYear, DateMonth, DateDay |
388 | * may be added with any of the other settings. IgnoreCase should never used alone. | 386 | * may be added with any of the other settings. IgnoreCase should never used alone. |
389 | * Wildcards, RegExp, ExactMatch should never used at the same time... | 387 | * Wildcards, RegExp, ExactMatch should never used at the same time... |
390 | */ | 388 | */ |
391 | 389 | ||
392 | // Step 1: Check whether the given settings are supported by this backend | 390 | // Step 1: Check whether the given settings are supported by this backend |
393 | if ( ( querySettings & ( | 391 | if ( ( querySettings & ( |
394 | OPimContactAccess::IgnoreCase | 392 | OPimContactAccess::IgnoreCase |
395 | | OPimContactAccess::WildCards | 393 | | OPimContactAccess::WildCards |
396 | | OPimContactAccess::DateDiff | 394 | | OPimContactAccess::DateDiff |
397 | | OPimContactAccess::DateYear | 395 | | OPimContactAccess::DateYear |
398 | | OPimContactAccess::DateMonth | 396 | | OPimContactAccess::DateMonth |
399 | | OPimContactAccess::DateDay | 397 | | OPimContactAccess::DateDay |
400 | | OPimContactAccess::RegExp | 398 | | OPimContactAccess::RegExp |
401 | | OPimContactAccess::ExactMatch | 399 | | OPimContactAccess::ExactMatch |
402 | ) ) != querySettings ) | 400 | ) ) != querySettings ) |
403 | return false; | 401 | return false; |
404 | 402 | ||
405 | // Step 2: Check whether the given combinations are ok.. | 403 | // Step 2: Check whether the given combinations are ok.. |
406 | 404 | ||
407 | // IngoreCase alone is invalid | 405 | // IngoreCase alone is invalid |
408 | if ( querySettings == OPimContactAccess::IgnoreCase ) | 406 | if ( querySettings == OPimContactAccess::IgnoreCase ) |
409 | return false; | 407 | return false; |
410 | 408 | ||
411 | // WildCards, RegExp and ExactMatch should never used at the same time | 409 | // WildCards, RegExp and ExactMatch should never used at the same time |
412 | switch ( querySettings & ~( OPimContactAccess::IgnoreCase | 410 | switch ( querySettings & ~( OPimContactAccess::IgnoreCase |
413 | | OPimContactAccess::DateDiff | 411 | | OPimContactAccess::DateDiff |
414 | | OPimContactAccess::DateYear | 412 | | OPimContactAccess::DateYear |
415 | | OPimContactAccess::DateMonth | 413 | | OPimContactAccess::DateMonth |
416 | | OPimContactAccess::DateDay | 414 | | OPimContactAccess::DateDay |
417 | ) | 415 | ) |
418 | ){ | 416 | ){ |
419 | case OPimContactAccess::RegExp: | 417 | case OPimContactAccess::RegExp: |
420 | return ( true ); | 418 | return ( true ); |
421 | case OPimContactAccess::WildCards: | 419 | case OPimContactAccess::WildCards: |
422 | return ( true ); | 420 | return ( true ); |
423 | case OPimContactAccess::ExactMatch: | 421 | case OPimContactAccess::ExactMatch: |
424 | return ( true ); | 422 | return ( true ); |
425 | case 0: // one of the upper removed bits were set.. | 423 | case 0: // one of the upper removed bits were set.. |
426 | return ( true ); | 424 | return ( true ); |
427 | default: | 425 | default: |
428 | return ( false ); | 426 | return ( false ); |
429 | } | 427 | } |
430 | } | 428 | } |
431 | 429 | ||
432 | // Currently only asc implemented.. | 430 | // Currently only asc implemented.. |
433 | QArray<int> OPimContactAccessBackend_XML::sorted( bool asc, int , int , int ) | 431 | QArray<int> OPimContactAccessBackend_XML::sorted( bool asc, int , int , int ) |
434 | { | 432 | { |
435 | QMap<QString, int> nameToUid; | 433 | QMap<QString, int> nameToUid; |
436 | QStringList names; | 434 | QStringList names; |
437 | QArray<int> m_currentQuery( m_contactList.count() ); | 435 | QArray<int> m_currentQuery( m_contactList.count() ); |
438 | 436 | ||
439 | // First fill map and StringList with all Names | 437 | // First fill map and StringList with all Names |
440 | // Afterwards sort namelist and use map to fill array to return.. | 438 | // Afterwards sort namelist and use map to fill array to return.. |
441 | QListIterator<OPimContact> it( m_contactList ); | 439 | QListIterator<OPimContact> it( m_contactList ); |
442 | for( ; it.current(); ++it ){ | 440 | for( ; it.current(); ++it ){ |
443 | names.append( (*it)->fileAs() + QString::number( (*it)->uid() ) ); | 441 | names.append( (*it)->fileAs() + QString::number( (*it)->uid() ) ); |
444 | nameToUid.insert( (*it)->fileAs() + QString::number( (*it)->uid() ), (*it)->uid() ); | 442 | nameToUid.insert( (*it)->fileAs() + QString::number( (*it)->uid() ), (*it)->uid() ); |
445 | } | 443 | } |
446 | names.sort(); | 444 | names.sort(); |
447 | 445 | ||
448 | int i = 0; | 446 | int i = 0; |
449 | if ( asc ){ | 447 | if ( asc ){ |
450 | for ( QStringList::Iterator it = names.begin(); it != names.end(); ++it ) | 448 | for ( QStringList::Iterator it = names.begin(); it != names.end(); ++it ) |
451 | m_currentQuery[i++] = nameToUid[ (*it) ]; | 449 | m_currentQuery[i++] = nameToUid[ (*it) ]; |
452 | }else{ | 450 | }else{ |
453 | for ( QStringList::Iterator it = names.end(); it != names.begin(); --it ) | 451 | for ( QStringList::Iterator it = names.end(); it != names.begin(); --it ) |
454 | m_currentQuery[i++] = nameToUid[ (*it) ]; | 452 | m_currentQuery[i++] = nameToUid[ (*it) ]; |
455 | } | 453 | } |
456 | 454 | ||
457 | return m_currentQuery; | 455 | return m_currentQuery; |
458 | 456 | ||
459 | } | 457 | } |
460 | 458 | ||
461 | bool OPimContactAccessBackend_XML::add ( const OPimContact &newcontact ) | 459 | bool OPimContactAccessBackend_XML::add ( const OPimContact &newcontact ) |
462 | { | 460 | { |
463 | //qWarning("odefaultbackend: ACTION::ADD"); | 461 | //qWarning("odefaultbackend: ACTION::ADD"); |
464 | updateJournal (newcontact, ACTION_ADD); | 462 | updateJournal (newcontact, ACTION_ADD); |
465 | addContact_p( newcontact ); | 463 | addContact_p( newcontact ); |
466 | 464 | ||
467 | m_changed = true; | 465 | m_changed = true; |
468 | 466 | ||
469 | return true; | 467 | return true; |
470 | } | 468 | } |
471 | 469 | ||
472 | bool OPimContactAccessBackend_XML::replace ( const OPimContact &contact ) | 470 | bool OPimContactAccessBackend_XML::replace ( const OPimContact &contact ) |
473 | { | 471 | { |
474 | m_changed = true; | 472 | m_changed = true; |
475 | 473 | ||
476 | OPimContact* found = m_uidToContact.find ( QString().setNum( contact.uid() ) ); | 474 | OPimContact* found = m_uidToContact.find ( QString().setNum( contact.uid() ) ); |
477 | 475 | ||
478 | if ( found ) { | 476 | if ( found ) { |
479 | OPimContact* newCont = new OPimContact( contact ); | 477 | OPimContact* newCont = new OPimContact( contact ); |
480 | 478 | ||
481 | updateJournal ( *newCont, ACTION_REPLACE); | 479 | updateJournal ( *newCont, ACTION_REPLACE); |
482 | m_contactList.removeRef ( found ); | 480 | m_contactList.removeRef ( found ); |
483 | m_contactList.append ( newCont ); | 481 | m_contactList.append ( newCont ); |
484 | m_uidToContact.remove( QString().setNum( contact.uid() ) ); | 482 | m_uidToContact.remove( QString().setNum( contact.uid() ) ); |
485 | m_uidToContact.insert( QString().setNum( newCont->uid() ), newCont ); | 483 | m_uidToContact.insert( QString().setNum( newCont->uid() ), newCont ); |
486 | 484 | ||
487 | qWarning("Nur zur Sicherheit: %d == %d ?",contact.uid(), newCont->uid()); | 485 | qWarning("Nur zur Sicherheit: %d == %d ?",contact.uid(), newCont->uid()); |
488 | 486 | ||
489 | return true; | 487 | return true; |
490 | } else | 488 | } else |
491 | return false; | 489 | return false; |
492 | } | 490 | } |
493 | 491 | ||
494 | bool OPimContactAccessBackend_XML::remove ( int uid ) | 492 | bool OPimContactAccessBackend_XML::remove ( int uid ) |
495 | { | 493 | { |
496 | m_changed = true; | 494 | m_changed = true; |
497 | 495 | ||
498 | OPimContact* found = m_uidToContact.find ( QString().setNum( uid ) ); | 496 | OPimContact* found = m_uidToContact.find ( QString().setNum( uid ) ); |
499 | 497 | ||
500 | if ( found ) { | 498 | if ( found ) { |
501 | updateJournal ( *found, ACTION_REMOVE); | 499 | updateJournal ( *found, ACTION_REMOVE); |
502 | m_contactList.removeRef ( found ); | 500 | m_contactList.removeRef ( found ); |
503 | m_uidToContact.remove( QString().setNum( uid ) ); | 501 | m_uidToContact.remove( QString().setNum( uid ) ); |
504 | 502 | ||
505 | return true; | 503 | return true; |
506 | } else | 504 | } else |
507 | return false; | 505 | return false; |
508 | } | 506 | } |
509 | 507 | ||
510 | bool OPimContactAccessBackend_XML::reload(){ | 508 | bool OPimContactAccessBackend_XML::reload(){ |
511 | /* Reload is the same as load in this implementation */ | 509 | /* Reload is the same as load in this implementation */ |
512 | return ( load() ); | 510 | return ( load() ); |
513 | } | 511 | } |
514 | 512 | ||
515 | void OPimContactAccessBackend_XML::addContact_p( const OPimContact &newcontact ) | 513 | void OPimContactAccessBackend_XML::addContact_p( const OPimContact &newcontact ) |
516 | { | 514 | { |
517 | OPimContact* contRef = new OPimContact( newcontact ); | 515 | OPimContact* contRef = new OPimContact( newcontact ); |
518 | 516 | ||
519 | m_contactList.append ( contRef ); | 517 | m_contactList.append ( contRef ); |
520 | m_uidToContact.insert( QString().setNum( newcontact.uid() ), contRef ); | 518 | m_uidToContact.insert( QString().setNum( newcontact.uid() ), contRef ); |
521 | } | 519 | } |
522 | 520 | ||
523 | /* This function loads the xml-database and the journalfile */ | 521 | /* This function loads the xml-database and the journalfile */ |
524 | bool OPimContactAccessBackend_XML::load( const QString filename, bool isJournal ) | 522 | bool OPimContactAccessBackend_XML::load( const QString filename, bool isJournal ) |
525 | { | 523 | { |
526 | 524 | ||
527 | /* We use the time of the last read to check if the file was | 525 | /* We use the time of the last read to check if the file was |
528 | * changed externally. | 526 | * changed externally. |
529 | */ | 527 | */ |
530 | if ( !isJournal ){ | 528 | if ( !isJournal ){ |
531 | QFileInfo fi( filename ); | 529 | QFileInfo fi( filename ); |
532 | m_readtime = fi.lastModified (); | 530 | m_readtime = fi.lastModified (); |
533 | } | 531 | } |
534 | 532 | ||
535 | const int JOURNALACTION = Qtopia::Notes + 1; | 533 | const int JOURNALACTION = Qtopia::Notes + 1; |
536 | const int JOURNALROW = JOURNALACTION + 1; | 534 | const int JOURNALROW = JOURNALACTION + 1; |
537 | 535 | ||
538 | bool foundAction = false; | 536 | bool foundAction = false; |
539 | journal_action action = ACTION_ADD; | 537 | journal_action action = ACTION_ADD; |
540 | int journalKey = 0; | 538 | int journalKey = 0; |
541 | QMap<int, QString> contactMap; | 539 | QMap<int, QString> contactMap; |
542 | QMap<QString, QString> customMap; | 540 | QMap<QString, QString> customMap; |
543 | QMap<QString, QString>::Iterator customIt; | 541 | QMap<QString, QString>::Iterator customIt; |
544 | QAsciiDict<int> dict( 47 ); | 542 | QAsciiDict<int> dict( 47 ); |
545 | 543 | ||
546 | dict.setAutoDelete( TRUE ); | 544 | dict.setAutoDelete( TRUE ); |
547 | dict.insert( "Uid", new int(Qtopia::AddressUid) ); | 545 | dict.insert( "Uid", new int(Qtopia::AddressUid) ); |
548 | dict.insert( "Title", new int(Qtopia::Title) ); | 546 | dict.insert( "Title", new int(Qtopia::Title) ); |
549 | dict.insert( "FirstName", new int(Qtopia::FirstName) ); | 547 | dict.insert( "FirstName", new int(Qtopia::FirstName) ); |
550 | dict.insert( "MiddleName", new int(Qtopia::MiddleName) ); | 548 | dict.insert( "MiddleName", new int(Qtopia::MiddleName) ); |
551 | dict.insert( "LastName", new int(Qtopia::LastName) ); | 549 | dict.insert( "LastName", new int(Qtopia::LastName) ); |
552 | dict.insert( "Suffix", new int(Qtopia::Suffix) ); | 550 | dict.insert( "Suffix", new int(Qtopia::Suffix) ); |
553 | dict.insert( "FileAs", new int(Qtopia::FileAs) ); | 551 | dict.insert( "FileAs", new int(Qtopia::FileAs) ); |
554 | dict.insert( "Categories", new int(Qtopia::AddressCategory) ); | 552 | dict.insert( "Categories", new int(Qtopia::AddressCategory) ); |
555 | dict.insert( "DefaultEmail", new int(Qtopia::DefaultEmail) ); | 553 | dict.insert( "DefaultEmail", new int(Qtopia::DefaultEmail) ); |
556 | dict.insert( "Emails", new int(Qtopia::Emails) ); | 554 | dict.insert( "Emails", new int(Qtopia::Emails) ); |
557 | dict.insert( "HomeStreet", new int(Qtopia::HomeStreet) ); | 555 | dict.insert( "HomeStreet", new int(Qtopia::HomeStreet) ); |
558 | dict.insert( "HomeCity", new int(Qtopia::HomeCity) ); | 556 | dict.insert( "HomeCity", new int(Qtopia::HomeCity) ); |
559 | dict.insert( "HomeState", new int(Qtopia::HomeState) ); | 557 | dict.insert( "HomeState", new int(Qtopia::HomeState) ); |
560 | dict.insert( "HomeZip", new int(Qtopia::HomeZip) ); | 558 | dict.insert( "HomeZip", new int(Qtopia::HomeZip) ); |
561 | dict.insert( "HomeCountry", new int(Qtopia::HomeCountry) ); | 559 | dict.insert( "HomeCountry", new int(Qtopia::HomeCountry) ); |
562 | dict.insert( "HomePhone", new int(Qtopia::HomePhone) ); | 560 | dict.insert( "HomePhone", new int(Qtopia::HomePhone) ); |
563 | dict.insert( "HomeFax", new int(Qtopia::HomeFax) ); | 561 | dict.insert( "HomeFax", new int(Qtopia::HomeFax) ); |
564 | dict.insert( "HomeMobile", new int(Qtopia::HomeMobile) ); | 562 | dict.insert( "HomeMobile", new int(Qtopia::HomeMobile) ); |
565 | dict.insert( "HomeWebPage", new int(Qtopia::HomeWebPage) ); | 563 | dict.insert( "HomeWebPage", new int(Qtopia::HomeWebPage) ); |
566 | dict.insert( "Company", new int(Qtopia::Company) ); | 564 | dict.insert( "Company", new int(Qtopia::Company) ); |
567 | dict.insert( "BusinessStreet", new int(Qtopia::BusinessStreet) ); | 565 | dict.insert( "BusinessStreet", new int(Qtopia::BusinessStreet) ); |
568 | dict.insert( "BusinessCity", new int(Qtopia::BusinessCity) ); | 566 | dict.insert( "BusinessCity", new int(Qtopia::BusinessCity) ); |
569 | dict.insert( "BusinessState", new int(Qtopia::BusinessState) ); | 567 | dict.insert( "BusinessState", new int(Qtopia::BusinessState) ); |
570 | dict.insert( "BusinessZip", new int(Qtopia::BusinessZip) ); | 568 | dict.insert( "BusinessZip", new int(Qtopia::BusinessZip) ); |
571 | dict.insert( "BusinessCountry", new int(Qtopia::BusinessCountry) ); | 569 | dict.insert( "BusinessCountry", new int(Qtopia::BusinessCountry) ); |
572 | dict.insert( "BusinessWebPage", new int(Qtopia::BusinessWebPage) ); | 570 | dict.insert( "BusinessWebPage", new int(Qtopia::BusinessWebPage) ); |
573 | dict.insert( "JobTitle", new int(Qtopia::JobTitle) ); | 571 | dict.insert( "JobTitle", new int(Qtopia::JobTitle) ); |
574 | dict.insert( "Department", new int(Qtopia::Department) ); | 572 | dict.insert( "Department", new int(Qtopia::Department) ); |
575 | dict.insert( "Office", new int(Qtopia::Office) ); | 573 | dict.insert( "Office", new int(Qtopia::Office) ); |
576 | dict.insert( "BusinessPhone", new int(Qtopia::BusinessPhone) ); | 574 | dict.insert( "BusinessPhone", new int(Qtopia::BusinessPhone) ); |
577 | dict.insert( "BusinessFax", new int(Qtopia::BusinessFax) ); | 575 | dict.insert( "BusinessFax", new int(Qtopia::BusinessFax) ); |
578 | dict.insert( "BusinessMobile", new int(Qtopia::BusinessMobile) ); | 576 | dict.insert( "BusinessMobile", new int(Qtopia::BusinessMobile) ); |
579 | dict.insert( "BusinessPager", new int(Qtopia::BusinessPager) ); | 577 | dict.insert( "BusinessPager", new int(Qtopia::BusinessPager) ); |
580 | dict.insert( "Profession", new int(Qtopia::Profession) ); | 578 | dict.insert( "Profession", new int(Qtopia::Profession) ); |
581 | dict.insert( "Assistant", new int(Qtopia::Assistant) ); | 579 | dict.insert( "Assistant", new int(Qtopia::Assistant) ); |
582 | dict.insert( "Manager", new int(Qtopia::Manager) ); | 580 | dict.insert( "Manager", new int(Qtopia::Manager) ); |
583 | dict.insert( "Spouse", new int(Qtopia::Spouse) ); | 581 | dict.insert( "Spouse", new int(Qtopia::Spouse) ); |
584 | dict.insert( "Children", new int(Qtopia::Children) ); | 582 | dict.insert( "Children", new int(Qtopia::Children) ); |
585 | dict.insert( "Gender", new int(Qtopia::Gender) ); | 583 | dict.insert( "Gender", new int(Qtopia::Gender) ); |
586 | dict.insert( "Birthday", new int(Qtopia::Birthday) ); | 584 | dict.insert( "Birthday", new int(Qtopia::Birthday) ); |
587 | dict.insert( "Anniversary", new int(Qtopia::Anniversary) ); | 585 | dict.insert( "Anniversary", new int(Qtopia::Anniversary) ); |
588 | dict.insert( "Nickname", new int(Qtopia::Nickname) ); | 586 | dict.insert( "Nickname", new int(Qtopia::Nickname) ); |
589 | dict.insert( "Notes", new int(Qtopia::Notes) ); | 587 | dict.insert( "Notes", new int(Qtopia::Notes) ); |
590 | dict.insert( "action", new int(JOURNALACTION) ); | 588 | dict.insert( "action", new int(JOURNALACTION) ); |
591 | dict.insert( "actionrow", new int(JOURNALROW) ); | 589 | dict.insert( "actionrow", new int(JOURNALROW) ); |
592 | 590 | ||
593 | //qWarning( "OPimContactDefaultBackEnd::loading %s", filename.latin1() ); | 591 | //qWarning( "OPimContactDefaultBackEnd::loading %s", filename.latin1() ); |
594 | 592 | ||
595 | XMLElement *root = XMLElement::load( filename ); | 593 | XMLElement *root = XMLElement::load( filename ); |
596 | if(root != 0l ){ // start parsing | 594 | if(root != 0l ){ // start parsing |
597 | /* Parse all XML-Elements and put the data into the | 595 | /* Parse all XML-Elements and put the data into the |
598 | * Contact-Class | 596 | * Contact-Class |
599 | */ | 597 | */ |
600 | XMLElement *element = root->firstChild(); | 598 | XMLElement *element = root->firstChild(); |
601 | //qWarning("OPimContactAccess::load tagName(): %s", root->tagName().latin1() ); | 599 | //qWarning("OPimContactAccess::load tagName(): %s", root->tagName().latin1() ); |
602 | element = element->firstChild(); | 600 | element = element->firstChild(); |
603 | 601 | ||
604 | /* Search Tag "Contacts" which is the parent of all Contacts */ | 602 | /* Search Tag "Contacts" which is the parent of all Contacts */ |
605 | while( element && !isJournal ){ | 603 | while( element && !isJournal ){ |
606 | if( element->tagName() != QString::fromLatin1("Contacts") ){ | 604 | if( element->tagName() != QString::fromLatin1("Contacts") ){ |
607 | //qWarning ("OPimContactDefBack::Searching for Tag \"Contacts\"! Found: %s", | 605 | //qWarning ("OPimContactDefBack::Searching for Tag \"Contacts\"! Found: %s", |
608 | // element->tagName().latin1()); | 606 | // element->tagName().latin1()); |
609 | element = element->nextChild(); | 607 | element = element->nextChild(); |
610 | } else { | 608 | } else { |
611 | element = element->firstChild(); | 609 | element = element->firstChild(); |
612 | break; | 610 | break; |
613 | } | 611 | } |
614 | } | 612 | } |
615 | /* Parse all Contacts and ignore unknown tags */ | 613 | /* Parse all Contacts and ignore unknown tags */ |
616 | while( element ){ | 614 | while( element ){ |
617 | if( element->tagName() != QString::fromLatin1("Contact") ){ | 615 | if( element->tagName() != QString::fromLatin1("Contact") ){ |
618 | //qWarning ("OPimContactDefBack::Searching for Tag \"Contact\"! Found: %s", | 616 | //qWarning ("OPimContactDefBack::Searching for Tag \"Contact\"! Found: %s", |
619 | // element->tagName().latin1()); | 617 | // element->tagName().latin1()); |
620 | element = element->nextChild(); | 618 | element = element->nextChild(); |
621 | continue; | 619 | continue; |
622 | } | 620 | } |
623 | /* Found alement with tagname "contact", now parse and store all | 621 | /* Found alement with tagname "contact", now parse and store all |
624 | * attributes contained | 622 | * attributes contained |
625 | */ | 623 | */ |
626 | //qWarning("OPimContactDefBack::load element tagName() : %s", | 624 | //qWarning("OPimContactDefBack::load element tagName() : %s", |
627 | // element->tagName().latin1() ); | 625 | // element->tagName().latin1() ); |
628 | QString dummy; | 626 | QString dummy; |
629 | foundAction = false; | 627 | foundAction = false; |
630 | 628 | ||
631 | XMLElement::AttributeMap aMap = element->attributes(); | 629 | XMLElement::AttributeMap aMap = element->attributes(); |
632 | XMLElement::AttributeMap::Iterator it; | 630 | XMLElement::AttributeMap::Iterator it; |
633 | contactMap.clear(); | 631 | contactMap.clear(); |
634 | customMap.clear(); | 632 | customMap.clear(); |
635 | for( it = aMap.begin(); it != aMap.end(); ++it ){ | 633 | for( it = aMap.begin(); it != aMap.end(); ++it ){ |
636 | // qWarning ("Read Attribute: %s=%s", it.key().latin1(),it.data().latin1()); | 634 | // qWarning ("Read Attribute: %s=%s", it.key().latin1(),it.data().latin1()); |
637 | 635 | ||
638 | int *find = dict[ it.key() ]; | 636 | int *find = dict[ it.key() ]; |
639 | /* Unknown attributes will be stored as "Custom" elements */ | 637 | /* Unknown attributes will be stored as "Custom" elements */ |
640 | if ( !find ) { | 638 | if ( !find ) { |
641 | // qWarning("Attribute %s not known.", it.key().latin1()); | 639 | // qWarning("Attribute %s not known.", it.key().latin1()); |
642 | //contact.setCustomField(it.key(), it.data()); | 640 | //contact.setCustomField(it.key(), it.data()); |
643 | customMap.insert( it.key(), it.data() ); | 641 | customMap.insert( it.key(), it.data() ); |
644 | continue; | 642 | continue; |
645 | } | 643 | } |
646 | 644 | ||
647 | /* Check if special conversion is needed and add attribute | 645 | /* Check if special conversion is needed and add attribute |
648 | * into Contact class | 646 | * into Contact class |
649 | */ | 647 | */ |
650 | switch( *find ) { | 648 | switch( *find ) { |
651 | /* | 649 | /* |
652 | case Qtopia::AddressUid: | 650 | case Qtopia::AddressUid: |
653 | contact.setUid( it.data().toInt() ); | 651 | contact.setUid( it.data().toInt() ); |
654 | break; | 652 | break; |
655 | case Qtopia::AddressCategory: | 653 | case Qtopia::AddressCategory: |
656 | contact.setCategories( Qtopia::Record::idsFromString( it.data( ))); | 654 | contact.setCategories( Qtopia::Record::idsFromString( it.data( ))); |
657 | break; | 655 | break; |
658 | */ | 656 | */ |
659 | case JOURNALACTION: | 657 | case JOURNALACTION: |
660 | action = journal_action(it.data().toInt()); | 658 | action = journal_action(it.data().toInt()); |
661 | foundAction = true; | 659 | foundAction = true; |
662 | qWarning ("ODefBack(journal)::ACTION found: %d", action); | 660 | qWarning ("ODefBack(journal)::ACTION found: %d", action); |
663 | break; | 661 | break; |
664 | case JOURNALROW: | 662 | case JOURNALROW: |
665 | journalKey = it.data().toInt(); | 663 | journalKey = it.data().toInt(); |
666 | break; | 664 | break; |
667 | default: // no conversion needed add them to the map | 665 | default: // no conversion needed add them to the map |
668 | contactMap.insert( *find, it.data() ); | 666 | contactMap.insert( *find, it.data() ); |
669 | break; | 667 | break; |
670 | } | 668 | } |
671 | } | 669 | } |
672 | /* now generate the Contact contact */ | 670 | /* now generate the Contact contact */ |
673 | OPimContact contact( contactMap ); | 671 | OPimContact contact( contactMap ); |
674 | 672 | ||
675 | for (customIt = customMap.begin(); customIt != customMap.end(); ++customIt ) { | 673 | for (customIt = customMap.begin(); customIt != customMap.end(); ++customIt ) { |
676 | contact.setCustomField( customIt.key(), customIt.data() ); | 674 | contact.setCustomField( customIt.key(), customIt.data() ); |
677 | } | 675 | } |
678 | 676 | ||
679 | if (foundAction){ | 677 | if (foundAction){ |
680 | foundAction = false; | 678 | foundAction = false; |
681 | switch ( action ) { | 679 | switch ( action ) { |
682 | case ACTION_ADD: | 680 | case ACTION_ADD: |
683 | addContact_p (contact); | 681 | addContact_p (contact); |
684 | break; | 682 | break; |
685 | case ACTION_REMOVE: | 683 | case ACTION_REMOVE: |
686 | if ( !remove (contact.uid()) ) | 684 | if ( !remove (contact.uid()) ) |
687 | qWarning ("ODefBack(journal)::Unable to remove uid: %d", | 685 | qWarning ("ODefBack(journal)::Unable to remove uid: %d", |
688 | contact.uid() ); | 686 | contact.uid() ); |
689 | break; | 687 | break; |
690 | case ACTION_REPLACE: | 688 | case ACTION_REPLACE: |
691 | if ( !replace ( contact ) ) | 689 | if ( !replace ( contact ) ) |
692 | qWarning ("ODefBack(journal)::Unable to replace uid: %d", | 690 | qWarning ("ODefBack(journal)::Unable to replace uid: %d", |
693 | contact.uid() ); | 691 | contact.uid() ); |
694 | break; | 692 | break; |
695 | default: | 693 | default: |
696 | qWarning ("Unknown action: ignored !"); | 694 | qWarning ("Unknown action: ignored !"); |
697 | break; | 695 | break; |
698 | } | 696 | } |
699 | }else{ | 697 | }else{ |
700 | /* Add contact to list */ | 698 | /* Add contact to list */ |
701 | addContact_p (contact); | 699 | addContact_p (contact); |
702 | } | 700 | } |
703 | 701 | ||
704 | /* Move to next element */ | 702 | /* Move to next element */ |
705 | element = element->nextChild(); | 703 | element = element->nextChild(); |
706 | } | 704 | } |
707 | }else { | 705 | }else { |
708 | qWarning("ODefBack::could not load"); | 706 | qWarning("ODefBack::could not load"); |
709 | } | 707 | } |
710 | delete root; | 708 | delete root; |
711 | qWarning("returning from loading" ); | 709 | qWarning("returning from loading" ); |
712 | return true; | 710 | return true; |
713 | } | 711 | } |
714 | 712 | ||
715 | 713 | ||
716 | void OPimContactAccessBackend_XML::updateJournal( const OPimContact& cnt, | 714 | void OPimContactAccessBackend_XML::updateJournal( const OPimContact& cnt, |
717 | journal_action action ) | 715 | journal_action action ) |
718 | { | 716 | { |
719 | QFile f( m_journalName ); | 717 | QFile f( m_journalName ); |
720 | bool created = !f.exists(); | 718 | bool created = !f.exists(); |
721 | if ( !f.open(IO_WriteOnly|IO_Append) ) | 719 | if ( !f.open(IO_WriteOnly|IO_Append) ) |
722 | return; | 720 | return; |
723 | 721 | ||
724 | QString buf; | 722 | QString buf; |
725 | QCString str; | 723 | QCString str; |
726 | 724 | ||
727 | // if the file was created, we have to set the Tag "<CONTACTS>" to | 725 | // if the file was created, we have to set the Tag "<CONTACTS>" to |
728 | // get a XML-File which is readable by our parser. | 726 | // get a XML-File which is readable by our parser. |
729 | // This is just a cheat, but better than rewrite the parser. | 727 | // This is just a cheat, but better than rewrite the parser. |
730 | if ( created ){ | 728 | if ( created ){ |
731 | buf = "<Contacts>"; | 729 | buf = "<Contacts>"; |
732 | QCString cstr = buf.utf8(); | 730 | QCString cstr = buf.utf8(); |
733 | f.writeBlock( cstr.data(), cstr.length() ); | 731 | f.writeBlock( cstr.data(), cstr.length() ); |
734 | } | 732 | } |
735 | 733 | ||
736 | buf = "<Contact "; | 734 | buf = "<Contact "; |
737 | cnt.save( buf ); | 735 | cnt.save( buf ); |
738 | buf += " action=\"" + QString::number( (int)action ) + "\" "; | 736 | buf += " action=\"" + QString::number( (int)action ) + "\" "; |
739 | buf += "/>\n"; | 737 | buf += "/>\n"; |
740 | QCString cstr = buf.utf8(); | 738 | QCString cstr = buf.utf8(); |
741 | f.writeBlock( cstr.data(), cstr.length() ); | 739 | f.writeBlock( cstr.data(), cstr.length() ); |
742 | } | 740 | } |
743 | 741 | ||
744 | void OPimContactAccessBackend_XML::removeJournal() | 742 | void OPimContactAccessBackend_XML::removeJournal() |
745 | { | 743 | { |
746 | QFile f ( m_journalName ); | 744 | QFile f ( m_journalName ); |
747 | if ( f.exists() ) | 745 | if ( f.exists() ) |
748 | f.remove(); | 746 | f.remove(); |
749 | } | 747 | } |
750 | 748 | ||
751 | } | 749 | } |
diff --git a/libopie2/opiepim/core/opimcontact.cpp b/libopie2/opiepim/core/opimcontact.cpp index a5df597..4a774e8 100644 --- a/libopie2/opiepim/core/opimcontact.cpp +++ b/libopie2/opiepim/core/opimcontact.cpp | |||
@@ -1,1293 +1,1289 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) Stefan Eilers <eilers.stefan@epost.de> | 3 | Copyright (C) Stefan Eilers <eilers.stefan@epost.de> |
4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> | 4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> |
5 | .=l. | 5 | .=l. |
6 | .>+-= | 6 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 7 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 8 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 11 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 12 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #define QTOPIA_INTERNAL_CONTACT_MRE | 30 | #define QTOPIA_INTERNAL_CONTACT_MRE |
31 | 31 | ||
32 | #include "opimcontact.h" | 32 | #include "opimcontact.h" |
33 | 33 | ||
34 | /* OPIE */ | 34 | /* OPIE */ |
35 | #include <opie2/opimresolver.h> | 35 | #include <opie2/opimresolver.h> |
36 | #include <opie2/opimdateconversion.h> | 36 | #include <opie2/opimdateconversion.h> |
37 | #include <qpe/stringutil.h> | 37 | #include <qpe/stringutil.h> |
38 | #include <qpe/timestring.h> | 38 | #include <qpe/timestring.h> |
39 | #include <qpe/config.h> | 39 | #include <qpe/config.h> |
40 | 40 | ||
41 | /* QT */ | 41 | /* QT */ |
42 | #include <qobject.h> | ||
43 | #include <qregexp.h> | ||
44 | #include <qstylesheet.h> | 42 | #include <qstylesheet.h> |
45 | #include <qfileinfo.h> | ||
46 | #include <qmap.h> | ||
47 | 43 | ||
48 | /* STD */ | 44 | /* STD */ |
49 | #include <stdio.h> | 45 | #include <stdio.h> |
50 | 46 | ||
51 | /*! | 47 | /*! |
52 | \class Contact contact.h | 48 | \class Contact contact.h |
53 | \brief The Contact class holds the data of an address book entry. | 49 | \brief The Contact class holds the data of an address book entry. |
54 | 50 | ||
55 | This data includes information the name of the person, contact | 51 | This data includes information the name of the person, contact |
56 | information, and business information such as deparment and job title. | 52 | information, and business information such as deparment and job title. |
57 | 53 | ||
58 | \ingroup qtopiaemb | 54 | \ingroup qtopiaemb |
59 | \ingroup qtopiadesktop | 55 | \ingroup qtopiadesktop |
60 | */ | 56 | */ |
61 | 57 | ||
62 | 58 | ||
63 | namespace Opie | 59 | namespace Opie |
64 | { | 60 | { |
65 | /*! | 61 | /*! |
66 | Creates a new, empty contact. | 62 | Creates a new, empty contact. |
67 | */ | 63 | */ |
68 | OPimContact::OPimContact():OPimRecord(), mMap(), d( 0 ) | 64 | OPimContact::OPimContact():OPimRecord(), mMap(), d( 0 ) |
69 | {} | 65 | {} |
70 | 66 | ||
71 | /*! | 67 | /*! |
72 | \internal | 68 | \internal |
73 | Creates a new contact. The properties of the contact are | 69 | Creates a new contact. The properties of the contact are |
74 | set from \a fromMap. | 70 | set from \a fromMap. |
75 | */ | 71 | */ |
76 | OPimContact::OPimContact( const QMap<int, QString> &fromMap ):OPimRecord(), mMap( fromMap ), d( 0 ) | 72 | OPimContact::OPimContact( const QMap<int, QString> &fromMap ):OPimRecord(), mMap( fromMap ), d( 0 ) |
77 | { | 73 | { |
78 | QString cats = mMap[ Qtopia::AddressCategory ]; | 74 | QString cats = mMap[ Qtopia::AddressCategory ]; |
79 | if ( !cats.isEmpty() ) | 75 | if ( !cats.isEmpty() ) |
80 | setCategories( idsFromString( cats ) ); | 76 | setCategories( idsFromString( cats ) ); |
81 | 77 | ||
82 | QString uidStr = find( Qtopia::AddressUid ); | 78 | QString uidStr = find( Qtopia::AddressUid ); |
83 | 79 | ||
84 | if ( uidStr.isEmpty() || ( uidStr.toInt() == 0 ) ) | 80 | if ( uidStr.isEmpty() || ( uidStr.toInt() == 0 ) ) |
85 | { | 81 | { |
86 | qWarning( "Invalid UID found. Generate new one.." ); | 82 | qWarning( "Invalid UID found. Generate new one.." ); |
87 | setUid( uidGen().generate() ); | 83 | setUid( uidGen().generate() ); |
88 | } | 84 | } |
89 | else | 85 | else |
90 | setUid( uidStr.toInt() ); | 86 | setUid( uidStr.toInt() ); |
91 | 87 | ||
92 | // if ( !uidStr.isEmpty() ) | 88 | // if ( !uidStr.isEmpty() ) |
93 | // setUid( uidStr.toInt() ); | 89 | // setUid( uidStr.toInt() ); |
94 | } | 90 | } |
95 | 91 | ||
96 | /*! | 92 | /*! |
97 | Destroys a contact. | 93 | Destroys a contact. |
98 | */ | 94 | */ |
99 | OPimContact::~OPimContact() | 95 | OPimContact::~OPimContact() |
100 | {} | 96 | {} |
101 | 97 | ||
102 | /*! \fn void OPimContact::setTitle( const QString &str ) | 98 | /*! \fn void OPimContact::setTitle( const QString &str ) |
103 | Sets the title of the contact to \a str. | 99 | Sets the title of the contact to \a str. |
104 | */ | 100 | */ |
105 | 101 | ||
106 | /*! \fn void OPimContact::setFirstName( const QString &str ) | 102 | /*! \fn void OPimContact::setFirstName( const QString &str ) |
107 | Sets the first name of the contact to \a str. | 103 | Sets the first name of the contact to \a str. |
108 | */ | 104 | */ |
109 | 105 | ||
110 | /*! \fn void OPimContact::setMiddleName( const QString &str ) | 106 | /*! \fn void OPimContact::setMiddleName( const QString &str ) |
111 | Sets the middle name of the contact to \a str. | 107 | Sets the middle name of the contact to \a str. |
112 | */ | 108 | */ |
113 | 109 | ||
114 | /*! \fn void OPimContact::setLastName( const QString &str ) | 110 | /*! \fn void OPimContact::setLastName( const QString &str ) |
115 | Sets the last name of the contact to \a str. | 111 | Sets the last name of the contact to \a str. |
116 | */ | 112 | */ |
117 | 113 | ||
118 | /*! \fn void OPimContact::setSuffix( const QString &str ) | 114 | /*! \fn void OPimContact::setSuffix( const QString &str ) |
119 | Sets the suffix of the contact to \a str. | 115 | Sets the suffix of the contact to \a str. |
120 | */ | 116 | */ |
121 | 117 | ||
122 | /*! \fn void OPimContact::setFileAs( const QString &str ) | 118 | /*! \fn void OPimContact::setFileAs( const QString &str ) |
123 | Sets the contact to filed as \a str. | 119 | Sets the contact to filed as \a str. |
124 | */ | 120 | */ |
125 | 121 | ||
126 | /*! \fn void OPimContact::setDefaultEmail( const QString &str ) | 122 | /*! \fn void OPimContact::setDefaultEmail( const QString &str ) |
127 | Sets the default email of the contact to \a str. | 123 | Sets the default email of the contact to \a str. |
128 | */ | 124 | */ |
129 | 125 | ||
130 | /*! \fn void OPimContact::setHomeStreet( const QString &str ) | 126 | /*! \fn void OPimContact::setHomeStreet( const QString &str ) |
131 | Sets the home street address of the contact to \a str. | 127 | Sets the home street address of the contact to \a str. |
132 | */ | 128 | */ |
133 | 129 | ||
134 | /*! \fn void OPimContact::setHomeCity( const QString &str ) | 130 | /*! \fn void OPimContact::setHomeCity( const QString &str ) |
135 | Sets the home city of the contact to \a str. | 131 | Sets the home city of the contact to \a str. |
136 | */ | 132 | */ |
137 | 133 | ||
138 | /*! \fn void OPimContact::setHomeState( const QString &str ) | 134 | /*! \fn void OPimContact::setHomeState( const QString &str ) |
139 | Sets the home state of the contact to \a str. | 135 | Sets the home state of the contact to \a str. |
140 | */ | 136 | */ |
141 | 137 | ||
142 | /*! \fn void OPimContact::setHomeZip( const QString &str ) | 138 | /*! \fn void OPimContact::setHomeZip( const QString &str ) |
143 | Sets the home zip code of the contact to \a str. | 139 | Sets the home zip code of the contact to \a str. |
144 | */ | 140 | */ |
145 | 141 | ||
146 | /*! \fn void OPimContact::setHomeCountry( const QString &str ) | 142 | /*! \fn void OPimContact::setHomeCountry( const QString &str ) |
147 | Sets the home country of the contact to \a str. | 143 | Sets the home country of the contact to \a str. |
148 | */ | 144 | */ |
149 | 145 | ||
150 | /*! \fn void OPimContact::setHomePhone( const QString &str ) | 146 | /*! \fn void OPimContact::setHomePhone( const QString &str ) |
151 | Sets the home phone number of the contact to \a str. | 147 | Sets the home phone number of the contact to \a str. |
152 | */ | 148 | */ |
153 | 149 | ||
154 | /*! \fn void OPimContact::setHomeFax( const QString &str ) | 150 | /*! \fn void OPimContact::setHomeFax( const QString &str ) |
155 | Sets the home fax number of the contact to \a str. | 151 | Sets the home fax number of the contact to \a str. |
156 | */ | 152 | */ |
157 | 153 | ||
158 | /*! \fn void OPimContact::setHomeMobile( const QString &str ) | 154 | /*! \fn void OPimContact::setHomeMobile( const QString &str ) |
159 | Sets the home mobile phone number of the contact to \a str. | 155 | Sets the home mobile phone number of the contact to \a str. |
160 | */ | 156 | */ |
161 | 157 | ||
162 | /*! \fn void OPimContact::setHomeWebpage( const QString &str ) | 158 | /*! \fn void OPimContact::setHomeWebpage( const QString &str ) |
163 | Sets the home webpage of the contact to \a str. | 159 | Sets the home webpage of the contact to \a str. |
164 | */ | 160 | */ |
165 | 161 | ||
166 | /*! \fn void OPimContact::setCompany( const QString &str ) | 162 | /*! \fn void OPimContact::setCompany( const QString &str ) |
167 | Sets the company for contact to \a str. | 163 | Sets the company for contact to \a str. |
168 | */ | 164 | */ |
169 | 165 | ||
170 | /*! \fn void OPimContact::setJobTitle( const QString &str ) | 166 | /*! \fn void OPimContact::setJobTitle( const QString &str ) |
171 | Sets the job title of the contact to \a str. | 167 | Sets the job title of the contact to \a str. |
172 | */ | 168 | */ |
173 | 169 | ||
174 | /*! \fn void OPimContact::setDepartment( const QString &str ) | 170 | /*! \fn void OPimContact::setDepartment( const QString &str ) |
175 | Sets the department for contact to \a str. | 171 | Sets the department for contact to \a str. |
176 | */ | 172 | */ |
177 | 173 | ||
178 | /*! \fn void OPimContact::setOffice( const QString &str ) | 174 | /*! \fn void OPimContact::setOffice( const QString &str ) |
179 | Sets the office for contact to \a str. | 175 | Sets the office for contact to \a str. |
180 | */ | 176 | */ |
181 | 177 | ||
182 | /*! \fn void OPimContact::setBusinessStreet( const QString &str ) | 178 | /*! \fn void OPimContact::setBusinessStreet( const QString &str ) |
183 | Sets the business street address of the contact to \a str. | 179 | Sets the business street address of the contact to \a str. |
184 | */ | 180 | */ |
185 | 181 | ||
186 | /*! \fn void OPimContact::setBusinessCity( const QString &str ) | 182 | /*! \fn void OPimContact::setBusinessCity( const QString &str ) |
187 | Sets the business city of the contact to \a str. | 183 | Sets the business city of the contact to \a str. |
188 | */ | 184 | */ |
189 | 185 | ||
190 | /*! \fn void OPimContact::setBusinessState( const QString &str ) | 186 | /*! \fn void OPimContact::setBusinessState( const QString &str ) |
191 | Sets the business state of the contact to \a str. | 187 | Sets the business state of the contact to \a str. |
192 | */ | 188 | */ |
193 | 189 | ||
194 | /*! \fn void OPimContact::setBusinessZip( const QString &str ) | 190 | /*! \fn void OPimContact::setBusinessZip( const QString &str ) |
195 | Sets the business zip code of the contact to \a str. | 191 | Sets the business zip code of the contact to \a str. |
196 | */ | 192 | */ |
197 | 193 | ||
198 | /*! \fn void OPimContact::setBusinessCountry( const QString &str ) | 194 | /*! \fn void OPimContact::setBusinessCountry( const QString &str ) |
199 | Sets the business country of the contact to \a str. | 195 | Sets the business country of the contact to \a str. |
200 | */ | 196 | */ |
201 | 197 | ||
202 | /*! \fn void OPimContact::setBusinessPhone( const QString &str ) | 198 | /*! \fn void OPimContact::setBusinessPhone( const QString &str ) |
203 | Sets the business phone number of the contact to \a str. | 199 | Sets the business phone number of the contact to \a str. |
204 | */ | 200 | */ |
205 | 201 | ||
206 | /*! \fn void OPimContact::setBusinessFax( const QString &str ) | 202 | /*! \fn void OPimContact::setBusinessFax( const QString &str ) |
207 | Sets the business fax number of the contact to \a str. | 203 | Sets the business fax number of the contact to \a str. |
208 | */ | 204 | */ |
209 | 205 | ||
210 | /*! \fn void OPimContact::setBusinessMobile( const QString &str ) | 206 | /*! \fn void OPimContact::setBusinessMobile( const QString &str ) |
211 | Sets the business mobile phone number of the contact to \a str. | 207 | Sets the business mobile phone number of the contact to \a str. |
212 | */ | 208 | */ |
213 | 209 | ||
214 | /*! \fn void OPimContact::setBusinessPager( const QString &str ) | 210 | /*! \fn void OPimContact::setBusinessPager( const QString &str ) |
215 | Sets the business pager number of the contact to \a str. | 211 | Sets the business pager number of the contact to \a str. |
216 | */ | 212 | */ |
217 | 213 | ||
218 | /*! \fn void OPimContact::setBusinessWebpage( const QString &str ) | 214 | /*! \fn void OPimContact::setBusinessWebpage( const QString &str ) |
219 | Sets the business webpage of the contact to \a str. | 215 | Sets the business webpage of the contact to \a str. |
220 | */ | 216 | */ |
221 | 217 | ||
222 | /*! \fn void OPimContact::setProfession( const QString &str ) | 218 | /*! \fn void OPimContact::setProfession( const QString &str ) |
223 | Sets the profession of the contact to \a str. | 219 | Sets the profession of the contact to \a str. |
224 | */ | 220 | */ |
225 | 221 | ||
226 | /*! \fn void OPimContact::setAssistant( const QString &str ) | 222 | /*! \fn void OPimContact::setAssistant( const QString &str ) |
227 | Sets the assistant of the contact to \a str. | 223 | Sets the assistant of the contact to \a str. |
228 | */ | 224 | */ |
229 | 225 | ||
230 | /*! \fn void OPimContact::setManager( const QString &str ) | 226 | /*! \fn void OPimContact::setManager( const QString &str ) |
231 | Sets the manager of the contact to \a str. | 227 | Sets the manager of the contact to \a str. |
232 | */ | 228 | */ |
233 | 229 | ||
234 | /*! \fn void OPimContact::setSpouse( const QString &str ) | 230 | /*! \fn void OPimContact::setSpouse( const QString &str ) |
235 | Sets the spouse of the contact to \a str. | 231 | Sets the spouse of the contact to \a str. |
236 | */ | 232 | */ |
237 | 233 | ||
238 | /*! \fn void OPimContact::setGender( const QString &str ) | 234 | /*! \fn void OPimContact::setGender( const QString &str ) |
239 | Sets the gender of the contact to \a str. | 235 | Sets the gender of the contact to \a str. |
240 | */ | 236 | */ |
241 | 237 | ||
242 | /*! \fn void OPimContact::setNickname( const QString &str ) | 238 | /*! \fn void OPimContact::setNickname( const QString &str ) |
243 | Sets the nickname of the contact to \a str. | 239 | Sets the nickname of the contact to \a str. |
244 | */ | 240 | */ |
245 | 241 | ||
246 | /*! \fn void OPimContact::setNotes( const QString &str ) | 242 | /*! \fn void OPimContact::setNotes( const QString &str ) |
247 | Sets the notes about the contact to \a str. | 243 | Sets the notes about the contact to \a str. |
248 | */ | 244 | */ |
249 | 245 | ||
250 | /*! \fn QString OPimContact::title() const | 246 | /*! \fn QString OPimContact::title() const |
251 | Returns the title of the contact. | 247 | Returns the title of the contact. |
252 | */ | 248 | */ |
253 | 249 | ||
254 | /*! \fn QString OPimContact::firstName() const | 250 | /*! \fn QString OPimContact::firstName() const |
255 | Returns the first name of the contact. | 251 | Returns the first name of the contact. |
256 | */ | 252 | */ |
257 | 253 | ||
258 | /*! \fn QString OPimContact::middleName() const | 254 | /*! \fn QString OPimContact::middleName() const |
259 | Returns the middle name of the contact. | 255 | Returns the middle name of the contact. |
260 | */ | 256 | */ |
261 | 257 | ||
262 | /*! \fn QString OPimContact::lastName() const | 258 | /*! \fn QString OPimContact::lastName() const |
263 | Returns the last name of the contact. | 259 | Returns the last name of the contact. |
264 | */ | 260 | */ |
265 | 261 | ||
266 | /*! \fn QString OPimContact::suffix() const | 262 | /*! \fn QString OPimContact::suffix() const |
267 | Returns the suffix of the contact. | 263 | Returns the suffix of the contact. |
268 | */ | 264 | */ |
269 | 265 | ||
270 | /*! \fn QString OPimContact::fileAs() const | 266 | /*! \fn QString OPimContact::fileAs() const |
271 | Returns the string the contact is filed as. | 267 | Returns the string the contact is filed as. |
272 | */ | 268 | */ |
273 | 269 | ||
274 | /*! \fn QString OPimContact::defaultEmail() const | 270 | /*! \fn QString OPimContact::defaultEmail() const |
275 | Returns the default email address of the contact. | 271 | Returns the default email address of the contact. |
276 | */ | 272 | */ |
277 | 273 | ||
278 | /*! \fn QString OPimContact::emails() const | 274 | /*! \fn QString OPimContact::emails() const |
279 | Returns the list of email address for a contact separated by ';'s in a single | 275 | Returns the list of email address for a contact separated by ';'s in a single |
280 | string. | 276 | string. |
281 | */ | 277 | */ |
282 | 278 | ||
283 | /*! \fn QString OPimContact::homeStreet() const | 279 | /*! \fn QString OPimContact::homeStreet() const |
284 | Returns the home street address of the contact. | 280 | Returns the home street address of the contact. |
285 | */ | 281 | */ |
286 | 282 | ||
287 | /*! \fn QString OPimContact::homeCity() const | 283 | /*! \fn QString OPimContact::homeCity() const |
288 | Returns the home city of the contact. | 284 | Returns the home city of the contact. |
289 | */ | 285 | */ |
290 | 286 | ||
291 | /*! \fn QString OPimContact::homeState() const | 287 | /*! \fn QString OPimContact::homeState() const |
292 | Returns the home state of the contact. | 288 | Returns the home state of the contact. |
293 | */ | 289 | */ |
294 | 290 | ||
295 | /*! \fn QString OPimContact::homeZip() const | 291 | /*! \fn QString OPimContact::homeZip() const |
296 | Returns the home zip of the contact. | 292 | Returns the home zip of the contact. |
297 | */ | 293 | */ |
298 | 294 | ||
299 | /*! \fn QString OPimContact::homeCountry() const | 295 | /*! \fn QString OPimContact::homeCountry() const |
300 | Returns the home country of the contact. | 296 | Returns the home country of the contact. |
301 | */ | 297 | */ |
302 | 298 | ||
303 | /*! \fn QString OPimContact::homePhone() const | 299 | /*! \fn QString OPimContact::homePhone() const |
304 | Returns the home phone number of the contact. | 300 | Returns the home phone number of the contact. |
305 | */ | 301 | */ |
306 | 302 | ||
307 | /*! \fn QString OPimContact::homeFax() const | 303 | /*! \fn QString OPimContact::homeFax() const |
308 | Returns the home fax number of the contact. | 304 | Returns the home fax number of the contact. |
309 | */ | 305 | */ |
310 | 306 | ||
311 | /*! \fn QString OPimContact::homeMobile() const | 307 | /*! \fn QString OPimContact::homeMobile() const |
312 | Returns the home mobile number of the contact. | 308 | Returns the home mobile number of the contact. |
313 | */ | 309 | */ |
314 | 310 | ||
315 | /*! \fn QString OPimContact::homeWebpage() const | 311 | /*! \fn QString OPimContact::homeWebpage() const |
316 | Returns the home webpage of the contact. | 312 | Returns the home webpage of the contact. |
317 | */ | 313 | */ |
318 | 314 | ||
319 | /*! \fn QString OPimContact::company() const | 315 | /*! \fn QString OPimContact::company() const |
320 | Returns the company for the contact. | 316 | Returns the company for the contact. |
321 | */ | 317 | */ |
322 | 318 | ||
323 | /*! \fn QString OPimContact::department() const | 319 | /*! \fn QString OPimContact::department() const |
324 | Returns the department for the contact. | 320 | Returns the department for the contact. |
325 | */ | 321 | */ |
326 | 322 | ||
327 | /*! \fn QString OPimContact::office() const | 323 | /*! \fn QString OPimContact::office() const |
328 | Returns the office for the contact. | 324 | Returns the office for the contact. |
329 | */ | 325 | */ |
330 | 326 | ||
331 | /*! \fn QString OPimContact::jobTitle() const | 327 | /*! \fn QString OPimContact::jobTitle() const |
332 | Returns the job title of the contact. | 328 | Returns the job title of the contact. |
333 | */ | 329 | */ |
334 | 330 | ||
335 | /*! \fn QString OPimContact::profession() const | 331 | /*! \fn QString OPimContact::profession() const |
336 | Returns the profession of the contact. | 332 | Returns the profession of the contact. |
337 | */ | 333 | */ |
338 | 334 | ||
339 | /*! \fn QString OPimContact::assistant() const | 335 | /*! \fn QString OPimContact::assistant() const |
340 | Returns the assistant of the contact. | 336 | Returns the assistant of the contact. |
341 | */ | 337 | */ |
342 | 338 | ||
343 | /*! \fn QString OPimContact::manager() const | 339 | /*! \fn QString OPimContact::manager() const |
344 | Returns the manager of the contact. | 340 | Returns the manager of the contact. |
345 | */ | 341 | */ |
346 | 342 | ||
347 | /*! \fn QString OPimContact::businessStreet() const | 343 | /*! \fn QString OPimContact::businessStreet() const |
348 | Returns the business street address of the contact. | 344 | Returns the business street address of the contact. |
349 | */ | 345 | */ |
350 | 346 | ||
351 | /*! \fn QString OPimContact::businessCity() const | 347 | /*! \fn QString OPimContact::businessCity() const |
352 | Returns the business city of the contact. | 348 | Returns the business city of the contact. |
353 | */ | 349 | */ |
354 | 350 | ||
355 | /*! \fn QString OPimContact::businessState() const | 351 | /*! \fn QString OPimContact::businessState() const |
356 | Returns the business state of the contact. | 352 | Returns the business state of the contact. |
357 | */ | 353 | */ |
358 | 354 | ||
359 | /*! \fn QString OPimContact::businessZip() const | 355 | /*! \fn QString OPimContact::businessZip() const |
360 | Returns the business zip of the contact. | 356 | Returns the business zip of the contact. |
361 | */ | 357 | */ |
362 | 358 | ||
363 | /*! \fn QString OPimContact::businessCountry() const | 359 | /*! \fn QString OPimContact::businessCountry() const |
364 | Returns the business country of the contact. | 360 | Returns the business country of the contact. |
365 | */ | 361 | */ |
366 | 362 | ||
367 | /*! \fn QString OPimContact::businessPhone() const | 363 | /*! \fn QString OPimContact::businessPhone() const |
368 | Returns the business phone number of the contact. | 364 | Returns the business phone number of the contact. |
369 | */ | 365 | */ |
370 | 366 | ||
371 | /*! \fn QString OPimContact::businessFax() const | 367 | /*! \fn QString OPimContact::businessFax() const |
372 | Returns the business fax number of the contact. | 368 | Returns the business fax number of the contact. |
373 | */ | 369 | */ |
374 | 370 | ||
375 | /*! \fn QString OPimContact::businessMobile() const | 371 | /*! \fn QString OPimContact::businessMobile() const |
376 | Returns the business mobile number of the contact. | 372 | Returns the business mobile number of the contact. |
377 | */ | 373 | */ |
378 | 374 | ||
379 | /*! \fn QString OPimContact::businessPager() const | 375 | /*! \fn QString OPimContact::businessPager() const |
380 | Returns the business pager number of the contact. | 376 | Returns the business pager number of the contact. |
381 | */ | 377 | */ |
382 | 378 | ||
383 | /*! \fn QString OPimContact::businessWebpage() const | 379 | /*! \fn QString OPimContact::businessWebpage() const |
384 | Returns the business webpage of the contact. | 380 | Returns the business webpage of the contact. |
385 | */ | 381 | */ |
386 | 382 | ||
387 | /*! \fn QString OPimContact::spouse() const | 383 | /*! \fn QString OPimContact::spouse() const |
388 | Returns the spouse of the contact. | 384 | Returns the spouse of the contact. |
389 | */ | 385 | */ |
390 | 386 | ||
391 | /*! \fn QString OPimContact::gender() const | 387 | /*! \fn QString OPimContact::gender() const |
392 | Returns the gender of the contact. | 388 | Returns the gender of the contact. |
393 | */ | 389 | */ |
394 | 390 | ||
395 | /*! \fn QString OPimContact::nickname() const | 391 | /*! \fn QString OPimContact::nickname() const |
396 | Returns the nickname of the contact. | 392 | Returns the nickname of the contact. |
397 | */ | 393 | */ |
398 | 394 | ||
399 | /*! \fn QString OPimContact::children() const | 395 | /*! \fn QString OPimContact::children() const |
400 | Returns the children of the contact. | 396 | Returns the children of the contact. |
401 | */ | 397 | */ |
402 | 398 | ||
403 | /*! \fn QString OPimContact::notes() const | 399 | /*! \fn QString OPimContact::notes() const |
404 | Returns the notes relating to the the contact. | 400 | Returns the notes relating to the the contact. |
405 | */ | 401 | */ |
406 | 402 | ||
407 | /*! \fn QString OPimContact::groups() const | 403 | /*! \fn QString OPimContact::groups() const |
408 | \internal | 404 | \internal |
409 | Returns the groups for the contact. | 405 | Returns the groups for the contact. |
410 | */ | 406 | */ |
411 | 407 | ||
412 | /*! \fn QStringList OPimContact::groupList() const | 408 | /*! \fn QStringList OPimContact::groupList() const |
413 | \internal | 409 | \internal |
414 | */ | 410 | */ |
415 | 411 | ||
416 | /*! \fn QString OPimContact::field(int) const | 412 | /*! \fn QString OPimContact::field(int) const |
417 | \internal | 413 | \internal |
418 | */ | 414 | */ |
419 | 415 | ||
420 | /*! \fn void OPimContact::saveJournal( journal_action, const QString & = QString::null ) | 416 | /*! \fn void OPimContact::saveJournal( journal_action, const QString & = QString::null ) |
421 | \internal | 417 | \internal |
422 | */ | 418 | */ |
423 | 419 | ||
424 | /*! \fn void OPimContact::setUid( int id ) | 420 | /*! \fn void OPimContact::setUid( int id ) |
425 | \internal | 421 | \internal |
426 | Sets the uid for this record to \a id. | 422 | Sets the uid for this record to \a id. |
427 | */ | 423 | */ |
428 | 424 | ||
429 | /*! \enum OPimContact::journal_action | 425 | /*! \enum OPimContact::journal_action |
430 | \internal | 426 | \internal |
431 | */ | 427 | */ |
432 | 428 | ||
433 | /*! | 429 | /*! |
434 | \internal | 430 | \internal |
435 | */ | 431 | */ |
436 | QMap<int, QString> OPimContact::toMap() const | 432 | QMap<int, QString> OPimContact::toMap() const |
437 | { | 433 | { |
438 | QMap<int, QString> map = mMap; | 434 | QMap<int, QString> map = mMap; |
439 | QString cats = idsToString( categories() ); | 435 | QString cats = idsToString( categories() ); |
440 | if ( !cats.isEmpty() ) | 436 | if ( !cats.isEmpty() ) |
441 | map.insert( Qtopia::AddressCategory, cats ); | 437 | map.insert( Qtopia::AddressCategory, cats ); |
442 | return map; | 438 | return map; |
443 | } | 439 | } |
444 | 440 | ||
445 | /*! | 441 | /*! |
446 | Returns a rich text formatted QString representing the contents the contact. | 442 | Returns a rich text formatted QString representing the contents the contact. |
447 | */ | 443 | */ |
448 | QString OPimContact::toRichText() const | 444 | QString OPimContact::toRichText() const |
449 | { | 445 | { |
450 | QString text; | 446 | QString text; |
451 | QString value, comp, state; | 447 | QString value, comp, state; |
452 | QString str; | 448 | QString str; |
453 | bool marker = false; | 449 | bool marker = false; |
454 | 450 | ||
455 | Config cfg( "qpe" ); | 451 | Config cfg( "qpe" ); |
456 | cfg.setGroup( "Appearance" ); | 452 | cfg.setGroup( "Appearance" ); |
457 | int addressformat = cfg.readNumEntry( "AddressFormat", Zip_City_State ); | 453 | int addressformat = cfg.readNumEntry( "AddressFormat", Zip_City_State ); |
458 | 454 | ||
459 | // name, jobtitle and company | 455 | // name, jobtitle and company |
460 | if ( !( value = fullName() ).isEmpty() ) | 456 | if ( !( value = fullName() ).isEmpty() ) |
461 | text += "<b><h3><img src=\"addressbook/AddressBook\"> " + Qtopia::escapeString( value ) + "</h3></b>"; | 457 | text += "<b><h3><img src=\"addressbook/AddressBook\"> " + Qtopia::escapeString( value ) + "</h3></b>"; |
462 | 458 | ||
463 | if ( !( value = jobTitle() ).isEmpty() ) | 459 | if ( !( value = jobTitle() ).isEmpty() ) |
464 | text += Qtopia::escapeString( value ) + " "; | 460 | text += Qtopia::escapeString( value ) + " "; |
465 | 461 | ||
466 | comp = company(); | 462 | comp = company(); |
467 | if ( !( value = department() ).isEmpty() ) | 463 | if ( !( value = department() ).isEmpty() ) |
468 | { | 464 | { |
469 | text += Qtopia::escapeString( value ); | 465 | text += Qtopia::escapeString( value ); |
470 | if ( comp ) | 466 | if ( comp ) |
471 | text += ", " + Qtopia::escapeString( comp ); | 467 | text += ", " + Qtopia::escapeString( comp ); |
472 | } | 468 | } |
473 | else if ( comp ) | 469 | else if ( comp ) |
474 | text += "<br>" + Qtopia::escapeString( comp ); | 470 | text += "<br>" + Qtopia::escapeString( comp ); |
475 | text += "<br><hr>"; | 471 | text += "<br><hr>"; |
476 | 472 | ||
477 | // defailt email | 473 | // defailt email |
478 | QString defEmail = defaultEmail(); | 474 | QString defEmail = defaultEmail(); |
479 | if ( !defEmail.isEmpty() ) | 475 | if ( !defEmail.isEmpty() ) |
480 | { | 476 | { |
481 | text += "<b><img src=\"addressbook/email\"> " + QObject::tr( "Default Email: " ) + "</b>" | 477 | text += "<b><img src=\"addressbook/email\"> " + QObject::tr( "Default Email: " ) + "</b>" |
482 | + Qtopia::escapeString( defEmail ); | 478 | + Qtopia::escapeString( defEmail ); |
483 | marker = true; | 479 | marker = true; |
484 | } | 480 | } |
485 | 481 | ||
486 | // business address | 482 | // business address |
487 | if ( !businessStreet().isEmpty() || !businessCity().isEmpty() || | 483 | if ( !businessStreet().isEmpty() || !businessCity().isEmpty() || |
488 | !businessZip().isEmpty() || !businessCountry().isEmpty() ) | 484 | !businessZip().isEmpty() || !businessCountry().isEmpty() ) |
489 | { | 485 | { |
490 | text += QObject::tr( "<br><b>Work Address:</b>" ); | 486 | text += QObject::tr( "<br><b>Work Address:</b>" ); |
491 | marker = true; | 487 | marker = true; |
492 | } | 488 | } |
493 | 489 | ||
494 | if ( !( value = businessStreet() ).isEmpty() ) | 490 | if ( !( value = businessStreet() ).isEmpty() ) |
495 | { | 491 | { |
496 | text += "<br>" + Qtopia::escapeString( value ); | 492 | text += "<br>" + Qtopia::escapeString( value ); |
497 | marker = true; | 493 | marker = true; |
498 | } | 494 | } |
499 | 495 | ||
500 | switch ( addressformat ) | 496 | switch ( addressformat ) |
501 | { | 497 | { |
502 | case Zip_City_State: | 498 | case Zip_City_State: |
503 | { // Zip_Code City, State | 499 | { // Zip_Code City, State |
504 | state = businessState(); | 500 | state = businessState(); |
505 | if ( !( value = businessZip() ).isEmpty() ) | 501 | if ( !( value = businessZip() ).isEmpty() ) |
506 | { | 502 | { |
507 | text += "<br>" + Qtopia::escapeString( value ) + " "; | 503 | text += "<br>" + Qtopia::escapeString( value ) + " "; |
508 | marker = true; | 504 | marker = true; |
509 | 505 | ||
510 | } | 506 | } |
511 | if ( !( value = businessCity() ).isEmpty() ) | 507 | if ( !( value = businessCity() ).isEmpty() ) |
512 | { | 508 | { |
513 | marker = true; | 509 | marker = true; |
514 | if ( businessZip().isEmpty() && !businessStreet().isEmpty() ) | 510 | if ( businessZip().isEmpty() && !businessStreet().isEmpty() ) |
515 | text += "<br>"; | 511 | text += "<br>"; |
516 | text += Qtopia::escapeString( value ); | 512 | text += Qtopia::escapeString( value ); |
517 | if ( state ) | 513 | if ( state ) |
518 | text += ", " + Qtopia::escapeString( state ); | 514 | text += ", " + Qtopia::escapeString( state ); |
519 | } | 515 | } |
520 | else if ( !state.isEmpty() ) | 516 | else if ( !state.isEmpty() ) |
521 | { | 517 | { |
522 | text += "<br>" + Qtopia::escapeString( state ); | 518 | text += "<br>" + Qtopia::escapeString( state ); |
523 | marker = true; | 519 | marker = true; |
524 | } | 520 | } |
525 | break; | 521 | break; |
526 | } | 522 | } |
527 | case City_State_Zip: | 523 | case City_State_Zip: |
528 | { // City, State Zip_Code | 524 | { // City, State Zip_Code |
529 | state = businessState(); | 525 | state = businessState(); |
530 | if ( !( value = businessCity() ).isEmpty() ) | 526 | if ( !( value = businessCity() ).isEmpty() ) |
531 | { | 527 | { |
532 | marker = true; | 528 | marker = true; |
533 | text += "<br>" + Qtopia::escapeString( value ); | 529 | text += "<br>" + Qtopia::escapeString( value ); |
534 | if ( state ) | 530 | if ( state ) |
535 | text += ", " + Qtopia::escapeString( state ); | 531 | text += ", " + Qtopia::escapeString( state ); |
536 | } | 532 | } |
537 | else if ( !state.isEmpty() ) | 533 | else if ( !state.isEmpty() ) |
538 | { | 534 | { |
539 | text += "<br>" + Qtopia::escapeString( state ); | 535 | text += "<br>" + Qtopia::escapeString( state ); |
540 | marker = true; | 536 | marker = true; |
541 | } | 537 | } |
542 | if ( !( value = businessZip() ).isEmpty() ) | 538 | if ( !( value = businessZip() ).isEmpty() ) |
543 | { | 539 | { |
544 | text += " " + Qtopia::escapeString( value ); | 540 | text += " " + Qtopia::escapeString( value ); |
545 | marker = true; | 541 | marker = true; |
546 | } | 542 | } |
547 | break; | 543 | break; |
548 | } | 544 | } |
549 | } | 545 | } |
550 | 546 | ||
551 | if ( !( value = businessCountry() ).isEmpty() ) | 547 | if ( !( value = businessCountry() ).isEmpty() ) |
552 | { | 548 | { |
553 | text += "<br>" + Qtopia::escapeString( value ); | 549 | text += "<br>" + Qtopia::escapeString( value ); |
554 | marker = true; | 550 | marker = true; |
555 | } | 551 | } |
556 | 552 | ||
557 | // rest of Business data | 553 | // rest of Business data |
558 | str = office(); | 554 | str = office(); |
559 | if ( !str.isEmpty() ) | 555 | if ( !str.isEmpty() ) |
560 | { | 556 | { |
561 | text += "<br><b>" + QObject::tr( "Office: " ) + "</b>" | 557 | text += "<br><b>" + QObject::tr( "Office: " ) + "</b>" |
562 | + Qtopia::escapeString( str ); | 558 | + Qtopia::escapeString( str ); |
563 | marker = true; | 559 | marker = true; |
564 | } | 560 | } |
565 | str = businessWebpage(); | 561 | str = businessWebpage(); |
566 | if ( !str.isEmpty() ) | 562 | if ( !str.isEmpty() ) |
567 | { | 563 | { |
568 | text += "<br><b><img src=\"addressbook/webpagework\"> " + QObject::tr( "Business Web Page: " ) + "</b>" | 564 | text += "<br><b><img src=\"addressbook/webpagework\"> " + QObject::tr( "Business Web Page: " ) + "</b>" |
569 | + Qtopia::escapeString( str ); | 565 | + Qtopia::escapeString( str ); |
570 | marker = true; | 566 | marker = true; |
571 | } | 567 | } |
572 | str = businessPhone(); | 568 | str = businessPhone(); |
573 | if ( !str.isEmpty() ) | 569 | if ( !str.isEmpty() ) |
574 | { | 570 | { |
575 | text += "<br><b><img src=\"addressbook/phonework\"> " + QObject::tr( "Business Phone: " ) + "</b>" | 571 | text += "<br><b><img src=\"addressbook/phonework\"> " + QObject::tr( "Business Phone: " ) + "</b>" |
576 | + Qtopia::escapeString( str ); | 572 | + Qtopia::escapeString( str ); |
577 | marker = true; | 573 | marker = true; |
578 | } | 574 | } |
579 | str = businessFax(); | 575 | str = businessFax(); |
580 | if ( !str.isEmpty() ) | 576 | if ( !str.isEmpty() ) |
581 | { | 577 | { |
582 | text += "<br><b><img src=\"addressbook/faxwork\"> " + QObject::tr( "Business Fax: " ) + "</b>" | 578 | text += "<br><b><img src=\"addressbook/faxwork\"> " + QObject::tr( "Business Fax: " ) + "</b>" |
583 | + Qtopia::escapeString( str ); | 579 | + Qtopia::escapeString( str ); |
584 | marker = true; | 580 | marker = true; |
585 | } | 581 | } |
586 | str = businessMobile(); | 582 | str = businessMobile(); |
587 | if ( !str.isEmpty() ) | 583 | if ( !str.isEmpty() ) |
588 | { | 584 | { |
589 | text += "<br><b><img src=\"addressbook/mobilework\"> " + QObject::tr( "Business Mobile: " ) + "</b>" | 585 | text += "<br><b><img src=\"addressbook/mobilework\"> " + QObject::tr( "Business Mobile: " ) + "</b>" |
590 | + Qtopia::escapeString( str ); | 586 | + Qtopia::escapeString( str ); |
591 | marker = true; | 587 | marker = true; |
592 | } | 588 | } |
593 | str = businessPager(); | 589 | str = businessPager(); |
594 | if ( !str.isEmpty() ) | 590 | if ( !str.isEmpty() ) |
595 | { | 591 | { |
596 | text += "<br><b>" + QObject::tr( "Business Pager: " ) + "</b>" | 592 | text += "<br><b>" + QObject::tr( "Business Pager: " ) + "</b>" |
597 | + Qtopia::escapeString( str ); | 593 | + Qtopia::escapeString( str ); |
598 | marker = true; | 594 | marker = true; |
599 | } | 595 | } |
600 | 596 | ||
601 | // text += "<br>"; | 597 | // text += "<br>"; |
602 | 598 | ||
603 | // home address | 599 | // home address |
604 | if ( !homeStreet().isEmpty() || !homeCity().isEmpty() || | 600 | if ( !homeStreet().isEmpty() || !homeCity().isEmpty() || |
605 | !homeZip().isEmpty() || !homeCountry().isEmpty() ) | 601 | !homeZip().isEmpty() || !homeCountry().isEmpty() ) |
606 | { | 602 | { |
607 | text += QObject::tr( "<br><b>Home Address:</b>" ); | 603 | text += QObject::tr( "<br><b>Home Address:</b>" ); |
608 | marker = true; | 604 | marker = true; |
609 | } | 605 | } |
610 | 606 | ||
611 | if ( !( value = homeStreet() ).isEmpty() ) | 607 | if ( !( value = homeStreet() ).isEmpty() ) |
612 | { | 608 | { |
613 | text += "<br>" + Qtopia::escapeString( value ); | 609 | text += "<br>" + Qtopia::escapeString( value ); |
614 | marker = true; | 610 | marker = true; |
615 | } | 611 | } |
616 | 612 | ||
617 | switch ( addressformat ) | 613 | switch ( addressformat ) |
618 | { | 614 | { |
619 | case Zip_City_State: | 615 | case Zip_City_State: |
620 | { // Zip_Code City, State | 616 | { // Zip_Code City, State |
621 | state = homeState(); | 617 | state = homeState(); |
622 | if ( !( value = homeZip() ).isEmpty() ) | 618 | if ( !( value = homeZip() ).isEmpty() ) |
623 | { | 619 | { |
624 | text += "<br>" + Qtopia::escapeString( value ) + " "; | 620 | text += "<br>" + Qtopia::escapeString( value ) + " "; |
625 | marker = true; | 621 | marker = true; |
626 | } | 622 | } |
627 | if ( !( value = homeCity() ).isEmpty() ) | 623 | if ( !( value = homeCity() ).isEmpty() ) |
628 | { | 624 | { |
629 | marker = true; | 625 | marker = true; |
630 | if ( homeZip().isEmpty() && !homeStreet().isEmpty() ) | 626 | if ( homeZip().isEmpty() && !homeStreet().isEmpty() ) |
631 | text += "<br>"; | 627 | text += "<br>"; |
632 | text += Qtopia::escapeString( value ); | 628 | text += Qtopia::escapeString( value ); |
633 | if ( !state.isEmpty() ) | 629 | if ( !state.isEmpty() ) |
634 | text += ", " + Qtopia::escapeString( state ); | 630 | text += ", " + Qtopia::escapeString( state ); |
635 | } | 631 | } |
636 | else if ( !state.isEmpty() ) | 632 | else if ( !state.isEmpty() ) |
637 | { | 633 | { |
638 | text += "<br>" + Qtopia::escapeString( state ); | 634 | text += "<br>" + Qtopia::escapeString( state ); |
639 | marker = true; | 635 | marker = true; |
640 | } | 636 | } |
641 | break; | 637 | break; |
642 | } | 638 | } |
643 | case City_State_Zip: | 639 | case City_State_Zip: |
644 | { // City, State Zip_Code | 640 | { // City, State Zip_Code |
645 | state = homeState(); | 641 | state = homeState(); |
646 | if ( !( value = homeCity() ).isEmpty() ) | 642 | if ( !( value = homeCity() ).isEmpty() ) |
647 | { | 643 | { |
648 | marker = true; | 644 | marker = true; |
649 | text += "<br>" + Qtopia::escapeString( value ); | 645 | text += "<br>" + Qtopia::escapeString( value ); |
650 | if ( state ) | 646 | if ( state ) |
651 | text += ", " + Qtopia::escapeString( state ); | 647 | text += ", " + Qtopia::escapeString( state ); |
652 | } | 648 | } |
653 | else if ( !state.isEmpty() ) | 649 | else if ( !state.isEmpty() ) |
654 | { | 650 | { |
655 | text += "<br>" + Qtopia::escapeString( state ); | 651 | text += "<br>" + Qtopia::escapeString( state ); |
656 | marker = true; | 652 | marker = true; |
657 | } | 653 | } |
658 | if ( !( value = homeZip() ).isEmpty() ) | 654 | if ( !( value = homeZip() ).isEmpty() ) |
659 | { | 655 | { |
660 | text += " " + Qtopia::escapeString( value ); | 656 | text += " " + Qtopia::escapeString( value ); |
661 | marker = true; | 657 | marker = true; |
662 | } | 658 | } |
663 | break; | 659 | break; |
664 | } | 660 | } |
665 | } | 661 | } |
666 | 662 | ||
667 | if ( !( value = homeCountry() ).isEmpty() ) | 663 | if ( !( value = homeCountry() ).isEmpty() ) |
668 | { | 664 | { |
669 | text += "<br>" + Qtopia::escapeString( value ); | 665 | text += "<br>" + Qtopia::escapeString( value ); |
670 | marker = true; | 666 | marker = true; |
671 | } | 667 | } |
672 | 668 | ||
673 | // rest of Home data | 669 | // rest of Home data |
674 | str = homeWebpage(); | 670 | str = homeWebpage(); |
675 | if ( !str.isEmpty() ) | 671 | if ( !str.isEmpty() ) |
676 | { | 672 | { |
677 | text += "<br><b><img src=\"addressbook/webpagehome\"> " + QObject::tr( "Home Web Page: " ) + "</b>" | 673 | text += "<br><b><img src=\"addressbook/webpagehome\"> " + QObject::tr( "Home Web Page: " ) + "</b>" |
678 | + Qtopia::escapeString( str ); | 674 | + Qtopia::escapeString( str ); |
679 | marker = true; | 675 | marker = true; |
680 | } | 676 | } |
681 | str = homePhone(); | 677 | str = homePhone(); |
682 | if ( !str.isEmpty() ) | 678 | if ( !str.isEmpty() ) |
683 | { | 679 | { |
684 | text += "<br><b><img src=\"addressbook/phonehome\"> " + QObject::tr( "Home Phone: " ) + "</b>" | 680 | text += "<br><b><img src=\"addressbook/phonehome\"> " + QObject::tr( "Home Phone: " ) + "</b>" |
685 | + Qtopia::escapeString( str ); | 681 | + Qtopia::escapeString( str ); |
686 | marker = true; | 682 | marker = true; |
687 | } | 683 | } |
688 | str = homeFax(); | 684 | str = homeFax(); |
689 | if ( !str.isEmpty() ) | 685 | if ( !str.isEmpty() ) |
690 | { | 686 | { |
691 | text += "<br><b><img src=\"addressbook/faxhome\"> " + QObject::tr( "Home Fax: " ) + "</b>" | 687 | text += "<br><b><img src=\"addressbook/faxhome\"> " + QObject::tr( "Home Fax: " ) + "</b>" |
692 | + Qtopia::escapeString( str ); | 688 | + Qtopia::escapeString( str ); |
693 | marker = true; | 689 | marker = true; |
694 | } | 690 | } |
695 | str = homeMobile(); | 691 | str = homeMobile(); |
696 | if ( !str.isEmpty() ) | 692 | if ( !str.isEmpty() ) |
697 | { | 693 | { |
698 | text += "<br><b><img src=\"addressbook/mobilehome\"> " + QObject::tr( "Home Mobile: " ) + "</b>" | 694 | text += "<br><b><img src=\"addressbook/mobilehome\"> " + QObject::tr( "Home Mobile: " ) + "</b>" |
699 | + Qtopia::escapeString( str ); | 695 | + Qtopia::escapeString( str ); |
700 | marker = true; | 696 | marker = true; |
701 | } | 697 | } |
702 | 698 | ||
703 | if ( marker ) | 699 | if ( marker ) |
704 | text += "<br><hr>"; | 700 | text += "<br><hr>"; |
705 | 701 | ||
706 | // the rest... | 702 | // the rest... |
707 | str = emails(); | 703 | str = emails(); |
708 | if ( !str.isEmpty() && ( str != defEmail ) ) | 704 | if ( !str.isEmpty() && ( str != defEmail ) ) |
709 | text += "<br><b>" + QObject::tr( "All Emails: " ) + "</b>" | 705 | text += "<br><b>" + QObject::tr( "All Emails: " ) + "</b>" |
710 | + Qtopia::escapeString( str ); | 706 | + Qtopia::escapeString( str ); |
711 | str = profession(); | 707 | str = profession(); |
712 | if ( !str.isEmpty() ) | 708 | if ( !str.isEmpty() ) |
713 | text += "<br><b>" + QObject::tr( "Profession: " ) + "</b>" | 709 | text += "<br><b>" + QObject::tr( "Profession: " ) + "</b>" |
714 | + Qtopia::escapeString( str ); | 710 | + Qtopia::escapeString( str ); |
715 | str = assistant(); | 711 | str = assistant(); |
716 | if ( !str.isEmpty() ) | 712 | if ( !str.isEmpty() ) |
717 | text += "<br><b>" + QObject::tr( "Assistant: " ) + "</b>" | 713 | text += "<br><b>" + QObject::tr( "Assistant: " ) + "</b>" |
718 | + Qtopia::escapeString( str ); | 714 | + Qtopia::escapeString( str ); |
719 | str = manager(); | 715 | str = manager(); |
720 | if ( !str.isEmpty() ) | 716 | if ( !str.isEmpty() ) |
721 | text += "<br><b>" + QObject::tr( "Manager: " ) + "</b>" | 717 | text += "<br><b>" + QObject::tr( "Manager: " ) + "</b>" |
722 | + Qtopia::escapeString( str ); | 718 | + Qtopia::escapeString( str ); |
723 | str = gender(); | 719 | str = gender(); |
724 | if ( !str.isEmpty() && str.toInt() != 0 ) | 720 | if ( !str.isEmpty() && str.toInt() != 0 ) |
725 | { | 721 | { |
726 | text += "<br>"; | 722 | text += "<br>"; |
727 | if ( str.toInt() == 1 ) | 723 | if ( str.toInt() == 1 ) |
728 | str = QObject::tr( "Male" ); | 724 | str = QObject::tr( "Male" ); |
729 | else if ( str.toInt() == 2 ) | 725 | else if ( str.toInt() == 2 ) |
730 | str = QObject::tr( "Female" ); | 726 | str = QObject::tr( "Female" ); |
731 | text += "<b>" + QObject::tr( "Gender: " ) + "</b>" + str; | 727 | text += "<b>" + QObject::tr( "Gender: " ) + "</b>" + str; |
732 | } | 728 | } |
733 | str = spouse(); | 729 | str = spouse(); |
734 | if ( !str.isEmpty() ) | 730 | if ( !str.isEmpty() ) |
735 | text += "<br><b>" + QObject::tr( "Spouse: " ) + "</b>" | 731 | text += "<br><b>" + QObject::tr( "Spouse: " ) + "</b>" |
736 | + Qtopia::escapeString( str ); | 732 | + Qtopia::escapeString( str ); |
737 | if ( birthday().isValid() ) | 733 | if ( birthday().isValid() ) |
738 | { | 734 | { |
739 | str = TimeString::numberDateString( birthday() ); | 735 | str = TimeString::numberDateString( birthday() ); |
740 | text += "<br><b>" + QObject::tr( "Birthday: " ) + "</b>" | 736 | text += "<br><b>" + QObject::tr( "Birthday: " ) + "</b>" |
741 | + Qtopia::escapeString( str ); | 737 | + Qtopia::escapeString( str ); |
742 | } | 738 | } |
743 | if ( anniversary().isValid() ) | 739 | if ( anniversary().isValid() ) |
744 | { | 740 | { |
745 | str = TimeString::numberDateString( anniversary() ); | 741 | str = TimeString::numberDateString( anniversary() ); |
746 | text += "<br><b>" + QObject::tr( "Anniversary: " ) + "</b>" | 742 | text += "<br><b>" + QObject::tr( "Anniversary: " ) + "</b>" |
747 | + Qtopia::escapeString( str ); | 743 | + Qtopia::escapeString( str ); |
748 | } | 744 | } |
749 | str = children(); | 745 | str = children(); |
750 | if ( !str.isEmpty() ) | 746 | if ( !str.isEmpty() ) |
751 | text += "<br><b>" + QObject::tr( "Children: " ) + "</b>" | 747 | text += "<br><b>" + QObject::tr( "Children: " ) + "</b>" |
752 | + Qtopia::escapeString( str ); | 748 | + Qtopia::escapeString( str ); |
753 | 749 | ||
754 | str = nickname(); | 750 | str = nickname(); |
755 | if ( !str.isEmpty() ) | 751 | if ( !str.isEmpty() ) |
756 | text += "<br><b>" + QObject::tr( "Nickname: " ) + "</b>" | 752 | text += "<br><b>" + QObject::tr( "Nickname: " ) + "</b>" |
757 | + Qtopia::escapeString( str ); | 753 | + Qtopia::escapeString( str ); |
758 | 754 | ||
759 | // categories | 755 | // categories |
760 | if ( categoryNames( "Contacts" ).count() ) | 756 | if ( categoryNames( "Contacts" ).count() ) |
761 | { | 757 | { |
762 | text += "<br><b>" + QObject::tr( "Category:" ) + "</b> "; | 758 | text += "<br><b>" + QObject::tr( "Category:" ) + "</b> "; |
763 | text += categoryNames( "Contacts" ).join( ", " ); | 759 | text += categoryNames( "Contacts" ).join( ", " ); |
764 | } | 760 | } |
765 | 761 | ||
766 | // notes last | 762 | // notes last |
767 | if ( !( value = notes() ).isEmpty() ) | 763 | if ( !( value = notes() ).isEmpty() ) |
768 | { | 764 | { |
769 | text += "<br><hr><b>" + QObject::tr( "Notes:" ) + "</b> "; | 765 | text += "<br><hr><b>" + QObject::tr( "Notes:" ) + "</b> "; |
770 | QRegExp reg( "\n" ); | 766 | QRegExp reg( "\n" ); |
771 | 767 | ||
772 | //QString tmp = Qtopia::escapeString(value); | 768 | //QString tmp = Qtopia::escapeString(value); |
773 | QString tmp = QStyleSheet::convertFromPlainText( value ); | 769 | QString tmp = QStyleSheet::convertFromPlainText( value ); |
774 | //tmp.replace( reg, "<br>" ); | 770 | //tmp.replace( reg, "<br>" ); |
775 | text += "<br>" + tmp + "<br>"; | 771 | text += "<br>" + tmp + "<br>"; |
776 | } | 772 | } |
777 | return text; | 773 | return text; |
778 | } | 774 | } |
779 | 775 | ||
780 | /*! | 776 | /*! |
781 | \internal | 777 | \internal |
782 | */ | 778 | */ |
783 | void OPimContact::insert( int key, const QString &v ) | 779 | void OPimContact::insert( int key, const QString &v ) |
784 | { | 780 | { |
785 | QString value = v.stripWhiteSpace(); | 781 | QString value = v.stripWhiteSpace(); |
786 | if ( value.isEmpty() ) | 782 | if ( value.isEmpty() ) |
787 | mMap.remove( key ); | 783 | mMap.remove( key ); |
788 | else | 784 | else |
789 | mMap.insert( key, value ); | 785 | mMap.insert( key, value ); |
790 | } | 786 | } |
791 | 787 | ||
792 | /*! | 788 | /*! |
793 | \internal | 789 | \internal |
794 | */ | 790 | */ |
795 | void OPimContact::replace( int key, const QString & v ) | 791 | void OPimContact::replace( int key, const QString & v ) |
796 | { | 792 | { |
797 | QString value = v.stripWhiteSpace(); | 793 | QString value = v.stripWhiteSpace(); |
798 | if ( value.isEmpty() ) | 794 | if ( value.isEmpty() ) |
799 | mMap.remove( key ); | 795 | mMap.remove( key ); |
800 | else | 796 | else |
801 | mMap.replace( key, value ); | 797 | mMap.replace( key, value ); |
802 | } | 798 | } |
803 | 799 | ||
804 | /*! | 800 | /*! |
805 | \internal | 801 | \internal |
806 | */ | 802 | */ |
807 | QString OPimContact::find( int key ) const | 803 | QString OPimContact::find( int key ) const |
808 | { | 804 | { |
809 | return mMap[ key ]; | 805 | return mMap[ key ]; |
810 | } | 806 | } |
811 | 807 | ||
812 | /*! | 808 | /*! |
813 | \internal | 809 | \internal |
814 | */ | 810 | */ |
815 | QString OPimContact::displayAddress( const QString &street, | 811 | QString OPimContact::displayAddress( const QString &street, |
816 | const QString &city, | 812 | const QString &city, |
817 | const QString &state, | 813 | const QString &state, |
818 | const QString &zip, | 814 | const QString &zip, |
819 | const QString &country ) const | 815 | const QString &country ) const |
820 | { | 816 | { |
821 | QString s = street; | 817 | QString s = street; |
822 | if ( !street.isEmpty() ) | 818 | if ( !street.isEmpty() ) |
823 | s += "\n"; | 819 | s += "\n"; |
824 | s += city; | 820 | s += city; |
825 | if ( !city.isEmpty() && !state.isEmpty() ) | 821 | if ( !city.isEmpty() && !state.isEmpty() ) |
826 | s += ", "; | 822 | s += ", "; |
827 | s += state; | 823 | s += state; |
828 | if ( !state.isEmpty() && !zip.isEmpty() ) | 824 | if ( !state.isEmpty() && !zip.isEmpty() ) |
829 | s += " "; | 825 | s += " "; |
830 | s += zip; | 826 | s += zip; |
831 | if ( !country.isEmpty() && !s.isEmpty() ) | 827 | if ( !country.isEmpty() && !s.isEmpty() ) |
832 | s += "\n"; | 828 | s += "\n"; |
833 | s += country; | 829 | s += country; |
834 | return s; | 830 | return s; |
835 | } | 831 | } |
836 | 832 | ||
837 | /*! | 833 | /*! |
838 | \internal | 834 | \internal |
839 | */ | 835 | */ |
840 | QString OPimContact::displayBusinessAddress() const | 836 | QString OPimContact::displayBusinessAddress() const |
841 | { | 837 | { |
842 | return displayAddress( businessStreet(), businessCity(), | 838 | return displayAddress( businessStreet(), businessCity(), |
843 | businessState(), businessZip(), | 839 | businessState(), businessZip(), |
844 | businessCountry() ); | 840 | businessCountry() ); |
845 | } | 841 | } |
846 | 842 | ||
847 | /*! | 843 | /*! |
848 | \internal | 844 | \internal |
849 | */ | 845 | */ |
850 | QString OPimContact::displayHomeAddress() const | 846 | QString OPimContact::displayHomeAddress() const |
851 | { | 847 | { |
852 | return displayAddress( homeStreet(), homeCity(), | 848 | return displayAddress( homeStreet(), homeCity(), |
853 | homeState(), homeZip(), | 849 | homeState(), homeZip(), |
854 | homeCountry() ); | 850 | homeCountry() ); |
855 | } | 851 | } |
856 | 852 | ||
857 | /*! | 853 | /*! |
858 | Returns the full name of the contact | 854 | Returns the full name of the contact |
859 | */ | 855 | */ |
860 | QString OPimContact::fullName() const | 856 | QString OPimContact::fullName() const |
861 | { | 857 | { |
862 | QString title = find( Qtopia::Title ); | 858 | QString title = find( Qtopia::Title ); |
863 | QString firstName = find( Qtopia::FirstName ); | 859 | QString firstName = find( Qtopia::FirstName ); |
864 | QString middleName = find( Qtopia::MiddleName ); | 860 | QString middleName = find( Qtopia::MiddleName ); |
865 | QString lastName = find( Qtopia::LastName ); | 861 | QString lastName = find( Qtopia::LastName ); |
866 | QString suffix = find( Qtopia::Suffix ); | 862 | QString suffix = find( Qtopia::Suffix ); |
867 | 863 | ||
868 | QString name = title; | 864 | QString name = title; |
869 | if ( !firstName.isEmpty() ) | 865 | if ( !firstName.isEmpty() ) |
870 | { | 866 | { |
871 | if ( !name.isEmpty() ) | 867 | if ( !name.isEmpty() ) |
872 | name += " "; | 868 | name += " "; |
873 | name += firstName; | 869 | name += firstName; |
874 | } | 870 | } |
875 | if ( !middleName.isEmpty() ) | 871 | if ( !middleName.isEmpty() ) |
876 | { | 872 | { |
877 | if ( !name.isEmpty() ) | 873 | if ( !name.isEmpty() ) |
878 | name += " "; | 874 | name += " "; |
879 | name += middleName; | 875 | name += middleName; |
880 | } | 876 | } |
881 | if ( !lastName.isEmpty() ) | 877 | if ( !lastName.isEmpty() ) |
882 | { | 878 | { |
883 | if ( !name.isEmpty() ) | 879 | if ( !name.isEmpty() ) |
884 | name += " "; | 880 | name += " "; |
885 | name += lastName; | 881 | name += lastName; |
886 | } | 882 | } |
887 | if ( !suffix.isEmpty() ) | 883 | if ( !suffix.isEmpty() ) |
888 | { | 884 | { |
889 | if ( !name.isEmpty() ) | 885 | if ( !name.isEmpty() ) |
890 | name += " "; | 886 | name += " "; |
891 | name += suffix; | 887 | name += suffix; |
892 | } | 888 | } |
893 | return name.simplifyWhiteSpace(); | 889 | return name.simplifyWhiteSpace(); |
894 | } | 890 | } |
895 | 891 | ||
896 | /*! | 892 | /*! |
897 | Returns a list of the names of the children of the contact. | 893 | Returns a list of the names of the children of the contact. |
898 | */ | 894 | */ |
899 | QStringList OPimContact::childrenList() const | 895 | QStringList OPimContact::childrenList() const |
900 | { | 896 | { |
901 | return QStringList::split( " ", find( Qtopia::Children ) ); | 897 | return QStringList::split( " ", find( Qtopia::Children ) ); |
902 | } | 898 | } |
903 | 899 | ||
904 | /*! \fn void OPimContact::insertEmail( const QString &email ) | 900 | /*! \fn void OPimContact::insertEmail( const QString &email ) |
905 | 901 | ||
906 | Insert \a email into the email list. Ensures \a email can only be added | 902 | Insert \a email into the email list. Ensures \a email can only be added |
907 | once. If there is no default email address set, it sets it to the \a email. | 903 | once. If there is no default email address set, it sets it to the \a email. |
908 | */ | 904 | */ |
909 | 905 | ||
910 | /*! \fn void OPimContact::removeEmail( const QString &email ) | 906 | /*! \fn void OPimContact::removeEmail( const QString &email ) |
911 | 907 | ||
912 | Removes the \a email from the email list. If the default email was \a email, | 908 | Removes the \a email from the email list. If the default email was \a email, |
913 | then the default email address is assigned to the first email in the | 909 | then the default email address is assigned to the first email in the |
914 | email list | 910 | email list |
915 | */ | 911 | */ |
916 | 912 | ||
917 | /*! \fn void OPimContact::clearEmails() | 913 | /*! \fn void OPimContact::clearEmails() |
918 | 914 | ||
919 | Clears the email list. | 915 | Clears the email list. |
920 | */ | 916 | */ |
921 | 917 | ||
922 | /*! \fn void OPimContact::insertEmails( const QStringList &emailList ) | 918 | /*! \fn void OPimContact::insertEmails( const QStringList &emailList ) |
923 | 919 | ||
924 | Appends the \a emailList to the exiting email list | 920 | Appends the \a emailList to the exiting email list |
925 | */ | 921 | */ |
926 | 922 | ||
927 | /*! | 923 | /*! |
928 | Returns a list of email addresses belonging to the contact, including | 924 | Returns a list of email addresses belonging to the contact, including |
929 | the default email address. | 925 | the default email address. |
930 | */ | 926 | */ |
931 | QStringList OPimContact::emailList() const | 927 | QStringList OPimContact::emailList() const |
932 | { | 928 | { |
933 | QString emailStr = emails(); | 929 | QString emailStr = emails(); |
934 | 930 | ||
935 | QStringList r; | 931 | QStringList r; |
936 | if ( !emailStr.isEmpty() ) | 932 | if ( !emailStr.isEmpty() ) |
937 | { | 933 | { |
938 | qDebug( " emailstr " ); | 934 | qDebug( " emailstr " ); |
939 | QStringList l = QStringList::split( emailSeparator(), emailStr ); | 935 | QStringList l = QStringList::split( emailSeparator(), emailStr ); |
940 | for ( QStringList::ConstIterator it = l.begin();it != l.end();++it ) | 936 | for ( QStringList::ConstIterator it = l.begin();it != l.end();++it ) |
941 | r += ( *it ).simplifyWhiteSpace(); | 937 | r += ( *it ).simplifyWhiteSpace(); |
942 | } | 938 | } |
943 | 939 | ||
944 | return r; | 940 | return r; |
945 | } | 941 | } |
946 | 942 | ||
947 | /*! | 943 | /*! |
948 | \overload | 944 | \overload |
949 | 945 | ||
950 | Generates the string for the contact to be filed as from the first, | 946 | Generates the string for the contact to be filed as from the first, |
951 | middle and last name of the contact. | 947 | middle and last name of the contact. |
952 | */ | 948 | */ |
953 | void OPimContact::setFileAs() | 949 | void OPimContact::setFileAs() |
954 | { | 950 | { |
955 | QString lastName, firstName, middleName, fileas; | 951 | QString lastName, firstName, middleName, fileas; |
956 | 952 | ||
957 | lastName = find( Qtopia::LastName ); | 953 | lastName = find( Qtopia::LastName ); |
958 | firstName = find( Qtopia::FirstName ); | 954 | firstName = find( Qtopia::FirstName ); |
959 | middleName = find( Qtopia::MiddleName ); | 955 | middleName = find( Qtopia::MiddleName ); |
960 | if ( !lastName.isEmpty() && !firstName.isEmpty() | 956 | if ( !lastName.isEmpty() && !firstName.isEmpty() |
961 | && !middleName.isEmpty() ) | 957 | && !middleName.isEmpty() ) |
962 | fileas = lastName + ", " + firstName + " " + middleName; | 958 | fileas = lastName + ", " + firstName + " " + middleName; |
963 | else if ( !lastName.isEmpty() && !firstName.isEmpty() ) | 959 | else if ( !lastName.isEmpty() && !firstName.isEmpty() ) |
964 | fileas = lastName + ", " + firstName; | 960 | fileas = lastName + ", " + firstName; |
965 | else if ( !lastName.isEmpty() || !firstName.isEmpty() || | 961 | else if ( !lastName.isEmpty() || !firstName.isEmpty() || |
966 | !middleName.isEmpty() ) | 962 | !middleName.isEmpty() ) |
967 | fileas = firstName + ( firstName.isEmpty() ? "" : " " ) | 963 | fileas = firstName + ( firstName.isEmpty() ? "" : " " ) |
968 | + middleName + ( middleName.isEmpty() ? "" : " " ) | 964 | + middleName + ( middleName.isEmpty() ? "" : " " ) |
969 | + lastName; | 965 | + lastName; |
970 | 966 | ||
971 | replace( Qtopia::FileAs, fileas ); | 967 | replace( Qtopia::FileAs, fileas ); |
972 | } | 968 | } |
973 | 969 | ||
974 | /*! | 970 | /*! |
975 | \internal | 971 | \internal |
976 | Appends the contact information to \a buf. | 972 | Appends the contact information to \a buf. |
977 | */ | 973 | */ |
978 | void OPimContact::save( QString &buf ) const | 974 | void OPimContact::save( QString &buf ) const |
979 | { | 975 | { |
980 | static const QStringList SLFIELDS = fields(); | 976 | static const QStringList SLFIELDS = fields(); |
981 | // I'm expecting "<Contact " in front of this... | 977 | // I'm expecting "<Contact " in front of this... |
982 | for ( QMap<int, QString>::ConstIterator it = mMap.begin(); | 978 | for ( QMap<int, QString>::ConstIterator it = mMap.begin(); |
983 | it != mMap.end(); ++it ) | 979 | it != mMap.end(); ++it ) |
984 | { | 980 | { |
985 | const QString &value = it.data(); | 981 | const QString &value = it.data(); |
986 | int key = it.key(); | 982 | int key = it.key(); |
987 | if ( !value.isEmpty() ) | 983 | if ( !value.isEmpty() ) |
988 | { | 984 | { |
989 | if ( key == Qtopia::AddressCategory || key == Qtopia::AddressUid ) | 985 | if ( key == Qtopia::AddressCategory || key == Qtopia::AddressUid ) |
990 | continue; | 986 | continue; |
991 | 987 | ||
992 | key -= Qtopia::AddressCategory + 1; | 988 | key -= Qtopia::AddressCategory + 1; |
993 | buf += SLFIELDS[ key ]; | 989 | buf += SLFIELDS[ key ]; |
994 | buf += "=\"" + Qtopia::escapeString( value ) + "\" "; | 990 | buf += "=\"" + Qtopia::escapeString( value ) + "\" "; |
995 | } | 991 | } |
996 | } | 992 | } |
997 | buf += customToXml(); | 993 | buf += customToXml(); |
998 | if ( categories().count() > 0 ) | 994 | if ( categories().count() > 0 ) |
999 | buf += "Categories=\"" + idsToString( categories() ) + "\" "; | 995 | buf += "Categories=\"" + idsToString( categories() ) + "\" "; |
1000 | buf += "Uid=\"" + QString::number( uid() ) + "\" "; | 996 | buf += "Uid=\"" + QString::number( uid() ) + "\" "; |
1001 | // You need to close this yourself | 997 | // You need to close this yourself |
1002 | } | 998 | } |
1003 | 999 | ||
1004 | 1000 | ||
1005 | /*! | 1001 | /*! |
1006 | \internal | 1002 | \internal |
1007 | Returns the list of fields belonging to a contact | 1003 | Returns the list of fields belonging to a contact |
1008 | Never change order of this list ! It has to be regarding | 1004 | Never change order of this list ! It has to be regarding |
1009 | enum AddressBookFields !! | 1005 | enum AddressBookFields !! |
1010 | */ | 1006 | */ |
1011 | QStringList OPimContact::fields() | 1007 | QStringList OPimContact::fields() |
1012 | { | 1008 | { |
1013 | QStringList list; | 1009 | QStringList list; |
1014 | 1010 | ||
1015 | list.append( "Title" ); // Not Used! | 1011 | list.append( "Title" ); // Not Used! |
1016 | list.append( "FirstName" ); | 1012 | list.append( "FirstName" ); |
1017 | list.append( "MiddleName" ); | 1013 | list.append( "MiddleName" ); |
1018 | list.append( "LastName" ); | 1014 | list.append( "LastName" ); |
1019 | list.append( "Suffix" ); | 1015 | list.append( "Suffix" ); |
1020 | list.append( "FileAs" ); | 1016 | list.append( "FileAs" ); |
1021 | 1017 | ||
1022 | list.append( "JobTitle" ); | 1018 | list.append( "JobTitle" ); |
1023 | list.append( "Department" ); | 1019 | list.append( "Department" ); |
1024 | list.append( "Company" ); | 1020 | list.append( "Company" ); |
1025 | list.append( "BusinessPhone" ); | 1021 | list.append( "BusinessPhone" ); |
1026 | list.append( "BusinessFax" ); | 1022 | list.append( "BusinessFax" ); |
1027 | list.append( "BusinessMobile" ); | 1023 | list.append( "BusinessMobile" ); |
1028 | 1024 | ||
1029 | list.append( "DefaultEmail" ); | 1025 | list.append( "DefaultEmail" ); |
1030 | list.append( "Emails" ); | 1026 | list.append( "Emails" ); |
1031 | 1027 | ||
1032 | list.append( "HomePhone" ); | 1028 | list.append( "HomePhone" ); |
1033 | list.append( "HomeFax" ); | 1029 | list.append( "HomeFax" ); |
1034 | list.append( "HomeMobile" ); | 1030 | list.append( "HomeMobile" ); |
1035 | 1031 | ||
1036 | list.append( "BusinessStreet" ); | 1032 | list.append( "BusinessStreet" ); |
1037 | list.append( "BusinessCity" ); | 1033 | list.append( "BusinessCity" ); |
1038 | list.append( "BusinessState" ); | 1034 | list.append( "BusinessState" ); |
1039 | list.append( "BusinessZip" ); | 1035 | list.append( "BusinessZip" ); |
1040 | list.append( "BusinessCountry" ); | 1036 | list.append( "BusinessCountry" ); |
1041 | list.append( "BusinessPager" ); | 1037 | list.append( "BusinessPager" ); |
1042 | list.append( "BusinessWebPage" ); | 1038 | list.append( "BusinessWebPage" ); |
1043 | 1039 | ||
1044 | list.append( "Office" ); | 1040 | list.append( "Office" ); |
1045 | list.append( "Profession" ); | 1041 | list.append( "Profession" ); |
1046 | list.append( "Assistant" ); | 1042 | list.append( "Assistant" ); |
1047 | list.append( "Manager" ); | 1043 | list.append( "Manager" ); |
1048 | 1044 | ||
1049 | list.append( "HomeStreet" ); | 1045 | list.append( "HomeStreet" ); |
1050 | list.append( "HomeCity" ); | 1046 | list.append( "HomeCity" ); |
1051 | list.append( "HomeState" ); | 1047 | list.append( "HomeState" ); |
1052 | list.append( "HomeZip" ); | 1048 | list.append( "HomeZip" ); |
1053 | list.append( "HomeCountry" ); | 1049 | list.append( "HomeCountry" ); |
1054 | list.append( "HomeWebPage" ); | 1050 | list.append( "HomeWebPage" ); |
1055 | 1051 | ||
1056 | list.append( "Spouse" ); | 1052 | list.append( "Spouse" ); |
1057 | list.append( "Gender" ); | 1053 | list.append( "Gender" ); |
1058 | list.append( "Birthday" ); | 1054 | list.append( "Birthday" ); |
1059 | list.append( "Anniversary" ); | 1055 | list.append( "Anniversary" ); |
1060 | list.append( "Nickname" ); | 1056 | list.append( "Nickname" ); |
1061 | list.append( "Children" ); | 1057 | list.append( "Children" ); |
1062 | 1058 | ||
1063 | list.append( "Notes" ); | 1059 | list.append( "Notes" ); |
1064 | list.append( "Groups" ); | 1060 | list.append( "Groups" ); |
1065 | 1061 | ||
1066 | return list; | 1062 | return list; |
1067 | } | 1063 | } |
1068 | 1064 | ||
1069 | 1065 | ||
1070 | /*! | 1066 | /*! |
1071 | Sets the list of email address for contact to those contained in \a str. | 1067 | Sets the list of email address for contact to those contained in \a str. |
1072 | Email address should be separated by ';'s. | 1068 | Email address should be separated by ';'s. |
1073 | */ | 1069 | */ |
1074 | void OPimContact::setEmails( const QString &str ) | 1070 | void OPimContact::setEmails( const QString &str ) |
1075 | { | 1071 | { |
1076 | replace( Qtopia::Emails, str ); | 1072 | replace( Qtopia::Emails, str ); |
1077 | if ( str.isEmpty() ) | 1073 | if ( str.isEmpty() ) |
1078 | setDefaultEmail( QString::null ); | 1074 | setDefaultEmail( QString::null ); |
1079 | } | 1075 | } |
1080 | 1076 | ||
1081 | /*! | 1077 | /*! |
1082 | Sets the list of children for the contact to those contained in \a str. | 1078 | Sets the list of children for the contact to those contained in \a str. |
1083 | */ | 1079 | */ |
1084 | void OPimContact::setChildren( const QString &str ) | 1080 | void OPimContact::setChildren( const QString &str ) |
1085 | { | 1081 | { |
1086 | replace( Qtopia::Children, str ); | 1082 | replace( Qtopia::Children, str ); |
1087 | } | 1083 | } |
1088 | 1084 | ||
1089 | /*! | 1085 | /*! |
1090 | \overload | 1086 | \overload |
1091 | Returns TRUE if the contact matches the regular expression \a regexp. | 1087 | Returns TRUE if the contact matches the regular expression \a regexp. |
1092 | Otherwise returns FALSE. | 1088 | Otherwise returns FALSE. |
1093 | */ | 1089 | */ |
1094 | bool OPimContact::match( const QRegExp &r ) const | 1090 | bool OPimContact::match( const QRegExp &r ) const |
1095 | { | 1091 | { |
1096 | setLastHitField( -1 ); | 1092 | setLastHitField( -1 ); |
1097 | bool match; | 1093 | bool match; |
1098 | match = false; | 1094 | match = false; |
1099 | QMap<int, QString>::ConstIterator it; | 1095 | QMap<int, QString>::ConstIterator it; |
1100 | for ( it = mMap.begin(); it != mMap.end(); ++it ) | 1096 | for ( it = mMap.begin(); it != mMap.end(); ++it ) |
1101 | { | 1097 | { |
1102 | if ( ( *it ).find( r ) > -1 ) | 1098 | if ( ( *it ).find( r ) > -1 ) |
1103 | { | 1099 | { |
1104 | setLastHitField( it.key() ); | 1100 | setLastHitField( it.key() ); |
1105 | match = true; | 1101 | match = true; |
1106 | break; | 1102 | break; |
1107 | } | 1103 | } |
1108 | } | 1104 | } |
1109 | return match; | 1105 | return match; |
1110 | } | 1106 | } |
1111 | 1107 | ||
1112 | 1108 | ||
1113 | QString OPimContact::toShortText() const | 1109 | QString OPimContact::toShortText() const |
1114 | { | 1110 | { |
1115 | return ( fullName() ); | 1111 | return ( fullName() ); |
1116 | } | 1112 | } |
1117 | 1113 | ||
1118 | 1114 | ||
1119 | QString OPimContact::type() const | 1115 | QString OPimContact::type() const |
1120 | { | 1116 | { |
1121 | return QString::fromLatin1( "OPimContact" ); | 1117 | return QString::fromLatin1( "OPimContact" ); |
1122 | } | 1118 | } |
1123 | 1119 | ||
1124 | 1120 | ||
1125 | class QString OPimContact::recordField( int pos ) const | 1121 | class QString OPimContact::recordField( int pos ) const |
1126 | { | 1122 | { |
1127 | QStringList SLFIELDS = fields(); // ?? why this ? (se) | 1123 | QStringList SLFIELDS = fields(); // ?? why this ? (se) |
1128 | return SLFIELDS[ pos ]; | 1124 | return SLFIELDS[ pos ]; |
1129 | } | 1125 | } |
1130 | 1126 | ||
1131 | // In future releases, we should store birthday and anniversary | 1127 | // In future releases, we should store birthday and anniversary |
1132 | // internally as QDate instead of QString ! | 1128 | // internally as QDate instead of QString ! |
1133 | // QString is always too complicate to interprete (DD.MM.YY, DD/MM/YY, MM/DD/YY, etc..)(se) | 1129 | // QString is always too complicate to interprete (DD.MM.YY, DD/MM/YY, MM/DD/YY, etc..)(se) |
1134 | 1130 | ||
1135 | /*! \fn void OPimContact::setBirthday( const QDate& date ) | 1131 | /*! \fn void OPimContact::setBirthday( const QDate& date ) |
1136 | Sets the birthday for the contact to \a date. If date is null | 1132 | Sets the birthday for the contact to \a date. If date is null |
1137 | the current stored date will be removed. | 1133 | the current stored date will be removed. |
1138 | */ | 1134 | */ |
1139 | void OPimContact::setBirthday( const QDate &v ) | 1135 | void OPimContact::setBirthday( const QDate &v ) |
1140 | { | 1136 | { |
1141 | if ( v.isNull() ) | 1137 | if ( v.isNull() ) |
1142 | { | 1138 | { |
1143 | qWarning( "Remove Birthday" ); | 1139 | qWarning( "Remove Birthday" ); |
1144 | replace( Qtopia::Birthday, QString::null ); | 1140 | replace( Qtopia::Birthday, QString::null ); |
1145 | return ; | 1141 | return ; |
1146 | } | 1142 | } |
1147 | 1143 | ||
1148 | if ( v.isValid() ) | 1144 | if ( v.isValid() ) |
1149 | replace( Qtopia::Birthday, OPimDateConversion::dateToString( v ) ); | 1145 | replace( Qtopia::Birthday, OPimDateConversion::dateToString( v ) ); |
1150 | 1146 | ||
1151 | } | 1147 | } |
1152 | 1148 | ||
1153 | 1149 | ||
1154 | /*! \fn void OPimContact::setAnniversary( const QDate &date ) | 1150 | /*! \fn void OPimContact::setAnniversary( const QDate &date ) |
1155 | Sets the anniversary of the contact to \a date. If date is | 1151 | Sets the anniversary of the contact to \a date. If date is |
1156 | null, the current stored date will be removed. | 1152 | null, the current stored date will be removed. |
1157 | */ | 1153 | */ |
1158 | void OPimContact::setAnniversary( const QDate &v ) | 1154 | void OPimContact::setAnniversary( const QDate &v ) |
1159 | { | 1155 | { |
1160 | if ( v.isNull() ) | 1156 | if ( v.isNull() ) |
1161 | { | 1157 | { |
1162 | qWarning( "Remove Anniversary" ); | 1158 | qWarning( "Remove Anniversary" ); |
1163 | replace( Qtopia::Anniversary, QString::null ); | 1159 | replace( Qtopia::Anniversary, QString::null ); |
1164 | return ; | 1160 | return ; |
1165 | } | 1161 | } |
1166 | 1162 | ||
1167 | if ( v.isValid() ) | 1163 | if ( v.isValid() ) |
1168 | replace( Qtopia::Anniversary, OPimDateConversion::dateToString( v ) ); | 1164 | replace( Qtopia::Anniversary, OPimDateConversion::dateToString( v ) ); |
1169 | } | 1165 | } |
1170 | 1166 | ||
1171 | 1167 | ||
1172 | /*! \fn QDate OPimContact::birthday() const | 1168 | /*! \fn QDate OPimContact::birthday() const |
1173 | Returns the birthday of the contact. | 1169 | Returns the birthday of the contact. |
1174 | */ | 1170 | */ |
1175 | QDate OPimContact::birthday() const | 1171 | QDate OPimContact::birthday() const |
1176 | { | 1172 | { |
1177 | QString str = find( Qtopia::Birthday ); | 1173 | QString str = find( Qtopia::Birthday ); |
1178 | // qWarning ("Birthday %s", str.latin1() ); | 1174 | // qWarning ("Birthday %s", str.latin1() ); |
1179 | if ( !str.isEmpty() ) | 1175 | if ( !str.isEmpty() ) |
1180 | return OPimDateConversion::dateFromString ( str ); | 1176 | return OPimDateConversion::dateFromString ( str ); |
1181 | else | 1177 | else |
1182 | return QDate(); | 1178 | return QDate(); |
1183 | } | 1179 | } |
1184 | 1180 | ||
1185 | 1181 | ||
1186 | /*! \fn QDate OPimContact::anniversary() const | 1182 | /*! \fn QDate OPimContact::anniversary() const |
1187 | Returns the anniversary of the contact. | 1183 | Returns the anniversary of the contact. |
1188 | */ | 1184 | */ |
1189 | QDate OPimContact::anniversary() const | 1185 | QDate OPimContact::anniversary() const |
1190 | { | 1186 | { |
1191 | QDate empty; | 1187 | QDate empty; |
1192 | QString str = find( Qtopia::Anniversary ); | 1188 | QString str = find( Qtopia::Anniversary ); |
1193 | // qWarning ("Anniversary %s", str.latin1() ); | 1189 | // qWarning ("Anniversary %s", str.latin1() ); |
1194 | if ( !str.isEmpty() ) | 1190 | if ( !str.isEmpty() ) |
1195 | return OPimDateConversion::dateFromString ( str ); | 1191 | return OPimDateConversion::dateFromString ( str ); |
1196 | else | 1192 | else |
1197 | return empty; | 1193 | return empty; |
1198 | } | 1194 | } |
1199 | 1195 | ||
1200 | 1196 | ||
1201 | void OPimContact::insertEmail( const QString &v ) | 1197 | void OPimContact::insertEmail( const QString &v ) |
1202 | { | 1198 | { |
1203 | //qDebug("insertEmail %s", v.latin1()); | 1199 | //qDebug("insertEmail %s", v.latin1()); |
1204 | QString e = v.simplifyWhiteSpace(); | 1200 | QString e = v.simplifyWhiteSpace(); |
1205 | QString def = defaultEmail(); | 1201 | QString def = defaultEmail(); |
1206 | 1202 | ||
1207 | // if no default, set it as the default email and don't insert | 1203 | // if no default, set it as the default email and don't insert |
1208 | if ( def.isEmpty() ) | 1204 | if ( def.isEmpty() ) |
1209 | { | 1205 | { |
1210 | setDefaultEmail( e ); // will insert into the list for us | 1206 | setDefaultEmail( e ); // will insert into the list for us |
1211 | return ; | 1207 | return ; |
1212 | } | 1208 | } |
1213 | 1209 | ||
1214 | // otherwise, insert assuming doesn't already exist | 1210 | // otherwise, insert assuming doesn't already exist |
1215 | QString emailsStr = find( Qtopia::Emails ); | 1211 | QString emailsStr = find( Qtopia::Emails ); |
1216 | if ( emailsStr.contains( e ) ) | 1212 | if ( emailsStr.contains( e ) ) |
1217 | return ; | 1213 | return ; |
1218 | if ( !emailsStr.isEmpty() ) | 1214 | if ( !emailsStr.isEmpty() ) |
1219 | emailsStr += emailSeparator(); | 1215 | emailsStr += emailSeparator(); |
1220 | emailsStr += e; | 1216 | emailsStr += e; |
1221 | replace( Qtopia::Emails, emailsStr ); | 1217 | replace( Qtopia::Emails, emailsStr ); |
1222 | } | 1218 | } |
1223 | 1219 | ||
1224 | 1220 | ||
1225 | void OPimContact::removeEmail( const QString &v ) | 1221 | void OPimContact::removeEmail( const QString &v ) |
1226 | { | 1222 | { |
1227 | QString e = v.simplifyWhiteSpace(); | 1223 | QString e = v.simplifyWhiteSpace(); |
1228 | QString def = defaultEmail(); | 1224 | QString def = defaultEmail(); |
1229 | QString emailsStr = find( Qtopia::Emails ); | 1225 | QString emailsStr = find( Qtopia::Emails ); |
1230 | QStringList emails = emailList(); | 1226 | QStringList emails = emailList(); |
1231 | 1227 | ||
1232 | // otherwise, must first contain it | 1228 | // otherwise, must first contain it |
1233 | if ( !emailsStr.contains( e ) ) | 1229 | if ( !emailsStr.contains( e ) ) |
1234 | return ; | 1230 | return ; |
1235 | 1231 | ||
1236 | // remove it | 1232 | // remove it |
1237 | //qDebug(" removing email from list %s", e.latin1()); | 1233 | //qDebug(" removing email from list %s", e.latin1()); |
1238 | emails.remove( e ); | 1234 | emails.remove( e ); |
1239 | // reset the string | 1235 | // reset the string |
1240 | emailsStr = emails.join( emailSeparator() ); // Sharp's brain dead separator | 1236 | emailsStr = emails.join( emailSeparator() ); // Sharp's brain dead separator |
1241 | replace( Qtopia::Emails, emailsStr ); | 1237 | replace( Qtopia::Emails, emailsStr ); |
1242 | 1238 | ||
1243 | // if default, then replace the default email with the first one | 1239 | // if default, then replace the default email with the first one |
1244 | if ( def == e ) | 1240 | if ( def == e ) |
1245 | { | 1241 | { |
1246 | //qDebug("removeEmail is default; setting new default"); | 1242 | //qDebug("removeEmail is default; setting new default"); |
1247 | if ( !emails.count() ) | 1243 | if ( !emails.count() ) |
1248 | clearEmails(); | 1244 | clearEmails(); |
1249 | else // setDefaultEmail will remove e from the list | 1245 | else // setDefaultEmail will remove e from the list |
1250 | setDefaultEmail( emails.first() ); | 1246 | setDefaultEmail( emails.first() ); |
1251 | } | 1247 | } |
1252 | } | 1248 | } |
1253 | 1249 | ||
1254 | 1250 | ||
1255 | void OPimContact::clearEmails() | 1251 | void OPimContact::clearEmails() |
1256 | { | 1252 | { |
1257 | mMap.remove( Qtopia::DefaultEmail ); | 1253 | mMap.remove( Qtopia::DefaultEmail ); |
1258 | mMap.remove( Qtopia::Emails ); | 1254 | mMap.remove( Qtopia::Emails ); |
1259 | } | 1255 | } |
1260 | 1256 | ||
1261 | 1257 | ||
1262 | void OPimContact::setDefaultEmail( const QString &v ) | 1258 | void OPimContact::setDefaultEmail( const QString &v ) |
1263 | { | 1259 | { |
1264 | QString e = v.simplifyWhiteSpace(); | 1260 | QString e = v.simplifyWhiteSpace(); |
1265 | 1261 | ||
1266 | //qDebug("OPimContact::setDefaultEmail %s", e.latin1()); | 1262 | //qDebug("OPimContact::setDefaultEmail %s", e.latin1()); |
1267 | replace( Qtopia::DefaultEmail, e ); | 1263 | replace( Qtopia::DefaultEmail, e ); |
1268 | 1264 | ||
1269 | if ( !e.isEmpty() ) | 1265 | if ( !e.isEmpty() ) |
1270 | insertEmail( e ); | 1266 | insertEmail( e ); |
1271 | 1267 | ||
1272 | } | 1268 | } |
1273 | 1269 | ||
1274 | 1270 | ||
1275 | void OPimContact::insertEmails( const QStringList &v ) | 1271 | void OPimContact::insertEmails( const QStringList &v ) |
1276 | { | 1272 | { |
1277 | for ( QStringList::ConstIterator it = v.begin(); it != v.end(); ++it ) | 1273 | for ( QStringList::ConstIterator it = v.begin(); it != v.end(); ++it ) |
1278 | insertEmail( *it ); | 1274 | insertEmail( *it ); |
1279 | } | 1275 | } |
1280 | 1276 | ||
1281 | 1277 | ||
1282 | int OPimContact::rtti() | 1278 | int OPimContact::rtti() |
1283 | { | 1279 | { |
1284 | return OPimResolver::AddressBook; | 1280 | return OPimResolver::AddressBook; |
1285 | } | 1281 | } |
1286 | 1282 | ||
1287 | 1283 | ||
1288 | void OPimContact::setUid( int i ) | 1284 | void OPimContact::setUid( int i ) |
1289 | { | 1285 | { |
1290 | OPimRecord::setUid( i ); | 1286 | OPimRecord::setUid( i ); |
1291 | replace( Qtopia::AddressUid , QString::number( i ) ); | 1287 | replace( Qtopia::AddressUid , QString::number( i ) ); |
1292 | } | 1288 | } |
1293 | } | 1289 | } |
diff --git a/libopie2/opiepim/core/opimcontactfields.cpp b/libopie2/opiepim/core/opimcontactfields.cpp index 4b0ba3b..120beb6 100644 --- a/libopie2/opiepim/core/opimcontactfields.cpp +++ b/libopie2/opiepim/core/opimcontactfields.cpp | |||
@@ -1,518 +1,516 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) Stefan Eilers <eilers.stefan@epost.de> | 3 | Copyright (C) Stefan Eilers <eilers.stefan@epost.de> |
4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> | 4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> |
5 | .=l. | 5 | .=l. |
6 | .>+-= | 6 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 7 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 8 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 11 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 12 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include "opimcontactfields.h" | 30 | #include "opimcontactfields.h" |
31 | 31 | ||
32 | /* OPIE */ | 32 | /* OPIE */ |
33 | #include <opie2/opimcontact.h> | 33 | #include <opie2/opimcontact.h> |
34 | #include <qpe/recordfields.h> // We should use our own enum in the future .. | ||
35 | #include <qpe/config.h> | 34 | #include <qpe/config.h> |
36 | 35 | ||
37 | /* QT */ | 36 | /* QT */ |
38 | #include <qobject.h> | 37 | #include <qobject.h> |
39 | #include <qstringlist.h> | ||
40 | 38 | ||
41 | 39 | ||
42 | namespace Opie | 40 | namespace Opie |
43 | { | 41 | { |
44 | /*! | 42 | /*! |
45 | \internal | 43 | \internal |
46 | Returns a list of personal field names for a contact. | 44 | Returns a list of personal field names for a contact. |
47 | */ | 45 | */ |
48 | QStringList OPimContactFields::personalfields( bool sorted, bool translated ) | 46 | QStringList OPimContactFields::personalfields( bool sorted, bool translated ) |
49 | { | 47 | { |
50 | QStringList list; | 48 | QStringList list; |
51 | QMap<int, QString> mapIdToStr; | 49 | QMap<int, QString> mapIdToStr; |
52 | if ( translated ) | 50 | if ( translated ) |
53 | mapIdToStr = idToTrFields(); | 51 | mapIdToStr = idToTrFields(); |
54 | else | 52 | else |
55 | mapIdToStr = idToUntrFields(); | 53 | mapIdToStr = idToUntrFields(); |
56 | 54 | ||
57 | list.append( mapIdToStr[ Qtopia::AddressUid ] ); | 55 | list.append( mapIdToStr[ Qtopia::AddressUid ] ); |
58 | list.append( mapIdToStr[ Qtopia::AddressCategory ] ); | 56 | list.append( mapIdToStr[ Qtopia::AddressCategory ] ); |
59 | 57 | ||
60 | list.append( mapIdToStr[ Qtopia::Title ] ); | 58 | list.append( mapIdToStr[ Qtopia::Title ] ); |
61 | list.append( mapIdToStr[ Qtopia::FirstName ] ); | 59 | list.append( mapIdToStr[ Qtopia::FirstName ] ); |
62 | list.append( mapIdToStr[ Qtopia::MiddleName ] ); | 60 | list.append( mapIdToStr[ Qtopia::MiddleName ] ); |
63 | list.append( mapIdToStr[ Qtopia::LastName ] ); | 61 | list.append( mapIdToStr[ Qtopia::LastName ] ); |
64 | list.append( mapIdToStr[ Qtopia::Suffix ] ); | 62 | list.append( mapIdToStr[ Qtopia::Suffix ] ); |
65 | list.append( mapIdToStr[ Qtopia::FileAs ] ); | 63 | list.append( mapIdToStr[ Qtopia::FileAs ] ); |
66 | 64 | ||
67 | list.append( mapIdToStr[ Qtopia::JobTitle ] ); | 65 | list.append( mapIdToStr[ Qtopia::JobTitle ] ); |
68 | list.append( mapIdToStr[ Qtopia::Department ] ); | 66 | list.append( mapIdToStr[ Qtopia::Department ] ); |
69 | list.append( mapIdToStr[ Qtopia::Company ] ); | 67 | list.append( mapIdToStr[ Qtopia::Company ] ); |
70 | 68 | ||
71 | list.append( mapIdToStr[ Qtopia::Notes ] ); | 69 | list.append( mapIdToStr[ Qtopia::Notes ] ); |
72 | list.append( mapIdToStr[ Qtopia::Groups ] ); | 70 | list.append( mapIdToStr[ Qtopia::Groups ] ); |
73 | 71 | ||
74 | if ( sorted ) list.sort(); | 72 | if ( sorted ) list.sort(); |
75 | return list; | 73 | return list; |
76 | } | 74 | } |
77 | 75 | ||
78 | /*! | 76 | /*! |
79 | \internal | 77 | \internal |
80 | Returns a list of details field names for a contact. | 78 | Returns a list of details field names for a contact. |
81 | */ | 79 | */ |
82 | QStringList OPimContactFields::detailsfields( bool sorted, bool translated ) | 80 | QStringList OPimContactFields::detailsfields( bool sorted, bool translated ) |
83 | { | 81 | { |
84 | QStringList list; | 82 | QStringList list; |
85 | QMap<int, QString> mapIdToStr; | 83 | QMap<int, QString> mapIdToStr; |
86 | if ( translated ) | 84 | if ( translated ) |
87 | mapIdToStr = idToTrFields(); | 85 | mapIdToStr = idToTrFields(); |
88 | else | 86 | else |
89 | mapIdToStr = idToUntrFields(); | 87 | mapIdToStr = idToUntrFields(); |
90 | 88 | ||
91 | list.append( mapIdToStr[ Qtopia::Office ] ); | 89 | list.append( mapIdToStr[ Qtopia::Office ] ); |
92 | list.append( mapIdToStr[ Qtopia::Profession ] ); | 90 | list.append( mapIdToStr[ Qtopia::Profession ] ); |
93 | list.append( mapIdToStr[ Qtopia::Assistant ] ); | 91 | list.append( mapIdToStr[ Qtopia::Assistant ] ); |
94 | list.append( mapIdToStr[ Qtopia::Manager ] ); | 92 | list.append( mapIdToStr[ Qtopia::Manager ] ); |
95 | 93 | ||
96 | list.append( mapIdToStr[ Qtopia::Spouse ] ); | 94 | list.append( mapIdToStr[ Qtopia::Spouse ] ); |
97 | list.append( mapIdToStr[ Qtopia::Gender ] ); | 95 | list.append( mapIdToStr[ Qtopia::Gender ] ); |
98 | list.append( mapIdToStr[ Qtopia::Birthday ] ); | 96 | list.append( mapIdToStr[ Qtopia::Birthday ] ); |
99 | list.append( mapIdToStr[ Qtopia::Anniversary ] ); | 97 | list.append( mapIdToStr[ Qtopia::Anniversary ] ); |
100 | list.append( mapIdToStr[ Qtopia::Nickname ] ); | 98 | list.append( mapIdToStr[ Qtopia::Nickname ] ); |
101 | list.append( mapIdToStr[ Qtopia::Children ] ); | 99 | list.append( mapIdToStr[ Qtopia::Children ] ); |
102 | 100 | ||
103 | if ( sorted ) list.sort(); | 101 | if ( sorted ) list.sort(); |
104 | return list; | 102 | return list; |
105 | } | 103 | } |
106 | 104 | ||
107 | /*! | 105 | /*! |
108 | \internal | 106 | \internal |
109 | Returns a list of phone field names for a contact. | 107 | Returns a list of phone field names for a contact. |
110 | */ | 108 | */ |
111 | QStringList OPimContactFields::phonefields( bool sorted, bool translated ) | 109 | QStringList OPimContactFields::phonefields( bool sorted, bool translated ) |
112 | { | 110 | { |
113 | QStringList list; | 111 | QStringList list; |
114 | QMap<int, QString> mapIdToStr; | 112 | QMap<int, QString> mapIdToStr; |
115 | if ( translated ) | 113 | if ( translated ) |
116 | mapIdToStr = idToTrFields(); | 114 | mapIdToStr = idToTrFields(); |
117 | else | 115 | else |
118 | mapIdToStr = idToUntrFields(); | 116 | mapIdToStr = idToUntrFields(); |
119 | 117 | ||
120 | list.append( mapIdToStr[ Qtopia::BusinessPhone ] ); | 118 | list.append( mapIdToStr[ Qtopia::BusinessPhone ] ); |
121 | list.append( mapIdToStr[ Qtopia::BusinessFax ] ); | 119 | list.append( mapIdToStr[ Qtopia::BusinessFax ] ); |
122 | list.append( mapIdToStr[ Qtopia::BusinessMobile ] ); | 120 | list.append( mapIdToStr[ Qtopia::BusinessMobile ] ); |
123 | list.append( mapIdToStr[ Qtopia::BusinessPager ] ); | 121 | list.append( mapIdToStr[ Qtopia::BusinessPager ] ); |
124 | list.append( mapIdToStr[ Qtopia::BusinessWebPage ] ); | 122 | list.append( mapIdToStr[ Qtopia::BusinessWebPage ] ); |
125 | 123 | ||
126 | list.append( mapIdToStr[ Qtopia::DefaultEmail ] ); | 124 | list.append( mapIdToStr[ Qtopia::DefaultEmail ] ); |
127 | list.append( mapIdToStr[ Qtopia::Emails ] ); | 125 | list.append( mapIdToStr[ Qtopia::Emails ] ); |
128 | 126 | ||
129 | list.append( mapIdToStr[ Qtopia::HomePhone ] ); | 127 | list.append( mapIdToStr[ Qtopia::HomePhone ] ); |
130 | list.append( mapIdToStr[ Qtopia::HomeFax ] ); | 128 | list.append( mapIdToStr[ Qtopia::HomeFax ] ); |
131 | list.append( mapIdToStr[ Qtopia::HomeMobile ] ); | 129 | list.append( mapIdToStr[ Qtopia::HomeMobile ] ); |
132 | // list.append( mapIdToStr[Qtopia::HomePager] ); | 130 | // list.append( mapIdToStr[Qtopia::HomePager] ); |
133 | list.append( mapIdToStr[ Qtopia::HomeWebPage ] ); | 131 | list.append( mapIdToStr[ Qtopia::HomeWebPage ] ); |
134 | 132 | ||
135 | if ( sorted ) list.sort(); | 133 | if ( sorted ) list.sort(); |
136 | 134 | ||
137 | return list; | 135 | return list; |
138 | } | 136 | } |
139 | 137 | ||
140 | /*! | 138 | /*! |
141 | \internal | 139 | \internal |
142 | Returns a list of field names for a contact. | 140 | Returns a list of field names for a contact. |
143 | */ | 141 | */ |
144 | QStringList OPimContactFields::fields( bool sorted, bool translated ) | 142 | QStringList OPimContactFields::fields( bool sorted, bool translated ) |
145 | { | 143 | { |
146 | QStringList list; | 144 | QStringList list; |
147 | QMap<int, QString> mapIdToStr; | 145 | QMap<int, QString> mapIdToStr; |
148 | if ( translated ) | 146 | if ( translated ) |
149 | mapIdToStr = idToTrFields(); | 147 | mapIdToStr = idToTrFields(); |
150 | else | 148 | else |
151 | mapIdToStr = idToUntrFields(); | 149 | mapIdToStr = idToUntrFields(); |
152 | 150 | ||
153 | list += personalfields( sorted, translated ); | 151 | list += personalfields( sorted, translated ); |
154 | 152 | ||
155 | list += phonefields( sorted, translated ); | 153 | list += phonefields( sorted, translated ); |
156 | 154 | ||
157 | list.append( mapIdToStr[ Qtopia::BusinessStreet ] ); | 155 | list.append( mapIdToStr[ Qtopia::BusinessStreet ] ); |
158 | list.append( mapIdToStr[ Qtopia::BusinessCity ] ); | 156 | list.append( mapIdToStr[ Qtopia::BusinessCity ] ); |
159 | list.append( mapIdToStr[ Qtopia::BusinessState ] ); | 157 | list.append( mapIdToStr[ Qtopia::BusinessState ] ); |
160 | list.append( mapIdToStr[ Qtopia::BusinessZip ] ); | 158 | list.append( mapIdToStr[ Qtopia::BusinessZip ] ); |
161 | list.append( mapIdToStr[ Qtopia::BusinessCountry ] ); | 159 | list.append( mapIdToStr[ Qtopia::BusinessCountry ] ); |
162 | 160 | ||
163 | list.append( mapIdToStr[ Qtopia::HomeStreet ] ); | 161 | list.append( mapIdToStr[ Qtopia::HomeStreet ] ); |
164 | list.append( mapIdToStr[ Qtopia::HomeCity ] ); | 162 | list.append( mapIdToStr[ Qtopia::HomeCity ] ); |
165 | list.append( mapIdToStr[ Qtopia::HomeState ] ); | 163 | list.append( mapIdToStr[ Qtopia::HomeState ] ); |
166 | list.append( mapIdToStr[ Qtopia::HomeZip ] ); | 164 | list.append( mapIdToStr[ Qtopia::HomeZip ] ); |
167 | list.append( mapIdToStr[ Qtopia::HomeCountry ] ); | 165 | list.append( mapIdToStr[ Qtopia::HomeCountry ] ); |
168 | 166 | ||
169 | list += detailsfields( sorted, translated ); | 167 | list += detailsfields( sorted, translated ); |
170 | 168 | ||
171 | if ( sorted ) list.sort(); | 169 | if ( sorted ) list.sort(); |
172 | 170 | ||
173 | return list; | 171 | return list; |
174 | } | 172 | } |
175 | 173 | ||
176 | 174 | ||
177 | /*! | 175 | /*! |
178 | \internal | 176 | \internal |
179 | Returns an untranslated list of personal field names for a contact. | 177 | Returns an untranslated list of personal field names for a contact. |
180 | */ | 178 | */ |
181 | QStringList OPimContactFields::untrpersonalfields( bool sorted ) | 179 | QStringList OPimContactFields::untrpersonalfields( bool sorted ) |
182 | { | 180 | { |
183 | return personalfields( sorted, false ); | 181 | return personalfields( sorted, false ); |
184 | } | 182 | } |
185 | 183 | ||
186 | 184 | ||
187 | /*! | 185 | /*! |
188 | \internal | 186 | \internal |
189 | Returns a translated list of personal field names for a contact. | 187 | Returns a translated list of personal field names for a contact. |
190 | */ | 188 | */ |
191 | QStringList OPimContactFields::trpersonalfields( bool sorted ) | 189 | QStringList OPimContactFields::trpersonalfields( bool sorted ) |
192 | { | 190 | { |
193 | return personalfields( sorted, true ); | 191 | return personalfields( sorted, true ); |
194 | } | 192 | } |
195 | 193 | ||
196 | 194 | ||
197 | /*! | 195 | /*! |
198 | \internal | 196 | \internal |
199 | Returns an untranslated list of details field names for a contact. | 197 | Returns an untranslated list of details field names for a contact. |
200 | */ | 198 | */ |
201 | QStringList OPimContactFields::untrdetailsfields( bool sorted ) | 199 | QStringList OPimContactFields::untrdetailsfields( bool sorted ) |
202 | { | 200 | { |
203 | return detailsfields( sorted, false ); | 201 | return detailsfields( sorted, false ); |
204 | } | 202 | } |
205 | 203 | ||
206 | 204 | ||
207 | /*! | 205 | /*! |
208 | \internal | 206 | \internal |
209 | Returns a translated list of details field names for a contact. | 207 | Returns a translated list of details field names for a contact. |
210 | */ | 208 | */ |
211 | QStringList OPimContactFields::trdetailsfields( bool sorted ) | 209 | QStringList OPimContactFields::trdetailsfields( bool sorted ) |
212 | { | 210 | { |
213 | return detailsfields( sorted, true ); | 211 | return detailsfields( sorted, true ); |
214 | } | 212 | } |
215 | 213 | ||
216 | 214 | ||
217 | /*! | 215 | /*! |
218 | \internal | 216 | \internal |
219 | Returns a translated list of phone field names for a contact. | 217 | Returns a translated list of phone field names for a contact. |
220 | */ | 218 | */ |
221 | QStringList OPimContactFields::trphonefields( bool sorted ) | 219 | QStringList OPimContactFields::trphonefields( bool sorted ) |
222 | { | 220 | { |
223 | return phonefields( sorted, true ); | 221 | return phonefields( sorted, true ); |
224 | } | 222 | } |
225 | 223 | ||
226 | /*! | 224 | /*! |
227 | \internal | 225 | \internal |
228 | Returns an untranslated list of phone field names for a contact. | 226 | Returns an untranslated list of phone field names for a contact. |
229 | */ | 227 | */ |
230 | QStringList OPimContactFields::untrphonefields( bool sorted ) | 228 | QStringList OPimContactFields::untrphonefields( bool sorted ) |
231 | { | 229 | { |
232 | return phonefields( sorted, false ); | 230 | return phonefields( sorted, false ); |
233 | } | 231 | } |
234 | 232 | ||
235 | 233 | ||
236 | /*! | 234 | /*! |
237 | \internal | 235 | \internal |
238 | Returns a translated list of field names for a contact. | 236 | Returns a translated list of field names for a contact. |
239 | */ | 237 | */ |
240 | QStringList OPimContactFields::trfields( bool sorted ) | 238 | QStringList OPimContactFields::trfields( bool sorted ) |
241 | { | 239 | { |
242 | return fields( sorted, true ); | 240 | return fields( sorted, true ); |
243 | } | 241 | } |
244 | 242 | ||
245 | /*! | 243 | /*! |
246 | \internal | 244 | \internal |
247 | Returns an untranslated list of field names for a contact. | 245 | Returns an untranslated list of field names for a contact. |
248 | */ | 246 | */ |
249 | QStringList OPimContactFields::untrfields( bool sorted ) | 247 | QStringList OPimContactFields::untrfields( bool sorted ) |
250 | { | 248 | { |
251 | return fields( sorted, false ); | 249 | return fields( sorted, false ); |
252 | } | 250 | } |
253 | 251 | ||
254 | QMap<int, QString> OPimContactFields::idToTrFields() | 252 | QMap<int, QString> OPimContactFields::idToTrFields() |
255 | { | 253 | { |
256 | QMap<int, QString> ret_map; | 254 | QMap<int, QString> ret_map; |
257 | 255 | ||
258 | ret_map.insert( Qtopia::AddressUid, QObject::tr( "User Id" ) ); | 256 | ret_map.insert( Qtopia::AddressUid, QObject::tr( "User Id" ) ); |
259 | ret_map.insert( Qtopia::AddressCategory, QObject::tr( "Categories" ) ); | 257 | ret_map.insert( Qtopia::AddressCategory, QObject::tr( "Categories" ) ); |
260 | 258 | ||
261 | ret_map.insert( Qtopia::Title, QObject::tr( "Name Title" ) ); | 259 | ret_map.insert( Qtopia::Title, QObject::tr( "Name Title" ) ); |
262 | ret_map.insert( Qtopia::FirstName, QObject::tr( "First Name" ) ); | 260 | ret_map.insert( Qtopia::FirstName, QObject::tr( "First Name" ) ); |
263 | ret_map.insert( Qtopia::MiddleName, QObject::tr( "Middle Name" ) ); | 261 | ret_map.insert( Qtopia::MiddleName, QObject::tr( "Middle Name" ) ); |
264 | ret_map.insert( Qtopia::LastName, QObject::tr( "Last Name" ) ); | 262 | ret_map.insert( Qtopia::LastName, QObject::tr( "Last Name" ) ); |
265 | ret_map.insert( Qtopia::Suffix, QObject::tr( "Suffix" ) ); | 263 | ret_map.insert( Qtopia::Suffix, QObject::tr( "Suffix" ) ); |
266 | ret_map.insert( Qtopia::FileAs, QObject::tr( "File As" ) ); | 264 | ret_map.insert( Qtopia::FileAs, QObject::tr( "File As" ) ); |
267 | 265 | ||
268 | ret_map.insert( Qtopia::JobTitle, QObject::tr( "Job Title" ) ); | 266 | ret_map.insert( Qtopia::JobTitle, QObject::tr( "Job Title" ) ); |
269 | ret_map.insert( Qtopia::Department, QObject::tr( "Department" ) ); | 267 | ret_map.insert( Qtopia::Department, QObject::tr( "Department" ) ); |
270 | ret_map.insert( Qtopia::Company, QObject::tr( "Company" ) ); | 268 | ret_map.insert( Qtopia::Company, QObject::tr( "Company" ) ); |
271 | ret_map.insert( Qtopia::BusinessPhone, QObject::tr( "Business Phone" ) ); | 269 | ret_map.insert( Qtopia::BusinessPhone, QObject::tr( "Business Phone" ) ); |
272 | ret_map.insert( Qtopia::BusinessFax, QObject::tr( "Business Fax" ) ); | 270 | ret_map.insert( Qtopia::BusinessFax, QObject::tr( "Business Fax" ) ); |
273 | ret_map.insert( Qtopia::BusinessMobile, QObject::tr( "Business Mobile" ) ); | 271 | ret_map.insert( Qtopia::BusinessMobile, QObject::tr( "Business Mobile" ) ); |
274 | 272 | ||
275 | 273 | ||
276 | ret_map.insert( Qtopia::DefaultEmail, QObject::tr( "Default Email" ) ); | 274 | ret_map.insert( Qtopia::DefaultEmail, QObject::tr( "Default Email" ) ); |
277 | ret_map.insert( Qtopia::Emails, QObject::tr( "Emails" ) ); | 275 | ret_map.insert( Qtopia::Emails, QObject::tr( "Emails" ) ); |
278 | 276 | ||
279 | ret_map.insert( Qtopia::HomePhone, QObject::tr( "Home Phone" ) ); | 277 | ret_map.insert( Qtopia::HomePhone, QObject::tr( "Home Phone" ) ); |
280 | ret_map.insert( Qtopia::HomeFax, QObject::tr( "Home Fax" ) ); | 278 | ret_map.insert( Qtopia::HomeFax, QObject::tr( "Home Fax" ) ); |
281 | ret_map.insert( Qtopia::HomeMobile, QObject::tr( "Home Mobile" ) ); | 279 | ret_map.insert( Qtopia::HomeMobile, QObject::tr( "Home Mobile" ) ); |
282 | 280 | ||
283 | // business | 281 | // business |
284 | ret_map.insert( Qtopia::BusinessStreet, QObject::tr( "Business Street" ) ); | 282 | ret_map.insert( Qtopia::BusinessStreet, QObject::tr( "Business Street" ) ); |
285 | ret_map.insert( Qtopia::BusinessCity, QObject::tr( "Business City" ) ); | 283 | ret_map.insert( Qtopia::BusinessCity, QObject::tr( "Business City" ) ); |
286 | ret_map.insert( Qtopia::BusinessState, QObject::tr( "Business State" ) ); | 284 | ret_map.insert( Qtopia::BusinessState, QObject::tr( "Business State" ) ); |
287 | ret_map.insert( Qtopia::BusinessZip, QObject::tr( "Business Zip" ) ); | 285 | ret_map.insert( Qtopia::BusinessZip, QObject::tr( "Business Zip" ) ); |
288 | ret_map.insert( Qtopia::BusinessCountry, QObject::tr( "Business Country" ) ); | 286 | ret_map.insert( Qtopia::BusinessCountry, QObject::tr( "Business Country" ) ); |
289 | ret_map.insert( Qtopia::BusinessPager, QObject::tr( "Business Pager" ) ); | 287 | ret_map.insert( Qtopia::BusinessPager, QObject::tr( "Business Pager" ) ); |
290 | ret_map.insert( Qtopia::BusinessWebPage, QObject::tr( "Business WebPage" ) ); | 288 | ret_map.insert( Qtopia::BusinessWebPage, QObject::tr( "Business WebPage" ) ); |
291 | 289 | ||
292 | ret_map.insert( Qtopia::Office, QObject::tr( "Office" ) ); | 290 | ret_map.insert( Qtopia::Office, QObject::tr( "Office" ) ); |
293 | ret_map.insert( Qtopia::Profession, QObject::tr( "Profession" ) ); | 291 | ret_map.insert( Qtopia::Profession, QObject::tr( "Profession" ) ); |
294 | ret_map.insert( Qtopia::Assistant, QObject::tr( "Assistant" ) ); | 292 | ret_map.insert( Qtopia::Assistant, QObject::tr( "Assistant" ) ); |
295 | ret_map.insert( Qtopia::Manager, QObject::tr( "Manager" ) ); | 293 | ret_map.insert( Qtopia::Manager, QObject::tr( "Manager" ) ); |
296 | 294 | ||
297 | // home | 295 | // home |
298 | ret_map.insert( Qtopia::HomeStreet, QObject::tr( "Home Street" ) ); | 296 | ret_map.insert( Qtopia::HomeStreet, QObject::tr( "Home Street" ) ); |
299 | ret_map.insert( Qtopia::HomeCity, QObject::tr( "Home City" ) ); | 297 | ret_map.insert( Qtopia::HomeCity, QObject::tr( "Home City" ) ); |
300 | ret_map.insert( Qtopia::HomeState, QObject::tr( "Home State" ) ); | 298 | ret_map.insert( Qtopia::HomeState, QObject::tr( "Home State" ) ); |
301 | ret_map.insert( Qtopia::HomeZip, QObject::tr( "Home Zip" ) ); | 299 | ret_map.insert( Qtopia::HomeZip, QObject::tr( "Home Zip" ) ); |
302 | ret_map.insert( Qtopia::HomeCountry, QObject::tr( "Home Country" ) ); | 300 | ret_map.insert( Qtopia::HomeCountry, QObject::tr( "Home Country" ) ); |
303 | ret_map.insert( Qtopia::HomeWebPage, QObject::tr( "Home Web Page" ) ); | 301 | ret_map.insert( Qtopia::HomeWebPage, QObject::tr( "Home Web Page" ) ); |
304 | 302 | ||
305 | //personal | 303 | //personal |
306 | ret_map.insert( Qtopia::Spouse, QObject::tr( "Spouse" ) ); | 304 | ret_map.insert( Qtopia::Spouse, QObject::tr( "Spouse" ) ); |
307 | ret_map.insert( Qtopia::Gender, QObject::tr( "Gender" ) ); | 305 | ret_map.insert( Qtopia::Gender, QObject::tr( "Gender" ) ); |
308 | ret_map.insert( Qtopia::Birthday, QObject::tr( "Birthday" ) ); | 306 | ret_map.insert( Qtopia::Birthday, QObject::tr( "Birthday" ) ); |
309 | ret_map.insert( Qtopia::Anniversary, QObject::tr( "Anniversary" ) ); | 307 | ret_map.insert( Qtopia::Anniversary, QObject::tr( "Anniversary" ) ); |
310 | ret_map.insert( Qtopia::Nickname, QObject::tr( "Nickname" ) ); | 308 | ret_map.insert( Qtopia::Nickname, QObject::tr( "Nickname" ) ); |
311 | ret_map.insert( Qtopia::Children, QObject::tr( "Children" ) ); | 309 | ret_map.insert( Qtopia::Children, QObject::tr( "Children" ) ); |
312 | 310 | ||
313 | // other | 311 | // other |
314 | ret_map.insert( Qtopia::Notes, QObject::tr( "Notes" ) ); | 312 | ret_map.insert( Qtopia::Notes, QObject::tr( "Notes" ) ); |
315 | 313 | ||
316 | 314 | ||
317 | return ret_map; | 315 | return ret_map; |
318 | } | 316 | } |
319 | 317 | ||
320 | QMap<int, QString> OPimContactFields::idToUntrFields() | 318 | QMap<int, QString> OPimContactFields::idToUntrFields() |
321 | { | 319 | { |
322 | QMap<int, QString> ret_map; | 320 | QMap<int, QString> ret_map; |
323 | 321 | ||
324 | ret_map.insert( Qtopia::AddressUid, "User Id" ); | 322 | ret_map.insert( Qtopia::AddressUid, "User Id" ); |
325 | ret_map.insert( Qtopia::AddressCategory, "Categories" ); | 323 | ret_map.insert( Qtopia::AddressCategory, "Categories" ); |
326 | 324 | ||
327 | ret_map.insert( Qtopia::Title, "Name Title" ); | 325 | ret_map.insert( Qtopia::Title, "Name Title" ); |
328 | ret_map.insert( Qtopia::FirstName, "First Name" ); | 326 | ret_map.insert( Qtopia::FirstName, "First Name" ); |
329 | ret_map.insert( Qtopia::MiddleName, "Middle Name" ); | 327 | ret_map.insert( Qtopia::MiddleName, "Middle Name" ); |
330 | ret_map.insert( Qtopia::LastName, "Last Name" ); | 328 | ret_map.insert( Qtopia::LastName, "Last Name" ); |
331 | ret_map.insert( Qtopia::Suffix, "Suffix" ); | 329 | ret_map.insert( Qtopia::Suffix, "Suffix" ); |
332 | ret_map.insert( Qtopia::FileAs, "File As" ); | 330 | ret_map.insert( Qtopia::FileAs, "File As" ); |
333 | 331 | ||
334 | ret_map.insert( Qtopia::JobTitle, "Job Title" ); | 332 | ret_map.insert( Qtopia::JobTitle, "Job Title" ); |
335 | ret_map.insert( Qtopia::Department, "Department" ); | 333 | ret_map.insert( Qtopia::Department, "Department" ); |
336 | ret_map.insert( Qtopia::Company, "Company" ); | 334 | ret_map.insert( Qtopia::Company, "Company" ); |
337 | ret_map.insert( Qtopia::BusinessPhone, "Business Phone" ); | 335 | ret_map.insert( Qtopia::BusinessPhone, "Business Phone" ); |
338 | ret_map.insert( Qtopia::BusinessFax, "Business Fax" ); | 336 | ret_map.insert( Qtopia::BusinessFax, "Business Fax" ); |
339 | ret_map.insert( Qtopia::BusinessMobile, "Business Mobile" ); | 337 | ret_map.insert( Qtopia::BusinessMobile, "Business Mobile" ); |
340 | 338 | ||
341 | 339 | ||
342 | ret_map.insert( Qtopia::DefaultEmail, "Default Email" ); | 340 | ret_map.insert( Qtopia::DefaultEmail, "Default Email" ); |
343 | ret_map.insert( Qtopia::Emails, "Emails" ); | 341 | ret_map.insert( Qtopia::Emails, "Emails" ); |
344 | 342 | ||
345 | ret_map.insert( Qtopia::HomePhone, "Home Phone" ); | 343 | ret_map.insert( Qtopia::HomePhone, "Home Phone" ); |
346 | ret_map.insert( Qtopia::HomeFax, "Home Fax" ); | 344 | ret_map.insert( Qtopia::HomeFax, "Home Fax" ); |
347 | ret_map.insert( Qtopia::HomeMobile, "Home Mobile" ); | 345 | ret_map.insert( Qtopia::HomeMobile, "Home Mobile" ); |
348 | 346 | ||
349 | // business | 347 | // business |
350 | ret_map.insert( Qtopia::BusinessStreet, "Business Street" ); | 348 | ret_map.insert( Qtopia::BusinessStreet, "Business Street" ); |
351 | ret_map.insert( Qtopia::BusinessCity, "Business City" ); | 349 | ret_map.insert( Qtopia::BusinessCity, "Business City" ); |
352 | ret_map.insert( Qtopia::BusinessState, "Business State" ); | 350 | ret_map.insert( Qtopia::BusinessState, "Business State" ); |
353 | ret_map.insert( Qtopia::BusinessZip, "Business Zip" ); | 351 | ret_map.insert( Qtopia::BusinessZip, "Business Zip" ); |
354 | ret_map.insert( Qtopia::BusinessCountry, "Business Country" ); | 352 | ret_map.insert( Qtopia::BusinessCountry, "Business Country" ); |
355 | ret_map.insert( Qtopia::BusinessPager, "Business Pager" ); | 353 | ret_map.insert( Qtopia::BusinessPager, "Business Pager" ); |
356 | ret_map.insert( Qtopia::BusinessWebPage, "Business WebPage" ); | 354 | ret_map.insert( Qtopia::BusinessWebPage, "Business WebPage" ); |
357 | 355 | ||
358 | ret_map.insert( Qtopia::Office, "Office" ); | 356 | ret_map.insert( Qtopia::Office, "Office" ); |
359 | ret_map.insert( Qtopia::Profession, "Profession" ); | 357 | ret_map.insert( Qtopia::Profession, "Profession" ); |
360 | ret_map.insert( Qtopia::Assistant, "Assistant" ); | 358 | ret_map.insert( Qtopia::Assistant, "Assistant" ); |
361 | ret_map.insert( Qtopia::Manager, "Manager" ); | 359 | ret_map.insert( Qtopia::Manager, "Manager" ); |
362 | 360 | ||
363 | // home | 361 | // home |
364 | ret_map.insert( Qtopia::HomeStreet, "Home Street" ); | 362 | ret_map.insert( Qtopia::HomeStreet, "Home Street" ); |
365 | ret_map.insert( Qtopia::HomeCity, "Home City" ); | 363 | ret_map.insert( Qtopia::HomeCity, "Home City" ); |
366 | ret_map.insert( Qtopia::HomeState, "Home State" ); | 364 | ret_map.insert( Qtopia::HomeState, "Home State" ); |
367 | ret_map.insert( Qtopia::HomeZip, "Home Zip" ); | 365 | ret_map.insert( Qtopia::HomeZip, "Home Zip" ); |
368 | ret_map.insert( Qtopia::HomeCountry, "Home Country" ); | 366 | ret_map.insert( Qtopia::HomeCountry, "Home Country" ); |
369 | ret_map.insert( Qtopia::HomeWebPage, "Home Web Page" ); | 367 | ret_map.insert( Qtopia::HomeWebPage, "Home Web Page" ); |
370 | 368 | ||
371 | //personal | 369 | //personal |
372 | ret_map.insert( Qtopia::Spouse, "Spouse" ); | 370 | ret_map.insert( Qtopia::Spouse, "Spouse" ); |
373 | ret_map.insert( Qtopia::Gender, "Gender" ); | 371 | ret_map.insert( Qtopia::Gender, "Gender" ); |
374 | ret_map.insert( Qtopia::Birthday, "Birthday" ); | 372 | ret_map.insert( Qtopia::Birthday, "Birthday" ); |
375 | ret_map.insert( Qtopia::Anniversary, "Anniversary" ); | 373 | ret_map.insert( Qtopia::Anniversary, "Anniversary" ); |
376 | ret_map.insert( Qtopia::Nickname, "Nickname" ); | 374 | ret_map.insert( Qtopia::Nickname, "Nickname" ); |
377 | ret_map.insert( Qtopia::Children, "Children" ); | 375 | ret_map.insert( Qtopia::Children, "Children" ); |
378 | 376 | ||
379 | // other | 377 | // other |
380 | ret_map.insert( Qtopia::Notes, "Notes" ); | 378 | ret_map.insert( Qtopia::Notes, "Notes" ); |
381 | ret_map.insert( Qtopia::Groups, "Groups" ); | 379 | ret_map.insert( Qtopia::Groups, "Groups" ); |
382 | 380 | ||
383 | 381 | ||
384 | return ret_map; | 382 | return ret_map; |
385 | } | 383 | } |
386 | 384 | ||
387 | QMap<QString, int> OPimContactFields::trFieldsToId() | 385 | QMap<QString, int> OPimContactFields::trFieldsToId() |
388 | { | 386 | { |
389 | QMap<int, QString> idtostr = idToTrFields(); | 387 | QMap<int, QString> idtostr = idToTrFields(); |
390 | QMap<QString, int> ret_map; | 388 | QMap<QString, int> ret_map; |
391 | 389 | ||
392 | 390 | ||
393 | QMap<int, QString>::Iterator it; | 391 | QMap<int, QString>::Iterator it; |
394 | for ( it = idtostr.begin(); it != idtostr.end(); ++it ) | 392 | for ( it = idtostr.begin(); it != idtostr.end(); ++it ) |
395 | ret_map.insert( *it, it.key() ); | 393 | ret_map.insert( *it, it.key() ); |
396 | 394 | ||
397 | 395 | ||
398 | return ret_map; | 396 | return ret_map; |
399 | } | 397 | } |
400 | 398 | ||
401 | /* ======================================================================= */ | 399 | /* ======================================================================= */ |
402 | 400 | ||
403 | QMap<QString, int> OPimContactFields::untrFieldsToId() | 401 | QMap<QString, int> OPimContactFields::untrFieldsToId() |
404 | { | 402 | { |
405 | QMap<int, QString> idtostr = idToUntrFields(); | 403 | QMap<int, QString> idtostr = idToUntrFields(); |
406 | QMap<QString, int> ret_map; | 404 | QMap<QString, int> ret_map; |
407 | 405 | ||
408 | 406 | ||
409 | QMap<int, QString>::Iterator it; | 407 | QMap<int, QString>::Iterator it; |
410 | for ( it = idtostr.begin(); it != idtostr.end(); ++it ) | 408 | for ( it = idtostr.begin(); it != idtostr.end(); ++it ) |
411 | ret_map.insert( *it, it.key() ); | 409 | ret_map.insert( *it, it.key() ); |
412 | 410 | ||
413 | 411 | ||
414 | return ret_map; | 412 | return ret_map; |
415 | } | 413 | } |
416 | 414 | ||
417 | 415 | ||
418 | OPimContactFields::OPimContactFields() : | 416 | OPimContactFields::OPimContactFields() : |
419 | fieldOrder( DEFAULT_FIELD_ORDER ), | 417 | fieldOrder( DEFAULT_FIELD_ORDER ), |
420 | changedFieldOrder( false ) | 418 | changedFieldOrder( false ) |
421 | { | 419 | { |
422 | // Get the global field order from the config file and | 420 | // Get the global field order from the config file and |
423 | // use it as a start pattern | 421 | // use it as a start pattern |
424 | Config cfg ( "AddressBook" ); | 422 | Config cfg ( "AddressBook" ); |
425 | cfg.setGroup( "ContactFieldOrder" ); | 423 | cfg.setGroup( "ContactFieldOrder" ); |
426 | globalFieldOrder = cfg.readEntry( "General", DEFAULT_FIELD_ORDER ); | 424 | globalFieldOrder = cfg.readEntry( "General", DEFAULT_FIELD_ORDER ); |
427 | } | 425 | } |
428 | 426 | ||
429 | OPimContactFields::~OPimContactFields() | 427 | OPimContactFields::~OPimContactFields() |
430 | { | 428 | { |
431 | 429 | ||
432 | // We will store the fieldorder into the config file | 430 | // We will store the fieldorder into the config file |
433 | // to reuse it for the future.. | 431 | // to reuse it for the future.. |
434 | if ( changedFieldOrder ) | 432 | if ( changedFieldOrder ) |
435 | { | 433 | { |
436 | Config cfg ( "AddressBook" ); | 434 | Config cfg ( "AddressBook" ); |
437 | cfg.setGroup( "ContactFieldOrder" ); | 435 | cfg.setGroup( "ContactFieldOrder" ); |
438 | cfg.writeEntry( "General", globalFieldOrder ); | 436 | cfg.writeEntry( "General", globalFieldOrder ); |
439 | } | 437 | } |
440 | } | 438 | } |
441 | 439 | ||
442 | 440 | ||
443 | 441 | ||
444 | void OPimContactFields::saveToRecord( OPimContact &cnt ) | 442 | void OPimContactFields::saveToRecord( OPimContact &cnt ) |
445 | { | 443 | { |
446 | 444 | ||
447 | qDebug( "ocontactfields saveToRecord: >%s<", fieldOrder.latin1() ); | 445 | qDebug( "ocontactfields saveToRecord: >%s<", fieldOrder.latin1() ); |
448 | 446 | ||
449 | // Store fieldorder into this contact. | 447 | // Store fieldorder into this contact. |
450 | cnt.setCustomField( CONTACT_FIELD_ORDER_NAME, fieldOrder ); | 448 | cnt.setCustomField( CONTACT_FIELD_ORDER_NAME, fieldOrder ); |
451 | 449 | ||
452 | globalFieldOrder = fieldOrder; | 450 | globalFieldOrder = fieldOrder; |
453 | changedFieldOrder = true; | 451 | changedFieldOrder = true; |
454 | 452 | ||
455 | } | 453 | } |
456 | 454 | ||
457 | void OPimContactFields::loadFromRecord( const OPimContact &cnt ) | 455 | void OPimContactFields::loadFromRecord( const OPimContact &cnt ) |
458 | { | 456 | { |
459 | qDebug( "ocontactfields loadFromRecord" ); | 457 | qDebug( "ocontactfields loadFromRecord" ); |
460 | qDebug( "loading >%s<", cnt.fullName().latin1() ); | 458 | qDebug( "loading >%s<", cnt.fullName().latin1() ); |
461 | 459 | ||
462 | // Get fieldorder for this contact. If none is defined, | 460 | // Get fieldorder for this contact. If none is defined, |
463 | // we will use the global one from the config file.. | 461 | // we will use the global one from the config file.. |
464 | 462 | ||
465 | fieldOrder = cnt.customField( CONTACT_FIELD_ORDER_NAME ); | 463 | fieldOrder = cnt.customField( CONTACT_FIELD_ORDER_NAME ); |
466 | 464 | ||
467 | qDebug( "fieldOrder from contact>%s<", fieldOrder.latin1() ); | 465 | qDebug( "fieldOrder from contact>%s<", fieldOrder.latin1() ); |
468 | 466 | ||
469 | if ( fieldOrder.isEmpty() ) | 467 | if ( fieldOrder.isEmpty() ) |
470 | { | 468 | { |
471 | fieldOrder = globalFieldOrder; | 469 | fieldOrder = globalFieldOrder; |
472 | } | 470 | } |
473 | 471 | ||
474 | 472 | ||
475 | qDebug( "effective fieldOrder in loadFromRecord >%s<", fieldOrder.latin1() ); | 473 | qDebug( "effective fieldOrder in loadFromRecord >%s<", fieldOrder.latin1() ); |
476 | } | 474 | } |
477 | 475 | ||
478 | void OPimContactFields::setFieldOrder( int num, int index ) | 476 | void OPimContactFields::setFieldOrder( int num, int index ) |
479 | { | 477 | { |
480 | qDebug( "qcontactfields setfieldorder pos %i -> %i", num, index ); | 478 | qDebug( "qcontactfields setfieldorder pos %i -> %i", num, index ); |
481 | 479 | ||
482 | fieldOrder[ num ] = QString::number( index, 16 ) [ 0 ]; | 480 | fieldOrder[ num ] = QString::number( index, 16 ) [ 0 ]; |
483 | 481 | ||
484 | // We will store this new fieldorder globally to | 482 | // We will store this new fieldorder globally to |
485 | // remember it for contacts which have none | 483 | // remember it for contacts which have none |
486 | globalFieldOrder = fieldOrder; | 484 | globalFieldOrder = fieldOrder; |
487 | changedFieldOrder = true; | 485 | changedFieldOrder = true; |
488 | 486 | ||
489 | qDebug( "fieldOrder >%s<", fieldOrder.latin1() ); | 487 | qDebug( "fieldOrder >%s<", fieldOrder.latin1() ); |
490 | } | 488 | } |
491 | 489 | ||
492 | int OPimContactFields::getFieldOrder( int num, int defIndex ) | 490 | int OPimContactFields::getFieldOrder( int num, int defIndex ) |
493 | { | 491 | { |
494 | qDebug( "ocontactfields getFieldOrder" ); | 492 | qDebug( "ocontactfields getFieldOrder" ); |
495 | qDebug( "fieldOrder >%s<", fieldOrder.latin1() ); | 493 | qDebug( "fieldOrder >%s<", fieldOrder.latin1() ); |
496 | 494 | ||
497 | // Get index of combo as char.. | 495 | // Get index of combo as char.. |
498 | QChar poschar = fieldOrder[ num ]; | 496 | QChar poschar = fieldOrder[ num ]; |
499 | 497 | ||
500 | bool ok; | 498 | bool ok; |
501 | int ret = 0; | 499 | int ret = 0; |
502 | // Convert char to number.. | 500 | // Convert char to number.. |
503 | if ( !( poschar == QChar::null ) ) | 501 | if ( !( poschar == QChar::null ) ) |
504 | ret = QString( poschar ).toInt( &ok, 16 ); | 502 | ret = QString( poschar ).toInt( &ok, 16 ); |
505 | else | 503 | else |
506 | ok = false; | 504 | ok = false; |
507 | 505 | ||
508 | // Return default value if index for | 506 | // Return default value if index for |
509 | // num was not set or if anything else happened.. | 507 | // num was not set or if anything else happened.. |
510 | if ( !ok ) ret = defIndex; | 508 | if ( !ok ) ret = defIndex; |
511 | 509 | ||
512 | qDebug( "returning >%i<", ret ); | 510 | qDebug( "returning >%i<", ret ); |
513 | 511 | ||
514 | return ret; | 512 | return ret; |
515 | 513 | ||
516 | } | 514 | } |
517 | 515 | ||
518 | } | 516 | } |
diff --git a/libopie2/opiepim/core/opimevent.cpp b/libopie2/opiepim/core/opimevent.cpp index 3ddbf85..77730e9 100644 --- a/libopie2/opiepim/core/opimevent.cpp +++ b/libopie2/opiepim/core/opimevent.cpp | |||
@@ -1,1025 +1,1022 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) Stefan Eilers <Eilers.Stefan@epost.de> | 3 | Copyright (C) Stefan Eilers <Eilers.Stefan@epost.de> |
4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> | 4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> |
5 | .=l. | 5 | .=l. |
6 | .>+-= | 6 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 7 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 8 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 11 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 12 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include "opimevent.h" | 30 | #include "opimevent.h" |
31 | 31 | ||
32 | /* OPIE */ | 32 | /* OPIE */ |
33 | #include <opie2/opimrecurrence.h> | 33 | #include <opie2/opimrecurrence.h> |
34 | #include <opie2/opimresolver.h> | 34 | #include <opie2/opimresolver.h> |
35 | #include <opie2/opimnotifymanager.h> | 35 | #include <opie2/opimnotifymanager.h> |
36 | #include <qpe/categories.h> | 36 | #include <qpe/categories.h> |
37 | #include <qpe/palmtopuidgen.h> | ||
38 | #include <qpe/stringutil.h> | 37 | #include <qpe/stringutil.h> |
39 | 38 | ||
40 | /* QT */ | 39 | /* QT */ |
41 | #include <qshared.h> | ||
42 | #include <qarray.h> | ||
43 | 40 | ||
44 | namespace Opie | 41 | namespace Opie |
45 | { | 42 | { |
46 | 43 | ||
47 | int OCalendarHelper::week( const QDate& date ) | 44 | int OCalendarHelper::week( const QDate& date ) |
48 | { | 45 | { |
49 | // Calculates the week this date is in within that | 46 | // Calculates the week this date is in within that |
50 | // month. Equals the "row" is is in in the month view | 47 | // month. Equals the "row" is is in in the month view |
51 | int week = 1; | 48 | int week = 1; |
52 | QDate tmp( date.year(), date.month(), 1 ); | 49 | QDate tmp( date.year(), date.month(), 1 ); |
53 | if ( date.dayOfWeek() < tmp.dayOfWeek() ) | 50 | if ( date.dayOfWeek() < tmp.dayOfWeek() ) |
54 | ++week; | 51 | ++week; |
55 | 52 | ||
56 | week += ( date.day() - 1 ) / 7; | 53 | week += ( date.day() - 1 ) / 7; |
57 | 54 | ||
58 | return week; | 55 | return week; |
59 | } | 56 | } |
60 | 57 | ||
61 | 58 | ||
62 | int OCalendarHelper::ocurrence( const QDate& date ) | 59 | int OCalendarHelper::ocurrence( const QDate& date ) |
63 | { | 60 | { |
64 | // calculates the number of occurrances of this day of the | 61 | // calculates the number of occurrances of this day of the |
65 | // week till the given date (e.g 3rd Wednesday of the month) | 62 | // week till the given date (e.g 3rd Wednesday of the month) |
66 | return ( date.day() - 1 ) / 7 + 1; | 63 | return ( date.day() - 1 ) / 7 + 1; |
67 | } | 64 | } |
68 | 65 | ||
69 | 66 | ||
70 | int OCalendarHelper::dayOfWeek( char day ) | 67 | int OCalendarHelper::dayOfWeek( char day ) |
71 | { | 68 | { |
72 | int dayOfWeek = 1; | 69 | int dayOfWeek = 1; |
73 | char i = OPimRecurrence::MON; | 70 | char i = OPimRecurrence::MON; |
74 | while ( !( i & day ) && i <= OPimRecurrence::SUN ) | 71 | while ( !( i & day ) && i <= OPimRecurrence::SUN ) |
75 | { | 72 | { |
76 | i <<= 1; | 73 | i <<= 1; |
77 | ++dayOfWeek; | 74 | ++dayOfWeek; |
78 | } | 75 | } |
79 | return dayOfWeek; | 76 | return dayOfWeek; |
80 | } | 77 | } |
81 | 78 | ||
82 | 79 | ||
83 | int OCalendarHelper::monthDiff( const QDate& first, const QDate& second ) | 80 | int OCalendarHelper::monthDiff( const QDate& first, const QDate& second ) |
84 | { | 81 | { |
85 | return ( second.year() - first.year() ) * 12 + | 82 | return ( second.year() - first.year() ) * 12 + |
86 | second.month() - first.month(); | 83 | second.month() - first.month(); |
87 | } | 84 | } |
88 | 85 | ||
89 | 86 | ||
90 | struct OPimEvent::Data : public QShared | 87 | struct OPimEvent::Data : public QShared |
91 | { | 88 | { |
92 | Data() : QShared() | 89 | Data() : QShared() |
93 | { | 90 | { |
94 | child = 0; | 91 | child = 0; |
95 | recur = 0; | 92 | recur = 0; |
96 | manager = 0; | 93 | manager = 0; |
97 | isAllDay = false; | 94 | isAllDay = false; |
98 | parent = 0; | 95 | parent = 0; |
99 | } | 96 | } |
100 | ~Data() | 97 | ~Data() |
101 | { | 98 | { |
102 | delete manager; | 99 | delete manager; |
103 | delete recur; | 100 | delete recur; |
104 | } | 101 | } |
105 | QString description; | 102 | QString description; |
106 | QString location; | 103 | QString location; |
107 | OPimNotifyManager* manager; | 104 | OPimNotifyManager* manager; |
108 | OPimRecurrence* recur; | 105 | OPimRecurrence* recur; |
109 | QString note; | 106 | QString note; |
110 | QDateTime created; | 107 | QDateTime created; |
111 | QDateTime start; | 108 | QDateTime start; |
112 | QDateTime end; | 109 | QDateTime end; |
113 | bool isAllDay : 1; | 110 | bool isAllDay : 1; |
114 | QString timezone; | 111 | QString timezone; |
115 | QArray<int>* child; | 112 | QArray<int>* child; |
116 | int parent; | 113 | int parent; |
117 | }; | 114 | }; |
118 | 115 | ||
119 | 116 | ||
120 | OPimEvent::OPimEvent( int uid ) | 117 | OPimEvent::OPimEvent( int uid ) |
121 | : OPimRecord( uid ) | 118 | : OPimRecord( uid ) |
122 | { | 119 | { |
123 | data = new Data; | 120 | data = new Data; |
124 | } | 121 | } |
125 | 122 | ||
126 | 123 | ||
127 | OPimEvent::OPimEvent( const OPimEvent& ev ) | 124 | OPimEvent::OPimEvent( const OPimEvent& ev ) |
128 | : OPimRecord( ev ), data( ev.data ) | 125 | : OPimRecord( ev ), data( ev.data ) |
129 | { | 126 | { |
130 | data->ref(); | 127 | data->ref(); |
131 | } | 128 | } |
132 | 129 | ||
133 | 130 | ||
134 | OPimEvent::OPimEvent( const QMap<int, QString> map ) | 131 | OPimEvent::OPimEvent( const QMap<int, QString> map ) |
135 | : OPimRecord( 0 ) | 132 | : OPimRecord( 0 ) |
136 | { | 133 | { |
137 | data = new Data; | 134 | data = new Data; |
138 | 135 | ||
139 | fromMap( map ); | 136 | fromMap( map ); |
140 | } | 137 | } |
141 | 138 | ||
142 | 139 | ||
143 | OPimEvent::~OPimEvent() | 140 | OPimEvent::~OPimEvent() |
144 | { | 141 | { |
145 | if ( data->deref() ) | 142 | if ( data->deref() ) |
146 | { | 143 | { |
147 | delete data; | 144 | delete data; |
148 | data = 0; | 145 | data = 0; |
149 | } | 146 | } |
150 | } | 147 | } |
151 | 148 | ||
152 | 149 | ||
153 | OPimEvent& OPimEvent::operator=( const OPimEvent& ev ) | 150 | OPimEvent& OPimEvent::operator=( const OPimEvent& ev ) |
154 | { | 151 | { |
155 | if ( this == &ev ) return * this; | 152 | if ( this == &ev ) return * this; |
156 | 153 | ||
157 | OPimRecord::operator=( ev ); | 154 | OPimRecord::operator=( ev ); |
158 | ev.data->ref(); | 155 | ev.data->ref(); |
159 | deref(); | 156 | deref(); |
160 | data = ev.data; | 157 | data = ev.data; |
161 | 158 | ||
162 | 159 | ||
163 | return *this; | 160 | return *this; |
164 | } | 161 | } |
165 | 162 | ||
166 | 163 | ||
167 | QString OPimEvent::description() const | 164 | QString OPimEvent::description() const |
168 | { | 165 | { |
169 | return data->description; | 166 | return data->description; |
170 | } | 167 | } |
171 | 168 | ||
172 | 169 | ||
173 | void OPimEvent::setDescription( const QString& description ) | 170 | void OPimEvent::setDescription( const QString& description ) |
174 | { | 171 | { |
175 | changeOrModify(); | 172 | changeOrModify(); |
176 | data->description = description; | 173 | data->description = description; |
177 | } | 174 | } |
178 | 175 | ||
179 | 176 | ||
180 | void OPimEvent::setLocation( const QString& loc ) | 177 | void OPimEvent::setLocation( const QString& loc ) |
181 | { | 178 | { |
182 | changeOrModify(); | 179 | changeOrModify(); |
183 | data->location = loc; | 180 | data->location = loc; |
184 | } | 181 | } |
185 | 182 | ||
186 | 183 | ||
187 | QString OPimEvent::location() const | 184 | QString OPimEvent::location() const |
188 | { | 185 | { |
189 | return data->location; | 186 | return data->location; |
190 | } | 187 | } |
191 | 188 | ||
192 | 189 | ||
193 | OPimNotifyManager &OPimEvent::notifiers() const | 190 | OPimNotifyManager &OPimEvent::notifiers() const |
194 | { | 191 | { |
195 | // I hope we can skip the changeOrModify here | 192 | // I hope we can skip the changeOrModify here |
196 | // the notifier should take care of it | 193 | // the notifier should take care of it |
197 | // and OPimNotify is shared too | 194 | // and OPimNotify is shared too |
198 | if ( !data->manager ) | 195 | if ( !data->manager ) |
199 | data->manager = new OPimNotifyManager; | 196 | data->manager = new OPimNotifyManager; |
200 | 197 | ||
201 | return *data->manager; | 198 | return *data->manager; |
202 | } | 199 | } |
203 | 200 | ||
204 | 201 | ||
205 | bool OPimEvent::hasNotifiers() const | 202 | bool OPimEvent::hasNotifiers() const |
206 | { | 203 | { |
207 | if ( !data->manager ) | 204 | if ( !data->manager ) |
208 | return false; | 205 | return false; |
209 | if ( data->manager->reminders().isEmpty() && | 206 | if ( data->manager->reminders().isEmpty() && |
210 | data->manager->alarms().isEmpty() ) | 207 | data->manager->alarms().isEmpty() ) |
211 | return false; | 208 | return false; |
212 | 209 | ||
213 | return true; | 210 | return true; |
214 | } | 211 | } |
215 | 212 | ||
216 | 213 | ||
217 | OPimRecurrence OPimEvent::recurrence() const | 214 | OPimRecurrence OPimEvent::recurrence() const |
218 | { | 215 | { |
219 | if ( !data->recur ) | 216 | if ( !data->recur ) |
220 | data->recur = new OPimRecurrence; | 217 | data->recur = new OPimRecurrence; |
221 | 218 | ||
222 | return *data->recur; | 219 | return *data->recur; |
223 | } | 220 | } |
224 | 221 | ||
225 | 222 | ||
226 | void OPimEvent::setRecurrence( const OPimRecurrence& rec ) | 223 | void OPimEvent::setRecurrence( const OPimRecurrence& rec ) |
227 | { | 224 | { |
228 | changeOrModify(); | 225 | changeOrModify(); |
229 | if ( data->recur ) | 226 | if ( data->recur ) |
230 | ( *data->recur ) = rec; | 227 | ( *data->recur ) = rec; |
231 | else | 228 | else |
232 | data->recur = new OPimRecurrence( rec ); | 229 | data->recur = new OPimRecurrence( rec ); |
233 | } | 230 | } |
234 | 231 | ||
235 | 232 | ||
236 | bool OPimEvent::hasRecurrence() const | 233 | bool OPimEvent::hasRecurrence() const |
237 | { | 234 | { |
238 | if ( !data->recur ) return false; | 235 | if ( !data->recur ) return false; |
239 | return data->recur->doesRecur(); | 236 | return data->recur->doesRecur(); |
240 | } | 237 | } |
241 | 238 | ||
242 | 239 | ||
243 | QString OPimEvent::note() const | 240 | QString OPimEvent::note() const |
244 | { | 241 | { |
245 | return data->note; | 242 | return data->note; |
246 | } | 243 | } |
247 | 244 | ||
248 | 245 | ||
249 | void OPimEvent::setNote( const QString& note ) | 246 | void OPimEvent::setNote( const QString& note ) |
250 | { | 247 | { |
251 | changeOrModify(); | 248 | changeOrModify(); |
252 | data->note = note; | 249 | data->note = note; |
253 | } | 250 | } |
254 | 251 | ||
255 | 252 | ||
256 | QDateTime OPimEvent::createdDateTime() const | 253 | QDateTime OPimEvent::createdDateTime() const |
257 | { | 254 | { |
258 | return data->created; | 255 | return data->created; |
259 | } | 256 | } |
260 | 257 | ||
261 | 258 | ||
262 | void OPimEvent::setCreatedDateTime( const QDateTime& time ) | 259 | void OPimEvent::setCreatedDateTime( const QDateTime& time ) |
263 | { | 260 | { |
264 | changeOrModify(); | 261 | changeOrModify(); |
265 | data->created = time; | 262 | data->created = time; |
266 | } | 263 | } |
267 | 264 | ||
268 | 265 | ||
269 | QDateTime OPimEvent::startDateTime() const | 266 | QDateTime OPimEvent::startDateTime() const |
270 | { | 267 | { |
271 | if ( data->isAllDay ) | 268 | if ( data->isAllDay ) |
272 | return QDateTime( data->start.date(), QTime( 0, 0, 0 ) ); | 269 | return QDateTime( data->start.date(), QTime( 0, 0, 0 ) ); |
273 | return data->start; | 270 | return data->start; |
274 | } | 271 | } |
275 | 272 | ||
276 | 273 | ||
277 | QDateTime OPimEvent::startDateTimeInZone() const | 274 | QDateTime OPimEvent::startDateTimeInZone() const |
278 | { | 275 | { |
279 | /* if no timezone, or all day event or if the current and this timeZone match... */ | 276 | /* if no timezone, or all day event or if the current and this timeZone match... */ |
280 | if ( data->timezone.isEmpty() || data->isAllDay || data->timezone == OPimTimeZone::current().timeZone() ) return startDateTime(); | 277 | if ( data->timezone.isEmpty() || data->isAllDay || data->timezone == OPimTimeZone::current().timeZone() ) return startDateTime(); |
281 | 278 | ||
282 | OPimTimeZone zone( data->timezone ); | 279 | OPimTimeZone zone( data->timezone ); |
283 | return zone.toDateTime( data->start, OPimTimeZone::current() ); | 280 | return zone.toDateTime( data->start, OPimTimeZone::current() ); |
284 | } | 281 | } |
285 | 282 | ||
286 | 283 | ||
287 | void OPimEvent::setStartDateTime( const QDateTime& dt ) | 284 | void OPimEvent::setStartDateTime( const QDateTime& dt ) |
288 | { | 285 | { |
289 | changeOrModify(); | 286 | changeOrModify(); |
290 | data->start = dt; | 287 | data->start = dt; |
291 | } | 288 | } |
292 | 289 | ||
293 | 290 | ||
294 | QDateTime OPimEvent::endDateTime() const | 291 | QDateTime OPimEvent::endDateTime() const |
295 | { | 292 | { |
296 | /* | 293 | /* |
297 | * if all Day event the end time needs | 294 | * if all Day event the end time needs |
298 | * to be on the same day as the start | 295 | * to be on the same day as the start |
299 | */ | 296 | */ |
300 | if ( data->isAllDay ) | 297 | if ( data->isAllDay ) |
301 | return QDateTime( data->start.date(), QTime( 23, 59, 59 ) ); | 298 | return QDateTime( data->start.date(), QTime( 23, 59, 59 ) ); |
302 | return data->end; | 299 | return data->end; |
303 | } | 300 | } |
304 | 301 | ||
305 | 302 | ||
306 | QDateTime OPimEvent::endDateTimeInZone() const | 303 | QDateTime OPimEvent::endDateTimeInZone() const |
307 | { | 304 | { |
308 | /* if no timezone, or all day event or if the current and this timeZone match... */ | 305 | /* if no timezone, or all day event or if the current and this timeZone match... */ |
309 | if ( data->timezone.isEmpty() || data->isAllDay || data->timezone == OPimTimeZone::current().timeZone() ) return endDateTime(); | 306 | if ( data->timezone.isEmpty() || data->isAllDay || data->timezone == OPimTimeZone::current().timeZone() ) return endDateTime(); |
310 | 307 | ||
311 | OPimTimeZone zone( data->timezone ); | 308 | OPimTimeZone zone( data->timezone ); |
312 | return zone.toDateTime( data->end, OPimTimeZone::current() ); | 309 | return zone.toDateTime( data->end, OPimTimeZone::current() ); |
313 | } | 310 | } |
314 | 311 | ||
315 | 312 | ||
316 | void OPimEvent::setEndDateTime( const QDateTime& dt ) | 313 | void OPimEvent::setEndDateTime( const QDateTime& dt ) |
317 | { | 314 | { |
318 | changeOrModify(); | 315 | changeOrModify(); |
319 | data->end = dt; | 316 | data->end = dt; |
320 | } | 317 | } |
321 | 318 | ||
322 | 319 | ||
323 | bool OPimEvent::isMultipleDay() const | 320 | bool OPimEvent::isMultipleDay() const |
324 | { | 321 | { |
325 | return data->end.date().day() - data->start.date().day(); | 322 | return data->end.date().day() - data->start.date().day(); |
326 | } | 323 | } |
327 | 324 | ||
328 | 325 | ||
329 | bool OPimEvent::isAllDay() const | 326 | bool OPimEvent::isAllDay() const |
330 | { | 327 | { |
331 | return data->isAllDay; | 328 | return data->isAllDay; |
332 | } | 329 | } |
333 | 330 | ||
334 | 331 | ||
335 | void OPimEvent::setAllDay( bool allDay ) | 332 | void OPimEvent::setAllDay( bool allDay ) |
336 | { | 333 | { |
337 | changeOrModify(); | 334 | changeOrModify(); |
338 | data->isAllDay = allDay; | 335 | data->isAllDay = allDay; |
339 | if ( allDay ) data->timezone = "UTC"; | 336 | if ( allDay ) data->timezone = "UTC"; |
340 | } | 337 | } |
341 | 338 | ||
342 | 339 | ||
343 | void OPimEvent::setTimeZone( const QString& tz ) | 340 | void OPimEvent::setTimeZone( const QString& tz ) |
344 | { | 341 | { |
345 | changeOrModify(); | 342 | changeOrModify(); |
346 | data->timezone = tz; | 343 | data->timezone = tz; |
347 | } | 344 | } |
348 | 345 | ||
349 | 346 | ||
350 | QString OPimEvent::timeZone() const | 347 | QString OPimEvent::timeZone() const |
351 | { | 348 | { |
352 | if ( data->isAllDay ) return QString::fromLatin1( "UTC" ); | 349 | if ( data->isAllDay ) return QString::fromLatin1( "UTC" ); |
353 | return data->timezone; | 350 | return data->timezone; |
354 | } | 351 | } |
355 | 352 | ||
356 | 353 | ||
357 | bool OPimEvent::match( const QRegExp& re ) const | 354 | bool OPimEvent::match( const QRegExp& re ) const |
358 | { | 355 | { |
359 | if ( re.match( data->description ) != -1 ) | 356 | if ( re.match( data->description ) != -1 ) |
360 | { | 357 | { |
361 | setLastHitField( Qtopia::DatebookDescription ); | 358 | setLastHitField( Qtopia::DatebookDescription ); |
362 | return true; | 359 | return true; |
363 | } | 360 | } |
364 | if ( re.match( data->note ) != -1 ) | 361 | if ( re.match( data->note ) != -1 ) |
365 | { | 362 | { |
366 | setLastHitField( Qtopia::Note ); | 363 | setLastHitField( Qtopia::Note ); |
367 | return true; | 364 | return true; |
368 | } | 365 | } |
369 | if ( re.match( data->location ) != -1 ) | 366 | if ( re.match( data->location ) != -1 ) |
370 | { | 367 | { |
371 | setLastHitField( Qtopia::Location ); | 368 | setLastHitField( Qtopia::Location ); |
372 | return true; | 369 | return true; |
373 | } | 370 | } |
374 | if ( re.match( data->start.toString() ) != -1 ) | 371 | if ( re.match( data->start.toString() ) != -1 ) |
375 | { | 372 | { |
376 | setLastHitField( Qtopia::StartDateTime ); | 373 | setLastHitField( Qtopia::StartDateTime ); |
377 | return true; | 374 | return true; |
378 | } | 375 | } |
379 | if ( re.match( data->end.toString() ) != -1 ) | 376 | if ( re.match( data->end.toString() ) != -1 ) |
380 | { | 377 | { |
381 | setLastHitField( Qtopia::EndDateTime ); | 378 | setLastHitField( Qtopia::EndDateTime ); |
382 | return true; | 379 | return true; |
383 | } | 380 | } |
384 | return false; | 381 | return false; |
385 | } | 382 | } |
386 | 383 | ||
387 | 384 | ||
388 | QString OPimEvent::toRichText() const | 385 | QString OPimEvent::toRichText() const |
389 | { | 386 | { |
390 | QString text, value; | 387 | QString text, value; |
391 | 388 | ||
392 | // description | 389 | // description |
393 | text += "<b><h3><img src=\"datebook/DateBook\">"; | 390 | text += "<b><h3><img src=\"datebook/DateBook\">"; |
394 | if ( !description().isEmpty() ) | 391 | if ( !description().isEmpty() ) |
395 | { | 392 | { |
396 | text += Qtopia::escapeString( description() ).replace( QRegExp( "[\n]" ), "" ); | 393 | text += Qtopia::escapeString( description() ).replace( QRegExp( "[\n]" ), "" ); |
397 | } | 394 | } |
398 | text += "</h3></b><br><hr><br>"; | 395 | text += "</h3></b><br><hr><br>"; |
399 | 396 | ||
400 | // location | 397 | // location |
401 | if ( !( value = location() ).isEmpty() ) | 398 | if ( !( value = location() ).isEmpty() ) |
402 | { | 399 | { |
403 | text += "<b>" + QObject::tr( "Location:" ) + "</b> "; | 400 | text += "<b>" + QObject::tr( "Location:" ) + "</b> "; |
404 | text += Qtopia::escapeString( value ) + "<br>"; | 401 | text += Qtopia::escapeString( value ) + "<br>"; |
405 | } | 402 | } |
406 | 403 | ||
407 | // all day event | 404 | // all day event |
408 | if ( isAllDay() ) | 405 | if ( isAllDay() ) |
409 | { | 406 | { |
410 | text += "<b><i>" + QObject::tr( "This is an all day event" ) + "</i></b><br>"; | 407 | text += "<b><i>" + QObject::tr( "This is an all day event" ) + "</i></b><br>"; |
411 | } | 408 | } |
412 | // multiple day event | 409 | // multiple day event |
413 | else if ( isMultipleDay () ) | 410 | else if ( isMultipleDay () ) |
414 | { | 411 | { |
415 | text += "<b><i>" + QObject::tr( "This is a multiple day event" ) + "</i></b><br>"; | 412 | text += "<b><i>" + QObject::tr( "This is a multiple day event" ) + "</i></b><br>"; |
416 | } | 413 | } |
417 | // start & end times | 414 | // start & end times |
418 | else | 415 | else |
419 | { | 416 | { |
420 | // start time | 417 | // start time |
421 | if ( startDateTime().isValid() ) | 418 | if ( startDateTime().isValid() ) |
422 | { | 419 | { |
423 | text += "<b>" + QObject::tr( "Start:" ) + "</b> "; | 420 | text += "<b>" + QObject::tr( "Start:" ) + "</b> "; |
424 | text += Qtopia::escapeString( startDateTime().toString() ). | 421 | text += Qtopia::escapeString( startDateTime().toString() ). |
425 | replace( QRegExp( "[\n]" ), "<br>" ) + "<br>"; | 422 | replace( QRegExp( "[\n]" ), "<br>" ) + "<br>"; |
426 | } | 423 | } |
427 | 424 | ||
428 | // end time | 425 | // end time |
429 | if ( endDateTime().isValid() ) | 426 | if ( endDateTime().isValid() ) |
430 | { | 427 | { |
431 | text += "<b>" + QObject::tr( "End:" ) + "</b> "; | 428 | text += "<b>" + QObject::tr( "End:" ) + "</b> "; |
432 | text += Qtopia::escapeString( endDateTime().toString() ). | 429 | text += Qtopia::escapeString( endDateTime().toString() ). |
433 | replace( QRegExp( "[\n]" ), "<br>" ) + "<br>"; | 430 | replace( QRegExp( "[\n]" ), "<br>" ) + "<br>"; |
434 | } | 431 | } |
435 | } | 432 | } |
436 | 433 | ||
437 | // categories | 434 | // categories |
438 | if ( categoryNames( "Calendar" ).count() ) | 435 | if ( categoryNames( "Calendar" ).count() ) |
439 | { | 436 | { |
440 | text += "<b>" + QObject::tr( "Category:" ) + "</b> "; | 437 | text += "<b>" + QObject::tr( "Category:" ) + "</b> "; |
441 | text += categoryNames( "Calendar" ).join( ", " ); | 438 | text += categoryNames( "Calendar" ).join( ", " ); |
442 | text += "<br>"; | 439 | text += "<br>"; |
443 | } | 440 | } |
444 | 441 | ||
445 | //notes | 442 | //notes |
446 | if ( !note().isEmpty() ) | 443 | if ( !note().isEmpty() ) |
447 | { | 444 | { |
448 | text += "<b>" + QObject::tr( "Note:" ) + "</b><br>"; | 445 | text += "<b>" + QObject::tr( "Note:" ) + "</b><br>"; |
449 | text += note(); | 446 | text += note(); |
450 | // text += Qtopia::escapeString(note() ). | 447 | // text += Qtopia::escapeString(note() ). |
451 | // replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; | 448 | // replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; |
452 | } | 449 | } |
453 | return text; | 450 | return text; |
454 | } | 451 | } |
455 | 452 | ||
456 | 453 | ||
457 | QString OPimEvent::toShortText() const | 454 | QString OPimEvent::toShortText() const |
458 | { | 455 | { |
459 | QString text; | 456 | QString text; |
460 | text += QString::number( startDateTime().date().day() ); | 457 | text += QString::number( startDateTime().date().day() ); |
461 | text += "."; | 458 | text += "."; |
462 | text += QString::number( startDateTime().date().month() ); | 459 | text += QString::number( startDateTime().date().month() ); |
463 | text += "."; | 460 | text += "."; |
464 | text += QString::number( startDateTime().date().year() ); | 461 | text += QString::number( startDateTime().date().year() ); |
465 | text += " "; | 462 | text += " "; |
466 | text += QString::number( startDateTime().time().hour() ); | 463 | text += QString::number( startDateTime().time().hour() ); |
467 | text += ":"; | 464 | text += ":"; |
468 | text += QString::number( startDateTime().time().minute() ); | 465 | text += QString::number( startDateTime().time().minute() ); |
469 | text += " - "; | 466 | text += " - "; |
470 | text += description(); | 467 | text += description(); |
471 | return text; | 468 | return text; |
472 | } | 469 | } |
473 | 470 | ||
474 | 471 | ||
475 | QString OPimEvent::type() const | 472 | QString OPimEvent::type() const |
476 | { | 473 | { |
477 | return QString::fromLatin1( "OPimEvent" ); | 474 | return QString::fromLatin1( "OPimEvent" ); |
478 | } | 475 | } |
479 | 476 | ||
480 | 477 | ||
481 | QString OPimEvent::recordField( int /*id */ ) const | 478 | QString OPimEvent::recordField( int /*id */ ) const |
482 | { | 479 | { |
483 | return QString::null; | 480 | return QString::null; |
484 | } | 481 | } |
485 | 482 | ||
486 | 483 | ||
487 | int OPimEvent::rtti() | 484 | int OPimEvent::rtti() |
488 | { | 485 | { |
489 | return OPimResolver::DateBook; | 486 | return OPimResolver::DateBook; |
490 | } | 487 | } |
491 | 488 | ||
492 | 489 | ||
493 | bool OPimEvent::loadFromStream( QDataStream& ) | 490 | bool OPimEvent::loadFromStream( QDataStream& ) |
494 | { | 491 | { |
495 | return true; | 492 | return true; |
496 | } | 493 | } |
497 | 494 | ||
498 | 495 | ||
499 | bool OPimEvent::saveToStream( QDataStream& ) const | 496 | bool OPimEvent::saveToStream( QDataStream& ) const |
500 | { | 497 | { |
501 | return true; | 498 | return true; |
502 | } | 499 | } |
503 | 500 | ||
504 | 501 | ||
505 | void OPimEvent::changeOrModify() | 502 | void OPimEvent::changeOrModify() |
506 | { | 503 | { |
507 | if ( data->count != 1 ) | 504 | if ( data->count != 1 ) |
508 | { | 505 | { |
509 | data->deref(); | 506 | data->deref(); |
510 | Data* d2 = new Data; | 507 | Data* d2 = new Data; |
511 | d2->description = data->description; | 508 | d2->description = data->description; |
512 | d2->location = data->location; | 509 | d2->location = data->location; |
513 | 510 | ||
514 | if ( data->manager ) | 511 | if ( data->manager ) |
515 | d2->manager = new OPimNotifyManager( *data->manager ); | 512 | d2->manager = new OPimNotifyManager( *data->manager ); |
516 | 513 | ||
517 | if ( data->recur ) | 514 | if ( data->recur ) |
518 | d2->recur = new OPimRecurrence( *data->recur ); | 515 | d2->recur = new OPimRecurrence( *data->recur ); |
519 | 516 | ||
520 | d2->note = data->note; | 517 | d2->note = data->note; |
521 | d2->created = data->created; | 518 | d2->created = data->created; |
522 | d2->start = data->start; | 519 | d2->start = data->start; |
523 | d2->end = data->end; | 520 | d2->end = data->end; |
524 | d2->isAllDay = data->isAllDay; | 521 | d2->isAllDay = data->isAllDay; |
525 | d2->timezone = data->timezone; | 522 | d2->timezone = data->timezone; |
526 | d2->parent = data->parent; | 523 | d2->parent = data->parent; |
527 | 524 | ||
528 | if ( data->child ) | 525 | if ( data->child ) |
529 | { | 526 | { |
530 | d2->child = new QArray<int>( *data->child ); | 527 | d2->child = new QArray<int>( *data->child ); |
531 | d2->child->detach(); | 528 | d2->child->detach(); |
532 | } | 529 | } |
533 | 530 | ||
534 | data = d2; | 531 | data = d2; |
535 | } | 532 | } |
536 | } | 533 | } |
537 | 534 | ||
538 | 535 | ||
539 | void OPimEvent::deref() | 536 | void OPimEvent::deref() |
540 | { | 537 | { |
541 | if ( data->deref() ) | 538 | if ( data->deref() ) |
542 | { | 539 | { |
543 | delete data; | 540 | delete data; |
544 | data = 0; | 541 | data = 0; |
545 | } | 542 | } |
546 | } | 543 | } |
547 | // Exporting Event data to map. Using the same | 544 | // Exporting Event data to map. Using the same |
548 | // encoding as ODateBookAccessBackend_xml does.. | 545 | // encoding as ODateBookAccessBackend_xml does.. |
549 | // Thus, we could remove the stuff there and use this | 546 | // Thus, we could remove the stuff there and use this |
550 | // for it and for all other places.. | 547 | // for it and for all other places.. |
551 | // Encoding should happen at one place, only ! (eilers) | 548 | // Encoding should happen at one place, only ! (eilers) |
552 | QMap<int, QString> OPimEvent::toMap() const | 549 | QMap<int, QString> OPimEvent::toMap() const |
553 | { | 550 | { |
554 | QMap<int, QString> retMap; | 551 | QMap<int, QString> retMap; |
555 | 552 | ||
556 | retMap.insert( OPimEvent::FUid, QString::number( uid() ) ); | 553 | retMap.insert( OPimEvent::FUid, QString::number( uid() ) ); |
557 | retMap.insert( OPimEvent::FCategories, Qtopia::escapeString( Qtopia::Record::idsToString( categories() ) ) ); | 554 | retMap.insert( OPimEvent::FCategories, Qtopia::escapeString( Qtopia::Record::idsToString( categories() ) ) ); |
558 | retMap.insert( OPimEvent::FDescription, Qtopia::escapeString( description() ) ); | 555 | retMap.insert( OPimEvent::FDescription, Qtopia::escapeString( description() ) ); |
559 | retMap.insert( OPimEvent::FLocation, Qtopia::escapeString( location() ) ); | 556 | retMap.insert( OPimEvent::FLocation, Qtopia::escapeString( location() ) ); |
560 | retMap.insert( OPimEvent::FType, isAllDay() ? "AllDay" : "" ); | 557 | retMap.insert( OPimEvent::FType, isAllDay() ? "AllDay" : "" ); |
561 | OPimAlarm alarm = notifiers().alarms() [ 0 ]; | 558 | OPimAlarm alarm = notifiers().alarms() [ 0 ]; |
562 | retMap.insert( OPimEvent::FAlarm, QString::number( alarm.dateTime().secsTo( startDateTime() ) / 60 ) ); | 559 | retMap.insert( OPimEvent::FAlarm, QString::number( alarm.dateTime().secsTo( startDateTime() ) / 60 ) ); |
563 | retMap.insert( OPimEvent::FSound, ( alarm.sound() == OPimAlarm::Loud ) ? "loud" : "silent" ); | 560 | retMap.insert( OPimEvent::FSound, ( alarm.sound() == OPimAlarm::Loud ) ? "loud" : "silent" ); |
564 | 561 | ||
565 | OPimTimeZone zone( timeZone().isEmpty() ? OPimTimeZone::current() : timeZone() ); | 562 | OPimTimeZone zone( timeZone().isEmpty() ? OPimTimeZone::current() : timeZone() ); |
566 | retMap.insert( OPimEvent::FStart, QString::number( zone.fromUTCDateTime( zone.toDateTime( startDateTime(), OPimTimeZone::utc() ) ) ) ); | 563 | retMap.insert( OPimEvent::FStart, QString::number( zone.fromUTCDateTime( zone.toDateTime( startDateTime(), OPimTimeZone::utc() ) ) ) ); |
567 | retMap.insert( OPimEvent::FEnd, QString::number( zone.fromUTCDateTime( zone.toDateTime( endDateTime(), OPimTimeZone::utc() ) ) ) ); | 564 | retMap.insert( OPimEvent::FEnd, QString::number( zone.fromUTCDateTime( zone.toDateTime( endDateTime(), OPimTimeZone::utc() ) ) ) ); |
568 | retMap.insert( OPimEvent::FNote, Qtopia::escapeString( note() ) ); | 565 | retMap.insert( OPimEvent::FNote, Qtopia::escapeString( note() ) ); |
569 | retMap.insert( OPimEvent::FTimeZone, timeZone().isEmpty() ? QString( "None" ) : timeZone() ); | 566 | retMap.insert( OPimEvent::FTimeZone, timeZone().isEmpty() ? QString( "None" ) : timeZone() ); |
570 | if ( parent() ) | 567 | if ( parent() ) |
571 | retMap.insert( OPimEvent::FRecParent, QString::number( parent() ) ); | 568 | retMap.insert( OPimEvent::FRecParent, QString::number( parent() ) ); |
572 | if ( children().count() ) | 569 | if ( children().count() ) |
573 | { | 570 | { |
574 | QArray<int> childr = children(); | 571 | QArray<int> childr = children(); |
575 | QString buf; | 572 | QString buf; |
576 | for ( uint i = 0; i < childr.count(); i++ ) | 573 | for ( uint i = 0; i < childr.count(); i++ ) |
577 | { | 574 | { |
578 | if ( i != 0 ) buf += " "; | 575 | if ( i != 0 ) buf += " "; |
579 | buf += QString::number( childr[ i ] ); | 576 | buf += QString::number( childr[ i ] ); |
580 | } | 577 | } |
581 | retMap.insert( OPimEvent::FRecChildren, buf ); | 578 | retMap.insert( OPimEvent::FRecChildren, buf ); |
582 | } | 579 | } |
583 | 580 | ||
584 | // Add recurrence stuff | 581 | // Add recurrence stuff |
585 | if ( hasRecurrence() ) | 582 | if ( hasRecurrence() ) |
586 | { | 583 | { |
587 | OPimRecurrence recur = recurrence(); | 584 | OPimRecurrence recur = recurrence(); |
588 | QMap<int, QString> recFields = recur.toMap(); | 585 | QMap<int, QString> recFields = recur.toMap(); |
589 | retMap.insert( OPimEvent::FRType, recFields[ OPimRecurrence::RType ] ); | 586 | retMap.insert( OPimEvent::FRType, recFields[ OPimRecurrence::RType ] ); |
590 | retMap.insert( OPimEvent::FRWeekdays, recFields[ OPimRecurrence::RWeekdays ] ); | 587 | retMap.insert( OPimEvent::FRWeekdays, recFields[ OPimRecurrence::RWeekdays ] ); |
591 | retMap.insert( OPimEvent::FRPosition, recFields[ OPimRecurrence::RPosition ] ); | 588 | retMap.insert( OPimEvent::FRPosition, recFields[ OPimRecurrence::RPosition ] ); |
592 | retMap.insert( OPimEvent::FRFreq, recFields[ OPimRecurrence::RFreq ] ); | 589 | retMap.insert( OPimEvent::FRFreq, recFields[ OPimRecurrence::RFreq ] ); |
593 | retMap.insert( OPimEvent::FRHasEndDate, recFields[ OPimRecurrence::RHasEndDate ] ); | 590 | retMap.insert( OPimEvent::FRHasEndDate, recFields[ OPimRecurrence::RHasEndDate ] ); |
594 | retMap.insert( OPimEvent::FREndDate, recFields[ OPimRecurrence::EndDate ] ); | 591 | retMap.insert( OPimEvent::FREndDate, recFields[ OPimRecurrence::EndDate ] ); |
595 | retMap.insert( OPimEvent::FRCreated, recFields[ OPimRecurrence::Created ] ); | 592 | retMap.insert( OPimEvent::FRCreated, recFields[ OPimRecurrence::Created ] ); |
596 | retMap.insert( OPimEvent::FRExceptions, recFields[ OPimRecurrence::Exceptions ] ); | 593 | retMap.insert( OPimEvent::FRExceptions, recFields[ OPimRecurrence::Exceptions ] ); |
597 | } | 594 | } |
598 | else | 595 | else |
599 | { | 596 | { |
600 | OPimRecurrence recur = recurrence(); | 597 | OPimRecurrence recur = recurrence(); |
601 | QMap<int, QString> recFields = recur.toMap(); | 598 | QMap<int, QString> recFields = recur.toMap(); |
602 | retMap.insert( OPimEvent::FRType, recFields[ OPimRecurrence::RType ] ); | 599 | retMap.insert( OPimEvent::FRType, recFields[ OPimRecurrence::RType ] ); |
603 | } | 600 | } |
604 | 601 | ||
605 | return retMap; | 602 | return retMap; |
606 | } | 603 | } |
607 | 604 | ||
608 | 605 | ||
609 | void OPimEvent::fromMap( const QMap<int, QString>& map ) | 606 | void OPimEvent::fromMap( const QMap<int, QString>& map ) |
610 | { | 607 | { |
611 | 608 | ||
612 | // We just want to set the UID if it is really stored. | 609 | // We just want to set the UID if it is really stored. |
613 | if ( !map[ OPimEvent::FUid ].isEmpty() ) | 610 | if ( !map[ OPimEvent::FUid ].isEmpty() ) |
614 | setUid( map[ OPimEvent::FUid ].toInt() ); | 611 | setUid( map[ OPimEvent::FUid ].toInt() ); |
615 | 612 | ||
616 | setCategories( idsFromString( map[ OPimEvent::FCategories ] ) ); | 613 | setCategories( idsFromString( map[ OPimEvent::FCategories ] ) ); |
617 | setDescription( map[ OPimEvent::FDescription ] ); | 614 | setDescription( map[ OPimEvent::FDescription ] ); |
618 | setLocation( map[ OPimEvent::FLocation ] ); | 615 | setLocation( map[ OPimEvent::FLocation ] ); |
619 | 616 | ||
620 | if ( map[ OPimEvent::FType ] == "AllDay" ) | 617 | if ( map[ OPimEvent::FType ] == "AllDay" ) |
621 | setAllDay( true ); | 618 | setAllDay( true ); |
622 | else | 619 | else |
623 | setAllDay( false ); | 620 | setAllDay( false ); |
624 | 621 | ||
625 | int alarmTime = -1; | 622 | int alarmTime = -1; |
626 | if ( !map[ OPimEvent::FAlarm ].isEmpty() ) | 623 | if ( !map[ OPimEvent::FAlarm ].isEmpty() ) |
627 | alarmTime = map[ OPimEvent::FAlarm ].toInt(); | 624 | alarmTime = map[ OPimEvent::FAlarm ].toInt(); |
628 | 625 | ||
629 | int sound = ( ( map[ OPimEvent::FSound ] == "loud" ) ? OPimAlarm::Loud : OPimAlarm::Silent ); | 626 | int sound = ( ( map[ OPimEvent::FSound ] == "loud" ) ? OPimAlarm::Loud : OPimAlarm::Silent ); |
630 | if ( ( alarmTime != -1 ) ) | 627 | if ( ( alarmTime != -1 ) ) |
631 | { | 628 | { |
632 | QDateTime dt = startDateTime().addSecs( -1 * alarmTime * 60 ); | 629 | QDateTime dt = startDateTime().addSecs( -1 * alarmTime * 60 ); |
633 | OPimAlarm al( sound , dt ); | 630 | OPimAlarm al( sound , dt ); |
634 | notifiers().add( al ); | 631 | notifiers().add( al ); |
635 | } | 632 | } |
636 | if ( !map[ OPimEvent::FTimeZone ].isEmpty() && ( map[ OPimEvent::FTimeZone ] != "None" ) ) | 633 | if ( !map[ OPimEvent::FTimeZone ].isEmpty() && ( map[ OPimEvent::FTimeZone ] != "None" ) ) |
637 | { | 634 | { |
638 | setTimeZone( map[ OPimEvent::FTimeZone ] ); | 635 | setTimeZone( map[ OPimEvent::FTimeZone ] ); |
639 | } | 636 | } |
640 | 637 | ||
641 | time_t start = ( time_t ) map[ OPimEvent::FStart ].toLong(); | 638 | time_t start = ( time_t ) map[ OPimEvent::FStart ].toLong(); |
642 | time_t end = ( time_t ) map[ OPimEvent::FEnd ].toLong(); | 639 | time_t end = ( time_t ) map[ OPimEvent::FEnd ].toLong(); |
643 | 640 | ||
644 | /* AllDay is always in UTC */ | 641 | /* AllDay is always in UTC */ |
645 | if ( isAllDay() ) | 642 | if ( isAllDay() ) |
646 | { | 643 | { |
647 | OPimTimeZone utc = OPimTimeZone::utc(); | 644 | OPimTimeZone utc = OPimTimeZone::utc(); |
648 | setStartDateTime( utc.fromUTCDateTime( start ) ); | 645 | setStartDateTime( utc.fromUTCDateTime( start ) ); |
649 | setEndDateTime ( utc.fromUTCDateTime( end ) ); | 646 | setEndDateTime ( utc.fromUTCDateTime( end ) ); |
650 | setTimeZone( "UTC" ); // make sure it is really utc | 647 | setTimeZone( "UTC" ); // make sure it is really utc |
651 | } | 648 | } |
652 | else | 649 | else |
653 | { | 650 | { |
654 | /* to current date time */ | 651 | /* to current date time */ |
655 | // qWarning(" Start is %d", start ); | 652 | // qWarning(" Start is %d", start ); |
656 | OPimTimeZone zone( timeZone().isEmpty() ? OPimTimeZone::current() : timeZone() ); | 653 | OPimTimeZone zone( timeZone().isEmpty() ? OPimTimeZone::current() : timeZone() ); |
657 | QDateTime date = zone.toDateTime( start ); | 654 | QDateTime date = zone.toDateTime( start ); |
658 | qWarning( " Start is %s", date.toString().latin1() ); | 655 | qWarning( " Start is %s", date.toString().latin1() ); |
659 | setStartDateTime( zone.toDateTime( date, OPimTimeZone::current() ) ); | 656 | setStartDateTime( zone.toDateTime( date, OPimTimeZone::current() ) ); |
660 | 657 | ||
661 | date = zone.toDateTime( end ); | 658 | date = zone.toDateTime( end ); |
662 | setEndDateTime ( zone.toDateTime( date, OPimTimeZone::current() ) ); | 659 | setEndDateTime ( zone.toDateTime( date, OPimTimeZone::current() ) ); |
663 | } | 660 | } |
664 | 661 | ||
665 | if ( !map[ OPimEvent::FRecParent ].isEmpty() ) | 662 | if ( !map[ OPimEvent::FRecParent ].isEmpty() ) |
666 | setParent( map[ OPimEvent::FRecParent ].toInt() ); | 663 | setParent( map[ OPimEvent::FRecParent ].toInt() ); |
667 | 664 | ||
668 | if ( !map[ OPimEvent::FRecChildren ].isEmpty() ) | 665 | if ( !map[ OPimEvent::FRecChildren ].isEmpty() ) |
669 | { | 666 | { |
670 | QStringList list = QStringList::split( ' ', map[ OPimEvent::FRecChildren ] ); | 667 | QStringList list = QStringList::split( ' ', map[ OPimEvent::FRecChildren ] ); |
671 | for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) | 668 | for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) |
672 | { | 669 | { |
673 | addChild( ( *it ).toInt() ); | 670 | addChild( ( *it ).toInt() ); |
674 | } | 671 | } |
675 | } | 672 | } |
676 | 673 | ||
677 | // Fill recurrence stuff and put it directly into the OPimRecurrence-Object using fromMap.. | 674 | // Fill recurrence stuff and put it directly into the OPimRecurrence-Object using fromMap.. |
678 | if ( !map[ OPimEvent::FRType ].isEmpty() ) | 675 | if ( !map[ OPimEvent::FRType ].isEmpty() ) |
679 | { | 676 | { |
680 | QMap<int, QString> recFields; | 677 | QMap<int, QString> recFields; |
681 | recFields.insert( OPimRecurrence::RType, map[ OPimEvent::FRType ] ); | 678 | recFields.insert( OPimRecurrence::RType, map[ OPimEvent::FRType ] ); |
682 | recFields.insert( OPimRecurrence::RWeekdays, map[ OPimEvent::FRWeekdays ] ); | 679 | recFields.insert( OPimRecurrence::RWeekdays, map[ OPimEvent::FRWeekdays ] ); |
683 | recFields.insert( OPimRecurrence::RPosition, map[ OPimEvent::FRPosition ] ); | 680 | recFields.insert( OPimRecurrence::RPosition, map[ OPimEvent::FRPosition ] ); |
684 | recFields.insert( OPimRecurrence::RFreq, map[ OPimEvent::FRFreq ] ); | 681 | recFields.insert( OPimRecurrence::RFreq, map[ OPimEvent::FRFreq ] ); |
685 | recFields.insert( OPimRecurrence::RHasEndDate, map[ OPimEvent::FRHasEndDate ] ); | 682 | recFields.insert( OPimRecurrence::RHasEndDate, map[ OPimEvent::FRHasEndDate ] ); |
686 | recFields.insert( OPimRecurrence::EndDate, map[ OPimEvent::FREndDate ] ); | 683 | recFields.insert( OPimRecurrence::EndDate, map[ OPimEvent::FREndDate ] ); |
687 | recFields.insert( OPimRecurrence::Created, map[ OPimEvent::FRCreated ] ); | 684 | recFields.insert( OPimRecurrence::Created, map[ OPimEvent::FRCreated ] ); |
688 | recFields.insert( OPimRecurrence::Exceptions, map[ OPimEvent::FRExceptions ] ); | 685 | recFields.insert( OPimRecurrence::Exceptions, map[ OPimEvent::FRExceptions ] ); |
689 | OPimRecurrence recur( recFields ); | 686 | OPimRecurrence recur( recFields ); |
690 | setRecurrence( recur ); | 687 | setRecurrence( recur ); |
691 | } | 688 | } |
692 | 689 | ||
693 | } | 690 | } |
694 | 691 | ||
695 | 692 | ||
696 | int OPimEvent::parent() const | 693 | int OPimEvent::parent() const |
697 | { | 694 | { |
698 | return data->parent; | 695 | return data->parent; |
699 | } | 696 | } |
700 | 697 | ||
701 | 698 | ||
702 | void OPimEvent::setParent( int uid ) | 699 | void OPimEvent::setParent( int uid ) |
703 | { | 700 | { |
704 | changeOrModify(); | 701 | changeOrModify(); |
705 | data->parent = uid; | 702 | data->parent = uid; |
706 | } | 703 | } |
707 | 704 | ||
708 | 705 | ||
709 | QArray<int> OPimEvent::children() const | 706 | QArray<int> OPimEvent::children() const |
710 | { | 707 | { |
711 | if ( !data->child ) return QArray<int>(); | 708 | if ( !data->child ) return QArray<int>(); |
712 | else | 709 | else |
713 | return data->child->copy(); | 710 | return data->child->copy(); |
714 | } | 711 | } |
715 | 712 | ||
716 | 713 | ||
717 | void OPimEvent::setChildren( const QArray<int>& arr ) | 714 | void OPimEvent::setChildren( const QArray<int>& arr ) |
718 | { | 715 | { |
719 | changeOrModify(); | 716 | changeOrModify(); |
720 | if ( data->child ) delete data->child; | 717 | if ( data->child ) delete data->child; |
721 | 718 | ||
722 | data->child = new QArray<int>( arr ); | 719 | data->child = new QArray<int>( arr ); |
723 | data->child->detach(); | 720 | data->child->detach(); |
724 | } | 721 | } |
725 | 722 | ||
726 | 723 | ||
727 | void OPimEvent::addChild( int uid ) | 724 | void OPimEvent::addChild( int uid ) |
728 | { | 725 | { |
729 | changeOrModify(); | 726 | changeOrModify(); |
730 | if ( !data->child ) | 727 | if ( !data->child ) |
731 | { | 728 | { |
732 | data->child = new QArray<int>( 1 ); | 729 | data->child = new QArray<int>( 1 ); |
733 | ( *data->child ) [ 0 ] = uid; | 730 | ( *data->child ) [ 0 ] = uid; |
734 | } | 731 | } |
735 | else | 732 | else |
736 | { | 733 | { |
737 | int count = data->child->count(); | 734 | int count = data->child->count(); |
738 | data->child->resize( count + 1 ); | 735 | data->child->resize( count + 1 ); |
739 | ( *data->child ) [ count ] = uid; | 736 | ( *data->child ) [ count ] = uid; |
740 | } | 737 | } |
741 | } | 738 | } |
742 | 739 | ||
743 | 740 | ||
744 | void OPimEvent::removeChild( int uid ) | 741 | void OPimEvent::removeChild( int uid ) |
745 | { | 742 | { |
746 | if ( !data->child || !data->child->contains( uid ) ) return ; | 743 | if ( !data->child || !data->child->contains( uid ) ) return ; |
747 | changeOrModify(); | 744 | changeOrModify(); |
748 | QArray<int> newAr( data->child->count() - 1 ); | 745 | QArray<int> newAr( data->child->count() - 1 ); |
749 | int j = 0; | 746 | int j = 0; |
750 | uint count = data->child->count(); | 747 | uint count = data->child->count(); |
751 | for ( uint i = 0; i < count; i++ ) | 748 | for ( uint i = 0; i < count; i++ ) |
752 | { | 749 | { |
753 | if ( ( *data->child ) [ i ] != uid ) | 750 | if ( ( *data->child ) [ i ] != uid ) |
754 | { | 751 | { |
755 | newAr[ j ] = ( *data->child ) [ i ]; | 752 | newAr[ j ] = ( *data->child ) [ i ]; |
756 | j++; | 753 | j++; |
757 | } | 754 | } |
758 | } | 755 | } |
759 | ( *data->child ) = newAr; | 756 | ( *data->child ) = newAr; |
760 | } | 757 | } |
761 | 758 | ||
762 | 759 | ||
763 | struct OEffectiveEvent::Data : public QShared | 760 | struct OEffectiveEvent::Data : public QShared |
764 | { | 761 | { |
765 | Data() : QShared() | 762 | Data() : QShared() |
766 | {} | 763 | {} |
767 | OPimEvent event; | 764 | OPimEvent event; |
768 | QDate date; | 765 | QDate date; |
769 | QTime start, end; | 766 | QTime start, end; |
770 | QDate startDate, endDate; | 767 | QDate startDate, endDate; |
771 | bool dates : 1; | 768 | bool dates : 1; |
772 | }; | 769 | }; |
773 | 770 | ||
774 | 771 | ||
775 | OEffectiveEvent::OEffectiveEvent() | 772 | OEffectiveEvent::OEffectiveEvent() |
776 | { | 773 | { |
777 | data = new Data; | 774 | data = new Data; |
778 | data->date = QDate::currentDate(); | 775 | data->date = QDate::currentDate(); |
779 | data->start = data->end = QTime::currentTime(); | 776 | data->start = data->end = QTime::currentTime(); |
780 | data->dates = false; | 777 | data->dates = false; |
781 | } | 778 | } |
782 | 779 | ||
783 | 780 | ||
784 | OEffectiveEvent::OEffectiveEvent( const OPimEvent& ev, const QDate& startDate, | 781 | OEffectiveEvent::OEffectiveEvent( const OPimEvent& ev, const QDate& startDate, |
785 | Position pos ) | 782 | Position pos ) |
786 | { | 783 | { |
787 | data = new Data; | 784 | data = new Data; |
788 | data->event = ev; | 785 | data->event = ev; |
789 | data->date = startDate; | 786 | data->date = startDate; |
790 | if ( pos & Start ) | 787 | if ( pos & Start ) |
791 | data->start = ev.startDateTime().time(); | 788 | data->start = ev.startDateTime().time(); |
792 | else | 789 | else |
793 | data->start = QTime( 0, 0, 0 ); | 790 | data->start = QTime( 0, 0, 0 ); |
794 | 791 | ||
795 | if ( pos & End ) | 792 | if ( pos & End ) |
796 | data->end = ev.endDateTime().time(); | 793 | data->end = ev.endDateTime().time(); |
797 | else | 794 | else |
798 | data->end = QTime( 23, 59, 59 ); | 795 | data->end = QTime( 23, 59, 59 ); |
799 | 796 | ||
800 | data->dates = false; | 797 | data->dates = false; |
801 | } | 798 | } |
802 | 799 | ||
803 | 800 | ||
804 | OEffectiveEvent::OEffectiveEvent( const OEffectiveEvent& ev ) | 801 | OEffectiveEvent::OEffectiveEvent( const OEffectiveEvent& ev ) |
805 | { | 802 | { |
806 | data = ev.data; | 803 | data = ev.data; |
807 | data->ref(); | 804 | data->ref(); |
808 | } | 805 | } |
809 | 806 | ||
810 | 807 | ||
811 | OEffectiveEvent::~OEffectiveEvent() | 808 | OEffectiveEvent::~OEffectiveEvent() |
812 | { | 809 | { |
813 | if ( data->deref() ) | 810 | if ( data->deref() ) |
814 | { | 811 | { |
815 | delete data; | 812 | delete data; |
816 | data = 0; | 813 | data = 0; |
817 | } | 814 | } |
818 | } | 815 | } |
819 | 816 | ||
820 | 817 | ||
821 | OEffectiveEvent& OEffectiveEvent::operator=( const OEffectiveEvent& ev ) | 818 | OEffectiveEvent& OEffectiveEvent::operator=( const OEffectiveEvent& ev ) |
822 | { | 819 | { |
823 | if ( *this == ev ) return * this; | 820 | if ( *this == ev ) return * this; |
824 | 821 | ||
825 | ev.data->ref(); | 822 | ev.data->ref(); |
826 | deref(); | 823 | deref(); |
827 | data = ev.data; | 824 | data = ev.data; |
828 | 825 | ||
829 | return *this; | 826 | return *this; |
830 | } | 827 | } |
831 | 828 | ||
832 | 829 | ||
833 | void OEffectiveEvent::setStartTime( const QTime& ti ) | 830 | void OEffectiveEvent::setStartTime( const QTime& ti ) |
834 | { | 831 | { |
835 | changeOrModify(); | 832 | changeOrModify(); |
836 | data->start = ti; | 833 | data->start = ti; |
837 | } | 834 | } |
838 | 835 | ||
839 | 836 | ||
840 | void OEffectiveEvent::setEndTime( const QTime& en ) | 837 | void OEffectiveEvent::setEndTime( const QTime& en ) |
841 | { | 838 | { |
842 | changeOrModify(); | 839 | changeOrModify(); |
843 | data->end = en; | 840 | data->end = en; |
844 | } | 841 | } |
845 | 842 | ||
846 | 843 | ||
847 | void OEffectiveEvent::setEvent( const OPimEvent& ev ) | 844 | void OEffectiveEvent::setEvent( const OPimEvent& ev ) |
848 | { | 845 | { |
849 | changeOrModify(); | 846 | changeOrModify(); |
850 | data->event = ev; | 847 | data->event = ev; |
851 | } | 848 | } |
852 | 849 | ||
853 | 850 | ||
854 | void OEffectiveEvent::setDate( const QDate& da ) | 851 | void OEffectiveEvent::setDate( const QDate& da ) |
855 | { | 852 | { |
856 | changeOrModify(); | 853 | changeOrModify(); |
857 | data->date = da; | 854 | data->date = da; |
858 | } | 855 | } |
859 | 856 | ||
860 | 857 | ||
861 | void OEffectiveEvent::setEffectiveDates( const QDate& from, | 858 | void OEffectiveEvent::setEffectiveDates( const QDate& from, |
862 | const QDate& to ) | 859 | const QDate& to ) |
863 | { | 860 | { |
864 | if ( !from.isValid() ) | 861 | if ( !from.isValid() ) |
865 | { | 862 | { |
866 | data->dates = false; | 863 | data->dates = false; |
867 | return ; | 864 | return ; |
868 | } | 865 | } |
869 | 866 | ||
870 | data->startDate = from; | 867 | data->startDate = from; |
871 | data->endDate = to; | 868 | data->endDate = to; |
872 | } | 869 | } |
873 | 870 | ||
874 | 871 | ||
875 | QString OEffectiveEvent::description() const | 872 | QString OEffectiveEvent::description() const |
876 | { | 873 | { |
877 | return data->event.description(); | 874 | return data->event.description(); |
878 | } | 875 | } |
879 | 876 | ||
880 | 877 | ||
881 | QString OEffectiveEvent::location() const | 878 | QString OEffectiveEvent::location() const |
882 | { | 879 | { |
883 | return data->event.location(); | 880 | return data->event.location(); |
884 | } | 881 | } |
885 | 882 | ||
886 | 883 | ||
887 | QString OEffectiveEvent::note() const | 884 | QString OEffectiveEvent::note() const |
888 | { | 885 | { |
889 | return data->event.note(); | 886 | return data->event.note(); |
890 | } | 887 | } |
891 | 888 | ||
892 | 889 | ||
893 | OPimEvent OEffectiveEvent::event() const | 890 | OPimEvent OEffectiveEvent::event() const |
894 | { | 891 | { |
895 | return data->event; | 892 | return data->event; |
896 | } | 893 | } |
897 | 894 | ||
898 | 895 | ||
899 | QTime OEffectiveEvent::startTime() const | 896 | QTime OEffectiveEvent::startTime() const |
900 | { | 897 | { |
901 | return data->start; | 898 | return data->start; |
902 | } | 899 | } |
903 | 900 | ||
904 | 901 | ||
905 | QTime OEffectiveEvent::endTime() const | 902 | QTime OEffectiveEvent::endTime() const |
906 | { | 903 | { |
907 | return data->end; | 904 | return data->end; |
908 | } | 905 | } |
909 | 906 | ||
910 | 907 | ||
911 | QDate OEffectiveEvent::date() const | 908 | QDate OEffectiveEvent::date() const |
912 | { | 909 | { |
913 | return data->date; | 910 | return data->date; |
914 | } | 911 | } |
915 | 912 | ||
916 | 913 | ||
917 | int OEffectiveEvent::length() const | 914 | int OEffectiveEvent::length() const |
918 | { | 915 | { |
919 | return ( data->end.hour() * 60 - data->start.hour() * 60 ) | 916 | return ( data->end.hour() * 60 - data->start.hour() * 60 ) |
920 | + QABS( data->start.minute() - data->end.minute() ); | 917 | + QABS( data->start.minute() - data->end.minute() ); |
921 | } | 918 | } |
922 | 919 | ||
923 | 920 | ||
924 | int OEffectiveEvent::size() const | 921 | int OEffectiveEvent::size() const |
925 | { | 922 | { |
926 | return ( data->end.hour() - data->start.hour() ) * 3600 | 923 | return ( data->end.hour() - data->start.hour() ) * 3600 |
927 | + ( data->end.minute() - data->start.minute() * 60 | 924 | + ( data->end.minute() - data->start.minute() * 60 |
928 | + data->end.second() - data->start.second() ); | 925 | + data->end.second() - data->start.second() ); |
929 | } | 926 | } |
930 | 927 | ||
931 | 928 | ||
932 | QDate OEffectiveEvent::startDate() const | 929 | QDate OEffectiveEvent::startDate() const |
933 | { | 930 | { |
934 | if ( data->dates ) | 931 | if ( data->dates ) |
935 | return data->startDate; | 932 | return data->startDate; |
936 | else if ( data->event.hasRecurrence() ) // single day, since multi-day should have a d pointer | 933 | else if ( data->event.hasRecurrence() ) // single day, since multi-day should have a d pointer |
937 | return data->date; | 934 | return data->date; |
938 | else | 935 | else |
939 | return data->event.startDateTime().date(); | 936 | return data->event.startDateTime().date(); |
940 | } | 937 | } |
941 | 938 | ||
942 | 939 | ||
943 | QDate OEffectiveEvent::endDate() const | 940 | QDate OEffectiveEvent::endDate() const |
944 | { | 941 | { |
945 | if ( data->dates ) | 942 | if ( data->dates ) |
946 | return data->endDate; | 943 | return data->endDate; |
947 | else if ( data->event.hasRecurrence() ) | 944 | else if ( data->event.hasRecurrence() ) |
948 | return data->date; | 945 | return data->date; |
949 | else | 946 | else |
950 | return data->event.endDateTime().date(); | 947 | return data->event.endDateTime().date(); |
951 | } | 948 | } |
952 | 949 | ||
953 | 950 | ||
954 | void OEffectiveEvent::deref() | 951 | void OEffectiveEvent::deref() |
955 | { | 952 | { |
956 | if ( data->deref() ) | 953 | if ( data->deref() ) |
957 | { | 954 | { |
958 | delete data; | 955 | delete data; |
959 | data = 0; | 956 | data = 0; |
960 | } | 957 | } |
961 | } | 958 | } |
962 | 959 | ||
963 | 960 | ||
964 | void OEffectiveEvent::changeOrModify() | 961 | void OEffectiveEvent::changeOrModify() |
965 | { | 962 | { |
966 | if ( data->count != 1 ) | 963 | if ( data->count != 1 ) |
967 | { | 964 | { |
968 | data->deref(); | 965 | data->deref(); |
969 | Data* d2 = new Data; | 966 | Data* d2 = new Data; |
970 | d2->event = data->event; | 967 | d2->event = data->event; |
971 | d2->date = data->date; | 968 | d2->date = data->date; |
972 | d2->start = data->start; | 969 | d2->start = data->start; |
973 | d2->end = data->end; | 970 | d2->end = data->end; |
974 | d2->startDate = data->startDate; | 971 | d2->startDate = data->startDate; |
975 | d2->endDate = data->endDate; | 972 | d2->endDate = data->endDate; |
976 | d2->dates = data->dates; | 973 | d2->dates = data->dates; |
977 | data = d2; | 974 | data = d2; |
978 | } | 975 | } |
979 | } | 976 | } |
980 | 977 | ||
981 | 978 | ||
982 | bool OEffectiveEvent::operator<( const OEffectiveEvent &e ) const | 979 | bool OEffectiveEvent::operator<( const OEffectiveEvent &e ) const |
983 | { | 980 | { |
984 | if ( data->date < e.date() ) | 981 | if ( data->date < e.date() ) |
985 | return TRUE; | 982 | return TRUE; |
986 | if ( data->date == e.date() ) | 983 | if ( data->date == e.date() ) |
987 | return ( startTime() < e.startTime() ); | 984 | return ( startTime() < e.startTime() ); |
988 | else | 985 | else |
989 | return FALSE; | 986 | return FALSE; |
990 | } | 987 | } |
991 | 988 | ||
992 | 989 | ||
993 | bool OEffectiveEvent::operator<=( const OEffectiveEvent &e ) const | 990 | bool OEffectiveEvent::operator<=( const OEffectiveEvent &e ) const |
994 | { | 991 | { |
995 | return ( data->date <= e.date() ); | 992 | return ( data->date <= e.date() ); |
996 | } | 993 | } |
997 | 994 | ||
998 | 995 | ||
999 | bool OEffectiveEvent::operator==( const OEffectiveEvent &e ) const | 996 | bool OEffectiveEvent::operator==( const OEffectiveEvent &e ) const |
1000 | { | 997 | { |
1001 | return ( date() == e.date() | 998 | return ( date() == e.date() |
1002 | && startTime() == e.startTime() | 999 | && startTime() == e.startTime() |
1003 | && endTime() == e.endTime() | 1000 | && endTime() == e.endTime() |
1004 | && event() == e.event() ); | 1001 | && event() == e.event() ); |
1005 | } | 1002 | } |
1006 | 1003 | ||
1007 | 1004 | ||
1008 | bool OEffectiveEvent::operator!=( const OEffectiveEvent &e ) const | 1005 | bool OEffectiveEvent::operator!=( const OEffectiveEvent &e ) const |
1009 | { | 1006 | { |
1010 | return !( *this == e ); | 1007 | return !( *this == e ); |
1011 | } | 1008 | } |
1012 | 1009 | ||
1013 | 1010 | ||
1014 | bool OEffectiveEvent::operator>( const OEffectiveEvent &e ) const | 1011 | bool OEffectiveEvent::operator>( const OEffectiveEvent &e ) const |
1015 | { | 1012 | { |
1016 | return !( *this <= e ); | 1013 | return !( *this <= e ); |
1017 | } | 1014 | } |
1018 | 1015 | ||
1019 | 1016 | ||
1020 | bool OEffectiveEvent::operator>= ( const OEffectiveEvent &e ) const | 1017 | bool OEffectiveEvent::operator>= ( const OEffectiveEvent &e ) const |
1021 | { | 1018 | { |
1022 | return !( *this < e ); | 1019 | return !( *this < e ); |
1023 | } | 1020 | } |
1024 | 1021 | ||
1025 | } | 1022 | } |
diff --git a/libopie2/opiepim/core/opimnotify.cpp b/libopie2/opiepim/core/opimnotify.cpp index 43858f0..417b0b9 100644 --- a/libopie2/opiepim/core/opimnotify.cpp +++ b/libopie2/opiepim/core/opimnotify.cpp | |||
@@ -1,379 +1,378 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) The Main Author <main-author@whereever.org> | 3 | Copyright (C) The Main Author <main-author@whereever.org> |
4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> | 4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> |
5 | .=l. | 5 | .=l. |
6 | .>+-= | 6 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 7 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 8 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 11 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 12 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include "opimnotify.h" | 30 | #include "opimnotify.h" |
31 | 31 | ||
32 | /* QT */ | 32 | /* QT */ |
33 | #include <qshared.h> | ||
34 | 33 | ||
35 | namespace Opie | 34 | namespace Opie |
36 | { | 35 | { |
37 | 36 | ||
38 | struct OPimNotify::Data : public QShared | 37 | struct OPimNotify::Data : public QShared |
39 | { | 38 | { |
40 | Data() : QShared(), dur( -1 ), parent( 0 ) | 39 | Data() : QShared(), dur( -1 ), parent( 0 ) |
41 | { | 40 | { |
42 | } | 41 | } |
43 | QDateTime start; | 42 | QDateTime start; |
44 | int dur; | 43 | int dur; |
45 | QString application; | 44 | QString application; |
46 | int parent; | 45 | int parent; |
47 | }; | 46 | }; |
48 | 47 | ||
49 | OPimNotify::OPimNotify( const QDateTime& start, int duration, int parent ) | 48 | OPimNotify::OPimNotify( const QDateTime& start, int duration, int parent ) |
50 | { | 49 | { |
51 | data = new Data; | 50 | data = new Data; |
52 | data->start = start; | 51 | data->start = start; |
53 | data->dur = duration; | 52 | data->dur = duration; |
54 | data->parent = parent; | 53 | data->parent = parent; |
55 | } | 54 | } |
56 | 55 | ||
57 | 56 | ||
58 | OPimNotify::OPimNotify( const OPimNotify& noti ) | 57 | OPimNotify::OPimNotify( const OPimNotify& noti ) |
59 | : data( noti.data ) | 58 | : data( noti.data ) |
60 | { | 59 | { |
61 | data->ref(); | 60 | data->ref(); |
62 | } | 61 | } |
63 | 62 | ||
64 | 63 | ||
65 | OPimNotify::~OPimNotify() | 64 | OPimNotify::~OPimNotify() |
66 | { | 65 | { |
67 | if ( data->deref() ) | 66 | if ( data->deref() ) |
68 | { | 67 | { |
69 | delete data; | 68 | delete data; |
70 | data = 0l; | 69 | data = 0l; |
71 | } | 70 | } |
72 | } | 71 | } |
73 | 72 | ||
74 | 73 | ||
75 | OPimNotify &OPimNotify::operator=( const OPimNotify& noti ) | 74 | OPimNotify &OPimNotify::operator=( const OPimNotify& noti ) |
76 | { | 75 | { |
77 | noti.data->ref(); | 76 | noti.data->ref(); |
78 | deref(); | 77 | deref(); |
79 | data = noti.data; | 78 | data = noti.data; |
80 | 79 | ||
81 | return *this; | 80 | return *this; |
82 | } | 81 | } |
83 | 82 | ||
84 | 83 | ||
85 | bool OPimNotify::operator==( const OPimNotify& noti ) | 84 | bool OPimNotify::operator==( const OPimNotify& noti ) |
86 | { | 85 | { |
87 | if ( data == noti.data ) return true; | 86 | if ( data == noti.data ) return true; |
88 | if ( data->dur != noti.data->dur ) return false; | 87 | if ( data->dur != noti.data->dur ) return false; |
89 | if ( data->parent != noti.data->parent ) return false; | 88 | if ( data->parent != noti.data->parent ) return false; |
90 | if ( data->application != noti.data->application ) return false; | 89 | if ( data->application != noti.data->application ) return false; |
91 | if ( data->start != noti.data->start ) return false; | 90 | if ( data->start != noti.data->start ) return false; |
92 | 91 | ||
93 | return true; | 92 | return true; |
94 | } | 93 | } |
95 | 94 | ||
96 | 95 | ||
97 | QDateTime OPimNotify::dateTime() const | 96 | QDateTime OPimNotify::dateTime() const |
98 | { | 97 | { |
99 | return data->start; | 98 | return data->start; |
100 | } | 99 | } |
101 | 100 | ||
102 | 101 | ||
103 | QString OPimNotify::service() const | 102 | QString OPimNotify::service() const |
104 | { | 103 | { |
105 | return data->application; | 104 | return data->application; |
106 | } | 105 | } |
107 | 106 | ||
108 | 107 | ||
109 | int OPimNotify::parent() const | 108 | int OPimNotify::parent() const |
110 | { | 109 | { |
111 | return data->parent; | 110 | return data->parent; |
112 | } | 111 | } |
113 | 112 | ||
114 | 113 | ||
115 | int OPimNotify::duration() const | 114 | int OPimNotify::duration() const |
116 | { | 115 | { |
117 | return data->dur; | 116 | return data->dur; |
118 | } | 117 | } |
119 | 118 | ||
120 | 119 | ||
121 | QDateTime OPimNotify::endTime() const | 120 | QDateTime OPimNotify::endTime() const |
122 | { | 121 | { |
123 | return QDateTime( data->start.date(), data->start.time().addSecs( data->dur ) ); | 122 | return QDateTime( data->start.date(), data->start.time().addSecs( data->dur ) ); |
124 | } | 123 | } |
125 | 124 | ||
126 | 125 | ||
127 | void OPimNotify::setDateTime( const QDateTime& time ) | 126 | void OPimNotify::setDateTime( const QDateTime& time ) |
128 | { | 127 | { |
129 | copyIntern(); | 128 | copyIntern(); |
130 | data->start = time; | 129 | data->start = time; |
131 | } | 130 | } |
132 | 131 | ||
133 | 132 | ||
134 | void OPimNotify::setDuration( int dur ) | 133 | void OPimNotify::setDuration( int dur ) |
135 | { | 134 | { |
136 | copyIntern(); | 135 | copyIntern(); |
137 | data->dur = dur; | 136 | data->dur = dur; |
138 | } | 137 | } |
139 | 138 | ||
140 | 139 | ||
141 | void OPimNotify::setParent( int uid ) | 140 | void OPimNotify::setParent( int uid ) |
142 | { | 141 | { |
143 | copyIntern(); | 142 | copyIntern(); |
144 | data->parent = uid; | 143 | data->parent = uid; |
145 | } | 144 | } |
146 | 145 | ||
147 | 146 | ||
148 | void OPimNotify::setService( const QString& str ) | 147 | void OPimNotify::setService( const QString& str ) |
149 | { | 148 | { |
150 | copyIntern(); | 149 | copyIntern(); |
151 | data->application = str; | 150 | data->application = str; |
152 | } | 151 | } |
153 | 152 | ||
154 | 153 | ||
155 | void OPimNotify::copyIntern() | 154 | void OPimNotify::copyIntern() |
156 | { | 155 | { |
157 | if ( data->count != 1 ) | 156 | if ( data->count != 1 ) |
158 | { | 157 | { |
159 | data->deref(); | 158 | data->deref(); |
160 | Data* dat = new Data; | 159 | Data* dat = new Data; |
161 | dat->start = data->start; | 160 | dat->start = data->start; |
162 | dat->dur = data->dur; | 161 | dat->dur = data->dur; |
163 | dat->application = data->application; | 162 | dat->application = data->application; |
164 | dat->parent = data->parent; | 163 | dat->parent = data->parent; |
165 | data = dat; | 164 | data = dat; |
166 | } | 165 | } |
167 | } | 166 | } |
168 | 167 | ||
169 | 168 | ||
170 | void OPimNotify::deref() | 169 | void OPimNotify::deref() |
171 | { | 170 | { |
172 | if ( data->deref() ) | 171 | if ( data->deref() ) |
173 | { | 172 | { |
174 | delete data; | 173 | delete data; |
175 | data = 0; | 174 | data = 0; |
176 | } | 175 | } |
177 | } | 176 | } |
178 | 177 | ||
179 | 178 | ||
180 | /***********************************************************/ | 179 | /***********************************************************/ |
181 | struct OPimAlarm::Data : public QShared | 180 | struct OPimAlarm::Data : public QShared |
182 | { | 181 | { |
183 | Data() : QShared() | 182 | Data() : QShared() |
184 | { | 183 | { |
185 | sound = 1; | 184 | sound = 1; |
186 | } | 185 | } |
187 | int sound; | 186 | int sound; |
188 | QString file; | 187 | QString file; |
189 | }; | 188 | }; |
190 | 189 | ||
191 | 190 | ||
192 | OPimAlarm::OPimAlarm( int sound, const QDateTime& start, int duration, int parent ) | 191 | OPimAlarm::OPimAlarm( int sound, const QDateTime& start, int duration, int parent ) |
193 | : OPimNotify( start, duration, parent ) | 192 | : OPimNotify( start, duration, parent ) |
194 | { | 193 | { |
195 | data = new Data; | 194 | data = new Data; |
196 | data->sound = sound; | 195 | data->sound = sound; |
197 | } | 196 | } |
198 | 197 | ||
199 | 198 | ||
200 | OPimAlarm::OPimAlarm( const OPimAlarm& al ) | 199 | OPimAlarm::OPimAlarm( const OPimAlarm& al ) |
201 | : OPimNotify( al ), data( al.data ) | 200 | : OPimNotify( al ), data( al.data ) |
202 | { | 201 | { |
203 | data->ref(); | 202 | data->ref(); |
204 | } | 203 | } |
205 | 204 | ||
206 | 205 | ||
207 | OPimAlarm::~OPimAlarm() | 206 | OPimAlarm::~OPimAlarm() |
208 | { | 207 | { |
209 | if ( data->deref() ) | 208 | if ( data->deref() ) |
210 | { | 209 | { |
211 | delete data; | 210 | delete data; |
212 | data = 0l; | 211 | data = 0l; |
213 | } | 212 | } |
214 | } | 213 | } |
215 | 214 | ||
216 | 215 | ||
217 | OPimAlarm &OPimAlarm::operator=( const OPimAlarm& al ) | 216 | OPimAlarm &OPimAlarm::operator=( const OPimAlarm& al ) |
218 | { | 217 | { |
219 | OPimNotify::operator=( al ); | 218 | OPimNotify::operator=( al ); |
220 | deref(); | 219 | deref(); |
221 | al.data->ref(); | 220 | al.data->ref(); |
222 | 221 | ||
223 | data = al.data; | 222 | data = al.data; |
224 | 223 | ||
225 | 224 | ||
226 | return *this; | 225 | return *this; |
227 | } | 226 | } |
228 | 227 | ||
229 | 228 | ||
230 | bool OPimAlarm::operator==( const OPimAlarm& al ) | 229 | bool OPimAlarm::operator==( const OPimAlarm& al ) |
231 | { | 230 | { |
232 | if ( data->sound != al.data->sound ) return false; | 231 | if ( data->sound != al.data->sound ) return false; |
233 | else if ( data->sound == Custom && data->file != al.data->file ) | 232 | else if ( data->sound == Custom && data->file != al.data->file ) |
234 | return false; | 233 | return false; |
235 | 234 | ||
236 | return OPimNotify::operator==( al ); | 235 | return OPimNotify::operator==( al ); |
237 | } | 236 | } |
238 | 237 | ||
239 | 238 | ||
240 | QString OPimAlarm::type() const | 239 | QString OPimAlarm::type() const |
241 | { | 240 | { |
242 | return QString::fromLatin1( "OPimAlarm" ); | 241 | return QString::fromLatin1( "OPimAlarm" ); |
243 | } | 242 | } |
244 | 243 | ||
245 | 244 | ||
246 | int OPimAlarm::sound() const | 245 | int OPimAlarm::sound() const |
247 | { | 246 | { |
248 | return data->sound; | 247 | return data->sound; |
249 | } | 248 | } |
250 | 249 | ||
251 | 250 | ||
252 | QString OPimAlarm::file() const | 251 | QString OPimAlarm::file() const |
253 | { | 252 | { |
254 | return data->file; | 253 | return data->file; |
255 | } | 254 | } |
256 | 255 | ||
257 | 256 | ||
258 | void OPimAlarm::setSound( int snd ) | 257 | void OPimAlarm::setSound( int snd ) |
259 | { | 258 | { |
260 | copyIntern(); | 259 | copyIntern(); |
261 | data->sound = snd; | 260 | data->sound = snd; |
262 | } | 261 | } |
263 | 262 | ||
264 | 263 | ||
265 | void OPimAlarm::setFile( const QString& sound ) | 264 | void OPimAlarm::setFile( const QString& sound ) |
266 | { | 265 | { |
267 | copyIntern(); | 266 | copyIntern(); |
268 | data->file = sound; | 267 | data->file = sound; |
269 | } | 268 | } |
270 | 269 | ||
271 | 270 | ||
272 | void OPimAlarm::deref() | 271 | void OPimAlarm::deref() |
273 | { | 272 | { |
274 | if ( data->deref() ) | 273 | if ( data->deref() ) |
275 | { | 274 | { |
276 | delete data; | 275 | delete data; |
277 | data = 0l; | 276 | data = 0l; |
278 | } | 277 | } |
279 | } | 278 | } |
280 | 279 | ||
281 | 280 | ||
282 | void OPimAlarm::copyIntern() | 281 | void OPimAlarm::copyIntern() |
283 | { | 282 | { |
284 | if ( data->count != 1 ) | 283 | if ( data->count != 1 ) |
285 | { | 284 | { |
286 | data->deref(); | 285 | data->deref(); |
287 | Data *newDat = new Data; | 286 | Data *newDat = new Data; |
288 | newDat->sound = data->sound; | 287 | newDat->sound = data->sound; |
289 | newDat->file = data->file; | 288 | newDat->file = data->file; |
290 | data = newDat; | 289 | data = newDat; |
291 | } | 290 | } |
292 | } | 291 | } |
293 | 292 | ||
294 | 293 | ||
295 | /************************/ | 294 | /************************/ |
296 | struct OPimReminder::Data : public QShared | 295 | struct OPimReminder::Data : public QShared |
297 | { | 296 | { |
298 | Data() : QShared(), record( 0 ) | 297 | Data() : QShared(), record( 0 ) |
299 | {} | 298 | {} |
300 | int record; | 299 | int record; |
301 | 300 | ||
302 | }; | 301 | }; |
303 | 302 | ||
304 | 303 | ||
305 | OPimReminder::OPimReminder( int uid, const QDateTime& start, int dur, int parent ) | 304 | OPimReminder::OPimReminder( int uid, const QDateTime& start, int dur, int parent ) |
306 | : OPimNotify( start, dur, parent ) | 305 | : OPimNotify( start, dur, parent ) |
307 | { | 306 | { |
308 | data = new Data; | 307 | data = new Data; |
309 | data->record = uid; | 308 | data->record = uid; |
310 | } | 309 | } |
311 | 310 | ||
312 | 311 | ||
313 | OPimReminder::OPimReminder( const OPimReminder& rem ) | 312 | OPimReminder::OPimReminder( const OPimReminder& rem ) |
314 | : OPimNotify( rem ), data( rem.data ) | 313 | : OPimNotify( rem ), data( rem.data ) |
315 | { | 314 | { |
316 | data->ref(); | 315 | data->ref(); |
317 | } | 316 | } |
318 | 317 | ||
319 | 318 | ||
320 | OPimReminder& OPimReminder::operator=( const OPimReminder& rem ) | 319 | OPimReminder& OPimReminder::operator=( const OPimReminder& rem ) |
321 | { | 320 | { |
322 | OPimNotify::operator=( rem ); | 321 | OPimNotify::operator=( rem ); |
323 | 322 | ||
324 | deref(); | 323 | deref(); |
325 | rem.data->ref(); | 324 | rem.data->ref(); |
326 | data = rem.data; | 325 | data = rem.data; |
327 | 326 | ||
328 | return *this; | 327 | return *this; |
329 | } | 328 | } |
330 | 329 | ||
331 | 330 | ||
332 | bool OPimReminder::operator==( const OPimReminder& rem ) | 331 | bool OPimReminder::operator==( const OPimReminder& rem ) |
333 | { | 332 | { |
334 | if ( data->record != rem.data->record ) return false; | 333 | if ( data->record != rem.data->record ) return false; |
335 | 334 | ||
336 | return OPimNotify::operator==( rem ); | 335 | return OPimNotify::operator==( rem ); |
337 | } | 336 | } |
338 | 337 | ||
339 | 338 | ||
340 | QString OPimReminder::type() const | 339 | QString OPimReminder::type() const |
341 | { | 340 | { |
342 | return QString::fromLatin1( "OPimReminder" ); | 341 | return QString::fromLatin1( "OPimReminder" ); |
343 | } | 342 | } |
344 | 343 | ||
345 | 344 | ||
346 | int OPimReminder::recordUid() const | 345 | int OPimReminder::recordUid() const |
347 | { | 346 | { |
348 | return data->record; | 347 | return data->record; |
349 | } | 348 | } |
350 | 349 | ||
351 | 350 | ||
352 | void OPimReminder::setRecordUid( int uid ) | 351 | void OPimReminder::setRecordUid( int uid ) |
353 | { | 352 | { |
354 | copyIntern(); | 353 | copyIntern(); |
355 | data->record = uid; | 354 | data->record = uid; |
356 | } | 355 | } |
357 | 356 | ||
358 | 357 | ||
359 | void OPimReminder::deref() | 358 | void OPimReminder::deref() |
360 | { | 359 | { |
361 | if ( data->deref() ) | 360 | if ( data->deref() ) |
362 | { | 361 | { |
363 | delete data; | 362 | delete data; |
364 | data = 0l; | 363 | data = 0l; |
365 | } | 364 | } |
366 | } | 365 | } |
367 | 366 | ||
368 | 367 | ||
369 | void OPimReminder::copyIntern() | 368 | void OPimReminder::copyIntern() |
370 | { | 369 | { |
371 | if ( data->count != 1 ) | 370 | if ( data->count != 1 ) |
372 | { | 371 | { |
373 | Data * da = new Data; | 372 | Data * da = new Data; |
374 | da->record = data->record; | 373 | da->record = data->record; |
375 | data = da; | 374 | data = da; |
376 | } | 375 | } |
377 | } | 376 | } |
378 | 377 | ||
379 | } | 378 | } |
diff --git a/libopie2/opiepim/core/opimrecord.cpp b/libopie2/opiepim/core/opimrecord.cpp index c603f44..67eed41 100644 --- a/libopie2/opiepim/core/opimrecord.cpp +++ b/libopie2/opiepim/core/opimrecord.cpp | |||
@@ -1,274 +1,273 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) The Main Author <main-author@whereever.org> | 3 | Copyright (C) The Main Author <main-author@whereever.org> |
4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> | 4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> |
5 | .=l. | 5 | .=l. |
6 | .>+-= | 6 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 7 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 8 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 11 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 12 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include "opimrecord.h" | 30 | #include "opimrecord.h" |
31 | 31 | ||
32 | /* OPIE */ | 32 | /* OPIE */ |
33 | #include <qpe/categories.h> | 33 | #include <qpe/categories.h> |
34 | #include <qpe/categoryselect.h> | 34 | #include <qpe/categoryselect.h> |
35 | 35 | ||
36 | /* QT */ | 36 | /* QT */ |
37 | #include <qarray.h> | ||
38 | 37 | ||
39 | namespace Opie | 38 | namespace Opie |
40 | { | 39 | { |
41 | Qtopia::UidGen OPimRecord::m_uidGen( Qtopia::UidGen::Qtopia ); | 40 | Qtopia::UidGen OPimRecord::m_uidGen( Qtopia::UidGen::Qtopia ); |
42 | 41 | ||
43 | 42 | ||
44 | OPimRecord::OPimRecord( int uid ) | 43 | OPimRecord::OPimRecord( int uid ) |
45 | : Qtopia::Record() | 44 | : Qtopia::Record() |
46 | { | 45 | { |
47 | 46 | ||
48 | m_lastHit = -1; | 47 | m_lastHit = -1; |
49 | setUid( uid ); | 48 | setUid( uid ); |
50 | } | 49 | } |
51 | 50 | ||
52 | 51 | ||
53 | OPimRecord::~OPimRecord() | 52 | OPimRecord::~OPimRecord() |
54 | {} | 53 | {} |
55 | 54 | ||
56 | 55 | ||
57 | OPimRecord::OPimRecord( const OPimRecord& rec ) | 56 | OPimRecord::OPimRecord( const OPimRecord& rec ) |
58 | : Qtopia::Record( rec ) | 57 | : Qtopia::Record( rec ) |
59 | { | 58 | { |
60 | ( *this ) = rec; | 59 | ( *this ) = rec; |
61 | } | 60 | } |
62 | 61 | ||
63 | 62 | ||
64 | OPimRecord &OPimRecord::operator=( const OPimRecord& rec ) | 63 | OPimRecord &OPimRecord::operator=( const OPimRecord& rec ) |
65 | { | 64 | { |
66 | if ( this == &rec ) return * this; | 65 | if ( this == &rec ) return * this; |
67 | 66 | ||
68 | Qtopia::Record::operator=( rec ); | 67 | Qtopia::Record::operator=( rec ); |
69 | m_xrefman = rec.m_xrefman; | 68 | m_xrefman = rec.m_xrefman; |
70 | m_lastHit = rec.m_lastHit; | 69 | m_lastHit = rec.m_lastHit; |
71 | 70 | ||
72 | return *this; | 71 | return *this; |
73 | } | 72 | } |
74 | 73 | ||
75 | 74 | ||
76 | /* | 75 | /* |
77 | * category names | 76 | * category names |
78 | */ | 77 | */ |
79 | QStringList OPimRecord::categoryNames( const QString& appname ) const | 78 | QStringList OPimRecord::categoryNames( const QString& appname ) const |
80 | { | 79 | { |
81 | QStringList list; | 80 | QStringList list; |
82 | QArray<int> cats = categories(); | 81 | QArray<int> cats = categories(); |
83 | Categories catDB; | 82 | Categories catDB; |
84 | catDB.load( categoryFileName() ); | 83 | catDB.load( categoryFileName() ); |
85 | 84 | ||
86 | for ( uint i = 0; i < cats.count(); i++ ) | 85 | for ( uint i = 0; i < cats.count(); i++ ) |
87 | { | 86 | { |
88 | list << catDB.label( appname, cats[ i ] ); | 87 | list << catDB.label( appname, cats[ i ] ); |
89 | } | 88 | } |
90 | 89 | ||
91 | return list; | 90 | return list; |
92 | } | 91 | } |
93 | 92 | ||
94 | 93 | ||
95 | void OPimRecord::setCategoryNames( const QStringList& ) | 94 | void OPimRecord::setCategoryNames( const QStringList& ) |
96 | { | 95 | { |
97 | } | 96 | } |
98 | 97 | ||
99 | 98 | ||
100 | void OPimRecord::addCategoryName( const QString& ) | 99 | void OPimRecord::addCategoryName( const QString& ) |
101 | { | 100 | { |
102 | Categories catDB; | 101 | Categories catDB; |
103 | catDB.load( categoryFileName() ); | 102 | catDB.load( categoryFileName() ); |
104 | 103 | ||
105 | 104 | ||
106 | } | 105 | } |
107 | 106 | ||
108 | 107 | ||
109 | bool OPimRecord::isEmpty() const | 108 | bool OPimRecord::isEmpty() const |
110 | { | 109 | { |
111 | return ( uid() == 0 ); | 110 | return ( uid() == 0 ); |
112 | } | 111 | } |
113 | 112 | ||
114 | 113 | ||
115 | /*QString OPimRecord::crossToString()const { | 114 | /*QString OPimRecord::crossToString()const { |
116 | QString str; | 115 | QString str; |
117 | QMap<QString, QArray<int> >::ConstIterator it; | 116 | QMap<QString, QArray<int> >::ConstIterator it; |
118 | for (it = m_relations.begin(); it != m_relations.end(); ++it ) { | 117 | for (it = m_relations.begin(); it != m_relations.end(); ++it ) { |
119 | QArray<int> id = it.data(); | 118 | QArray<int> id = it.data(); |
120 | for ( uint i = 0; i < id.size(); ++i ) { | 119 | for ( uint i = 0; i < id.size(); ++i ) { |
121 | str += it.key() + "," + QString::number( i ) + ";"; | 120 | str += it.key() + "," + QString::number( i ) + ";"; |
122 | } | 121 | } |
123 | } | 122 | } |
124 | str = str.remove( str.length()-1, 1); // strip the ; | 123 | str = str.remove( str.length()-1, 1); // strip the ; |
125 | //qWarning("IDS " + str ); | 124 | //qWarning("IDS " + str ); |
126 | 125 | ||
127 | return str; | 126 | return str; |
128 | }*/ | 127 | }*/ |
129 | /* if uid = 1 assign a new one */ | 128 | /* if uid = 1 assign a new one */ |
130 | void OPimRecord::setUid( int uid ) | 129 | void OPimRecord::setUid( int uid ) |
131 | { | 130 | { |
132 | if ( uid == 1 ) | 131 | if ( uid == 1 ) |
133 | uid = uidGen().generate(); | 132 | uid = uidGen().generate(); |
134 | 133 | ||
135 | Qtopia::Record::setUid( uid ); | 134 | Qtopia::Record::setUid( uid ); |
136 | }; | 135 | }; |
137 | 136 | ||
138 | 137 | ||
139 | Qtopia::UidGen &OPimRecord::uidGen() | 138 | Qtopia::UidGen &OPimRecord::uidGen() |
140 | { | 139 | { |
141 | return m_uidGen; | 140 | return m_uidGen; |
142 | } | 141 | } |
143 | 142 | ||
144 | 143 | ||
145 | OPimXRefManager &OPimRecord::xrefmanager() | 144 | OPimXRefManager &OPimRecord::xrefmanager() |
146 | { | 145 | { |
147 | return m_xrefman; | 146 | return m_xrefman; |
148 | } | 147 | } |
149 | 148 | ||
150 | 149 | ||
151 | int OPimRecord::rtti() | 150 | int OPimRecord::rtti() |
152 | { | 151 | { |
153 | return 0; | 152 | return 0; |
154 | } | 153 | } |
155 | 154 | ||
156 | /** | 155 | /** |
157 | * now let's put our data into the stream | 156 | * now let's put our data into the stream |
158 | */ | 157 | */ |
159 | /* | 158 | /* |
160 | * First read UID | 159 | * First read UID |
161 | * Categories | 160 | * Categories |
162 | * XRef | 161 | * XRef |
163 | */ | 162 | */ |
164 | bool OPimRecord::loadFromStream( QDataStream& stream ) | 163 | bool OPimRecord::loadFromStream( QDataStream& stream ) |
165 | { | 164 | { |
166 | int Int; | 165 | int Int; |
167 | uint UInt; | 166 | uint UInt; |
168 | stream >> Int; | 167 | stream >> Int; |
169 | setUid( Int ); | 168 | setUid( Int ); |
170 | 169 | ||
171 | /** Categories */ | 170 | /** Categories */ |
172 | stream >> UInt; | 171 | stream >> UInt; |
173 | QArray<int> array( UInt ); | 172 | QArray<int> array( UInt ); |
174 | for ( uint i = 0; i < UInt; i++ ) | 173 | for ( uint i = 0; i < UInt; i++ ) |
175 | { | 174 | { |
176 | stream >> array[ i ]; | 175 | stream >> array[ i ]; |
177 | } | 176 | } |
178 | setCategories( array ); | 177 | setCategories( array ); |
179 | 178 | ||
180 | /* | 179 | /* |
181 | * now we do the X-Ref stuff | 180 | * now we do the X-Ref stuff |
182 | */ | 181 | */ |
183 | OPimXRef xref; | 182 | OPimXRef xref; |
184 | stream >> UInt; | 183 | stream >> UInt; |
185 | for ( uint i = 0; i < UInt; i++ ) | 184 | for ( uint i = 0; i < UInt; i++ ) |
186 | { | 185 | { |
187 | xref.setPartner( OPimXRef::One, partner( stream ) ); | 186 | xref.setPartner( OPimXRef::One, partner( stream ) ); |
188 | xref.setPartner( OPimXRef::Two, partner( stream ) ); | 187 | xref.setPartner( OPimXRef::Two, partner( stream ) ); |
189 | m_xrefman.add( xref ); | 188 | m_xrefman.add( xref ); |
190 | } | 189 | } |
191 | 190 | ||
192 | return true; | 191 | return true; |
193 | } | 192 | } |
194 | 193 | ||
195 | 194 | ||
196 | bool OPimRecord::saveToStream( QDataStream& stream ) const | 195 | bool OPimRecord::saveToStream( QDataStream& stream ) const |
197 | { | 196 | { |
198 | /** UIDs */ | 197 | /** UIDs */ |
199 | 198 | ||
200 | stream << uid(); | 199 | stream << uid(); |
201 | 200 | ||
202 | /** Categories */ | 201 | /** Categories */ |
203 | stream << categories().count(); | 202 | stream << categories().count(); |
204 | for ( uint i = 0; i < categories().count(); i++ ) | 203 | for ( uint i = 0; i < categories().count(); i++ ) |
205 | { | 204 | { |
206 | stream << categories() [ i ]; | 205 | stream << categories() [ i ]; |
207 | } | 206 | } |
208 | 207 | ||
209 | /* | 208 | /* |
210 | * first the XRef count | 209 | * first the XRef count |
211 | * then the xrefs | 210 | * then the xrefs |
212 | */ | 211 | */ |
213 | stream << m_xrefman.list().count(); | 212 | stream << m_xrefman.list().count(); |
214 | for ( OPimXRef::ValueList::ConstIterator it = m_xrefman.list().begin(); | 213 | for ( OPimXRef::ValueList::ConstIterator it = m_xrefman.list().begin(); |
215 | it != m_xrefman.list().end(); ++it ) | 214 | it != m_xrefman.list().end(); ++it ) |
216 | { | 215 | { |
217 | flush( ( *it ).partner( OPimXRef::One ), stream ); | 216 | flush( ( *it ).partner( OPimXRef::One ), stream ); |
218 | flush( ( *it ).partner( OPimXRef::Two ), stream ); | 217 | flush( ( *it ).partner( OPimXRef::Two ), stream ); |
219 | } | 218 | } |
220 | return true; | 219 | return true; |
221 | } | 220 | } |
222 | 221 | ||
223 | 222 | ||
224 | void OPimRecord::flush( const OPimXRefPartner& par, QDataStream& str ) const | 223 | void OPimRecord::flush( const OPimXRefPartner& par, QDataStream& str ) const |
225 | { | 224 | { |
226 | str << par.service(); | 225 | str << par.service(); |
227 | str << par.uid(); | 226 | str << par.uid(); |
228 | str << par.field(); | 227 | str << par.field(); |
229 | } | 228 | } |
230 | 229 | ||
231 | 230 | ||
232 | OPimXRefPartner OPimRecord::partner( QDataStream& stream ) | 231 | OPimXRefPartner OPimRecord::partner( QDataStream& stream ) |
233 | { | 232 | { |
234 | OPimXRefPartner par; | 233 | OPimXRefPartner par; |
235 | QString str; | 234 | QString str; |
236 | int i; | 235 | int i; |
237 | 236 | ||
238 | stream >> str; | 237 | stream >> str; |
239 | par.setService( str ); | 238 | par.setService( str ); |
240 | 239 | ||
241 | stream >> i; | 240 | stream >> i; |
242 | par.setUid( i ); | 241 | par.setUid( i ); |
243 | 242 | ||
244 | stream >> i ; | 243 | stream >> i ; |
245 | par.setField( i ); | 244 | par.setField( i ); |
246 | 245 | ||
247 | return par; | 246 | return par; |
248 | } | 247 | } |
249 | 248 | ||
250 | 249 | ||
251 | void OPimRecord::setLastHitField( int lastHit ) const | 250 | void OPimRecord::setLastHitField( int lastHit ) const |
252 | { | 251 | { |
253 | m_lastHit = lastHit; | 252 | m_lastHit = lastHit; |
254 | } | 253 | } |
255 | 254 | ||
256 | 255 | ||
257 | int OPimRecord::lastHitField() const | 256 | int OPimRecord::lastHitField() const |
258 | { | 257 | { |
259 | return m_lastHit; | 258 | return m_lastHit; |
260 | } | 259 | } |
261 | 260 | ||
262 | 261 | ||
263 | QMap<QString, QString> OPimRecord::toExtraMap() const | 262 | QMap<QString, QString> OPimRecord::toExtraMap() const |
264 | { | 263 | { |
265 | return customMap; | 264 | return customMap; |
266 | } | 265 | } |
267 | 266 | ||
268 | 267 | ||
269 | void OPimRecord::setExtraMap( const QMap<QString, QString>& map ) | 268 | void OPimRecord::setExtraMap( const QMap<QString, QString>& map ) |
270 | { | 269 | { |
271 | customMap = map; | 270 | customMap = map; |
272 | } | 271 | } |
273 | 272 | ||
274 | } | 273 | } |
diff --git a/libopie2/opiepim/core/opimtodo.cpp b/libopie2/opiepim/core/opimtodo.cpp index 34df807..f246bfd 100644 --- a/libopie2/opiepim/core/opimtodo.cpp +++ b/libopie2/opiepim/core/opimtodo.cpp | |||
@@ -1,712 +1,711 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) The Main Author <main-author@whereever.org> | 3 | Copyright (C) The Main Author <main-author@whereever.org> |
4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> | 4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> |
5 | .=l. | 5 | .=l. |
6 | .>+-= | 6 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 7 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 8 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 11 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 12 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include "opimtodo.h" | 30 | #include "opimtodo.h" |
31 | 31 | ||
32 | /* OPIE */ | 32 | /* OPIE */ |
33 | #include <opie2/opimstate.h> | 33 | #include <opie2/opimstate.h> |
34 | #include <opie2/opimrecurrence.h> | 34 | #include <opie2/opimrecurrence.h> |
35 | #include <opie2/opimmaintainer.h> | 35 | #include <opie2/opimmaintainer.h> |
36 | #include <opie2/opimnotifymanager.h> | 36 | #include <opie2/opimnotifymanager.h> |
37 | #include <opie2/opimresolver.h> | 37 | #include <opie2/opimresolver.h> |
38 | #include <qpe/palmtopuidgen.h> | 38 | #include <qpe/palmtopuidgen.h> |
39 | #include <qpe/stringutil.h> | ||
40 | #include <qpe/palmtoprecord.h> | 39 | #include <qpe/palmtoprecord.h> |
41 | #include <qpe/stringutil.h> | ||
42 | #include <qpe/categories.h> | 40 | #include <qpe/categories.h> |
43 | #include <qpe/categoryselect.h> | 41 | #include <qpe/categoryselect.h> |
42 | #include <qpe/stringutil.h> | ||
44 | 43 | ||
45 | /* QT */ | 44 | /* QT */ |
46 | #include <qobject.h> | 45 | #include <qobject.h> |
47 | #include <qshared.h> | 46 | #include <qshared.h> |
48 | 47 | ||
49 | namespace Opie | 48 | namespace Opie |
50 | { | 49 | { |
51 | 50 | ||
52 | struct OPimTodo::OPimTodoData : public QShared | 51 | struct OPimTodo::OPimTodoData : public QShared |
53 | { | 52 | { |
54 | OPimTodoData() : QShared() | 53 | OPimTodoData() : QShared() |
55 | { | 54 | { |
56 | recur = 0; | 55 | recur = 0; |
57 | state = 0; | 56 | state = 0; |
58 | maintainer = 0; | 57 | maintainer = 0; |
59 | notifiers = 0; | 58 | notifiers = 0; |
60 | }; | 59 | }; |
61 | ~OPimTodoData() | 60 | ~OPimTodoData() |
62 | { | 61 | { |
63 | delete recur; | 62 | delete recur; |
64 | delete maintainer; | 63 | delete maintainer; |
65 | delete notifiers; | 64 | delete notifiers; |
66 | } | 65 | } |
67 | 66 | ||
68 | QDate date; | 67 | QDate date; |
69 | bool isCompleted: 1; | 68 | bool isCompleted: 1; |
70 | bool hasDate: 1; | 69 | bool hasDate: 1; |
71 | int priority; | 70 | int priority; |
72 | QString desc; | 71 | QString desc; |
73 | QString sum; | 72 | QString sum; |
74 | QMap<QString, QString> extra; | 73 | QMap<QString, QString> extra; |
75 | ushort prog; | 74 | ushort prog; |
76 | OPimState *state; | 75 | OPimState *state; |
77 | OPimRecurrence *recur; | 76 | OPimRecurrence *recur; |
78 | OPimMaintainer *maintainer; | 77 | OPimMaintainer *maintainer; |
79 | QDate start; | 78 | QDate start; |
80 | QDate completed; | 79 | QDate completed; |
81 | OPimNotifyManager *notifiers; | 80 | OPimNotifyManager *notifiers; |
82 | }; | 81 | }; |
83 | 82 | ||
84 | 83 | ||
85 | OPimTodo::OPimTodo( const OPimTodo &event ) | 84 | OPimTodo::OPimTodo( const OPimTodo &event ) |
86 | : OPimRecord( event ), data( event.data ) | 85 | : OPimRecord( event ), data( event.data ) |
87 | { | 86 | { |
88 | data->ref(); | 87 | data->ref(); |
89 | // qWarning("ref up"); | 88 | // qWarning("ref up"); |
90 | } | 89 | } |
91 | 90 | ||
92 | 91 | ||
93 | OPimTodo::~OPimTodo() | 92 | OPimTodo::~OPimTodo() |
94 | { | 93 | { |
95 | 94 | ||
96 | // qWarning("~OPimTodo " ); | 95 | // qWarning("~OPimTodo " ); |
97 | if ( data->deref() ) | 96 | if ( data->deref() ) |
98 | { | 97 | { |
99 | // qWarning("OPimTodo::dereffing"); | 98 | // qWarning("OPimTodo::dereffing"); |
100 | delete data; | 99 | delete data; |
101 | data = 0l; | 100 | data = 0l; |
102 | } | 101 | } |
103 | } | 102 | } |
104 | 103 | ||
105 | 104 | ||
106 | OPimTodo::OPimTodo( bool completed, int priority, | 105 | OPimTodo::OPimTodo( bool completed, int priority, |
107 | const QArray<int> &category, | 106 | const QArray<int> &category, |
108 | const QString& summary, | 107 | const QString& summary, |
109 | const QString &description, | 108 | const QString &description, |
110 | ushort progress, | 109 | ushort progress, |
111 | bool hasDate, QDate date, int uid ) | 110 | bool hasDate, QDate date, int uid ) |
112 | : OPimRecord( uid ) | 111 | : OPimRecord( uid ) |
113 | { | 112 | { |
114 | // qWarning("OPimTodoData " + summary); | 113 | // qWarning("OPimTodoData " + summary); |
115 | setCategories( category ); | 114 | setCategories( category ); |
116 | 115 | ||
117 | data = new OPimTodoData; | 116 | data = new OPimTodoData; |
118 | 117 | ||
119 | data->date = date; | 118 | data->date = date; |
120 | data->isCompleted = completed; | 119 | data->isCompleted = completed; |
121 | data->hasDate = hasDate; | 120 | data->hasDate = hasDate; |
122 | data->priority = priority; | 121 | data->priority = priority; |
123 | data->sum = summary; | 122 | data->sum = summary; |
124 | data->prog = progress; | 123 | data->prog = progress; |
125 | data->desc = Qtopia::simplifyMultiLineSpace( description ); | 124 | data->desc = Qtopia::simplifyMultiLineSpace( description ); |
126 | } | 125 | } |
127 | 126 | ||
128 | 127 | ||
129 | OPimTodo::OPimTodo( bool completed, int priority, | 128 | OPimTodo::OPimTodo( bool completed, int priority, |
130 | const QStringList &category, | 129 | const QStringList &category, |
131 | const QString& summary, | 130 | const QString& summary, |
132 | const QString &description, | 131 | const QString &description, |
133 | ushort progress, | 132 | ushort progress, |
134 | bool hasDate, QDate date, int uid ) | 133 | bool hasDate, QDate date, int uid ) |
135 | : OPimRecord( uid ) | 134 | : OPimRecord( uid ) |
136 | { | 135 | { |
137 | // qWarning("OPimTodoData" + summary); | 136 | // qWarning("OPimTodoData" + summary); |
138 | setCategories( idsFromString( category.join( ";" ) ) ); | 137 | setCategories( idsFromString( category.join( ";" ) ) ); |
139 | 138 | ||
140 | data = new OPimTodoData; | 139 | data = new OPimTodoData; |
141 | 140 | ||
142 | data->date = date; | 141 | data->date = date; |
143 | data->isCompleted = completed; | 142 | data->isCompleted = completed; |
144 | data->hasDate = hasDate; | 143 | data->hasDate = hasDate; |
145 | data->priority = priority; | 144 | data->priority = priority; |
146 | data->sum = summary; | 145 | data->sum = summary; |
147 | data->prog = progress; | 146 | data->prog = progress; |
148 | data->desc = Qtopia::simplifyMultiLineSpace( description ); | 147 | data->desc = Qtopia::simplifyMultiLineSpace( description ); |
149 | } | 148 | } |
150 | 149 | ||
151 | 150 | ||
152 | bool OPimTodo::match( const QRegExp ®Exp ) const | 151 | bool OPimTodo::match( const QRegExp ®Exp ) const |
153 | { | 152 | { |
154 | if ( QString::number( data->priority ).find( regExp ) != -1 ) | 153 | if ( QString::number( data->priority ).find( regExp ) != -1 ) |
155 | { | 154 | { |
156 | setLastHitField( Priority ); | 155 | setLastHitField( Priority ); |
157 | return true; | 156 | return true; |
158 | } | 157 | } |
159 | else if ( data->hasDate && data->date.toString().find( regExp ) != -1 ) | 158 | else if ( data->hasDate && data->date.toString().find( regExp ) != -1 ) |
160 | { | 159 | { |
161 | setLastHitField( HasDate ); | 160 | setLastHitField( HasDate ); |
162 | return true; | 161 | return true; |
163 | } | 162 | } |
164 | else if ( data->desc.find( regExp ) != -1 ) | 163 | else if ( data->desc.find( regExp ) != -1 ) |
165 | { | 164 | { |
166 | setLastHitField( Description ); | 165 | setLastHitField( Description ); |
167 | return true; | 166 | return true; |
168 | } | 167 | } |
169 | else if ( data->sum.find( regExp ) != -1 ) | 168 | else if ( data->sum.find( regExp ) != -1 ) |
170 | { | 169 | { |
171 | setLastHitField( Summary ); | 170 | setLastHitField( Summary ); |
172 | return true; | 171 | return true; |
173 | } | 172 | } |
174 | return false; | 173 | return false; |
175 | } | 174 | } |
176 | 175 | ||
177 | 176 | ||
178 | bool OPimTodo::isCompleted() const | 177 | bool OPimTodo::isCompleted() const |
179 | { | 178 | { |
180 | return data->isCompleted; | 179 | return data->isCompleted; |
181 | } | 180 | } |
182 | 181 | ||
183 | 182 | ||
184 | bool OPimTodo::hasDueDate() const | 183 | bool OPimTodo::hasDueDate() const |
185 | { | 184 | { |
186 | return data->hasDate; | 185 | return data->hasDate; |
187 | } | 186 | } |
188 | 187 | ||
189 | 188 | ||
190 | bool OPimTodo::hasStartDate() const | 189 | bool OPimTodo::hasStartDate() const |
191 | { | 190 | { |
192 | return data->start.isValid(); | 191 | return data->start.isValid(); |
193 | } | 192 | } |
194 | 193 | ||
195 | 194 | ||
196 | bool OPimTodo::hasCompletedDate() const | 195 | bool OPimTodo::hasCompletedDate() const |
197 | { | 196 | { |
198 | return data->completed.isValid(); | 197 | return data->completed.isValid(); |
199 | } | 198 | } |
200 | 199 | ||
201 | 200 | ||
202 | int OPimTodo::priority() const | 201 | int OPimTodo::priority() const |
203 | { | 202 | { |
204 | return data->priority; | 203 | return data->priority; |
205 | } | 204 | } |
206 | 205 | ||
207 | 206 | ||
208 | QString OPimTodo::summary() const | 207 | QString OPimTodo::summary() const |
209 | { | 208 | { |
210 | return data->sum; | 209 | return data->sum; |
211 | } | 210 | } |
212 | 211 | ||
213 | 212 | ||
214 | ushort OPimTodo::progress() const | 213 | ushort OPimTodo::progress() const |
215 | { | 214 | { |
216 | return data->prog; | 215 | return data->prog; |
217 | } | 216 | } |
218 | 217 | ||
219 | 218 | ||
220 | QDate OPimTodo::dueDate() const | 219 | QDate OPimTodo::dueDate() const |
221 | { | 220 | { |
222 | return data->date; | 221 | return data->date; |
223 | } | 222 | } |
224 | 223 | ||
225 | 224 | ||
226 | QDate OPimTodo::startDate() const | 225 | QDate OPimTodo::startDate() const |
227 | { | 226 | { |
228 | return data->start; | 227 | return data->start; |
229 | } | 228 | } |
230 | 229 | ||
231 | 230 | ||
232 | QDate OPimTodo::completedDate() const | 231 | QDate OPimTodo::completedDate() const |
233 | { | 232 | { |
234 | return data->completed; | 233 | return data->completed; |
235 | } | 234 | } |
236 | 235 | ||
237 | 236 | ||
238 | QString OPimTodo::description() const | 237 | QString OPimTodo::description() const |
239 | { | 238 | { |
240 | return data->desc; | 239 | return data->desc; |
241 | } | 240 | } |
242 | 241 | ||
243 | 242 | ||
244 | bool OPimTodo::hasState() const | 243 | bool OPimTodo::hasState() const |
245 | { | 244 | { |
246 | if ( !data->state ) return false; | 245 | if ( !data->state ) return false; |
247 | return ( data->state->state() != OPimState::Undefined ); | 246 | return ( data->state->state() != OPimState::Undefined ); |
248 | } | 247 | } |
249 | 248 | ||
250 | 249 | ||
251 | OPimState OPimTodo::state() const | 250 | OPimState OPimTodo::state() const |
252 | { | 251 | { |
253 | if ( !data->state ) | 252 | if ( !data->state ) |
254 | { | 253 | { |
255 | OPimState state; | 254 | OPimState state; |
256 | return state; | 255 | return state; |
257 | } | 256 | } |
258 | 257 | ||
259 | return ( *data->state ); | 258 | return ( *data->state ); |
260 | } | 259 | } |
261 | 260 | ||
262 | 261 | ||
263 | bool OPimTodo::hasRecurrence() const | 262 | bool OPimTodo::hasRecurrence() const |
264 | { | 263 | { |
265 | if ( !data->recur ) return false; | 264 | if ( !data->recur ) return false; |
266 | return data->recur->doesRecur(); | 265 | return data->recur->doesRecur(); |
267 | } | 266 | } |
268 | 267 | ||
269 | 268 | ||
270 | OPimRecurrence OPimTodo::recurrence() const | 269 | OPimRecurrence OPimTodo::recurrence() const |
271 | { | 270 | { |
272 | if ( !data->recur ) return OPimRecurrence(); | 271 | if ( !data->recur ) return OPimRecurrence(); |
273 | 272 | ||
274 | return ( *data->recur ); | 273 | return ( *data->recur ); |
275 | } | 274 | } |
276 | 275 | ||
277 | 276 | ||
278 | bool OPimTodo::hasMaintainer() const | 277 | bool OPimTodo::hasMaintainer() const |
279 | { | 278 | { |
280 | if ( !data->maintainer ) return false; | 279 | if ( !data->maintainer ) return false; |
281 | 280 | ||
282 | return ( data->maintainer->mode() != OPimMaintainer::Undefined ); | 281 | return ( data->maintainer->mode() != OPimMaintainer::Undefined ); |
283 | } | 282 | } |
284 | 283 | ||
285 | 284 | ||
286 | OPimMaintainer OPimTodo::maintainer() const | 285 | OPimMaintainer OPimTodo::maintainer() const |
287 | { | 286 | { |
288 | if ( !data->maintainer ) return OPimMaintainer(); | 287 | if ( !data->maintainer ) return OPimMaintainer(); |
289 | 288 | ||
290 | return ( *data->maintainer ); | 289 | return ( *data->maintainer ); |
291 | } | 290 | } |
292 | 291 | ||
293 | 292 | ||
294 | void OPimTodo::setCompleted( bool completed ) | 293 | void OPimTodo::setCompleted( bool completed ) |
295 | { | 294 | { |
296 | changeOrModify(); | 295 | changeOrModify(); |
297 | data->isCompleted = completed; | 296 | data->isCompleted = completed; |
298 | } | 297 | } |
299 | 298 | ||
300 | 299 | ||
301 | void OPimTodo::setHasDueDate( bool hasDate ) | 300 | void OPimTodo::setHasDueDate( bool hasDate ) |
302 | { | 301 | { |
303 | changeOrModify(); | 302 | changeOrModify(); |
304 | data->hasDate = hasDate; | 303 | data->hasDate = hasDate; |
305 | } | 304 | } |
306 | 305 | ||
307 | 306 | ||
308 | void OPimTodo::setDescription( const QString &desc ) | 307 | void OPimTodo::setDescription( const QString &desc ) |
309 | { | 308 | { |
310 | // qWarning( "desc " + desc ); | 309 | // qWarning( "desc " + desc ); |
311 | changeOrModify(); | 310 | changeOrModify(); |
312 | data->desc = Qtopia::simplifyMultiLineSpace( desc ); | 311 | data->desc = Qtopia::simplifyMultiLineSpace( desc ); |
313 | } | 312 | } |
314 | 313 | ||
315 | 314 | ||
316 | void OPimTodo::setSummary( const QString& sum ) | 315 | void OPimTodo::setSummary( const QString& sum ) |
317 | { | 316 | { |
318 | changeOrModify(); | 317 | changeOrModify(); |
319 | data->sum = sum; | 318 | data->sum = sum; |
320 | } | 319 | } |
321 | 320 | ||
322 | 321 | ||
323 | void OPimTodo::setPriority( int prio ) | 322 | void OPimTodo::setPriority( int prio ) |
324 | { | 323 | { |
325 | changeOrModify(); | 324 | changeOrModify(); |
326 | data->priority = prio; | 325 | data->priority = prio; |
327 | } | 326 | } |
328 | 327 | ||
329 | 328 | ||
330 | void OPimTodo::setDueDate( const QDate& date ) | 329 | void OPimTodo::setDueDate( const QDate& date ) |
331 | { | 330 | { |
332 | changeOrModify(); | 331 | changeOrModify(); |
333 | data->date = date; | 332 | data->date = date; |
334 | } | 333 | } |
335 | 334 | ||
336 | 335 | ||
337 | void OPimTodo::setStartDate( const QDate& date ) | 336 | void OPimTodo::setStartDate( const QDate& date ) |
338 | { | 337 | { |
339 | changeOrModify(); | 338 | changeOrModify(); |
340 | data->start = date; | 339 | data->start = date; |
341 | } | 340 | } |
342 | 341 | ||
343 | 342 | ||
344 | void OPimTodo::setCompletedDate( const QDate& date ) | 343 | void OPimTodo::setCompletedDate( const QDate& date ) |
345 | { | 344 | { |
346 | changeOrModify(); | 345 | changeOrModify(); |
347 | data->completed = date; | 346 | data->completed = date; |
348 | } | 347 | } |
349 | 348 | ||
350 | 349 | ||
351 | void OPimTodo::setState( const OPimState& state ) | 350 | void OPimTodo::setState( const OPimState& state ) |
352 | { | 351 | { |
353 | changeOrModify(); | 352 | changeOrModify(); |
354 | if ( data->state ) | 353 | if ( data->state ) |
355 | ( *data->state ) = state; | 354 | ( *data->state ) = state; |
356 | else | 355 | else |
357 | data->state = new OPimState( state ); | 356 | data->state = new OPimState( state ); |
358 | } | 357 | } |
359 | 358 | ||
360 | 359 | ||
361 | void OPimTodo::setRecurrence( const OPimRecurrence& rec ) | 360 | void OPimTodo::setRecurrence( const OPimRecurrence& rec ) |
362 | { | 361 | { |
363 | changeOrModify(); | 362 | changeOrModify(); |
364 | if ( data->recur ) | 363 | if ( data->recur ) |
365 | ( *data->recur ) = rec; | 364 | ( *data->recur ) = rec; |
366 | else | 365 | else |
367 | data->recur = new OPimRecurrence( rec ); | 366 | data->recur = new OPimRecurrence( rec ); |
368 | } | 367 | } |
369 | 368 | ||
370 | 369 | ||
371 | void OPimTodo::setMaintainer( const OPimMaintainer& pim ) | 370 | void OPimTodo::setMaintainer( const OPimMaintainer& pim ) |
372 | { | 371 | { |
373 | changeOrModify(); | 372 | changeOrModify(); |
374 | 373 | ||
375 | if ( data->maintainer ) | 374 | if ( data->maintainer ) |
376 | ( *data->maintainer ) = pim; | 375 | ( *data->maintainer ) = pim; |
377 | else | 376 | else |
378 | data->maintainer = new OPimMaintainer( pim ); | 377 | data->maintainer = new OPimMaintainer( pim ); |
379 | } | 378 | } |
380 | 379 | ||
381 | 380 | ||
382 | bool OPimTodo::isOverdue( ) | 381 | bool OPimTodo::isOverdue( ) |
383 | { | 382 | { |
384 | if ( data->hasDate && !data->isCompleted ) | 383 | if ( data->hasDate && !data->isCompleted ) |
385 | return QDate::currentDate() > data->date; | 384 | return QDate::currentDate() > data->date; |
386 | return false; | 385 | return false; |
387 | } | 386 | } |
388 | 387 | ||
389 | 388 | ||
390 | void OPimTodo::setProgress( ushort progress ) | 389 | void OPimTodo::setProgress( ushort progress ) |
391 | { | 390 | { |
392 | changeOrModify(); | 391 | changeOrModify(); |
393 | data->prog = progress; | 392 | data->prog = progress; |
394 | } | 393 | } |
395 | 394 | ||
396 | 395 | ||
397 | QString OPimTodo::toShortText() const | 396 | QString OPimTodo::toShortText() const |
398 | { | 397 | { |
399 | return summary(); | 398 | return summary(); |
400 | } | 399 | } |
401 | 400 | ||
402 | 401 | ||
403 | /*! | 402 | /*! |
404 | Returns a richt text string | 403 | Returns a richt text string |
405 | */ | 404 | */ |
406 | QString OPimTodo::toRichText() const | 405 | QString OPimTodo::toRichText() const |
407 | { | 406 | { |
408 | QString text; | 407 | QString text; |
409 | QStringList catlist; | 408 | QStringList catlist; |
410 | 409 | ||
411 | // summary | 410 | // summary |
412 | text += "<b><h3><img src=\"todo/TodoList\"> "; | 411 | text += "<b><h3><img src=\"todo/TodoList\"> "; |
413 | if ( !summary().isEmpty() ) | 412 | if ( !summary().isEmpty() ) |
414 | { | 413 | { |
415 | text += Qtopia::escapeString( summary() ).replace( QRegExp( "[\n]" ), "" ); | 414 | text += Qtopia::escapeString( summary() ).replace( QRegExp( "[\n]" ), "" ); |
416 | } | 415 | } |
417 | text += "</h3></b><br><hr><br>"; | 416 | text += "</h3></b><br><hr><br>"; |
418 | 417 | ||
419 | // description | 418 | // description |
420 | if ( !description().isEmpty() ) | 419 | if ( !description().isEmpty() ) |
421 | { | 420 | { |
422 | text += "<b>" + QObject::tr( "Description:" ) + "</b><br>"; | 421 | text += "<b>" + QObject::tr( "Description:" ) + "</b><br>"; |
423 | text += Qtopia::escapeString( description() ).replace( QRegExp( "[\n]" ), "<br>" ) + "<br>"; | 422 | text += Qtopia::escapeString( description() ).replace( QRegExp( "[\n]" ), "<br>" ) + "<br>"; |
424 | } | 423 | } |
425 | 424 | ||
426 | // priority | 425 | // priority |
427 | int priorityval = priority(); | 426 | int priorityval = priority(); |
428 | text += "<b>" + QObject::tr( "Priority:" ) + " </b><img src=\"todo/priority" + | 427 | text += "<b>" + QObject::tr( "Priority:" ) + " </b><img src=\"todo/priority" + |
429 | QString::number( priorityval ) + "\"> "; | 428 | QString::number( priorityval ) + "\"> "; |
430 | 429 | ||
431 | switch ( priorityval ) | 430 | switch ( priorityval ) |
432 | { | 431 | { |
433 | case 1 : text += QObject::tr( "Very high" ); | 432 | case 1 : text += QObject::tr( "Very high" ); |
434 | break; | 433 | break; |
435 | case 2 : text += QObject::tr( "High" ); | 434 | case 2 : text += QObject::tr( "High" ); |
436 | break; | 435 | break; |
437 | case 3 : text += QObject::tr( "Normal" ); | 436 | case 3 : text += QObject::tr( "Normal" ); |
438 | break; | 437 | break; |
439 | case 4 : text += QObject::tr( "Low" ); | 438 | case 4 : text += QObject::tr( "Low" ); |
440 | break; | 439 | break; |
441 | case 5 : text += QObject::tr( "Very low" ); | 440 | case 5 : text += QObject::tr( "Very low" ); |
442 | break; | 441 | break; |
443 | }; | 442 | }; |
444 | text += "<br>"; | 443 | text += "<br>"; |
445 | 444 | ||
446 | // progress | 445 | // progress |
447 | text += "<b>" + QObject::tr( "Progress:" ) + " </b>" | 446 | text += "<b>" + QObject::tr( "Progress:" ) + " </b>" |
448 | + QString::number( progress() ) + " %<br>"; | 447 | + QString::number( progress() ) + " %<br>"; |
449 | 448 | ||
450 | // due date | 449 | // due date |
451 | if ( hasDueDate() ) | 450 | if ( hasDueDate() ) |
452 | { | 451 | { |
453 | QDate dd = dueDate(); | 452 | QDate dd = dueDate(); |
454 | int off = QDate::currentDate().daysTo( dd ); | 453 | int off = QDate::currentDate().daysTo( dd ); |
455 | 454 | ||
456 | text += "<b>" + QObject::tr( "Deadline:" ) + " </b><font color=\""; | 455 | text += "<b>" + QObject::tr( "Deadline:" ) + " </b><font color=\""; |
457 | if ( off < 0 ) | 456 | if ( off < 0 ) |
458 | text += "#FF0000"; | 457 | text += "#FF0000"; |
459 | else if ( off == 0 ) | 458 | else if ( off == 0 ) |
460 | text += "#FFFF00"; | 459 | text += "#FFFF00"; |
461 | else if ( off > 0 ) | 460 | else if ( off > 0 ) |
462 | text += "#00FF00"; | 461 | text += "#00FF00"; |
463 | 462 | ||
464 | text += "\">" + dd.toString() + "</font><br>"; | 463 | text += "\">" + dd.toString() + "</font><br>"; |
465 | } | 464 | } |
466 | 465 | ||
467 | // categories | 466 | // categories |
468 | text += "<b>" + QObject::tr( "Category:" ) + "</b> "; | 467 | text += "<b>" + QObject::tr( "Category:" ) + "</b> "; |
469 | text += categoryNames( "Todo List" ).join( ", " ); | 468 | text += categoryNames( "Todo List" ).join( ", " ); |
470 | text += "<br>"; | 469 | text += "<br>"; |
471 | 470 | ||
472 | return text; | 471 | return text; |
473 | } | 472 | } |
474 | 473 | ||
475 | 474 | ||
476 | bool OPimTodo::hasNotifiers() const | 475 | bool OPimTodo::hasNotifiers() const |
477 | { | 476 | { |
478 | if ( !data->notifiers ) return false; | 477 | if ( !data->notifiers ) return false; |
479 | return !data->notifiers->isEmpty(); | 478 | return !data->notifiers->isEmpty(); |
480 | } | 479 | } |
481 | 480 | ||
482 | 481 | ||
483 | OPimNotifyManager& OPimTodo::notifiers() | 482 | OPimNotifyManager& OPimTodo::notifiers() |
484 | { | 483 | { |
485 | if ( !data->notifiers ) | 484 | if ( !data->notifiers ) |
486 | data->notifiers = new OPimNotifyManager; | 485 | data->notifiers = new OPimNotifyManager; |
487 | return ( *data->notifiers ); | 486 | return ( *data->notifiers ); |
488 | } | 487 | } |
489 | 488 | ||
490 | 489 | ||
491 | const OPimNotifyManager& OPimTodo::notifiers() const | 490 | const OPimNotifyManager& OPimTodo::notifiers() const |
492 | { | 491 | { |
493 | if ( !data->notifiers ) | 492 | if ( !data->notifiers ) |
494 | data->notifiers = new OPimNotifyManager; | 493 | data->notifiers = new OPimNotifyManager; |
495 | 494 | ||
496 | return ( *data->notifiers ); | 495 | return ( *data->notifiers ); |
497 | } | 496 | } |
498 | 497 | ||
499 | 498 | ||
500 | bool OPimTodo::operator<( const OPimTodo &toDoEvent ) const | 499 | bool OPimTodo::operator<( const OPimTodo &toDoEvent ) const |
501 | { | 500 | { |
502 | if ( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; | 501 | if ( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; |
503 | if ( !hasDueDate() && toDoEvent.hasDueDate() ) return false; | 502 | if ( !hasDueDate() && toDoEvent.hasDueDate() ) return false; |
504 | if ( hasDueDate() && toDoEvent.hasDueDate() ) | 503 | if ( hasDueDate() && toDoEvent.hasDueDate() ) |
505 | { | 504 | { |
506 | if ( dueDate() == toDoEvent.dueDate() ) | 505 | if ( dueDate() == toDoEvent.dueDate() ) |
507 | { // let's the priority decide | 506 | { // let's the priority decide |
508 | return priority() < toDoEvent.priority(); | 507 | return priority() < toDoEvent.priority(); |
509 | } | 508 | } |
510 | else | 509 | else |
511 | { | 510 | { |
512 | return dueDate() < toDoEvent.dueDate(); | 511 | return dueDate() < toDoEvent.dueDate(); |
513 | } | 512 | } |
514 | } | 513 | } |
515 | return false; | 514 | return false; |
516 | } | 515 | } |
517 | 516 | ||
518 | 517 | ||
519 | bool OPimTodo::operator<=( const OPimTodo &toDoEvent ) const | 518 | bool OPimTodo::operator<=( const OPimTodo &toDoEvent ) const |
520 | { | 519 | { |
521 | if ( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; | 520 | if ( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; |
522 | if ( !hasDueDate() && toDoEvent.hasDueDate() ) return true; | 521 | if ( !hasDueDate() && toDoEvent.hasDueDate() ) return true; |
523 | if ( hasDueDate() && toDoEvent.hasDueDate() ) | 522 | if ( hasDueDate() && toDoEvent.hasDueDate() ) |
524 | { | 523 | { |
525 | if ( dueDate() == toDoEvent.dueDate() ) | 524 | if ( dueDate() == toDoEvent.dueDate() ) |
526 | { // let's the priority decide | 525 | { // let's the priority decide |
527 | return priority() <= toDoEvent.priority(); | 526 | return priority() <= toDoEvent.priority(); |
528 | } | 527 | } |
529 | else | 528 | else |
530 | { | 529 | { |
531 | return dueDate() <= toDoEvent.dueDate(); | 530 | return dueDate() <= toDoEvent.dueDate(); |
532 | } | 531 | } |
533 | } | 532 | } |
534 | return true; | 533 | return true; |
535 | } | 534 | } |
536 | 535 | ||
537 | 536 | ||
538 | bool OPimTodo::operator>( const OPimTodo &toDoEvent ) const | 537 | bool OPimTodo::operator>( const OPimTodo &toDoEvent ) const |
539 | { | 538 | { |
540 | if ( !hasDueDate() && !toDoEvent.hasDueDate() ) return false; | 539 | if ( !hasDueDate() && !toDoEvent.hasDueDate() ) return false; |
541 | if ( !hasDueDate() && toDoEvent.hasDueDate() ) return false; | 540 | if ( !hasDueDate() && toDoEvent.hasDueDate() ) return false; |
542 | if ( hasDueDate() && toDoEvent.hasDueDate() ) | 541 | if ( hasDueDate() && toDoEvent.hasDueDate() ) |
543 | { | 542 | { |
544 | if ( dueDate() == toDoEvent.dueDate() ) | 543 | if ( dueDate() == toDoEvent.dueDate() ) |
545 | { // let's the priority decide | 544 | { // let's the priority decide |
546 | return priority() > toDoEvent.priority(); | 545 | return priority() > toDoEvent.priority(); |
547 | } | 546 | } |
548 | else | 547 | else |
549 | { | 548 | { |
550 | return dueDate() > toDoEvent.dueDate(); | 549 | return dueDate() > toDoEvent.dueDate(); |
551 | } | 550 | } |
552 | } | 551 | } |
553 | return false; | 552 | return false; |
554 | } | 553 | } |
555 | 554 | ||
556 | 555 | ||
557 | bool OPimTodo::operator>=( const OPimTodo &toDoEvent ) const | 556 | bool OPimTodo::operator>=( const OPimTodo &toDoEvent ) const |
558 | { | 557 | { |
559 | if ( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; | 558 | if ( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; |
560 | if ( !hasDueDate() && toDoEvent.hasDueDate() ) return false; | 559 | if ( !hasDueDate() && toDoEvent.hasDueDate() ) return false; |
561 | if ( hasDueDate() && toDoEvent.hasDueDate() ) | 560 | if ( hasDueDate() && toDoEvent.hasDueDate() ) |
562 | { | 561 | { |
563 | if ( dueDate() == toDoEvent.dueDate() ) | 562 | if ( dueDate() == toDoEvent.dueDate() ) |
564 | { // let's the priority decide | 563 | { // let's the priority decide |
565 | return priority() > toDoEvent.priority(); | 564 | return priority() > toDoEvent.priority(); |
566 | } | 565 | } |
567 | else | 566 | else |
568 | { | 567 | { |
569 | return dueDate() > toDoEvent.dueDate(); | 568 | return dueDate() > toDoEvent.dueDate(); |
570 | } | 569 | } |
571 | } | 570 | } |
572 | return true; | 571 | return true; |
573 | } | 572 | } |
574 | 573 | ||
575 | 574 | ||
576 | bool OPimTodo::operator==( const OPimTodo &toDoEvent ) const | 575 | bool OPimTodo::operator==( const OPimTodo &toDoEvent ) const |
577 | { | 576 | { |
578 | if ( data->priority != toDoEvent.data->priority ) return false; | 577 | if ( data->priority != toDoEvent.data->priority ) return false; |
579 | if ( data->priority != toDoEvent.data->prog ) return false; | 578 | if ( data->priority != toDoEvent.data->prog ) return false; |
580 | if ( data->isCompleted != toDoEvent.data->isCompleted ) return false; | 579 | if ( data->isCompleted != toDoEvent.data->isCompleted ) return false; |
581 | if ( data->hasDate != toDoEvent.data->hasDate ) return false; | 580 | if ( data->hasDate != toDoEvent.data->hasDate ) return false; |
582 | if ( data->date != toDoEvent.data->date ) return false; | 581 | if ( data->date != toDoEvent.data->date ) return false; |
583 | if ( data->sum != toDoEvent.data->sum ) return false; | 582 | if ( data->sum != toDoEvent.data->sum ) return false; |
584 | if ( data->desc != toDoEvent.data->desc ) return false; | 583 | if ( data->desc != toDoEvent.data->desc ) return false; |
585 | if ( data->maintainer != toDoEvent.data->maintainer ) | 584 | if ( data->maintainer != toDoEvent.data->maintainer ) |
586 | return false; | 585 | return false; |
587 | 586 | ||
588 | return OPimRecord::operator==( toDoEvent ); | 587 | return OPimRecord::operator==( toDoEvent ); |
589 | } | 588 | } |
590 | 589 | ||
591 | 590 | ||
592 | void OPimTodo::deref() | 591 | void OPimTodo::deref() |
593 | { | 592 | { |
594 | 593 | ||
595 | // qWarning("deref in ToDoEvent"); | 594 | // qWarning("deref in ToDoEvent"); |
596 | if ( data->deref() ) | 595 | if ( data->deref() ) |
597 | { | 596 | { |
598 | // qWarning("deleting"); | 597 | // qWarning("deleting"); |
599 | delete data; | 598 | delete data; |
600 | data = 0; | 599 | data = 0; |
601 | } | 600 | } |
602 | } | 601 | } |
603 | 602 | ||
604 | 603 | ||
605 | OPimTodo &OPimTodo::operator=( const OPimTodo &item ) | 604 | OPimTodo &OPimTodo::operator=( const OPimTodo &item ) |
606 | { | 605 | { |
607 | if ( this == &item ) return * this; | 606 | if ( this == &item ) return * this; |
608 | 607 | ||
609 | OPimRecord::operator=( item ); | 608 | OPimRecord::operator=( item ); |
610 | //qWarning("operator= ref "); | 609 | //qWarning("operator= ref "); |
611 | item.data->ref(); | 610 | item.data->ref(); |
612 | deref(); | 611 | deref(); |
613 | data = item.data; | 612 | data = item.data; |
614 | 613 | ||
615 | return *this; | 614 | return *this; |
616 | } | 615 | } |
617 | 616 | ||
618 | 617 | ||
619 | QMap<int, QString> OPimTodo::toMap() const | 618 | QMap<int, QString> OPimTodo::toMap() const |
620 | { | 619 | { |
621 | QMap<int, QString> map; | 620 | QMap<int, QString> map; |
622 | 621 | ||
623 | map.insert( Uid, QString::number( uid() ) ); | 622 | map.insert( Uid, QString::number( uid() ) ); |
624 | map.insert( Category, idsToString( categories() ) ); | 623 | map.insert( Category, idsToString( categories() ) ); |
625 | map.insert( HasDate, QString::number( data->hasDate ) ); | 624 | map.insert( HasDate, QString::number( data->hasDate ) ); |
626 | map.insert( Completed, QString::number( data->isCompleted ) ); | 625 | map.insert( Completed, QString::number( data->isCompleted ) ); |
627 | map.insert( Description, data->desc ); | 626 | map.insert( Description, data->desc ); |
628 | map.insert( Summary, data->sum ); | 627 | map.insert( Summary, data->sum ); |
629 | map.insert( Priority, QString::number( data->priority ) ); | 628 | map.insert( Priority, QString::number( data->priority ) ); |
630 | map.insert( DateDay, QString::number( data->date.day() ) ); | 629 | map.insert( DateDay, QString::number( data->date.day() ) ); |
631 | map.insert( DateMonth, QString::number( data->date.month() ) ); | 630 | map.insert( DateMonth, QString::number( data->date.month() ) ); |
632 | map.insert( DateYear, QString::number( data->date.year() ) ); | 631 | map.insert( DateYear, QString::number( data->date.year() ) ); |
633 | map.insert( Progress, QString::number( data->prog ) ); | 632 | map.insert( Progress, QString::number( data->prog ) ); |
634 | // map.insert( CrossReference, crossToString() ); | 633 | // map.insert( CrossReference, crossToString() ); |
635 | /* FIXME!!! map.insert( State, ); | 634 | /* FIXME!!! map.insert( State, ); |
636 | map.insert( Recurrence, ); | 635 | map.insert( Recurrence, ); |
637 | map.insert( Reminders, ); | 636 | map.insert( Reminders, ); |
638 | map. | 637 | map. |
639 | */ | 638 | */ |
640 | return map; | 639 | return map; |
641 | } | 640 | } |
642 | 641 | ||
643 | 642 | ||
644 | /** | 643 | /** |
645 | * change or modify looks at the ref count and either | 644 | * change or modify looks at the ref count and either |
646 | * creates a new QShared Object or it can modify it | 645 | * creates a new QShared Object or it can modify it |
647 | * right in place | 646 | * right in place |
648 | */ | 647 | */ |
649 | void OPimTodo::changeOrModify() | 648 | void OPimTodo::changeOrModify() |
650 | { | 649 | { |
651 | if ( data->count != 1 ) | 650 | if ( data->count != 1 ) |
652 | { | 651 | { |
653 | qWarning( "changeOrModify" ); | 652 | qWarning( "changeOrModify" ); |
654 | data->deref(); | 653 | data->deref(); |
655 | OPimTodoData* d2 = new OPimTodoData(); | 654 | OPimTodoData* d2 = new OPimTodoData(); |
656 | copy( data, d2 ); | 655 | copy( data, d2 ); |
657 | data = d2; | 656 | data = d2; |
658 | } | 657 | } |
659 | } | 658 | } |
660 | 659 | ||
661 | 660 | ||
662 | // WATCHOUT | 661 | // WATCHOUT |
663 | /* | 662 | /* |
664 | * if you add something to the Data struct | 663 | * if you add something to the Data struct |
665 | * be sure to copy it here | 664 | * be sure to copy it here |
666 | */ | 665 | */ |
667 | void OPimTodo::copy( OPimTodoData* src, OPimTodoData* dest ) | 666 | void OPimTodo::copy( OPimTodoData* src, OPimTodoData* dest ) |
668 | { | 667 | { |
669 | dest->date = src->date; | 668 | dest->date = src->date; |
670 | dest->isCompleted = src->isCompleted; | 669 | dest->isCompleted = src->isCompleted; |
671 | dest->hasDate = src->hasDate; | 670 | dest->hasDate = src->hasDate; |
672 | dest->priority = src->priority; | 671 | dest->priority = src->priority; |
673 | dest->desc = src->desc; | 672 | dest->desc = src->desc; |
674 | dest->sum = src->sum; | 673 | dest->sum = src->sum; |
675 | dest->extra = src->extra; | 674 | dest->extra = src->extra; |
676 | dest->prog = src->prog; | 675 | dest->prog = src->prog; |
677 | 676 | ||
678 | if ( src->state ) | 677 | if ( src->state ) |
679 | dest->state = new OPimState( *src->state ); | 678 | dest->state = new OPimState( *src->state ); |
680 | 679 | ||
681 | if ( src->recur ) | 680 | if ( src->recur ) |
682 | dest->recur = new OPimRecurrence( *src->recur ); | 681 | dest->recur = new OPimRecurrence( *src->recur ); |
683 | 682 | ||
684 | if ( src->maintainer ) | 683 | if ( src->maintainer ) |
685 | dest->maintainer = new OPimMaintainer( *src->maintainer ) | 684 | dest->maintainer = new OPimMaintainer( *src->maintainer ) |
686 | ; | 685 | ; |
687 | dest->start = src->start; | 686 | dest->start = src->start; |
688 | dest->completed = src->completed; | 687 | dest->completed = src->completed; |
689 | 688 | ||
690 | if ( src->notifiers ) | 689 | if ( src->notifiers ) |
691 | dest->notifiers = new OPimNotifyManager( *src->notifiers ); | 690 | dest->notifiers = new OPimNotifyManager( *src->notifiers ); |
692 | } | 691 | } |
693 | 692 | ||
694 | 693 | ||
695 | QString OPimTodo::type() const | 694 | QString OPimTodo::type() const |
696 | { | 695 | { |
697 | return QString::fromLatin1( "OPimTodo" ); | 696 | return QString::fromLatin1( "OPimTodo" ); |
698 | } | 697 | } |
699 | 698 | ||
700 | 699 | ||
701 | QString OPimTodo::recordField( int /*id*/ ) const | 700 | QString OPimTodo::recordField( int /*id*/ ) const |
702 | { | 701 | { |
703 | return QString::null; | 702 | return QString::null; |
704 | } | 703 | } |
705 | 704 | ||
706 | 705 | ||
707 | int OPimTodo::rtti() | 706 | int OPimTodo::rtti() |
708 | { | 707 | { |
709 | return OPimResolver::TodoList; | 708 | return OPimResolver::TodoList; |
710 | } | 709 | } |
711 | 710 | ||
712 | } | 711 | } |
diff --git a/libopie2/opieui/ofontselector.cpp b/libopie2/opieui/ofontselector.cpp index 49628c9..49ddeb6 100644 --- a/libopie2/opieui/ofontselector.cpp +++ b/libopie2/opieui/ofontselector.cpp | |||
@@ -1,429 +1,428 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) Robert Griebl <sandman@handhelds.org> | 3 | Copyright (C) Robert Griebl <sandman@handhelds.org> |
4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> | 4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> |
5 | .=l. | 5 | .=l. |
6 | .>+-= | 6 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 7 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 8 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 11 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 12 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | /* OPIE */ | 30 | /* OPIE */ |
31 | #include <opie2/ofontselector.h> | 31 | #include <opie2/ofontselector.h> |
32 | #include <qpe/fontdatabase.h> | 32 | #include <qpe/fontdatabase.h> |
33 | 33 | ||
34 | /* QT */ | 34 | /* QT */ |
35 | #include <qlayout.h> | 35 | #include <qlayout.h> |
36 | #include <qlistbox.h> | 36 | #include <qlistbox.h> |
37 | #include <qcombobox.h> | 37 | #include <qcombobox.h> |
38 | #include <qlabel.h> | 38 | #include <qlabel.h> |
39 | #include <qfont.h> | ||
40 | #include <qmultilineedit.h> | 39 | #include <qmultilineedit.h> |
41 | 40 | ||
42 | using namespace Opie; | 41 | using namespace Opie; |
43 | 42 | ||
44 | namespace Opie | 43 | namespace Opie |
45 | { | 44 | { |
46 | 45 | ||
47 | class OFontSelectorPrivate | 46 | class OFontSelectorPrivate |
48 | { | 47 | { |
49 | public: | 48 | public: |
50 | QListBox * m_font_family_list; | 49 | QListBox * m_font_family_list; |
51 | QComboBox * m_font_style_list; | 50 | QComboBox * m_font_style_list; |
52 | QComboBox * m_font_size_list; | 51 | QComboBox * m_font_size_list; |
53 | QMultiLineEdit *m_preview; | 52 | QMultiLineEdit *m_preview; |
54 | 53 | ||
55 | bool m_pointbug : 1; | 54 | bool m_pointbug : 1; |
56 | 55 | ||
57 | FontDatabase m_fdb; | 56 | FontDatabase m_fdb; |
58 | }; | 57 | }; |
59 | 58 | ||
60 | }; | 59 | }; |
61 | 60 | ||
62 | namespace | 61 | namespace |
63 | { | 62 | { |
64 | 63 | ||
65 | class FontListItem : public QListBoxText | 64 | class FontListItem : public QListBoxText |
66 | { | 65 | { |
67 | public: | 66 | public: |
68 | FontListItem ( const QString &t, const QStringList &styles, const QValueList<int> &sizes ) : QListBoxText() | 67 | FontListItem ( const QString &t, const QStringList &styles, const QValueList<int> &sizes ) : QListBoxText() |
69 | { | 68 | { |
70 | m_name = t; | 69 | m_name = t; |
71 | m_styles = styles; | 70 | m_styles = styles; |
72 | m_sizes = sizes; | 71 | m_sizes = sizes; |
73 | 72 | ||
74 | QString str = t; | 73 | QString str = t; |
75 | str [0] = str [0]. upper(); | 74 | str [0] = str [0]. upper(); |
76 | setText ( str ); | 75 | setText ( str ); |
77 | } | 76 | } |
78 | 77 | ||
79 | QString family() const | 78 | QString family() const |
80 | { | 79 | { |
81 | return m_name; | 80 | return m_name; |
82 | } | 81 | } |
83 | 82 | ||
84 | const QStringList &styles() const | 83 | const QStringList &styles() const |
85 | { | 84 | { |
86 | return m_styles; | 85 | return m_styles; |
87 | } | 86 | } |
88 | 87 | ||
89 | const QValueList<int> &sizes() const | 88 | const QValueList<int> &sizes() const |
90 | { | 89 | { |
91 | return m_sizes; | 90 | return m_sizes; |
92 | } | 91 | } |
93 | 92 | ||
94 | private: | 93 | private: |
95 | QStringList m_styles; | 94 | QStringList m_styles; |
96 | QValueList<int> m_sizes; | 95 | QValueList<int> m_sizes; |
97 | QString m_name; | 96 | QString m_name; |
98 | }; | 97 | }; |
99 | 98 | ||
100 | 99 | ||
101 | static int findItemCB( QComboBox *box, const QString &str ) | 100 | static int findItemCB( QComboBox *box, const QString &str ) |
102 | { | 101 | { |
103 | for ( int i = 0; i < box->count(); i++ ) | 102 | for ( int i = 0; i < box->count(); i++ ) |
104 | { | 103 | { |
105 | if ( box->text ( i ) == str ) | 104 | if ( box->text ( i ) == str ) |
106 | return i; | 105 | return i; |
107 | } | 106 | } |
108 | return -1; | 107 | return -1; |
109 | } | 108 | } |
110 | 109 | ||
111 | } | 110 | } |
112 | /* static same as anon. namespace */ | 111 | /* static same as anon. namespace */ |
113 | static int qt_version() | 112 | static int qt_version() |
114 | { | 113 | { |
115 | const char *qver = qVersion(); | 114 | const char *qver = qVersion(); |
116 | 115 | ||
117 | return ( qver [0] - '0' ) * 100 + ( qver [2] - '0' ) * 10 + ( qver [4] - '0' ); | 116 | return ( qver [0] - '0' ) * 100 + ( qver [2] - '0' ) * 10 + ( qver [4] - '0' ); |
118 | } | 117 | } |
119 | 118 | ||
120 | /** | 119 | /** |
121 | * Constructs the Selector object | 120 | * Constructs the Selector object |
122 | * @param withpreview If a font preview should be given | 121 | * @param withpreview If a font preview should be given |
123 | * @param parent The parent of the Font Selector | 122 | * @param parent The parent of the Font Selector |
124 | * @param name The name of the object | 123 | * @param name The name of the object |
125 | * @param fl WidgetFlags | 124 | * @param fl WidgetFlags |
126 | */ | 125 | */ |
127 | OFontSelector::OFontSelector( bool withpreview, QWidget *parent, const char *name, WFlags fl ) : QWidget ( parent, name, fl ) | 126 | OFontSelector::OFontSelector( bool withpreview, QWidget *parent, const char *name, WFlags fl ) : QWidget ( parent, name, fl ) |
128 | { | 127 | { |
129 | d = new OFontSelectorPrivate(); | 128 | d = new OFontSelectorPrivate(); |
130 | 129 | ||
131 | QGridLayout *gridLayout = new QGridLayout( this, 0, 0, 4, 4 ); | 130 | QGridLayout *gridLayout = new QGridLayout( this, 0, 0, 4, 4 ); |
132 | gridLayout->setRowStretch( 4, 10 ); | 131 | gridLayout->setRowStretch( 4, 10 ); |
133 | 132 | ||
134 | d->m_font_family_list = new QListBox( this, "FontListBox" ); | 133 | d->m_font_family_list = new QListBox( this, "FontListBox" ); |
135 | gridLayout->addMultiCellWidget( d->m_font_family_list, 0, 4, 0, 0 ); | 134 | gridLayout->addMultiCellWidget( d->m_font_family_list, 0, 4, 0, 0 ); |
136 | connect( d->m_font_family_list, SIGNAL( highlighted( int ) ), this, SLOT( fontFamilyClicked( int ) ) ); | 135 | connect( d->m_font_family_list, SIGNAL( highlighted( int ) ), this, SLOT( fontFamilyClicked( int ) ) ); |
137 | 136 | ||
138 | QLabel *label = new QLabel( tr( "Style" ), this ); | 137 | QLabel *label = new QLabel( tr( "Style" ), this ); |
139 | gridLayout->addWidget( label, 0, 1 ); | 138 | gridLayout->addWidget( label, 0, 1 ); |
140 | 139 | ||
141 | d->m_font_style_list = new QComboBox( this, "StyleListBox" ); | 140 | d->m_font_style_list = new QComboBox( this, "StyleListBox" ); |
142 | connect( d->m_font_style_list, SIGNAL( activated( int ) ), this, SLOT( fontStyleClicked( int ) ) ); | 141 | connect( d->m_font_style_list, SIGNAL( activated( int ) ), this, SLOT( fontStyleClicked( int ) ) ); |
143 | gridLayout->addWidget( d->m_font_style_list, 1, 1 ); | 142 | gridLayout->addWidget( d->m_font_style_list, 1, 1 ); |
144 | 143 | ||
145 | label = new QLabel( tr( "Size" ), this ); | 144 | label = new QLabel( tr( "Size" ), this ); |
146 | gridLayout->addWidget( label, 2, 1 ); | 145 | gridLayout->addWidget( label, 2, 1 ); |
147 | 146 | ||
148 | d->m_font_size_list = new QComboBox( this, "SizeListBox" ); | 147 | d->m_font_size_list = new QComboBox( this, "SizeListBox" ); |
149 | connect( d->m_font_size_list, SIGNAL( activated( int ) ), | 148 | connect( d->m_font_size_list, SIGNAL( activated( int ) ), |
150 | this, SLOT( fontSizeClicked( int ) ) ); | 149 | this, SLOT( fontSizeClicked( int ) ) ); |
151 | gridLayout->addWidget( d->m_font_size_list, 3, 1 ); | 150 | gridLayout->addWidget( d->m_font_size_list, 3, 1 ); |
152 | 151 | ||
153 | d->m_pointbug = ( qt_version() <= 233 ); | 152 | d->m_pointbug = ( qt_version() <= 233 ); |
154 | 153 | ||
155 | if ( withpreview ) | 154 | if ( withpreview ) |
156 | { | 155 | { |
157 | d->m_preview = new QMultiLineEdit ( this, "Preview" ); | 156 | d->m_preview = new QMultiLineEdit ( this, "Preview" ); |
158 | d->m_preview->setAlignment ( AlignCenter ); | 157 | d->m_preview->setAlignment ( AlignCenter ); |
159 | d->m_preview->setWordWrap ( QMultiLineEdit::WidgetWidth ); | 158 | d->m_preview->setWordWrap ( QMultiLineEdit::WidgetWidth ); |
160 | d->m_preview->setMargin ( 3 ); | 159 | d->m_preview->setMargin ( 3 ); |
161 | d->m_preview->setText ( tr( "The Quick Brown Fox Jumps Over The Lazy Dog" )); | 160 | d->m_preview->setText ( tr( "The Quick Brown Fox Jumps Over The Lazy Dog" )); |
162 | gridLayout->addRowSpacing ( 5, 4 ); | 161 | gridLayout->addRowSpacing ( 5, 4 ); |
163 | gridLayout->addMultiCellWidget ( d->m_preview, 6, 6, 0, 1 ); | 162 | gridLayout->addMultiCellWidget ( d->m_preview, 6, 6, 0, 1 ); |
164 | gridLayout->setRowStretch ( 6, 5 ); | 163 | gridLayout->setRowStretch ( 6, 5 ); |
165 | } | 164 | } |
166 | else | 165 | else |
167 | d->m_preview = 0; | 166 | d->m_preview = 0; |
168 | 167 | ||
169 | loadFonts ( d->m_font_family_list ); | 168 | loadFonts ( d->m_font_family_list ); |
170 | } | 169 | } |
171 | 170 | ||
172 | OFontSelector::~OFontSelector() | 171 | OFontSelector::~OFontSelector() |
173 | { | 172 | { |
174 | delete d; | 173 | delete d; |
175 | } | 174 | } |
176 | 175 | ||
177 | /** | 176 | /** |
178 | * This methods tries to set the font | 177 | * This methods tries to set the font |
179 | * @param f The wishes font | 178 | * @param f The wishes font |
180 | * @return success or failure | 179 | * @return success or failure |
181 | */ | 180 | */ |
182 | bool OFontSelector::setSelectedFont ( const QFont &f ) | 181 | bool OFontSelector::setSelectedFont ( const QFont &f ) |
183 | { | 182 | { |
184 | return setSelectedFont ( f. family(), d->m_fdb. styleString ( f ), f. pointSize(), QFont::encodingName ( f. charSet())); | 183 | return setSelectedFont ( f. family(), d->m_fdb. styleString ( f ), f. pointSize(), QFont::encodingName ( f. charSet())); |
185 | } | 184 | } |
186 | 185 | ||
187 | 186 | ||
188 | /** | 187 | /** |
189 | * This is an overloaded method @see setSelectedFont | 188 | * This is an overloaded method @see setSelectedFont |
190 | * @param familyStr The family of the font | 189 | * @param familyStr The family of the font |
191 | * @param styleStr The style of the font | 190 | * @param styleStr The style of the font |
192 | * @param sizeVal The size of font | 191 | * @param sizeVal The size of font |
193 | * @param charset The charset to be used. Will be deprecated by QT3 | 192 | * @param charset The charset to be used. Will be deprecated by QT3 |
194 | */ | 193 | */ |
195 | bool OFontSelector::setSelectedFont( const QString &familyStr, const QString &styleStr, int sizeVal, const QString & charset ) | 194 | bool OFontSelector::setSelectedFont( const QString &familyStr, const QString &styleStr, int sizeVal, const QString & charset ) |
196 | { | 195 | { |
197 | QString sizeStr = QString::number ( sizeVal ); | 196 | QString sizeStr = QString::number ( sizeVal ); |
198 | 197 | ||
199 | QListBoxItem *family = d->m_font_family_list->findItem ( familyStr ); | 198 | QListBoxItem *family = d->m_font_family_list->findItem ( familyStr ); |
200 | if ( !family ) | 199 | if ( !family ) |
201 | family = d->m_font_family_list->findItem ( "Helvetica" ); | 200 | family = d->m_font_family_list->findItem ( "Helvetica" ); |
202 | if ( !family ) | 201 | if ( !family ) |
203 | family = d->m_font_family_list->firstItem(); | 202 | family = d->m_font_family_list->firstItem(); |
204 | d->m_font_family_list->setCurrentItem ( family ); | 203 | d->m_font_family_list->setCurrentItem ( family ); |
205 | fontFamilyClicked ( d->m_font_family_list->index ( family )); | 204 | fontFamilyClicked ( d->m_font_family_list->index ( family )); |
206 | 205 | ||
207 | int style = findItemCB ( d->m_font_style_list, styleStr ); | 206 | int style = findItemCB ( d->m_font_style_list, styleStr ); |
208 | if ( style < 0 ) | 207 | if ( style < 0 ) |
209 | style = findItemCB ( d->m_font_style_list, "Regular" ); | 208 | style = findItemCB ( d->m_font_style_list, "Regular" ); |
210 | if ( style < 0 && d->m_font_style_list->count() > 0 ) | 209 | if ( style < 0 && d->m_font_style_list->count() > 0 ) |
211 | style = 0; | 210 | style = 0; |
212 | d->m_font_style_list->setCurrentItem ( style ); | 211 | d->m_font_style_list->setCurrentItem ( style ); |
213 | fontStyleClicked ( style ); | 212 | fontStyleClicked ( style ); |
214 | 213 | ||
215 | int size = findItemCB ( d->m_font_size_list, sizeStr ); | 214 | int size = findItemCB ( d->m_font_size_list, sizeStr ); |
216 | if ( size < 0 ) | 215 | if ( size < 0 ) |
217 | size = findItemCB ( d->m_font_size_list, "10" ); | 216 | size = findItemCB ( d->m_font_size_list, "10" ); |
218 | if ( size < 0 && d->m_font_size_list->count() > 0 ) | 217 | if ( size < 0 && d->m_font_size_list->count() > 0 ) |
219 | size = 0; | 218 | size = 0; |
220 | d->m_font_size_list->setCurrentItem ( size ); | 219 | d->m_font_size_list->setCurrentItem ( size ); |
221 | fontSizeClicked ( size ); | 220 | fontSizeClicked ( size ); |
222 | 221 | ||
223 | return (( family ) && ( style >= 0 ) && ( size >= 0 )); | 222 | return (( family ) && ( style >= 0 ) && ( size >= 0 )); |
224 | } | 223 | } |
225 | 224 | ||
226 | /** | 225 | /** |
227 | * This method returns the name, style and size of the currently selected | 226 | * This method returns the name, style and size of the currently selected |
228 | * font or false if no font is selected | 227 | * font or false if no font is selected |
229 | * @param family The font family will be written there | 228 | * @param family The font family will be written there |
230 | * @param style The style will be written there | 229 | * @param style The style will be written there |
231 | * @param size The size will be written there | 230 | * @param size The size will be written there |
232 | * @return success or failure | 231 | * @return success or failure |
233 | */ | 232 | */ |
234 | bool OFontSelector::selectedFont ( QString &family, QString &style, int &size ) | 233 | bool OFontSelector::selectedFont ( QString &family, QString &style, int &size ) |
235 | { | 234 | { |
236 | QString dummy; | 235 | QString dummy; |
237 | return selectedFont ( family, style, size, dummy ); | 236 | return selectedFont ( family, style, size, dummy ); |
238 | } | 237 | } |
239 | 238 | ||
240 | 239 | ||
241 | /** | 240 | /** |
242 | * This method does return the font family or QString::null if there is | 241 | * This method does return the font family or QString::null if there is |
243 | * no font item selected | 242 | * no font item selected |
244 | * @return the font family | 243 | * @return the font family |
245 | */ | 244 | */ |
246 | QString OFontSelector::fontFamily() const | 245 | QString OFontSelector::fontFamily() const |
247 | { | 246 | { |
248 | FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( d->m_font_family_list->currentItem()); | 247 | FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( d->m_font_family_list->currentItem()); |
249 | 248 | ||
250 | return fli ? fli->family() : QString::null; | 249 | return fli ? fli->family() : QString::null; |
251 | } | 250 | } |
252 | 251 | ||
253 | /** | 252 | /** |
254 | * This method will return the style of the font or QString::null | 253 | * This method will return the style of the font or QString::null |
255 | * @return the style of the font | 254 | * @return the style of the font |
256 | */ | 255 | */ |
257 | QString OFontSelector::fontStyle() const | 256 | QString OFontSelector::fontStyle() const |
258 | { | 257 | { |
259 | FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( d->m_font_family_list->currentItem()); | 258 | FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( d->m_font_family_list->currentItem()); |
260 | int fst = d->m_font_style_list->currentItem(); | 259 | int fst = d->m_font_style_list->currentItem(); |
261 | 260 | ||
262 | return ( fli && fst >= 0 ) ? fli->styles() [fst] : QString::null; | 261 | return ( fli && fst >= 0 ) ? fli->styles() [fst] : QString::null; |
263 | } | 262 | } |
264 | 263 | ||
265 | /** | 264 | /** |
266 | * This method will return the font size or 10 if no font size is available | 265 | * This method will return the font size or 10 if no font size is available |
267 | */ | 266 | */ |
268 | int OFontSelector::fontSize() const | 267 | int OFontSelector::fontSize() const |
269 | { | 268 | { |
270 | FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( d->m_font_family_list->currentItem()); | 269 | FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( d->m_font_family_list->currentItem()); |
271 | int fsi = d->m_font_size_list->currentItem(); | 270 | int fsi = d->m_font_size_list->currentItem(); |
272 | 271 | ||
273 | return ( fli && fsi >= 0 ) ? fli->sizes() [fsi] : 10; | 272 | return ( fli && fsi >= 0 ) ? fli->sizes() [fsi] : 10; |
274 | } | 273 | } |
275 | 274 | ||
276 | /** | 275 | /** |
277 | * returns the charset of the font or QString::null | 276 | * returns the charset of the font or QString::null |
278 | */ | 277 | */ |
279 | QString OFontSelector::fontCharSet() const | 278 | QString OFontSelector::fontCharSet() const |
280 | { | 279 | { |
281 | FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( d->m_font_family_list->currentItem()); | 280 | FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( d->m_font_family_list->currentItem()); |
282 | 281 | ||
283 | return fli ? d->m_fdb. charSets ( fli->family()) [0] : QString::null; | 282 | return fli ? d->m_fdb. charSets ( fli->family()) [0] : QString::null; |
284 | } | 283 | } |
285 | 284 | ||
286 | /** | 285 | /** |
287 | * Overloaded member function see above | 286 | * Overloaded member function see above |
288 | * @see selectedFont | 287 | * @see selectedFont |
289 | */ | 288 | */ |
290 | bool OFontSelector::selectedFont ( QString &family, QString &style, int &size, QString &charset ) | 289 | bool OFontSelector::selectedFont ( QString &family, QString &style, int &size, QString &charset ) |
291 | { | 290 | { |
292 | int ffa = d->m_font_family_list->currentItem(); | 291 | int ffa = d->m_font_family_list->currentItem(); |
293 | int fst = d->m_font_style_list->currentItem(); | 292 | int fst = d->m_font_style_list->currentItem(); |
294 | int fsi = d->m_font_size_list->currentItem(); | 293 | int fsi = d->m_font_size_list->currentItem(); |
295 | 294 | ||
296 | FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( ffa ); | 295 | FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( ffa ); |
297 | 296 | ||
298 | if ( fli ) | 297 | if ( fli ) |
299 | { | 298 | { |
300 | family = fli->family(); | 299 | family = fli->family(); |
301 | style = fst >= 0 ? fli->styles() [fst] : QString::null; | 300 | style = fst >= 0 ? fli->styles() [fst] : QString::null; |
302 | size = fsi >= 0 ? fli->sizes() [fsi] : 10; | 301 | size = fsi >= 0 ? fli->sizes() [fsi] : 10; |
303 | charset = d->m_fdb. charSets ( fli->family()) [0]; | 302 | charset = d->m_fdb. charSets ( fli->family()) [0]; |
304 | 303 | ||
305 | return true; | 304 | return true; |
306 | } | 305 | } |
307 | else | 306 | else |
308 | return false; | 307 | return false; |
309 | } | 308 | } |
310 | 309 | ||
311 | void OFontSelector::loadFonts ( QListBox *list ) | 310 | void OFontSelector::loadFonts ( QListBox *list ) |
312 | { | 311 | { |
313 | QStringList f = d->m_fdb. families(); | 312 | QStringList f = d->m_fdb. families(); |
314 | 313 | ||
315 | for ( QStringList::ConstIterator it = f. begin(); it != f. end(); ++it ) | 314 | for ( QStringList::ConstIterator it = f. begin(); it != f. end(); ++it ) |
316 | { | 315 | { |
317 | QValueList <int> ps = d->m_fdb. pointSizes ( *it ); | 316 | QValueList <int> ps = d->m_fdb. pointSizes ( *it ); |
318 | 317 | ||
319 | if ( d->m_pointbug ) | 318 | if ( d->m_pointbug ) |
320 | { | 319 | { |
321 | for ( QValueList <int>::Iterator it = ps. begin(); it != ps. end(); it++ ) | 320 | for ( QValueList <int>::Iterator it = ps. begin(); it != ps. end(); it++ ) |
322 | *it /= 10; | 321 | *it /= 10; |
323 | } | 322 | } |
324 | 323 | ||
325 | list->insertItem ( new FontListItem ( *it, d->m_fdb. styles ( *it ), ps )); | 324 | list->insertItem ( new FontListItem ( *it, d->m_fdb. styles ( *it ), ps )); |
326 | } | 325 | } |
327 | } | 326 | } |
328 | 327 | ||
329 | void OFontSelector::fontFamilyClicked ( int index ) | 328 | void OFontSelector::fontFamilyClicked ( int index ) |
330 | { | 329 | { |
331 | QString oldstyle = d->m_font_style_list->currentText(); | 330 | QString oldstyle = d->m_font_style_list->currentText(); |
332 | QString oldsize = d->m_font_size_list->currentText(); | 331 | QString oldsize = d->m_font_size_list->currentText(); |
333 | 332 | ||
334 | FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( index ); | 333 | FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( index ); |
335 | 334 | ||
336 | d->m_font_style_list->clear(); | 335 | d->m_font_style_list->clear(); |
337 | d->m_font_style_list->insertStringList ( fli->styles()); | 336 | d->m_font_style_list->insertStringList ( fli->styles()); |
338 | d->m_font_style_list->setEnabled ( !fli->styles(). isEmpty()); | 337 | d->m_font_style_list->setEnabled ( !fli->styles(). isEmpty()); |
339 | 338 | ||
340 | int i; | 339 | int i; |
341 | 340 | ||
342 | i = findItemCB ( d->m_font_style_list, oldstyle ); | 341 | i = findItemCB ( d->m_font_style_list, oldstyle ); |
343 | if ( i < 0 ) | 342 | if ( i < 0 ) |
344 | i = findItemCB ( d->m_font_style_list, "Regular" ); | 343 | i = findItemCB ( d->m_font_style_list, "Regular" ); |
345 | if (( i < 0 ) && ( d->m_font_style_list->count() > 0 )) | 344 | if (( i < 0 ) && ( d->m_font_style_list->count() > 0 )) |
346 | i = 0; | 345 | i = 0; |
347 | 346 | ||
348 | if ( i >= 0 ) | 347 | if ( i >= 0 ) |
349 | { | 348 | { |
350 | d->m_font_style_list->setCurrentItem ( i ); | 349 | d->m_font_style_list->setCurrentItem ( i ); |
351 | fontStyleClicked ( i ); | 350 | fontStyleClicked ( i ); |
352 | } | 351 | } |
353 | 352 | ||
354 | d->m_font_size_list->clear(); | 353 | d->m_font_size_list->clear(); |
355 | QValueList<int> sl = fli->sizes(); | 354 | QValueList<int> sl = fli->sizes(); |
356 | 355 | ||
357 | for ( QValueList<int>::Iterator it = sl. begin(); it != sl. end(); ++it ) | 356 | for ( QValueList<int>::Iterator it = sl. begin(); it != sl. end(); ++it ) |
358 | d->m_font_size_list->insertItem ( QString::number ( *it )); | 357 | d->m_font_size_list->insertItem ( QString::number ( *it )); |
359 | 358 | ||
360 | i = findItemCB ( d->m_font_size_list, oldsize ); | 359 | i = findItemCB ( d->m_font_size_list, oldsize ); |
361 | if ( i < 0 ) | 360 | if ( i < 0 ) |
362 | i = findItemCB ( d->m_font_size_list, "10" ); | 361 | i = findItemCB ( d->m_font_size_list, "10" ); |
363 | if (( i < 0 ) && ( d->m_font_size_list->count() > 0 )) | 362 | if (( i < 0 ) && ( d->m_font_size_list->count() > 0 )) |
364 | i = 0; | 363 | i = 0; |
365 | 364 | ||
366 | if ( i >= 0 ) | 365 | if ( i >= 0 ) |
367 | { | 366 | { |
368 | d->m_font_size_list->setCurrentItem ( i ); | 367 | d->m_font_size_list->setCurrentItem ( i ); |
369 | fontSizeClicked ( i ); | 368 | fontSizeClicked ( i ); |
370 | } | 369 | } |
371 | changeFont(); | 370 | changeFont(); |
372 | } | 371 | } |
373 | 372 | ||
374 | void OFontSelector::fontStyleClicked ( int /*index*/ ) | 373 | void OFontSelector::fontStyleClicked ( int /*index*/ ) |
375 | { | 374 | { |
376 | changeFont(); | 375 | changeFont(); |
377 | } | 376 | } |
378 | 377 | ||
379 | void OFontSelector::fontSizeClicked ( int /*index*/ ) | 378 | void OFontSelector::fontSizeClicked ( int /*index*/ ) |
380 | { | 379 | { |
381 | changeFont(); | 380 | changeFont(); |
382 | } | 381 | } |
383 | 382 | ||
384 | void OFontSelector::changeFont() | 383 | void OFontSelector::changeFont() |
385 | { | 384 | { |
386 | QFont f = selectedFont(); | 385 | QFont f = selectedFont(); |
387 | 386 | ||
388 | if ( d->m_preview ) | 387 | if ( d->m_preview ) |
389 | d->m_preview->setFont ( f ); | 388 | d->m_preview->setFont ( f ); |
390 | 389 | ||
391 | emit fontSelected ( f ); | 390 | emit fontSelected ( f ); |
392 | } | 391 | } |
393 | 392 | ||
394 | /** | 393 | /** |
395 | * Return the selected font | 394 | * Return the selected font |
396 | */ | 395 | */ |
397 | QFont OFontSelector::selectedFont() | 396 | QFont OFontSelector::selectedFont() |
398 | { | 397 | { |
399 | int ffa = d->m_font_family_list->currentItem(); | 398 | int ffa = d->m_font_family_list->currentItem(); |
400 | int fst = d->m_font_style_list->currentItem(); | 399 | int fst = d->m_font_style_list->currentItem(); |
401 | int fsi = d->m_font_size_list->currentItem(); | 400 | int fsi = d->m_font_size_list->currentItem(); |
402 | 401 | ||
403 | FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( ffa ); | 402 | FontListItem *fli = (FontListItem *) d->m_font_family_list->item ( ffa ); |
404 | 403 | ||
405 | if ( fli ) | 404 | if ( fli ) |
406 | { | 405 | { |
407 | return d->m_fdb. font ( fli->family(), \ | 406 | return d->m_fdb. font ( fli->family(), \ |
408 | fst >= 0 ? fli->styles() [fst] : QString::null, \ | 407 | fst >= 0 ? fli->styles() [fst] : QString::null, \ |
409 | fsi >= 0 ? fli->sizes() [fsi] : 10, \ | 408 | fsi >= 0 ? fli->sizes() [fsi] : 10, \ |
410 | d->m_fdb. charSets ( fli->family()) [0] ); | 409 | d->m_fdb. charSets ( fli->family()) [0] ); |
411 | } | 410 | } |
412 | else | 411 | else |
413 | return QFont(); | 412 | return QFont(); |
414 | } | 413 | } |
415 | 414 | ||
416 | void OFontSelector::resizeEvent ( QResizeEvent *re ) | 415 | void OFontSelector::resizeEvent ( QResizeEvent *re ) |
417 | { | 416 | { |
418 | if ( d->m_preview ) | 417 | if ( d->m_preview ) |
419 | { | 418 | { |
420 | d->m_preview->setMinimumHeight ( 1 ); | 419 | d->m_preview->setMinimumHeight ( 1 ); |
421 | d->m_preview->setMaximumHeight ( 32767 ); | 420 | d->m_preview->setMaximumHeight ( 32767 ); |
422 | } | 421 | } |
423 | 422 | ||
424 | QWidget::resizeEvent ( re ); | 423 | QWidget::resizeEvent ( re ); |
425 | 424 | ||
426 | if ( d->m_preview ) | 425 | if ( d->m_preview ) |
427 | d->m_preview->setFixedHeight ( d->m_preview->height()); | 426 | d->m_preview->setFixedHeight ( d->m_preview->height()); |
428 | 427 | ||
429 | } | 428 | } |
diff --git a/libopie2/opieui/olistview.cpp b/libopie2/opieui/olistview.cpp index 38f3fe2..84617f8 100644 --- a/libopie2/opieui/olistview.cpp +++ b/libopie2/opieui/olistview.cpp | |||
@@ -1,613 +1,610 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | =. (C) 2003 Michael 'Mickey' Lauer <mickey@Vanille.de> | 3 | =. (C) 2003 Michael 'Mickey' Lauer <mickey@Vanille.de> |
4 | .=l. | 4 | .=l. |
5 | .>+-= | 5 | .>+-= |
6 | _;:, .> :=|. This program is free software; you can | 6 | _;:, .> :=|. This program is free software; you can |
7 | .> <`_, > . <= redistribute it and/or modify it under | 7 | .> <`_, > . <= redistribute it and/or modify it under |
8 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 8 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
9 | .="- .-=="i, .._ License as published by the Free Software | 9 | .="- .-=="i, .._ License as published by the Free Software |
10 | - . .-<_> .<> Foundation; either version 2 of the License, | 10 | - . .-<_> .<> Foundation; either version 2 of the License, |
11 | ._= =} : or (at your option) any later version. | 11 | ._= =} : or (at your option) any later version. |
12 | .%`+i> _;_. | 12 | .%`+i> _;_. |
13 | .i_,=:_. -<s. This program is distributed in the hope that | 13 | .i_,=:_. -<s. This program is distributed in the hope that |
14 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 14 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
15 | : .. .:, . . . without even the implied warranty of | 15 | : .. .:, . . . without even the implied warranty of |
16 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 16 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
17 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 17 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
18 | ..}^=.= = ; Library General Public License for more | 18 | ..}^=.= = ; Library General Public License for more |
19 | ++= -. .` .: details. | 19 | ++= -. .` .: details. |
20 | : = ...= . :.=- | 20 | : = ...= . :.=- |
21 | -. .:....=;==+<; You should have received a copy of the GNU | 21 | -. .:....=;==+<; You should have received a copy of the GNU |
22 | -_. . . )=. = Library General Public License along with | 22 | -_. . . )=. = Library General Public License along with |
23 | -- :-=` this library; see the file COPYING.LIB. | 23 | -- :-=` this library; see the file COPYING.LIB. |
24 | If not, write to the Free Software Foundation, | 24 | If not, write to the Free Software Foundation, |
25 | Inc., 59 Temple Place - Suite 330, | 25 | Inc., 59 Temple Place - Suite 330, |
26 | Boston, MA 02111-1307, USA. | 26 | Boston, MA 02111-1307, USA. |
27 | 27 | ||
28 | */ | 28 | */ |
29 | 29 | ||
30 | /* QT */ | 30 | /* QT */ |
31 | 31 | ||
32 | #include <qcolor.h> | ||
33 | #include <qheader.h> | ||
34 | #include <qpainter.h> | ||
35 | #include <qpixmap.h> | 32 | #include <qpixmap.h> |
36 | 33 | ||
37 | /* OPIE */ | 34 | /* OPIE */ |
38 | 35 | ||
39 | #include <opie2/odebug.h> | 36 | #include <opie2/odebug.h> |
40 | #include <opie2/olistview.h> | 37 | #include <opie2/olistview.h> |
41 | 38 | ||
42 | /*====================================================================================== | 39 | /*====================================================================================== |
43 | * OListView | 40 | * OListView |
44 | *======================================================================================*/ | 41 | *======================================================================================*/ |
45 | 42 | ||
46 | OListView::OListView( QWidget *parent, const char *name ) | 43 | OListView::OListView( QWidget *parent, const char *name ) |
47 | :QListView( parent, name ) | 44 | :QListView( parent, name ) |
48 | { | 45 | { |
49 | //FIXME: get from global settings and calculate ==> see oglobalsettings.* | 46 | //FIXME: get from global settings and calculate ==> see oglobalsettings.* |
50 | 47 | ||
51 | m_alternateBackground = QColor( 238, 246, 255 ); | 48 | m_alternateBackground = QColor( 238, 246, 255 ); |
52 | m_columnSeparator = QPen( QColor( 150, 160, 170 ), 0, DotLine ); | 49 | m_columnSeparator = QPen( QColor( 150, 160, 170 ), 0, DotLine ); |
53 | m_fullWidth = true; | 50 | m_fullWidth = true; |
54 | connect( this, SIGNAL(expanded(QListViewItem*)), SLOT(expand(QListViewItem*))); | 51 | connect( this, SIGNAL(expanded(QListViewItem*)), SLOT(expand(QListViewItem*))); |
55 | } | 52 | } |
56 | 53 | ||
57 | OListView::~OListView() | 54 | OListView::~OListView() |
58 | { | 55 | { |
59 | } | 56 | } |
60 | 57 | ||
61 | void OListView::setFullWidth( bool fullWidth ) | 58 | void OListView::setFullWidth( bool fullWidth ) |
62 | { | 59 | { |
63 | m_fullWidth = m_fullWidth; | 60 | m_fullWidth = m_fullWidth; |
64 | #if QT_VERSION > 290 | 61 | #if QT_VERSION > 290 |
65 | header()->setStretchEnabled( fullWidth, columns()-1 ); | 62 | header()->setStretchEnabled( fullWidth, columns()-1 ); |
66 | #endif | 63 | #endif |
67 | } | 64 | } |
68 | 65 | ||
69 | bool OListView::fullWidth() const | 66 | bool OListView::fullWidth() const |
70 | { | 67 | { |
71 | return m_fullWidth; | 68 | return m_fullWidth; |
72 | } | 69 | } |
73 | 70 | ||
74 | int OListView::addColumn( const QString& label, int width ) | 71 | int OListView::addColumn( const QString& label, int width ) |
75 | { | 72 | { |
76 | int result = QListView::addColumn( label, width ); | 73 | int result = QListView::addColumn( label, width ); |
77 | #if QT_VERSION > 290 | 74 | #if QT_VERSION > 290 |
78 | if (m_fullWidth) { | 75 | if (m_fullWidth) { |
79 | header()->setStretchEnabled( false, columns()-2 ); | 76 | header()->setStretchEnabled( false, columns()-2 ); |
80 | header()->setStretchEnabled( true, columns()-1 ); | 77 | header()->setStretchEnabled( true, columns()-1 ); |
81 | } | 78 | } |
82 | #endif | 79 | #endif |
83 | return result; | 80 | return result; |
84 | } | 81 | } |
85 | 82 | ||
86 | int OListView::addColumn( const QIconSet& iconset, const QString& label, int width ) | 83 | int OListView::addColumn( const QIconSet& iconset, const QString& label, int width ) |
87 | { | 84 | { |
88 | int result = QListView::addColumn( iconset, label, width ); | 85 | int result = QListView::addColumn( iconset, label, width ); |
89 | #if QT_VERSION > 290 | 86 | #if QT_VERSION > 290 |
90 | if (m_fullWidth) { | 87 | if (m_fullWidth) { |
91 | header()->setStretchEnabled( false, columns()-2 ); | 88 | header()->setStretchEnabled( false, columns()-2 ); |
92 | header()->setStretchEnabled( true, columns()-1 ); | 89 | header()->setStretchEnabled( true, columns()-1 ); |
93 | } | 90 | } |
94 | #endif | 91 | #endif |
95 | return result; | 92 | return result; |
96 | } | 93 | } |
97 | 94 | ||
98 | void OListView::removeColumn( int index ) | 95 | void OListView::removeColumn( int index ) |
99 | { | 96 | { |
100 | QListView::removeColumn(index); | 97 | QListView::removeColumn(index); |
101 | #if QT_VERSION > 290 | 98 | #if QT_VERSION > 290 |
102 | if ( m_fullWidth && index == columns() ) | 99 | if ( m_fullWidth && index == columns() ) |
103 | { | 100 | { |
104 | header()->setStretchEnabled( true, columns()-1 ); | 101 | header()->setStretchEnabled( true, columns()-1 ); |
105 | } | 102 | } |
106 | #endif | 103 | #endif |
107 | } | 104 | } |
108 | 105 | ||
109 | const QColor& OListView::alternateBackground() const | 106 | const QColor& OListView::alternateBackground() const |
110 | { | 107 | { |
111 | return m_alternateBackground; | 108 | return m_alternateBackground; |
112 | } | 109 | } |
113 | 110 | ||
114 | void OListView::setAlternateBackground( const QColor &c ) | 111 | void OListView::setAlternateBackground( const QColor &c ) |
115 | { | 112 | { |
116 | m_alternateBackground = c; | 113 | m_alternateBackground = c; |
117 | repaint(); | 114 | repaint(); |
118 | } | 115 | } |
119 | 116 | ||
120 | const QPen& OListView::columnSeparator() const | 117 | const QPen& OListView::columnSeparator() const |
121 | { | 118 | { |
122 | return m_columnSeparator; | 119 | return m_columnSeparator; |
123 | } | 120 | } |
124 | 121 | ||
125 | void OListView::setColumnSeparator( const QPen& p ) | 122 | void OListView::setColumnSeparator( const QPen& p ) |
126 | { | 123 | { |
127 | m_columnSeparator = p; | 124 | m_columnSeparator = p; |
128 | repaint(); | 125 | repaint(); |
129 | } | 126 | } |
130 | 127 | ||
131 | void OListView::expand(QListViewItem *item) | 128 | void OListView::expand(QListViewItem *item) |
132 | { | 129 | { |
133 | ((OListViewItem*)item)->expand(); | 130 | ((OListViewItem*)item)->expand(); |
134 | } | 131 | } |
135 | 132 | ||
136 | OListViewItem* OListView::childFactory() | 133 | OListViewItem* OListView::childFactory() |
137 | { | 134 | { |
138 | return new OListViewItem( this ); | 135 | return new OListViewItem( this ); |
139 | } | 136 | } |
140 | 137 | ||
141 | #ifndef QT_NO_DATASTREAM | 138 | #ifndef QT_NO_DATASTREAM |
142 | void OListView::serializeTo( QDataStream& s ) const | 139 | void OListView::serializeTo( QDataStream& s ) const |
143 | { | 140 | { |
144 | #warning Caution... the binary format is still under construction... | 141 | #warning Caution... the binary format is still under construction... |
145 | odebug << "storing OListView..." << oendl; | 142 | odebug << "storing OListView..." << oendl; |
146 | 143 | ||
147 | // store number of columns and the labels | 144 | // store number of columns and the labels |
148 | s << columns(); | 145 | s << columns(); |
149 | for ( int i = 0; i < columns(); ++i ) | 146 | for ( int i = 0; i < columns(); ++i ) |
150 | s << columnText( i ); | 147 | s << columnText( i ); |
151 | 148 | ||
152 | // calculate the number of top-level items to serialize | 149 | // calculate the number of top-level items to serialize |
153 | int items = 0; | 150 | int items = 0; |
154 | QListViewItem* item = firstChild(); | 151 | QListViewItem* item = firstChild(); |
155 | while ( item ) | 152 | while ( item ) |
156 | { | 153 | { |
157 | item = item->nextSibling(); | 154 | item = item->nextSibling(); |
158 | items++; | 155 | items++; |
159 | } | 156 | } |
160 | 157 | ||
161 | // store number of items and the items itself | 158 | // store number of items and the items itself |
162 | s << items; | 159 | s << items; |
163 | item = firstChild(); | 160 | item = firstChild(); |
164 | for ( int i = 0; i < items; ++i ) | 161 | for ( int i = 0; i < items; ++i ) |
165 | { | 162 | { |
166 | s << *static_cast<OListViewItem*>( item ); | 163 | s << *static_cast<OListViewItem*>( item ); |
167 | item = item->nextSibling(); | 164 | item = item->nextSibling(); |
168 | } | 165 | } |
169 | 166 | ||
170 | odebug << "OListview stored." << oendl; | 167 | odebug << "OListview stored." << oendl; |
171 | } | 168 | } |
172 | 169 | ||
173 | void OListView::serializeFrom( QDataStream& s ) | 170 | void OListView::serializeFrom( QDataStream& s ) |
174 | { | 171 | { |
175 | #warning Caution... the binary format is still under construction... | 172 | #warning Caution... the binary format is still under construction... |
176 | odebug << "loading OListView..." << oendl; | 173 | odebug << "loading OListView..." << oendl; |
177 | 174 | ||
178 | int cols; | 175 | int cols; |
179 | s >> cols; | 176 | s >> cols; |
180 | qDebug( "read number of columns = %d", cols ); | 177 | qDebug( "read number of columns = %d", cols ); |
181 | 178 | ||
182 | while ( columns() < cols ) addColumn( QString::null ); | 179 | while ( columns() < cols ) addColumn( QString::null ); |
183 | 180 | ||
184 | for ( int i = 0; i < cols; ++i ) | 181 | for ( int i = 0; i < cols; ++i ) |
185 | { | 182 | { |
186 | QString coltext; | 183 | QString coltext; |
187 | s >> coltext; | 184 | s >> coltext; |
188 | qDebug( "read text '%s' for column %d", (const char*) coltext, i ); | 185 | qDebug( "read text '%s' for column %d", (const char*) coltext, i ); |
189 | setColumnText( i, coltext ); | 186 | setColumnText( i, coltext ); |
190 | } | 187 | } |
191 | 188 | ||
192 | int items; | 189 | int items; |
193 | s >> items; | 190 | s >> items; |
194 | qDebug( "read number of items = %d", items ); | 191 | qDebug( "read number of items = %d", items ); |
195 | 192 | ||
196 | for ( int i = 0; i < items; ++i ) | 193 | for ( int i = 0; i < items; ++i ) |
197 | { | 194 | { |
198 | OListViewItem* item = childFactory(); | 195 | OListViewItem* item = childFactory(); |
199 | s >> *item; | 196 | s >> *item; |
200 | } | 197 | } |
201 | 198 | ||
202 | odebug << "OListView loaded." << oendl; | 199 | odebug << "OListView loaded." << oendl; |
203 | 200 | ||
204 | } | 201 | } |
205 | 202 | ||
206 | QDataStream& operator<<( QDataStream& s, const OListView& lv ) | 203 | QDataStream& operator<<( QDataStream& s, const OListView& lv ) |
207 | { | 204 | { |
208 | lv.serializeTo( s ); | 205 | lv.serializeTo( s ); |
209 | } | 206 | } |
210 | 207 | ||
211 | QDataStream& operator>>( QDataStream& s, OListView& lv ) | 208 | QDataStream& operator>>( QDataStream& s, OListView& lv ) |
212 | { | 209 | { |
213 | lv.serializeFrom( s ); | 210 | lv.serializeFrom( s ); |
214 | } | 211 | } |
215 | #endif // QT_NO_DATASTREAM | 212 | #endif // QT_NO_DATASTREAM |
216 | 213 | ||
217 | /*====================================================================================== | 214 | /*====================================================================================== |
218 | * OListViewItem | 215 | * OListViewItem |
219 | *======================================================================================*/ | 216 | *======================================================================================*/ |
220 | 217 | ||
221 | OListViewItem::OListViewItem(QListView *parent) | 218 | OListViewItem::OListViewItem(QListView *parent) |
222 | : QListViewItem(parent) | 219 | : QListViewItem(parent) |
223 | { | 220 | { |
224 | init(); | 221 | init(); |
225 | } | 222 | } |
226 | 223 | ||
227 | 224 | ||
228 | OListViewItem::OListViewItem(QListViewItem *parent) | 225 | OListViewItem::OListViewItem(QListViewItem *parent) |
229 | : QListViewItem(parent) | 226 | : QListViewItem(parent) |
230 | { | 227 | { |
231 | init(); | 228 | init(); |
232 | } | 229 | } |
233 | 230 | ||
234 | 231 | ||
235 | OListViewItem::OListViewItem(QListView *parent, QListViewItem *after) | 232 | OListViewItem::OListViewItem(QListView *parent, QListViewItem *after) |
236 | : QListViewItem(parent, after) | 233 | : QListViewItem(parent, after) |
237 | { | 234 | { |
238 | init(); | 235 | init(); |
239 | } | 236 | } |
240 | 237 | ||
241 | 238 | ||
242 | OListViewItem::OListViewItem(QListViewItem *parent, QListViewItem *after) | 239 | OListViewItem::OListViewItem(QListViewItem *parent, QListViewItem *after) |
243 | : QListViewItem(parent, after) | 240 | : QListViewItem(parent, after) |
244 | { | 241 | { |
245 | init(); | 242 | init(); |
246 | } | 243 | } |
247 | 244 | ||
248 | 245 | ||
249 | OListViewItem::OListViewItem(QListView *parent, | 246 | OListViewItem::OListViewItem(QListView *parent, |
250 | QString label1, QString label2, QString label3, QString label4, | 247 | QString label1, QString label2, QString label3, QString label4, |
251 | QString label5, QString label6, QString label7, QString label8) | 248 | QString label5, QString label6, QString label7, QString label8) |
252 | : QListViewItem(parent, label1, label2, label3, label4, label5, label6, label7, label8) | 249 | : QListViewItem(parent, label1, label2, label3, label4, label5, label6, label7, label8) |
253 | { | 250 | { |
254 | init(); | 251 | init(); |
255 | } | 252 | } |
256 | 253 | ||
257 | 254 | ||
258 | OListViewItem::OListViewItem(QListViewItem *parent, | 255 | OListViewItem::OListViewItem(QListViewItem *parent, |
259 | QString label1, QString label2, QString label3, QString label4, | 256 | QString label1, QString label2, QString label3, QString label4, |
260 | QString label5, QString label6, QString label7, QString label8) | 257 | QString label5, QString label6, QString label7, QString label8) |
261 | : QListViewItem(parent, label1, label2, label3, label4, label5, label6, label7, label8) | 258 | : QListViewItem(parent, label1, label2, label3, label4, label5, label6, label7, label8) |
262 | { | 259 | { |
263 | init(); | 260 | init(); |
264 | } | 261 | } |
265 | 262 | ||
266 | 263 | ||
267 | OListViewItem::OListViewItem(QListView *parent, QListViewItem *after, | 264 | OListViewItem::OListViewItem(QListView *parent, QListViewItem *after, |
268 | QString label1, QString label2, QString label3, QString label4, | 265 | QString label1, QString label2, QString label3, QString label4, |
269 | QString label5, QString label6, QString label7, QString label8) | 266 | QString label5, QString label6, QString label7, QString label8) |
270 | : QListViewItem(parent, after, label1, label2, label3, label4, label5, label6, label7, label8) | 267 | : QListViewItem(parent, after, label1, label2, label3, label4, label5, label6, label7, label8) |
271 | { | 268 | { |
272 | init(); | 269 | init(); |
273 | } | 270 | } |
274 | 271 | ||
275 | 272 | ||
276 | OListViewItem::OListViewItem(QListViewItem *parent, QListViewItem *after, | 273 | OListViewItem::OListViewItem(QListViewItem *parent, QListViewItem *after, |
277 | QString label1, QString label2, QString label3, QString label4, | 274 | QString label1, QString label2, QString label3, QString label4, |
278 | QString label5, QString label6, QString label7, QString label8) | 275 | QString label5, QString label6, QString label7, QString label8) |
279 | : QListViewItem(parent, after, label1, label2, label3, label4, label5, label6, label7, label8) | 276 | : QListViewItem(parent, after, label1, label2, label3, label4, label5, label6, label7, label8) |
280 | { | 277 | { |
281 | init(); | 278 | init(); |
282 | } | 279 | } |
283 | 280 | ||
284 | 281 | ||
285 | OListViewItem::~OListViewItem() | 282 | OListViewItem::~OListViewItem() |
286 | { | 283 | { |
287 | } | 284 | } |
288 | 285 | ||
289 | 286 | ||
290 | void OListViewItem::init() | 287 | void OListViewItem::init() |
291 | { | 288 | { |
292 | m_known = false; | 289 | m_known = false; |
293 | } | 290 | } |
294 | 291 | ||
295 | 292 | ||
296 | const QColor &OListViewItem::backgroundColor() | 293 | const QColor &OListViewItem::backgroundColor() |
297 | { | 294 | { |
298 | return isAlternate() ? static_cast<OListView*>(listView())->alternateBackground() : | 295 | return isAlternate() ? static_cast<OListView*>(listView())->alternateBackground() : |
299 | listView()->viewport()->colorGroup().base(); | 296 | listView()->viewport()->colorGroup().base(); |
300 | } | 297 | } |
301 | 298 | ||
302 | 299 | ||
303 | bool OListViewItem::isAlternate() | 300 | bool OListViewItem::isAlternate() |
304 | { | 301 | { |
305 | OListView *lv = static_cast<OListView*>( listView() ); | 302 | OListView *lv = static_cast<OListView*>( listView() ); |
306 | 303 | ||
307 | // check if the item above is an OListViewItem | 304 | // check if the item above is an OListViewItem |
308 | OListViewItem *above = static_cast<OListViewItem*>( itemAbove() ); | 305 | OListViewItem *above = static_cast<OListViewItem*>( itemAbove() ); |
309 | /*if (! itemAbove()->inherits( "OListViewItem" )) return false;*/ | 306 | /*if (! itemAbove()->inherits( "OListViewItem" )) return false;*/ |
310 | 307 | ||
311 | // check if we have a valid alternate background color | 308 | // check if we have a valid alternate background color |
312 | if (!(lv && lv->alternateBackground().isValid())) return false; | 309 | if (!(lv && lv->alternateBackground().isValid())) return false; |
313 | 310 | ||
314 | m_known = above ? above->m_known : true; | 311 | m_known = above ? above->m_known : true; |
315 | if (m_known) | 312 | if (m_known) |
316 | { | 313 | { |
317 | m_odd = above ? !above->m_odd : false; | 314 | m_odd = above ? !above->m_odd : false; |
318 | } | 315 | } |
319 | else | 316 | else |
320 | { | 317 | { |
321 | OListViewItem *item; | 318 | OListViewItem *item; |
322 | bool previous = true; | 319 | bool previous = true; |
323 | if (parent()) | 320 | if (parent()) |
324 | { | 321 | { |
325 | item = static_cast<OListViewItem *>(parent()); | 322 | item = static_cast<OListViewItem *>(parent()); |
326 | if ( item /*&& item->inherits( "OListViewItem" )*/ ) previous = item->m_odd; | 323 | if ( item /*&& item->inherits( "OListViewItem" )*/ ) previous = item->m_odd; |
327 | item = static_cast<OListViewItem *>(parent()->firstChild()); | 324 | item = static_cast<OListViewItem *>(parent()->firstChild()); |
328 | /* if ( !item.inherits( "OListViewItem" ) item = 0; */ | 325 | /* if ( !item.inherits( "OListViewItem" ) item = 0; */ |
329 | } | 326 | } |
330 | else | 327 | else |
331 | { | 328 | { |
332 | item = static_cast<OListViewItem *>(lv->firstChild()); | 329 | item = static_cast<OListViewItem *>(lv->firstChild()); |
333 | } | 330 | } |
334 | 331 | ||
335 | while(item) | 332 | while(item) |
336 | { | 333 | { |
337 | item->m_odd = previous = !previous; | 334 | item->m_odd = previous = !previous; |
338 | item->m_known = true; | 335 | item->m_known = true; |
339 | item = static_cast<OListViewItem *>(item->nextSibling()); | 336 | item = static_cast<OListViewItem *>(item->nextSibling()); |
340 | /* if (!item.inherits( "OListViewItem" ) ) break; */ | 337 | /* if (!item.inherits( "OListViewItem" ) ) break; */ |
341 | } | 338 | } |
342 | } | 339 | } |
343 | return m_odd; | 340 | return m_odd; |
344 | } | 341 | } |
345 | 342 | ||
346 | 343 | ||
347 | void OListViewItem::paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int alignment) | 344 | void OListViewItem::paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int alignment) |
348 | { | 345 | { |
349 | QColorGroup _cg = cg; | 346 | QColorGroup _cg = cg; |
350 | const QPixmap *pm = listView()->viewport()->backgroundPixmap(); | 347 | const QPixmap *pm = listView()->viewport()->backgroundPixmap(); |
351 | if (pm && !pm->isNull()) | 348 | if (pm && !pm->isNull()) |
352 | { | 349 | { |
353 | _cg.setBrush( QColorGroup::Base, QBrush(backgroundColor(), *pm) ); | 350 | _cg.setBrush( QColorGroup::Base, QBrush(backgroundColor(), *pm) ); |
354 | p->setBrushOrigin( -listView()->contentsX(), -listView()->contentsY() ); | 351 | p->setBrushOrigin( -listView()->contentsX(), -listView()->contentsY() ); |
355 | } | 352 | } |
356 | else if ( isAlternate() ) | 353 | else if ( isAlternate() ) |
357 | { | 354 | { |
358 | _cg.setColor( QColorGroup::Base, static_cast<OListView*>( listView() )->alternateBackground() ); | 355 | _cg.setColor( QColorGroup::Base, static_cast<OListView*>( listView() )->alternateBackground() ); |
359 | } | 356 | } |
360 | QListViewItem::paintCell( p, _cg, column, width, alignment ); | 357 | QListViewItem::paintCell( p, _cg, column, width, alignment ); |
361 | 358 | ||
362 | //FIXME: Use styling here! | 359 | //FIXME: Use styling here! |
363 | 360 | ||
364 | const QPen& pen = static_cast<OListView*>( listView() )->columnSeparator(); | 361 | const QPen& pen = static_cast<OListView*>( listView() )->columnSeparator(); |
365 | p->setPen( pen ); | 362 | p->setPen( pen ); |
366 | p->drawLine( width-1, 0, width-1, height() ); | 363 | p->drawLine( width-1, 0, width-1, height() ); |
367 | } | 364 | } |
368 | 365 | ||
369 | 366 | ||
370 | OListViewItem* OListViewItem::childFactory() | 367 | OListViewItem* OListViewItem::childFactory() |
371 | { | 368 | { |
372 | return new OListViewItem( this ); | 369 | return new OListViewItem( this ); |
373 | } | 370 | } |
374 | 371 | ||
375 | 372 | ||
376 | #ifndef QT_NO_DATASTREAM | 373 | #ifndef QT_NO_DATASTREAM |
377 | void OListViewItem::serializeTo( QDataStream& s ) const | 374 | void OListViewItem::serializeTo( QDataStream& s ) const |
378 | { | 375 | { |
379 | #warning Caution... the binary format is still under construction... | 376 | #warning Caution... the binary format is still under construction... |
380 | odebug << "storing OListViewItem..." << oendl; | 377 | odebug << "storing OListViewItem..." << oendl; |
381 | 378 | ||
382 | // store item text | 379 | // store item text |
383 | for ( int i = 0; i < listView()->columns(); ++i ) | 380 | for ( int i = 0; i < listView()->columns(); ++i ) |
384 | { | 381 | { |
385 | s << text( i ); | 382 | s << text( i ); |
386 | } | 383 | } |
387 | 384 | ||
388 | // calculate the number of children to serialize | 385 | // calculate the number of children to serialize |
389 | int items = 0; | 386 | int items = 0; |
390 | QListViewItem* item = firstChild(); | 387 | QListViewItem* item = firstChild(); |
391 | while ( item ) | 388 | while ( item ) |
392 | { | 389 | { |
393 | item = item->nextSibling(); | 390 | item = item->nextSibling(); |
394 | items++; | 391 | items++; |
395 | } | 392 | } |
396 | 393 | ||
397 | // store number of items and the items itself | 394 | // store number of items and the items itself |
398 | s << items; | 395 | s << items; |
399 | item = firstChild(); | 396 | item = firstChild(); |
400 | for ( int i = 0; i < items; ++i ) | 397 | for ( int i = 0; i < items; ++i ) |
401 | { | 398 | { |
402 | s << *static_cast<OListViewItem*>( item ); | 399 | s << *static_cast<OListViewItem*>( item ); |
403 | item = item->nextSibling(); | 400 | item = item->nextSibling(); |
404 | } | 401 | } |
405 | 402 | ||
406 | odebug << "OListviewItem stored." << oendl; | 403 | odebug << "OListviewItem stored." << oendl; |
407 | } | 404 | } |
408 | 405 | ||
409 | 406 | ||
410 | void OListViewItem::serializeFrom( QDataStream& s ) | 407 | void OListViewItem::serializeFrom( QDataStream& s ) |
411 | { | 408 | { |
412 | #warning Caution... the binary format is still under construction... | 409 | #warning Caution... the binary format is still under construction... |
413 | odebug << "loading OListViewItem..." << oendl; | 410 | odebug << "loading OListViewItem..." << oendl; |
414 | 411 | ||
415 | for ( int i = 0; i < listView()->columns(); ++i ) | 412 | for ( int i = 0; i < listView()->columns(); ++i ) |
416 | { | 413 | { |
417 | QString coltext; | 414 | QString coltext; |
418 | s >> coltext; | 415 | s >> coltext; |
419 | qDebug( "read text '%s' for column %d", (const char*) coltext, i ); | 416 | qDebug( "read text '%s' for column %d", (const char*) coltext, i ); |
420 | setText( i, coltext ); | 417 | setText( i, coltext ); |
421 | } | 418 | } |
422 | 419 | ||
423 | int items; | 420 | int items; |
424 | s >> items; | 421 | s >> items; |
425 | qDebug( "read number of items = %d", items ); | 422 | qDebug( "read number of items = %d", items ); |
426 | 423 | ||
427 | for ( int i = 0; i < items; ++i ) | 424 | for ( int i = 0; i < items; ++i ) |
428 | { | 425 | { |
429 | OListViewItem* item = childFactory(); | 426 | OListViewItem* item = childFactory(); |
430 | s >> (*item); | 427 | s >> (*item); |
431 | } | 428 | } |
432 | 429 | ||
433 | odebug << "OListViewItem loaded." << oendl; | 430 | odebug << "OListViewItem loaded." << oendl; |
434 | } | 431 | } |
435 | 432 | ||
436 | 433 | ||
437 | QDataStream& operator<<( QDataStream& s, const OListViewItem& lvi ) | 434 | QDataStream& operator<<( QDataStream& s, const OListViewItem& lvi ) |
438 | { | 435 | { |
439 | lvi.serializeTo( s ); | 436 | lvi.serializeTo( s ); |
440 | } | 437 | } |
441 | 438 | ||
442 | 439 | ||
443 | QDataStream& operator>>( QDataStream& s, OListViewItem& lvi ) | 440 | QDataStream& operator>>( QDataStream& s, OListViewItem& lvi ) |
444 | { | 441 | { |
445 | lvi.serializeFrom( s ); | 442 | lvi.serializeFrom( s ); |
446 | } | 443 | } |
447 | #endif // QT_NO_DATASTREAM | 444 | #endif // QT_NO_DATASTREAM |
448 | 445 | ||
449 | 446 | ||
450 | /*====================================================================================== | 447 | /*====================================================================================== |
451 | * ONamedListView | 448 | * ONamedListView |
452 | *======================================================================================*/ | 449 | *======================================================================================*/ |
453 | 450 | ||
454 | ONamedListView::ONamedListView( QWidget *parent, const char *name ) | 451 | ONamedListView::ONamedListView( QWidget *parent, const char *name ) |
455 | :OListView( parent, name ) | 452 | :OListView( parent, name ) |
456 | { | 453 | { |
457 | } | 454 | } |
458 | 455 | ||
459 | 456 | ||
460 | ONamedListView::~ONamedListView() | 457 | ONamedListView::~ONamedListView() |
461 | { | 458 | { |
462 | } | 459 | } |
463 | 460 | ||
464 | 461 | ||
465 | void ONamedListView::addColumns( const QStringList& columns ) | 462 | void ONamedListView::addColumns( const QStringList& columns ) |
466 | { | 463 | { |
467 | for ( QStringList::ConstIterator it = columns.begin(); it != columns.end(); ++it ) | 464 | for ( QStringList::ConstIterator it = columns.begin(); it != columns.end(); ++it ) |
468 | { | 465 | { |
469 | qDebug( "adding column %s", (const char*) *it ); | 466 | qDebug( "adding column %s", (const char*) *it ); |
470 | addColumn( *it ); | 467 | addColumn( *it ); |
471 | } | 468 | } |
472 | } | 469 | } |
473 | 470 | ||
474 | 471 | ||
475 | int ONamedListView::findColumn( const QString& text ) const | 472 | int ONamedListView::findColumn( const QString& text ) const |
476 | { | 473 | { |
477 | //FIXME: If used excessively, this will slow down performance of updates | 474 | //FIXME: If used excessively, this will slow down performance of updates |
478 | //FIXME: because of the linear search over all column texts. | 475 | //FIXME: because of the linear search over all column texts. |
479 | //FIXME: I will optimize later by using a hash map. | 476 | //FIXME: I will optimize later by using a hash map. |
480 | for ( int i = 0; i < columns(); ++i ) | 477 | for ( int i = 0; i < columns(); ++i ) |
481 | if ( columnText( i ) == text ) | 478 | if ( columnText( i ) == text ) |
482 | return i; | 479 | return i; |
483 | return -1; | 480 | return -1; |
484 | } | 481 | } |
485 | 482 | ||
486 | 483 | ||
487 | ONamedListViewItem* ONamedListView::find( int column, const QString& text, int recurse ) const | 484 | ONamedListViewItem* ONamedListView::find( int column, const QString& text, int recurse ) const |
488 | { | 485 | { |
489 | return find( (ONamedListViewItem*) firstChild(), column, text, recurse ); | 486 | return find( (ONamedListViewItem*) firstChild(), column, text, recurse ); |
490 | } | 487 | } |
491 | 488 | ||
492 | 489 | ||
493 | ONamedListViewItem* ONamedListView::find( ONamedListViewItem* item, int column, const QString& text, int recurse ) const | 490 | ONamedListViewItem* ONamedListView::find( ONamedListViewItem* item, int column, const QString& text, int recurse ) const |
494 | { | 491 | { |
495 | ONamedListViewItem* result; | 492 | ONamedListViewItem* result; |
496 | while ( item && item->text( column ) != text ) | 493 | while ( item && item->text( column ) != text ) |
497 | { | 494 | { |
498 | qDebug( "checked %s", (const char*) item->text( column ) ); | 495 | qDebug( "checked %s", (const char*) item->text( column ) ); |
499 | 496 | ||
500 | if ( recurse < 0 || recurse > 0 ) | 497 | if ( recurse < 0 || recurse > 0 ) |
501 | { | 498 | { |
502 | qDebug( "recursion is %d - recursing into...", recurse ); | 499 | qDebug( "recursion is %d - recursing into...", recurse ); |
503 | result = find( (ONamedListViewItem*) item->firstChild(), column, text, recurse-1 ); | 500 | result = find( (ONamedListViewItem*) item->firstChild(), column, text, recurse-1 ); |
504 | if ( result ) return result; | 501 | if ( result ) return result; |
505 | } | 502 | } |
506 | 503 | ||
507 | 504 | ||
508 | item = (ONamedListViewItem*) item->itemBelow(); | 505 | item = (ONamedListViewItem*) item->itemBelow(); |
509 | } | 506 | } |
510 | if ( item && item->text( column ) == text ) | 507 | if ( item && item->text( column ) == text ) |
511 | return item; | 508 | return item; |
512 | else | 509 | else |
513 | return 0; | 510 | return 0; |
514 | } | 511 | } |
515 | 512 | ||
516 | 513 | ||
517 | ONamedListViewItem* ONamedListView::find( const QString& column, const QString& text, int recurse ) const | 514 | ONamedListViewItem* ONamedListView::find( const QString& column, const QString& text, int recurse ) const |
518 | { | 515 | { |
519 | int col = findColumn( column ); | 516 | int col = findColumn( column ); |
520 | if ( col != -1 ) | 517 | if ( col != -1 ) |
521 | return find( (ONamedListViewItem*) firstChild(), col, text, recurse ); | 518 | return find( (ONamedListViewItem*) firstChild(), col, text, recurse ); |
522 | else | 519 | else |
523 | return 0; | 520 | return 0; |
524 | } | 521 | } |
525 | 522 | ||
526 | 523 | ||
527 | ONamedListViewItem* ONamedListView::find( ONamedListViewItem* item, const QString& column, const QString& text, int recurse ) const | 524 | ONamedListViewItem* ONamedListView::find( ONamedListViewItem* item, const QString& column, const QString& text, int recurse ) const |
528 | { | 525 | { |
529 | int col = findColumn( column ); | 526 | int col = findColumn( column ); |
530 | if ( col != -1 ) | 527 | if ( col != -1 ) |
531 | return find( item, col, text, recurse ); | 528 | return find( item, col, text, recurse ); |
532 | else | 529 | else |
533 | return 0; | 530 | return 0; |
534 | } | 531 | } |
535 | 532 | ||
536 | 533 | ||
537 | /*====================================================================================== | 534 | /*====================================================================================== |
538 | * ONamedListViewItem | 535 | * ONamedListViewItem |
539 | *======================================================================================*/ | 536 | *======================================================================================*/ |
540 | 537 | ||
541 | ONamedListViewItem::ONamedListViewItem( QListView* parent, const QStringList& texts ) | 538 | ONamedListViewItem::ONamedListViewItem( QListView* parent, const QStringList& texts ) |
542 | :OListViewItem( parent ) | 539 | :OListViewItem( parent ) |
543 | { | 540 | { |
544 | setText( texts ); | 541 | setText( texts ); |
545 | } | 542 | } |
546 | 543 | ||
547 | 544 | ||
548 | ONamedListViewItem::ONamedListViewItem( QListViewItem* parent, const QStringList& texts ) | 545 | ONamedListViewItem::ONamedListViewItem( QListViewItem* parent, const QStringList& texts ) |
549 | :OListViewItem( parent ) | 546 | :OListViewItem( parent ) |
550 | { | 547 | { |
551 | setText( texts ); | 548 | setText( texts ); |
552 | } | 549 | } |
553 | 550 | ||
554 | 551 | ||
555 | ONamedListViewItem::ONamedListViewItem( QListView* parent, QListViewItem* after, const QStringList& texts ) | 552 | ONamedListViewItem::ONamedListViewItem( QListView* parent, QListViewItem* after, const QStringList& texts ) |
556 | :OListViewItem( parent, after ) | 553 | :OListViewItem( parent, after ) |
557 | { | 554 | { |
558 | setText( texts ); | 555 | setText( texts ); |
559 | } | 556 | } |
560 | 557 | ||
561 | 558 | ||
562 | ONamedListViewItem::ONamedListViewItem( QListViewItem* parent, QListViewItem* after, const QStringList& texts ) | 559 | ONamedListViewItem::ONamedListViewItem( QListViewItem* parent, QListViewItem* after, const QStringList& texts ) |
563 | :OListViewItem( parent, after ) | 560 | :OListViewItem( parent, after ) |
564 | { | 561 | { |
565 | setText( texts ); | 562 | setText( texts ); |
566 | } | 563 | } |
567 | 564 | ||
568 | 565 | ||
569 | ONamedListViewItem::~ONamedListViewItem() | 566 | ONamedListViewItem::~ONamedListViewItem() |
570 | { | 567 | { |
571 | } | 568 | } |
572 | 569 | ||
573 | 570 | ||
574 | void ONamedListViewItem::setText( const QStringList& texts ) | 571 | void ONamedListViewItem::setText( const QStringList& texts ) |
575 | { | 572 | { |
576 | int col = 0; | 573 | int col = 0; |
577 | for ( QStringList::ConstIterator it = texts.begin(); it != texts.end(); ++it ) | 574 | for ( QStringList::ConstIterator it = texts.begin(); it != texts.end(); ++it ) |
578 | { | 575 | { |
579 | qDebug( "setting column %d = text %s", col, (const char*) *it ); | 576 | qDebug( "setting column %d = text %s", col, (const char*) *it ); |
580 | OListViewItem::setText( col++, *it ); | 577 | OListViewItem::setText( col++, *it ); |
581 | } | 578 | } |
582 | 579 | ||
583 | } | 580 | } |
584 | 581 | ||
585 | 582 | ||
586 | void ONamedListViewItem::setText( const QString& column, const QString& text ) | 583 | void ONamedListViewItem::setText( const QString& column, const QString& text ) |
587 | { | 584 | { |
588 | //FIXME: If used excessively, this will slow down performance of updates | 585 | //FIXME: If used excessively, this will slow down performance of updates |
589 | //FIXME: because of the linear search over all column texts. | 586 | //FIXME: because of the linear search over all column texts. |
590 | //FIXME: I will optimize later by using a hash map. | 587 | //FIXME: I will optimize later by using a hash map. |
591 | int col = ( (ONamedListView*) listView() )->findColumn( column ); | 588 | int col = ( (ONamedListView*) listView() )->findColumn( column ); |
592 | if ( col != -1 ) | 589 | if ( col != -1 ) |
593 | OListViewItem::setText( col, text ); | 590 | OListViewItem::setText( col, text ); |
594 | else | 591 | else |
595 | qWarning( "ONamedListViewItem::setText(): Warning! Columntext '%s' not found.", (const char*) column ); | 592 | qWarning( "ONamedListViewItem::setText(): Warning! Columntext '%s' not found.", (const char*) column ); |
596 | } | 593 | } |
597 | 594 | ||
598 | 595 | ||
599 | ONamedListViewItem* ONamedListViewItem::find( int column, const QString& text, int recurse ) const | 596 | ONamedListViewItem* ONamedListViewItem::find( int column, const QString& text, int recurse ) const |
600 | { | 597 | { |
601 | return ( (ONamedListView*) listView() )->find( (ONamedListViewItem*) firstChild(), column, text, recurse ); | 598 | return ( (ONamedListView*) listView() )->find( (ONamedListViewItem*) firstChild(), column, text, recurse ); |
602 | } | 599 | } |
603 | 600 | ||
604 | 601 | ||
605 | ONamedListViewItem* ONamedListViewItem::find( const QString& column, const QString& text, int recurse ) const | 602 | ONamedListViewItem* ONamedListViewItem::find( const QString& column, const QString& text, int recurse ) const |
606 | { | 603 | { |
607 | int col = ( (ONamedListView*) listView() )->findColumn( column ); | 604 | int col = ( (ONamedListView*) listView() )->findColumn( column ); |
608 | if ( col != -1 ) | 605 | if ( col != -1 ) |
609 | return ( (ONamedListView*) listView() )->find( (ONamedListViewItem*) firstChild(), col, text, recurse ); | 606 | return ( (ONamedListView*) listView() )->find( (ONamedListViewItem*) firstChild(), col, text, recurse ); |
610 | else | 607 | else |
611 | return 0; | 608 | return 0; |
612 | } | 609 | } |
613 | 610 | ||
diff --git a/libopie2/opieui/opopupmenu.cpp b/libopie2/opieui/opopupmenu.cpp index ac73188..d5cc575 100644 --- a/libopie2/opieui/opopupmenu.cpp +++ b/libopie2/opieui/opopupmenu.cpp | |||
@@ -1,604 +1,597 @@ | |||
1 | /* This file is part of the KDE libraries | 1 | /* This file is part of the KDE libraries |
2 | Copyright (C) 2000 Daniel M. Duley <mosfet@kde.org> | 2 | Copyright (C) 2000 Daniel M. Duley <mosfet@kde.org> |
3 | Copyright (C) 2002 Hamish Rodda <meddie@yoyo.its.monash.edu.au> | 3 | Copyright (C) 2002 Hamish Rodda <meddie@yoyo.its.monash.edu.au> |
4 | 4 | ||
5 | This library is free software; you can redistribute it and/or | 5 | This library is free software; you can redistribute it and/or |
6 | modify it under the terms of the GNU Library General Public | 6 | modify it under the terms of the GNU Library General Public |
7 | License version 2 as published by the Free Software Foundation. | 7 | License version 2 as published by the Free Software Foundation. |
8 | 8 | ||
9 | This library is distributed in the hope that it will be useful, | 9 | This library is distributed in the hope that it will be useful, |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
12 | Library General Public License for more details. | 12 | Library General Public License for more details. |
13 | 13 | ||
14 | You should have received a copy of the GNU Library General Public License | 14 | You should have received a copy of the GNU Library General Public License |
15 | along with this library; see the file COPYING.LIB. If not, write to | 15 | along with this library; see the file COPYING.LIB. If not, write to |
16 | the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | 16 | the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
17 | Boston, MA 02111-1307, USA. | 17 | Boston, MA 02111-1307, USA. |
18 | */ | 18 | */ |
19 | 19 | ||
20 | /* QT */ | 20 | /* QT */ |
21 | 21 | ||
22 | #include <qapplication.h> | ||
23 | #include <qcursor.h> | ||
24 | #include <qpainter.h> | ||
25 | #include <qdrawutil.h> | 22 | #include <qdrawutil.h> |
26 | #include <qtimer.h> | 23 | #include <qtimer.h> |
27 | #include <qfont.h> | ||
28 | #include <qfontmetrics.h> | ||
29 | #include <qregexp.h> | ||
30 | #include <qstyle.h> | ||
31 | 24 | ||
32 | /* OPIE */ | 25 | /* OPIE */ |
33 | 26 | ||
34 | #include <opie2/opopupmenu.h> | 27 | #include <opie2/opopupmenu.h> |
35 | #include <opie2/oconfig.h> | 28 | #include <opie2/oconfig.h> |
36 | 29 | ||
37 | OPopupTitle::OPopupTitle(QWidget *parent, const char *name) | 30 | OPopupTitle::OPopupTitle(QWidget *parent, const char *name) |
38 | : QWidget(parent, name) | 31 | : QWidget(parent, name) |
39 | { | 32 | { |
40 | setMinimumSize(16, fontMetrics().height()+8); | 33 | setMinimumSize(16, fontMetrics().height()+8); |
41 | } | 34 | } |
42 | 35 | ||
43 | OPopupTitle::OPopupTitle(OPixmapEffect::GradientType /* gradient */, | 36 | OPopupTitle::OPopupTitle(OPixmapEffect::GradientType /* gradient */, |
44 | const QColor &/* color */, const QColor &/* textColor */, | 37 | const QColor &/* color */, const QColor &/* textColor */, |
45 | QWidget *parent, const char *name) | 38 | QWidget *parent, const char *name) |
46 | : QWidget(parent, name) | 39 | : QWidget(parent, name) |
47 | { | 40 | { |
48 | setMinimumSize(16, fontMetrics().height()+8); | 41 | setMinimumSize(16, fontMetrics().height()+8); |
49 | } | 42 | } |
50 | 43 | ||
51 | OPopupTitle::OPopupTitle(const OPixmap & /* background */, const QColor &/* color */, | 44 | OPopupTitle::OPopupTitle(const OPixmap & /* background */, const QColor &/* color */, |
52 | const QColor &/* textColor */, QWidget *parent, | 45 | const QColor &/* textColor */, QWidget *parent, |
53 | const char *name) | 46 | const char *name) |
54 | : QWidget(parent, name) | 47 | : QWidget(parent, name) |
55 | { | 48 | { |
56 | setMinimumSize(16, fontMetrics().height()+8); | 49 | setMinimumSize(16, fontMetrics().height()+8); |
57 | } | 50 | } |
58 | 51 | ||
59 | void OPopupTitle::setTitle(const QString &text, const QPixmap *icon) | 52 | void OPopupTitle::setTitle(const QString &text, const QPixmap *icon) |
60 | { | 53 | { |
61 | titleStr = text; | 54 | titleStr = text; |
62 | if (icon) | 55 | if (icon) |
63 | miniicon = *icon; | 56 | miniicon = *icon; |
64 | else | 57 | else |
65 | miniicon.resize(0, 0); | 58 | miniicon.resize(0, 0); |
66 | 59 | ||
67 | int w = miniicon.width()+fontMetrics().width(titleStr); | 60 | int w = miniicon.width()+fontMetrics().width(titleStr); |
68 | int h = QMAX( fontMetrics().height(), miniicon.height() ); | 61 | int h = QMAX( fontMetrics().height(), miniicon.height() ); |
69 | setMinimumSize( w+16, h+8 ); | 62 | setMinimumSize( w+16, h+8 ); |
70 | } | 63 | } |
71 | 64 | ||
72 | void OPopupTitle::setText( const QString &text ) | 65 | void OPopupTitle::setText( const QString &text ) |
73 | { | 66 | { |
74 | titleStr = text; | 67 | titleStr = text; |
75 | int w = miniicon.width()+fontMetrics().width(titleStr); | 68 | int w = miniicon.width()+fontMetrics().width(titleStr); |
76 | int h = QMAX( fontMetrics().height(), miniicon.height() ); | 69 | int h = QMAX( fontMetrics().height(), miniicon.height() ); |
77 | setMinimumSize( w+16, h+8 ); | 70 | setMinimumSize( w+16, h+8 ); |
78 | } | 71 | } |
79 | 72 | ||
80 | void OPopupTitle::setIcon( const QPixmap &pix ) | 73 | void OPopupTitle::setIcon( const QPixmap &pix ) |
81 | { | 74 | { |
82 | miniicon = pix; | 75 | miniicon = pix; |
83 | int w = miniicon.width()+fontMetrics().width(titleStr); | 76 | int w = miniicon.width()+fontMetrics().width(titleStr); |
84 | int h = QMAX( fontMetrics().height(), miniicon.height() ); | 77 | int h = QMAX( fontMetrics().height(), miniicon.height() ); |
85 | setMinimumSize( w+16, h+8 ); | 78 | setMinimumSize( w+16, h+8 ); |
86 | } | 79 | } |
87 | 80 | ||
88 | void OPopupTitle::paintEvent(QPaintEvent *) | 81 | void OPopupTitle::paintEvent(QPaintEvent *) |
89 | { | 82 | { |
90 | QRect r(rect()); | 83 | QRect r(rect()); |
91 | QPainter p(this); | 84 | QPainter p(this); |
92 | #if QT_VERSION > 290 | 85 | #if QT_VERSION > 290 |
93 | qApp->style().drawPrimitive(QStyle::PE_HeaderSection, &p, r, palette().active()); | 86 | qApp->style().drawPrimitive(QStyle::PE_HeaderSection, &p, r, palette().active()); |
94 | #else | 87 | #else |
95 | #warning OPopupMenu is not fully functional on Qt2 | 88 | #warning OPopupMenu is not fully functional on Qt2 |
96 | #endif | 89 | #endif |
97 | 90 | ||
98 | if (!miniicon.isNull()) | 91 | if (!miniicon.isNull()) |
99 | p.drawPixmap(4, (r.height()-miniicon.height())/2, miniicon); | 92 | p.drawPixmap(4, (r.height()-miniicon.height())/2, miniicon); |
100 | 93 | ||
101 | if (!titleStr.isNull()) | 94 | if (!titleStr.isNull()) |
102 | { | 95 | { |
103 | p.setPen(palette().active().text()); | 96 | p.setPen(palette().active().text()); |
104 | QFont f = p.font(); | 97 | QFont f = p.font(); |
105 | f.setBold(true); | 98 | f.setBold(true); |
106 | p.setFont(f); | 99 | p.setFont(f); |
107 | if(!miniicon.isNull()) | 100 | if(!miniicon.isNull()) |
108 | { | 101 | { |
109 | p.drawText(miniicon.width()+8, 0, width()-(miniicon.width()+8), | 102 | p.drawText(miniicon.width()+8, 0, width()-(miniicon.width()+8), |
110 | height(), AlignLeft | AlignVCenter | SingleLine, | 103 | height(), AlignLeft | AlignVCenter | SingleLine, |
111 | titleStr); | 104 | titleStr); |
112 | } | 105 | } |
113 | else | 106 | else |
114 | { | 107 | { |
115 | p.drawText(0, 0, width(), height(), | 108 | p.drawText(0, 0, width(), height(), |
116 | AlignCenter | SingleLine, titleStr); | 109 | AlignCenter | SingleLine, titleStr); |
117 | } | 110 | } |
118 | } | 111 | } |
119 | 112 | ||
120 | p.setPen(palette().active().highlight()); | 113 | p.setPen(palette().active().highlight()); |
121 | p.drawLine(0, 0, r.right(), 0); | 114 | p.drawLine(0, 0, r.right(), 0); |
122 | } | 115 | } |
123 | 116 | ||
124 | QSize OPopupTitle::sizeHint() const | 117 | QSize OPopupTitle::sizeHint() const |
125 | { | 118 | { |
126 | return(minimumSize()); | 119 | return(minimumSize()); |
127 | } | 120 | } |
128 | 121 | ||
129 | class OPopupMenu::OPopupMenuPrivate | 122 | class OPopupMenu::OPopupMenuPrivate |
130 | { | 123 | { |
131 | public: | 124 | public: |
132 | OPopupMenuPrivate () | 125 | OPopupMenuPrivate () |
133 | : noMatches(false) | 126 | : noMatches(false) |
134 | , shortcuts(false) | 127 | , shortcuts(false) |
135 | , autoExec(false) | 128 | , autoExec(false) |
136 | , lastHitIndex(-1) | 129 | , lastHitIndex(-1) |
137 | , m_ctxMenu(0) | 130 | , m_ctxMenu(0) |
138 | {} | 131 | {} |
139 | 132 | ||
140 | ~OPopupMenuPrivate () | 133 | ~OPopupMenuPrivate () |
141 | { | 134 | { |
142 | delete m_ctxMenu; | 135 | delete m_ctxMenu; |
143 | } | 136 | } |
144 | 137 | ||
145 | QString m_lastTitle; | 138 | QString m_lastTitle; |
146 | 139 | ||
147 | // variables for keyboard navigation | 140 | // variables for keyboard navigation |
148 | QTimer clearTimer; | 141 | QTimer clearTimer; |
149 | 142 | ||
150 | bool noMatches : 1; | 143 | bool noMatches : 1; |
151 | bool shortcuts : 1; | 144 | bool shortcuts : 1; |
152 | bool autoExec : 1; | 145 | bool autoExec : 1; |
153 | 146 | ||
154 | QString keySeq; | 147 | QString keySeq; |
155 | QString originalText; | 148 | QString originalText; |
156 | 149 | ||
157 | int lastHitIndex; | 150 | int lastHitIndex; |
158 | 151 | ||
159 | // support for RMB menus on menus | 152 | // support for RMB menus on menus |
160 | QPopupMenu* m_ctxMenu; | 153 | QPopupMenu* m_ctxMenu; |
161 | static bool s_continueCtxMenuShow; | 154 | static bool s_continueCtxMenuShow; |
162 | static int s_highlightedItem; | 155 | static int s_highlightedItem; |
163 | static OPopupMenu* s_contextedMenu; | 156 | static OPopupMenu* s_contextedMenu; |
164 | }; | 157 | }; |
165 | 158 | ||
166 | int OPopupMenu::OPopupMenuPrivate::s_highlightedItem(-1); | 159 | int OPopupMenu::OPopupMenuPrivate::s_highlightedItem(-1); |
167 | OPopupMenu* OPopupMenu::OPopupMenuPrivate::s_contextedMenu(0); | 160 | OPopupMenu* OPopupMenu::OPopupMenuPrivate::s_contextedMenu(0); |
168 | bool OPopupMenu::OPopupMenuPrivate::s_continueCtxMenuShow(true); | 161 | bool OPopupMenu::OPopupMenuPrivate::s_continueCtxMenuShow(true); |
169 | 162 | ||
170 | OPopupMenu::OPopupMenu(QWidget *parent, const char *name) | 163 | OPopupMenu::OPopupMenu(QWidget *parent, const char *name) |
171 | : QPopupMenu(parent, name) | 164 | : QPopupMenu(parent, name) |
172 | { | 165 | { |
173 | d = new OPopupMenuPrivate; | 166 | d = new OPopupMenuPrivate; |
174 | resetKeyboardVars(); | 167 | resetKeyboardVars(); |
175 | connect(&(d->clearTimer), SIGNAL(timeout()), SLOT(resetKeyboardVars())); | 168 | connect(&(d->clearTimer), SIGNAL(timeout()), SLOT(resetKeyboardVars())); |
176 | } | 169 | } |
177 | 170 | ||
178 | OPopupMenu::~OPopupMenu() | 171 | OPopupMenu::~OPopupMenu() |
179 | { | 172 | { |
180 | if (OPopupMenuPrivate::s_contextedMenu == this) | 173 | if (OPopupMenuPrivate::s_contextedMenu == this) |
181 | { | 174 | { |
182 | OPopupMenuPrivate::s_contextedMenu = 0; | 175 | OPopupMenuPrivate::s_contextedMenu = 0; |
183 | OPopupMenuPrivate::s_highlightedItem = -1; | 176 | OPopupMenuPrivate::s_highlightedItem = -1; |
184 | } | 177 | } |
185 | 178 | ||
186 | delete d; | 179 | delete d; |
187 | } | 180 | } |
188 | 181 | ||
189 | int OPopupMenu::insertTitle(const QString &text, int id, int index) | 182 | int OPopupMenu::insertTitle(const QString &text, int id, int index) |
190 | { | 183 | { |
191 | OPopupTitle *titleItem = new OPopupTitle(); | 184 | OPopupTitle *titleItem = new OPopupTitle(); |
192 | titleItem->setTitle(text); | 185 | titleItem->setTitle(text); |
193 | int ret = insertItem(titleItem, id, index); | 186 | int ret = insertItem(titleItem, id, index); |
194 | setItemEnabled(id, false); | 187 | setItemEnabled(id, false); |
195 | return ret; | 188 | return ret; |
196 | } | 189 | } |
197 | 190 | ||
198 | int OPopupMenu::insertTitle(const QPixmap &icon, const QString &text, int id, | 191 | int OPopupMenu::insertTitle(const QPixmap &icon, const QString &text, int id, |
199 | int index) | 192 | int index) |
200 | { | 193 | { |
201 | OPopupTitle *titleItem = new OPopupTitle(); | 194 | OPopupTitle *titleItem = new OPopupTitle(); |
202 | titleItem->setTitle(text, &icon); | 195 | titleItem->setTitle(text, &icon); |
203 | int ret = insertItem(titleItem, id, index); | 196 | int ret = insertItem(titleItem, id, index); |
204 | setItemEnabled(id, false); | 197 | setItemEnabled(id, false); |
205 | return ret; | 198 | return ret; |
206 | } | 199 | } |
207 | 200 | ||
208 | void OPopupMenu::changeTitle(int id, const QString &text) | 201 | void OPopupMenu::changeTitle(int id, const QString &text) |
209 | { | 202 | { |
210 | QMenuItem *item = findItem(id); | 203 | QMenuItem *item = findItem(id); |
211 | if(item){ | 204 | if(item){ |
212 | if(item->widget()) | 205 | if(item->widget()) |
213 | ((OPopupTitle *)item->widget())->setTitle(text); | 206 | ((OPopupTitle *)item->widget())->setTitle(text); |
214 | #ifndef NDEBUG | 207 | #ifndef NDEBUG |
215 | else | 208 | else |
216 | qWarning( "KPopupMenu: changeTitle() called with non-title id %d", id ); | 209 | qWarning( "KPopupMenu: changeTitle() called with non-title id %d", id ); |
217 | #endif | 210 | #endif |
218 | } | 211 | } |
219 | #ifndef NDEBUG | 212 | #ifndef NDEBUG |
220 | else | 213 | else |
221 | qWarning( "KPopupMenu: changeTitle() called with invalid id %d", id ); | 214 | qWarning( "KPopupMenu: changeTitle() called with invalid id %d", id ); |
222 | #endif | 215 | #endif |
223 | } | 216 | } |
224 | 217 | ||
225 | void OPopupMenu::changeTitle(int id, const QPixmap &icon, const QString &text) | 218 | void OPopupMenu::changeTitle(int id, const QPixmap &icon, const QString &text) |
226 | { | 219 | { |
227 | QMenuItem *item = findItem(id); | 220 | QMenuItem *item = findItem(id); |
228 | if(item){ | 221 | if(item){ |
229 | if(item->widget()) | 222 | if(item->widget()) |
230 | ((OPopupTitle *)item->widget())->setTitle(text, &icon); | 223 | ((OPopupTitle *)item->widget())->setTitle(text, &icon); |
231 | #ifndef NDEBUG | 224 | #ifndef NDEBUG |
232 | else | 225 | else |
233 | qWarning( "KPopupMenu: changeTitle() called with non-title id %d", id ); | 226 | qWarning( "KPopupMenu: changeTitle() called with non-title id %d", id ); |
234 | #endif | 227 | #endif |
235 | } | 228 | } |
236 | #ifndef NDEBUG | 229 | #ifndef NDEBUG |
237 | else | 230 | else |
238 | qWarning( "KPopupMenu: changeTitle() called with invalid id %d", id ); | 231 | qWarning( "KPopupMenu: changeTitle() called with invalid id %d", id ); |
239 | #endif | 232 | #endif |
240 | } | 233 | } |
241 | 234 | ||
242 | QString OPopupMenu::title(int id) const | 235 | QString OPopupMenu::title(int id) const |
243 | { | 236 | { |
244 | if(id == -1) // obsolete | 237 | if(id == -1) // obsolete |
245 | return(d->m_lastTitle); | 238 | return(d->m_lastTitle); |
246 | QMenuItem *item = findItem(id); | 239 | QMenuItem *item = findItem(id); |
247 | if(item){ | 240 | if(item){ |
248 | if(item->widget()) | 241 | if(item->widget()) |
249 | return(((OPopupTitle *)item->widget())->title()); | 242 | return(((OPopupTitle *)item->widget())->title()); |
250 | else | 243 | else |
251 | qWarning("OPopupMenu: title() called with non-title id %d.", id); | 244 | qWarning("OPopupMenu: title() called with non-title id %d.", id); |
252 | } | 245 | } |
253 | else | 246 | else |
254 | qWarning("OPopupMenu: title() called with invalid id %d.", id); | 247 | qWarning("OPopupMenu: title() called with invalid id %d.", id); |
255 | return(QString::null); | 248 | return(QString::null); |
256 | } | 249 | } |
257 | 250 | ||
258 | QPixmap OPopupMenu::titlePixmap(int id) const | 251 | QPixmap OPopupMenu::titlePixmap(int id) const |
259 | { | 252 | { |
260 | QMenuItem *item = findItem(id); | 253 | QMenuItem *item = findItem(id); |
261 | if(item){ | 254 | if(item){ |
262 | if(item->widget()) | 255 | if(item->widget()) |
263 | return(((OPopupTitle *)item->widget())->icon()); | 256 | return(((OPopupTitle *)item->widget())->icon()); |
264 | else | 257 | else |
265 | qWarning("KPopupMenu: titlePixmap() called with non-title id %d.", id); | 258 | qWarning("KPopupMenu: titlePixmap() called with non-title id %d.", id); |
266 | } | 259 | } |
267 | else | 260 | else |
268 | qWarning("KPopupMenu: titlePixmap() called with invalid id %d.", id); | 261 | qWarning("KPopupMenu: titlePixmap() called with invalid id %d.", id); |
269 | QPixmap tmp; | 262 | QPixmap tmp; |
270 | return(tmp); | 263 | return(tmp); |
271 | } | 264 | } |
272 | 265 | ||
273 | /** | 266 | /** |
274 | * This is re-implemented for keyboard navigation. | 267 | * This is re-implemented for keyboard navigation. |
275 | */ | 268 | */ |
276 | void OPopupMenu::closeEvent(QCloseEvent*e) | 269 | void OPopupMenu::closeEvent(QCloseEvent*e) |
277 | { | 270 | { |
278 | if (d->shortcuts) | 271 | if (d->shortcuts) |
279 | resetKeyboardVars(); | 272 | resetKeyboardVars(); |
280 | QPopupMenu::closeEvent(e); | 273 | QPopupMenu::closeEvent(e); |
281 | } | 274 | } |
282 | 275 | ||
283 | void OPopupMenu::keyPressEvent(QKeyEvent* e) | 276 | void OPopupMenu::keyPressEvent(QKeyEvent* e) |
284 | { | 277 | { |
285 | if (!d->shortcuts) { | 278 | if (!d->shortcuts) { |
286 | // continue event processing by Qpopup | 279 | // continue event processing by Qpopup |
287 | //e->ignore(); | 280 | //e->ignore(); |
288 | QPopupMenu::keyPressEvent(e); | 281 | QPopupMenu::keyPressEvent(e); |
289 | return; | 282 | return; |
290 | } | 283 | } |
291 | 284 | ||
292 | int i = 0; | 285 | int i = 0; |
293 | bool firstpass = true; | 286 | bool firstpass = true; |
294 | QString keyString = e->text(); | 287 | QString keyString = e->text(); |
295 | 288 | ||
296 | // check for common commands dealt with by QPopup | 289 | // check for common commands dealt with by QPopup |
297 | int key = e->key(); | 290 | int key = e->key(); |
298 | if (key == Key_Escape || key == Key_Return || key == Key_Enter | 291 | if (key == Key_Escape || key == Key_Return || key == Key_Enter |
299 | || key == Key_Up || key == Key_Down || key == Key_Left | 292 | || key == Key_Up || key == Key_Down || key == Key_Left |
300 | || key == Key_Right || key == Key_F1) { | 293 | || key == Key_Right || key == Key_F1) { |
301 | 294 | ||
302 | resetKeyboardVars(); | 295 | resetKeyboardVars(); |
303 | // continue event processing by Qpopup | 296 | // continue event processing by Qpopup |
304 | //e->ignore(); | 297 | //e->ignore(); |
305 | QPopupMenu::keyPressEvent(e); | 298 | QPopupMenu::keyPressEvent(e); |
306 | return; | 299 | return; |
307 | } | 300 | } |
308 | 301 | ||
309 | // check to see if the user wants to remove a key from the sequence (backspace) | 302 | // check to see if the user wants to remove a key from the sequence (backspace) |
310 | // or clear the sequence (delete) | 303 | // or clear the sequence (delete) |
311 | if (!d->keySeq.isNull()) { | 304 | if (!d->keySeq.isNull()) { |
312 | 305 | ||
313 | if (key == Key_Backspace) { | 306 | if (key == Key_Backspace) { |
314 | 307 | ||
315 | if (d->keySeq.length() == 1) { | 308 | if (d->keySeq.length() == 1) { |
316 | resetKeyboardVars(); | 309 | resetKeyboardVars(); |
317 | return; | 310 | return; |
318 | } | 311 | } |
319 | 312 | ||
320 | // keep the last sequence in keyString | 313 | // keep the last sequence in keyString |
321 | keyString = d->keySeq.left(d->keySeq.length() - 1); | 314 | keyString = d->keySeq.left(d->keySeq.length() - 1); |
322 | 315 | ||
323 | // allow sequence matching to be tried again | 316 | // allow sequence matching to be tried again |
324 | resetKeyboardVars(); | 317 | resetKeyboardVars(); |
325 | 318 | ||
326 | } else if (key == Key_Delete) { | 319 | } else if (key == Key_Delete) { |
327 | resetKeyboardVars(); | 320 | resetKeyboardVars(); |
328 | 321 | ||
329 | // clear active item | 322 | // clear active item |
330 | setActiveItem(0); | 323 | setActiveItem(0); |
331 | return; | 324 | return; |
332 | 325 | ||
333 | } else if (d->noMatches) { | 326 | } else if (d->noMatches) { |
334 | // clear if there are no matches | 327 | // clear if there are no matches |
335 | resetKeyboardVars(); | 328 | resetKeyboardVars(); |
336 | 329 | ||
337 | // clear active item | 330 | // clear active item |
338 | setActiveItem(0); | 331 | setActiveItem(0); |
339 | 332 | ||
340 | } else { | 333 | } else { |
341 | // the key sequence is not a null string | 334 | // the key sequence is not a null string |
342 | // therefore the lastHitIndex is valid | 335 | // therefore the lastHitIndex is valid |
343 | i = d->lastHitIndex; | 336 | i = d->lastHitIndex; |
344 | } | 337 | } |
345 | } else if (key == Key_Backspace && parentMenu) { | 338 | } else if (key == Key_Backspace && parentMenu) { |
346 | // backspace with no chars in the buffer... go back a menu. | 339 | // backspace with no chars in the buffer... go back a menu. |
347 | hide(); | 340 | hide(); |
348 | resetKeyboardVars(); | 341 | resetKeyboardVars(); |
349 | return; | 342 | return; |
350 | } | 343 | } |
351 | 344 | ||
352 | d->keySeq += keyString; | 345 | d->keySeq += keyString; |
353 | int seqLen = d->keySeq.length(); | 346 | int seqLen = d->keySeq.length(); |
354 | 347 | ||
355 | for (; i < (int)count(); i++) { | 348 | for (; i < (int)count(); i++) { |
356 | // compare typed text with text of this entry | 349 | // compare typed text with text of this entry |
357 | int j = idAt(i); | 350 | int j = idAt(i); |
358 | 351 | ||
359 | // don't search disabled entries | 352 | // don't search disabled entries |
360 | if (!isItemEnabled(j)) | 353 | if (!isItemEnabled(j)) |
361 | continue; | 354 | continue; |
362 | 355 | ||
363 | QString thisText; | 356 | QString thisText; |
364 | 357 | ||
365 | // retrieve the right text | 358 | // retrieve the right text |
366 | // (the last selected item one may have additional ampersands) | 359 | // (the last selected item one may have additional ampersands) |
367 | if (i == d->lastHitIndex) | 360 | if (i == d->lastHitIndex) |
368 | thisText = d->originalText; | 361 | thisText = d->originalText; |
369 | else | 362 | else |
370 | thisText = text(j); | 363 | thisText = text(j); |
371 | 364 | ||
372 | // if there is an accelerator present, remove it | 365 | // if there is an accelerator present, remove it |
373 | if ((int)accel(j) != 0) | 366 | if ((int)accel(j) != 0) |
374 | thisText = thisText.replace(QRegExp("&"), ""); | 367 | thisText = thisText.replace(QRegExp("&"), ""); |
375 | 368 | ||
376 | // chop text to the search length | 369 | // chop text to the search length |
377 | thisText = thisText.left(seqLen); | 370 | thisText = thisText.left(seqLen); |
378 | 371 | ||
379 | // do the search | 372 | // do the search |
380 | if (thisText.find(d->keySeq, 0, false) == 0) { | 373 | if (thisText.find(d->keySeq, 0, false) == 0) { |
381 | 374 | ||
382 | if (firstpass) { | 375 | if (firstpass) { |
383 | // match | 376 | // match |
384 | setActiveItem(i); | 377 | setActiveItem(i); |
385 | 378 | ||
386 | // check to see if we're underlining a different item | 379 | // check to see if we're underlining a different item |
387 | if (d->lastHitIndex != i) | 380 | if (d->lastHitIndex != i) |
388 | // yes; revert the underlining | 381 | // yes; revert the underlining |
389 | changeItem(idAt(d->lastHitIndex), d->originalText); | 382 | changeItem(idAt(d->lastHitIndex), d->originalText); |
390 | 383 | ||
391 | // set the original text if it's a different item | 384 | // set the original text if it's a different item |
392 | if (d->lastHitIndex != i || d->lastHitIndex == -1) | 385 | if (d->lastHitIndex != i || d->lastHitIndex == -1) |
393 | d->originalText = text(j); | 386 | d->originalText = text(j); |
394 | 387 | ||
395 | // underline the currently selected item | 388 | // underline the currently selected item |
396 | changeItem(j, underlineText(d->originalText, d->keySeq.length())); | 389 | changeItem(j, underlineText(d->originalText, d->keySeq.length())); |
397 | 390 | ||
398 | // remeber what's going on | 391 | // remeber what's going on |
399 | d->lastHitIndex = i; | 392 | d->lastHitIndex = i; |
400 | 393 | ||
401 | // start/restart the clear timer | 394 | // start/restart the clear timer |
402 | d->clearTimer.start(5000, true); | 395 | d->clearTimer.start(5000, true); |
403 | 396 | ||
404 | // go around for another try, to see if we can execute | 397 | // go around for another try, to see if we can execute |
405 | firstpass = false; | 398 | firstpass = false; |
406 | } else { | 399 | } else { |
407 | // don't allow execution | 400 | // don't allow execution |
408 | return; | 401 | return; |
409 | } | 402 | } |
410 | } | 403 | } |
411 | 404 | ||
412 | // fall through to allow execution | 405 | // fall through to allow execution |
413 | } | 406 | } |
414 | 407 | ||
415 | if (!firstpass) { | 408 | if (!firstpass) { |
416 | if (d->autoExec) { | 409 | if (d->autoExec) { |
417 | // activate anything | 410 | // activate anything |
418 | activateItemAt(d->lastHitIndex); | 411 | activateItemAt(d->lastHitIndex); |
419 | resetKeyboardVars(); | 412 | resetKeyboardVars(); |
420 | 413 | ||
421 | } else if (findItem(idAt(d->lastHitIndex)) && | 414 | } else if (findItem(idAt(d->lastHitIndex)) && |
422 | findItem(idAt(d->lastHitIndex))->popup()) { | 415 | findItem(idAt(d->lastHitIndex))->popup()) { |
423 | // only activate sub-menus | 416 | // only activate sub-menus |
424 | activateItemAt(d->lastHitIndex); | 417 | activateItemAt(d->lastHitIndex); |
425 | resetKeyboardVars(); | 418 | resetKeyboardVars(); |
426 | } | 419 | } |
427 | 420 | ||
428 | return; | 421 | return; |
429 | } | 422 | } |
430 | 423 | ||
431 | // no matches whatsoever, clean up | 424 | // no matches whatsoever, clean up |
432 | resetKeyboardVars(true); | 425 | resetKeyboardVars(true); |
433 | //e->ignore(); | 426 | //e->ignore(); |
434 | QPopupMenu::keyPressEvent(e); | 427 | QPopupMenu::keyPressEvent(e); |
435 | } | 428 | } |
436 | 429 | ||
437 | QString OPopupMenu::underlineText(const QString& text, uint length) | 430 | QString OPopupMenu::underlineText(const QString& text, uint length) |
438 | { | 431 | { |
439 | QString ret = text; | 432 | QString ret = text; |
440 | for (uint i = 0; i < length; i++) { | 433 | for (uint i = 0; i < length; i++) { |
441 | if (ret[2*i] != '&') | 434 | if (ret[2*i] != '&') |
442 | ret.insert(2*i, "&"); | 435 | ret.insert(2*i, "&"); |
443 | } | 436 | } |
444 | return ret; | 437 | return ret; |
445 | } | 438 | } |
446 | 439 | ||
447 | void OPopupMenu::resetKeyboardVars(bool noMatches /* = false */) | 440 | void OPopupMenu::resetKeyboardVars(bool noMatches /* = false */) |
448 | { | 441 | { |
449 | // Clean up keyboard variables | 442 | // Clean up keyboard variables |
450 | if (d->lastHitIndex != -1) { | 443 | if (d->lastHitIndex != -1) { |
451 | changeItem(idAt(d->lastHitIndex), d->originalText); | 444 | changeItem(idAt(d->lastHitIndex), d->originalText); |
452 | d->lastHitIndex = -1; | 445 | d->lastHitIndex = -1; |
453 | } | 446 | } |
454 | 447 | ||
455 | if (!noMatches) { | 448 | if (!noMatches) { |
456 | d->keySeq = QString::null; | 449 | d->keySeq = QString::null; |
457 | } | 450 | } |
458 | 451 | ||
459 | d->noMatches = noMatches; | 452 | d->noMatches = noMatches; |
460 | } | 453 | } |
461 | 454 | ||
462 | void OPopupMenu::setKeyboardShortcutsEnabled(bool enable) | 455 | void OPopupMenu::setKeyboardShortcutsEnabled(bool enable) |
463 | { | 456 | { |
464 | d->shortcuts = enable; | 457 | d->shortcuts = enable; |
465 | } | 458 | } |
466 | 459 | ||
467 | void OPopupMenu::setKeyboardShortcutsExecute(bool enable) | 460 | void OPopupMenu::setKeyboardShortcutsExecute(bool enable) |
468 | { | 461 | { |
469 | d->autoExec = enable; | 462 | d->autoExec = enable; |
470 | } | 463 | } |
471 | /** | 464 | /** |
472 | * End keyboard navigation. | 465 | * End keyboard navigation. |
473 | */ | 466 | */ |
474 | 467 | ||
475 | /** | 468 | /** |
476 | * RMB menus on menus | 469 | * RMB menus on menus |
477 | */ | 470 | */ |
478 | QPopupMenu* OPopupMenu::contextMenu() | 471 | QPopupMenu* OPopupMenu::contextMenu() |
479 | { | 472 | { |
480 | if (!d->m_ctxMenu) | 473 | if (!d->m_ctxMenu) |
481 | { | 474 | { |
482 | d->m_ctxMenu = new QPopupMenu(this); | 475 | d->m_ctxMenu = new QPopupMenu(this); |
483 | installEventFilter(this); | 476 | installEventFilter(this); |
484 | connect(d->m_ctxMenu, SIGNAL(aboutToHide()), this, SLOT(ctxMenuHiding())); | 477 | connect(d->m_ctxMenu, SIGNAL(aboutToHide()), this, SLOT(ctxMenuHiding())); |
485 | } | 478 | } |
486 | 479 | ||
487 | return d->m_ctxMenu; | 480 | return d->m_ctxMenu; |
488 | } | 481 | } |
489 | 482 | ||
490 | void OPopupMenu::cancelContextMenuShow() | 483 | void OPopupMenu::cancelContextMenuShow() |
491 | { | 484 | { |
492 | OPopupMenuPrivate::s_continueCtxMenuShow = false; | 485 | OPopupMenuPrivate::s_continueCtxMenuShow = false; |
493 | } | 486 | } |
494 | 487 | ||
495 | int OPopupMenu::contextMenuFocusItem() | 488 | int OPopupMenu::contextMenuFocusItem() |
496 | { | 489 | { |
497 | return OPopupMenuPrivate::s_highlightedItem; | 490 | return OPopupMenuPrivate::s_highlightedItem; |
498 | } | 491 | } |
499 | 492 | ||
500 | OPopupMenu* OPopupMenu::contextMenuFocus() | 493 | OPopupMenu* OPopupMenu::contextMenuFocus() |
501 | { | 494 | { |
502 | return OPopupMenuPrivate::s_contextedMenu; | 495 | return OPopupMenuPrivate::s_contextedMenu; |
503 | } | 496 | } |
504 | 497 | ||
505 | void OPopupMenu::itemHighlighted(int /* whichItem */) | 498 | void OPopupMenu::itemHighlighted(int /* whichItem */) |
506 | { | 499 | { |
507 | if (!d->m_ctxMenu || !d->m_ctxMenu->isVisible()) | 500 | if (!d->m_ctxMenu || !d->m_ctxMenu->isVisible()) |
508 | { | 501 | { |
509 | return; | 502 | return; |
510 | } | 503 | } |
511 | 504 | ||
512 | d->m_ctxMenu->hide(); | 505 | d->m_ctxMenu->hide(); |
513 | showCtxMenu(mapFromGlobal(QCursor::pos())); | 506 | showCtxMenu(mapFromGlobal(QCursor::pos())); |
514 | } | 507 | } |
515 | 508 | ||
516 | void OPopupMenu::showCtxMenu(QPoint pos) | 509 | void OPopupMenu::showCtxMenu(QPoint pos) |
517 | { | 510 | { |
518 | OPopupMenuPrivate::s_highlightedItem = idAt(pos); | 511 | OPopupMenuPrivate::s_highlightedItem = idAt(pos); |
519 | 512 | ||
520 | if (OPopupMenuPrivate::s_highlightedItem == -1) | 513 | if (OPopupMenuPrivate::s_highlightedItem == -1) |
521 | { | 514 | { |
522 | OPopupMenuPrivate::s_contextedMenu = 0; | 515 | OPopupMenuPrivate::s_contextedMenu = 0; |
523 | return; | 516 | return; |
524 | } | 517 | } |
525 | 518 | ||
526 | emit aboutToShowContextMenu(this, OPopupMenuPrivate::s_highlightedItem, d->m_ctxMenu); | 519 | emit aboutToShowContextMenu(this, OPopupMenuPrivate::s_highlightedItem, d->m_ctxMenu); |
527 | 520 | ||
528 | if (!OPopupMenuPrivate::s_continueCtxMenuShow) | 521 | if (!OPopupMenuPrivate::s_continueCtxMenuShow) |
529 | { | 522 | { |
530 | OPopupMenuPrivate::s_continueCtxMenuShow = true; | 523 | OPopupMenuPrivate::s_continueCtxMenuShow = true; |
531 | return; | 524 | return; |
532 | } | 525 | } |
533 | 526 | ||
534 | OPopupMenuPrivate::s_contextedMenu = this; | 527 | OPopupMenuPrivate::s_contextedMenu = this; |
535 | d->m_ctxMenu->popup(this->mapToGlobal(pos)); | 528 | d->m_ctxMenu->popup(this->mapToGlobal(pos)); |
536 | connect(this, SIGNAL(highlighted(int)), this, SLOT(itemHighlighted(int))); | 529 | connect(this, SIGNAL(highlighted(int)), this, SLOT(itemHighlighted(int))); |
537 | } | 530 | } |
538 | 531 | ||
539 | void OPopupMenu::ctxMenuHiding() | 532 | void OPopupMenu::ctxMenuHiding() |
540 | { | 533 | { |
541 | disconnect(this, SIGNAL(highlighted(int)), this, SLOT(itemHighlighted(int))); | 534 | disconnect(this, SIGNAL(highlighted(int)), this, SLOT(itemHighlighted(int))); |
542 | OPopupMenuPrivate::s_continueCtxMenuShow = true; | 535 | OPopupMenuPrivate::s_continueCtxMenuShow = true; |
543 | } | 536 | } |
544 | 537 | ||
545 | bool OPopupMenu::eventFilter(QObject* obj, QEvent* event) | 538 | bool OPopupMenu::eventFilter(QObject* obj, QEvent* event) |
546 | { | 539 | { |
547 | if (d->m_ctxMenu && obj == this) | 540 | if (d->m_ctxMenu && obj == this) |
548 | { | 541 | { |
549 | if (event->type() == QEvent::MouseButtonRelease) | 542 | if (event->type() == QEvent::MouseButtonRelease) |
550 | { | 543 | { |
551 | if (d->m_ctxMenu->isVisible()) | 544 | if (d->m_ctxMenu->isVisible()) |
552 | { | 545 | { |
553 | return true; | 546 | return true; |
554 | } | 547 | } |
555 | } | 548 | } |
556 | #if QT_VERSION > 290 | 549 | #if QT_VERSION > 290 |
557 | else if (event->type() == QEvent::ContextMenu) | 550 | else if (event->type() == QEvent::ContextMenu) |
558 | #else | 551 | #else |
559 | else if ( (event->type() == QEvent::MouseButtonPress) && | 552 | else if ( (event->type() == QEvent::MouseButtonPress) && |
560 | ( (QMouseEvent*) event )->button() == QMouseEvent::RightButton ) | 553 | ( (QMouseEvent*) event )->button() == QMouseEvent::RightButton ) |
561 | #endif | 554 | #endif |
562 | { | 555 | { |
563 | showCtxMenu(mapFromGlobal(QCursor::pos())); | 556 | showCtxMenu(mapFromGlobal(QCursor::pos())); |
564 | return true; | 557 | return true; |
565 | } | 558 | } |
566 | } | 559 | } |
567 | 560 | ||
568 | return QWidget::eventFilter(obj, event); | 561 | return QWidget::eventFilter(obj, event); |
569 | } | 562 | } |
570 | 563 | ||
571 | void OPopupMenu::hideEvent(QHideEvent*) | 564 | void OPopupMenu::hideEvent(QHideEvent*) |
572 | { | 565 | { |
573 | if (d->m_ctxMenu) | 566 | if (d->m_ctxMenu) |
574 | { | 567 | { |
575 | d->m_ctxMenu->hide(); | 568 | d->m_ctxMenu->hide(); |
576 | } | 569 | } |
577 | } | 570 | } |
578 | /** | 571 | /** |
579 | * end of RMB menus on menus support | 572 | * end of RMB menus on menus support |
580 | */ | 573 | */ |
581 | 574 | ||
582 | // Obsolete | 575 | // Obsolete |
583 | OPopupMenu::OPopupMenu(const QString& title, QWidget *parent, const char *name) | 576 | OPopupMenu::OPopupMenu(const QString& title, QWidget *parent, const char *name) |
584 | : QPopupMenu(parent, name) | 577 | : QPopupMenu(parent, name) |
585 | { | 578 | { |
586 | d = new OPopupMenuPrivate; | 579 | d = new OPopupMenuPrivate; |
587 | setTitle(title); | 580 | setTitle(title); |
588 | } | 581 | } |
589 | 582 | ||
590 | // Obsolete | 583 | // Obsolete |
591 | void OPopupMenu::setTitle(const QString &title) | 584 | void OPopupMenu::setTitle(const QString &title) |
592 | { | 585 | { |
593 | OPopupTitle *titleItem = new OPopupTitle(); | 586 | OPopupTitle *titleItem = new OPopupTitle(); |
594 | titleItem->setTitle(title); | 587 | titleItem->setTitle(title); |
595 | insertItem(titleItem); | 588 | insertItem(titleItem); |
596 | d->m_lastTitle = title; | 589 | d->m_lastTitle = title; |
597 | } | 590 | } |
598 | 591 | ||
599 | void OPopupTitle::virtual_hook( int, void* ) | 592 | void OPopupTitle::virtual_hook( int, void* ) |
600 | { /*BASE::virtual_hook( id, data );*/ } | 593 | { /*BASE::virtual_hook( id, data );*/ } |
601 | 594 | ||
602 | void OPopupMenu::virtual_hook( int, void* ) | 595 | void OPopupMenu::virtual_hook( int, void* ) |
603 | { /*BASE::virtual_hook( id, data );*/ } | 596 | { /*BASE::virtual_hook( id, data );*/ } |
604 | 597 | ||
diff --git a/libopie2/opieui/oselector.cpp b/libopie2/opieui/oselector.cpp index ec5af6b..23b3ce3 100644 --- a/libopie2/opieui/oselector.cpp +++ b/libopie2/opieui/oselector.cpp | |||
@@ -1,716 +1,715 @@ | |||
1 | /* This file is part of the KDE libraries | 1 | /* This file is part of the KDE libraries |
2 | Copyright (C) 1997 Martin Jones (mjones@kde.org) | 2 | Copyright (C) 1997 Martin Jones (mjones@kde.org) |
3 | 3 | ||
4 | This library is free software; you can redistribute it and/or | 4 | This library is free software; you can redistribute it and/or |
5 | modify it under the terms of the GNU Library General Public | 5 | modify it under the terms of the GNU Library General Public |
6 | License as published by the Free Software Foundation; either | 6 | License as published by the Free Software Foundation; either |
7 | version 2 of the License, or (at your option) any later version. | 7 | version 2 of the License, or (at your option) any later version. |
8 | 8 | ||
9 | This library is distributed in the hope that it will be useful, | 9 | This library is distributed in the hope that it will be useful, |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
12 | Library General Public License for more details. | 12 | Library General Public License for more details. |
13 | 13 | ||
14 | You should have received a copy of the GNU Library General Public License | 14 | You should have received a copy of the GNU Library General Public License |
15 | along with this library; see the file COPYING.LIB. If not, write to | 15 | along with this library; see the file COPYING.LIB. If not, write to |
16 | the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | 16 | the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
17 | Boston, MA 02111-1307, USA. | 17 | Boston, MA 02111-1307, USA. |
18 | */ | 18 | */ |
19 | 19 | ||
20 | /* QT */ | 20 | /* QT */ |
21 | 21 | ||
22 | #include <qimage.h> | 22 | #include <qimage.h> |
23 | #include <qpainter.h> | ||
24 | #include <qdrawutil.h> | 23 | #include <qdrawutil.h> |
25 | 24 | ||
26 | /* OPIE */ | 25 | /* OPIE */ |
27 | 26 | ||
28 | #include <opie2/oimageeffect.h> | 27 | #include <opie2/oimageeffect.h> |
29 | #include <opie2/oselector.h> | 28 | #include <opie2/oselector.h> |
30 | 29 | ||
31 | #define STORE_W 8 | 30 | #define STORE_W 8 |
32 | #define STORE_W2 STORE_W * 2 | 31 | #define STORE_W2 STORE_W * 2 |
33 | 32 | ||
34 | //----------------------------------------------------------------------------- | 33 | //----------------------------------------------------------------------------- |
35 | /* | 34 | /* |
36 | * 2D value selector. | 35 | * 2D value selector. |
37 | * The contents of the selector are drawn by derived class. | 36 | * The contents of the selector are drawn by derived class. |
38 | */ | 37 | */ |
39 | 38 | ||
40 | OXYSelector::OXYSelector( QWidget *parent, const char *name ) | 39 | OXYSelector::OXYSelector( QWidget *parent, const char *name ) |
41 | : QWidget( parent, name ) | 40 | : QWidget( parent, name ) |
42 | { | 41 | { |
43 | xPos = 0; | 42 | xPos = 0; |
44 | yPos = 0; | 43 | yPos = 0; |
45 | minX = 0; | 44 | minX = 0; |
46 | minY = 0; | 45 | minY = 0; |
47 | maxX = 100; | 46 | maxX = 100; |
48 | maxY = 100; | 47 | maxY = 100; |
49 | store.setOptimization( QPixmap::BestOptim ); | 48 | store.setOptimization( QPixmap::BestOptim ); |
50 | store.resize( STORE_W2, STORE_W2 ); | 49 | store.resize( STORE_W2, STORE_W2 ); |
51 | } | 50 | } |
52 | 51 | ||
53 | 52 | ||
54 | OXYSelector::~OXYSelector() | 53 | OXYSelector::~OXYSelector() |
55 | {} | 54 | {} |
56 | 55 | ||
57 | 56 | ||
58 | void OXYSelector::setRange( int _minX, int _minY, int _maxX, int _maxY ) | 57 | void OXYSelector::setRange( int _minX, int _minY, int _maxX, int _maxY ) |
59 | { | 58 | { |
60 | px = 2; | 59 | px = 2; |
61 | py = 2; | 60 | py = 2; |
62 | minX = _minX; | 61 | minX = _minX; |
63 | minY = _minY; | 62 | minY = _minY; |
64 | maxX = _maxX; | 63 | maxX = _maxX; |
65 | maxY = _maxY; | 64 | maxY = _maxY; |
66 | } | 65 | } |
67 | 66 | ||
68 | void OXYSelector::setValues( int _xPos, int _yPos ) | 67 | void OXYSelector::setValues( int _xPos, int _yPos ) |
69 | { | 68 | { |
70 | xPos = _xPos; | 69 | xPos = _xPos; |
71 | yPos = _yPos; | 70 | yPos = _yPos; |
72 | 71 | ||
73 | if ( xPos > maxX ) | 72 | if ( xPos > maxX ) |
74 | xPos = maxX; | 73 | xPos = maxX; |
75 | else if ( xPos < minX ) | 74 | else if ( xPos < minX ) |
76 | xPos = minX; | 75 | xPos = minX; |
77 | 76 | ||
78 | if ( yPos > maxY ) | 77 | if ( yPos > maxY ) |
79 | yPos = maxY; | 78 | yPos = maxY; |
80 | else if ( yPos < minY ) | 79 | else if ( yPos < minY ) |
81 | yPos = minY; | 80 | yPos = minY; |
82 | 81 | ||
83 | int xp = 2 + (width() - 4) * xPos / (maxX - minX); | 82 | int xp = 2 + (width() - 4) * xPos / (maxX - minX); |
84 | int yp = height() - 2 - (height() - 4) * yPos / (maxY - minY); | 83 | int yp = height() - 2 - (height() - 4) * yPos / (maxY - minY); |
85 | 84 | ||
86 | setPosition( xp, yp ); | 85 | setPosition( xp, yp ); |
87 | } | 86 | } |
88 | 87 | ||
89 | QRect OXYSelector::contentsRect() const | 88 | QRect OXYSelector::contentsRect() const |
90 | { | 89 | { |
91 | return QRect( 2, 2, width()-4, height()-4 ); | 90 | return QRect( 2, 2, width()-4, height()-4 ); |
92 | } | 91 | } |
93 | 92 | ||
94 | void OXYSelector::paintEvent( QPaintEvent *ev ) | 93 | void OXYSelector::paintEvent( QPaintEvent *ev ) |
95 | { | 94 | { |
96 | QRect cursorRect( px - STORE_W, py - STORE_W, STORE_W2, STORE_W2); | 95 | QRect cursorRect( px - STORE_W, py - STORE_W, STORE_W2, STORE_W2); |
97 | QRect paintRect = ev->rect(); | 96 | QRect paintRect = ev->rect(); |
98 | 97 | ||
99 | QPainter painter; | 98 | QPainter painter; |
100 | painter.begin( this ); | 99 | painter.begin( this ); |
101 | 100 | ||
102 | QBrush brush; | 101 | QBrush brush; |
103 | qDrawShadePanel( &painter, 0, 0, width(), height(), colorGroup(), | 102 | qDrawShadePanel( &painter, 0, 0, width(), height(), colorGroup(), |
104 | TRUE, 2, &brush ); | 103 | TRUE, 2, &brush ); |
105 | 104 | ||
106 | drawContents( &painter ); | 105 | drawContents( &painter ); |
107 | if (paintRect.contains(cursorRect)) | 106 | if (paintRect.contains(cursorRect)) |
108 | { | 107 | { |
109 | bitBlt( &store, 0, 0, this, px - STORE_W, py - STORE_W, | 108 | bitBlt( &store, 0, 0, this, px - STORE_W, py - STORE_W, |
110 | STORE_W2, STORE_W2, CopyROP ); | 109 | STORE_W2, STORE_W2, CopyROP ); |
111 | drawCursor( &painter, px, py ); | 110 | drawCursor( &painter, px, py ); |
112 | } | 111 | } |
113 | else if (paintRect.intersects(cursorRect)) | 112 | else if (paintRect.intersects(cursorRect)) |
114 | { | 113 | { |
115 | repaint( cursorRect, false); | 114 | repaint( cursorRect, false); |
116 | } | 115 | } |
117 | 116 | ||
118 | painter.end(); | 117 | painter.end(); |
119 | } | 118 | } |
120 | 119 | ||
121 | void OXYSelector::mousePressEvent( QMouseEvent *e ) | 120 | void OXYSelector::mousePressEvent( QMouseEvent *e ) |
122 | { | 121 | { |
123 | int xVal, yVal; | 122 | int xVal, yVal; |
124 | valuesFromPosition( e->pos().x() - 2, e->pos().y() - 2, xVal, yVal ); | 123 | valuesFromPosition( e->pos().x() - 2, e->pos().y() - 2, xVal, yVal ); |
125 | setValues( xVal, yVal ); | 124 | setValues( xVal, yVal ); |
126 | 125 | ||
127 | emit valueChanged( xPos, yPos ); | 126 | emit valueChanged( xPos, yPos ); |
128 | } | 127 | } |
129 | 128 | ||
130 | void OXYSelector::mouseMoveEvent( QMouseEvent *e ) | 129 | void OXYSelector::mouseMoveEvent( QMouseEvent *e ) |
131 | { | 130 | { |
132 | int xVal, yVal; | 131 | int xVal, yVal; |
133 | valuesFromPosition( e->pos().x() - 2, e->pos().y() - 2, xVal, yVal ); | 132 | valuesFromPosition( e->pos().x() - 2, e->pos().y() - 2, xVal, yVal ); |
134 | setValues( xVal, yVal ); | 133 | setValues( xVal, yVal ); |
135 | 134 | ||
136 | emit valueChanged( xPos, yPos ); | 135 | emit valueChanged( xPos, yPos ); |
137 | } | 136 | } |
138 | 137 | ||
139 | void OXYSelector::wheelEvent( QWheelEvent *e ) | 138 | void OXYSelector::wheelEvent( QWheelEvent *e ) |
140 | { | 139 | { |
141 | #if QT_VERSION > 290 | 140 | #if QT_VERSION > 290 |
142 | if ( e->orientation() == Qt::Horizontal ) | 141 | if ( e->orientation() == Qt::Horizontal ) |
143 | setValues( xValue() + e->delta()/120, yValue() ); | 142 | setValues( xValue() + e->delta()/120, yValue() ); |
144 | else | 143 | else |
145 | setValues( xValue(), yValue() + e->delta()/120 ); | 144 | setValues( xValue(), yValue() + e->delta()/120 ); |
146 | 145 | ||
147 | emit valueChanged( xPos, yPos ); | 146 | emit valueChanged( xPos, yPos ); |
148 | #endif | 147 | #endif |
149 | } | 148 | } |
150 | 149 | ||
151 | void OXYSelector::valuesFromPosition( int x, int y, int &xVal, int &yVal ) const | 150 | void OXYSelector::valuesFromPosition( int x, int y, int &xVal, int &yVal ) const |
152 | { | 151 | { |
153 | xVal = ( (maxX-minX) * (x-2) ) / ( width()-4 ); | 152 | xVal = ( (maxX-minX) * (x-2) ) / ( width()-4 ); |
154 | yVal = maxY - ( ( (maxY-minY) * (y-2) ) / ( height()-4 ) ); | 153 | yVal = maxY - ( ( (maxY-minY) * (y-2) ) / ( height()-4 ) ); |
155 | 154 | ||
156 | if ( xVal > maxX ) | 155 | if ( xVal > maxX ) |
157 | xVal = maxX; | 156 | xVal = maxX; |
158 | else if ( xVal < minX ) | 157 | else if ( xVal < minX ) |
159 | xVal = minX; | 158 | xVal = minX; |
160 | 159 | ||
161 | if ( yVal > maxY ) | 160 | if ( yVal > maxY ) |
162 | yVal = maxY; | 161 | yVal = maxY; |
163 | else if ( yVal < minY ) | 162 | else if ( yVal < minY ) |
164 | yVal = minY; | 163 | yVal = minY; |
165 | } | 164 | } |
166 | 165 | ||
167 | void OXYSelector::setPosition( int xp, int yp ) | 166 | void OXYSelector::setPosition( int xp, int yp ) |
168 | { | 167 | { |
169 | if ( xp < 2 ) | 168 | if ( xp < 2 ) |
170 | xp = 2; | 169 | xp = 2; |
171 | else if ( xp > width() - 2 ) | 170 | else if ( xp > width() - 2 ) |
172 | xp = width() - 2; | 171 | xp = width() - 2; |
173 | 172 | ||
174 | if ( yp < 2 ) | 173 | if ( yp < 2 ) |
175 | yp = 2; | 174 | yp = 2; |
176 | else if ( yp > height() - 2 ) | 175 | else if ( yp > height() - 2 ) |
177 | yp = height() - 2; | 176 | yp = height() - 2; |
178 | 177 | ||
179 | QPainter painter; | 178 | QPainter painter; |
180 | painter.begin( this ); | 179 | painter.begin( this ); |
181 | 180 | ||
182 | bitBlt( this, px - STORE_W, py - STORE_W, &store, 0, 0, | 181 | bitBlt( this, px - STORE_W, py - STORE_W, &store, 0, 0, |
183 | STORE_W2, STORE_W2, CopyROP ); | 182 | STORE_W2, STORE_W2, CopyROP ); |
184 | bitBlt( &store, 0, 0, this, xp - STORE_W, yp - STORE_W, | 183 | bitBlt( &store, 0, 0, this, xp - STORE_W, yp - STORE_W, |
185 | STORE_W2, STORE_W2, CopyROP ); | 184 | STORE_W2, STORE_W2, CopyROP ); |
186 | drawCursor( &painter, xp, yp ); | 185 | drawCursor( &painter, xp, yp ); |
187 | px = xp; | 186 | px = xp; |
188 | py = yp; | 187 | py = yp; |
189 | 188 | ||
190 | painter.end(); | 189 | painter.end(); |
191 | } | 190 | } |
192 | 191 | ||
193 | void OXYSelector::drawContents( QPainter * ) | 192 | void OXYSelector::drawContents( QPainter * ) |
194 | {} | 193 | {} |
195 | 194 | ||
196 | 195 | ||
197 | void OXYSelector::drawCursor( QPainter *p, int xp, int yp ) | 196 | void OXYSelector::drawCursor( QPainter *p, int xp, int yp ) |
198 | { | 197 | { |
199 | p->setPen( QPen( white ) ); | 198 | p->setPen( QPen( white ) ); |
200 | 199 | ||
201 | p->drawLine( xp - 6, yp - 6, xp - 2, yp - 2 ); | 200 | p->drawLine( xp - 6, yp - 6, xp - 2, yp - 2 ); |
202 | p->drawLine( xp - 6, yp + 6, xp - 2, yp + 2 ); | 201 | p->drawLine( xp - 6, yp + 6, xp - 2, yp + 2 ); |
203 | p->drawLine( xp + 6, yp - 6, xp + 2, yp - 2 ); | 202 | p->drawLine( xp + 6, yp - 6, xp + 2, yp - 2 ); |
204 | p->drawLine( xp + 6, yp + 6, xp + 2, yp + 2 ); | 203 | p->drawLine( xp + 6, yp + 6, xp + 2, yp + 2 ); |
205 | } | 204 | } |
206 | 205 | ||
207 | //----------------------------------------------------------------------------- | 206 | //----------------------------------------------------------------------------- |
208 | /* | 207 | /* |
209 | * 1D value selector with contents drawn by derived class. | 208 | * 1D value selector with contents drawn by derived class. |
210 | * See OColorDialog for example. | 209 | * See OColorDialog for example. |
211 | */ | 210 | */ |
212 | 211 | ||
213 | 212 | ||
214 | OSelector::OSelector( QWidget *parent, const char *name ) | 213 | OSelector::OSelector( QWidget *parent, const char *name ) |
215 | : QWidget( parent, name ), QRangeControl() | 214 | : QWidget( parent, name ), QRangeControl() |
216 | { | 215 | { |
217 | _orientation = Horizontal; | 216 | _orientation = Horizontal; |
218 | _indent = TRUE; | 217 | _indent = TRUE; |
219 | } | 218 | } |
220 | 219 | ||
221 | OSelector::OSelector( Orientation o, QWidget *parent, const char *name ) | 220 | OSelector::OSelector( Orientation o, QWidget *parent, const char *name ) |
222 | : QWidget( parent, name ), QRangeControl() | 221 | : QWidget( parent, name ), QRangeControl() |
223 | { | 222 | { |
224 | _orientation = o; | 223 | _orientation = o; |
225 | _indent = TRUE; | 224 | _indent = TRUE; |
226 | } | 225 | } |
227 | 226 | ||
228 | 227 | ||
229 | OSelector::~OSelector() | 228 | OSelector::~OSelector() |
230 | {} | 229 | {} |
231 | 230 | ||
232 | 231 | ||
233 | QRect OSelector::contentsRect() const | 232 | QRect OSelector::contentsRect() const |
234 | { | 233 | { |
235 | if ( orientation() == Vertical ) | 234 | if ( orientation() == Vertical ) |
236 | return QRect( 2, 5, width()-9, height()-10 ); | 235 | return QRect( 2, 5, width()-9, height()-10 ); |
237 | else | 236 | else |
238 | return QRect( 5, 2, width()-10, height()-9 ); | 237 | return QRect( 5, 2, width()-10, height()-9 ); |
239 | } | 238 | } |
240 | 239 | ||
241 | void OSelector::paintEvent( QPaintEvent * ) | 240 | void OSelector::paintEvent( QPaintEvent * ) |
242 | { | 241 | { |
243 | QPainter painter; | 242 | QPainter painter; |
244 | 243 | ||
245 | painter.begin( this ); | 244 | painter.begin( this ); |
246 | 245 | ||
247 | drawContents( &painter ); | 246 | drawContents( &painter ); |
248 | 247 | ||
249 | QBrush brush; | 248 | QBrush brush; |
250 | 249 | ||
251 | if ( indent() ) | 250 | if ( indent() ) |
252 | { | 251 | { |
253 | if ( orientation() == Vertical ) | 252 | if ( orientation() == Vertical ) |
254 | qDrawShadePanel( &painter, 0, 3, width()-5, height()-6, | 253 | qDrawShadePanel( &painter, 0, 3, width()-5, height()-6, |
255 | colorGroup(), TRUE, 2, &brush ); | 254 | colorGroup(), TRUE, 2, &brush ); |
256 | else | 255 | else |
257 | qDrawShadePanel( &painter, 3, 0, width()-6, height()-5, | 256 | qDrawShadePanel( &painter, 3, 0, width()-6, height()-5, |
258 | colorGroup(), TRUE, 2, &brush ); | 257 | colorGroup(), TRUE, 2, &brush ); |
259 | } | 258 | } |
260 | 259 | ||
261 | QPoint pos = calcArrowPos( value() ); | 260 | QPoint pos = calcArrowPos( value() ); |
262 | drawArrow( &painter, TRUE, pos ); | 261 | drawArrow( &painter, TRUE, pos ); |
263 | 262 | ||
264 | painter.end(); | 263 | painter.end(); |
265 | } | 264 | } |
266 | 265 | ||
267 | void OSelector::mousePressEvent( QMouseEvent *e ) | 266 | void OSelector::mousePressEvent( QMouseEvent *e ) |
268 | { | 267 | { |
269 | moveArrow( e->pos() ); | 268 | moveArrow( e->pos() ); |
270 | } | 269 | } |
271 | 270 | ||
272 | void OSelector::mouseMoveEvent( QMouseEvent *e ) | 271 | void OSelector::mouseMoveEvent( QMouseEvent *e ) |
273 | { | 272 | { |
274 | moveArrow( e->pos() ); | 273 | moveArrow( e->pos() ); |
275 | } | 274 | } |
276 | 275 | ||
277 | void OSelector::wheelEvent( QWheelEvent *e ) | 276 | void OSelector::wheelEvent( QWheelEvent *e ) |
278 | { | 277 | { |
279 | int val = value() + e->delta()/120; | 278 | int val = value() + e->delta()/120; |
280 | emit valueChanged( val ); | 279 | emit valueChanged( val ); |
281 | setValue( val ); | 280 | setValue( val ); |
282 | } | 281 | } |
283 | 282 | ||
284 | void OSelector::valueChange() | 283 | void OSelector::valueChange() |
285 | { | 284 | { |
286 | QPainter painter; | 285 | QPainter painter; |
287 | QPoint pos; | 286 | QPoint pos; |
288 | 287 | ||
289 | painter.begin( this ); | 288 | painter.begin( this ); |
290 | 289 | ||
291 | pos = calcArrowPos( prevValue() ); | 290 | pos = calcArrowPos( prevValue() ); |
292 | drawArrow( &painter, FALSE, pos ); | 291 | drawArrow( &painter, FALSE, pos ); |
293 | 292 | ||
294 | pos = calcArrowPos( value() ); | 293 | pos = calcArrowPos( value() ); |
295 | drawArrow( &painter, TRUE, pos ); | 294 | drawArrow( &painter, TRUE, pos ); |
296 | 295 | ||
297 | painter.end(); | 296 | painter.end(); |
298 | } | 297 | } |
299 | 298 | ||
300 | void OSelector::moveArrow( const QPoint &pos ) | 299 | void OSelector::moveArrow( const QPoint &pos ) |
301 | { | 300 | { |
302 | int val; | 301 | int val; |
303 | 302 | ||
304 | if ( orientation() == Vertical ) | 303 | if ( orientation() == Vertical ) |
305 | val = ( maxValue() - minValue() ) * (height()-pos.y()-3) | 304 | val = ( maxValue() - minValue() ) * (height()-pos.y()-3) |
306 | / (height()-10) + minValue(); | 305 | / (height()-10) + minValue(); |
307 | else | 306 | else |
308 | val = ( maxValue() - minValue() ) * (width()-pos.x()-3) | 307 | val = ( maxValue() - minValue() ) * (width()-pos.x()-3) |
309 | / (width()-10) + minValue(); | 308 | / (width()-10) + minValue(); |
310 | 309 | ||
311 | if ( val > maxValue() ) | 310 | if ( val > maxValue() ) |
312 | val = maxValue(); | 311 | val = maxValue(); |
313 | if ( val < minValue() ) | 312 | if ( val < minValue() ) |
314 | val = minValue(); | 313 | val = minValue(); |
315 | 314 | ||
316 | emit valueChanged( val ); | 315 | emit valueChanged( val ); |
317 | setValue( val ); | 316 | setValue( val ); |
318 | } | 317 | } |
319 | 318 | ||
320 | QPoint OSelector::calcArrowPos( int val ) | 319 | QPoint OSelector::calcArrowPos( int val ) |
321 | { | 320 | { |
322 | QPoint p; | 321 | QPoint p; |
323 | 322 | ||
324 | if ( orientation() == Vertical ) | 323 | if ( orientation() == Vertical ) |
325 | { | 324 | { |
326 | p.setY( height() - ( (height()-10) * val | 325 | p.setY( height() - ( (height()-10) * val |
327 | / ( maxValue() - minValue() ) + 5 ) ); | 326 | / ( maxValue() - minValue() ) + 5 ) ); |
328 | p.setX( width() - 5 ); | 327 | p.setX( width() - 5 ); |
329 | } | 328 | } |
330 | else | 329 | else |
331 | { | 330 | { |
332 | p.setX( width() - ( (width()-10) * val | 331 | p.setX( width() - ( (width()-10) * val |
333 | / ( maxValue() - minValue() ) + 5 ) ); | 332 | / ( maxValue() - minValue() ) + 5 ) ); |
334 | p.setY( height() - 5 ); | 333 | p.setY( height() - 5 ); |
335 | } | 334 | } |
336 | 335 | ||
337 | return p; | 336 | return p; |
338 | } | 337 | } |
339 | 338 | ||
340 | void OSelector::drawContents( QPainter * ) | 339 | void OSelector::drawContents( QPainter * ) |
341 | {} | 340 | {} |
342 | 341 | ||
343 | void OSelector::drawArrow( QPainter *painter, bool show, const QPoint &pos ) | 342 | void OSelector::drawArrow( QPainter *painter, bool show, const QPoint &pos ) |
344 | { | 343 | { |
345 | if ( show ) | 344 | if ( show ) |
346 | { | 345 | { |
347 | QPointArray array(3); | 346 | QPointArray array(3); |
348 | 347 | ||
349 | painter->setPen( QPen() ); | 348 | painter->setPen( QPen() ); |
350 | painter->setBrush( QBrush( colorGroup().buttonText() ) ); | 349 | painter->setBrush( QBrush( colorGroup().buttonText() ) ); |
351 | if ( orientation() == Vertical ) | 350 | if ( orientation() == Vertical ) |
352 | { | 351 | { |
353 | array.setPoint( 0, pos.x()+0, pos.y()+0 ); | 352 | array.setPoint( 0, pos.x()+0, pos.y()+0 ); |
354 | array.setPoint( 1, pos.x()+5, pos.y()+5 ); | 353 | array.setPoint( 1, pos.x()+5, pos.y()+5 ); |
355 | array.setPoint( 2, pos.x()+5, pos.y()-5 ); | 354 | array.setPoint( 2, pos.x()+5, pos.y()-5 ); |
356 | } | 355 | } |
357 | else | 356 | else |
358 | { | 357 | { |
359 | array.setPoint( 0, pos.x()+0, pos.y()+0 ); | 358 | array.setPoint( 0, pos.x()+0, pos.y()+0 ); |
360 | array.setPoint( 1, pos.x()+5, pos.y()+5 ); | 359 | array.setPoint( 1, pos.x()+5, pos.y()+5 ); |
361 | array.setPoint( 2, pos.x()-5, pos.y()+5 ); | 360 | array.setPoint( 2, pos.x()-5, pos.y()+5 ); |
362 | } | 361 | } |
363 | 362 | ||
364 | painter->drawPolygon( array ); | 363 | painter->drawPolygon( array ); |
365 | } | 364 | } |
366 | else | 365 | else |
367 | { | 366 | { |
368 | if ( orientation() == Vertical ) | 367 | if ( orientation() == Vertical ) |
369 | { | 368 | { |
370 | repaint(pos.x(), pos.y()-5, 6, 11, true); | 369 | repaint(pos.x(), pos.y()-5, 6, 11, true); |
371 | } | 370 | } |
372 | else | 371 | else |
373 | { | 372 | { |
374 | repaint(pos.x()-5, pos.y(), 11, 6, true); | 373 | repaint(pos.x()-5, pos.y(), 11, 6, true); |
375 | } | 374 | } |
376 | } | 375 | } |
377 | } | 376 | } |
378 | 377 | ||
379 | //---------------------------------------------------------------------------- | 378 | //---------------------------------------------------------------------------- |
380 | 379 | ||
381 | OGradientSelector::OGradientSelector( QWidget *parent, const char *name ) | 380 | OGradientSelector::OGradientSelector( QWidget *parent, const char *name ) |
382 | : OSelector( parent, name ) | 381 | : OSelector( parent, name ) |
383 | { | 382 | { |
384 | init(); | 383 | init(); |
385 | } | 384 | } |
386 | 385 | ||
387 | 386 | ||
388 | OGradientSelector::OGradientSelector( Orientation o, QWidget *parent, | 387 | OGradientSelector::OGradientSelector( Orientation o, QWidget *parent, |
389 | const char *name ) | 388 | const char *name ) |
390 | : OSelector( o, parent, name ) | 389 | : OSelector( o, parent, name ) |
391 | { | 390 | { |
392 | init(); | 391 | init(); |
393 | } | 392 | } |
394 | 393 | ||
395 | 394 | ||
396 | OGradientSelector::~OGradientSelector() | 395 | OGradientSelector::~OGradientSelector() |
397 | {} | 396 | {} |
398 | 397 | ||
399 | 398 | ||
400 | void OGradientSelector::init() | 399 | void OGradientSelector::init() |
401 | { | 400 | { |
402 | color1.setRgb( 0, 0, 0 ); | 401 | color1.setRgb( 0, 0, 0 ); |
403 | color2.setRgb( 255, 255, 255 ); | 402 | color2.setRgb( 255, 255, 255 ); |
404 | 403 | ||
405 | text1 = text2 = ""; | 404 | text1 = text2 = ""; |
406 | } | 405 | } |
407 | 406 | ||
408 | 407 | ||
409 | void OGradientSelector::drawContents( QPainter *painter ) | 408 | void OGradientSelector::drawContents( QPainter *painter ) |
410 | { | 409 | { |
411 | QImage image( contentsRect().width(), contentsRect().height(), 32 ); | 410 | QImage image( contentsRect().width(), contentsRect().height(), 32 ); |
412 | 411 | ||
413 | QColor col; | 412 | QColor col; |
414 | float scale; | 413 | float scale; |
415 | 414 | ||
416 | int redDiff = color2.red() - color1.red(); | 415 | int redDiff = color2.red() - color1.red(); |
417 | int greenDiff = color2.green() - color1.green(); | 416 | int greenDiff = color2.green() - color1.green(); |
418 | int blueDiff = color2.blue() - color1.blue(); | 417 | int blueDiff = color2.blue() - color1.blue(); |
419 | 418 | ||
420 | if ( orientation() == Vertical ) | 419 | if ( orientation() == Vertical ) |
421 | { | 420 | { |
422 | for ( int y = 0; y < image.height(); y++ ) | 421 | for ( int y = 0; y < image.height(); y++ ) |
423 | { | 422 | { |
424 | scale = 1.0 * y / image.height(); | 423 | scale = 1.0 * y / image.height(); |
425 | col.setRgb( color1.red() + int(redDiff*scale), | 424 | col.setRgb( color1.red() + int(redDiff*scale), |
426 | color1.green() + int(greenDiff*scale), | 425 | color1.green() + int(greenDiff*scale), |
427 | color1.blue() + int(blueDiff*scale) ); | 426 | color1.blue() + int(blueDiff*scale) ); |
428 | 427 | ||
429 | unsigned int *p = (uint *) image.scanLine( y ); | 428 | unsigned int *p = (uint *) image.scanLine( y ); |
430 | for ( int x = 0; x < image.width(); x++ ) | 429 | for ( int x = 0; x < image.width(); x++ ) |
431 | *p++ = col.rgb(); | 430 | *p++ = col.rgb(); |
432 | } | 431 | } |
433 | } | 432 | } |
434 | else | 433 | else |
435 | { | 434 | { |
436 | unsigned int *p = (uint *) image.scanLine( 0 ); | 435 | unsigned int *p = (uint *) image.scanLine( 0 ); |
437 | 436 | ||
438 | for ( int x = 0; x < image.width(); x++ ) | 437 | for ( int x = 0; x < image.width(); x++ ) |
439 | { | 438 | { |
440 | scale = 1.0 * x / image.width(); | 439 | scale = 1.0 * x / image.width(); |
441 | col.setRgb( color1.red() + int(redDiff*scale), | 440 | col.setRgb( color1.red() + int(redDiff*scale), |
442 | color1.green() + int(greenDiff*scale), | 441 | color1.green() + int(greenDiff*scale), |
443 | color1.blue() + int(blueDiff*scale) ); | 442 | color1.blue() + int(blueDiff*scale) ); |
444 | *p++ = col.rgb(); | 443 | *p++ = col.rgb(); |
445 | } | 444 | } |
446 | 445 | ||
447 | for ( int y = 1; y < image.height(); y++ ) | 446 | for ( int y = 1; y < image.height(); y++ ) |
448 | memcpy( image.scanLine( y ), image.scanLine( y - 1), | 447 | memcpy( image.scanLine( y ), image.scanLine( y - 1), |
449 | sizeof( unsigned int ) * image.width() ); | 448 | sizeof( unsigned int ) * image.width() ); |
450 | } | 449 | } |
451 | 450 | ||
452 | QColor ditherPalette[8]; | 451 | QColor ditherPalette[8]; |
453 | 452 | ||
454 | for ( int s = 0; s < 8; s++ ) | 453 | for ( int s = 0; s < 8; s++ ) |
455 | ditherPalette[s].setRgb( color1.red() + redDiff * s / 8, | 454 | ditherPalette[s].setRgb( color1.red() + redDiff * s / 8, |
456 | color1.green() + greenDiff * s / 8, | 455 | color1.green() + greenDiff * s / 8, |
457 | color1.blue() + blueDiff * s / 8 ); | 456 | color1.blue() + blueDiff * s / 8 ); |
458 | 457 | ||
459 | OImageEffect::dither( image, ditherPalette, 8 ); | 458 | OImageEffect::dither( image, ditherPalette, 8 ); |
460 | 459 | ||
461 | QPixmap p; | 460 | QPixmap p; |
462 | p.convertFromImage( image ); | 461 | p.convertFromImage( image ); |
463 | 462 | ||
464 | painter->drawPixmap( contentsRect().x(), contentsRect().y(), p ); | 463 | painter->drawPixmap( contentsRect().x(), contentsRect().y(), p ); |
465 | 464 | ||
466 | if ( orientation() == Vertical ) | 465 | if ( orientation() == Vertical ) |
467 | { | 466 | { |
468 | int yPos = contentsRect().top() + painter->fontMetrics().ascent() + 2; | 467 | int yPos = contentsRect().top() + painter->fontMetrics().ascent() + 2; |
469 | int xPos = contentsRect().left() + (contentsRect().width() - | 468 | int xPos = contentsRect().left() + (contentsRect().width() - |
470 | painter->fontMetrics().width( text2 )) / 2; | 469 | painter->fontMetrics().width( text2 )) / 2; |
471 | QPen pen( color2 ); | 470 | QPen pen( color2 ); |
472 | painter->setPen( pen ); | 471 | painter->setPen( pen ); |
473 | painter->drawText( xPos, yPos, text2 ); | 472 | painter->drawText( xPos, yPos, text2 ); |
474 | 473 | ||
475 | yPos = contentsRect().bottom() - painter->fontMetrics().descent() - 2; | 474 | yPos = contentsRect().bottom() - painter->fontMetrics().descent() - 2; |
476 | xPos = contentsRect().left() + (contentsRect().width() - | 475 | xPos = contentsRect().left() + (contentsRect().width() - |
477 | painter->fontMetrics().width( text1 )) / 2; | 476 | painter->fontMetrics().width( text1 )) / 2; |
478 | pen.setColor( color1 ); | 477 | pen.setColor( color1 ); |
479 | painter->setPen( pen ); | 478 | painter->setPen( pen ); |
480 | painter->drawText( xPos, yPos, text1 ); | 479 | painter->drawText( xPos, yPos, text1 ); |
481 | } | 480 | } |
482 | else | 481 | else |
483 | { | 482 | { |
484 | int yPos = contentsRect().bottom()-painter->fontMetrics().descent()-2; | 483 | int yPos = contentsRect().bottom()-painter->fontMetrics().descent()-2; |
485 | 484 | ||
486 | QPen pen( color2 ); | 485 | QPen pen( color2 ); |
487 | painter->setPen( pen ); | 486 | painter->setPen( pen ); |
488 | painter->drawText( contentsRect().left() + 2, yPos, text1 ); | 487 | painter->drawText( contentsRect().left() + 2, yPos, text1 ); |
489 | 488 | ||
490 | pen.setColor( color1 ); | 489 | pen.setColor( color1 ); |
491 | painter->setPen( pen ); | 490 | painter->setPen( pen ); |
492 | painter->drawText( contentsRect().right() - | 491 | painter->drawText( contentsRect().right() - |
493 | painter->fontMetrics().width( text2 ) - 2, yPos, text2 ); | 492 | painter->fontMetrics().width( text2 ) - 2, yPos, text2 ); |
494 | } | 493 | } |
495 | } | 494 | } |
496 | 495 | ||
497 | //----------------------------------------------------------------------------- | 496 | //----------------------------------------------------------------------------- |
498 | 497 | ||
499 | static QColor *standardPalette = 0; | 498 | static QColor *standardPalette = 0; |
500 | 499 | ||
501 | #define STANDARD_PAL_SIZE 17 | 500 | #define STANDARD_PAL_SIZE 17 |
502 | 501 | ||
503 | OColor::OColor() | 502 | OColor::OColor() |
504 | : QColor() | 503 | : QColor() |
505 | { | 504 | { |
506 | r = 0; g = 0; b = 0; h = 0; s = 0; v = 0; | 505 | r = 0; g = 0; b = 0; h = 0; s = 0; v = 0; |
507 | }; | 506 | }; |
508 | 507 | ||
509 | OColor::OColor( const OColor &col) | 508 | OColor::OColor( const OColor &col) |
510 | : QColor( col ) | 509 | : QColor( col ) |
511 | { | 510 | { |
512 | h = col.h; s = col.s; v = col.v; | 511 | h = col.h; s = col.s; v = col.v; |
513 | r = col.r; g = col.g; b = col.b; | 512 | r = col.r; g = col.g; b = col.b; |
514 | }; | 513 | }; |
515 | 514 | ||
516 | OColor::OColor( const QColor &col) | 515 | OColor::OColor( const QColor &col) |
517 | : QColor( col ) | 516 | : QColor( col ) |
518 | { | 517 | { |
519 | QColor::rgb(&r, &g, &b); | 518 | QColor::rgb(&r, &g, &b); |
520 | QColor::hsv(&h, &s, &v); | 519 | QColor::hsv(&h, &s, &v); |
521 | }; | 520 | }; |
522 | 521 | ||
523 | bool OColor::operator==(const OColor& col) const | 522 | bool OColor::operator==(const OColor& col) const |
524 | { | 523 | { |
525 | return (h == col.h) && (s == col.s) && (v == col.v) && | 524 | return (h == col.h) && (s == col.s) && (v == col.v) && |
526 | (r == col.r) && (g == col.g) && (b == col.b); | 525 | (r == col.r) && (g == col.g) && (b == col.b); |
527 | } | 526 | } |
528 | 527 | ||
529 | OColor& OColor::operator=(const OColor& col) | 528 | OColor& OColor::operator=(const OColor& col) |
530 | { | 529 | { |
531 | *(QColor *)this = col; | 530 | *(QColor *)this = col; |
532 | h = col.h; s = col.s; v = col.v; | 531 | h = col.h; s = col.s; v = col.v; |
533 | r = col.r; g = col.g; b = col.b; | 532 | r = col.r; g = col.g; b = col.b; |
534 | return *this; | 533 | return *this; |
535 | } | 534 | } |
536 | 535 | ||
537 | void | 536 | void |
538 | OColor::setHsv(int _h, int _s, int _v) | 537 | OColor::setHsv(int _h, int _s, int _v) |
539 | { | 538 | { |
540 | h = _h; s = _s; v = _v; | 539 | h = _h; s = _s; v = _v; |
541 | QColor::setHsv(h, s, v); | 540 | QColor::setHsv(h, s, v); |
542 | QColor::rgb(&r, &g, &b); | 541 | QColor::rgb(&r, &g, &b); |
543 | }; | 542 | }; |
544 | 543 | ||
545 | void | 544 | void |
546 | OColor::setRgb(int _r, int _g, int _b) | 545 | OColor::setRgb(int _r, int _g, int _b) |
547 | { | 546 | { |
548 | r = _r; g = _g; b = _b; | 547 | r = _r; g = _g; b = _b; |
549 | QColor::setRgb(r, g, b); | 548 | QColor::setRgb(r, g, b); |
550 | QColor::hsv(&h, &s, &v); | 549 | QColor::hsv(&h, &s, &v); |
551 | } | 550 | } |
552 | 551 | ||
553 | void | 552 | void |
554 | OColor::rgb(int *_r, int *_g, int *_b) const | 553 | OColor::rgb(int *_r, int *_g, int *_b) const |
555 | { | 554 | { |
556 | *_r = r; *_g = g; *_b = b; | 555 | *_r = r; *_g = g; *_b = b; |
557 | } | 556 | } |
558 | 557 | ||
559 | void | 558 | void |
560 | OColor::hsv(int *_h, int *_s, int *_v) const | 559 | OColor::hsv(int *_h, int *_s, int *_v) const |
561 | { | 560 | { |
562 | *_h = h; *_s = s; *_v = v; | 561 | *_h = h; *_s = s; *_v = v; |
563 | } | 562 | } |
564 | 563 | ||
565 | static void createStandardPalette() | 564 | static void createStandardPalette() |
566 | { | 565 | { |
567 | if ( standardPalette ) | 566 | if ( standardPalette ) |
568 | return; | 567 | return; |
569 | 568 | ||
570 | standardPalette = new QColor[STANDARD_PAL_SIZE]; | 569 | standardPalette = new QColor[STANDARD_PAL_SIZE]; |
571 | 570 | ||
572 | int i = 0; | 571 | int i = 0; |
573 | 572 | ||
574 | standardPalette[i++] = Qt::red; | 573 | standardPalette[i++] = Qt::red; |
575 | standardPalette[i++] = Qt::green; | 574 | standardPalette[i++] = Qt::green; |
576 | standardPalette[i++] = Qt::blue; | 575 | standardPalette[i++] = Qt::blue; |
577 | standardPalette[i++] = Qt::cyan; | 576 | standardPalette[i++] = Qt::cyan; |
578 | standardPalette[i++] = Qt::magenta; | 577 | standardPalette[i++] = Qt::magenta; |
579 | standardPalette[i++] = Qt::yellow; | 578 | standardPalette[i++] = Qt::yellow; |
580 | standardPalette[i++] = Qt::darkRed; | 579 | standardPalette[i++] = Qt::darkRed; |
581 | standardPalette[i++] = Qt::darkGreen; | 580 | standardPalette[i++] = Qt::darkGreen; |
582 | standardPalette[i++] = Qt::darkBlue; | 581 | standardPalette[i++] = Qt::darkBlue; |
583 | standardPalette[i++] = Qt::darkCyan; | 582 | standardPalette[i++] = Qt::darkCyan; |
584 | standardPalette[i++] = Qt::darkMagenta; | 583 | standardPalette[i++] = Qt::darkMagenta; |
585 | standardPalette[i++] = Qt::darkYellow; | 584 | standardPalette[i++] = Qt::darkYellow; |
586 | standardPalette[i++] = Qt::white; | 585 | standardPalette[i++] = Qt::white; |
587 | standardPalette[i++] = Qt::lightGray; | 586 | standardPalette[i++] = Qt::lightGray; |
588 | standardPalette[i++] = Qt::gray; | 587 | standardPalette[i++] = Qt::gray; |
589 | standardPalette[i++] = Qt::darkGray; | 588 | standardPalette[i++] = Qt::darkGray; |
590 | standardPalette[i++] = Qt::black; | 589 | standardPalette[i++] = Qt::black; |
591 | } | 590 | } |
592 | 591 | ||
593 | 592 | ||
594 | OHSSelector::OHSSelector( QWidget *parent, const char *name ) | 593 | OHSSelector::OHSSelector( QWidget *parent, const char *name ) |
595 | : OXYSelector( parent, name ) | 594 | : OXYSelector( parent, name ) |
596 | { | 595 | { |
597 | setRange( 0, 0, 359, 255 ); | 596 | setRange( 0, 0, 359, 255 ); |
598 | } | 597 | } |
599 | 598 | ||
600 | void OHSSelector::updateContents() | 599 | void OHSSelector::updateContents() |
601 | { | 600 | { |
602 | drawPalette(&pixmap); | 601 | drawPalette(&pixmap); |
603 | } | 602 | } |
604 | 603 | ||
605 | void OHSSelector::resizeEvent( QResizeEvent * ) | 604 | void OHSSelector::resizeEvent( QResizeEvent * ) |
606 | { | 605 | { |
607 | updateContents(); | 606 | updateContents(); |
608 | } | 607 | } |
609 | 608 | ||
610 | void OHSSelector::drawContents( QPainter *painter ) | 609 | void OHSSelector::drawContents( QPainter *painter ) |
611 | { | 610 | { |
612 | painter->drawPixmap( contentsRect().x(), contentsRect().y(), pixmap ); | 611 | painter->drawPixmap( contentsRect().x(), contentsRect().y(), pixmap ); |
613 | } | 612 | } |
614 | 613 | ||
615 | void OHSSelector::drawPalette( QPixmap *pixmap ) | 614 | void OHSSelector::drawPalette( QPixmap *pixmap ) |
616 | { | 615 | { |
617 | int xSize = contentsRect().width(), ySize = contentsRect().height(); | 616 | int xSize = contentsRect().width(), ySize = contentsRect().height(); |
618 | QImage image( xSize, ySize, 32 ); | 617 | QImage image( xSize, ySize, 32 ); |
619 | QColor col; | 618 | QColor col; |
620 | int h, s; | 619 | int h, s; |
621 | uint *p; | 620 | uint *p; |
622 | 621 | ||
623 | for ( s = ySize-1; s >= 0; s-- ) | 622 | for ( s = ySize-1; s >= 0; s-- ) |
624 | { | 623 | { |
625 | p = (uint *) image.scanLine( ySize - s - 1 ); | 624 | p = (uint *) image.scanLine( ySize - s - 1 ); |
626 | for( h = 0; h < xSize; h++ ) | 625 | for( h = 0; h < xSize; h++ ) |
627 | { | 626 | { |
628 | col.setHsv( 359*h/(xSize-1), 255*s/(ySize-1), 192 ); | 627 | col.setHsv( 359*h/(xSize-1), 255*s/(ySize-1), 192 ); |
629 | *p = col.rgb(); | 628 | *p = col.rgb(); |
630 | p++; | 629 | p++; |
631 | } | 630 | } |
632 | } | 631 | } |
633 | 632 | ||
634 | if ( QColor::numBitPlanes() <= 8 ) | 633 | if ( QColor::numBitPlanes() <= 8 ) |
635 | { | 634 | { |
636 | createStandardPalette(); | 635 | createStandardPalette(); |
637 | OImageEffect::dither( image, standardPalette, STANDARD_PAL_SIZE ); | 636 | OImageEffect::dither( image, standardPalette, STANDARD_PAL_SIZE ); |
638 | } | 637 | } |
639 | pixmap->convertFromImage( image ); | 638 | pixmap->convertFromImage( image ); |
640 | } | 639 | } |
641 | 640 | ||
642 | 641 | ||
643 | //----------------------------------------------------------------------------- | 642 | //----------------------------------------------------------------------------- |
644 | 643 | ||
645 | OValueSelector::OValueSelector( QWidget *parent, const char *name ) | 644 | OValueSelector::OValueSelector( QWidget *parent, const char *name ) |
646 | : OSelector( OSelector::Vertical, parent, name ), _hue(0), _sat(0) | 645 | : OSelector( OSelector::Vertical, parent, name ), _hue(0), _sat(0) |
647 | { | 646 | { |
648 | setRange( 0, 255 ); | 647 | setRange( 0, 255 ); |
649 | pixmap.setOptimization( QPixmap::BestOptim ); | 648 | pixmap.setOptimization( QPixmap::BestOptim ); |
650 | } | 649 | } |
651 | 650 | ||
652 | OValueSelector::OValueSelector(Orientation o, QWidget *parent, const char *name | 651 | OValueSelector::OValueSelector(Orientation o, QWidget *parent, const char *name |
653 | ) | 652 | ) |
654 | : OSelector( o, parent, name), _hue(0), _sat(0) | 653 | : OSelector( o, parent, name), _hue(0), _sat(0) |
655 | { | 654 | { |
656 | setRange( 0, 255 ); | 655 | setRange( 0, 255 ); |
657 | pixmap.setOptimization( QPixmap::BestOptim ); | 656 | pixmap.setOptimization( QPixmap::BestOptim ); |
658 | } | 657 | } |
659 | 658 | ||
660 | void OValueSelector::updateContents() | 659 | void OValueSelector::updateContents() |
661 | { | 660 | { |
662 | drawPalette(&pixmap); | 661 | drawPalette(&pixmap); |
663 | } | 662 | } |
664 | 663 | ||
665 | void OValueSelector::resizeEvent( QResizeEvent * ) | 664 | void OValueSelector::resizeEvent( QResizeEvent * ) |
666 | { | 665 | { |
667 | updateContents(); | 666 | updateContents(); |
668 | } | 667 | } |
669 | 668 | ||
670 | void OValueSelector::drawContents( QPainter *painter ) | 669 | void OValueSelector::drawContents( QPainter *painter ) |
671 | { | 670 | { |
672 | painter->drawPixmap( contentsRect().x(), contentsRect().y(), pixmap ); | 671 | painter->drawPixmap( contentsRect().x(), contentsRect().y(), pixmap ); |
673 | } | 672 | } |
674 | 673 | ||
675 | void OValueSelector::drawPalette( QPixmap *pixmap ) | 674 | void OValueSelector::drawPalette( QPixmap *pixmap ) |
676 | { | 675 | { |
677 | int xSize = contentsRect().width(), ySize = contentsRect().height(); | 676 | int xSize = contentsRect().width(), ySize = contentsRect().height(); |
678 | QImage image( xSize, ySize, 32 ); | 677 | QImage image( xSize, ySize, 32 ); |
679 | QColor col; | 678 | QColor col; |
680 | uint *p; | 679 | uint *p; |
681 | QRgb rgb; | 680 | QRgb rgb; |
682 | 681 | ||
683 | if ( orientation() == OSelector::Horizontal ) | 682 | if ( orientation() == OSelector::Horizontal ) |
684 | { | 683 | { |
685 | for ( int v = 0; v < ySize; v++ ) | 684 | for ( int v = 0; v < ySize; v++ ) |
686 | { | 685 | { |
687 | p = (uint *) image.scanLine( ySize - v - 1 ); | 686 | p = (uint *) image.scanLine( ySize - v - 1 ); |
688 | 687 | ||
689 | for( int x = 0; x < xSize; x++ ) | 688 | for( int x = 0; x < xSize; x++ ) |
690 | { | 689 | { |
691 | col.setHsv( _hue, _sat, 255*x/(xSize-1) ); | 690 | col.setHsv( _hue, _sat, 255*x/(xSize-1) ); |
692 | rgb = col.rgb(); | 691 | rgb = col.rgb(); |
693 | *p++ = rgb; | 692 | *p++ = rgb; |
694 | } | 693 | } |
695 | } | 694 | } |
696 | } | 695 | } |
697 | 696 | ||
698 | if( orientation() == OSelector::Vertical ) | 697 | if( orientation() == OSelector::Vertical ) |
699 | { | 698 | { |
700 | for ( int v = 0; v < ySize; v++ ) | 699 | for ( int v = 0; v < ySize; v++ ) |
701 | { | 700 | { |
702 | p = (uint *) image.scanLine( ySize - v - 1 ); | 701 | p = (uint *) image.scanLine( ySize - v - 1 ); |
703 | col.setHsv( _hue, _sat, 255*v/(ySize-1) ); | 702 | col.setHsv( _hue, _sat, 255*v/(ySize-1) ); |
704 | rgb = col.rgb(); | 703 | rgb = col.rgb(); |
705 | for ( int i = 0; i < xSize; i++ ) | 704 | for ( int i = 0; i < xSize; i++ ) |
706 | *p++ = rgb; | 705 | *p++ = rgb; |
707 | } | 706 | } |
708 | } | 707 | } |
709 | 708 | ||
710 | if ( QColor::numBitPlanes() <= 8 ) | 709 | if ( QColor::numBitPlanes() <= 8 ) |
711 | { | 710 | { |
712 | createStandardPalette(); | 711 | createStandardPalette(); |
713 | OImageEffect::dither( image, standardPalette, STANDARD_PAL_SIZE ); | 712 | OImageEffect::dither( image, standardPalette, STANDARD_PAL_SIZE ); |
714 | } | 713 | } |
715 | pixmap->convertFromImage( image ); | 714 | pixmap->convertFromImage( image ); |
716 | } | 715 | } |
diff --git a/libopie2/opieui/oseparator.cpp b/libopie2/opieui/oseparator.cpp index 98d42c7..b93c225 100644 --- a/libopie2/opieui/oseparator.cpp +++ b/libopie2/opieui/oseparator.cpp | |||
@@ -1,128 +1,127 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> | 3 | Copyright (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> |
4 | Copyright (C) 1997 Michael Roth <mroth@wirlweb.de> | 4 | Copyright (C) 1997 Michael Roth <mroth@wirlweb.de> |
5 | =. | 5 | =. |
6 | .=l. | 6 | .=l. |
7 | .>+-= | 7 | .>+-= |
8 | _;:, .> :=|. This program is free software; you can | 8 | _;:, .> :=|. This program is free software; you can |
9 | .> <`_, > . <= redistribute it and/or modify it under | 9 | .> <`_, > . <= redistribute it and/or modify it under |
10 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 10 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
11 | .="- .-=="i, .._ License as published by the Free Software | 11 | .="- .-=="i, .._ License as published by the Free Software |
12 | - . .-<_> .<> Foundation; either version 2 of the License, | 12 | - . .-<_> .<> Foundation; either version 2 of the License, |
13 | ._= =} : or (at your option) any later version. | 13 | ._= =} : or (at your option) any later version. |
14 | .%`+i> _;_. | 14 | .%`+i> _;_. |
15 | .i_,=:_. -<s. This program is distributed in the hope that | 15 | .i_,=:_. -<s. This program is distributed in the hope that |
16 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 16 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
17 | : .. .:, . . . without even the implied warranty of | 17 | : .. .:, . . . without even the implied warranty of |
18 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 18 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
19 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 19 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
20 | ..}^=.= = ; Library General Public License for more | 20 | ..}^=.= = ; Library General Public License for more |
21 | ++= -. .` .: details. | 21 | ++= -. .` .: details. |
22 | : = ...= . :.=- | 22 | : = ...= . :.=- |
23 | -. .:....=;==+<; You should have received a copy of the GNU | 23 | -. .:....=;==+<; You should have received a copy of the GNU |
24 | -_. . . )=. = Library General Public License along with | 24 | -_. . . )=. = Library General Public License along with |
25 | -- :-=` this library; see the file COPYING.LIB. | 25 | -- :-=` this library; see the file COPYING.LIB. |
26 | If not, write to the Free Software Foundation, | 26 | If not, write to the Free Software Foundation, |
27 | Inc., 59 Temple Place - Suite 330, | 27 | Inc., 59 Temple Place - Suite 330, |
28 | Boston, MA 02111-1307, USA. | 28 | Boston, MA 02111-1307, USA. |
29 | 29 | ||
30 | */ | 30 | */ |
31 | 31 | ||
32 | /* OPIE */ | 32 | /* OPIE */ |
33 | 33 | ||
34 | #include <opie2/odebug.h> | 34 | #include <opie2/odebug.h> |
35 | #include <opie2/oseparator.h> | 35 | #include <opie2/oseparator.h> |
36 | 36 | ||
37 | /* QT */ | 37 | /* QT */ |
38 | 38 | ||
39 | #include <qstyle.h> | ||
40 | 39 | ||
41 | OSeparator::OSeparator(QWidget* parent, const char* name, WFlags f) | 40 | OSeparator::OSeparator(QWidget* parent, const char* name, WFlags f) |
42 | : QFrame(parent, name, f) | 41 | : QFrame(parent, name, f) |
43 | { | 42 | { |
44 | setLineWidth(1); | 43 | setLineWidth(1); |
45 | setMidLineWidth(0); | 44 | setMidLineWidth(0); |
46 | setOrientation( HLine ); | 45 | setOrientation( HLine ); |
47 | } | 46 | } |
48 | 47 | ||
49 | 48 | ||
50 | 49 | ||
51 | OSeparator::OSeparator(int orientation, QWidget* parent, const char* name, WFlags f) | 50 | OSeparator::OSeparator(int orientation, QWidget* parent, const char* name, WFlags f) |
52 | : QFrame(parent, name, f) | 51 | : QFrame(parent, name, f) |
53 | { | 52 | { |
54 | setLineWidth(1); | 53 | setLineWidth(1); |
55 | setMidLineWidth(0); | 54 | setMidLineWidth(0); |
56 | setOrientation( orientation ); | 55 | setOrientation( orientation ); |
57 | } | 56 | } |
58 | 57 | ||
59 | 58 | ||
60 | 59 | ||
61 | void OSeparator::setOrientation(int orientation) | 60 | void OSeparator::setOrientation(int orientation) |
62 | { | 61 | { |
63 | switch(orientation) | 62 | switch(orientation) |
64 | { | 63 | { |
65 | case Vertical: | 64 | case Vertical: |
66 | case VLine: | 65 | case VLine: |
67 | setFrameStyle( QFrame::VLine | QFrame::Sunken ); | 66 | setFrameStyle( QFrame::VLine | QFrame::Sunken ); |
68 | setMinimumSize(2, 0); | 67 | setMinimumSize(2, 0); |
69 | break; | 68 | break; |
70 | 69 | ||
71 | default: | 70 | default: |
72 | owarn << "OSeparator::setOrientation(): invalid orientation, using default orientation HLine" << oendl; | 71 | owarn << "OSeparator::setOrientation(): invalid orientation, using default orientation HLine" << oendl; |
73 | 72 | ||
74 | case Horizontal: | 73 | case Horizontal: |
75 | case HLine: | 74 | case HLine: |
76 | setFrameStyle( QFrame::HLine | QFrame::Sunken ); | 75 | setFrameStyle( QFrame::HLine | QFrame::Sunken ); |
77 | setMinimumSize(0, 2); | 76 | setMinimumSize(0, 2); |
78 | break; | 77 | break; |
79 | } | 78 | } |
80 | } | 79 | } |
81 | 80 | ||
82 | 81 | ||
83 | 82 | ||
84 | int OSeparator::orientation() const | 83 | int OSeparator::orientation() const |
85 | { | 84 | { |
86 | if ( frameStyle() & VLine ) | 85 | if ( frameStyle() & VLine ) |
87 | return VLine; | 86 | return VLine; |
88 | 87 | ||
89 | if ( frameStyle() & HLine ) | 88 | if ( frameStyle() & HLine ) |
90 | return HLine; | 89 | return HLine; |
91 | 90 | ||
92 | return 0; | 91 | return 0; |
93 | } | 92 | } |
94 | 93 | ||
95 | void OSeparator::drawFrame(QPainter *p) | 94 | void OSeparator::drawFrame(QPainter *p) |
96 | { | 95 | { |
97 | QPointp1, p2; | 96 | QPointp1, p2; |
98 | QRectr = frameRect(); | 97 | QRectr = frameRect(); |
99 | const QColorGroup & g = colorGroup(); | 98 | const QColorGroup & g = colorGroup(); |
100 | 99 | ||
101 | if ( frameStyle() & HLine ) { | 100 | if ( frameStyle() & HLine ) { |
102 | p1 = QPoint( r.x(), r.height()/2 ); | 101 | p1 = QPoint( r.x(), r.height()/2 ); |
103 | p2 = QPoint( r.x()+r.width(), p1.y() ); | 102 | p2 = QPoint( r.x()+r.width(), p1.y() ); |
104 | } | 103 | } |
105 | else { | 104 | else { |
106 | p1 = QPoint( r.x()+r.width()/2, 0 ); | 105 | p1 = QPoint( r.x()+r.width()/2, 0 ); |
107 | p2 = QPoint( p1.x(), r.height() ); | 106 | p2 = QPoint( p1.x(), r.height() ); |
108 | } | 107 | } |
109 | 108 | ||
110 | #if QT_VERSION < 300 | 109 | #if QT_VERSION < 300 |
111 | style().drawSeparator( p, p1.x(), p1.y(), p2.x(), p2.y(), g, true, 1, midLineWidth() ); | 110 | style().drawSeparator( p, p1.x(), p1.y(), p2.x(), p2.y(), g, true, 1, midLineWidth() ); |
112 | #else | 111 | #else |
113 | QStyleOption opt( lineWidth(), midLineWidth() ); | 112 | QStyleOption opt( lineWidth(), midLineWidth() ); |
114 | style().drawPrimitive( QStyle::PE_Separator, p, QRect( p1, p2 ), g, QStyle::Style_Sunken, opt ); | 113 | style().drawPrimitive( QStyle::PE_Separator, p, QRect( p1, p2 ), g, QStyle::Style_Sunken, opt ); |
115 | #endif | 114 | #endif |
116 | } | 115 | } |
117 | 116 | ||
118 | 117 | ||
119 | QSize OSeparator::sizeHint() const | 118 | QSize OSeparator::sizeHint() const |
120 | { | 119 | { |
121 | if ( frameStyle() & VLine ) | 120 | if ( frameStyle() & VLine ) |
122 | return QSize(2, 0); | 121 | return QSize(2, 0); |
123 | 122 | ||
124 | if ( frameStyle() & HLine ) | 123 | if ( frameStyle() & HLine ) |
125 | return QSize(0, 2); | 124 | return QSize(0, 2); |
126 | 125 | ||
127 | return QSize(-1, -1); | 126 | return QSize(-1, -1); |
128 | } | 127 | } |
diff --git a/libopie2/opieui/otimepicker.cpp b/libopie2/opieui/otimepicker.cpp index 9f9f2c2..d4712a4 100644 --- a/libopie2/opieui/otimepicker.cpp +++ b/libopie2/opieui/otimepicker.cpp | |||
@@ -1,295 +1,292 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) Stefan Eilers <eilers.stefan@epost.de> | 3 | Copyright (C) Stefan Eilers <eilers.stefan@epost.de> |
4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> | 4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> |
5 | .=l. | 5 | .=l. |
6 | .>+-= | 6 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 7 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 8 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 11 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 12 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | /* QT */ | 30 | /* QT */ |
31 | #include <qbuttongroup.h> | ||
32 | #include <qlayout.h> | 31 | #include <qlayout.h> |
33 | #include <qlineedit.h> | 32 | #include <qlineedit.h> |
34 | #include <qstring.h> | ||
35 | #include <qtoolbutton.h> | ||
36 | 33 | ||
37 | /* OPIE */ | 34 | /* OPIE */ |
38 | #include <opie2/otimepicker.h> | 35 | #include <opie2/otimepicker.h> |
39 | 36 | ||
40 | using namespace Opie; | 37 | using namespace Opie; |
41 | 38 | ||
42 | /** | 39 | /** |
43 | * Constructs the widget | 40 | * Constructs the widget |
44 | * @param parent The parent of the OTimePicker | 41 | * @param parent The parent of the OTimePicker |
45 | * @param name The name of the object | 42 | * @param name The name of the object |
46 | * @param fl Window Flags | 43 | * @param fl Window Flags |
47 | */ | 44 | */ |
48 | OTimePicker::OTimePicker(QWidget* parent, const char* name, Qt::WFlags fl) | 45 | OTimePicker::OTimePicker(QWidget* parent, const char* name, Qt::WFlags fl) |
49 | :QWidget(parent,name,fl) | 46 | :QWidget(parent,name,fl) |
50 | { | 47 | { |
51 | QVBoxLayout *vbox=new QVBoxLayout(this); | 48 | QVBoxLayout *vbox=new QVBoxLayout(this); |
52 | 49 | ||
53 | OClickableLabel *r; | 50 | OClickableLabel *r; |
54 | QString s; | 51 | QString s; |
55 | 52 | ||
56 | // Hour Row | 53 | // Hour Row |
57 | QWidget *row=new QWidget(this); | 54 | QWidget *row=new QWidget(this); |
58 | QHBoxLayout *l=new QHBoxLayout(row); | 55 | QHBoxLayout *l=new QHBoxLayout(row); |
59 | vbox->addWidget(row); | 56 | vbox->addWidget(row); |
60 | 57 | ||
61 | for (int i=0; i<24; i++) | 58 | for (int i=0; i<24; i++) |
62 | { | 59 | { |
63 | r=new OClickableLabel(row); | 60 | r=new OClickableLabel(row); |
64 | hourLst.append(r); | 61 | hourLst.append(r); |
65 | s.sprintf("%.2d",i); | 62 | s.sprintf("%.2d",i); |
66 | r->setText(s); | 63 | r->setText(s); |
67 | r->setToggleButton(true); | 64 | r->setToggleButton(true); |
68 | r->setAlignment(AlignHCenter | AlignVCenter); | 65 | r->setAlignment(AlignHCenter | AlignVCenter); |
69 | l->addWidget(r); | 66 | l->addWidget(r); |
70 | connect(r, SIGNAL(toggled(bool)), | 67 | connect(r, SIGNAL(toggled(bool)), |
71 | this, SLOT(slotHour(bool))); | 68 | this, SLOT(slotHour(bool))); |
72 | 69 | ||
73 | if (i==11) | 70 | if (i==11) |
74 | { // Second row | 71 | { // Second row |
75 | row=new QWidget(this); | 72 | row=new QWidget(this); |
76 | l=new QHBoxLayout(row); | 73 | l=new QHBoxLayout(row); |
77 | vbox->addWidget(row); | 74 | vbox->addWidget(row); |
78 | } | 75 | } |
79 | } | 76 | } |
80 | 77 | ||
81 | // Minute Row | 78 | // Minute Row |
82 | row=new QWidget(this); | 79 | row=new QWidget(this); |
83 | l=new QHBoxLayout(row); | 80 | l=new QHBoxLayout(row); |
84 | vbox->addWidget(row); | 81 | vbox->addWidget(row); |
85 | 82 | ||
86 | for (int i=0; i<60; i+=5) | 83 | for (int i=0; i<60; i+=5) |
87 | { | 84 | { |
88 | r=new OClickableLabel(row); | 85 | r=new OClickableLabel(row); |
89 | minuteLst.append(r); | 86 | minuteLst.append(r); |
90 | s.sprintf("%.2d",i); | 87 | s.sprintf("%.2d",i); |
91 | r->setText(s); | 88 | r->setText(s); |
92 | r->setToggleButton(true); | 89 | r->setToggleButton(true); |
93 | r->setAlignment(AlignHCenter | AlignVCenter); | 90 | r->setAlignment(AlignHCenter | AlignVCenter); |
94 | l->addWidget(r); | 91 | l->addWidget(r); |
95 | connect(r, SIGNAL(toggled(bool)), | 92 | connect(r, SIGNAL(toggled(bool)), |
96 | this, SLOT(slotMinute(bool))); | 93 | this, SLOT(slotMinute(bool))); |
97 | } | 94 | } |
98 | } | 95 | } |
99 | 96 | ||
100 | /** | 97 | /** |
101 | * This method return the current time | 98 | * This method return the current time |
102 | * @return the time | 99 | * @return the time |
103 | */ | 100 | */ |
104 | QTime OTimePicker::time()const | 101 | QTime OTimePicker::time()const |
105 | { | 102 | { |
106 | return tm; | 103 | return tm; |
107 | } | 104 | } |
108 | 105 | ||
109 | void OTimePicker::slotHour(bool b) | 106 | void OTimePicker::slotHour(bool b) |
110 | { | 107 | { |
111 | 108 | ||
112 | OClickableLabel *r = (OClickableLabel *) sender(); | 109 | OClickableLabel *r = (OClickableLabel *) sender(); |
113 | 110 | ||
114 | if (b) | 111 | if (b) |
115 | { | 112 | { |
116 | QValueListIterator<OClickableLabel *> it; | 113 | QValueListIterator<OClickableLabel *> it; |
117 | for (it=hourLst.begin(); it!=hourLst.end(); it++) | 114 | for (it=hourLst.begin(); it!=hourLst.end(); it++) |
118 | { | 115 | { |
119 | if (*it != r) (*it)->setOn(false); | 116 | if (*it != r) (*it)->setOn(false); |
120 | else tm.setHMS((*it)->text().toInt(), tm.minute(), 0); | 117 | else tm.setHMS((*it)->text().toInt(), tm.minute(), 0); |
121 | } | 118 | } |
122 | emit timeChanged(tm); | 119 | emit timeChanged(tm); |
123 | } | 120 | } |
124 | else | 121 | else |
125 | { | 122 | { |
126 | r->setOn(true); | 123 | r->setOn(true); |
127 | } | 124 | } |
128 | 125 | ||
129 | } | 126 | } |
130 | 127 | ||
131 | void OTimePicker::slotMinute(bool b) | 128 | void OTimePicker::slotMinute(bool b) |
132 | { | 129 | { |
133 | 130 | ||
134 | OClickableLabel *r = (OClickableLabel *) sender(); | 131 | OClickableLabel *r = (OClickableLabel *) sender(); |
135 | 132 | ||
136 | if (b) | 133 | if (b) |
137 | { | 134 | { |
138 | QValueListIterator<OClickableLabel *> it; | 135 | QValueListIterator<OClickableLabel *> it; |
139 | for (it=minuteLst.begin(); it!=minuteLst.end(); it++) | 136 | for (it=minuteLst.begin(); it!=minuteLst.end(); it++) |
140 | { | 137 | { |
141 | if (*it != r) (*it)->setOn(false); | 138 | if (*it != r) (*it)->setOn(false); |
142 | else tm.setHMS(tm.hour(),(*it)->text().toInt(), 0); | 139 | else tm.setHMS(tm.hour(),(*it)->text().toInt(), 0); |
143 | } | 140 | } |
144 | emit timeChanged(tm); | 141 | emit timeChanged(tm); |
145 | } | 142 | } |
146 | else | 143 | else |
147 | { | 144 | { |
148 | r->setOn(true); | 145 | r->setOn(true); |
149 | } | 146 | } |
150 | 147 | ||
151 | } | 148 | } |
152 | 149 | ||
153 | /** | 150 | /** |
154 | * Method to set the time. No signal gets emitted during this method call | 151 | * Method to set the time. No signal gets emitted during this method call |
155 | * Minutes must be within 5 minutes step starting at 0 ( 0,5,10,15,20... ) | 152 | * Minutes must be within 5 minutes step starting at 0 ( 0,5,10,15,20... ) |
156 | * @param t The time to be set | 153 | * @param t The time to be set |
157 | */ | 154 | */ |
158 | void OTimePicker::setTime( const QTime& t) | 155 | void OTimePicker::setTime( const QTime& t) |
159 | { | 156 | { |
160 | setTime( t.hour(), t.minute() ); | 157 | setTime( t.hour(), t.minute() ); |
161 | } | 158 | } |
162 | 159 | ||
163 | /** | 160 | /** |
164 | * Method to set the time. No signal gets emitted during this method call | 161 | * Method to set the time. No signal gets emitted during this method call |
165 | * @param h The hour | 162 | * @param h The hour |
166 | * @param m The minute. Minutes need to set by 5 minute steps | 163 | * @param m The minute. Minutes need to set by 5 minute steps |
167 | */ | 164 | */ |
168 | void OTimePicker::setTime( int h, int m ) | 165 | void OTimePicker::setTime( int h, int m ) |
169 | { | 166 | { |
170 | setHour(h); | 167 | setHour(h); |
171 | setMinute(m); | 168 | setMinute(m); |
172 | } | 169 | } |
173 | 170 | ||
174 | /* | 171 | /* |
175 | * FIXME round minutes to the 5 minute arrangement -zecke | 172 | * FIXME round minutes to the 5 minute arrangement -zecke |
176 | */ | 173 | */ |
177 | /** | 174 | /** |
178 | * Method to set the minutes | 175 | * Method to set the minutes |
179 | * @param m minutes | 176 | * @param m minutes |
180 | */ | 177 | */ |
181 | void OTimePicker::setMinute(int m) | 178 | void OTimePicker::setMinute(int m) |
182 | { | 179 | { |
183 | 180 | ||
184 | QString minute; | 181 | QString minute; |
185 | minute.sprintf("%.2d",m); | 182 | minute.sprintf("%.2d",m); |
186 | 183 | ||
187 | QValueListIterator<OClickableLabel *> it; | 184 | QValueListIterator<OClickableLabel *> it; |
188 | for (it=minuteLst.begin(); it!=minuteLst.end(); it++) | 185 | for (it=minuteLst.begin(); it!=minuteLst.end(); it++) |
189 | { | 186 | { |
190 | if ((*it)->text() == minute) (*it)->setOn(true); | 187 | if ((*it)->text() == minute) (*it)->setOn(true); |
191 | else (*it)->setOn(false); | 188 | else (*it)->setOn(false); |
192 | } | 189 | } |
193 | 190 | ||
194 | tm.setHMS(tm.hour(),m,0); | 191 | tm.setHMS(tm.hour(),m,0); |
195 | } | 192 | } |
196 | 193 | ||
197 | /** | 194 | /** |
198 | * Method to set the hour | 195 | * Method to set the hour |
199 | */ | 196 | */ |
200 | void OTimePicker::setHour(int h) | 197 | void OTimePicker::setHour(int h) |
201 | { | 198 | { |
202 | 199 | ||
203 | QString hour; | 200 | QString hour; |
204 | hour.sprintf("%.2d",h); | 201 | hour.sprintf("%.2d",h); |
205 | 202 | ||
206 | QValueListIterator<OClickableLabel *> it; | 203 | QValueListIterator<OClickableLabel *> it; |
207 | for (it=hourLst.begin(); it!=hourLst.end(); it++) | 204 | for (it=hourLst.begin(); it!=hourLst.end(); it++) |
208 | { | 205 | { |
209 | if ((*it)->text() == hour) (*it)->setOn(true); | 206 | if ((*it)->text() == hour) (*it)->setOn(true); |
210 | else (*it)->setOn(false); | 207 | else (*it)->setOn(false); |
211 | } | 208 | } |
212 | tm.setHMS(h,tm.minute(),0); | 209 | tm.setHMS(h,tm.minute(),0); |
213 | } | 210 | } |
214 | 211 | ||
215 | 212 | ||
216 | /** | 213 | /** |
217 | * This is a modal Dialog. | 214 | * This is a modal Dialog. |
218 | * | 215 | * |
219 | * @param parent The parent widget | 216 | * @param parent The parent widget |
220 | * @param name The name of the object | 217 | * @param name The name of the object |
221 | * @param fl Possible window flags | 218 | * @param fl Possible window flags |
222 | */ | 219 | */ |
223 | OTimePickerDialog::OTimePickerDialog ( QWidget* parent, const char* name, WFlags fl ) | 220 | OTimePickerDialog::OTimePickerDialog ( QWidget* parent, const char* name, WFlags fl ) |
224 | : OTimePickerDialogBase (parent , name, true , fl) | 221 | : OTimePickerDialogBase (parent , name, true , fl) |
225 | { | 222 | { |
226 | 223 | ||
227 | connect ( m_timePicker, SIGNAL( timeChanged( const QTime& ) ), | 224 | connect ( m_timePicker, SIGNAL( timeChanged( const QTime& ) ), |
228 | this, SLOT( setTime ( const QTime& ) ) ); | 225 | this, SLOT( setTime ( const QTime& ) ) ); |
229 | connect ( minuteField, SIGNAL( textChanged ( const QString& ) ), | 226 | connect ( minuteField, SIGNAL( textChanged ( const QString& ) ), |
230 | this, SLOT ( setMinute ( const QString& ) ) ); | 227 | this, SLOT ( setMinute ( const QString& ) ) ); |
231 | connect ( hourField, SIGNAL( textChanged ( const QString& ) ), | 228 | connect ( hourField, SIGNAL( textChanged ( const QString& ) ), |
232 | this, SLOT ( setHour ( const QString& ) ) ); | 229 | this, SLOT ( setHour ( const QString& ) ) ); |
233 | 230 | ||
234 | } | 231 | } |
235 | 232 | ||
236 | /** | 233 | /** |
237 | * @return the time | 234 | * @return the time |
238 | */ | 235 | */ |
239 | QTime OTimePickerDialog::time()const | 236 | QTime OTimePickerDialog::time()const |
240 | { | 237 | { |
241 | return m_time; | 238 | return m_time; |
242 | } | 239 | } |
243 | 240 | ||
244 | /** | 241 | /** |
245 | * Set the time to time | 242 | * Set the time to time |
246 | * @param time The time to be set | 243 | * @param time The time to be set |
247 | */ | 244 | */ |
248 | void OTimePickerDialog::setTime( const QTime& time ) | 245 | void OTimePickerDialog::setTime( const QTime& time ) |
249 | { | 246 | { |
250 | m_time = time; | 247 | m_time = time; |
251 | 248 | ||
252 | m_timePicker->setHour ( time.hour() ); | 249 | m_timePicker->setHour ( time.hour() ); |
253 | m_timePicker->setMinute( time.minute() ); | 250 | m_timePicker->setMinute( time.minute() ); |
254 | 251 | ||
255 | // Set Textfields | 252 | // Set Textfields |
256 | if ( time.hour() < 10 ) | 253 | if ( time.hour() < 10 ) |
257 | hourField->setText( "0" + QString::number( time.hour() ) ); | 254 | hourField->setText( "0" + QString::number( time.hour() ) ); |
258 | else | 255 | else |
259 | hourField->setText( QString::number( time.hour() ) ); | 256 | hourField->setText( QString::number( time.hour() ) ); |
260 | 257 | ||
261 | if ( time.minute() < 10 ) | 258 | if ( time.minute() < 10 ) |
262 | minuteField->setText( "0" + QString::number( time.minute() ) ); | 259 | minuteField->setText( "0" + QString::number( time.minute() ) ); |
263 | else | 260 | else |
264 | minuteField->setText( QString::number( time.minute() ) ); | 261 | minuteField->setText( QString::number( time.minute() ) ); |
265 | 262 | ||
266 | } | 263 | } |
267 | 264 | ||
268 | /** | 265 | /** |
269 | * This method takes the current minute and tries to set hour | 266 | * This method takes the current minute and tries to set hour |
270 | * to hour. This succeeds if the resulting date is valid | 267 | * to hour. This succeeds if the resulting date is valid |
271 | * @param hour The hour as a string | 268 | * @param hour The hour as a string |
272 | */ | 269 | */ |
273 | void OTimePickerDialog::setHour ( const QString& hour ) | 270 | void OTimePickerDialog::setHour ( const QString& hour ) |
274 | { | 271 | { |
275 | if ( QTime::isValid ( hour.toInt(), m_time.minute() , 00 ) ) | 272 | if ( QTime::isValid ( hour.toInt(), m_time.minute() , 00 ) ) |
276 | { | 273 | { |
277 | m_time.setHMS ( hour.toInt(), m_time.minute() , 00 ); | 274 | m_time.setHMS ( hour.toInt(), m_time.minute() , 00 ); |
278 | setTime ( m_time ); | 275 | setTime ( m_time ); |
279 | } | 276 | } |
280 | 277 | ||
281 | } | 278 | } |
282 | 279 | ||
283 | /** | 280 | /** |
284 | * Method to set a new minute. It tries to convert the string to int and | 281 | * Method to set a new minute. It tries to convert the string to int and |
285 | * if the resulting date is valid a new date is set. | 282 | * if the resulting date is valid a new date is set. |
286 | * @see setHour | 283 | * @see setHour |
287 | */ | 284 | */ |
288 | void OTimePickerDialog::setMinute ( const QString& minute ) | 285 | void OTimePickerDialog::setMinute ( const QString& minute ) |
289 | { | 286 | { |
290 | if ( QTime::isValid ( m_time.hour(), minute.toInt(), 00 ) ) | 287 | if ( QTime::isValid ( m_time.hour(), minute.toInt(), 00 ) ) |
291 | { | 288 | { |
292 | m_time.setHMS ( m_time.hour(), minute.toInt(), 00 ); | 289 | m_time.setHMS ( m_time.hour(), minute.toInt(), 00 ); |
293 | setTime ( m_time ); | 290 | setTime ( m_time ); |
294 | } | 291 | } |
295 | } | 292 | } |
diff --git a/libopie2/opieui/oversatileview.cpp b/libopie2/opieui/oversatileview.cpp index 65fe3d8..8839456 100644 --- a/libopie2/opieui/oversatileview.cpp +++ b/libopie2/opieui/oversatileview.cpp | |||
@@ -1,1180 +1,1169 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | 3 | ||
4 | =. (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> | 4 | =. (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> |
5 | .=l. | 5 | .=l. |
6 | .>+-= | 6 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 7 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 8 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 11 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 12 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | 28 | ||
29 | */ | 29 | */ |
30 | 30 | ||
31 | /* OPIE */ | 31 | /* OPIE */ |
32 | 32 | ||
33 | #include <opie2/odebug.h> | 33 | #include <opie2/odebug.h> |
34 | #include <opie2/oversatileview.h> | 34 | #include <opie2/oversatileview.h> |
35 | #include <opie2/oversatileviewitem.h> | 35 | #include <opie2/oversatileviewitem.h> |
36 | #include <opie2/olistview.h> | 36 | #include <opie2/olistview.h> |
37 | 37 | ||
38 | /* QT */ | 38 | /* QT */ |
39 | 39 | ||
40 | #include <qaction.h> | 40 | #include <qaction.h> |
41 | #include <qbrush.h> | ||
42 | #include <qfont.h> | ||
43 | #include <qiconset.h> | ||
44 | #include <qiconview.h> | ||
45 | #include <qlistview.h> | ||
46 | #include <qpalette.h> | ||
47 | #include <qpoint.h> | ||
48 | #include <qpopupmenu.h> | 41 | #include <qpopupmenu.h> |
49 | #include <qrect.h> | ||
50 | #include <qsize.h> | ||
51 | #include <qstring.h> | ||
52 | #include <qwidgetstack.h> | ||
53 | 42 | ||
54 | /* XPM */ | 43 | /* XPM */ |
55 | static const char * view_icon_xpm[] = { | 44 | static const char * view_icon_xpm[] = { |
56 | "16 16 16 1", | 45 | "16 16 16 1", |
57 | " c None", | 46 | " c None", |
58 | ".c #87BD88", | 47 | ".c #87BD88", |
59 | "+c #8BBE8B", | 48 | "+c #8BBE8B", |
60 | "@c #81BA81", | 49 | "@c #81BA81", |
61 | "#c #6DAF6D", | 50 | "#c #6DAF6D", |
62 | "$c #87BD87", | 51 | "$c #87BD87", |
63 | "%c #FCFDFC", | 52 | "%c #FCFDFC", |
64 | "&c #AED0AE", | 53 | "&c #AED0AE", |
65 | "*c #4E9C4C", | 54 | "*c #4E9C4C", |
66 | "=c #91BD91", | 55 | "=c #91BD91", |
67 | "-c #72B172", | 56 | "-c #72B172", |
68 | ";c #448643", | 57 | ";c #448643", |
69 | ">c #519F50", | 58 | ">c #519F50", |
70 | ",c #499247", | 59 | ",c #499247", |
71 | "'c #356A35", | 60 | "'c #356A35", |
72 | ")c #686868", | 61 | ")c #686868", |
73 | " ", | 62 | " ", |
74 | " .+@# .+@# ", | 63 | " .+@# .+@# ", |
75 | " $%&* $%&* ", | 64 | " $%&* $%&* ", |
76 | " @=-; @=-; ", | 65 | " @=-; @=-; ", |
77 | " #>,' #>,' ", | 66 | " #>,' #>,' ", |
78 | " ", | 67 | " ", |
79 | " )))))) )))))) ", | 68 | " )))))) )))))) ", |
80 | " ", | 69 | " ", |
81 | " ", | 70 | " ", |
82 | " .+@# .+@# ", | 71 | " .+@# .+@# ", |
83 | " $%&* $%&* ", | 72 | " $%&* $%&* ", |
84 | " @=-; @=-; ", | 73 | " @=-; @=-; ", |
85 | " #>,' #>,' ", | 74 | " #>,' #>,' ", |
86 | " ", | 75 | " ", |
87 | " )))))) )))))) ", | 76 | " )))))) )))))) ", |
88 | " "}; | 77 | " "}; |
89 | 78 | ||
90 | /* XPM */ | 79 | /* XPM */ |
91 | static const char * view_tree_xpm[] = { | 80 | static const char * view_tree_xpm[] = { |
92 | "16 16 17 1", | 81 | "16 16 17 1", |
93 | " c None", | 82 | " c None", |
94 | ".c #3A3A3A", | 83 | ".c #3A3A3A", |
95 | "+c #87BD88", | 84 | "+c #87BD88", |
96 | "@c #8BBE8B", | 85 | "@c #8BBE8B", |
97 | "#c #81BA81", | 86 | "#c #81BA81", |
98 | "$c #6DAF6D", | 87 | "$c #6DAF6D", |
99 | "%c #87BD87", | 88 | "%c #87BD87", |
100 | "&c #FCFDFC", | 89 | "&c #FCFDFC", |
101 | "*c #AED0AE", | 90 | "*c #AED0AE", |
102 | "=c #4E9C4C", | 91 | "=c #4E9C4C", |
103 | "-c #91BD91", | 92 | "-c #91BD91", |
104 | ";c #72B172", | 93 | ";c #72B172", |
105 | ">c #448643", | 94 | ">c #448643", |
106 | ",c #686868", | 95 | ",c #686868", |
107 | "'c #519F50", | 96 | "'c #519F50", |
108 | ")c #499247", | 97 | ")c #499247", |
109 | "!c #356A35", | 98 | "!c #356A35", |
110 | " . ", | 99 | " . ", |
111 | " . ", | 100 | " . ", |
112 | " . +@#$ ", | 101 | " . +@#$ ", |
113 | " . %&*= ", | 102 | " . %&*= ", |
114 | " .. #-;> ,, ,,,", | 103 | " .. #-;> ,, ,,,", |
115 | " . $')! ", | 104 | " . $')! ", |
116 | " . ", | 105 | " . ", |
117 | " . ", | 106 | " . ", |
118 | " . ", | 107 | " . ", |
119 | " . +@#$ ", | 108 | " . +@#$ ", |
120 | " . %&*= ", | 109 | " . %&*= ", |
121 | " .. #-;> ,, ,,,", | 110 | " .. #-;> ,, ,,,", |
122 | " $')! ", | 111 | " $')! ", |
123 | " ", | 112 | " ", |
124 | " ", | 113 | " ", |
125 | " "}; | 114 | " "}; |
126 | 115 | ||
127 | OVersatileView::OVersatileView( QWidget* parent, const char* name, int mode ) | 116 | OVersatileView::OVersatileView( QWidget* parent, const char* name, int mode ) |
128 | :QWidgetStack( parent, name ), | 117 | :QWidgetStack( parent, name ), |
129 | _viewmode( mode ), _warningpolicy( None ), | 118 | _viewmode( mode ), _warningpolicy( None ), |
130 | _treeleaf(), _treeopened(), _treeclosed(), | 119 | _treeleaf(), _treeopened(), _treeclosed(), |
131 | _iconleaf(), _iconopened(), _iconclosed() | 120 | _iconleaf(), _iconopened(), _iconclosed() |
132 | { | 121 | { |
133 | // | 122 | // |
134 | // Create child widgets and set some reasonable default styles | 123 | // Create child widgets and set some reasonable default styles |
135 | // | 124 | // |
136 | 125 | ||
137 | _listview = new OListView( this, "oversatileview embedded listview" ); | 126 | _listview = new OListView( this, "oversatileview embedded listview" ); |
138 | _iconview = new QIconView( this, "oversatileview embedded iconview" ); | 127 | _iconview = new QIconView( this, "oversatileview embedded iconview" ); |
139 | 128 | ||
140 | _listview->setAllColumnsShowFocus( true ); | 129 | _listview->setAllColumnsShowFocus( true ); |
141 | _listview->setRootIsDecorated( true ); | 130 | _listview->setRootIsDecorated( true ); |
142 | _listview->setShowSortIndicator( true ); | 131 | _listview->setShowSortIndicator( true ); |
143 | _iconview->setGridX( 90 ); | 132 | _iconview->setGridX( 90 ); |
144 | _iconview->setGridY( 42 ); | 133 | _iconview->setGridY( 42 ); |
145 | _iconview->setAutoArrange( true ); | 134 | _iconview->setAutoArrange( true ); |
146 | 135 | ||
147 | #ifdef QWS // TODO: Let this depend on current geometry (rotation) | 136 | #ifdef QWS // TODO: Let this depend on current geometry (rotation) |
148 | _iconview->setArrangement( QIconView::TopToBottom ); | 137 | _iconview->setArrangement( QIconView::TopToBottom ); |
149 | #else | 138 | #else |
150 | _iconview->setArrangement( QIconView::LeftToRight ); | 139 | _iconview->setArrangement( QIconView::LeftToRight ); |
151 | #endif | 140 | #endif |
152 | 141 | ||
153 | _iconview->setResizeMode( QIconView::Adjust ); | 142 | _iconview->setResizeMode( QIconView::Adjust ); |
154 | 143 | ||
155 | // qt-embedded: map stylus right on hold to right button press | 144 | // qt-embedded: map stylus right on hold to right button press |
156 | 145 | ||
157 | #ifdef QWS | 146 | #ifdef QWS |
158 | ( (QPEApplication*) qApp)->setStylusOperation( _iconview->viewport(), QPEApplication::RightOnHold ); | 147 | ( (QPEApplication*) qApp)->setStylusOperation( _iconview->viewport(), QPEApplication::RightOnHold ); |
159 | ( (QPEApplication*) qApp)->setStylusOperation( _listview->viewport(), QPEApplication::RightOnHold ); | 148 | ( (QPEApplication*) qApp)->setStylusOperation( _listview->viewport(), QPEApplication::RightOnHold ); |
160 | #endif | 149 | #endif |
161 | 150 | ||
162 | setViewMode( mode ); // TODO: Read last style from config | 151 | setViewMode( mode ); // TODO: Read last style from config |
163 | // setSynchronization( true ); // TODO: Implement this | 152 | // setSynchronization( true ); // TODO: Implement this |
164 | 153 | ||
165 | // create context menu allowing to switch between the views | 154 | // create context menu allowing to switch between the views |
166 | 155 | ||
167 | _contextmenu = new QPopupMenu( 0, "oversatileview contextmenu" ); | 156 | _contextmenu = new QPopupMenu( 0, "oversatileview contextmenu" ); |
168 | _contextmenu->setCaption( "Style" ); | 157 | _contextmenu->setCaption( "Style" ); |
169 | _contextmenu->setCheckable( true ); | 158 | _contextmenu->setCheckable( true ); |
170 | QActionGroup* ag = new QActionGroup( _contextmenu, "style option group" ); | 159 | QActionGroup* ag = new QActionGroup( _contextmenu, "style option group" ); |
171 | QAction* a1 = new QAction( "View Items in Icon Style", QIconSet( QPixmap( view_icon_xpm ) ), | 160 | QAction* a1 = new QAction( "View Items in Icon Style", QIconSet( QPixmap( view_icon_xpm ) ), |
172 | "View Icons", 0, ag, "viewicon action", true ); | 161 | "View Icons", 0, ag, "viewicon action", true ); |
173 | QAction* a2 = new QAction( "View Items in Tree Style", QIconSet( QPixmap( view_tree_xpm ) ), | 162 | QAction* a2 = new QAction( "View Items in Tree Style", QIconSet( QPixmap( view_tree_xpm ) ), |
174 | "View Tree", 0, ag, "viewtree action", true ); | 163 | "View Tree", 0, ag, "viewtree action", true ); |
175 | ag->addTo( _contextmenu ); | 164 | ag->addTo( _contextmenu ); |
176 | if ( mode == Icons ) | 165 | if ( mode == Icons ) |
177 | a1->setOn( true ); | 166 | a1->setOn( true ); |
178 | else if ( mode == Tree ) | 167 | else if ( mode == Tree ) |
179 | a2->setOn( true ); | 168 | a2->setOn( true ); |
180 | connect( a1, SIGNAL( activated() ), this, SLOT( setIconViewMode() ) ); | 169 | connect( a1, SIGNAL( activated() ), this, SLOT( setIconViewMode() ) ); |
181 | connect( a2, SIGNAL( activated() ), this, SLOT( setTreeViewMode() ) ); | 170 | connect( a2, SIGNAL( activated() ), this, SLOT( setTreeViewMode() ) ); |
182 | 171 | ||
183 | #if (QT_VERSION >= 0x030000) | 172 | #if (QT_VERSION >= 0x030000) |
184 | connect( _listview, SIGNAL( contextMenuRequested( QListViewItem*, const QPoint&, int ) ), this, SLOT( contextMenuRequested( QListViewItem*, const QPoint&, int ) ) ); | 173 | connect( _listview, SIGNAL( contextMenuRequested( QListViewItem*, const QPoint&, int ) ), this, SLOT( contextMenuRequested( QListViewItem*, const QPoint&, int ) ) ); |
185 | connect( _iconview, SIGNAL( contextMenuRequested( QIconViewItem*, const QPoint& ) ), this, SLOT( contextMenuRequested( QIconViewItem*, const QPoint& ) ) ); | 174 | connect( _iconview, SIGNAL( contextMenuRequested( QIconViewItem*, const QPoint& ) ), this, SLOT( contextMenuRequested( QIconViewItem*, const QPoint& ) ) ); |
186 | #else | 175 | #else |
187 | connect( _listview, SIGNAL( rightButtonPressed( QListViewItem*, const QPoint&, int ) ), this, SLOT( contextMenuRequested( QListViewItem*, const QPoint&, int ) ) ); | 176 | connect( _listview, SIGNAL( rightButtonPressed( QListViewItem*, const QPoint&, int ) ), this, SLOT( contextMenuRequested( QListViewItem*, const QPoint&, int ) ) ); |
188 | connect( _iconview, SIGNAL( rightButtonPressed( QIconViewItem*, const QPoint& ) ), this, SLOT( contextMenuRequested( QIconViewItem*, const QPoint& ) ) ); | 177 | connect( _iconview, SIGNAL( rightButtonPressed( QIconViewItem*, const QPoint& ) ), this, SLOT( contextMenuRequested( QIconViewItem*, const QPoint& ) ) ); |
189 | #endif | 178 | #endif |
190 | 179 | ||
191 | // | 180 | // |
192 | // signal forwarders | 181 | // signal forwarders |
193 | // | 182 | // |
194 | // unfortunately we can't short-circuit all the QListView and QIconView signals | 183 | // unfortunately we can't short-circuit all the QListView and QIconView signals |
195 | // to OVersatileView signals, because the signal/slot mechanism doesn't allow | 184 | // to OVersatileView signals, because the signal/slot mechanism doesn't allow |
196 | // type-conversion :-( | 185 | // type-conversion :-( |
197 | 186 | ||
198 | // common signals for listview | 187 | // common signals for listview |
199 | 188 | ||
200 | connect( _listview, SIGNAL( selectionChanged() ), this, SIGNAL( selectionChanged() ) ); | 189 | connect( _listview, SIGNAL( selectionChanged() ), this, SIGNAL( selectionChanged() ) ); |
201 | connect( _listview, SIGNAL( selectionChanged( QListViewItem * ) ), this, SLOT( selectionChanged( QListViewItem * ) ) ); | 190 | connect( _listview, SIGNAL( selectionChanged( QListViewItem * ) ), this, SLOT( selectionChanged( QListViewItem * ) ) ); |
202 | connect( _listview, SIGNAL( currentChanged( QListViewItem * ) ), this, SLOT( currentChanged( QListViewItem * ) ) ); | 191 | connect( _listview, SIGNAL( currentChanged( QListViewItem * ) ), this, SLOT( currentChanged( QListViewItem * ) ) ); |
203 | connect( _listview, SIGNAL( clicked( QListViewItem * ) ), this, SLOT( clicked( QListViewItem * ) ) ); | 192 | connect( _listview, SIGNAL( clicked( QListViewItem * ) ), this, SLOT( clicked( QListViewItem * ) ) ); |
204 | connect( _listview, SIGNAL( pressed( QListViewItem * ) ), this, SLOT( pressed( QListViewItem * ) ) ); | 193 | connect( _listview, SIGNAL( pressed( QListViewItem * ) ), this, SLOT( pressed( QListViewItem * ) ) ); |
205 | 194 | ||
206 | connect( _listview, SIGNAL( doubleClicked( QListViewItem * ) ), this, SLOT( doubleClicked( QListViewItem * ) ) ); | 195 | connect( _listview, SIGNAL( doubleClicked( QListViewItem * ) ), this, SLOT( doubleClicked( QListViewItem * ) ) ); |
207 | connect( _listview, SIGNAL( returnPressed( QListViewItem * ) ), this, SLOT( returnPressed( QListViewItem * ) ) ); | 196 | connect( _listview, SIGNAL( returnPressed( QListViewItem * ) ), this, SLOT( returnPressed( QListViewItem * ) ) ); |
208 | 197 | ||
209 | connect( _listview, SIGNAL( onItem( QListViewItem * ) ), this, SLOT( onItem( QListViewItem * ) ) ); | 198 | connect( _listview, SIGNAL( onItem( QListViewItem * ) ), this, SLOT( onItem( QListViewItem * ) ) ); |
210 | connect( _listview, SIGNAL( onViewport() ), this, SIGNAL( onViewport() ) ); | 199 | connect( _listview, SIGNAL( onViewport() ), this, SIGNAL( onViewport() ) ); |
211 | 200 | ||
212 | // common signals for iconview | 201 | // common signals for iconview |
213 | 202 | ||
214 | connect( _iconview, SIGNAL( selectionChanged() ), this, SIGNAL( selectionChanged() ) ); | 203 | connect( _iconview, SIGNAL( selectionChanged() ), this, SIGNAL( selectionChanged() ) ); |
215 | connect( _iconview, SIGNAL( selectionChanged( QIconViewItem * ) ), this, SLOT( selectionChanged( QIconViewItem * ) ) ); | 204 | connect( _iconview, SIGNAL( selectionChanged( QIconViewItem * ) ), this, SLOT( selectionChanged( QIconViewItem * ) ) ); |
216 | connect( _iconview, SIGNAL( currentChanged( QIconViewItem * ) ), this, SLOT( currentChanged( QIconViewItem * ) ) ); | 205 | connect( _iconview, SIGNAL( currentChanged( QIconViewItem * ) ), this, SLOT( currentChanged( QIconViewItem * ) ) ); |
217 | connect( _iconview, SIGNAL( clicked( QIconViewItem * ) ), this, SLOT( clicked( QIconViewItem * ) ) ); | 206 | connect( _iconview, SIGNAL( clicked( QIconViewItem * ) ), this, SLOT( clicked( QIconViewItem * ) ) ); |
218 | connect( _iconview, SIGNAL( pressed( QIconViewItem * ) ), this, SLOT( pressed( QIconViewItem * ) ) ); | 207 | connect( _iconview, SIGNAL( pressed( QIconViewItem * ) ), this, SLOT( pressed( QIconViewItem * ) ) ); |
219 | 208 | ||
220 | connect( _iconview, SIGNAL( doubleClicked( QIconViewItem * ) ), this, SLOT( doubleClicked( QIconViewItem * ) ) ); | 209 | connect( _iconview, SIGNAL( doubleClicked( QIconViewItem * ) ), this, SLOT( doubleClicked( QIconViewItem * ) ) ); |
221 | connect( _iconview, SIGNAL( returnPressed( QIconViewItem * ) ), this, SLOT( returnPressed( QIconViewItem * ) ) ); | 210 | connect( _iconview, SIGNAL( returnPressed( QIconViewItem * ) ), this, SLOT( returnPressed( QIconViewItem * ) ) ); |
222 | 211 | ||
223 | connect( _iconview, SIGNAL( onItem( QIconViewItem * ) ), this, SLOT( onItem( QIconViewItem * ) ) ); | 212 | connect( _iconview, SIGNAL( onItem( QIconViewItem * ) ), this, SLOT( onItem( QIconViewItem * ) ) ); |
224 | connect( _iconview, SIGNAL( onViewport() ), this, SIGNAL( onViewport() ) ); | 213 | connect( _iconview, SIGNAL( onViewport() ), this, SIGNAL( onViewport() ) ); |
225 | 214 | ||
226 | // listview only signals | 215 | // listview only signals |
227 | 216 | ||
228 | connect( _listview, SIGNAL( expanded( QListViewItem * ) ), this, SLOT( expanded( QListViewItem * ) ) ); | 217 | connect( _listview, SIGNAL( expanded( QListViewItem * ) ), this, SLOT( expanded( QListViewItem * ) ) ); |
229 | connect( _listview, SIGNAL( collapsed( QListViewItem * ) ), this, SLOT( collapsed( QListViewItem * ) ) ); | 218 | connect( _listview, SIGNAL( collapsed( QListViewItem * ) ), this, SLOT( collapsed( QListViewItem * ) ) ); |
230 | 219 | ||
231 | // iconview only signals | 220 | // iconview only signals |
232 | 221 | ||
233 | connect( _iconview, SIGNAL( moved() ), this, SIGNAL( moved() ) ); | 222 | connect( _iconview, SIGNAL( moved() ), this, SIGNAL( moved() ) ); |
234 | } | 223 | } |
235 | 224 | ||
236 | OVersatileView::~OVersatileView() | 225 | OVersatileView::~OVersatileView() |
237 | { | 226 | { |
238 | } | 227 | } |
239 | 228 | ||
240 | QPopupMenu* OVersatileView::contextMenu() const | 229 | QPopupMenu* OVersatileView::contextMenu() const |
241 | { | 230 | { |
242 | return _contextmenu; | 231 | return _contextmenu; |
243 | } | 232 | } |
244 | 233 | ||
245 | void OVersatileView::contextMenuRequested( QListViewItem* item, const QPoint& pos, int col ) | 234 | void OVersatileView::contextMenuRequested( QListViewItem* item, const QPoint& pos, int col ) |
246 | { | 235 | { |
247 | // can't use QObject::inherits here, because ListViewItems, beit Q, O or K, | 236 | // can't use QObject::inherits here, because ListViewItems, beit Q, O or K, |
248 | // do not inherit from QObject - assuming here the programmer is | 237 | // do not inherit from QObject - assuming here the programmer is |
249 | // disciplined enough to only add OVersatileViewItems to an OVersatileView | 238 | // disciplined enough to only add OVersatileViewItems to an OVersatileView |
250 | popupContextMenu( static_cast<OVersatileViewItem*>( item ), pos, col ); | 239 | popupContextMenu( static_cast<OVersatileViewItem*>( item ), pos, col ); |
251 | } | 240 | } |
252 | 241 | ||
253 | void OVersatileView::contextMenuRequested( QIconViewItem* item, const QPoint& pos ) | 242 | void OVersatileView::contextMenuRequested( QIconViewItem* item, const QPoint& pos ) |
254 | { | 243 | { |
255 | // see above | 244 | // see above |
256 | popupContextMenu( static_cast<OVersatileViewItem*>( item ), pos, -1 ); | 245 | popupContextMenu( static_cast<OVersatileViewItem*>( item ), pos, -1 ); |
257 | } | 246 | } |
258 | 247 | ||
259 | void OVersatileView::popupContextMenu( OVersatileViewItem* item, const QPoint& pos, int col ) | 248 | void OVersatileView::popupContextMenu( OVersatileViewItem* item, const QPoint& pos, int col ) |
260 | { | 249 | { |
261 | if ( !item ) | 250 | if ( !item ) |
262 | _contextmenu->exec( pos ); | 251 | _contextmenu->exec( pos ); |
263 | else | 252 | else |
264 | emit( contextMenuRequested( item, pos, col ) ); | 253 | emit( contextMenuRequested( item, pos, col ) ); |
265 | } | 254 | } |
266 | 255 | ||
267 | void OVersatileView::setSynchronization( bool sync ) | 256 | void OVersatileView::setSynchronization( bool sync ) |
268 | { | 257 | { |
269 | _synchronization = sync; | 258 | _synchronization = sync; |
270 | } | 259 | } |
271 | 260 | ||
272 | bool OVersatileView::synchronization() | 261 | bool OVersatileView::synchronization() |
273 | { | 262 | { |
274 | return _synchronization; | 263 | return _synchronization; |
275 | } | 264 | } |
276 | 265 | ||
277 | void OVersatileView::setDefaultPixmaps( int mode, QPixmap& leaf, QPixmap& opened, QPixmap& closed ) | 266 | void OVersatileView::setDefaultPixmaps( int mode, QPixmap& leaf, QPixmap& opened, QPixmap& closed ) |
278 | { | 267 | { |
279 | if ( mode == Tree ) | 268 | if ( mode == Tree ) |
280 | { | 269 | { |
281 | _treeleaf = leaf; | 270 | _treeleaf = leaf; |
282 | _treeopened = opened; | 271 | _treeopened = opened; |
283 | _treeclosed = closed; | 272 | _treeclosed = closed; |
284 | } | 273 | } |
285 | else if ( mode == Icons ) | 274 | else if ( mode == Icons ) |
286 | { | 275 | { |
287 | _iconleaf = leaf; | 276 | _iconleaf = leaf; |
288 | _iconopened = opened; | 277 | _iconopened = opened; |
289 | _iconclosed = closed; | 278 | _iconclosed = closed; |
290 | } | 279 | } |
291 | else | 280 | else |
292 | { | 281 | { |
293 | odebug << "OVersatileView::setDefaultPixmaps(): invalid mode" << oendl; | 282 | odebug << "OVersatileView::setDefaultPixmaps(): invalid mode" << oendl; |
294 | } | 283 | } |
295 | } | 284 | } |
296 | 285 | ||
297 | QIconView* OVersatileView::iconView() const | 286 | QIconView* OVersatileView::iconView() const |
298 | { | 287 | { |
299 | return _iconview; | 288 | return _iconview; |
300 | } | 289 | } |
301 | 290 | ||
302 | OListView* OVersatileView::listView() const | 291 | OListView* OVersatileView::listView() const |
303 | { | 292 | { |
304 | return _listview; | 293 | return _listview; |
305 | } | 294 | } |
306 | 295 | ||
307 | void OVersatileView::setViewMode( int mode ) | 296 | void OVersatileView::setViewMode( int mode ) |
308 | { | 297 | { |
309 | if ( mode == Tree ) | 298 | if ( mode == Tree ) |
310 | { | 299 | { |
311 | _viewmode = mode; | 300 | _viewmode = mode; |
312 | raiseWidget( _listview ); | 301 | raiseWidget( _listview ); |
313 | } | 302 | } |
314 | else if ( mode == Icons ) | 303 | else if ( mode == Icons ) |
315 | { | 304 | { |
316 | _viewmode = mode; | 305 | _viewmode = mode; |
317 | raiseWidget( _iconview ); | 306 | raiseWidget( _iconview ); |
318 | } | 307 | } |
319 | else | 308 | else |
320 | { | 309 | { |
321 | odebug << "OVersatileView::setViewMode(): invalid mode" << oendl; | 310 | odebug << "OVersatileView::setViewMode(): invalid mode" << oendl; |
322 | } | 311 | } |
323 | } | 312 | } |
324 | 313 | ||
325 | void OVersatileView::setIconViewMode() | 314 | void OVersatileView::setIconViewMode() |
326 | { | 315 | { |
327 | setViewMode( Icons ); | 316 | setViewMode( Icons ); |
328 | } | 317 | } |
329 | 318 | ||
330 | void OVersatileView::setTreeViewMode() | 319 | void OVersatileView::setTreeViewMode() |
331 | { | 320 | { |
332 | setViewMode( Tree ); | 321 | setViewMode( Tree ); |
333 | } | 322 | } |
334 | 323 | ||
335 | bool OVersatileView::isValidViewMode( int mode ) const | 324 | bool OVersatileView::isValidViewMode( int mode ) const |
336 | { | 325 | { |
337 | switch ( _warningpolicy ) | 326 | switch ( _warningpolicy ) |
338 | { | 327 | { |
339 | case OVersatileView::None: | 328 | case OVersatileView::None: |
340 | { | 329 | { |
341 | return true; | 330 | return true; |
342 | } | 331 | } |
343 | case OVersatileView::Warn: | 332 | case OVersatileView::Warn: |
344 | { | 333 | { |
345 | if ( _viewmode != mode ) | 334 | if ( _viewmode != mode ) |
346 | { | 335 | { |
347 | odebug << "OVersatileView::isValidViewMode(): Requested operation not valid in current mode." << oendl; | 336 | odebug << "OVersatileView::isValidViewMode(): Requested operation not valid in current mode." << oendl; |
348 | return true; | 337 | return true; |
349 | } | 338 | } |
350 | } | 339 | } |
351 | case OVersatileView::WarnReturn: | 340 | case OVersatileView::WarnReturn: |
352 | { | 341 | { |
353 | if ( _viewmode != mode ) | 342 | if ( _viewmode != mode ) |
354 | { | 343 | { |
355 | odebug << "OVersatileView::isValidViewMode(): Requested operation not valid in current mode." << oendl; | 344 | odebug << "OVersatileView::isValidViewMode(): Requested operation not valid in current mode." << oendl; |
356 | return false; | 345 | return false; |
357 | } | 346 | } |
358 | } | 347 | } |
359 | default: | 348 | default: |
360 | { | 349 | { |
361 | owarn << "OVersatileView::isValidViewMode(): Inconsistent object state!" << oendl; | 350 | owarn << "OVersatileView::isValidViewMode(): Inconsistent object state!" << oendl; |
362 | return true; | 351 | return true; |
363 | } | 352 | } |
364 | } | 353 | } |
365 | } | 354 | } |
366 | void OVersatileView::setWarningPolicy( int policy ) const | 355 | void OVersatileView::setWarningPolicy( int policy ) const |
367 | { | 356 | { |
368 | _warningpolicy = policy; | 357 | _warningpolicy = policy; |
369 | } | 358 | } |
370 | bool OVersatileView::warningPolicy() const | 359 | bool OVersatileView::warningPolicy() const |
371 | { | 360 | { |
372 | return _warningpolicy; | 361 | return _warningpolicy; |
373 | } | 362 | } |
374 | //==============================================================================================// | 363 | //==============================================================================================// |
375 | // Stupid Signal forwarders... | 364 | // Stupid Signal forwarders... |
376 | // Folks, this is why I like python with its dynamic typing: | 365 | // Folks, this is why I like python with its dynamic typing: |
377 | // I can code the following dozens of lines C++ in four Python lines... | 366 | // I can code the following dozens of lines C++ in four Python lines... |
378 | //==============================================================================================// | 367 | //==============================================================================================// |
379 | 368 | ||
380 | void OVersatileView::selectionChanged( QListViewItem * item ) | 369 | void OVersatileView::selectionChanged( QListViewItem * item ) |
381 | { | 370 | { |
382 | emit( selectionChanged( static_cast<OVersatileViewItem*>( item ) ) ); | 371 | emit( selectionChanged( static_cast<OVersatileViewItem*>( item ) ) ); |
383 | } | 372 | } |
384 | 373 | ||
385 | void OVersatileView::selectionChanged( QIconViewItem * item ) | 374 | void OVersatileView::selectionChanged( QIconViewItem * item ) |
386 | { | 375 | { |
387 | emit( selectionChanged( static_cast<OVersatileViewItem*>( item ) ) ); | 376 | emit( selectionChanged( static_cast<OVersatileViewItem*>( item ) ) ); |
388 | } | 377 | } |
389 | 378 | ||
390 | void OVersatileView::currentChanged( QListViewItem * item ) | 379 | void OVersatileView::currentChanged( QListViewItem * item ) |
391 | { | 380 | { |
392 | emit( currentChanged( static_cast<OVersatileViewItem*>( item ) ) ); | 381 | emit( currentChanged( static_cast<OVersatileViewItem*>( item ) ) ); |
393 | } | 382 | } |
394 | 383 | ||
395 | void OVersatileView::currentChanged( QIconViewItem * item ) | 384 | void OVersatileView::currentChanged( QIconViewItem * item ) |
396 | { | 385 | { |
397 | emit( currentChanged( static_cast<OVersatileViewItem*>( item ) ) ); | 386 | emit( currentChanged( static_cast<OVersatileViewItem*>( item ) ) ); |
398 | } | 387 | } |
399 | 388 | ||
400 | void OVersatileView::clicked( QListViewItem * item ) | 389 | void OVersatileView::clicked( QListViewItem * item ) |
401 | { | 390 | { |
402 | emit( clicked( static_cast<OVersatileViewItem*>( item ) ) ); | 391 | emit( clicked( static_cast<OVersatileViewItem*>( item ) ) ); |
403 | } | 392 | } |
404 | 393 | ||
405 | void OVersatileView::clicked( QIconViewItem * item ) | 394 | void OVersatileView::clicked( QIconViewItem * item ) |
406 | { | 395 | { |
407 | emit( clicked( static_cast<OVersatileViewItem*>( item ) ) ); | 396 | emit( clicked( static_cast<OVersatileViewItem*>( item ) ) ); |
408 | } | 397 | } |
409 | 398 | ||
410 | void OVersatileView::pressed( QListViewItem * item ) | 399 | void OVersatileView::pressed( QListViewItem * item ) |
411 | { | 400 | { |
412 | emit( pressed( static_cast<OVersatileViewItem*>( item ) ) ); | 401 | emit( pressed( static_cast<OVersatileViewItem*>( item ) ) ); |
413 | } | 402 | } |
414 | 403 | ||
415 | void OVersatileView::pressed( QIconViewItem * item ) | 404 | void OVersatileView::pressed( QIconViewItem * item ) |
416 | { | 405 | { |
417 | emit( pressed( static_cast<OVersatileViewItem*>( item ) ) ); | 406 | emit( pressed( static_cast<OVersatileViewItem*>( item ) ) ); |
418 | } | 407 | } |
419 | 408 | ||
420 | void OVersatileView::doubleClicked( QListViewItem * item ) | 409 | void OVersatileView::doubleClicked( QListViewItem * item ) |
421 | { | 410 | { |
422 | emit( doubleClicked( static_cast<OVersatileViewItem*>( item ) ) ); | 411 | emit( doubleClicked( static_cast<OVersatileViewItem*>( item ) ) ); |
423 | } | 412 | } |
424 | 413 | ||
425 | void OVersatileView::doubleClicked( QIconViewItem * item ) | 414 | void OVersatileView::doubleClicked( QIconViewItem * item ) |
426 | { | 415 | { |
427 | emit( doubleClicked( static_cast<OVersatileViewItem*>( item ) ) ); | 416 | emit( doubleClicked( static_cast<OVersatileViewItem*>( item ) ) ); |
428 | } | 417 | } |
429 | 418 | ||
430 | void OVersatileView::returnPressed( QListViewItem * item ) | 419 | void OVersatileView::returnPressed( QListViewItem * item ) |
431 | { | 420 | { |
432 | emit( returnPressed( static_cast<OVersatileViewItem*>( item ) ) ); | 421 | emit( returnPressed( static_cast<OVersatileViewItem*>( item ) ) ); |
433 | } | 422 | } |
434 | 423 | ||
435 | void OVersatileView::returnPressed( QIconViewItem * item ) | 424 | void OVersatileView::returnPressed( QIconViewItem * item ) |
436 | { | 425 | { |
437 | emit( returnPressed( static_cast<OVersatileViewItem*>( item ) ) ); | 426 | emit( returnPressed( static_cast<OVersatileViewItem*>( item ) ) ); |
438 | } | 427 | } |
439 | 428 | ||
440 | void OVersatileView::onItem( QListViewItem * item ) | 429 | void OVersatileView::onItem( QListViewItem * item ) |
441 | { | 430 | { |
442 | emit( onItem( static_cast<OVersatileViewItem*>( item ) ) ); | 431 | emit( onItem( static_cast<OVersatileViewItem*>( item ) ) ); |
443 | } | 432 | } |
444 | 433 | ||
445 | void OVersatileView::onItem( QIconViewItem * item ) | 434 | void OVersatileView::onItem( QIconViewItem * item ) |
446 | { | 435 | { |
447 | emit( onItem( static_cast<OVersatileViewItem*>( item ) ) ); | 436 | emit( onItem( static_cast<OVersatileViewItem*>( item ) ) ); |
448 | } | 437 | } |
449 | 438 | ||
450 | void OVersatileView::expanded( QListViewItem *item ) // QListView | 439 | void OVersatileView::expanded( QListViewItem *item ) // QListView |
451 | { | 440 | { |
452 | //odebug << "OVersatileView::expanded(): opening tree..." << oendl; | 441 | //odebug << "OVersatileView::expanded(): opening tree..." << oendl; |
453 | if ( !_treeopened.isNull() ) | 442 | if ( !_treeopened.isNull() ) |
454 | item->setPixmap( 0, _treeopened ); | 443 | item->setPixmap( 0, _treeopened ); |
455 | emit( expanded( static_cast<OVersatileViewItem*>( item ) ) ); | 444 | emit( expanded( static_cast<OVersatileViewItem*>( item ) ) ); |
456 | } | 445 | } |
457 | void OVersatileView::collapsed( QListViewItem *item ) // QListView | 446 | void OVersatileView::collapsed( QListViewItem *item ) // QListView |
458 | { | 447 | { |
459 | if ( !_treeclosed.isNull() ) | 448 | if ( !_treeclosed.isNull() ) |
460 | item->setPixmap( 0, _treeclosed ); | 449 | item->setPixmap( 0, _treeclosed ); |
461 | emit( collapsed( static_cast<OVersatileViewItem*>( item ) ) ); | 450 | emit( collapsed( static_cast<OVersatileViewItem*>( item ) ) ); |
462 | } | 451 | } |
463 | 452 | ||
464 | //=============================================================================================// | 453 | //=============================================================================================// |
465 | // OVersatileView Case I - API only existing in QListView or QIconView but not in both! | 454 | // OVersatileView Case I - API only existing in QListView or QIconView but not in both! |
466 | //==============================================================================================// | 455 | //==============================================================================================// |
467 | 456 | ||
468 | int OVersatileView::treeStepSize() const // QListView | 457 | int OVersatileView::treeStepSize() const // QListView |
469 | { | 458 | { |
470 | if ( !isValidViewMode( Tree ) ) | 459 | if ( !isValidViewMode( Tree ) ) |
471 | { | 460 | { |
472 | return -1; | 461 | return -1; |
473 | } | 462 | } |
474 | return _listview->treeStepSize(); | 463 | return _listview->treeStepSize(); |
475 | } | 464 | } |
476 | void OVersatileView::setTreeStepSize( int size ) // QListView | 465 | void OVersatileView::setTreeStepSize( int size ) // QListView |
477 | { | 466 | { |
478 | if ( !isValidViewMode( Tree ) ) | 467 | if ( !isValidViewMode( Tree ) ) |
479 | { | 468 | { |
480 | return; | 469 | return; |
481 | } | 470 | } |
482 | _listview->setTreeStepSize( size ); | 471 | _listview->setTreeStepSize( size ); |
483 | } | 472 | } |
484 | 473 | ||
485 | QHeader * OVersatileView::header() const // QListView | 474 | QHeader * OVersatileView::header() const // QListView |
486 | { | 475 | { |
487 | if ( !isValidViewMode( Tree ) ) | 476 | if ( !isValidViewMode( Tree ) ) |
488 | { | 477 | { |
489 | return 0; | 478 | return 0; |
490 | } | 479 | } |
491 | return _listview->header(); | 480 | return _listview->header(); |
492 | } | 481 | } |
493 | 482 | ||
494 | int OVersatileView::addColumn( const QString &label, int size ) // QListView | 483 | int OVersatileView::addColumn( const QString &label, int size ) // QListView |
495 | { | 484 | { |
496 | if ( !isValidViewMode( Tree ) ) | 485 | if ( !isValidViewMode( Tree ) ) |
497 | { | 486 | { |
498 | return -1; | 487 | return -1; |
499 | } | 488 | } |
500 | return _listview->addColumn( label, size ); | 489 | return _listview->addColumn( label, size ); |
501 | } | 490 | } |
502 | 491 | ||
503 | int OVersatileView::addColumn( const QIconSet& iconset, const QString &label, int size ) // QListView | 492 | int OVersatileView::addColumn( const QIconSet& iconset, const QString &label, int size ) // QListView |
504 | { | 493 | { |
505 | if ( !isValidViewMode( Tree ) ) | 494 | if ( !isValidViewMode( Tree ) ) |
506 | { | 495 | { |
507 | return -1; | 496 | return -1; |
508 | } | 497 | } |
509 | return _listview->addColumn( iconset, label, size ); | 498 | return _listview->addColumn( iconset, label, size ); |
510 | } | 499 | } |
511 | 500 | ||
512 | void OVersatileView::removeColumn( int index ) // QListView | 501 | void OVersatileView::removeColumn( int index ) // QListView |
513 | { | 502 | { |
514 | if ( !isValidViewMode( Tree ) ) | 503 | if ( !isValidViewMode( Tree ) ) |
515 | { | 504 | { |
516 | return; | 505 | return; |
517 | } | 506 | } |
518 | _listview->removeColumn( index ); | 507 | _listview->removeColumn( index ); |
519 | } | 508 | } |
520 | void OVersatileView::setColumnText( int column, const QString &label ) // QListView | 509 | void OVersatileView::setColumnText( int column, const QString &label ) // QListView |
521 | { | 510 | { |
522 | if ( !isValidViewMode( Tree ) ) | 511 | if ( !isValidViewMode( Tree ) ) |
523 | { | 512 | { |
524 | return; | 513 | return; |
525 | } | 514 | } |
526 | _listview->setColumnText( column, label ); | 515 | _listview->setColumnText( column, label ); |
527 | } | 516 | } |
528 | void OVersatileView::setColumnText( int column, const QIconSet& iconset, const QString &label ) // QListView | 517 | void OVersatileView::setColumnText( int column, const QIconSet& iconset, const QString &label ) // QListView |
529 | { | 518 | { |
530 | if ( !isValidViewMode( Tree ) ) | 519 | if ( !isValidViewMode( Tree ) ) |
531 | { | 520 | { |
532 | return; | 521 | return; |
533 | } | 522 | } |
534 | _listview->setColumnText( column, iconset, label ); | 523 | _listview->setColumnText( column, iconset, label ); |
535 | } | 524 | } |
536 | QString OVersatileView::columnText( int column ) const // QListView | 525 | QString OVersatileView::columnText( int column ) const // QListView |
537 | { | 526 | { |
538 | if ( !isValidViewMode( Tree ) ) | 527 | if ( !isValidViewMode( Tree ) ) |
539 | { | 528 | { |
540 | return QString::null; | 529 | return QString::null; |
541 | } | 530 | } |
542 | return _listview->columnText( column ); | 531 | return _listview->columnText( column ); |
543 | } | 532 | } |
544 | void OVersatileView::setColumnWidth( int column, int width ) // QListView | 533 | void OVersatileView::setColumnWidth( int column, int width ) // QListView |
545 | { | 534 | { |
546 | if ( !isValidViewMode( Tree ) ) | 535 | if ( !isValidViewMode( Tree ) ) |
547 | { | 536 | { |
548 | return; | 537 | return; |
549 | } | 538 | } |
550 | _listview->setColumnWidth( column, width ); | 539 | _listview->setColumnWidth( column, width ); |
551 | } | 540 | } |
552 | int OVersatileView::columnWidth( int column ) const // QListView | 541 | int OVersatileView::columnWidth( int column ) const // QListView |
553 | { | 542 | { |
554 | if ( !isValidViewMode( Tree ) ) | 543 | if ( !isValidViewMode( Tree ) ) |
555 | { | 544 | { |
556 | return -1; | 545 | return -1; |
557 | } | 546 | } |
558 | return _listview->columnWidth( column ); | 547 | return _listview->columnWidth( column ); |
559 | } | 548 | } |
560 | void OVersatileView::setColumnWidthMode( int column, WidthMode mode ) // QListView | 549 | void OVersatileView::setColumnWidthMode( int column, WidthMode mode ) // QListView |
561 | { | 550 | { |
562 | if ( !isValidViewMode( Tree ) ) | 551 | if ( !isValidViewMode( Tree ) ) |
563 | { | 552 | { |
564 | return; | 553 | return; |
565 | } | 554 | } |
566 | _listview->setColumnWidth( column, mode ); | 555 | _listview->setColumnWidth( column, mode ); |
567 | } | 556 | } |
568 | int OVersatileView::columns() const // QListView | 557 | int OVersatileView::columns() const // QListView |
569 | { | 558 | { |
570 | if ( !isValidViewMode( Tree ) ) | 559 | if ( !isValidViewMode( Tree ) ) |
571 | { | 560 | { |
572 | return -1; | 561 | return -1; |
573 | } | 562 | } |
574 | return _listview->columns(); | 563 | return _listview->columns(); |
575 | } | 564 | } |
576 | 565 | ||
577 | void OVersatileView::setColumnAlignment( int column, int align ) // QListView | 566 | void OVersatileView::setColumnAlignment( int column, int align ) // QListView |
578 | { | 567 | { |
579 | if ( !isValidViewMode( Tree ) ) | 568 | if ( !isValidViewMode( Tree ) ) |
580 | { | 569 | { |
581 | return; | 570 | return; |
582 | } | 571 | } |
583 | _listview->setColumnAlignment( column, align ); | 572 | _listview->setColumnAlignment( column, align ); |
584 | } | 573 | } |
585 | int OVersatileView::columnAlignment( int column ) const // QListView | 574 | int OVersatileView::columnAlignment( int column ) const // QListView |
586 | { | 575 | { |
587 | if ( !isValidViewMode( Tree ) ) | 576 | if ( !isValidViewMode( Tree ) ) |
588 | { | 577 | { |
589 | return -1; | 578 | return -1; |
590 | } | 579 | } |
591 | return _listview->columnAlignment( column ); | 580 | return _listview->columnAlignment( column ); |
592 | } | 581 | } |
593 | 582 | ||
594 | OVersatileViewItem * OVersatileView::itemAt( const QPoint & screenPos ) const // QListView | 583 | OVersatileViewItem * OVersatileView::itemAt( const QPoint & screenPos ) const // QListView |
595 | { | 584 | { |
596 | if ( !isValidViewMode( Tree ) ) | 585 | if ( !isValidViewMode( Tree ) ) |
597 | { | 586 | { |
598 | return 0; | 587 | return 0; |
599 | } | 588 | } |
600 | return static_cast<OVersatileViewItem*>( _listview->itemAt( screenPos ) ); | 589 | return static_cast<OVersatileViewItem*>( _listview->itemAt( screenPos ) ); |
601 | } | 590 | } |
602 | QRect OVersatileView::itemRect( const OVersatileViewItem * item ) const // QListView | 591 | QRect OVersatileView::itemRect( const OVersatileViewItem * item ) const // QListView |
603 | { | 592 | { |
604 | if ( !isValidViewMode( Tree ) ) | 593 | if ( !isValidViewMode( Tree ) ) |
605 | { | 594 | { |
606 | return QRect( -1, -1, -1, -1 ); | 595 | return QRect( -1, -1, -1, -1 ); |
607 | } | 596 | } |
608 | return _listview->itemRect( item ); | 597 | return _listview->itemRect( item ); |
609 | } | 598 | } |
610 | int OVersatileView::itemPos( const OVersatileViewItem * item ) // QListView | 599 | int OVersatileView::itemPos( const OVersatileViewItem * item ) // QListView |
611 | { | 600 | { |
612 | if ( !isValidViewMode( Tree ) ) | 601 | if ( !isValidViewMode( Tree ) ) |
613 | { | 602 | { |
614 | return -1; | 603 | return -1; |
615 | } | 604 | } |
616 | return _listview->itemPos( item ); | 605 | return _listview->itemPos( item ); |
617 | } | 606 | } |
618 | 607 | ||
619 | bool OVersatileView::isSelected( const OVersatileViewItem * item ) const // QListView // also in QIconViewItem but !in QIconView *shrug* | 608 | bool OVersatileView::isSelected( const OVersatileViewItem * item ) const // QListView // also in QIconViewItem but !in QIconView *shrug* |
620 | { | 609 | { |
621 | if ( !isValidViewMode( Tree ) ) | 610 | if ( !isValidViewMode( Tree ) ) |
622 | { | 611 | { |
623 | return false; | 612 | return false; |
624 | } | 613 | } |
625 | return _listview->isSelected( item ); | 614 | return _listview->isSelected( item ); |
626 | } | 615 | } |
627 | 616 | ||
628 | void OVersatileView::setMultiSelection( bool enable ) | 617 | void OVersatileView::setMultiSelection( bool enable ) |
629 | { | 618 | { |
630 | _listview->setMultiSelection( enable ); | 619 | _listview->setMultiSelection( enable ); |
631 | } | 620 | } |
632 | bool OVersatileView::isMultiSelection() const | 621 | bool OVersatileView::isMultiSelection() const |
633 | { | 622 | { |
634 | return _listview->isMultiSelection(); | 623 | return _listview->isMultiSelection(); |
635 | } | 624 | } |
636 | 625 | ||
637 | OVersatileViewItem * OVersatileView::selectedItem() const // QListView | 626 | OVersatileViewItem * OVersatileView::selectedItem() const // QListView |
638 | { | 627 | { |
639 | if ( !isValidViewMode( Tree ) ) | 628 | if ( !isValidViewMode( Tree ) ) |
640 | { | 629 | { |
641 | return 0; | 630 | return 0; |
642 | } | 631 | } |
643 | return static_cast<OVersatileViewItem*>( _listview->selectedItem() ); | 632 | return static_cast<OVersatileViewItem*>( _listview->selectedItem() ); |
644 | } | 633 | } |
645 | void OVersatileView::setOpen( OVersatileViewItem * item, bool open ) // QListView | 634 | void OVersatileView::setOpen( OVersatileViewItem * item, bool open ) // QListView |
646 | { | 635 | { |
647 | if ( !isValidViewMode( Tree ) ) | 636 | if ( !isValidViewMode( Tree ) ) |
648 | { | 637 | { |
649 | return; | 638 | return; |
650 | } | 639 | } |
651 | _listview->setOpen( item, open ); | 640 | _listview->setOpen( item, open ); |
652 | } | 641 | } |
653 | bool OVersatileView::isOpen( const OVersatileViewItem * item ) const // QListView | 642 | bool OVersatileView::isOpen( const OVersatileViewItem * item ) const // QListView |
654 | { | 643 | { |
655 | if ( !isValidViewMode( Tree ) ) | 644 | if ( !isValidViewMode( Tree ) ) |
656 | { | 645 | { |
657 | return false; | 646 | return false; |
658 | } | 647 | } |
659 | return _listview->isOpen( item ); | 648 | return _listview->isOpen( item ); |
660 | } | 649 | } |
661 | 650 | ||
662 | OVersatileViewItem * OVersatileView::firstChild() const // QListView | 651 | OVersatileViewItem * OVersatileView::firstChild() const // QListView |
663 | { | 652 | { |
664 | if ( !isValidViewMode( Tree ) ) | 653 | if ( !isValidViewMode( Tree ) ) |
665 | { | 654 | { |
666 | return 0; | 655 | return 0; |
667 | } | 656 | } |
668 | return static_cast<OVersatileViewItem*>( _listview->firstChild() ); | 657 | return static_cast<OVersatileViewItem*>( _listview->firstChild() ); |
669 | } | 658 | } |
670 | int OVersatileView::childCount() const // QListView | 659 | int OVersatileView::childCount() const // QListView |
671 | { | 660 | { |
672 | if ( !isValidViewMode( Tree ) ) | 661 | if ( !isValidViewMode( Tree ) ) |
673 | { | 662 | { |
674 | return -1; | 663 | return -1; |
675 | } | 664 | } |
676 | return _listview->childCount(); | 665 | return _listview->childCount(); |
677 | } | 666 | } |
678 | 667 | ||
679 | void OVersatileView::setAllColumnsShowFocus( bool focus ) // QListView | 668 | void OVersatileView::setAllColumnsShowFocus( bool focus ) // QListView |
680 | { | 669 | { |
681 | if ( !isValidViewMode( Tree ) ) | 670 | if ( !isValidViewMode( Tree ) ) |
682 | { | 671 | { |
683 | return; | 672 | return; |
684 | } | 673 | } |
685 | _listview->setAllColumnsShowFocus( focus ); | 674 | _listview->setAllColumnsShowFocus( focus ); |
686 | } | 675 | } |
687 | bool OVersatileView::allColumnsShowFocus() const // QListView | 676 | bool OVersatileView::allColumnsShowFocus() const // QListView |
688 | { | 677 | { |
689 | if ( !isValidViewMode( Tree ) ) | 678 | if ( !isValidViewMode( Tree ) ) |
690 | { | 679 | { |
691 | return false; | 680 | return false; |
692 | } | 681 | } |
693 | return _listview->allColumnsShowFocus(); | 682 | return _listview->allColumnsShowFocus(); |
694 | } | 683 | } |
695 | 684 | ||
696 | void OVersatileView::setItemMargin( int margin ) // QListView | 685 | void OVersatileView::setItemMargin( int margin ) // QListView |
697 | { | 686 | { |
698 | if ( !isValidViewMode( Tree ) ) | 687 | if ( !isValidViewMode( Tree ) ) |
699 | { | 688 | { |
700 | return; | 689 | return; |
701 | } | 690 | } |
702 | _listview->setItemMargin( margin ); | 691 | _listview->setItemMargin( margin ); |
703 | } | 692 | } |
704 | int OVersatileView::itemMargin() const // QListView | 693 | int OVersatileView::itemMargin() const // QListView |
705 | { | 694 | { |
706 | if ( !isValidViewMode( Tree ) ) | 695 | if ( !isValidViewMode( Tree ) ) |
707 | { | 696 | { |
708 | return -1; | 697 | return -1; |
709 | } | 698 | } |
710 | return _listview->itemMargin(); | 699 | return _listview->itemMargin(); |
711 | } | 700 | } |
712 | 701 | ||
713 | void OVersatileView::setRootIsDecorated( bool decorate ) // QListView | 702 | void OVersatileView::setRootIsDecorated( bool decorate ) // QListView |
714 | { | 703 | { |
715 | if ( !isValidViewMode( Tree ) ) | 704 | if ( !isValidViewMode( Tree ) ) |
716 | { | 705 | { |
717 | return; | 706 | return; |
718 | } | 707 | } |
719 | _listview->setRootIsDecorated( decorate ); | 708 | _listview->setRootIsDecorated( decorate ); |
720 | } | 709 | } |
721 | bool OVersatileView::rootIsDecorated() const // QListView | 710 | bool OVersatileView::rootIsDecorated() const // QListView |
722 | { | 711 | { |
723 | if ( !isValidViewMode( Tree ) ) | 712 | if ( !isValidViewMode( Tree ) ) |
724 | { | 713 | { |
725 | return false; | 714 | return false; |
726 | } | 715 | } |
727 | return _listview->rootIsDecorated(); | 716 | return _listview->rootIsDecorated(); |
728 | } | 717 | } |
729 | 718 | ||
730 | void OVersatileView::setShowSortIndicator( bool show ) // QListView | 719 | void OVersatileView::setShowSortIndicator( bool show ) // QListView |
731 | { | 720 | { |
732 | if ( !isValidViewMode( Tree ) ) | 721 | if ( !isValidViewMode( Tree ) ) |
733 | { | 722 | { |
734 | return; | 723 | return; |
735 | } | 724 | } |
736 | _listview->setShowSortIndicator( show ); | 725 | _listview->setShowSortIndicator( show ); |
737 | } | 726 | } |
738 | bool OVersatileView::showSortIndicator() const // QListView | 727 | bool OVersatileView::showSortIndicator() const // QListView |
739 | { | 728 | { |
740 | if ( !isValidViewMode( Tree ) ) | 729 | if ( !isValidViewMode( Tree ) ) |
741 | { | 730 | { |
742 | return false; | 731 | return false; |
743 | } | 732 | } |
744 | return _listview->showSortIndicator(); | 733 | return _listview->showSortIndicator(); |
745 | } | 734 | } |
746 | 735 | ||
747 | void OVersatileView::triggerUpdate() // QListView | 736 | void OVersatileView::triggerUpdate() // QListView |
748 | { | 737 | { |
749 | if ( !isValidViewMode( Tree ) ) | 738 | if ( !isValidViewMode( Tree ) ) |
750 | { | 739 | { |
751 | return; | 740 | return; |
752 | } | 741 | } |
753 | _listview->triggerUpdate(); | 742 | _listview->triggerUpdate(); |
754 | } | 743 | } |
755 | 744 | ||
756 | // | 745 | // |
757 | // only in QIconView | 746 | // only in QIconView |
758 | // | 747 | // |
759 | 748 | ||
760 | uint OVersatileView::count() const // QIconView | 749 | uint OVersatileView::count() const // QIconView |
761 | { | 750 | { |
762 | if ( !isValidViewMode( Icons ) ) | 751 | if ( !isValidViewMode( Icons ) ) |
763 | { | 752 | { |
764 | return 0; | 753 | return 0; |
765 | } | 754 | } |
766 | return _iconview->count(); | 755 | return _iconview->count(); |
767 | } | 756 | } |
768 | 757 | ||
769 | int OVersatileView::index( const OVersatileViewItem *item ) const // QIconView | 758 | int OVersatileView::index( const OVersatileViewItem *item ) const // QIconView |
770 | { | 759 | { |
771 | if ( !isValidViewMode( Icons ) ) | 760 | if ( !isValidViewMode( Icons ) ) |
772 | { | 761 | { |
773 | return -1; | 762 | return -1; |
774 | } | 763 | } |
775 | return _iconview->index( item ); | 764 | return _iconview->index( item ); |
776 | } | 765 | } |
777 | 766 | ||
778 | OVersatileViewItem* OVersatileView::firstItem() const // QIconView | 767 | OVersatileViewItem* OVersatileView::firstItem() const // QIconView |
779 | { | 768 | { |
780 | if ( !isValidViewMode( Icons ) ) | 769 | if ( !isValidViewMode( Icons ) ) |
781 | { | 770 | { |
782 | return 0; | 771 | return 0; |
783 | } | 772 | } |
784 | return static_cast<OVersatileViewItem*>( _iconview->firstItem() ); | 773 | return static_cast<OVersatileViewItem*>( _iconview->firstItem() ); |
785 | } | 774 | } |
786 | OVersatileViewItem* OVersatileView::lastItem() const // QIconView | 775 | OVersatileViewItem* OVersatileView::lastItem() const // QIconView |
787 | { | 776 | { |
788 | if ( !isValidViewMode( Icons ) ) | 777 | if ( !isValidViewMode( Icons ) ) |
789 | { | 778 | { |
790 | return 0; | 779 | return 0; |
791 | } | 780 | } |
792 | return static_cast<OVersatileViewItem*>( _iconview->lastItem() ); | 781 | return static_cast<OVersatileViewItem*>( _iconview->lastItem() ); |
793 | } | 782 | } |
794 | 783 | ||
795 | OVersatileViewItem* OVersatileView::findItem( const QPoint &pos ) const // QIconView | 784 | OVersatileViewItem* OVersatileView::findItem( const QPoint &pos ) const // QIconView |
796 | { | 785 | { |
797 | if ( !isValidViewMode( Icons ) ) | 786 | if ( !isValidViewMode( Icons ) ) |
798 | { | 787 | { |
799 | return 0; | 788 | return 0; |
800 | } | 789 | } |
801 | return static_cast<OVersatileViewItem*>( _iconview->findItem( pos ) ); | 790 | return static_cast<OVersatileViewItem*>( _iconview->findItem( pos ) ); |
802 | } | 791 | } |
803 | OVersatileViewItem* OVersatileView::findItem( const QString &text ) const // QIconView | 792 | OVersatileViewItem* OVersatileView::findItem( const QString &text ) const // QIconView |
804 | { | 793 | { |
805 | if ( !isValidViewMode( Icons ) ) | 794 | if ( !isValidViewMode( Icons ) ) |
806 | { | 795 | { |
807 | return 0; | 796 | return 0; |
808 | } | 797 | } |
809 | return static_cast<OVersatileViewItem*>( _iconview->findItem( text ) ); | 798 | return static_cast<OVersatileViewItem*>( _iconview->findItem( text ) ); |
810 | } | 799 | } |
811 | 800 | ||
812 | OVersatileViewItem* OVersatileView::findFirstVisibleItem( const QRect &r ) const // QIconView | 801 | OVersatileViewItem* OVersatileView::findFirstVisibleItem( const QRect &r ) const // QIconView |
813 | { | 802 | { |
814 | if ( !isValidViewMode( Icons ) ) | 803 | if ( !isValidViewMode( Icons ) ) |
815 | { | 804 | { |
816 | return 0; | 805 | return 0; |
817 | } | 806 | } |
818 | return static_cast<OVersatileViewItem*>( _iconview->findFirstVisibleItem( r ) ); | 807 | return static_cast<OVersatileViewItem*>( _iconview->findFirstVisibleItem( r ) ); |
819 | } | 808 | } |
820 | OVersatileViewItem* OVersatileView::findLastVisibleItem( const QRect &r ) const // QIconView | 809 | OVersatileViewItem* OVersatileView::findLastVisibleItem( const QRect &r ) const // QIconView |
821 | { | 810 | { |
822 | if ( !isValidViewMode( Icons ) ) | 811 | if ( !isValidViewMode( Icons ) ) |
823 | { | 812 | { |
824 | return 0; | 813 | return 0; |
825 | } | 814 | } |
826 | return static_cast<OVersatileViewItem*>( _iconview->findLastVisibleItem( r ) ); | 815 | return static_cast<OVersatileViewItem*>( _iconview->findLastVisibleItem( r ) ); |
827 | } | 816 | } |
828 | 817 | ||
829 | void OVersatileView::setGridX( int rx ) // QIconView | 818 | void OVersatileView::setGridX( int rx ) // QIconView |
830 | { | 819 | { |
831 | if ( !isValidViewMode( Icons ) ) | 820 | if ( !isValidViewMode( Icons ) ) |
832 | { | 821 | { |
833 | return; | 822 | return; |
834 | } | 823 | } |
835 | _iconview->setGridX( rx ); | 824 | _iconview->setGridX( rx ); |
836 | } | 825 | } |
837 | void OVersatileView::setGridY( int ry ) // QIconView | 826 | void OVersatileView::setGridY( int ry ) // QIconView |
838 | { | 827 | { |
839 | if ( !isValidViewMode( Icons ) ) | 828 | if ( !isValidViewMode( Icons ) ) |
840 | { | 829 | { |
841 | return; | 830 | return; |
842 | } | 831 | } |
843 | _iconview->setGridY( ry ); | 832 | _iconview->setGridY( ry ); |
844 | } | 833 | } |
845 | int OVersatileView::gridX() const // QIconView | 834 | int OVersatileView::gridX() const // QIconView |
846 | { | 835 | { |
847 | if ( !isValidViewMode( Icons ) ) | 836 | if ( !isValidViewMode( Icons ) ) |
848 | { | 837 | { |
849 | return -1; | 838 | return -1; |
850 | } | 839 | } |
851 | return _iconview->gridX(); | 840 | return _iconview->gridX(); |
852 | } | 841 | } |
853 | int OVersatileView::gridY() const // QIconView | 842 | int OVersatileView::gridY() const // QIconView |
854 | { | 843 | { |
855 | if ( !isValidViewMode( Icons ) ) | 844 | if ( !isValidViewMode( Icons ) ) |
856 | { | 845 | { |
857 | return -1; | 846 | return -1; |
858 | } | 847 | } |
859 | return _iconview->gridY(); | 848 | return _iconview->gridY(); |
860 | } | 849 | } |
861 | void OVersatileView::setSpacing( int sp ) // QIconView | 850 | void OVersatileView::setSpacing( int sp ) // QIconView |
862 | { | 851 | { |
863 | if ( !isValidViewMode( Icons ) ) | 852 | if ( !isValidViewMode( Icons ) ) |
864 | { | 853 | { |
865 | return; | 854 | return; |
866 | } | 855 | } |
867 | _iconview->setSpacing( sp ); | 856 | _iconview->setSpacing( sp ); |
868 | } | 857 | } |
869 | int OVersatileView::spacing() const // QIconView | 858 | int OVersatileView::spacing() const // QIconView |
870 | { | 859 | { |
871 | if ( !isValidViewMode( Icons ) ) | 860 | if ( !isValidViewMode( Icons ) ) |
872 | { | 861 | { |
873 | return -1; | 862 | return -1; |
874 | } | 863 | } |
875 | return _iconview->spacing(); | 864 | return _iconview->spacing(); |
876 | } | 865 | } |
877 | void OVersatileView::setItemTextPos( QIconView::ItemTextPos pos ) // QIconView | 866 | void OVersatileView::setItemTextPos( QIconView::ItemTextPos pos ) // QIconView |
878 | { | 867 | { |
879 | if ( !isValidViewMode( Icons ) ) | 868 | if ( !isValidViewMode( Icons ) ) |
880 | { | 869 | { |
881 | return; | 870 | return; |
882 | } | 871 | } |
883 | _iconview->setItemTextPos( pos ); | 872 | _iconview->setItemTextPos( pos ); |
884 | } | 873 | } |
885 | QIconView::ItemTextPos OVersatileView::itemTextPos() const // QIconView | 874 | QIconView::ItemTextPos OVersatileView::itemTextPos() const // QIconView |
886 | { | 875 | { |
887 | if ( !isValidViewMode( Icons ) ) | 876 | if ( !isValidViewMode( Icons ) ) |
888 | { | 877 | { |
889 | return (QIconView::ItemTextPos) -1; | 878 | return (QIconView::ItemTextPos) -1; |
890 | } | 879 | } |
891 | return _iconview->itemTextPos(); | 880 | return _iconview->itemTextPos(); |
892 | } | 881 | } |
893 | void OVersatileView::setItemTextBackground( const QBrush &b ) // QIconView | 882 | void OVersatileView::setItemTextBackground( const QBrush &b ) // QIconView |
894 | { | 883 | { |
895 | if ( !isValidViewMode( Icons ) ) | 884 | if ( !isValidViewMode( Icons ) ) |
896 | { | 885 | { |
897 | return; | 886 | return; |
898 | } | 887 | } |
899 | _iconview->setItemTextBackground( b ); | 888 | _iconview->setItemTextBackground( b ); |
900 | } | 889 | } |
901 | QBrush OVersatileView::itemTextBackground() const // QIconView | 890 | QBrush OVersatileView::itemTextBackground() const // QIconView |
902 | { | 891 | { |
903 | if ( !isValidViewMode( Icons ) ) | 892 | if ( !isValidViewMode( Icons ) ) |
904 | { | 893 | { |
905 | return QBrush(); | 894 | return QBrush(); |
906 | } | 895 | } |
907 | return _iconview->itemTextBackground(); | 896 | return _iconview->itemTextBackground(); |
908 | } | 897 | } |
909 | void OVersatileView::setArrangement( QIconView::Arrangement am ) // QIconView | 898 | void OVersatileView::setArrangement( QIconView::Arrangement am ) // QIconView |
910 | { | 899 | { |
911 | if ( !isValidViewMode( Icons ) ) | 900 | if ( !isValidViewMode( Icons ) ) |
912 | { | 901 | { |
913 | return; | 902 | return; |
914 | } | 903 | } |
915 | _iconview->setArrangement( am ); | 904 | _iconview->setArrangement( am ); |
916 | } | 905 | } |
917 | QIconView::Arrangement OVersatileView::arrangement() const // QIconView | 906 | QIconView::Arrangement OVersatileView::arrangement() const // QIconView |
918 | { | 907 | { |
919 | if ( !isValidViewMode( Icons ) ) | 908 | if ( !isValidViewMode( Icons ) ) |
920 | { | 909 | { |
921 | return (QIconView::Arrangement) -1; | 910 | return (QIconView::Arrangement) -1; |
922 | } | 911 | } |
923 | return _iconview->arrangement(); | 912 | return _iconview->arrangement(); |
924 | } | 913 | } |
925 | void OVersatileView::setResizeMode( QIconView::ResizeMode am ) // QIconView | 914 | void OVersatileView::setResizeMode( QIconView::ResizeMode am ) // QIconView |
926 | { | 915 | { |
927 | if ( !isValidViewMode( Icons ) ) | 916 | if ( !isValidViewMode( Icons ) ) |
928 | { | 917 | { |
929 | return; | 918 | return; |
930 | } | 919 | } |
931 | _iconview->setResizeMode( am ); | 920 | _iconview->setResizeMode( am ); |
932 | } | 921 | } |
933 | QIconView::ResizeMode OVersatileView::resizeMode() const // QIconView | 922 | QIconView::ResizeMode OVersatileView::resizeMode() const // QIconView |
934 | { | 923 | { |
935 | if ( !isValidViewMode( Icons ) ) | 924 | if ( !isValidViewMode( Icons ) ) |
936 | { | 925 | { |
937 | return (QIconView::ResizeMode) -1; | 926 | return (QIconView::ResizeMode) -1; |
938 | } | 927 | } |
939 | return _iconview->resizeMode(); | 928 | return _iconview->resizeMode(); |
940 | } | 929 | } |
941 | void OVersatileView::setMaxItemWidth( int w ) // QIconView | 930 | void OVersatileView::setMaxItemWidth( int w ) // QIconView |
942 | { | 931 | { |
943 | if ( !isValidViewMode( Icons ) ) | 932 | if ( !isValidViewMode( Icons ) ) |
944 | { | 933 | { |
945 | return; | 934 | return; |
946 | } | 935 | } |
947 | _iconview->setMaxItemWidth( w ); | 936 | _iconview->setMaxItemWidth( w ); |
948 | } | 937 | } |
949 | int OVersatileView::maxItemWidth() const // QIconView | 938 | int OVersatileView::maxItemWidth() const // QIconView |
950 | { | 939 | { |
951 | if ( !isValidViewMode( Icons ) ) | 940 | if ( !isValidViewMode( Icons ) ) |
952 | { | 941 | { |
953 | return -1; | 942 | return -1; |
954 | } | 943 | } |
955 | return _iconview->maxItemWidth(); | 944 | return _iconview->maxItemWidth(); |
956 | } | 945 | } |
957 | void OVersatileView::setMaxItemTextLength( int w ) // QIconView | 946 | void OVersatileView::setMaxItemTextLength( int w ) // QIconView |
958 | { | 947 | { |
959 | if ( !isValidViewMode( Icons ) ) | 948 | if ( !isValidViewMode( Icons ) ) |
960 | { | 949 | { |
961 | return; | 950 | return; |
962 | } | 951 | } |
963 | _iconview->setMaxItemTextLength( w ); | 952 | _iconview->setMaxItemTextLength( w ); |
964 | } | 953 | } |
965 | int OVersatileView::maxItemTextLength() const // QIconView | 954 | int OVersatileView::maxItemTextLength() const // QIconView |
966 | { | 955 | { |
967 | if ( !isValidViewMode( Icons ) ) | 956 | if ( !isValidViewMode( Icons ) ) |
968 | { | 957 | { |
969 | return -1; | 958 | return -1; |
970 | } | 959 | } |
971 | return _iconview->maxItemTextLength(); | 960 | return _iconview->maxItemTextLength(); |
972 | } | 961 | } |
973 | void OVersatileView::setAutoArrange( bool b ) // QIconView | 962 | void OVersatileView::setAutoArrange( bool b ) // QIconView |
974 | { | 963 | { |
975 | if ( !isValidViewMode( Icons ) ) | 964 | if ( !isValidViewMode( Icons ) ) |
976 | { | 965 | { |
977 | return; | 966 | return; |
978 | } | 967 | } |
979 | _iconview->setAutoArrange( b ); | 968 | _iconview->setAutoArrange( b ); |
980 | } | 969 | } |
981 | bool OVersatileView::autoArrange() const // QIconView | 970 | bool OVersatileView::autoArrange() const // QIconView |
982 | { | 971 | { |
983 | if ( !isValidViewMode( Icons ) ) | 972 | if ( !isValidViewMode( Icons ) ) |
984 | { | 973 | { |
985 | return false; | 974 | return false; |
986 | } | 975 | } |
987 | return _iconview->autoArrange(); | 976 | return _iconview->autoArrange(); |
988 | } | 977 | } |
989 | void OVersatileView::setShowToolTips( bool b ) // QIconView | 978 | void OVersatileView::setShowToolTips( bool b ) // QIconView |
990 | { | 979 | { |
991 | if ( !isValidViewMode( Icons ) ) | 980 | if ( !isValidViewMode( Icons ) ) |
992 | { | 981 | { |
993 | return; | 982 | return; |
994 | } | 983 | } |
995 | _iconview->setShowToolTips( b ); | 984 | _iconview->setShowToolTips( b ); |
996 | } | 985 | } |
997 | bool OVersatileView::showToolTips() const // QIconView | 986 | bool OVersatileView::showToolTips() const // QIconView |
998 | { | 987 | { |
999 | if ( !isValidViewMode( Icons ) ) | 988 | if ( !isValidViewMode( Icons ) ) |
1000 | { | 989 | { |
1001 | return false; | 990 | return false; |
1002 | } | 991 | } |
1003 | return _iconview->showToolTips(); | 992 | return _iconview->showToolTips(); |
1004 | } | 993 | } |
1005 | 994 | ||
1006 | bool OVersatileView::sorting() const // QIconView | 995 | bool OVersatileView::sorting() const // QIconView |
1007 | { | 996 | { |
1008 | if ( !isValidViewMode( Icons ) ) | 997 | if ( !isValidViewMode( Icons ) ) |
1009 | { | 998 | { |
1010 | return false; | 999 | return false; |
1011 | } | 1000 | } |
1012 | return _iconview->sorting(); | 1001 | return _iconview->sorting(); |
1013 | } | 1002 | } |
1014 | bool OVersatileView::sortDirection() const // QIconView | 1003 | bool OVersatileView::sortDirection() const // QIconView |
1015 | { | 1004 | { |
1016 | if ( !isValidViewMode( Icons ) ) | 1005 | if ( !isValidViewMode( Icons ) ) |
1017 | { | 1006 | { |
1018 | return false; | 1007 | return false; |
1019 | } | 1008 | } |
1020 | return _iconview->sortDirection(); | 1009 | return _iconview->sortDirection(); |
1021 | } | 1010 | } |
1022 | 1011 | ||
1023 | void OVersatileView::setItemsMovable( bool b ) // QIconView | 1012 | void OVersatileView::setItemsMovable( bool b ) // QIconView |
1024 | { | 1013 | { |
1025 | if ( !isValidViewMode( Icons ) ) | 1014 | if ( !isValidViewMode( Icons ) ) |
1026 | { | 1015 | { |
1027 | return; | 1016 | return; |
1028 | } | 1017 | } |
1029 | _iconview->setItemsMovable( b ); | 1018 | _iconview->setItemsMovable( b ); |
1030 | } | 1019 | } |
1031 | bool OVersatileView::itemsMovable() const // QIconView | 1020 | bool OVersatileView::itemsMovable() const // QIconView |
1032 | { | 1021 | { |
1033 | if ( !isValidViewMode( Icons ) ) | 1022 | if ( !isValidViewMode( Icons ) ) |
1034 | { | 1023 | { |
1035 | return false; | 1024 | return false; |
1036 | } | 1025 | } |
1037 | return _iconview->itemsMovable(); | 1026 | return _iconview->itemsMovable(); |
1038 | } | 1027 | } |
1039 | void OVersatileView::setWordWrapIconText( bool b ) // QIconView | 1028 | void OVersatileView::setWordWrapIconText( bool b ) // QIconView |
1040 | { | 1029 | { |
1041 | if ( !isValidViewMode( Icons ) ) | 1030 | if ( !isValidViewMode( Icons ) ) |
1042 | { | 1031 | { |
1043 | return; | 1032 | return; |
1044 | } | 1033 | } |
1045 | _iconview->setWordWrapIconText( b ); | 1034 | _iconview->setWordWrapIconText( b ); |
1046 | } | 1035 | } |
1047 | bool OVersatileView::wordWrapIconText() const // QIconView | 1036 | bool OVersatileView::wordWrapIconText() const // QIconView |
1048 | { | 1037 | { |
1049 | if ( !isValidViewMode( Icons ) ) | 1038 | if ( !isValidViewMode( Icons ) ) |
1050 | { | 1039 | { |
1051 | return false; | 1040 | return false; |
1052 | } | 1041 | } |
1053 | return _iconview->wordWrapIconText(); | 1042 | return _iconview->wordWrapIconText(); |
1054 | } | 1043 | } |
1055 | 1044 | ||
1056 | void OVersatileView::arrangeItemsInGrid( const QSize &grid, bool update ) // QIconView | 1045 | void OVersatileView::arrangeItemsInGrid( const QSize &grid, bool update ) // QIconView |
1057 | { | 1046 | { |
1058 | if ( !isValidViewMode( Icons ) ) | 1047 | if ( !isValidViewMode( Icons ) ) |
1059 | { | 1048 | { |
1060 | return; | 1049 | return; |
1061 | } | 1050 | } |
1062 | _iconview->arrangeItemsInGrid( grid, update ); | 1051 | _iconview->arrangeItemsInGrid( grid, update ); |
1063 | } | 1052 | } |
1064 | void OVersatileView::arrangeItemsInGrid( bool update ) // QIconView | 1053 | void OVersatileView::arrangeItemsInGrid( bool update ) // QIconView |
1065 | { | 1054 | { |
1066 | if ( !isValidViewMode( Icons ) ) | 1055 | if ( !isValidViewMode( Icons ) ) |
1067 | { | 1056 | { |
1068 | return; | 1057 | return; |
1069 | } | 1058 | } |
1070 | _iconview->arrangeItemsInGrid( update ); | 1059 | _iconview->arrangeItemsInGrid( update ); |
1071 | } | 1060 | } |
1072 | void OVersatileView::updateContents() // QIconView | 1061 | void OVersatileView::updateContents() // QIconView |
1073 | { | 1062 | { |
1074 | if ( !isValidViewMode( Icons ) ) | 1063 | if ( !isValidViewMode( Icons ) ) |
1075 | { | 1064 | { |
1076 | return; | 1065 | return; |
1077 | } | 1066 | } |
1078 | _iconview->updateContents(); | 1067 | _iconview->updateContents(); |
1079 | } | 1068 | } |
1080 | 1069 | ||
1081 | //==============================================================================================// | 1070 | //==============================================================================================// |
1082 | // OVersatileView Case II - QListView / QIconView common API | 1071 | // OVersatileView Case II - QListView / QIconView common API |
1083 | //==============================================================================================// | 1072 | //==============================================================================================// |
1084 | 1073 | ||
1085 | void OVersatileView::clear() | 1074 | void OVersatileView::clear() |
1086 | { | 1075 | { |
1087 | _iconview->clear(); | 1076 | _iconview->clear(); |
1088 | _listview->clear(); | 1077 | _listview->clear(); |
1089 | } | 1078 | } |
1090 | 1079 | ||
1091 | void OVersatileView::setFont( const QFont & font ) | 1080 | void OVersatileView::setFont( const QFont & font ) |
1092 | { | 1081 | { |
1093 | _iconview->setFont( font ); | 1082 | _iconview->setFont( font ); |
1094 | _listview->setFont( font ); | 1083 | _listview->setFont( font ); |
1095 | } | 1084 | } |
1096 | void OVersatileView::setPalette( const QPalette & palette ) | 1085 | void OVersatileView::setPalette( const QPalette & palette ) |
1097 | { | 1086 | { |
1098 | _iconview->setPalette( palette ); | 1087 | _iconview->setPalette( palette ); |
1099 | _listview->setPalette( palette ); | 1088 | _listview->setPalette( palette ); |
1100 | } | 1089 | } |
1101 | 1090 | ||
1102 | void OVersatileView::takeItem( OVersatileViewItem * item ) | 1091 | void OVersatileView::takeItem( OVersatileViewItem * item ) |
1103 | { | 1092 | { |
1104 | _iconview->takeItem( item ); | 1093 | _iconview->takeItem( item ); |
1105 | _listview->takeItem( item ); | 1094 | _listview->takeItem( item ); |
1106 | } | 1095 | } |
1107 | 1096 | ||
1108 | void OVersatileView::setSelectionMode( SelectionMode mode ) | 1097 | void OVersatileView::setSelectionMode( SelectionMode mode ) |
1109 | { | 1098 | { |
1110 | _iconview->setSelectionMode( (QIconView::SelectionMode) mode ); | 1099 | _iconview->setSelectionMode( (QIconView::SelectionMode) mode ); |
1111 | _listview->setSelectionMode( (QListView::SelectionMode) mode ); | 1100 | _listview->setSelectionMode( (QListView::SelectionMode) mode ); |
1112 | } | 1101 | } |
1113 | OVersatileView::SelectionMode OVersatileView::selectionMode() const | 1102 | OVersatileView::SelectionMode OVersatileView::selectionMode() const |
1114 | { | 1103 | { |
1115 | return (OVersatileView::SelectionMode) _iconview->selectionMode(); | 1104 | return (OVersatileView::SelectionMode) _iconview->selectionMode(); |
1116 | } | 1105 | } |
1117 | 1106 | ||
1118 | void OVersatileView::selectAll( bool select ) | 1107 | void OVersatileView::selectAll( bool select ) |
1119 | { | 1108 | { |
1120 | _iconview->selectAll( select ); | 1109 | _iconview->selectAll( select ); |
1121 | } | 1110 | } |
1122 | void OVersatileView::clearSelection() | 1111 | void OVersatileView::clearSelection() |
1123 | { | 1112 | { |
1124 | _iconview->clearSelection(); | 1113 | _iconview->clearSelection(); |
1125 | _listview->clearSelection(); | 1114 | _listview->clearSelection(); |
1126 | } | 1115 | } |
1127 | void OVersatileView::invertSelection() | 1116 | void OVersatileView::invertSelection() |
1128 | { | 1117 | { |
1129 | _iconview->invertSelection(); | 1118 | _iconview->invertSelection(); |
1130 | _listview->invertSelection(); | 1119 | _listview->invertSelection(); |
1131 | } | 1120 | } |
1132 | 1121 | ||
1133 | void OVersatileView::ensureItemVisible( const OVersatileViewItem * item ) | 1122 | void OVersatileView::ensureItemVisible( const OVersatileViewItem * item ) |
1134 | { | 1123 | { |
1135 | _iconview->ensureItemVisible( const_cast<OVersatileViewItem*>( item ) ); | 1124 | _iconview->ensureItemVisible( const_cast<OVersatileViewItem*>( item ) ); |
1136 | _listview->ensureItemVisible( item ); | 1125 | _listview->ensureItemVisible( item ); |
1137 | } | 1126 | } |
1138 | void OVersatileView::repaintItem( const OVersatileViewItem * item ) const | 1127 | void OVersatileView::repaintItem( const OVersatileViewItem * item ) const |
1139 | { | 1128 | { |
1140 | _iconview->repaintItem( const_cast<OVersatileViewItem*>( item ) ); | 1129 | _iconview->repaintItem( const_cast<OVersatileViewItem*>( item ) ); |
1141 | _listview->repaintItem( item ); | 1130 | _listview->repaintItem( item ); |
1142 | } | 1131 | } |
1143 | 1132 | ||
1144 | void OVersatileView::setCurrentItem( OVersatileViewItem * item ) | 1133 | void OVersatileView::setCurrentItem( OVersatileViewItem * item ) |
1145 | { | 1134 | { |
1146 | _iconview->setCurrentItem( item ); | 1135 | _iconview->setCurrentItem( item ); |
1147 | _listview->setCurrentItem( item ); | 1136 | _listview->setCurrentItem( item ); |
1148 | } | 1137 | } |
1149 | OVersatileViewItem * OVersatileView::currentItem() const | 1138 | OVersatileViewItem * OVersatileView::currentItem() const |
1150 | { | 1139 | { |
1151 | return static_cast<OVersatileViewItem*>( _listview->currentItem() ); | 1140 | return static_cast<OVersatileViewItem*>( _listview->currentItem() ); |
1152 | } | 1141 | } |
1153 | 1142 | ||
1154 | // bool eventFilter( QObject * o, QEvent * ) // use QWidgetStack implementation | 1143 | // bool eventFilter( QObject * o, QEvent * ) // use QWidgetStack implementation |
1155 | 1144 | ||
1156 | // QSize minimumSizeHint() const // use QWidgetStack implementation | 1145 | // QSize minimumSizeHint() const // use QWidgetStack implementation |
1157 | // QSizePolicy sizePolicy() const // use QWidgetStack implementation | 1146 | // QSizePolicy sizePolicy() const // use QWidgetStack implementation |
1158 | // QSize sizeHint() const // use QWidgetStack implementation | 1147 | // QSize sizeHint() const // use QWidgetStack implementation |
1159 | 1148 | ||
1160 | //==============================================================================================// | 1149 | //==============================================================================================// |
1161 | // OVersatileView Case III - APIs which differ slightly | 1150 | // OVersatileView Case III - APIs which differ slightly |
1162 | //==============================================================================================// | 1151 | //==============================================================================================// |
1163 | 1152 | ||
1164 | /* | 1153 | /* |
1165 | 1154 | ||
1166 | void OVersatileView::insertItem( OVersatileViewItem * ) // QListView | 1155 | void OVersatileView::insertItem( OVersatileViewItem * ) // QListView |
1167 | void OVersatileView::insertItem( OVersatileViewItem *item, OVersatileViewItem *after = 0L ) // QIconView | 1156 | void OVersatileView::insertItem( OVersatileViewItem *item, OVersatileViewItem *after = 0L ) // QIconView |
1168 | 1157 | ||
1169 | void OVersatileView::setSelected( OVersatileViewItem *, bool ) // QListView | 1158 | void OVersatileView::setSelected( OVersatileViewItem *, bool ) // QListView |
1170 | void OVersatileView::setSelected( OVersatileViewItem *item, bool s, bool cb = FALSE ) // QIconView | 1159 | void OVersatileView::setSelected( OVersatileViewItem *item, bool s, bool cb = FALSE ) // QIconView |
1171 | 1160 | ||
1172 | void OVersatileView::setSorting( int column, bool increasing = TRUE ) // QListView | 1161 | void OVersatileView::setSorting( int column, bool increasing = TRUE ) // QListView |
1173 | void OVersatileView::setSorting( bool sort, bool ascending = TRUE ) // QIconView | 1162 | void OVersatileView::setSorting( bool sort, bool ascending = TRUE ) // QIconView |
1174 | 1163 | ||
1175 | void OVersatileView::sort() // #### make in next major release // QListView | 1164 | void OVersatileView::sort() // #### make in next major release // QListView |
1176 | void OVersatileView::sort( bool ascending = TRUE ) // QIconView | 1165 | void OVersatileView::sort( bool ascending = TRUE ) // QIconView |
1177 | 1166 | ||
1178 | */ | 1167 | */ |
1179 | 1168 | ||
1180 | 1169 | ||