OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/shell_dialogs.h" | 5 #include "chrome/browser/shell_dialogs.h" |
6 | 6 |
7 #include <windows.h> | 7 #include <windows.h> |
8 #include <Commdlg.h> | 8 #include <Commdlg.h> |
9 #include <shlobj.h> | 9 #include <shlobj.h> |
10 | 10 |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 class SelectFileDialogImpl : public SelectFileDialog, | 187 class SelectFileDialogImpl : public SelectFileDialog, |
188 public BaseShellDialogImpl { | 188 public BaseShellDialogImpl { |
189 public: | 189 public: |
190 explicit SelectFileDialogImpl(Listener* listener); | 190 explicit SelectFileDialogImpl(Listener* listener); |
191 virtual ~SelectFileDialogImpl(); | 191 virtual ~SelectFileDialogImpl(); |
192 | 192 |
193 // SelectFileDialog implementation: | 193 // SelectFileDialog implementation: |
194 virtual void SelectFile(Type type, const std::wstring& title, | 194 virtual void SelectFile(Type type, const std::wstring& title, |
195 const std::wstring& default_path, | 195 const std::wstring& default_path, |
196 const std::wstring& filter, | 196 const std::wstring& filter, |
| 197 const std::wstring& default_extension, |
197 HWND owning_hwnd, | 198 HWND owning_hwnd, |
198 void* params); | 199 void* params); |
199 virtual bool IsRunning(HWND owning_hwnd) const; | 200 virtual bool IsRunning(HWND owning_hwnd) const; |
200 virtual void ListenerDestroyed(); | 201 virtual void ListenerDestroyed(); |
201 | 202 |
202 private: | 203 private: |
203 // Shows the file selection dialog modal to |owner| and calls the result | 204 // Shows the file selection dialog modal to |owner| and calls the result |
204 // back on the ui thread. Run on the dialog thread. | 205 // back on the ui thread. Run on the dialog thread. |
205 void ExecuteSelectFile(Type type, | 206 void ExecuteSelectFile(Type type, |
206 const std::wstring& title, | 207 const std::wstring& title, |
207 const std::wstring& default_path, | 208 const std::wstring& default_path, |
208 const std::wstring& filter, | 209 const std::wstring& filter, |
| 210 const std::wstring& default_extension, |
209 RunState run_state, | 211 RunState run_state, |
210 void* params); | 212 void* params); |
211 | 213 |
212 // Notifies the listener that a folder was chosen. Run on the ui thread. | 214 // Notifies the listener that a folder was chosen. Run on the ui thread. |
213 void FileSelected(const std::wstring& path, void* params, RunState run_state); | 215 void FileSelected(const std::wstring& path, void* params, RunState run_state); |
214 | 216 |
215 // Notifies the listener that no file was chosen (the action was canceled). | 217 // Notifies the listener that no file was chosen (the action was canceled). |
216 // Run on the ui thread. | 218 // Run on the ui thread. |
217 void FileNotSelected(void* params, RunState run_state); | 219 void FileNotSelected(void* params, RunState run_state); |
218 | 220 |
(...skipping 24 matching lines...) Expand all Loading... |
243 BaseShellDialogImpl() { | 245 BaseShellDialogImpl() { |
244 } | 246 } |
245 | 247 |
246 SelectFileDialogImpl::~SelectFileDialogImpl() { | 248 SelectFileDialogImpl::~SelectFileDialogImpl() { |
247 } | 249 } |
248 | 250 |
249 void SelectFileDialogImpl::SelectFile(Type type, | 251 void SelectFileDialogImpl::SelectFile(Type type, |
250 const std::wstring& title, | 252 const std::wstring& title, |
251 const std::wstring& default_path, | 253 const std::wstring& default_path, |
252 const std::wstring& filter, | 254 const std::wstring& filter, |
| 255 const std::wstring& default_extension, |
253 HWND owner, | 256 HWND owner, |
254 void* params) { | 257 void* params) { |
255 RunState run_state = BeginRun(owner); | 258 RunState run_state = BeginRun(owner); |
256 run_state.dialog_thread->message_loop()->PostTask(FROM_HERE, | 259 run_state.dialog_thread->message_loop()->PostTask(FROM_HERE, |
257 NewRunnableMethod(this, &SelectFileDialogImpl::ExecuteSelectFile, type, | 260 NewRunnableMethod(this, &SelectFileDialogImpl::ExecuteSelectFile, type, |
258 title, default_path, filter, run_state, params)); | 261 title, default_path, filter, default_extension, |
| 262 run_state, params)); |
259 } | 263 } |
260 | 264 |
261 bool SelectFileDialogImpl::IsRunning(HWND owning_hwnd) const { | 265 bool SelectFileDialogImpl::IsRunning(HWND owning_hwnd) const { |
262 return listener_ && IsRunningDialogForOwner(owning_hwnd); | 266 return listener_ && IsRunningDialogForOwner(owning_hwnd); |
263 } | 267 } |
264 | 268 |
265 void SelectFileDialogImpl::ListenerDestroyed() { | 269 void SelectFileDialogImpl::ListenerDestroyed() { |
266 // Our associated listener has gone away, so we shouldn't call back to it if | 270 // Our associated listener has gone away, so we shouldn't call back to it if |
267 // our worker thread returns after the listener is dead. | 271 // our worker thread returns after the listener is dead. |
268 listener_ = NULL; | 272 listener_ = NULL; |
269 } | 273 } |
270 | 274 |
271 void SelectFileDialogImpl::ExecuteSelectFile( | 275 void SelectFileDialogImpl::ExecuteSelectFile( |
272 Type type, | 276 Type type, |
273 const std::wstring& title, | 277 const std::wstring& title, |
274 const std::wstring& default_path, | 278 const std::wstring& default_path, |
275 const std::wstring& filter, | 279 const std::wstring& filter, |
| 280 const std::wstring& default_extension, |
276 RunState run_state, | 281 RunState run_state, |
277 void* params) { | 282 void* params) { |
278 std::wstring path = default_path; | 283 std::wstring path = default_path; |
279 bool success = false; | 284 bool success = false; |
280 if (type == SELECT_FOLDER) { | 285 if (type == SELECT_FOLDER) { |
281 success = RunSelectFolderDialog(title, run_state.owner, &path); | 286 success = RunSelectFolderDialog(title, run_state.owner, &path); |
282 } else if (type == SELECT_SAVEAS_FILE) { | 287 } else if (type == SELECT_SAVEAS_FILE) { |
283 success = win_util::SaveFileAs(run_state.owner, default_path, &path); | 288 const wchar_t* filter_string = filter.empty() ? NULL : filter.c_str(); |
| 289 unsigned index = 0; |
| 290 success = win_util::SaveFileAsWithFilter(run_state.owner, default_path, |
| 291 filter_string, default_extension, &index, &path); |
284 DisableOwner(run_state.owner); | 292 DisableOwner(run_state.owner); |
285 } else if (type == SELECT_OPEN_FILE) { | 293 } else if (type == SELECT_OPEN_FILE) { |
286 success = RunOpenFileDialog(title, filter, run_state.owner, &path); | 294 success = RunOpenFileDialog(title, filter, run_state.owner, &path); |
287 } | 295 } |
288 | 296 |
289 if (success) { | 297 if (success) { |
290 ui_loop_->PostTask(FROM_HERE, NewRunnableMethod(this, | 298 ui_loop_->PostTask(FROM_HERE, NewRunnableMethod(this, |
291 &SelectFileDialogImpl::FileSelected, path, params, run_state)); | 299 &SelectFileDialogImpl::FileSelected, path, params, run_state)); |
292 } else { | 300 } else { |
293 ui_loop_->PostTask(FROM_HERE, NewRunnableMethod(this, | 301 ui_loop_->PostTask(FROM_HERE, NewRunnableMethod(this, |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
530 void SelectFontDialogImpl::FontNotSelected(void* params, RunState run_state) { | 538 void SelectFontDialogImpl::FontNotSelected(void* params, RunState run_state) { |
531 if (listener_) | 539 if (listener_) |
532 listener_->FontSelectionCanceled(params); | 540 listener_->FontSelectionCanceled(params); |
533 EndRun(run_state); | 541 EndRun(run_state); |
534 } | 542 } |
535 | 543 |
536 // static | 544 // static |
537 SelectFontDialog* SelectFontDialog::Create(Listener* listener) { | 545 SelectFontDialog* SelectFontDialog::Create(Listener* listener) { |
538 return new SelectFontDialogImpl(listener); | 546 return new SelectFontDialogImpl(listener); |
539 } | 547 } |
OLD | NEW |