]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/FileDialog.cpp
Whitespace.
[lyx.git] / src / frontends / qt4 / FileDialog.cpp
1 /**
2  * \file qt4/FileDialog.cpp
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author John Levon
7  * \author Jean-Marc Lasgouttes
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 #include <config.h>
13
14 #include "FileDialog.h"
15
16 #include "LyXFileDialog.h"
17 #include "qt_helpers.h"
18
19 #include "support/debug.h"
20 #include "support/FileName.h"
21 #include "support/filetools.h"
22 #include "support/gettext.h"
23 #include "support/os.h"
24
25 #include <string>
26
27 /** when this is defined, the code will use
28  * QFileDialog::getOpenFileName and friends to create filedialogs.
29  * Effects:
30  * - the dialog does not use the quick directory buttons (Button
31  *   parameters);
32  * - with Qt/Mac or Qt/Win, the dialogs native to the environment are used.
33  * - with Qt/Win and Qt <= 4.3.0, there was a number of bugs with our own
34  *   file dialog (http://www.lyx.org/trac/ticket/3907).
35  *
36  * Therefore there is a tradeoff in enabling or disabling this (JMarc)
37  */
38 #if defined(Q_WS_MACX) || (defined(Q_WS_WIN) && !defined(Q_OS_CYGWIN))
39 #define USE_NATIVE_FILEDIALOG 1
40 #endif
41
42 #ifdef USE_NATIVE_FILEDIALOG
43 #include <QApplication>
44 #endif
45
46 namespace lyx {
47
48 using namespace support;
49
50
51 class FileDialog::Private {
52 public:
53         Button b1;
54         Button b2;
55 };
56
57
58 FileDialog::FileDialog(QString const & t, FuncCode s)
59         : private_(new FileDialog::Private), title_(t), success_(s)
60 {}
61
62
63 FileDialog::~FileDialog()
64 {
65         delete private_;
66 }
67
68
69 void FileDialog::setButton1(QString const & label, QString const & dir)
70 {
71         private_->b1.first = label;
72         private_->b1.second = dir;
73 }
74
75
76 void FileDialog::setButton2(QString const & label, QString const & dir)
77 {
78         private_->b2.first = label;
79         private_->b2.second = dir;
80 }
81
82
83 FileDialog::Result FileDialog::save(QString const & path,
84         QStringList const & filters, QString const & suggested)
85 {
86         LYXERR(Debug::GUI, "Select with path \"" << path
87                            << "\", mask \"" << filters.join(";;")
88                            << "\", suggested \"" << suggested << '"');
89
90         FileDialog::Result result;
91         result.first = FileDialog::Chosen;
92
93 #ifdef USE_NATIVE_FILEDIALOG
94         QString const startsWith = makeAbsPath(suggested, path);
95         QString const name = 
96                 QFileDialog::getSaveFileName(qApp->focusWidget(),
97              title_, startsWith, filters.join(";;"),
98                          0, QFileDialog::DontConfirmOverwrite);
99         if (name.isNull())
100                 result.first = FileDialog::Later;
101         else
102                 result.second = toqstr(os::internal_path(fromqstr(name)));
103 #else
104         LyXFileDialog dlg(title_, path, filters, private_->b1, private_->b2);
105 #if QT_VERSION != 0x040203
106         dlg.setFileMode(QFileDialog::AnyFile);
107 #endif
108         dlg.setAcceptMode(QFileDialog::AcceptSave);
109         dlg.setConfirmOverwrite(false);
110
111         if (!suggested.isEmpty())
112                 dlg.selectFile(suggested);
113
114         LYXERR(Debug::GUI, "Synchronous FileDialog: ");
115         int res = dlg.exec();
116         LYXERR(Debug::GUI, "result " << res);
117         if (res == QDialog::Accepted)
118                 result.second = internalPath(dlg.selectedFiles()[0]);
119         else
120                 result.first = FileDialog::Later;
121         dlg.hide();
122 #endif
123         return result;
124 }
125
126
127 FileDialog::Result FileDialog::open(QString const & path,
128         QStringList const & filters, QString const & suggested)
129 {
130         LYXERR(Debug::GUI, "Select with path \"" << path
131                            << "\", mask \"" << filters.join(";;")
132                            << "\", suggested \"" << suggested << '"');
133         FileDialog::Result result;
134         result.first = FileDialog::Chosen;
135
136 #ifdef USE_NATIVE_FILEDIALOG
137         QString const startsWith = makeAbsPath(suggested, path);
138         QString const file = QFileDialog::getOpenFileName(qApp->focusWidget(),
139                 title_, startsWith, filters.join(";;"));
140         if (file.isNull())
141                 result.first = FileDialog::Later;
142         else
143                 result.second = internalPath(file);
144 #else
145         LyXFileDialog dlg(title_, path, filters, private_->b1, private_->b2);
146
147         if (!suggested.isEmpty())
148                 dlg.selectFile(suggested);
149
150         LYXERR(Debug::GUI, "Synchronous FileDialog: ");
151         int res = dlg.exec();
152         LYXERR(Debug::GUI, "result " << res);
153         if (res == QDialog::Accepted)
154                 result.second = internalPath(dlg.selectedFiles()[0]);
155         else
156                 result.first = FileDialog::Later;
157         dlg.hide();
158 #endif
159         return result;
160 }
161
162
163 FileDialog::Result FileDialog::opendir(QString const & path,
164         QString const & suggested)
165 {
166         LYXERR(Debug::GUI, "Select with path \"" << path
167                            << "\", suggested \"" << suggested << '"');
168         FileDialog::Result result;
169         result.first = FileDialog::Chosen;
170
171 #ifdef USE_NATIVE_FILEDIALOG
172         QString const startsWith = toqstr(makeAbsPath(fromqstr(suggested),
173                 fromqstr(path)).absFileName());
174         QString const dir = QFileDialog::getExistingDirectory(qApp->focusWidget(),
175                 title_, startsWith);
176         if (dir.isNull())
177                 result.first = FileDialog::Later;
178         else
179                 result.second = toqstr(os::internal_path(fromqstr(dir)));
180 #else
181         LyXFileDialog dlg(title_, path, QStringList(qt_("Directories")),
182                 private_->b1, private_->b2);
183
184         dlg.setFileMode(QFileDialog::DirectoryOnly);
185
186         if (!suggested.isEmpty())
187                 dlg.selectFile(suggested);
188
189         LYXERR(Debug::GUI, "Synchronous FileDialog: ");
190         int res = dlg.exec();
191         LYXERR(Debug::GUI, "result " << res);
192         if (res == QDialog::Accepted)
193                 result.second = internalPath(dlg.selectedFiles()[0]);
194         else
195                 result.first = FileDialog::Later;
196         dlg.hide();
197 #endif
198         return result;
199 }
200
201
202 } // namespace lyx