]>
git.saurik.com Git - wxWidgets.git/blob - src/generic/dbgrptg.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/generic/dbgrptg.cpp
3 // Purpose: implementation of wxDebugReportPreviewStd
4 // Author: Vadim Zeitlin, Andrej Putrin
8 // Copyright: (c) 2005 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9 // License: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 #include "wx/wxprec.h"
28 #include "wx/checklst.h"
29 #include "wx/textctrl.h"
34 #include "wx/debugrpt.h"
37 #include "wx/filename.h"
39 #include "wx/mimetype.h"
41 #include "wx/statline.h"
42 #include "wx/stattext.h"
43 #include "wx/filedlg.h"
44 #include "wx/valtext.h"
46 // ----------------------------------------------------------------------------
47 // wxDumpPreviewDlg: simple class for showing ASCII preview of dump files
48 // ----------------------------------------------------------------------------
50 class wxDumpPreviewDlg
: public wxDialog
53 wxDumpPreviewDlg(wxWindow
*parent
,
54 const wxString
& title
,
55 const wxString
& text
);
61 DECLARE_NO_COPY_CLASS(wxDumpPreviewDlg
)
64 wxDumpPreviewDlg::wxDumpPreviewDlg(wxWindow
*parent
,
65 const wxString
& title
,
67 : wxDialog(parent
, wxID_ANY
, title
,
68 wxDefaultPosition
, wxDefaultSize
,
69 wxDEFAULT_DIALOG_STYLE
| wxRESIZE_BORDER
)
74 // use wxTE_RICH2 style to avoid 64kB limit under MSW and display big files
75 // faster than with wxTE_RICH
76 m_text
= new wxTextCtrl(this, wxID_ANY
, wxEmptyString
,
77 wxPoint(0, 0), wxDefaultSize
,
82 m_text
->SetValue(text
);
84 // use fixed-width font
85 m_text
->SetFont(wxFont(12, wxFONTFAMILY_TELETYPE
,
86 wxFONTSTYLE_NORMAL
, wxFONTWEIGHT_NORMAL
));
88 wxButton
*btnClose
= new wxButton(this, wxID_CANCEL
, _("Close"));
94 wxSizer
*sizerTop
= new wxBoxSizer(wxVERTICAL
),
95 *sizerBtns
= new wxBoxSizer(wxHORIZONTAL
);
97 sizerBtns
->Add(btnClose
, 0, 0, 1);
99 sizerTop
->Add(m_text
, 1, wxEXPAND
);
100 sizerTop
->Add(sizerBtns
, 0, wxALIGN_RIGHT
| wxTOP
| wxBOTTOM
| wxRIGHT
, 1);
105 // make the text window bigger to show more contents of the file
106 sizerTop
->SetItemMinSize(m_text
, 600, 300);
115 // ----------------------------------------------------------------------------
116 // wxDumpOpenExternalDlg: choose a command for opening the given file
117 // ----------------------------------------------------------------------------
119 class wxDumpOpenExternalDlg
: public wxDialog
122 wxDumpOpenExternalDlg(wxWindow
*parent
, const wxFileName
& filename
);
124 // return the command chosed by user to open this file
125 const wxString
& GetCommand() const { return m_command
; }
130 void OnBrowse(wxCommandEvent
& event
);
132 DECLARE_EVENT_TABLE()
133 DECLARE_NO_COPY_CLASS(wxDumpOpenExternalDlg
)
136 BEGIN_EVENT_TABLE(wxDumpOpenExternalDlg
, wxDialog
)
137 EVT_BUTTON(wxID_MORE
, wxDumpOpenExternalDlg::OnBrowse
)
141 wxDumpOpenExternalDlg::wxDumpOpenExternalDlg(wxWindow
*parent
,
142 const wxFileName
& filename
)
147 _("Open file \"%s\""),
148 filename
.GetFullPath().c_str()
154 wxSizer
*sizerTop
= new wxBoxSizer(wxVERTICAL
);
155 sizerTop
->Add(new wxStaticText(this, wxID_ANY
,
158 _("Enter command to open file \"%s\":"),
159 filename
.GetFullName().c_str()
161 wxSizerFlags().Border());
163 wxSizer
*sizerH
= new wxBoxSizer(wxHORIZONTAL
);
165 wxTextCtrl
*command
= new wxTextCtrl
171 wxSize(250, wxDefaultCoord
),
174 ,wxTextValidator(wxFILTER_NONE
, &m_command
)
178 wxSizerFlags(1).Align(wxALIGN_CENTER_VERTICAL
));
179 wxButton
*browse
= new wxButton(this, wxID_MORE
, wxT(">>"),
180 wxDefaultPosition
, wxDefaultSize
,
183 wxSizerFlags(0).Align(wxALIGN_CENTER_VERTICAL
). Border(wxLEFT
));
185 sizerTop
->Add(sizerH
, wxSizerFlags(0).Expand().Border());
187 sizerTop
->Add(new wxStaticLine(this), wxSizerFlags().Expand().Border());
189 sizerTop
->Add(CreateStdDialogButtonSizer(wxOK
| wxCANCEL
),
190 wxSizerFlags().Align(wxALIGN_RIGHT
).Border());
203 void wxDumpOpenExternalDlg::OnBrowse(wxCommandEvent
& )
205 wxFileName
fname(m_command
);
206 wxFileDialog
dlg(this,
207 wxFileSelectorPromptStr
,
208 fname
.GetPathWithSep(),
211 , _("Executable files (*.exe)|*.exe|All files (*.*)|*.*||")
214 if ( dlg
.ShowModal() == wxID_OK
)
216 m_command
= dlg
.GetPath();
217 TransferDataToWindow();
222 // ----------------------------------------------------------------------------
223 // wxDebugReportDialog: class showing debug report to the user
224 // ----------------------------------------------------------------------------
226 class wxDebugReportDialog
: public wxDialog
229 wxDebugReportDialog(wxDebugReport
& dbgrpt
);
231 virtual bool TransferDataToWindow();
232 virtual bool TransferDataFromWindow();
235 void OnView(wxCommandEvent
& );
236 void OnViewUpdate(wxUpdateUIEvent
& );
237 void OnOpen(wxCommandEvent
& );
240 // small helper: add wxEXPAND and wxALL flags
241 static wxSizerFlags
SizerFlags(int proportion
)
243 return wxSizerFlags(proportion
).Expand().Border();
247 wxDebugReport
& m_dbgrpt
;
249 wxCheckListBox
*m_checklst
;
252 wxArrayString m_files
;
254 DECLARE_EVENT_TABLE()
255 DECLARE_NO_COPY_CLASS(wxDebugReportDialog
)
258 // ============================================================================
259 // wxDebugReportDialog implementation
260 // ============================================================================
262 BEGIN_EVENT_TABLE(wxDebugReportDialog
, wxDialog
)
263 EVT_BUTTON(wxID_VIEW_DETAILS
, wxDebugReportDialog::OnView
)
264 EVT_UPDATE_UI(wxID_VIEW_DETAILS
, wxDebugReportDialog::OnViewUpdate
)
265 EVT_BUTTON(wxID_OPEN
, wxDebugReportDialog::OnOpen
)
266 EVT_UPDATE_UI(wxID_OPEN
, wxDebugReportDialog::OnViewUpdate
)
270 // ----------------------------------------------------------------------------
272 // ----------------------------------------------------------------------------
274 wxDebugReportDialog::wxDebugReportDialog(wxDebugReport
& dbgrpt
)
275 : wxDialog(NULL
, wxID_ANY
,
276 wxString::Format(_("Debug report \"%s\""),
277 dbgrpt
.GetReportName().c_str()),
280 wxDEFAULT_DIALOG_STYLE
| wxTHICK_FRAME
),
283 // upper part of the dialog: explanatory message
285 msg
<< _("A debug report has been generated in the directory\n")
287 << _T(" \"") << dbgrpt
.GetDirectory() << _T("\"\n")
289 << _("The report contains the files listed below. If any of these ")
290 << _("files contain private information,\n")
291 << _("please uncheck them and they will be removed from the report.\n")
293 << _("If you wish to suppress this debug report completely, please ")
294 << _("choose the \"Cancel\" button,\n")
295 << _("but be warned that it may hinder improving the program, so if\n")
296 << _("at all possible please do continue with the report generation.\n")
298 << _(" Thank you and we're sorry for the inconvenience!\n")
299 << _T("\n\n"); // just some white space to separate from other stuff
301 const wxSizerFlags
flagsFixed(SizerFlags(0));
302 const wxSizerFlags
flagsExpand(SizerFlags(1));
303 const wxSizerFlags
flagsExpand2(SizerFlags(2));
305 wxSizer
*sizerPreview
=
306 new wxStaticBoxSizer(wxVERTICAL
, this, _("&Debug report preview:"));
307 sizerPreview
->Add(CreateTextSizer(msg
), SizerFlags(0).Centre());
309 // ... and the list of files in this debug report with buttons to view them
310 wxSizer
*sizerFileBtns
= new wxBoxSizer(wxVERTICAL
);
311 sizerFileBtns
->AddStretchSpacer(1);
312 sizerFileBtns
->Add(new wxButton(this, wxID_VIEW_DETAILS
, _T("&View...")),
313 wxSizerFlags().Border(wxBOTTOM
));
314 sizerFileBtns
->Add(new wxButton(this, wxID_OPEN
, _T("&Open...")),
315 wxSizerFlags().Border(wxTOP
));
316 sizerFileBtns
->AddStretchSpacer(1);
318 m_checklst
= new wxCheckListBox(this, wxID_ANY
);
320 wxSizer
*sizerFiles
= new wxBoxSizer(wxHORIZONTAL
);
321 sizerFiles
->Add(m_checklst
, flagsExpand
);
322 sizerFiles
->Add(sizerFileBtns
, flagsFixed
);
324 sizerPreview
->Add(sizerFiles
, flagsExpand2
);
327 // lower part of the dialog: notes field
328 wxSizer
*sizerNotes
= new wxStaticBoxSizer(wxVERTICAL
, this, _("&Notes:"));
330 msg
= _("If you have any additional information pertaining to this bug\n");
331 msg
<< _("report, please enter it here and it will be joined to it:");
333 m_notes
= new wxTextCtrl(this, wxID_ANY
, wxEmptyString
,
334 wxDefaultPosition
, wxDefaultSize
,
337 sizerNotes
->Add(CreateTextSizer(msg
), flagsFixed
);
338 sizerNotes
->Add(m_notes
, flagsExpand
);
341 wxSizer
*sizerTop
= new wxBoxSizer(wxVERTICAL
);
342 sizerTop
->Add(sizerPreview
, flagsExpand2
);
343 sizerTop
->AddSpacer(5);
344 sizerTop
->Add(sizerNotes
, flagsExpand
);
345 sizerTop
->Add(CreateStdDialogButtonSizer(wxOK
| wxCANCEL
), flagsFixed
);
347 SetSizerAndFit(sizerTop
);
352 // ----------------------------------------------------------------------------
354 // ----------------------------------------------------------------------------
356 bool wxDebugReportDialog::TransferDataToWindow()
358 // all files are included in the report by default
359 const size_t count
= m_dbgrpt
.GetFilesCount();
360 for ( size_t n
= 0; n
< count
; n
++ )
364 if ( m_dbgrpt
.GetFile(n
, &name
, &desc
) )
366 m_checklst
->Append(name
+ _T(" (") + desc
+ _T(')'));
367 m_checklst
->Check(n
);
376 bool wxDebugReportDialog::TransferDataFromWindow()
378 // any unchecked files should be removed from the report
379 const size_t count
= m_checklst
->GetCount();
380 for ( size_t n
= 0; n
< count
; n
++ )
382 if ( !m_checklst
->IsChecked(n
) )
384 m_dbgrpt
.RemoveFile(m_files
[n
]);
388 // if the user entered any notes, add them to the report
389 const wxString notes
= m_notes
->GetValue();
390 if ( !notes
.empty() )
392 // for now it's fixed, could make it configurable in the future...
393 const wxChar
*NOTES_FILE_NAME
= _T("notes.txt");
394 wxFileName
fn(m_dbgrpt
.GetDirectory(), NOTES_FILE_NAME
);
395 wxFFile
file(fn
.GetFullPath(), _T("w"));
396 if ( file
.IsOpened() && file
.Write(notes
) )
398 m_dbgrpt
.AddFile(NOTES_FILE_NAME
, _T("user notes"));
405 // ----------------------------------------------------------------------------
407 // ----------------------------------------------------------------------------
409 void wxDebugReportDialog::OnView(wxCommandEvent
& )
411 const int sel
= m_checklst
->GetSelection();
412 wxCHECK_RET( sel
!= -1, _T("invalid selection in OnView()") );
414 wxFileName
fn(m_dbgrpt
.GetDirectory(), m_files
[sel
]);
417 wxFFile
file(fn
.GetFullPath());
418 if ( file
.IsOpened() && file
.ReadAll(&str
) )
420 wxDumpPreviewDlg
dlg(this, m_files
[sel
], str
);
425 void wxDebugReportDialog::OnOpen(wxCommandEvent
& )
427 const int sel
= m_checklst
->GetSelection();
428 wxCHECK_RET( sel
!= -1, _T("invalid selection in OnOpen()") );
430 wxFileName
fn(m_dbgrpt
.GetDirectory(), m_files
[sel
]);
432 // try to get the command to open this kind of files ourselves
435 ft
= wxTheMimeTypesManager
->GetFileTypeFromExtension(fn
.GetExt());
438 command
= ft
->GetOpenCommand(fn
.GetFullPath());
441 // if we couldn't, ask the user
442 if ( command
.empty() )
444 wxDumpOpenExternalDlg
dlg(this, fn
);
445 if ( dlg
.ShowModal() == wxID_OK
)
447 // get the command chosen by the user and append file name to it
449 // if we don't have place marker for file name in the command...
450 wxString cmd
= dlg
.GetCommand();
451 if ( cmd
.find(_T('%')) == wxString::npos
)
454 cmd
+= _T(" \"%s\"");
457 command
= wxFileType::ExpandCommand(cmd
, fn
.GetFullPath());
461 if ( !command
.empty() )
462 ::wxExecute(command
);
465 void wxDebugReportDialog::OnViewUpdate(wxUpdateUIEvent
& event
)
467 int sel
= m_checklst
->GetSelection();
470 wxFileName
fn(m_dbgrpt
.GetDirectory(), m_files
[sel
]);
471 event
.Enable(fn
.FileExists());
478 // ============================================================================
479 // wxDebugReportPreviewStd implementation
480 // ============================================================================
482 bool wxDebugReportPreviewStd::Show(wxDebugReport
& dbgrpt
) const
484 if ( !dbgrpt
.GetFilesCount() )
487 wxDebugReportDialog
dlg(dbgrpt
);
489 return dlg
.ShowModal() == wxID_OK
&& dbgrpt
.GetFilesCount() != 0;
492 #endif // wxUSE_DEBUGREPORT