Initial commit
[keepassx] / src / plugins / gnome / keepassx-gnome.cpp
1 /***************************************************************************
2  *   Copyright (C) 2005-2006 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  *                                                                         *
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                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
19  ***************************************************************************/
20  
21 #include <gtk/gtk.h> 
22 #include "keepassx-gnome.h"
23 #define CSTR(x)(x.toUtf8().data())
24
25 Q_EXPORT_PLUGIN2(keepassx_gnome, GnomePlugin)
26                 
27 bool GnomePlugin::init(int argc, char** argv){
28         int t_argc=argc;
29         char** t_argv=argv;
30         return gtk_init_check(&t_argc,&t_argv); 
31 }
32
33 QString GnomePlugin::openExistingFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters){
34         unsigned int NumFilters=Filters.size();
35         GtkWidget *FileDlg;
36         QString filename;
37         FileDlg=gtk_file_chooser_dialog_new(CSTR(title),NULL,
38                                 GTK_FILE_CHOOSER_ACTION_OPEN,
39                                 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
40                                 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
41                                 NULL);
42
43         gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(FileDlg),CSTR(dir));
44         GtkFileFilter** filters=parseFilterStrings(Filters);
45         
46         for(int i=0;i<NumFilters;i++){          
47                 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(FileDlg),filters[i]);
48         }
49         if (gtk_dialog_run(GTK_DIALOG(FileDlg)) == GTK_RESPONSE_ACCEPT){
50                 char* filename_cstring=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(FileDlg));
51                 filename = QString::fromUtf8(filename_cstring);
52                 g_free(filename_cstring);
53         }       
54         gtk_widget_destroy(FileDlg);
55         return filename;
56 }
57
58 GtkFileFilter** GnomePlugin::parseFilterStrings(const QStringList& filters){
59         if(!filters.size())return NULL;
60         GtkFileFilter **f=g_new(GtkFileFilter*,filters.size());
61         for(int i=0;i<filters.size();i++){
62                 f[i]=gtk_file_filter_new();
63                 QString name;
64                 int p=0;
65                 for(p;p<filters[i].size();p++){
66                         if(filters[i][p]!='(')
67                                 name += filters[i][p];
68                         else
69                                 break;                  
70                 }
71                 gtk_file_filter_set_name(f[i],CSTR(name));
72                 p++;
73                 QString pattern;
74                 for(p;p<filters[i].size();p++){
75                         if(filters[i][p]==' ' || filters[i][p]==')'){
76                                 gtk_file_filter_add_pattern(f[i],CSTR(pattern));
77                                 pattern=QString();
78                         }
79                         else{
80                                 pattern += filters[i][p];                               
81                         }
82                         
83                 }
84         }
85         return f;
86 }
87
88 QStringList GnomePlugin::openExistingFilesDialog(QWidget* parent,QString title,QString dir,QStringList Filters){
89         unsigned int NumFilters=Filters.size();
90         GtkWidget *FileDlg;
91         QStringList filenames;
92         FileDlg=gtk_file_chooser_dialog_new(CSTR(title),NULL,
93                                 GTK_FILE_CHOOSER_ACTION_OPEN,
94                                 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
95                                 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
96                                 NULL);
97         gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(FileDlg),CSTR(dir));
98         gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(FileDlg),true);
99         GtkFileFilter** filters=parseFilterStrings(Filters);
100         
101         for(int i=0;i<NumFilters;i++){          
102                 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(FileDlg),filters[i]);
103         }
104         if (gtk_dialog_run(GTK_DIALOG(FileDlg)) == GTK_RESPONSE_ACCEPT){
105                 GSList* FilenameList=gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(FileDlg));
106                 GSList* front=FilenameList;
107                 while(FilenameList!=0){
108                                         filenames << QString::fromUtf8((char*)FilenameList->data);
109                                         FilenameList=FilenameList->next;
110                 }
111                 g_slist_free(front);
112         }       
113         gtk_widget_destroy(FileDlg);
114         return filenames;
115 }
116
117 QString GnomePlugin::saveFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters,bool OverWriteWarn){
118         unsigned int NumFilters=Filters.size();
119         GtkWidget *FileDlg;
120         QString filename;
121         FileDlg=gtk_file_chooser_dialog_new(CSTR(title),NULL,
122                                 GTK_FILE_CHOOSER_ACTION_SAVE,
123                                 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
124                                 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
125                                 NULL);
126         gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(FileDlg),CSTR(dir));
127         gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(FileDlg),OverWriteWarn);
128         GtkFileFilter** filters=parseFilterStrings(Filters);
129         
130         for(int i=0;i<NumFilters;i++){          
131                 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(FileDlg),filters[i]);
132         }
133         if (gtk_dialog_run(GTK_DIALOG(FileDlg)) == GTK_RESPONSE_ACCEPT){
134                 char* filename_cstring=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(FileDlg));
135                 filename = QString::fromUtf8(filename_cstring);
136                 g_free(filename_cstring);
137         }       
138         gtk_widget_destroy(FileDlg);
139         return filename;}