/* * PDFedit - free program for PDF document manipulation. * Copyright (C) 2006, 2007 PDFedit team: Michal Hocko, * Miroslav Jahoda, * Jozef Misutka, * Martin Petricek * * Project is hosted on http://sourceforge.net/projects/pdfedit */ /** @file Dialog - class with various static dialogs:
openFileDialog - pick a filename for opening it
saveFileDialog - pick a filename for saving as
openFileDialogPdf, saveFileDialogPdf - specialization of above for PDF files
colorDialog - dialog for selecting color
readStringDialog - Ask user a question end expect him to enter some string as answer
@author Martin Petricek */ #include "qtcompat.h" #include "dialog.h" #include "settings.h" #include "version.h" #include #include #include #include #include #include #include #include #include "util.h" namespace gui { /** Get current directory from File Dialog @param fd File Dialog @return current directory */ QString getDir(QFileDialog &fd) { #ifdef QT3 const QDir *d=fd.dir(); QString name=d->absPath(); delete d; #else QDir d=fd.directory(); QString name=d.absPath(); #endif return name; } /** Generic "Open file" dialog. Wait for user to select one existing file and return its name. Will return NULL if user cancels the dialog. @param parent Parent widget - will be disabled during the dialog. @param caption Caption used in dialog title @param settingName Key in settings used to save/load dialog window position @param savePath Key in settings used to identify where to save last used directory in the dialog @param filters Filters available to user to restrict shown filetypes in dialog @return selected Filename (or NULL) */ QString openFileDialog(QWidget* parent,const QString &caption/*=QString::null*/,const QString &settingName/*=QString::null*/,const QString &filters/*=QString::null*/,const QString &savePath/*=QString::null*/) { guiPrintDbg(debug::DBG_DBG,"openFileDialog invoked"); #ifdef QT3 QFileDialog fd(parent,"openfiledialog",TRUE); #else QFileDialog fd(parent); #endif if (!filters.isNull()) { //Set filters if filters specified fd.setFilter(filters); } #ifdef QT3 fd.setShowHiddenFiles(TRUE); #endif if (!caption.isNull()) fd.setCaption(caption); if (savePath.isNull()) { //No save path specified -> start in current directory fd.setDir("."); } else { //Try to set last used saved path, if it exists fd.setDir(globalSettings->read("history/path/"+savePath,".")); } fd.setMode(QFileDialog::ExistingFile); // "Infinite" loop, to restart the dialog if necessary (invalid file selected, etc ... ) for(;;) { if (!settingName.isNull()) { // Restore window position from settings if applicable globalSettings->restoreWindow(&fd,settingName); } if (fd.exec()==QDialog::Accepted) { //Dialog accepted if (!settingName.isNull()) { // Save window position to settings if applicable globalSettings->saveWindow(&fd,settingName); } if (!savePath.isNull()) { //Save the path if desired if (globalSettings->readBool("history/save_filePath",true)) { //Note that there is only one central setting "save paths in dialog" for all dialog types globalSettings->write("history/path/"+savePath,getDir(fd)); } } QString name=fd.selectedFile(); if (QFileInfo(name).isDir()) { //directory was selected //TODO: test this ! fd.setDir(name); continue;//restart dialog } return name; } return QString::null; } } /** Invoke "open file" dialog for PDF files. Specialization of openFileDialog \see openFileDialog @param parent Parent widget - will be disabled during the dialog. @return selected Filename (or NULL) */ QString openFileDialogPdf(QWidget* parent) { return openFileDialog(parent,QObject::tr("Open file ..."),"file_dialog",QObject::tr("PDF files (*.pdf)"),"filePath"); } /** Invoke generic "save file" dialog. Wait for user to select or type a single file and return its name. Will return NULL if user cancels the dialog. @param parent Parent widget - will be disabled during the dialog. @param oldname Name of file to be saved - if specified, this name will be pre-selected. @param askOverwrite If true and selected file exists, user will be asked to confirm overwriting it @param caption Caption used in dialog title @param settingName Key in settings used to save/load dialog window position @param savePath Key in settings used to identify where to save last used directory in the dialog @param filters Filters available to user to restrict shown filetypes in dialog @return selected Filename (or NULL) */ QString saveFileDialog(QWidget* parent,const QString &oldname,bool askOverwrite/*=true*/,const QString &caption/*=QString::null*/,const QString &settingName/*=QString::null*/,const QString &filters/*=QString::null*/,const QString &savePath/*=QString::null*/) { guiPrintDbg(debug::DBG_DBG,"saveFileDialog invoked"); #ifdef QT3 QFileDialog fd(parent,"savefiledialog",TRUE); #else QFileDialog fd(parent); #endif if (!filters.isNull()) { //Set filters if filters specified fd.setFilter(filters); } #ifdef QT3 fd.setShowHiddenFiles(TRUE); #endif if (!caption.isNull()) fd.setCaption(caption); if (savePath.isNull()) { //No save path specified -> start in current directory fd.setDir("."); } else { //Try to set last used saved path, if it exists fd.setDir(globalSettings->read("history/path/"+savePath,".")); } if (!oldname.isNull()) { #ifdef QT3 fd.setSelection(oldname); #else fd.selectFile(oldname); #endif } fd.setMode(QFileDialog::AnyFile); //Name that will hold the file (if some is picked) QString name; // "Infinite" loop, to restart the dialog if necessary (invalid file selected, etc ... ) for(;;) { if (!settingName.isNull()) { // Restore window position from settings if applicable globalSettings->restoreWindow(&fd,settingName); } if (fd.exec()==QDialog::Accepted) { if (!settingName.isNull()) { // Save window position to settings if applicable globalSettings->saveWindow(&fd,settingName); } name=fd.selectedFile(); //TODO: check if not directory if (askOverwrite && QFile::exists(name)) { //File exists : ask if it should be overwritten int answer=QMessageBox::question(parent,APP_NAME, QObject::tr("File called \"%1\" already exists. Do you want to overwrite it?").arg(name), QObject::tr("&Yes"),QObject::tr("&No"),QObject::tr("&Cancel"),1,2); if (answer==0) { //Yes, overwrite is ok //Break from the cycle mean valid file was selected break; } if (answer==1) continue; //No, restart dialog and ask for another file if (answer==2) return QString::null; //Cancel, do not overwrite and exit } //Not asking about overwrite //Break from the cycle mean valid file was selected break; } //Dialog cancelled if (!settingName.isNull()) { // Save window position to settings if applicable globalSettings->saveWindow(&fd,settingName); } return QString::null; } //End of not-so-infinite for cycle if (!savePath.isNull()) { //Save the path if desired if (globalSettings->readBool("history/save_filePath",true)) { //Note that there is only one central setting "save paths in dialog" for all dialog types globalSettings->write("history/path/"+savePath,getDir(fd)); } } return name; } /** Invoke "save file" dialog for PDF files. Specialization of saveFileDialog \see saveFileDialog @param parent Parent widget - will be disabled during the dialog. @param oldname Name of file to be saved - if specified, this name will be pre-selected. @param askOverwrite If true and selected file exists, user will be asked to confirm overwriting it @return selected Filename (or NULL) */ QString saveFileDialogPdf(QWidget* parent,const QString &oldname,bool askOverwrite/*=true*/) { return saveFileDialog(parent,oldname,askOverwrite,QObject::tr("Save file as ..."),"file_dialog",QObject::tr("PDF files (*.pdf)"),"filePath"); } /** Invoke "save file" dialog for xml files. Specialization of saveFileDialog \see saveFileDialog @param parent Parent widget - will be disabled during the dialog. @param oldname Name of file to be saved - if specified, this name will be pre-selected. @param askOverwrite If true and selected file exists, user will be asked to confirm overwriting it @return selected Filename (or NULL) */ QString saveFileDialogXml(QWidget* parent,const QString &oldname,bool askOverwrite/*=true*/) { return saveFileDialog(parent,oldname,askOverwrite,QObject::tr("Save file as ..."),"file_dialog",QObject::tr("xml files (*.xml)"),"filePath"); } /** Invoke "read string" dialog. Show message and wait for user to type any string, Will return NULL if user cancels the dialog. @param parent Parent widget - will be disabled during the dialog. @param message Message to show in the dialog @param def Default text that will be pre-typed in the dialog @return typed text, or NULL if dialog cancelled */ QString readStringDialog(QWidget* parent,const QString &message, const QString &def) { bool ok=FALSE; QString res=QInputDialog::getText(APP_NAME,message,QLineEdit::Normal,def,&ok,parent,"read_string"); if (ok) return res; return QString::null; } /** Invoke dialog to select color. Last selected color is remembered and offered as default next time. The 'initial default color' is red @param parent Parent widget - will be disabled during the dialog. @return selected color. If dialog is cancelled, 'invalid' color is returned */ QColor colorDialog(QWidget* parent) { static QColor defaultColor=Qt::red; QColor ret=QColorDialog::getColor(defaultColor,parent,"std_color_dialog"); if (ret.isValid()) defaultColor=ret; return ret; } /** Asks question with Yes/No answer. "Yes" is default. Return true if user selected "yes", false if user selected "no" @param msg Question to display @param parent Parent widget - will be disabled during the dialog. @return True if yes, false if no */ bool questionDialog(QWidget* parent,const QString &msg) { int answer=QMessageBox::question(parent,APP_NAME,msg,QObject::tr("&Yes"),QObject::tr("&No"),QString::null,0,1); return (answer==0); } } // namespace gui