Initial commit
[keepassx] / src / plugins / kde / keepassx-kde.cpp
1 /***************************************************************************
2  *   Copyright (C) 2005-2007 by Tarek Saidi                                *
3  *   tarek.saidi@arcor.de                                                  *
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; version 2 of the License.               *
8  *                                                                         *
9  *   This program is distributed in the hope that it will be useful,       *
10  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
12  *   GNU General Public License for more details.                          *
13  *                                                                         *
14  *   You should have received a copy of the GNU General Public License     *
15  *   along with this program; if not, write to the                         *
16  *   Free Software Foundation, Inc.,                                       *
17  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
18  ***************************************************************************/
19
20 #include <kapplication.h>
21 #include <kfiledialog.h>
22 #include <kcmdlineargs.h>
23 #include <kiconloader.h>
24 #include <kfilefiltercombo.h>
25 #include <QPixmap>
26 #include <QHash>
27 #include <QStringList>
28 #include <kurl.h>
29 #include <QByteArray>
30 #include "keepassx-kde.h"
31
32 #define CSTR(x)(x.toUtf8().data())
33
34 QHash<QString,QString>IconMap;
35 int LastFilter;
36
37 Q_EXPORT_PLUGIN2(keepassx_kde, KdePlugin)
38
39 void createIconMap(){
40         IconMap["alarmclock"]="alarmclock";
41         IconMap["appsettings"]="configure";
42         IconMap["autotype"]="input-keyboard";
43         IconMap["clock"]="chronometer";
44         IconMap["clonenetry"]="edit-copy";
45         IconMap["copypwd"]="kgpg-export-kgpg";
46         IconMap["copyusername"]="user";
47         IconMap["dbsearch"]="edit-find";
48         IconMap["dbsettings"]="configure";
49         IconMap["delete"]="edit-delete";
50         IconMap["delete-entry"]="edit-delete";
51         IconMap["delete-group"]="edit-delete";
52         IconMap["editentry"]="edit";
53         IconMap["editgroup"]="edit";
54         IconMap["exit"]="application-exit";
55         IconMap["expired"]="flag-red";
56         IconMap["fileclose"]="dialog-close";
57         IconMap["filedelete"]="edit-delete";
58         IconMap["filenew"]="document-new";
59         IconMap["fileopen"]="document-open";
60         IconMap["filesave"]="document-save";
61         IconMap["filesaveas"]="document-save-as";
62         IconMap["filesaveasdisabled"]="document-save-as"; ///FIXME needs to be grayed to reflect it's status
63         IconMap["generator"]="roll";
64         IconMap["groupsearch"]="file-find";
65         IconMap["help"]="help-contents";
66         IconMap["key"]="password";
67         IconMap["manual"]="help-contents";
68         IconMap["newentry"]="kgpg-key3-kpgp";
69         IconMap["newgroup"]="folder";
70         IconMap["ok"]="ok";
71         IconMap["openurl"]="network";
72         IconMap["search"]="edit-find";
73 }
74
75 QString convertFilters(const QStringList& qtfilters){
76         /*
77         Qt Filter Syntax:
78         StringList:       "DescrA (*.ext1 *.ext2 *.ext3)",
79                           "DescrB (*.ext4)"
80         
81     KDE Filter Syntax:
82         Single String:   "*.ext1 *.ext2 *.ext3|DescrA\n*ext4|DescrB"
83         */
84         
85         QString kdefilters;
86         for(int i=0;i<qtfilters.size();i++){
87                 int a=qtfilters[i].indexOf('(');
88                 int b=qtfilters[i].indexOf(')');
89                 QString exts=qtfilters[i].mid(a+1,b-a-1);
90                 kdefilters+=exts;
91                 kdefilters+='|';
92                 kdefilters+=qtfilters[i];
93                 if(i<qtfilters.size()-1)kdefilters+='\n';
94         }
95         return kdefilters;
96 }
97
98
99 int getFilterIndex(const QStringList& qtfilters,const QString& KdeExtString){
100         int i;
101         bool found=false;
102         for(i=0;i<qtfilters.size();i++){
103                 int a=qtfilters[i].indexOf('(');
104                 int b=qtfilters[i].indexOf(')');
105                 QString QtExtString=qtfilters[i].mid(a+1,b-a-1); // "*.ext1 *.ext2"
106                 if(KdeExtString==QtExtString){
107                         found=true;
108                         break;
109                 }
110         }
111         if(found)
112                 return i;
113         else
114                 return 0;
115 }
116
117
118 QString KdePlugin::openExistingFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters,int SelectedFilter){    
119         KFileDialog FileDlg(KUrl(dir),convertFilters(Filters),parent);
120         //FileDlg.filterWidget()->setCurrentFilter(convertFilters(QStringList()<<Filters[SelectedFilter]));
121         FileDlg.setMode(KFile::ExistingOnly | KFile::File);
122         FileDlg.setOperationMode(KFileDialog::Opening);
123         if(!FileDlg.exec())return QString();
124         LastFilter=getFilterIndex(Filters,FileDlg.currentFilter());
125         return FileDlg.selectedFiles()[0];
126 }
127
128 QStringList KdePlugin::openExistingFilesDialog(QWidget* parent,QString title,QString dir,QStringList Filters,int SelectedFilter){
129         KFileDialog FileDlg(KUrl(dir),convertFilters(Filters),parent);
130         //FileDlg.filterWidget()->setCurrentFilter(convertFilters(QStringList()<<Filters[SelectedFilter]));
131         FileDlg.setMode(KFile::ExistingOnly | KFile::Files);
132         FileDlg.setOperationMode(KFileDialog::Opening);
133         if(!FileDlg.exec())return QStringList();
134         LastFilter=getFilterIndex(Filters,FileDlg.currentFilter());
135         return FileDlg.selectedFiles();
136 }
137
138 QString KdePlugin::saveFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters,int SelectedFilter,bool OverWriteWarn){
139         KFileDialog FileDlg(KUrl(dir),convertFilters(Filters),parent);
140         //FileDlg.filterWidget()->setCurrentFilter(convertFilters(QStringList()<<Filters[SelectedFilter]));
141         FileDlg.setMode(KFile::File);
142         FileDlg.setOperationMode(KFileDialog::Saving);
143         if(!FileDlg.exec())return QString();    
144         LastFilter=getFilterIndex(Filters,FileDlg.currentFilter());
145         return FileDlg.selectedFiles()[0];
146
147 }
148
149 QApplication* KdePlugin::getMainAppObject(int argc, char** argv){
150         KCmdLineArgs::init(argc,argv,QByteArray("keepassx"),
151                                                                  QByteArray("none"),
152                                                                  ki18n("KeePassX"),
153                                                                  QByteArray("0.2.3"),
154                                                                  ki18n("Cross Platform Password Manager"));
155         createIconMap();
156 #ifdef GLOBAL_AUTOTYPE
157         return dynamic_cast<QApplication*>( new KpKApplication() );
158 #else
159         return dynamic_cast<QApplication*>( new KApplication() );
160 #endif
161 }
162
163
164 QIcon KdePlugin::getIcon(const QString& name){
165         KIconLoader loader;
166         QPixmap pxm=loader.loadIcon(IconMap.value(name),KIconLoader::Desktop,0,KIconLoader::DefaultState,QStringList(),NULL,true);
167         if(pxm.isNull())return QIcon();
168         QIcon icon(pxm);
169         return icon;
170 }
171
172