summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2005-04-08 22:05:03 (UTC)
committer zautrix <zautrix>2005-04-08 22:05:03 (UTC)
commit9667e6f2589d5b2080cca928814f382761f8dda6 (patch) (unidiff)
tree438bcb5c041de0804284cf457cbc97a367dadf37
parentc0f1d38e29ee0d0a1d1dcb5bda08089923926b41 (diff)
downloadkdepimpi-9667e6f2589d5b2080cca928814f382761f8dda6.zip
kdepimpi-9667e6f2589d5b2080cca928814f382761f8dda6.tar.gz
kdepimpi-9667e6f2589d5b2080cca928814f382761f8dda6.tar.bz2
utf8 kapi import fix
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--bin/kdepim/WhatsNew.txt2
-rw-r--r--kabc/vcardparser/vcard.cpp2
-rw-r--r--kabc/vcardparser/vcardline.cpp14
-rw-r--r--kabc/vcardparser/vcardline.h7
-rw-r--r--kabc/vcardparser/vcardparser.cpp8
-rw-r--r--kabc/vcardparser/vcardtool.cpp86
-rw-r--r--kaddressbook/views/cardview.cpp9
7 files changed, 67 insertions, 61 deletions
diff --git a/bin/kdepim/WhatsNew.txt b/bin/kdepim/WhatsNew.txt
index bc0c62a..97c8154 100644
--- a/bin/kdepim/WhatsNew.txt
+++ b/bin/kdepim/WhatsNew.txt
@@ -1,55 +1,57 @@
1Info about the changes in new versions of KDE-Pim/Pi 1Info about the changes in new versions of KDE-Pim/Pi
2 2
3********** VERSION 2.0.26 ************ 3********** VERSION 2.0.26 ************
4 4
5And again fixed some bugs. 5And again fixed some bugs.
6Added two more fields to the KA/Pi view config: 6Added two more fields to the KA/Pi view config:
7A "Mobile (home)" and a "Mobile (work)" field. 7A "Mobile (home)" and a "Mobile (work)" field.
8Fixed utf8 import (e.g. for Japaneese text) in KA/Pi.
9
8 10
9********** VERSION 2.0.25 ************ 11********** VERSION 2.0.25 ************
10 12
11And again fixed some bugs. 13And again fixed some bugs.
12 14
13********** VERSION 2.0.24 ************ 15********** VERSION 2.0.24 ************
14 16
15Fixed again a lot of small bugs. 17Fixed again a lot of small bugs.
16Some performance optimizations in date navigator. 18Some performance optimizations in date navigator.
17Month view displays now multi days events on top of each cell, such that it is more likely that all multi days items of one event are in the same row. 19Month view displays now multi days events on top of each cell, such that it is more likely that all multi days items of one event are in the same row.
18 20
19********** VERSION 2.0.23 ************ 21********** VERSION 2.0.23 ************
20 22
21Fixed again a lot of small and strange bugs, e.g. the missing toolbar of KA/Pi after a new installation. 23Fixed again a lot of small and strange bugs, e.g. the missing toolbar of KA/Pi after a new installation.
22Fixed the (agenda) layout of KO/Pi on 5500er. 24Fixed the (agenda) layout of KO/Pi on 5500er.
23Some usebility enhancements (e.g. reselection the current item of the todo view after some changes). 25Some usebility enhancements (e.g. reselection the current item of the todo view after some changes).
24 26
25********** VERSION 2.0.22 ************ 27********** VERSION 2.0.22 ************
26 28
27KO/Pi: 29KO/Pi:
28Fix for creating events/todos via the abgenda context menu. 30Fix for creating events/todos via the abgenda context menu.
29Added option to split toolbar to 3 toolbars. 31Added option to split toolbar to 3 toolbars.
30(Toolbar moving s disabled for this option due to a bug in Qt somewhere). 32(Toolbar moving s disabled for this option due to a bug in Qt somewhere).
31Added option to show one small filter-view-toolbar. 33Added option to show one small filter-view-toolbar.
32Added a print option to the desktop version: 34Added a print option to the desktop version:
33Now you can print out the view of the "Event Viewer". 35Now you can print out the view of the "Event Viewer".
34That means you can print all data of one particular event/todo. 36That means you can print all data of one particular event/todo.
35Added scaling options to printout of Event Viewer and What'sNext View. 37Added scaling options to printout of Event Viewer and What'sNext View.
36Fixed some problems in the month view in "week start sunday" mode. 38Fixed some problems in the month view in "week start sunday" mode.
37KA/Pi: 39KA/Pi:
38Added two more config options. 40Added two more config options.
39Fixed resizing problem of address request dialog when orientation was switched. 41Fixed resizing problem of address request dialog when orientation was switched.
40Cleaned up the menu structure. 42Cleaned up the menu structure.
41Fixed some more problems. 43Fixed some more problems.
42 44
43Fixed the annoying problem that scrolling continued after the key was released in KO/Pi Monthview and the KA/Pi views. 45Fixed the annoying problem that scrolling continued after the key was released in KO/Pi Monthview and the KA/Pi views.
44 46
45And, this is a really cool option (Ben did suggest it): 47And, this is a really cool option (Ben did suggest it):
46Now KO/Pi and KA/Pi can be run from a USB stick: 48Now KO/Pi and KA/Pi can be run from a USB stick:
47All data is read from and written to the stick. 49All data is read from and written to the stick.
48You can enable this in the global configure option TAB with: 50You can enable this in the global configure option TAB with:
49Save using LOCAL storage. 51Save using LOCAL storage.
50Just put KDE-Pim/Pi on a memory stick and you can access all your PIM data on every computer with Windows XP. It will work with the ME and Linux versions as well. I will put a memory stick version for teh next stable release online. 52Just put KDE-Pim/Pi on a memory stick and you can access all your PIM data on every computer with Windows XP. It will work with the ME and Linux versions as well. I will put a memory stick version for teh next stable release online.
51 53
52********** VERSION 2.0.21 ************ 54********** VERSION 2.0.21 ************
53 55
54Fixed another SMTP problem in OM/Pi. 56Fixed another SMTP problem in OM/Pi.
55Some small changed in the new datenavigator in KO/Pi. 57Some small changed in the new datenavigator in KO/Pi.
diff --git a/kabc/vcardparser/vcard.cpp b/kabc/vcardparser/vcard.cpp
index 24fd498..bc9f208 100644
--- a/kabc/vcardparser/vcard.cpp
+++ b/kabc/vcardparser/vcard.cpp
@@ -66,53 +66,53 @@ QStringList VCard::identifiers() const
66 66
67void VCard::addLine( const VCardLine& line ) 67void VCard::addLine( const VCardLine& line )
68{ 68{
69 mLineMap[ line.identifier() ].append( line ); 69 mLineMap[ line.identifier() ].append( line );
70} 70}
71 71
72VCardLine::List VCard::lines( const QString& identifier ) const 72VCardLine::List VCard::lines( const QString& identifier ) const
73{ 73{
74 LineMap::ConstIterator it = mLineMap.find( identifier ); 74 LineMap::ConstIterator it = mLineMap.find( identifier );
75 if ( it == mLineMap.end() ) 75 if ( it == mLineMap.end() )
76 return VCardLine::List(); 76 return VCardLine::List();
77 77
78 return *it; 78 return *it;
79} 79}
80 80
81VCardLine VCard::line( const QString& identifier ) const 81VCardLine VCard::line( const QString& identifier ) const
82{ 82{
83 LineMap::ConstIterator it = mLineMap.find( identifier ); 83 LineMap::ConstIterator it = mLineMap.find( identifier );
84 if ( it == mLineMap.end() ) 84 if ( it == mLineMap.end() )
85 return VCardLine(); 85 return VCardLine();
86 86
87 if ( (*it).isEmpty() ) 87 if ( (*it).isEmpty() )
88 return VCardLine(); 88 return VCardLine();
89 else 89 else
90 return (*it).first(); 90 return (*it).first();
91} 91}
92 92
93void VCard::setVersion( Version version ) 93void VCard::setVersion( Version version )
94{ 94{
95 mLineMap.remove( "VERSION" ); 95 mLineMap.remove( "VERSION" );
96 96
97 VCardLine line; 97 VCardLine line;
98 line.setIdentifier( "VERSION" ); 98 line.setIdentifier( "VERSION" );
99 if ( version == v2_1 ) 99 if ( version == v2_1 )
100 line.setIdentifier( "2.1" ); 100 line.setIdentifier( "2.1" );
101 else if ( version == v3_0 ) 101 else if ( version == v3_0 )
102 line.setIdentifier( "3.0" ); 102 line.setIdentifier( "3.0" );
103 103
104 mLineMap[ "VERSION" ].append( line ); 104 mLineMap[ "VERSION" ].append( line );
105} 105}
106 106
107VCard::Version VCard::version() const 107VCard::Version VCard::version() const
108{ 108{
109 LineMap::ConstIterator versionEntry = mLineMap.find( "VERSION" ); 109 LineMap::ConstIterator versionEntry = mLineMap.find( "VERSION" );
110 if ( versionEntry == mLineMap.end() ) 110 if ( versionEntry == mLineMap.end() )
111 return v3_0; 111 return v3_0;
112 112
113 VCardLine line = ( *versionEntry )[ 0 ]; 113 VCardLine line = ( *versionEntry )[ 0 ];
114 if ( line.value() == "2.1" ) 114 if ( line.valueString() == "2.1" )
115 return v2_1; 115 return v2_1;
116 else 116 else
117 return v3_0; 117 return v3_0;
118} 118}
diff --git a/kabc/vcardparser/vcardline.cpp b/kabc/vcardparser/vcardline.cpp
index 0972a35..8df2d32 100644
--- a/kabc/vcardparser/vcardline.cpp
+++ b/kabc/vcardparser/vcardline.cpp
@@ -37,109 +37,113 @@ VCardLine::VCardLine( const QString &identifier )
37 : d( 0 ) 37 : d( 0 )
38{ 38{
39 mIdentifier = identifier; 39 mIdentifier = identifier;
40} 40}
41 41
42VCardLine::VCardLine( const QString &identifier, const QString &value ) 42VCardLine::VCardLine( const QString &identifier, const QString &value )
43 : d( 0 ) 43 : d( 0 )
44{ 44{
45 mIdentifier = identifier; 45 mIdentifier = identifier;
46 mValue.assign( value.data(), value.length() ); 46 mValue.assign( value.data(), value.length() );
47} 47}
48 48
49VCardLine::VCardLine( const VCardLine& line ) 49VCardLine::VCardLine( const VCardLine& line )
50 : d( 0 ) 50 : d( 0 )
51{ 51{
52 mParamMap = line.mParamMap; 52 mParamMap = line.mParamMap;
53 mValue = line.mValue; 53 mValue = line.mValue;
54 mIdentifier = line.mIdentifier; 54 mIdentifier = line.mIdentifier;
55} 55}
56 56
57VCardLine::~VCardLine() 57VCardLine::~VCardLine()
58{ 58{
59 delete d; 59 delete d;
60 d = 0; 60 d = 0;
61} 61}
62 62
63VCardLine& VCardLine::operator=( const VCardLine& line ) 63VCardLine& VCardLine::operator=( const VCardLine& line )
64{ 64{
65 if ( &line == this ) 65 if ( &line == this )
66 return *this; 66 return *this;
67 67
68 mParamMap = line.mParamMap; 68 mParamMap = line.mParamMap;
69 mValue = line.mValue; 69 mValue = line.mValue;
70 mIdentifier = line.mIdentifier; 70 mIdentifier = line.mIdentifier;
71 71
72 return *this; 72 return *this;
73} 73}
74 74
75void VCardLine::setIdentifier( const QString& identifier ) 75void VCardLine::setIdentifier( const QString& identifier )
76{ 76{
77 mIdentifier = identifier; 77 mIdentifier = identifier;
78} 78}
79 79
80QString VCardLine::identifier() const 80QString VCardLine::identifier() const
81{ 81{
82 return mIdentifier; 82 return mIdentifier;
83} 83}
84 84
85void VCardLine::setValue( const QString& value ) 85void VCardLine::setValueString( const QString& value )
86{ 86{
87 mValue.duplicate( value.data(), value.length() ); 87 setValueCString( value.utf8() );
88}
89void VCardLine::setValueCString( const QCString& value )
90{
91 mValue.duplicate( value.data(), value.length() );
88} 92}
89 93
90void VCardLine::setValue( const QByteArray& value ) 94void VCardLine::setValueBytes( const QByteArray& value )
91{ 95{
92 mValue = value; 96 mValue = value;
93} 97}
94 98
95QVariant VCardLine::value() const 99QString VCardLine::valueString() const
96{ 100{
97 return QVariant( QCString( mValue.data(), mValue.size()+1 ) ); 101 return QString::fromUtf8( mValue.data(), mValue.size() );
98} 102}
99 103
100QByteArray VCardLine::valueBytes() const 104QByteArray VCardLine::valueBytes() const
101{ 105{
102 return mValue; 106 return mValue;
103} 107}
104 108
105void VCardLine::setGroup( const QString& group ) 109void VCardLine::setGroup( const QString& group )
106{ 110{
107 if ( !d ) 111 if ( !d )
108 d = new VCardLinePrivate(); 112 d = new VCardLinePrivate();
109 113
110 d->mGroup = group; 114 d->mGroup = group;
111} 115}
112 116
113QString VCardLine::group() const 117QString VCardLine::group() const
114{ 118{
115 if ( d ) 119 if ( d )
116 return d->mGroup; 120 return d->mGroup;
117 else 121 else
118 return QString(); 122 return QString();
119} 123}
120 124
121bool VCardLine::hasGroup() const 125bool VCardLine::hasGroup() const
122{ 126{
123 if ( !d ) 127 if ( !d )
124 return false; 128 return false;
125 else 129 else
126 return d->mGroup.isEmpty(); 130 return d->mGroup.isEmpty();
127} 131}
128 132
129QStringList VCardLine::parameterList() const 133QStringList VCardLine::parameterList() const
130{ 134{
131 //return mParamMap.keys(); 135 //return mParamMap.keys();
132//US method QMap::keys() not available yet. SO collect the data manually 136//US method QMap::keys() not available yet. SO collect the data manually
133//US return mParamMap->keys(); 137//US return mParamMap->keys();
134 138
135 QStringList result; 139 QStringList result;
136 140
137 QMap<QString, QStringList>::ConstIterator it; 141 QMap<QString, QStringList>::ConstIterator it;
138 for( it = mParamMap.begin(); it != mParamMap.end(); ++it ) { 142 for( it = mParamMap.begin(); it != mParamMap.end(); ++it ) {
139 result << it.key().latin1(); 143 result << it.key().latin1();
140 } 144 }
141 return result; 145 return result;
142} 146}
143 147
144void VCardLine::addParameter( const QString& param, const QString& value ) 148void VCardLine::addParameter( const QString& param, const QString& value )
145{ 149{
diff --git a/kabc/vcardparser/vcardline.h b/kabc/vcardparser/vcardline.h
index 6e74b38..8dc9322 100644
--- a/kabc/vcardparser/vcardline.h
+++ b/kabc/vcardparser/vcardline.h
@@ -13,103 +13,104 @@
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21#ifndef VCARDLINE_H 21#ifndef VCARDLINE_H
22#define VCARDLINE_H 22#define VCARDLINE_H
23 23
24#include <qstringlist.h> 24#include <qstringlist.h>
25#include <qvaluelist.h> 25#include <qvaluelist.h>
26#include <qcstring.h> 26#include <qcstring.h>
27#include <qvariant.h> 27#include <qvariant.h>
28#include <qmap.h> 28#include <qmap.h>
29#include <qstring.h> 29#include <qstring.h>
30 30
31namespace KABC { 31namespace KABC {
32 32
33class VCardLine 33class VCardLine
34{ 34{
35 public: 35 public:
36 typedef QValueList<VCardLine> List; 36 typedef QValueList<VCardLine> List;
37 typedef QMap<QString, QStringList> ParamMap; 37 typedef QMap<QString, QStringList> ParamMap;
38 38
39 VCardLine(); 39 VCardLine();
40 VCardLine( const QString &identifier ); 40 VCardLine( const QString &identifier );
41 VCardLine( const QString &identifier, const QString &value ); 41 VCardLine( const QString &identifier, const QString &value );
42 VCardLine( const VCardLine& ); 42 VCardLine( const VCardLine& );
43 43
44 ~VCardLine(); 44 ~VCardLine();
45 45
46 VCardLine& operator=( const VCardLine& ); 46 VCardLine& operator=( const VCardLine& );
47 47
48 /** 48 /**
49 * Sets the identifier of this line e.g. UID, FN, CLASS 49 * Sets the identifier of this line e.g. UID, FN, CLASS
50 */ 50 */
51 void setIdentifier( const QString& identifier ); 51 void setIdentifier( const QString& identifier );
52 52
53 /** 53 /**
54 * Returns the identifier of this line. 54 * Returns the identifier of this line.
55 */ 55 */
56 QString identifier() const; 56 QString identifier() const;
57 57
58 /** 58 /**
59 * Sets the value of of this line. 59 * Sets the value of of this line.
60 */ 60 */
61 void setValue( const QString& value ); 61 void setValueString( const QString& value );
62 void setValue( const QByteArray& value ); 62 void setValueCString( const QCString& value );
63 void setValueBytes( const QByteArray& value );
63 64
64 /** 65 /**
65 * Returns the value of this line. 66 * Returns the value of this line.
66 */ 67 */
67 QVariant value() const; 68 QString valueString() const;
68 QByteArray valueBytes() const; 69 QByteArray valueBytes() const;
69 70
70 /** 71 /**
71 * Sets the group the line belongs to. 72 * Sets the group the line belongs to.
72 */ 73 */
73 void setGroup( const QString& group ); 74 void setGroup( const QString& group );
74 75
75 /** 76 /**
76 * Returns the group the line belongs to. 77 * Returns the group the line belongs to.
77 */ 78 */
78 QString group() const; 79 QString group() const;
79 80
80 /** 81 /**
81 * Returns whether the line belongs to a group. 82 * Returns whether the line belongs to a group.
82 */ 83 */
83 bool hasGroup() const; 84 bool hasGroup() const;
84 85
85 /** 86 /**
86 * Returns all parameters. 87 * Returns all parameters.
87 */ 88 */
88 QStringList parameterList() const; 89 QStringList parameterList() const;
89 90
90 /** 91 /**
91 * Add a new parameter to the line. 92 * Add a new parameter to the line.
92 */ 93 */
93 void addParameter( const QString& param, const QString& value ); 94 void addParameter( const QString& param, const QString& value );
94 95
95 /** 96 /**
96 * Returns the values of a special parameter. 97 * Returns the values of a special parameter.
97 * You can get a list of all parameters with paramList(). 98 * You can get a list of all parameters with paramList().
98 */ 99 */
99 QStringList parameters( const QString& param ) const; 100 QStringList parameters( const QString& param ) const;
100 101
101 /** 102 /**
102 * Returns only the first value of a special parameter. 103 * Returns only the first value of a special parameter.
103 * You can get a list of all parameters with paramList(). 104 * You can get a list of all parameters with paramList().
104 */ 105 */
105 QString parameter( const QString& param ) const; 106 QString parameter( const QString& param ) const;
106 107
107 private: 108 private:
108 ParamMap mParamMap; 109 ParamMap mParamMap;
109 QString mIdentifier; 110 QString mIdentifier;
110 QByteArray mValue; 111 QByteArray mValue;
111 112
112 class VCardLinePrivate; 113 class VCardLinePrivate;
113 VCardLinePrivate *d; 114 VCardLinePrivate *d;
114}; 115};
115 116
diff --git a/kabc/vcardparser/vcardparser.cpp b/kabc/vcardparser/vcardparser.cpp
index 7fae011..11622a0 100644
--- a/kabc/vcardparser/vcardparser.cpp
+++ b/kabc/vcardparser/vcardparser.cpp
@@ -81,160 +81,160 @@ VCard::List VCardParser::parseVCards( const QString& text )
81 81
82 if ( params.count() > 1 ) { // find all parameters 82 if ( params.count() > 1 ) { // find all parameters
83 QStringList::ConstIterator paramIt = params.begin(); 83 QStringList::ConstIterator paramIt = params.begin();
84 for ( ++paramIt; paramIt != params.end(); ++paramIt ) { 84 for ( ++paramIt; paramIt != params.end(); ++paramIt ) {
85 QStringList pair = QStringList::split( '=', *paramIt ); 85 QStringList pair = QStringList::split( '=', *paramIt );
86 if ( pair.count() == 1 ) { 86 if ( pair.count() == 1 ) {
87 // correct the fucking 2.1 'standard' 87 // correct the fucking 2.1 'standard'
88 if ( pair[0].lower() == "quoted-printable" ) { 88 if ( pair[0].lower() == "quoted-printable" ) {
89 pair[0] = "encoding"; 89 pair[0] = "encoding";
90 pair[1] = "quoted-printable"; 90 pair[1] = "quoted-printable";
91 } else if ( pair[0].lower() == "base64" ) { 91 } else if ( pair[0].lower() == "base64" ) {
92 pair[0] = "encoding"; 92 pair[0] = "encoding";
93 pair[1] = "base64"; 93 pair[1] = "base64";
94 } else { 94 } else {
95 pair.prepend( "type" ); 95 pair.prepend( "type" );
96 } 96 }
97 } 97 }
98 // This is pretty much a faster pair[1].contains( ',' )... 98 // This is pretty much a faster pair[1].contains( ',' )...
99 if ( pair[1].find( ',' ) != -1 ) { // parameter in type=x,y,z format 99 if ( pair[1].find( ',' ) != -1 ) { // parameter in type=x,y,z format
100 const QStringList args = QStringList::split( ',', pair[ 1 ] ); 100 const QStringList args = QStringList::split( ',', pair[ 1 ] );
101 QStringList::ConstIterator argIt; 101 QStringList::ConstIterator argIt;
102 for ( argIt = args.begin(); argIt != args.end(); ++argIt ) 102 for ( argIt = args.begin(); argIt != args.end(); ++argIt )
103 vCardLine.addParameter( pair[0].lower(), *argIt ); 103 vCardLine.addParameter( pair[0].lower(), *argIt );
104 } else 104 } else
105 vCardLine.addParameter( pair[0].lower(), pair[1] ); 105 vCardLine.addParameter( pair[0].lower(), pair[1] );
106 } 106 }
107 } 107 }
108 108
109 params = vCardLine.parameterList(); 109 params = vCardLine.parameterList();
110 if ( params.findIndex( "encoding" ) != -1 ) { // have to decode the data 110 if ( params.findIndex( "encoding" ) != -1 ) { // have to decode the data
111 QByteArray input, output; 111 QByteArray input, output;
112 if ( vCardLine.parameter( "encoding" ).lower() == "b" || 112 if ( vCardLine.parameter( "encoding" ).lower() == "b" ||
113 vCardLine.parameter( "encoding" ).lower() == "base64" ) { 113 vCardLine.parameter( "encoding" ).lower() == "base64" ) {
114 input = value.local8Bit(); 114 input = value.local8Bit();
115 KCodecs::base64Decode( input, output ); 115 KCodecs::base64Decode( input, output );
116 } else if ( vCardLine.parameter( "encoding" ).lower() == "quoted-printable" ) { 116 } else if ( vCardLine.parameter( "encoding" ).lower() == "quoted-printable" ) {
117 // join any qp-folded lines 117 // join any qp-folded lines
118 while ( value.mid(value.length()-1,1) == "=" && it != linesEnd ) { 118 while ( value.mid(value.length()-1,1) == "=" && it != linesEnd ) {
119 value = value.remove( value.length()-1, 1 ) + (*it); 119 value = value.remove( value.length()-1, 1 ) + (*it);
120 ++it; 120 ++it;
121 } 121 }
122 input = value.local8Bit(); 122 input = value.local8Bit();
123 KCodecs::quotedPrintableDecode( input, output ); 123 KCodecs::quotedPrintableDecode( input, output );
124 } 124 }
125//PP our vcards are *supposed* to be in UTF-8 125//PP our vcards are *supposed* to be in UTF-8
126// if ( vCardLine.parameter( "charset" ).lower() == "utf-8" ) { 126// if ( vCardLine.parameter( "charset" ).lower() == "utf-8" ) {
127// vCardLine.setValue( QString::fromUtf8( output.data(), output.size() ) ); 127// vCardLine.setValue( QString::fromUtf8( output.data(), output.size() ) );
128// } else 128// } else
129 vCardLine.setValue( output ); 129 vCardLine.setValueBytes( output );
130//PP our vcards are *supposed* to be in UTF-8 130//PP our vcards are *supposed* to be in UTF-8
131// } else if ( vCardLine.parameter( "charset" ).lower() == "utf-8" ) { 131// } else if ( vCardLine.parameter( "charset" ).lower() == "utf-8" ) {
132// vCardLine.setValue( QString::fromUtf8( value.ascii() ) ); 132// vCardLine.setValue( QString::fromUtf8( value.ascii() ) );
133 } else 133 } else
134 vCardLine.setValue( value.replace( QRegExp("\\\\n"), "\n" ) ); 134 vCardLine.setValueString( value.replace( QRegExp("\\\\n"), "\n" ) );
135 135
136 currentVCard.addLine( vCardLine ); 136 currentVCard.addLine( vCardLine );
137 } 137 }
138 138
139 // we do not save the start and end tag as vcardline 139 // we do not save the start and end tag as vcardline
140 if ( (*it).lower().startsWith( "begin:vcard" ) ) { 140 if ( (*it).lower().startsWith( "begin:vcard" ) ) {
141 inVCard = true; 141 inVCard = true;
142 currentLine = ""; 142 currentLine = "";
143 currentVCard.clear(); // flush vcard 143 currentVCard.clear(); // flush vcard
144 continue; 144 continue;
145 } 145 }
146 146
147 if ( (*it).lower().startsWith( "end:vcard" ) ) { 147 if ( (*it).lower().startsWith( "end:vcard" ) ) {
148 inVCard = false; 148 inVCard = false;
149 vCardList.append( currentVCard ); 149 vCardList.append( currentVCard );
150 currentLine = ""; 150 currentLine = "";
151 currentVCard.clear(); // flush vcard 151 currentVCard.clear(); // flush vcard
152 continue; 152 continue;
153 } 153 }
154 154
155 currentLine = (*it); 155 currentLine = (*it);
156 } 156 }
157 } 157 }
158 158
159 return vCardList; 159 return vCardList;
160} 160}
161 161
162QString VCardParser::createVCards( const VCard::List& list ) 162QString VCardParser::createVCards( const VCard::List& list )
163{ 163{
164 QString text; 164 QString text;
165 QString textLine; 165 QString textLine;
166 QString encodingType; 166 QString encodingType;
167 QStringList idents; 167 QStringList idents;
168 QStringList params; 168 QStringList params;
169 QStringList values; 169 QStringList values;
170 QStringList::ConstIterator identIt; 170 QStringList::ConstIterator identIt;
171 QStringList::Iterator paramIt; 171 QStringList::Iterator paramIt;
172 QStringList::ConstIterator valueIt; 172 QStringList::ConstIterator valueIt;
173 173
174 VCardLine::List lines; 174 VCardLine::List lines;
175 VCardLine::List::ConstIterator lineIt; 175 VCardLine::List::ConstIterator lineIt;
176 VCard::List::ConstIterator cardIt; 176 VCard::List::ConstIterator cardIt;
177 177
178 bool hasEncoding; 178 bool hasEncoding;
179 179
180 // iterate over the cards 180 // iterate over the cards
181 VCard::List::ConstIterator listEnd( list.end() ); 181 VCard::List::ConstIterator listEnd( list.end() );
182 for ( cardIt = list.begin(); cardIt != listEnd; ++cardIt ) { 182 for ( cardIt = list.begin(); cardIt != listEnd; ++cardIt ) {
183 text.append( "BEGIN:VCARD\r\n" ); 183 text.append( "BEGIN:VCARD\r\n" );
184 184
185 idents = (*cardIt).identifiers(); 185 idents = (*cardIt).identifiers();
186 for ( identIt = idents.begin(); identIt != idents.end(); ++identIt ) { 186 for ( identIt = idents.begin(); identIt != idents.end(); ++identIt ) {
187 lines = (*cardIt).lines( (*identIt) ); 187 lines = (*cardIt).lines( (*identIt) );
188 188
189 // iterate over the lines 189 // iterate over the lines
190 for ( lineIt = lines.begin(); lineIt != lines.end(); ++lineIt ) { 190 for ( lineIt = lines.begin(); lineIt != lines.end(); ++lineIt ) {
191 if ( !(*lineIt).value().asString().isEmpty() ) { 191 if ( !(*lineIt).valueString().isEmpty() ) {
192 if ( (*lineIt).hasGroup() ) 192 if ( (*lineIt).hasGroup() )
193 textLine = (*lineIt).group() + "." + (*lineIt).identifier(); 193 textLine = (*lineIt).group() + "." + (*lineIt).identifier();
194 else 194 else
195 textLine = (*lineIt).identifier(); 195 textLine = (*lineIt).identifier();
196 196
197 params = (*lineIt).parameterList(); 197 params = (*lineIt).parameterList();
198 hasEncoding = false; 198 hasEncoding = false;
199 if ( params.count() > 0 ) { // we have parameters 199 if ( params.count() > 0 ) { // we have parameters
200 for ( paramIt = params.begin(); paramIt != params.end(); ++paramIt ) { 200 for ( paramIt = params.begin(); paramIt != params.end(); ++paramIt ) {
201 if ( (*paramIt) == "encoding" ) { 201 if ( (*paramIt) == "encoding" ) {
202 hasEncoding = true; 202 hasEncoding = true;
203 encodingType = (*lineIt).parameter( "encoding" ).lower(); 203 encodingType = (*lineIt).parameter( "encoding" ).lower();
204 } 204 }
205 205
206 values = (*lineIt).parameters( *paramIt ); 206 values = (*lineIt).parameters( *paramIt );
207 for ( valueIt = values.begin(); valueIt != values.end(); ++valueIt ) { 207 for ( valueIt = values.begin(); valueIt != values.end(); ++valueIt ) {
208 textLine.append( ";" + (*paramIt).upper() ); 208 textLine.append( ";" + (*paramIt).upper() );
209 if ( !(*valueIt).isEmpty() ) 209 if ( !(*valueIt).isEmpty() )
210 textLine.append( "=" + (*valueIt) ); 210 textLine.append( "=" + (*valueIt) );
211 } 211 }
212 } 212 }
213 } 213 }
214 214
215 if ( hasEncoding ) { // have to encode the data 215 if ( hasEncoding ) { // have to encode the data
216 QByteArray input, output; 216 QByteArray input, output;
217 input = (*lineIt).valueBytes(); 217 input = (*lineIt).valueBytes();
218 if ( encodingType == "b" ) 218 if ( encodingType == "b" )
219 KCodecs::base64Encode( input, output ); 219 KCodecs::base64Encode( input, output );
220 else if ( encodingType == "quoted-printable" ) 220 else if ( encodingType == "quoted-printable" )
221 KCodecs::quotedPrintableEncode( input, output ); 221 KCodecs::quotedPrintableEncode( input, output );
222 textLine.append( ":" + QString( output ) ); 222 textLine.append( ":" + QString( output ) );
223 } else 223 } else
224 textLine.append( ":" + (*lineIt).value().asString().replace( QRegExp("\n"), "\\n" ) ); 224 textLine.append( ":" + (*lineIt).valueString().replace( QRegExp("\n"), "\\n" ) );
225 225
226 if ( textLine.length() > FOLD_WIDTH ) { // we have to fold the line 226 if ( textLine.length() > FOLD_WIDTH ) { // we have to fold the line
227 for ( uint i = 0; i <= ( textLine.length() / FOLD_WIDTH ); ++i ) 227 for ( uint i = 0; i <= ( textLine.length() / FOLD_WIDTH ); ++i )
228 text.append( ( i == 0 ? "" : " " ) + textLine.mid( i * FOLD_WIDTH, FOLD_WIDTH ) + "\r\n" ); 228 text.append( ( i == 0 ? "" : " " ) + textLine.mid( i * FOLD_WIDTH, FOLD_WIDTH ) + "\r\n" );
229 } else 229 } else
230 text.append( textLine + "\r\n" ); 230 text.append( textLine + "\r\n" );
231 } 231 }
232 } 232 }
233 } 233 }
234 234
235 text.append( "END:VCARD\r\n" ); 235 text.append( "END:VCARD\r\n" );
236 text.append( "\r\n" ); 236 text.append( "\r\n" );
237 } 237 }
238 238
239 return text; 239 return text;
240} 240}
diff --git a/kabc/vcardparser/vcardtool.cpp b/kabc/vcardparser/vcardtool.cpp
index 0cf72c0..c3d92b6 100644
--- a/kabc/vcardparser/vcardtool.cpp
+++ b/kabc/vcardparser/vcardtool.cpp
@@ -322,548 +322,548 @@ QString VCardTool::createVCards( Addressee::List list, VCard::Version version )
322 const QStringList customs = (*addrIt).customs(); 322 const QStringList customs = (*addrIt).customs();
323 for ( strIt = customs.begin(); strIt != customs.end(); ++strIt ) { 323 for ( strIt = customs.begin(); strIt != customs.end(); ++strIt ) {
324 QString identifier = "X-" + (*strIt).left( (*strIt).find( ":" ) ); 324 QString identifier = "X-" + (*strIt).left( (*strIt).find( ":" ) );
325 QString value = (*strIt).mid( (*strIt).find( ":" ) + 1 ); 325 QString value = (*strIt).mid( (*strIt).find( ":" ) + 1 );
326 if ( value.isEmpty() ) 326 if ( value.isEmpty() )
327 continue; 327 continue;
328 328
329 VCardLine line( identifier, value ); 329 VCardLine line( identifier, value );
330 if ( version == VCard::v2_1 ) { 330 if ( version == VCard::v2_1 ) {
331 line.addParameter( "CHARSET", "UTF-8" ); 331 line.addParameter( "CHARSET", "UTF-8" );
332 line.addParameter( "ENCODING", "8BIT" ); 332 line.addParameter( "ENCODING", "8BIT" );
333 } 333 }
334 card.addLine( line ); 334 card.addLine( line );
335 } 335 }
336 336
337 vCardList.append( card ); 337 vCardList.append( card );
338 } 338 }
339 339
340 return VCardParser::createVCards( vCardList ); 340 return VCardParser::createVCards( vCardList );
341} 341}
342 342
343Addressee::List VCardTool::parseVCards( const QString& vcard ) 343Addressee::List VCardTool::parseVCards( const QString& vcard )
344{ 344{
345 static const QChar semicolonSep( ';' ); 345 static const QChar semicolonSep( ';' );
346 static const QChar commaSep( ',' ); 346 static const QChar commaSep( ',' );
347 QString identifier; 347 QString identifier;
348 348
349 Addressee::List addrList; 349 Addressee::List addrList;
350 const VCard::List vCardList = VCardParser::parseVCards( vcard ); 350 const VCard::List vCardList = VCardParser::parseVCards( vcard );
351 351
352 VCard::List::ConstIterator cardIt; 352 VCard::List::ConstIterator cardIt;
353 VCard::List::ConstIterator listEnd( vCardList.end() ); 353 VCard::List::ConstIterator listEnd( vCardList.end() );
354 for ( cardIt = vCardList.begin(); cardIt != listEnd; ++cardIt ) { 354 for ( cardIt = vCardList.begin(); cardIt != listEnd; ++cardIt ) {
355 Addressee addr; 355 Addressee addr;
356 356
357 const QStringList idents = (*cardIt).identifiers(); 357 const QStringList idents = (*cardIt).identifiers();
358 QStringList::ConstIterator identIt; 358 QStringList::ConstIterator identIt;
359 QStringList::ConstIterator identEnd( idents.end() ); 359 QStringList::ConstIterator identEnd( idents.end() );
360 for ( identIt = idents.begin(); identIt != identEnd; ++identIt ) { 360 for ( identIt = idents.begin(); identIt != identEnd; ++identIt ) {
361 const VCardLine::List lines = (*cardIt).lines( (*identIt) ); 361 const VCardLine::List lines = (*cardIt).lines( (*identIt) );
362 VCardLine::List::ConstIterator lineIt; 362 VCardLine::List::ConstIterator lineIt;
363 363
364 // iterate over the lines 364 // iterate over the lines
365 for ( lineIt = lines.begin(); lineIt != lines.end(); ++lineIt ) { 365 for ( lineIt = lines.begin(); lineIt != lines.end(); ++lineIt ) {
366 identifier = (*lineIt).identifier().lower(); 366 identifier = (*lineIt).identifier().lower();
367 // ADR 367 // ADR
368 if ( identifier == "adr" ) { 368 if ( identifier == "adr" ) {
369 Address address; 369 Address address;
370 const QStringList addrParts = splitString( semicolonSep, (*lineIt).value().asString() ); 370 const QStringList addrParts = splitString( semicolonSep, (*lineIt).valueString() );
371 if ( addrParts.count() > 0 ) 371 if ( addrParts.count() > 0 )
372 address.setPostOfficeBox( addrParts[ 0 ] ); 372 address.setPostOfficeBox( addrParts[ 0 ] );
373 if ( addrParts.count() > 1 ) 373 if ( addrParts.count() > 1 )
374 address.setExtended( addrParts[ 1 ] ); 374 address.setExtended( addrParts[ 1 ] );
375 if ( addrParts.count() > 2 ) 375 if ( addrParts.count() > 2 )
376 address.setStreet( addrParts[ 2 ] ); 376 address.setStreet( addrParts[ 2 ] );
377 if ( addrParts.count() > 3 ) 377 if ( addrParts.count() > 3 )
378 address.setLocality( addrParts[ 3 ] ); 378 address.setLocality( addrParts[ 3 ] );
379 if ( addrParts.count() > 4 ) 379 if ( addrParts.count() > 4 )
380 address.setRegion( addrParts[ 4 ] ); 380 address.setRegion( addrParts[ 4 ] );
381 if ( addrParts.count() > 5 ) 381 if ( addrParts.count() > 5 )
382 address.setPostalCode( addrParts[ 5 ] ); 382 address.setPostalCode( addrParts[ 5 ] );
383 if ( addrParts.count() > 6 ) 383 if ( addrParts.count() > 6 )
384 address.setCountry( addrParts[ 6 ] ); 384 address.setCountry( addrParts[ 6 ] );
385 385
386 int type = 0; 386 int type = 0;
387 387
388 const QStringList types = (*lineIt).parameters( "type" ); 388 const QStringList types = (*lineIt).parameters( "type" );
389 for ( QStringList::ConstIterator it = types.begin(); it != types.end(); ++it ) 389 for ( QStringList::ConstIterator it = types.begin(); it != types.end(); ++it )
390 type += mAddressTypeMap[ (*it).lower() ]; 390 type += mAddressTypeMap[ (*it).lower() ];
391 391
392 address.setType( type ); 392 address.setType( type );
393 addr.insertAddress( address ); 393 addr.insertAddress( address );
394 } 394 }
395 395
396 // AGENT 396 // AGENT
397 else if ( identifier == "agent" ) 397 else if ( identifier == "agent" )
398 addr.setAgent( parseAgent( *lineIt ) ); 398 addr.setAgent( parseAgent( *lineIt ) );
399 399
400 // BDAY 400 // BDAY
401 else if ( identifier == "bday" ) 401 else if ( identifier == "bday" )
402 addr.setBirthday( parseDateTime( (*lineIt).value().asString() ) ); 402 addr.setBirthday( parseDateTime( (*lineIt).valueString() ) );
403 403
404 // CATEGORIES 404 // CATEGORIES
405 else if ( identifier == "categories" ) { 405 else if ( identifier == "categories" ) {
406 const QStringList categories = splitString( commaSep, (*lineIt).value().asString() ); 406 const QStringList categories = splitString( commaSep, (*lineIt).valueString() );
407 addr.setCategories( categories ); 407 addr.setCategories( categories );
408 } 408 }
409 409
410 // CLASS 410 // CLASS
411 else if ( identifier == "class" ) 411 else if ( identifier == "class" )
412 addr.setSecrecy( parseSecrecy( *lineIt ) ); 412 addr.setSecrecy( parseSecrecy( *lineIt ) );
413 413
414 // EMAIL 414 // EMAIL
415 else if ( identifier == "email" ) { 415 else if ( identifier == "email" ) {
416 const QStringList types = (*lineIt).parameters( "type" ); 416 const QStringList types = (*lineIt).parameters( "type" );
417 addr.insertEmail( (*lineIt).value().asString(), types.findIndex( "PREF" ) != -1 ); 417 addr.insertEmail( (*lineIt).valueString(), types.findIndex( "PREF" ) != -1 );
418 } 418 }
419 419
420 // FN 420 // FN
421 else if ( identifier == "fn" ) 421 else if ( identifier == "fn" )
422 addr.setFormattedName( (*lineIt).value().asString() ); 422 addr.setFormattedName( (*lineIt).valueString() );
423 423
424 // GEO 424 // GEO
425 else if ( identifier == "geo" ) { 425 else if ( identifier == "geo" ) {
426 Geo geo; 426 Geo geo;
427 427
428 const QStringList geoParts = QStringList::split( ';', (*lineIt).value().asString(), true ); 428 const QStringList geoParts = QStringList::split( ';', (*lineIt).valueString(), true );
429 geo.setLatitude( geoParts[ 0 ].toFloat() ); 429 geo.setLatitude( geoParts[ 0 ].toFloat() );
430 geo.setLongitude( geoParts[ 1 ].toFloat() ); 430 geo.setLongitude( geoParts[ 1 ].toFloat() );
431 431
432 addr.setGeo( geo ); 432 addr.setGeo( geo );
433 } 433 }
434 434
435 // KEY 435 // KEY
436 else if ( identifier == "key" ) 436 else if ( identifier == "key" )
437 addr.insertKey( parseKey( *lineIt ) ); 437 addr.insertKey( parseKey( *lineIt ) );
438 438
439 // LABEL 439 // LABEL
440 else if ( identifier == "label" ) { 440 else if ( identifier == "label" ) {
441 int type = 0; 441 int type = 0;
442 442
443 const QStringList types = (*lineIt).parameters( "type" ); 443 const QStringList types = (*lineIt).parameters( "type" );
444 for ( QStringList::ConstIterator it = types.begin(); it != types.end(); ++it ) 444 for ( QStringList::ConstIterator it = types.begin(); it != types.end(); ++it )
445 type += mAddressTypeMap[ (*it).lower() ]; 445 type += mAddressTypeMap[ (*it).lower() ];
446 446
447 bool available = false; 447 bool available = false;
448 KABC::Address::List addressList = addr.addresses(); 448 KABC::Address::List addressList = addr.addresses();
449 KABC::Address::List::Iterator it; 449 KABC::Address::List::Iterator it;
450 for ( it = addressList.begin(); it != addressList.end(); ++it ) { 450 for ( it = addressList.begin(); it != addressList.end(); ++it ) {
451 if ( (*it).type() == type ) { 451 if ( (*it).type() == type ) {
452 (*it).setLabel( (*lineIt).value().asString() ); 452 (*it).setLabel( (*lineIt).valueString() );
453 addr.insertAddress( *it ); 453 addr.insertAddress( *it );
454 available = true; 454 available = true;
455 break; 455 break;
456 } 456 }
457 } 457 }
458 458
459 if ( !available ) { // a standalone LABEL tag 459 if ( !available ) { // a standalone LABEL tag
460 KABC::Address address( type ); 460 KABC::Address address( type );
461 address.setLabel( (*lineIt).value().asString() ); 461 address.setLabel( (*lineIt).valueString() );
462 addr.insertAddress( address ); 462 addr.insertAddress( address );
463 } 463 }
464 } 464 }
465 465
466 // LOGO 466 // LOGO
467 else if ( identifier == "logo" ) 467 else if ( identifier == "logo" )
468 addr.setLogo( parsePicture( *lineIt ) ); 468 addr.setLogo( parsePicture( *lineIt ) );
469 469
470 // MAILER 470 // MAILER
471 else if ( identifier == "mailer" ) 471 else if ( identifier == "mailer" )
472 addr.setMailer( (*lineIt).value().asString() ); 472 addr.setMailer( (*lineIt).valueString() );
473 473
474 // N 474 // N
475 else if ( identifier == "n" ) { 475 else if ( identifier == "n" ) {
476 const QStringList nameParts = splitString( semicolonSep, (*lineIt).value().asString() ); 476 const QStringList nameParts = splitString( semicolonSep, (*lineIt).valueString() );
477 if ( nameParts.count() > 0 ) 477 if ( nameParts.count() > 0 )
478 addr.setFamilyName( nameParts[ 0 ] ); 478 addr.setFamilyName( nameParts[ 0 ] );
479 if ( nameParts.count() > 1 ) 479 if ( nameParts.count() > 1 )
480 addr.setGivenName( nameParts[ 1 ] ); 480 addr.setGivenName( nameParts[ 1 ] );
481 if ( nameParts.count() > 2 ) 481 if ( nameParts.count() > 2 )
482 addr.setAdditionalName( nameParts[ 2 ] ); 482 addr.setAdditionalName( nameParts[ 2 ] );
483 if ( nameParts.count() > 3 ) 483 if ( nameParts.count() > 3 )
484 addr.setPrefix( nameParts[ 3 ] ); 484 addr.setPrefix( nameParts[ 3 ] );
485 if ( nameParts.count() > 4 ) 485 if ( nameParts.count() > 4 )
486 addr.setSuffix( nameParts[ 4 ] ); 486 addr.setSuffix( nameParts[ 4 ] );
487 } 487 }
488 488
489 // NAME 489 // NAME
490 else if ( identifier == "name" ) 490 else if ( identifier == "name" )
491 addr.setName( (*lineIt).value().asString() ); 491 addr.setName( (*lineIt).valueString() );
492 492
493 // NICKNAME 493 // NICKNAME
494 else if ( identifier == "nickname" ) 494 else if ( identifier == "nickname" )
495 addr.setNickName( (*lineIt).value().asString() ); 495 addr.setNickName( (*lineIt).valueString() );
496 496
497 // NOTE 497 // NOTE
498 else if ( identifier == "note" ) 498 else if ( identifier == "note" )
499 addr.setNote( (*lineIt).value().asString() ); 499 addr.setNote( (*lineIt).valueString() );
500 500
501 // ORGANIZATION 501 // ORGANIZATION
502 else if ( identifier == "org" ) 502 else if ( identifier == "org" )
503 addr.setOrganization( (*lineIt).value().asString() ); 503 addr.setOrganization( (*lineIt).valueString() );
504 504
505 // PHOTO 505 // PHOTO
506 else if ( identifier == "photo" ) 506 else if ( identifier == "photo" )
507 addr.setPhoto( parsePicture( *lineIt ) ); 507 addr.setPhoto( parsePicture( *lineIt ) );
508 508
509 // PROID 509 // PROID
510 else if ( identifier == "prodid" ) 510 else if ( identifier == "prodid" )
511 addr.setProductId( (*lineIt).value().asString() ); 511 addr.setProductId( (*lineIt).valueString() );
512 512
513 // REV 513 // REV
514 else if ( identifier == "rev" ) 514 else if ( identifier == "rev" )
515 addr.setRevision( parseDateTime( (*lineIt).value().asString() ) ); 515 addr.setRevision( parseDateTime( (*lineIt).valueString() ) );
516 516
517 // ROLE 517 // ROLE
518 else if ( identifier == "role" ) 518 else if ( identifier == "role" )
519 addr.setRole( (*lineIt).value().asString() ); 519 addr.setRole( (*lineIt).valueString() );
520 520
521 // SORT-STRING 521 // SORT-STRING
522 else if ( identifier == "sort-string" ) 522 else if ( identifier == "sort-string" )
523 addr.setSortString( (*lineIt).value().asString() ); 523 addr.setSortString( (*lineIt).valueString() );
524 524
525 // SOUND 525 // SOUND
526 else if ( identifier == "sound" ) 526 else if ( identifier == "sound" )
527 addr.setSound( parseSound( *lineIt ) ); 527 addr.setSound( parseSound( *lineIt ) );
528 528
529 // TEL 529 // TEL
530 else if ( identifier == "tel" ) { 530 else if ( identifier == "tel" ) {
531 PhoneNumber phone; 531 PhoneNumber phone;
532 phone.setNumber( (*lineIt).value().asString() ); 532 phone.setNumber( (*lineIt).valueString() );
533 533
534 int type = 0; 534 int type = 0;
535 535
536 const QStringList types = (*lineIt).parameters( "type" ); 536 const QStringList types = (*lineIt).parameters( "type" );
537 for ( QStringList::ConstIterator it = types.begin(); it != types.end(); ++it ) 537 for ( QStringList::ConstIterator it = types.begin(); it != types.end(); ++it )
538 type += mPhoneTypeMap[(*it).upper()]; 538 type += mPhoneTypeMap[(*it).upper()];
539 539
540 phone.setType( type ); 540 phone.setType( type );
541 541
542 addr.insertPhoneNumber( phone ); 542 addr.insertPhoneNumber( phone );
543 } 543 }
544 544
545 // TITLE 545 // TITLE
546 else if ( identifier == "title" ) 546 else if ( identifier == "title" )
547 addr.setTitle( (*lineIt).value().asString() ); 547 addr.setTitle( (*lineIt).valueString() );
548 548
549 // TZ 549 // TZ
550 else if ( identifier == "tz" ) { 550 else if ( identifier == "tz" ) {
551 TimeZone tz; 551 TimeZone tz;
552 const QString date = (*lineIt).value().asString(); 552 const QString date = (*lineIt).valueString();
553 553
554 int hours = date.mid( 1, 2).toInt(); 554 int hours = date.mid( 1, 2).toInt();
555 int minutes = date.mid( 4, 2 ).toInt(); 555 int minutes = date.mid( 4, 2 ).toInt();
556 int offset = ( hours * 60 ) + minutes; 556 int offset = ( hours * 60 ) + minutes;
557 offset = offset * ( date[ 0 ] == '+' ? 1 : -1 ); 557 offset = offset * ( date[ 0 ] == '+' ? 1 : -1 );
558 558
559 tz.setOffset( offset ); 559 tz.setOffset( offset );
560 addr.setTimeZone( tz ); 560 addr.setTimeZone( tz );
561 } 561 }
562 562
563 // UID 563 // UID
564 else if ( identifier == "uid" ) 564 else if ( identifier == "uid" )
565 addr.setUid( (*lineIt).value().asString() ); 565 addr.setUid( (*lineIt).valueString() );
566 566
567 // URL 567 // URL
568 else if ( identifier == "url" ) 568 else if ( identifier == "url" )
569 addr.setUrl( KURL( (*lineIt).value().asString() ) ); 569 addr.setUrl( KURL( (*lineIt).valueString() ) );
570 570
571 // X- 571 // X-
572 else if ( identifier.startsWith( "x-" ) ) { 572 else if ( identifier.startsWith( "x-" ) ) {
573 const QString key = (*lineIt).identifier().mid( 2 ); 573 const QString key = (*lineIt).identifier().mid( 2 );
574 int dash = key.find( "-" ); 574 int dash = key.find( "-" );
575 addr.insertCustom( key.left( dash ), key.mid( dash + 1 ), (*lineIt).value().asString() ); 575 addr.insertCustom( key.left( dash ), key.mid( dash + 1 ), (*lineIt).valueString() );
576 } 576 }
577 } 577 }
578 } 578 }
579 579
580 addrList.append( addr ); 580 addrList.append( addr );
581 } 581 }
582 582
583 return addrList; 583 return addrList;
584} 584}
585 585
586QDateTime VCardTool::parseDateTime( const QString &str ) 586QDateTime VCardTool::parseDateTime( const QString &str )
587{ 587{
588 QDateTime dateTime; 588 QDateTime dateTime;
589 589
590 if ( str.find( '-' ) == -1 ) { // is base format (yyyymmdd) 590 if ( str.find( '-' ) == -1 ) { // is base format (yyyymmdd)
591 dateTime.setDate( QDate( str.left( 4 ).toInt(), str.mid( 4, 2 ).toInt(), 591 dateTime.setDate( QDate( str.left( 4 ).toInt(), str.mid( 4, 2 ).toInt(),
592 str.mid( 6, 2 ).toInt() ) ); 592 str.mid( 6, 2 ).toInt() ) );
593 593
594 if ( str.find( 'T' ) ) // has time information yyyymmddThh:mm:ss 594 if ( str.find( 'T' ) ) // has time information yyyymmddThh:mm:ss
595 dateTime.setTime( QTime( str.mid( 11, 2 ).toInt(), str.mid( 14, 2 ).toInt(), 595 dateTime.setTime( QTime( str.mid( 11, 2 ).toInt(), str.mid( 14, 2 ).toInt(),
596 str.mid( 17, 2 ).toInt() ) ); 596 str.mid( 17, 2 ).toInt() ) );
597 597
598 } else { // is extended format yyyy-mm-dd 598 } else { // is extended format yyyy-mm-dd
599 dateTime.setDate( QDate( str.left( 4 ).toInt(), str.mid( 5, 2 ).toInt(), 599 dateTime.setDate( QDate( str.left( 4 ).toInt(), str.mid( 5, 2 ).toInt(),
600 str.mid( 8, 2 ).toInt() ) ); 600 str.mid( 8, 2 ).toInt() ) );
601 601
602 if ( str.find( 'T' ) ) // has time information yyyy-mm-ddThh:mm:ss 602 if ( str.find( 'T' ) ) // has time information yyyy-mm-ddThh:mm:ss
603 dateTime.setTime( QTime( str.mid( 11, 2 ).toInt(), str.mid( 14, 2 ).toInt(), 603 dateTime.setTime( QTime( str.mid( 11, 2 ).toInt(), str.mid( 14, 2 ).toInt(),
604 str.mid( 17, 2 ).toInt() ) ); 604 str.mid( 17, 2 ).toInt() ) );
605 } 605 }
606 606
607 return dateTime; 607 return dateTime;
608} 608}
609 609
610QString VCardTool::createDateTime( const QDateTime &dateTime ) 610QString VCardTool::createDateTime( const QDateTime &dateTime )
611{ 611{
612 QString str; 612 QString str;
613 613
614 if ( dateTime.date().isValid() ) { 614 if ( dateTime.date().isValid() ) {
615 str.sprintf( "%4d-%02d-%02d", dateTime.date().year(), dateTime.date().month(), 615 str.sprintf( "%4d-%02d-%02d", dateTime.date().year(), dateTime.date().month(),
616 dateTime.date().day() ); 616 dateTime.date().day() );
617 if ( dateTime.time().isValid() ) { 617 if ( dateTime.time().isValid() ) {
618 QString tmp; 618 QString tmp;
619 tmp.sprintf( "T%02d:%02d:%02dZ", dateTime.time().hour(), dateTime.time().minute(), 619 tmp.sprintf( "T%02d:%02d:%02dZ", dateTime.time().hour(), dateTime.time().minute(),
620 dateTime.time().second() ); 620 dateTime.time().second() );
621 str += tmp; 621 str += tmp;
622 } 622 }
623 } 623 }
624 624
625 return str; 625 return str;
626} 626}
627 627
628Picture VCardTool::parsePicture( const VCardLine &line ) 628Picture VCardTool::parsePicture( const VCardLine &line )
629{ 629{
630 Picture pic; 630 Picture pic;
631 631
632 const QStringList params = line.parameterList(); 632 const QStringList params = line.parameterList();
633 if ( params.findIndex( "encoding" ) != -1 ) { 633 if ( params.findIndex( "encoding" ) != -1 ) {
634 QImage img; 634 QImage img;
635 img.loadFromData( line.valueBytes() ); 635 img.loadFromData( line.valueBytes() );
636 pic.setData( img ); 636 pic.setData( img );
637 } else if ( params.findIndex( "value" ) != -1 ) { 637 } else if ( params.findIndex( "value" ) != -1 ) {
638 if ( line.parameter( "value" ).lower() == "uri" ) 638 if ( line.parameter( "value" ).lower() == "uri" )
639 pic.setUrl( line.value().asString() ); 639 pic.setUrl( line.valueString() );
640 } 640 }
641 641
642 if ( params.findIndex( "type" ) != -1 ) 642 if ( params.findIndex( "type" ) != -1 )
643 pic.setType( line.parameter( "type" ) ); 643 pic.setType( line.parameter( "type" ) );
644 644
645 return pic; 645 return pic;
646} 646}
647 647
648VCardLine VCardTool::createPicture( const QString &identifier, const Picture &pic ) 648VCardLine VCardTool::createPicture( const QString &identifier, const Picture &pic )
649{ 649{
650 VCardLine line( identifier ); 650 VCardLine line( identifier );
651 651
652 if ( pic.isIntern() ) { 652 if ( pic.isIntern() ) {
653 if ( !pic.data().isNull() ) { 653 if ( !pic.data().isNull() ) {
654 QByteArray input; 654 QByteArray input;
655 QDataStream s( input, IO_WriteOnly ); 655 QDataStream s( input, IO_WriteOnly );
656 s.setVersion( 4 ); 656 s.setVersion( 4 );
657 s << pic.data(); 657 s << pic.data();
658 line.setValue( input ); 658 line.setValueBytes( input );
659 line.addParameter( "encoding", "b" ); 659 line.addParameter( "encoding", "b" );
660 line.addParameter( "type", "image/png" ); 660 line.addParameter( "type", "image/png" );
661 } 661 }
662 } else if ( !pic.url().isEmpty() ) { 662 } else if ( !pic.url().isEmpty() ) {
663 QByteArray ba; 663 QByteArray ba;
664 line.setValue( pic.url() ); 664 line.setValueString( pic.url() );
665 line.addParameter( "value", "URI" ); 665 line.addParameter( "value", "URI" );
666 } 666 }
667 667
668 return line; 668 return line;
669} 669}
670 670
671Sound VCardTool::parseSound( const VCardLine &line ) 671Sound VCardTool::parseSound( const VCardLine &line )
672{ 672{
673 Sound snd; 673 Sound snd;
674 674
675 const QStringList params = line.parameterList(); 675 const QStringList params = line.parameterList();
676 if ( params.findIndex( "encoding" ) != -1 ) 676 if ( params.findIndex( "encoding" ) != -1 )
677 snd.setData( line.valueBytes() ); 677 snd.setData( line.valueBytes() );
678 else if ( params.findIndex( "value" ) != -1 ) { 678 else if ( params.findIndex( "value" ) != -1 ) {
679 if ( line.parameter( "value" ).lower() == "uri" ) 679 if ( line.parameter( "value" ).lower() == "uri" )
680 snd.setUrl( line.value().asString() ); 680 snd.setUrl( line.valueString() );
681 } 681 }
682 682
683/* TODO: support sound types 683/* TODO: support sound types
684 if ( params.contains( "type" ) ) 684 if ( params.contains( "type" ) )
685 snd.setType( line.parameter( "type" ) ); 685 snd.setType( line.parameter( "type" ) );
686*/ 686*/
687 687
688 return snd; 688 return snd;
689} 689}
690 690
691VCardLine VCardTool::createSound( const Sound &snd ) 691VCardLine VCardTool::createSound( const Sound &snd )
692{ 692{
693 VCardLine line( "SOUND" ); 693 VCardLine line( "SOUND" );
694 694
695 if ( snd.isIntern() ) { 695 if ( snd.isIntern() ) {
696 if ( !snd.data().isEmpty() ) { 696 if ( !snd.data().isEmpty() ) {
697 line.setValue( snd.data() ); 697 line.setValueBytes( snd.data() );
698 line.addParameter( "encoding", "b" ); 698 line.addParameter( "encoding", "b" );
699 // TODO: need to store sound type!!! 699 // TODO: need to store sound type!!!
700 } 700 }
701 } else if ( !snd.url().isEmpty() ) { 701 } else if ( !snd.url().isEmpty() ) {
702 line.setValue( snd.url() ); 702 line.setValueString( snd.url() );
703 line.addParameter( "value", "URI" ); 703 line.addParameter( "value", "URI" );
704 } 704 }
705 705
706 return line; 706 return line;
707} 707}
708 708
709Key VCardTool::parseKey( const VCardLine &line ) 709Key VCardTool::parseKey( const VCardLine &line )
710{ 710{
711 Key key; 711 Key key;
712 712
713 const QStringList params = line.parameterList(); 713 const QStringList params = line.parameterList();
714 if ( params.findIndex( "encoding" ) != -1 ) 714 if ( params.findIndex( "encoding" ) != -1 )
715 key.setBinaryData( line.valueBytes() ); 715 key.setBinaryData( line.valueBytes() );
716 else 716 else
717 key.setTextData( line.value().asString() ); 717 key.setTextData( line.valueString() );
718 718
719 if ( params.findIndex( "type" ) != -1 ) { 719 if ( params.findIndex( "type" ) != -1 ) {
720 if ( line.parameter( "type" ).lower() == "x509" ) 720 if ( line.parameter( "type" ).lower() == "x509" )
721 key.setType( Key::X509 ); 721 key.setType( Key::X509 );
722 else if ( line.parameter( "type" ).lower() == "pgp" ) 722 else if ( line.parameter( "type" ).lower() == "pgp" )
723 key.setType( Key::PGP ); 723 key.setType( Key::PGP );
724 else { 724 else {
725 key.setType( Key::Custom ); 725 key.setType( Key::Custom );
726 key.setCustomTypeString( line.parameter( "type" ) ); 726 key.setCustomTypeString( line.parameter( "type" ) );
727 } 727 }
728 } 728 }
729 729
730 return key; 730 return key;
731} 731}
732 732
733VCardLine VCardTool::createKey( const Key &key ) 733VCardLine VCardTool::createKey( const Key &key )
734{ 734{
735 VCardLine line( "KEY" ); 735 VCardLine line( "KEY" );
736 736
737 if ( key.isBinary() ) { 737 if ( key.isBinary() ) {
738 if ( !key.binaryData().isEmpty() ) { 738 if ( !key.binaryData().isEmpty() ) {
739 line.setValue( key.binaryData() ); 739 line.setValueBytes( key.binaryData() );
740 line.addParameter( "encoding", "b" ); 740 line.addParameter( "encoding", "b" );
741 } 741 }
742 } else if ( !key.textData().isEmpty() ) 742 } else if ( !key.textData().isEmpty() )
743 line.setValue( key.textData() ); 743 line.setValueString( key.textData() );
744 744
745 if ( key.type() == Key::X509 ) 745 if ( key.type() == Key::X509 )
746 line.addParameter( "type", "X509" ); 746 line.addParameter( "type", "X509" );
747 else if ( key.type() == Key::PGP ) 747 else if ( key.type() == Key::PGP )
748 line.addParameter( "type", "PGP" ); 748 line.addParameter( "type", "PGP" );
749 else if ( key.type() == Key::Custom ) 749 else if ( key.type() == Key::Custom )
750 line.addParameter( "type", key.customTypeString() ); 750 line.addParameter( "type", key.customTypeString() );
751 751
752 return line; 752 return line;
753} 753}
754 754
755Secrecy VCardTool::parseSecrecy( const VCardLine &line ) 755Secrecy VCardTool::parseSecrecy( const VCardLine &line )
756{ 756{
757 Secrecy secrecy; 757 Secrecy secrecy;
758 758
759 if ( line.value().asString().lower() == "public" ) 759 if ( line.valueString().lower() == "public" )
760 secrecy.setType( Secrecy::Public ); 760 secrecy.setType( Secrecy::Public );
761 if ( line.value().asString().lower() == "private" ) 761 if ( line.valueString().lower() == "private" )
762 secrecy.setType( Secrecy::Private ); 762 secrecy.setType( Secrecy::Private );
763 if ( line.value().asString().lower() == "confidential" ) 763 if ( line.valueString().lower() == "confidential" )
764 secrecy.setType( Secrecy::Confidential ); 764 secrecy.setType( Secrecy::Confidential );
765 765
766 return secrecy; 766 return secrecy;
767} 767}
768 768
769VCardLine VCardTool::createSecrecy( const Secrecy &secrecy ) 769VCardLine VCardTool::createSecrecy( const Secrecy &secrecy )
770{ 770{
771 VCardLine line( "CLASS" ); 771 VCardLine line( "CLASS" );
772 772
773 int type = secrecy.type(); 773 int type = secrecy.type();
774 774
775 if ( type == Secrecy::Public ) 775 if ( type == Secrecy::Public )
776 line.setValue( "PUBLIC" ); 776 line.setValueString( "PUBLIC" );
777 else if ( type == Secrecy::Private ) 777 else if ( type == Secrecy::Private )
778 line.setValue( "PRIVATE" ); 778 line.setValueString( "PRIVATE" );
779 else if ( type == Secrecy::Confidential ) 779 else if ( type == Secrecy::Confidential )
780 line.setValue( "CONFIDENTIAL" ); 780 line.setValueString( "CONFIDENTIAL" );
781 781
782 return line; 782 return line;
783} 783}
784 784
785Agent VCardTool::parseAgent( const VCardLine &line ) 785Agent VCardTool::parseAgent( const VCardLine &line )
786{ 786{
787 Agent agent; 787 Agent agent;
788 788
789 const QStringList params = line.parameterList(); 789 const QStringList params = line.parameterList();
790 if ( params.findIndex( "value" ) != -1 ) { 790 if ( params.findIndex( "value" ) != -1 ) {
791 if ( line.parameter( "value" ).lower() == "uri" ) 791 if ( line.parameter( "value" ).lower() == "uri" )
792 agent.setUrl( line.value().asString() ); 792 agent.setUrl( line.valueString() );
793 } else { 793 } else {
794 QString str = line.value().asString(); 794 QString str = line.valueString();
795 str.replace( QRegExp("\\\\n"), "\r\n" ); 795 str.replace( QRegExp("\\\\n"), "\r\n" );
796 str.replace( QRegExp("\\\\N"), "\r\n" ); 796 str.replace( QRegExp("\\\\N"), "\r\n" );
797 str.replace( QRegExp("\\\\;"), ";" ); 797 str.replace( QRegExp("\\\\;"), ";" );
798 str.replace( QRegExp("\\\\:"), ":" ); 798 str.replace( QRegExp("\\\\:"), ":" );
799 str.replace( QRegExp("\\\\,"), "," ); 799 str.replace( QRegExp("\\\\,"), "," );
800 800
801 const Addressee::List list = parseVCards( str ); 801 const Addressee::List list = parseVCards( str );
802 if ( list.count() > 0 ) { 802 if ( list.count() > 0 ) {
803 Addressee *addr = new Addressee; 803 Addressee *addr = new Addressee;
804 *addr = list[ 0 ]; 804 *addr = list[ 0 ];
805 agent.setAddressee( addr ); 805 agent.setAddressee( addr );
806 } 806 }
807 } 807 }
808 808
809 return agent; 809 return agent;
810} 810}
811 811
812VCardLine VCardTool::createAgent( VCard::Version version, const Agent &agent ) 812VCardLine VCardTool::createAgent( VCard::Version version, const Agent &agent )
813{ 813{
814 VCardLine line( "AGENT" ); 814 VCardLine line( "AGENT" );
815 815
816 if ( agent.isIntern() ) { 816 if ( agent.isIntern() ) {
817 if ( agent.addressee() != 0 ) { 817 if ( agent.addressee() != 0 ) {
818 Addressee::List list; 818 Addressee::List list;
819 list.append( *agent.addressee() ); 819 list.append( *agent.addressee() );
820 820
821 QString str = createVCards( list, version ); 821 QString str = createVCards( list, version );
822 str.replace( QRegExp("\\r\\n"), "\\n" ); 822 str.replace( QRegExp("\\r\\n"), "\\n" );
823 str.replace( QRegExp(";"), "\\;" ); 823 str.replace( QRegExp(";"), "\\;" );
824 str.replace( QRegExp(":"), "\\:" ); 824 str.replace( QRegExp(":"), "\\:" );
825 str.replace( QRegExp(","), "\\," ); 825 str.replace( QRegExp(","), "\\," );
826 line.setValue( str ); 826 line.setValueString( str );
827 } 827 }
828 } else if ( !agent.url().isEmpty() ) { 828 } else if ( !agent.url().isEmpty() ) {
829 line.setValue( agent.url() ); 829 line.setValueString( agent.url() );
830 line.addParameter( "value", "URI" ); 830 line.addParameter( "value", "URI" );
831 } 831 }
832 832
833 return line; 833 return line;
834} 834}
835 835
836QStringList VCardTool::splitString( const QChar &sep, const QString &str ) 836QStringList VCardTool::splitString( const QChar &sep, const QString &str )
837{ 837{
838 QStringList list; 838 QStringList list;
839 QString value( str ); 839 QString value( str );
840 840
841 int start = 0; 841 int start = 0;
842 int pos = value.find( sep, start ); 842 int pos = value.find( sep, start );
843 843
844 while ( pos != -1 ) { 844 while ( pos != -1 ) {
845 if ( value[ pos - 1 ] != '\\' ) { 845 if ( value[ pos - 1 ] != '\\' ) {
846 if ( pos > start && pos <= (int)value.length() ) 846 if ( pos > start && pos <= (int)value.length() )
847 list << value.mid( start, pos - start ); 847 list << value.mid( start, pos - start );
848 else 848 else
849 list << QString::null; 849 list << QString::null;
850 850
851 start = pos + 1; 851 start = pos + 1;
852 pos = value.find( sep, start ); 852 pos = value.find( sep, start );
853 } else { 853 } else {
854 if ( pos != 0 ) { 854 if ( pos != 0 ) {
855 value.replace( pos - 1, 2, sep ); 855 value.replace( pos - 1, 2, sep );
856 pos = value.find( sep, pos ); 856 pos = value.find( sep, pos );
857 } else 857 } else
858 pos = value.find( sep, pos + 1 ); 858 pos = value.find( sep, pos + 1 );
859 } 859 }
860 } 860 }
861 861
862 int l = value.length() - 1; 862 int l = value.length() - 1;
863 if ( value.mid( start, l - start + 1 ).length() > 0 ) 863 if ( value.mid( start, l - start + 1 ).length() > 0 )
864 list << value.mid( start, l - start + 1 ); 864 list << value.mid( start, l - start + 1 );
865 else 865 else
866 list << QString::null; 866 list << QString::null;
867 867
868 return list; 868 return list;
869} 869}
diff --git a/kaddressbook/views/cardview.cpp b/kaddressbook/views/cardview.cpp
index 84d3116..b6e053f 100644
--- a/kaddressbook/views/cardview.cpp
+++ b/kaddressbook/views/cardview.cpp
@@ -891,114 +891,113 @@ CardViewItem *CardView::selectedItem() const
891CardViewItem *CardView::firstItem() const 891CardViewItem *CardView::firstItem() const
892{ 892{
893 return d->mItemList.first(); 893 return d->mItemList.first();
894} 894}
895 895
896int CardView::childCount() const 896int CardView::childCount() const
897{ 897{
898 return d->mItemList.count(); 898 return d->mItemList.count();
899} 899}
900/*US 900/*US
901CardViewItem *CardView::findItem(const QString &text, const QString &label, 901CardViewItem *CardView::findItem(const QString &text, const QString &label,
902 Qt::StringComparisonMode compare) 902 Qt::StringComparisonMode compare)
903{ 903{
904 // IF the text is empty, we will return null, since empty text will 904 // IF the text is empty, we will return null, since empty text will
905 // match anything! 905 // match anything!
906 if (text.isEmpty()) 906 if (text.isEmpty())
907 return 0; 907 return 0;
908 908
909 QPtrListIterator<CardViewItem> iter(d->mItemList); 909 QPtrListIterator<CardViewItem> iter(d->mItemList);
910 if (compare & Qt::BeginsWith) 910 if (compare & Qt::BeginsWith)
911 { 911 {
912 QString value; 912 QString value;
913 for (iter.toFirst(); iter.current(); ++iter) 913 for (iter.toFirst(); iter.current(); ++iter)
914 { 914 {
915 value = (*iter)->fieldValue(label).upper(); 915 value = (*iter)->fieldValue(label).upper();
916 if (value.startsWith(text.upper())) 916 if (value.startsWith(text.upper()))
917 return *iter; 917 return *iter;
918 } 918 }
919 } 919 }
920 else 920 else
921 { 921 {
922 kdDebug(5720) << "CardView::findItem: search method not implemented" << endl; 922 kdDebug(5720) << "CardView::findItem: search method not implemented" << endl;
923 } 923 }
924 924
925 return 0; 925 return 0;
926} 926}
927*/ 927*/
928 928
929uint CardView::columnWidth() 929uint CardView::columnWidth()
930{ 930{
931 return d->mDrawSeparators ? 931 return d->mDrawSeparators ?
932 d->mItemWidth + ( 2 * d->mItemSpacing ) + d->mSepWidth : 932 d->mItemWidth + ( 2 * d->mItemSpacing ) + d->mSepWidth :
933 d->mItemWidth + d->mItemSpacing; 933 d->mItemWidth + d->mItemSpacing;
934} 934}
935 935
936void CardView::drawContents(QPainter *p, int clipx, int clipy, 936void CardView::drawContents(QPainter *p, int clipx, int clipy,
937 int clipw, int cliph) 937 int clipw, int cliph)
938{ 938{
939 QScrollView::drawContents(p, clipx, clipy, clipw, cliph); 939 //QScrollView::drawContents(p, clipx, clipy, clipw, cliph);
940
941 if (d->mLayoutDirty) 940 if (d->mLayoutDirty)
942 calcLayout(); 941 calcLayout();
943 942
944 //kdDebug() << "CardView::drawContents: " << clipx << ", " << clipy 943 //kdDebug() << "CardView::drawContents: " << clipx << ", " << clipy
945 // << ", " << clipw << ", " << cliph << endl; 944 // << ", " << clipw << ", " << cliph << endl;
946 945
947 QColorGroup cg = viewport()->palette().active(); // allow setting costum colors in the viewport pale 946 QColorGroup cg = viewport()->palette().active(); // allow setting costum colors in the viewport pale
948 947 int cX, cY;
948 contentsToViewport ( clipx, clipy, cX, cY );
949 QRect clipRect(clipx, clipy, clipw, cliph); 949 QRect clipRect(clipx, clipy, clipw, cliph);
950 QRect cardRect; 950 QRect cardRect;
951 QRect sepRect; 951 QRect sepRect;
952 CardViewItem *item; 952 CardViewItem *item;
953 CardViewSeparator *sep; 953 CardViewSeparator *sep;
954
955 // make sure the viewport is a pure background 954 // make sure the viewport is a pure background
956 viewport()->erase(clipRect); 955 viewport()->erase( QRect ( cX, cY , clipw, cliph ) );
957 956
958 // Now tell the cards to draw, if they are in the clip region 957 // Now tell the cards to draw, if they are in the clip region
959 QPtrListIterator<CardViewItem> iter(d->mItemList); 958 QPtrListIterator<CardViewItem> iter(d->mItemList);
960 for (iter.toFirst(); iter.current(); ++iter) 959 for (iter.toFirst(); iter.current(); ++iter)
961 { 960 {
962 item = *iter; 961 item = *iter;
963 cardRect.setRect( item->d->x, item->d->y, d->mItemWidth, item->height() ); 962 cardRect.setRect( item->d->x, item->d->y, d->mItemWidth, item->height() );
964 963
965 if (clipRect.intersects(cardRect) || clipRect.contains(cardRect)) 964 if (clipRect.intersects(cardRect) || clipRect.contains(cardRect))
966 { 965 {
967 //kdDebug() << "\trepainting card at: " << cardRect.x() << ", " 966 //kdDebug() << "\trepainting card at: " << cardRect.x() << ", "
968 // << cardRect.y() << endl; 967 // << cardRect.y() << endl;
969 968
970 // Tell the card to paint 969 // Tell the card to paint
971 p->save(); 970 p->save();
972 p->translate(cardRect.x(), cardRect.y()); 971 p->translate(cardRect.x(), cardRect.y());
973 item->paintCard(p, cg); 972 item->paintCard(p, cg);
974 p->restore(); 973 p->restore();
975 } 974 }
976 } 975 }
977 976
978 // Followed by the separators if they are in the clip region 977 // Followed by the separators if they are in the clip region
979 QPtrListIterator<CardViewSeparator> sepIter(d->mSeparatorList); 978 QPtrListIterator<CardViewSeparator> sepIter(d->mSeparatorList);
980 for (sepIter.toFirst(); sepIter.current(); ++sepIter) 979 for (sepIter.toFirst(); sepIter.current(); ++sepIter)
981 { 980 {
982 sep = *sepIter; 981 sep = *sepIter;
983 sepRect = sep->mRect; 982 sepRect = sep->mRect;
984 983
985 if (clipRect.intersects(sepRect) || clipRect.contains(sepRect)) 984 if (clipRect.intersects(sepRect) || clipRect.contains(sepRect))
986 { 985 {
987 p->save(); 986 p->save();
988 p->translate(sepRect.x(), sepRect.y()); 987 p->translate(sepRect.x(), sepRect.y());
989 sep->paintSeparator(p, cg); 988 sep->paintSeparator(p, cg);
990 p->restore(); 989 p->restore();
991 } 990 }
992 } 991 }
993} 992}
994 993
995void CardView::resizeEvent(QResizeEvent *e) 994void CardView::resizeEvent(QResizeEvent *e)
996{ 995{
997 QScrollView::resizeEvent(e); 996 QScrollView::resizeEvent(e);
998 997
999 setLayoutDirty(true); 998 setLayoutDirty(true);
1000} 999}
1001 1000
1002void CardView::calcLayout() 1001void CardView::calcLayout()
1003{ 1002{
1004 //kdDebug() << "CardView::calcLayout:" << endl; 1003 //kdDebug() << "CardView::calcLayout:" << endl;