-rw-r--r-- | kaddressbook/keywidget.cpp | 277 |
1 files changed, 277 insertions, 0 deletions
diff --git a/kaddressbook/keywidget.cpp b/kaddressbook/keywidget.cpp new file mode 100644 index 0000000..c117d34 --- a/dev/null +++ b/kaddressbook/keywidget.cpp | |||
@@ -0,0 +1,277 @@ | |||
1 | /* | ||
2 | This file is part of KAddressBook. | ||
3 | Copyright (c) 2003 Tobias Koenig <tokoe@kde.org> | ||
4 | |||
5 | This program is free software; you can redistribute it and/or modify | ||
6 | it under the terms of the GNU General Public License as published by | ||
7 | the Free Software Foundation; either version 2 of the License, or | ||
8 | (at your option) any later version. | ||
9 | |||
10 | This program is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | GNU General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with this program; if not, write to the Free Software | ||
17 | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
18 | |||
19 | As a special exception, permission is given to link this program | ||
20 | with any edition of Qt, and distribute the resulting executable, | ||
21 | without including the source code for Qt in the source distribution. | ||
22 | */ | ||
23 | |||
24 | #include <qfile.h> | ||
25 | |||
26 | #include <qinputdialog.h> | ||
27 | |||
28 | #include <qlabel.h> | ||
29 | #include <qlayout.h> | ||
30 | #include <qpushbutton.h> | ||
31 | |||
32 | #ifndef KAB_EMBEDDED | ||
33 | #include <kaccelmanager.h> | ||
34 | #include <kio/netaccess.h> | ||
35 | #include <kmessagebox.h> | ||
36 | #else //KAB_EMBEDDED | ||
37 | #include <qmap.h> | ||
38 | #include <qmessagebox.h> | ||
39 | #include <qtextstream.h> | ||
40 | #include <kurl.h> | ||
41 | #endif //KAB_EMBEDDED | ||
42 | |||
43 | #include <kapplication.h> | ||
44 | #include <kcombobox.h> | ||
45 | #include <kdialog.h> | ||
46 | #include <kfiledialog.h> | ||
47 | #include <klocale.h> | ||
48 | #include <ktempfile.h> | ||
49 | |||
50 | #include "keywidget.h" | ||
51 | |||
52 | KeyWidget::KeyWidget( QWidget *parent, const char *name ) | ||
53 | : QWidget( parent, name ) | ||
54 | { | ||
55 | QGridLayout *layout = new QGridLayout( this, 2, 2, KDialog::marginHint(), | ||
56 | KDialog::spacingHint() ); | ||
57 | |||
58 | QLabel *label = new QLabel( i18n( "Keys:" ), this ); | ||
59 | layout->addWidget( label, 0, 0 ); | ||
60 | |||
61 | mKeyCombo = new KComboBox( this ); | ||
62 | layout->addWidget( mKeyCombo, 0, 1 ); | ||
63 | |||
64 | mAddButton = new QPushButton( i18n( "Add" ), this ); | ||
65 | layout->addWidget( mAddButton, 1, 0 ); | ||
66 | |||
67 | mRemoveButton = new QPushButton( i18n( "Remove" ), this ); | ||
68 | mRemoveButton->setEnabled( false ); | ||
69 | layout->addWidget( mRemoveButton, 1, 1 ); | ||
70 | |||
71 | mExportButton = new QPushButton( i18n( "Export" ), this ); | ||
72 | mExportButton->setEnabled( false ); | ||
73 | layout->addMultiCellWidget( mExportButton, 2, 2, 0, 1 ); | ||
74 | |||
75 | connect( mAddButton, SIGNAL( clicked() ), SLOT( addKey() ) ); | ||
76 | connect( mRemoveButton, SIGNAL( clicked() ), SLOT( removeKey() ) ); | ||
77 | connect( mExportButton, SIGNAL( clicked() ), SLOT( exportKey() ) ); | ||
78 | } | ||
79 | |||
80 | KeyWidget::~KeyWidget() | ||
81 | { | ||
82 | } | ||
83 | |||
84 | void KeyWidget::setKeys( const KABC::Key::List &list ) | ||
85 | { | ||
86 | mKeyList = list; | ||
87 | |||
88 | updateKeyCombo(); | ||
89 | } | ||
90 | |||
91 | KABC::Key::List KeyWidget::keys() const | ||
92 | { | ||
93 | return mKeyList; | ||
94 | } | ||
95 | |||
96 | void KeyWidget::addKey() | ||
97 | { | ||
98 | QMap<QString, int> keyMap; | ||
99 | QStringList keyTypeNames; | ||
100 | QStringList existingKeyTypes; | ||
101 | |||
102 | KABC::Key::List::Iterator listIt; | ||
103 | for ( listIt = mKeyList.begin(); listIt != mKeyList.end(); ++listIt ) { | ||
104 | if ( (*listIt).type() != KABC::Key::Custom ) | ||
105 | existingKeyTypes.append( KABC::Key::typeLabel( (*listIt).type() ) ); | ||
106 | } | ||
107 | |||
108 | KABC::Key::TypeList typeList = KABC::Key::typeList(); | ||
109 | KABC::Key::TypeList::Iterator it; | ||
110 | for ( it = typeList.begin(); it != typeList.end(); ++it ) { | ||
111 | if ( (*it) != KABC::Key::Custom && | ||
112 | !existingKeyTypes.contains( KABC::Key::typeLabel( *it ) ) ) { | ||
113 | keyMap.insert( KABC::Key::typeLabel( *it ), *it ); | ||
114 | keyTypeNames.append( KABC::Key::typeLabel( *it ) ); | ||
115 | } | ||
116 | } | ||
117 | |||
118 | bool ok; | ||
119 | QString name = QInputDialog::getItem( i18n( "Key type" ), i18n( "Select the key type." ), keyTypeNames, 0, true, &ok ); | ||
120 | |||
121 | |||
122 | |||
123 | if ( !ok || name.isEmpty() ) | ||
124 | return; | ||
125 | |||
126 | int type = keyMap[ name ]; | ||
127 | if ( !keyTypeNames.contains( name ) ) | ||
128 | type = KABC::Key::Custom; | ||
129 | |||
130 | #ifndef KAB_EMBEDDED | ||
131 | KURL url = KFileDialog::getOpenURL(); | ||
132 | |||
133 | if ( url.isEmpty() ) | ||
134 | return; | ||
135 | |||
136 | QString tmpFile; | ||
137 | if ( KIO::NetAccess::download( url, tmpFile ) ) { | ||
138 | QFile file( tmpFile ); | ||
139 | if ( !file.open( IO_ReadOnly ) ) { | ||
140 | QString text( i18n( "<qt>Unable to open file <b>%1</b>.</qt>" ) ); | ||
141 | KMessageBox::error( this, text.arg( url.url() ) ); | ||
142 | return; | ||
143 | } | ||
144 | |||
145 | |||
146 | #else //KAB_EMBEDDED | ||
147 | QString keyfile = KFileDialog::getOpenFileName( "huhu", | ||
148 | "Select Key", this ); | ||
149 | |||
150 | if ( keyfile.isEmpty() ) | ||
151 | return; | ||
152 | |||
153 | { | ||
154 | QFile file( keyfile ); | ||
155 | if ( !file.open( IO_ReadOnly ) ) { | ||
156 | QString text( i18n( "<qt>Unable to open file <b>%1</b>.</qt>" ) ); | ||
157 | QString caption( i18n( "Error" ) ); | ||
158 | QMessageBox::critical( this, caption, text.arg( keyfile ) ); | ||
159 | return; | ||
160 | } | ||
161 | |||
162 | #endif //KAB_EMBEDDED | ||
163 | |||
164 | |||
165 | |||
166 | QTextStream s( &file ); | ||
167 | QString data; | ||
168 | |||
169 | s.setEncoding( QTextStream::UnicodeUTF8 ); | ||
170 | s >> data; | ||
171 | file.close(); | ||
172 | |||
173 | KABC::Key key( data, type ); | ||
174 | if ( type == KABC::Key::Custom ) | ||
175 | key.setCustomTypeString( name ); | ||
176 | mKeyList.append( key ); | ||
177 | |||
178 | emit changed(); | ||
179 | |||
180 | #ifndef KAB_EMBEDDED | ||
181 | KIO::NetAccess::removeTempFile( tmpFile ); | ||
182 | #endif //KAB_EMBEDDED | ||
183 | |||
184 | } | ||
185 | |||
186 | updateKeyCombo(); | ||
187 | } | ||
188 | |||
189 | void KeyWidget::removeKey() | ||
190 | { | ||
191 | int pos = mKeyCombo->currentItem(); | ||
192 | if ( pos == -1 ) | ||
193 | return; | ||
194 | |||
195 | QString type = mKeyCombo->currentText(); | ||
196 | QString text = i18n( "<qt>Do you really want to remove the key <b>%1</b>?</qt>" ); | ||
197 | |||
198 | |||
199 | #ifndef KAB_EMBEDDED | ||
200 | if ( KMessageBox::questionYesNo( this, text.arg( type ) ) == KMessageBox::No ) | ||
201 | return; | ||
202 | #else //KAB_EMBEDDED | ||
203 | QString caption = i18n( "Confirm Delete" ); | ||
204 | if (QMessageBox::information( this, caption, | ||
205 | text.arg( type ), | ||
206 | i18n("Yes!"), i18n("No"), 0, 0 ) == 1) | ||
207 | return; | ||
208 | #endif //KAB_EMBEDDED | ||
209 | |||
210 | mKeyList.remove( mKeyList.at( pos ) ); | ||
211 | emit changed(); | ||
212 | |||
213 | updateKeyCombo(); | ||
214 | } | ||
215 | |||
216 | void KeyWidget::exportKey() | ||
217 | { | ||
218 | KABC::Key key = (*mKeyList.at( mKeyCombo->currentItem() ) ); | ||
219 | |||
220 | #ifndef KAB_EMBEDDED | ||
221 | KURL url = KFileDialog::getSaveURL(); | ||
222 | |||
223 | KTempFile tempFile; | ||
224 | QTextStream *s = tempFile.textStream(); | ||
225 | s->setEncoding( QTextStream::UnicodeUTF8 ); | ||
226 | (*s) << key.textData(); | ||
227 | tempFile.close(); | ||
228 | |||
229 | KIO::NetAccess::upload( tempFile.name(), url, kapp->mainWidget() ); | ||
230 | #else //KAB_EMBEDDED | ||
231 | QString keyfile = KFileDialog::getSaveFileName( "huhu", | ||
232 | "Save Key", this ); | ||
233 | |||
234 | if ( keyfile.isEmpty() ) | ||
235 | return; | ||
236 | |||
237 | QFile file( keyfile ); | ||
238 | if ( !file.open( IO_ReadWrite ) ) { | ||
239 | QString text( i18n( "<qt>Unable to open file <b>%1</b>.</qt>" ) ); | ||
240 | QString caption( i18n( "Error" ) ); | ||
241 | QMessageBox::critical( this, caption, text.arg( keyfile ) ); | ||
242 | return; | ||
243 | } | ||
244 | |||
245 | QTextStream s( &file ); | ||
246 | s.setEncoding( QTextStream::UnicodeUTF8 ); | ||
247 | s << key.textData(); | ||
248 | file.close(); | ||
249 | |||
250 | |||
251 | #endif //KAB_EMBEDDED | ||
252 | |||
253 | } | ||
254 | |||
255 | void KeyWidget::updateKeyCombo() | ||
256 | { | ||
257 | int pos = mKeyCombo->currentItem(); | ||
258 | mKeyCombo->clear(); | ||
259 | |||
260 | KABC::Key::List::Iterator it; | ||
261 | for ( it = mKeyList.begin(); it != mKeyList.end(); ++it ) { | ||
262 | if ( (*it).type() == KABC::Key::Custom ) | ||
263 | mKeyCombo->insertItem( (*it).customTypeString() ); | ||
264 | else | ||
265 | mKeyCombo->insertItem( KABC::Key::typeLabel( (*it).type() ) ); | ||
266 | } | ||
267 | |||
268 | mKeyCombo->setCurrentItem( pos ); | ||
269 | |||
270 | bool state = ( mKeyList.count() != 0 ); | ||
271 | mRemoveButton->setEnabled( state ); | ||
272 | mExportButton->setEnabled( state ); | ||
273 | } | ||
274 | |||
275 | #ifndef KAB_EMBEDDED | ||
276 | #include "keywidget.moc" | ||
277 | #endif //KAB_EMBEDDED | ||