]>
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
173 wxTextValidator(wxFILTER_NONE
, &m_command
)
176 wxSizerFlags(1).Align(wxALIGN_CENTER_VERTICAL
));
177 wxButton
*browse
= new wxButton(this, wxID_MORE
, wxT(">>"),
178 wxDefaultPosition
, wxDefaultSize
,
181 wxSizerFlags(0).Align(wxALIGN_CENTER_VERTICAL
). Border(wxLEFT
));
183 sizerTop
->Add(sizerH
, wxSizerFlags(0).Expand().Border());
185 sizerTop
->Add(new wxStaticLine(this), wxSizerFlags().Expand().Border());
187 sizerTop
->Add(CreateStdDialogButtonSizer(wxOK
| wxCANCEL
),
188 wxSizerFlags().Align(wxALIGN_RIGHT
).Border());
201 void wxDumpOpenExternalDlg::OnBrowse(wxCommandEvent
& )
203 wxFileName
fname(m_command
);
204 wxFileDialog
dlg(this,
205 wxFileSelectorPromptStr
,
206 fname
.GetPathWithSep(),
209 , _("Executable files (*.exe)|*.exe|All files (*.*)|*.*||")
212 if ( dlg
.ShowModal() == wxID_OK
)
214 m_command
= dlg
.GetPath();
215 TransferDataToWindow();
220 // ----------------------------------------------------------------------------
221 // wxDebugReportDialog: class showing debug report to the user
222 // ----------------------------------------------------------------------------
224 class wxDebugReportDialog
: public wxDialog
227 wxDebugReportDialog(wxDebugReport
& dbgrpt
);
229 virtual bool TransferDataToWindow();
230 virtual bool TransferDataFromWindow();
233 void OnView(wxCommandEvent
& );
234 void OnViewUpdate(wxUpdateUIEvent
& );
235 void OnOpen(wxCommandEvent
& );
238 // small helper: add wxEXPAND and wxALL flags
239 static wxSizerFlags
SizerFlags(int proportion
)
241 return wxSizerFlags(proportion
).Expand().Border();
245 wxDebugReport
& m_dbgrpt
;
247 wxCheckListBox
*m_checklst
;
250 wxArrayString m_files
;
252 DECLARE_EVENT_TABLE()
253 DECLARE_NO_COPY_CLASS(wxDebugReportDialog
)
256 // ============================================================================
257 // wxDebugReportDialog implementation
258 // ============================================================================
260 BEGIN_EVENT_TABLE(wxDebugReportDialog
, wxDialog
)
261 EVT_BUTTON(wxID_VIEW_DETAILS
, wxDebugReportDialog::OnView
)
262 EVT_UPDATE_UI(wxID_VIEW_DETAILS
, wxDebugReportDialog::OnViewUpdate
)
263 EVT_BUTTON(wxID_OPEN
, wxDebugReportDialog::OnOpen
)
264 EVT_UPDATE_UI(wxID_OPEN
, wxDebugReportDialog::OnViewUpdate
)
268 // ----------------------------------------------------------------------------
270 // ----------------------------------------------------------------------------
272 wxDebugReportDialog::wxDebugReportDialog(wxDebugReport
& dbgrpt
)
273 : wxDialog(NULL
, wxID_ANY
,
274 wxString::Format(_("Debug report \"%s\""),
275 dbgrpt
.GetReportName().c_str()),
278 wxDEFAULT_DIALOG_STYLE
| wxTHICK_FRAME
),
281 // upper part of the dialog: explanatory message
283 msg
<< _("A debug report has been generated in the directory\n")
285 << _T(" \"") << dbgrpt
.GetDirectory() << _T("\"\n")
287 << _("The report contains the files listed below. If any of these ")
288 << _("files contain private information,\n")
289 << _("please uncheck them and they will be removed from the report.\n")
291 << _("If you wish to suppress this debug report completely, please ")
292 << _("choose the \"Cancel\" button,\n")
293 << _("but be warned that it may hinder improving the program, so if\n")
294 << _("at all possible please do continue with the report generation.\n")
296 << _(" Thank you and we're sorry for the inconvenience!\n")
297 << _T("\n\n"); // just some white space to separate from other stuff
299 const wxSizerFlags
flagsFixed(SizerFlags(0));
300 const wxSizerFlags
flagsExpand(SizerFlags(1));
301 const wxSizerFlags
flagsExpand2(SizerFlags(2));
303 wxSizer
*sizerPreview
=
304 new wxStaticBoxSizer(wxVERTICAL
, this, _("&Debug report preview:"));
305 sizerPreview
->Add(CreateTextSizer(msg
), SizerFlags(0).Centre());
307 // ... and the list of files in this debug report with buttons to view them
308 wxSizer
*sizerFileBtns
= new wxBoxSizer(wxVERTICAL
);
309 sizerFileBtns
->AddStretchSpacer(1);
310 sizerFileBtns
->Add(new wxButton(this, wxID_VIEW_DETAILS
, _T("&View...")),
311 wxSizerFlags().Border(wxBOTTOM
));
312 sizerFileBtns
->Add(new wxButton(this, wxID_OPEN
, _T("&Open...")),
313 wxSizerFlags().Border(wxTOP
));
314 sizerFileBtns
->AddStretchSpacer(1);
316 m_checklst
= new wxCheckListBox(this, wxID_ANY
);
318 wxSizer
*sizerFiles
= new wxBoxSizer(wxHORIZONTAL
);
319 sizerFiles
->Add(m_checklst
, flagsExpand
);
320 sizerFiles
->Add(sizerFileBtns
, flagsFixed
);
322 sizerPreview
->Add(sizerFiles
, flagsExpand2
);
325 // lower part of the dialog: notes field
326 wxSizer
*sizerNotes
= new wxStaticBoxSizer(wxVERTICAL
, this, _("&Notes:"));
328 msg
= _("If you have any additional information pertaining to this bug\n");
329 msg
<< _("report, please enter it here and it will be joined to it:");
331 m_notes
= new wxTextCtrl(this, wxID_ANY
, wxEmptyString
,
332 wxDefaultPosition
, wxDefaultSize
,
335 sizerNotes
->Add(CreateTextSizer(msg
), flagsFixed
);
336 sizerNotes
->Add(m_notes
, flagsExpand
);
339 wxSizer
*sizerTop
= new wxBoxSizer(wxVERTICAL
);
340 sizerTop
->Add(sizerPreview
, flagsExpand2
);
341 sizerTop
->AddSpacer(5);
342 sizerTop
->Add(sizerNotes
, flagsExpand
);
343 sizerTop
->Add(CreateStdDialogButtonSizer(wxOK
| wxCANCEL
), flagsFixed
);
345 SetSizerAndFit(sizerTop
);
350 // ----------------------------------------------------------------------------
352 // ----------------------------------------------------------------------------
354 bool wxDebugReportDialog::TransferDataToWindow()
356 // all files are included in the report by default
357 const size_t count
= m_dbgrpt
.GetFilesCount();
358 for ( size_t n
= 0; n
< count
; n
++ )
362 if ( m_dbgrpt
.GetFile(n
, &name
, &desc
) )
364 m_checklst
->Append(name
+ _T(" (") + desc
+ _T(')'));
365 m_checklst
->Check(n
);
374 bool wxDebugReportDialog::TransferDataFromWindow()
376 // any unchecked files should be removed from the report
377 const size_t count
= m_checklst
->GetCount();
378 for ( size_t n
= 0; n
< count
; n
++ )
380 if ( !m_checklst
->IsChecked(n
) )
382 m_dbgrpt
.RemoveFile(m_files
[n
]);
386 // if the user entered any notes, add them to the report
387 const wxString notes
= m_notes
->GetValue();
388 if ( !notes
.empty() )
390 // for now it's fixed, could make it configurable in the future...
391 const wxChar
*NOTES_FILE_NAME
= _T("notes.txt");
392 wxFileName
fn(m_dbgrpt
.GetDirectory(), NOTES_FILE_NAME
);
393 wxFFile
file(fn
.GetFullPath(), _T("w"));
394 if ( file
.IsOpened() && file
.Write(notes
) )
396 m_dbgrpt
.AddFile(NOTES_FILE_NAME
, _T("user notes"));
403 // ----------------------------------------------------------------------------
405 // ----------------------------------------------------------------------------
407 void wxDebugReportDialog::OnView(wxCommandEvent
& )
409 const int sel
= m_checklst
->GetSelection();
410 wxCHECK_RET( sel
!= -1, _T("invalid selection in OnView()") );
412 wxFileName
fn(m_dbgrpt
.GetDirectory(), m_files
[sel
]);
415 wxFFile
file(fn
.GetFullPath());
416 if ( file
.IsOpened() && file
.ReadAll(&str
) )
418 wxDumpPreviewDlg
dlg(this, m_files
[sel
], str
);
423 void wxDebugReportDialog::OnOpen(wxCommandEvent
& )
425 const int sel
= m_checklst
->GetSelection();
426 wxCHECK_RET( sel
!= -1, _T("invalid selection in OnOpen()") );
428 wxFileName
fn(m_dbgrpt
.GetDirectory(), m_files
[sel
]);
430 // try to get the command to open this kind of files ourselves
433 ft
= wxTheMimeTypesManager
->GetFileTypeFromExtension(fn
.GetExt());
436 command
= ft
->GetOpenCommand(fn
.GetFullPath());
439 // if we couldn't, ask the user
440 if ( command
.empty() )
442 wxDumpOpenExternalDlg
dlg(this, fn
);
443 if ( dlg
.ShowModal() == wxID_OK
)
445 // get the command chosen by the user and append file name to it
447 // if we don't have place marker for file name in the command...
448 wxString cmd
= dlg
.GetCommand();
449 if ( cmd
.find(_T('%')) == wxString::npos
)
452 cmd
+= _T(" \"%s\"");
455 command
= wxFileType::ExpandCommand(cmd
, fn
.GetFullPath());
459 if ( !command
.empty() )
460 ::wxExecute(command
);
463 void wxDebugReportDialog::OnViewUpdate(wxUpdateUIEvent
& event
)
465 int sel
= m_checklst
->GetSelection();
468 wxFileName
fn(m_dbgrpt
.GetDirectory(), m_files
[sel
]);
469 event
.Enable(fn
.FileExists());
476 // ============================================================================
477 // wxDebugReportPreviewStd implementation
478 // ============================================================================
480 bool wxDebugReportPreviewStd::Show(wxDebugReport
& dbgrpt
) const
482 if ( !dbgrpt
.GetFilesCount() )
485 wxDebugReportDialog
dlg(dbgrpt
);
487 return dlg
.ShowModal() == wxID_OK
&& dbgrpt
.GetFilesCount() != 0;
490 #endif // wxUSE_DEBUGREPORT