1 /***************************************************************************
2 * Copyright (C) 2005-2007 by Tarek Saidi *
3 * tarek.saidi@arcor.de *
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. *
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. *
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 ***************************************************************************/
20 #include <QFileDialog>
22 IFileDialog* KpxFileDialogs::iFileDialog=NULL;
23 QtStandardFileDialogs DefaultQtDlgs;
24 FileDlgHistory fileDlgHistory;
26 void KpxFileDialogs::setPlugin(IFileDialog* plugin){
30 QString KpxFileDialogs::openExistingFile(QWidget* Parent, const QString& Name, const QString& Title,const QStringList& Filters,QString Dir,int SelectedFilter)
32 EventOccurredBlock = true;
33 if(!iFileDialog)iFileDialog=dynamic_cast<IFileDialog*>(&DefaultQtDlgs);
35 Dir=fileDlgHistory.getDir(Name);
36 if(SelectedFilter==-1)
37 SelectedFilter=fileDlgHistory.getFilter(Name);
38 QString result = iFileDialog->openExistingFileDialog(Parent,Title,Dir,Filters,SelectedFilter);
39 if(!result.isEmpty()){
40 fileDlgHistory.set(Name,result.left(result.lastIndexOf("/")+1),iFileDialog->getLastFilter());
42 EventOccurredBlock = false;
46 QStringList KpxFileDialogs::openExistingFiles(QWidget* Parent, const QString& Name, const QString& Title,const QStringList& Filters,QString Dir,int SelectedFilter)
48 EventOccurredBlock = true;
49 if(!iFileDialog)iFileDialog=dynamic_cast<IFileDialog*>(&DefaultQtDlgs);
51 Dir=fileDlgHistory.getDir(Name);
52 if(SelectedFilter==-1)
53 SelectedFilter=fileDlgHistory.getFilter(Name);
54 QStringList results=iFileDialog->openExistingFilesDialog(Parent,Title,QString(),Filters,SelectedFilter);
55 if(!results.isEmpty()){
56 fileDlgHistory.set(Name,results[0].left(results[0].lastIndexOf("/")+1),iFileDialog->getLastFilter());
58 EventOccurredBlock = false;
62 QString KpxFileDialogs::saveFile(QWidget* Parent, const QString& Name, const QString& Title,const QStringList& Filters,bool OverWriteWarn,QString Dir,int SelectedFilter)
64 EventOccurredBlock = true;
65 if(!iFileDialog)iFileDialog=dynamic_cast<IFileDialog*>(&DefaultQtDlgs);
67 Dir=fileDlgHistory.getDir(Name);
68 if(SelectedFilter==-1)
69 SelectedFilter=fileDlgHistory.getFilter(Name);
70 QString result = iFileDialog->saveFileDialog(Parent,Title,QString(),Filters,SelectedFilter,OverWriteWarn);
71 if(!result.isEmpty()){
72 fileDlgHistory.set(Name,result.left(result.lastIndexOf("/")+1),iFileDialog->getLastFilter());
74 EventOccurredBlock = false;
80 QString QtStandardFileDialogs::toSingleStringFilter(const QStringList& filterList){
81 if(!filterList.size())
84 for(int i=0;i<filterList.size()-1;i++){
85 SingleString += filterList[i] + ";;";
87 SingleString += filterList.back();
93 QString QtStandardFileDialogs::openExistingFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters,int SelectedFilterIndex){
94 QString SelectedFilter;
95 if(SelectedFilterIndex < Filters.size())
96 SelectedFilter=Filters[SelectedFilterIndex];
97 QString filename = QFileDialog::getOpenFileName(parent,title,dir,toSingleStringFilter(Filters),&SelectedFilter);
98 LastFilter=Filters.indexOf(SelectedFilter);
103 QStringList QtStandardFileDialogs::openExistingFilesDialog(QWidget* parent,QString title,QString dir,QStringList Filters,int SelectedFilterIndex){
104 QString SelectedFilter;
105 if(SelectedFilterIndex < Filters.size())
106 SelectedFilter=Filters[SelectedFilterIndex];
107 QStringList filenames = QFileDialog::getOpenFileNames(parent,title,dir,toSingleStringFilter(Filters),&SelectedFilter);
108 LastFilter=Filters.indexOf(SelectedFilter);
112 QString QtStandardFileDialogs::saveFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters,int SelectedFilterIndex, bool ShowOverwriteWarning){
113 QString SelectedFilter;
114 if(SelectedFilterIndex < Filters.size())
115 SelectedFilter=Filters[SelectedFilterIndex];
116 QString filepath = QFileDialog::getSaveFileName(parent,title,dir,toSingleStringFilter(Filters),&SelectedFilter,
117 ShowOverwriteWarning ? (QFileDialog::Option)0 : QFileDialog::DontConfirmOverwrite);
118 LastFilter=Filters.indexOf(SelectedFilter);
120 //Check whether the file has an extension which fits to the selected filter
121 QFileInfo file(filepath);
122 QString filename=file.fileName();
123 int a=Filters[LastFilter].indexOf('(');
124 int b=Filters[LastFilter].indexOf(')');
125 QStringList Extensions=Filters[LastFilter].mid(a+1,b-a-1).split(" ");
126 if(Extensions.contains("*"))
129 for(int i=0;i<Extensions.size();i++)
130 Extensions[i].remove(0,2); //remove the *. from the extensions
132 if(!file.suffix().isEmpty()){
133 if(Extensions.contains(file.suffix()))
136 return filepath+"."+Extensions[0];
139 return filepath+"."+Extensions[0];
142 int QtStandardFileDialogs::getLastFilter(){
147 QString FileDlgHistory::getDir(const QString& name){
148 Entry e=History.value(name);
150 return QDir::homePath();
155 int FileDlgHistory::getFilter(const QString& name){
156 Entry e=History.value(name);
163 void FileDlgHistory::set(const QString& name,const QString& dir, int filter){
164 History[name]=Entry();
165 History[name].Dir=dir;
166 History[name].Filter=filter;
168 void FileDlgHistory::save(){
169 if(config->saveFileDlgHistory()){
170 for(unsigned i=0;i<static_cast<unsigned>(History.size());i++){
172 entry << History.keys().at(i)
173 << History.values().at(i).Dir
174 << QString::number(History.values().at(i).Filter);
175 config->setFileDlgHistory(i,entry);
180 void FileDlgHistory::load(){
181 if(config->saveFileDlgHistory()){
182 unsigned count=config->fileDlgHistorySize();
183 for(unsigned i=0;i</*keys.size()*/count;i++){
185 QStringList value=config->fileDlgHistory(i);
187 entry.Filter=value[2].toInt();
188 History[value[0]]=entry;
192 config->clearFileDlgHistory();
195 void FileDlgHistory::clear(){
196 History=QHash<QString,Entry>();
197 config->clearFileDlgHistory();