Audacity  3.0.3
Static Public Member Functions | Static Public Attributes | List of all members
HelpSystem Class Reference

Class which contains static methods and data needed for implementing help buttons. More...

#include <HelpSystem.h>

Static Public Member Functions

static void ShowInfoDialog (wxWindow *parent, const TranslatableString &dlogTitle, const TranslatableString &shortMsg, const wxString &message, const int xSize, const int ySize)
 Displays cuttable information in a text ctrl, with an OK button. More...
 
static void ShowHtmlText (wxWindow *pParent, const TranslatableString &Title, const wxString &HtmlText, bool bIsFile=false, bool bModal=false)
 
static void ShowHelp (wxWindow *parent, const wxString &localFileName, const wxString &remoteURL, bool bModal=false, bool alwaysDefaultBrowser=false)
 
static void ShowHelp (wxWindow *parent, const wxString &PageName, bool bModal=false)
 

Static Public Attributes

static const wxString HelpHostname = wxT("manual.audacityteam.org")
 
static const wxString HelpServerHomeDir = wxT("/")
 
static const wxString HelpServerManDir = wxT("/man/")
 
static const wxString LocalHelpManDir = wxT("/man/")
 
static const wxString ReleaseSuffix = wxT(".html")
 

Detailed Description

Class which contains static methods and data needed for implementing help buttons.

This class should be the only place in the codebase where the location of the online copy of the Audacity manual is stored, so that it can be changed if required

Definition at line 38 of file HelpSystem.h.

Member Function Documentation

◆ ShowHelp() [1/2]

void HelpSystem::ShowHelp ( wxWindow *  parent,
const wxString &  localFileName,
const wxString &  remoteURL,
bool  bModal = false,
bool  alwaysDefaultBrowser = false 
)
static

Displays a file in your browser, if it's available locally, OR else links to the internet. Generally using this outside this class is depreciated in favour of the "smarter" overload below, unless there is a good reason for using this form.

Parameters
localFileNameName and path of the file on the local machine file system to be opened. file.name::anchor syntax is allowed, and therefore file names containing a '#' are not (on any platform).
bModalWhether the resulting dialogue should be modal or not. Default is modeless dialogue
alwaysDefaultBrowserForce use of default web browser. Default allows built in browser for local files.

Definition at line 238 of file HelpSystem.cpp.

243 {
244  wxASSERT(parent); // to justify safenew
245  wxString HelpMode = wxT("Local");
246 
247 // DA: Default for DA is manual from internet.
248 #ifdef EXPERIMENTAL_DA
249  gPrefs->Read(wxT("/GUI/Help"), &HelpMode, wxT("FromInternet") );
250 #else
251  gPrefs->Read(wxT("/GUI/Help"), &HelpMode, wxT("Local") );
252 #endif
253 
254  {
255  // these next lines are for legacy cfg files (pre 2.0) where we had different modes
256  if( (HelpMode == wxT("Standard")) || (HelpMode == wxT("InBrowser")) )
257  {
258  HelpMode = GUIManualLocation.Default().Internal();
259  GUIManualLocation.Write(HelpMode);
260  gPrefs->Flush();
261  }
262  }
263 
264  // Anchors (URLs with a '#' in them) are not supported by many OSs for local file names
265  // See, for example, https://groups.google.com/forum/#!topic/wx-users/pC0uOZJalRQ
266  // Problems have been reported on Win, Mac and some versions of Linux.
267  // So we set HelpMode to use the internet if an anchor is found.
268  if (localFileName.Find('#', true) != wxNOT_FOUND)
269  HelpMode = wxT("FromInternet");
270  // Until a solution is found for this, the next few lines are irrelevant.
271 
272  // Obtain the local file system file name, without the anchor if present.
273  wxString localfile;
274  if (localFileName.Find('#', true) != wxNOT_FOUND)
275  localfile = localFileName.BeforeLast('#');
276  else
277  localfile = localFileName;
278 
279  if( (HelpMode == wxT("FromInternet")) && !remoteURL.empty() )
280  {
281  // Always go to remote URL. Use External browser.
282  OpenInDefaultBrowser( remoteURL );
283  }
284  else if( localfile.empty() || !wxFileExists( localfile ))
285  {
286  // If you give an empty remote URL, you should have already ensured
287  // that the file exists!
288  wxASSERT( !remoteURL.empty() );
289  // I can't find it'.
290  // Use Built-in browser to suggest you use the remote url.
291  wxString Text = HelpText( wxT("remotehelp") );
292  Text.Replace( wxT("*URL*"), remoteURL );
293  // Always make the 'help on the internet' dialog modal.
294  // Fixes Bug 1411.
295  ShowHtmlText( parent, XO("Help on the Internet"), Text, false, true );
296  }
297  else if( HelpMode == wxT("Local") || alwaysDefaultBrowser)
298  {
299  // Local file, External browser
300  OpenInDefaultBrowser( wxString(wxT("file:"))+localFileName );
301  }
302  else
303  {
304  // Local file, Built-in browser
305  ShowHtmlText( parent, {}, localFileName, true, bModal );
306  }
307 }

References ChoiceSetting::Default(), FileConfig::Flush(), gPrefs, GUIManualLocation, HelpText(), ComponentInterfaceSymbol::Internal(), OpenInDefaultBrowser(), ShowHtmlText(), ChoiceSetting::Write(), and XO.

Referenced by FindDialog::OnDownload(), FindFFmpegDialog::OnDownload(), LibraryPrefs::OnFFmpegDownButton(), ContrastDialog::OnGetURL(), ExportFFmpegOptions::OnGetURL(), FrequencyPlotDialog::OnGetURL(), HistoryDialog::OnGetURL(), ScreenshotBigDialog::OnGetURL(), anonymous_namespace{ProjectFileManager.cpp}::CompactDialog::OnGetURL(), anonymous_namespace{HelpMenus.cpp}::QuickFixDialog::OnHelp(), PrefsDialog::OnHelp(), MacroCommandDialog::OnHelp(), ApplyMacroDialog::OnHelp(), EffectNoiseReduction::Dialog::OnHelp(), ExportMultipleDialog::OnHelp(), LabelDialog::OnHelp(), ErrorDialog::OnHelp(), ErrorReportDialog::OnHelp(), MultiDialog::OnHelp(), AudacityCommandDialog::OnHelp(), EffectUIHost::OnHelp(), Exporter::OnHelp(), TagsEditorDialog::OnHelp(), TimerRecordDialog::OnHelpButtonClick(), LinkingHtmlWindow::OnLinkClicked(), HelpActions::Handler::OnManual(), ExportMixerDialog::OnMixerPanelHelp(), LibraryPrefs::OnMP3DownButton(), HelpActions::Handler::OnQuickHelp(), and ShowHelp().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ShowHelp() [2/2]

void HelpSystem::ShowHelp ( wxWindow *  parent,
const wxString &  PageName,
bool  bModal = false 
)
static

Displays a page from the Audacity manual in your browser, if it's available locally, OR else links to the internet.

Parameters
PageNameThe name of the manual page to display as it is in development version of the manual (i.e. in MediaWiki), not the converted file name used for offline and released manuals.
bModalWhether the resulting dialogue should be modal or not. Default is modeless dialogue

Definition at line 309 of file HelpSystem.cpp.

312 {
313  wxString localHelpPage;
314  wxString webHelpPath;
315  wxString webHelpPage;
316  wxString releasePageName;
317  wxString anchor; // optional part of URL after (and including) the '#'
318  if (PageName.Find('#', true) != wxNOT_FOUND)
319  { // need to split anchor off into separate variable
320  releasePageName= PageName.BeforeLast('#');
321  anchor = wxT("#") + PageName.AfterLast('#');
322  }
323  else
324  {
325  releasePageName = PageName;
326  anchor = wxT("");
327  }
328  // The wiki pages are transformed to static HTML by
329  // scripts/mw2html_audacity/mw2html.py
330  // The name is first transformed to lower case, then all
331  // 'special characters' are replaced by underscores. Spaces are
332  // transformed to "+".
333  //
334  // The transformations are handled in mw2html by first applying
335  // 'urllib.parse.quote_plus' (escape chars that are not in "always safe" list)
336  // then replacing escape characters (%xx) with underscores,
337  // and finally removing duplicate / redundant underscores.
338  //
339  // The front page and 'quick_help' are treated as special cases and placed in
340  // the root of the help directory rather than the "/man/" sub-directory.
341  if (releasePageName == wxT("Main_Page"))
342  {
343  releasePageName = wxT("index") + HelpSystem::ReleaseSuffix + anchor;
344  localHelpPage = wxFileName(FileNames::HtmlHelpDir(), releasePageName).GetFullPath();
345  webHelpPath = wxT("https://")+HelpSystem::HelpHostname+HelpSystem::HelpServerHomeDir;
346  }
347  else if (releasePageName == wxT("Quick_Help"))
348  {
349 // DA: No bundled help, by default, and different quick-help URL.
350 #ifdef EXPERIMENTAL_DA
351  releasePageName = wxT("video") + HelpSystem::ReleaseSuffix + anchor;
352  localHelpPage = wxFileName(FileNames::HtmlHelpDir(), releasePageName).GetFullPath();
353  webHelpPath = wxT("http://www.darkaudacity.com/");
354 #else
355  releasePageName = wxT("quick_help") + HelpSystem::ReleaseSuffix + anchor;
356  localHelpPage = wxFileName(FileNames::HtmlHelpDir(), releasePageName).GetFullPath();
357  webHelpPath = wxT("https://")+HelpSystem::HelpHostname+HelpSystem::HelpServerHomeDir;
358 #endif
359  }
360  // not a page name, but rather a full path (e.g. to wiki)
361  // in which case do not do any substitutions.
362  else if (releasePageName.StartsWith( "http" ) )
363  {
364  localHelpPage = "";
365  webHelpPage = releasePageName + anchor;
366  }
367  else
368  {
369  // Handle all other pages.
370  // Change to lower case.
371  releasePageName = releasePageName.Lower();
372  wxRegEx re;
373  // replace 'special characters' with underscores.
374  // RFC 2396 defines the characters a-z, A-Z, 0-9 and ".-_" as "always safe"
375  // mw2html also replaces "-" with "_" so replace that too.
376 
377  // If PageName contains a %xx code, mw2html will transform it:
378  // '%xx' => '%25xx' => '_'
379  re.Compile(wxT("%.."));
380  re.ReplaceAll(&releasePageName, (wxT("_")));
381  // Now replace all other 'not-safe' characters.
382  re.Compile(wxT("[^[:alnum:] . [:space:]]"));
383  re.ReplaceAll(&releasePageName, (wxT("_")));
384  // Replace spaces with "+"
385  releasePageName.Replace(wxT(" "), wxT("+"), true);
386  // Reduce multiple underscores to single underscores
387  re.Compile(wxT("__+"));
388  re.ReplaceAll(&releasePageName, (wxT("_")));
389  // Replace "_." with "."
390  releasePageName.Replace(wxT("_."), wxT("."), true);
391  // Concatenate file name with file extension and anchor.
392  releasePageName = releasePageName + HelpSystem::ReleaseSuffix + anchor;
393  // Other than index and quick_help, all local pages are in subdirectory 'LocalHelpManDir'.
394  localHelpPage = wxFileName(FileNames::HtmlHelpDir() + LocalHelpManDir, releasePageName).GetFullPath();
395  // Other than index and quick_help, all on-line pages are in subdirectory 'HelpServerManDir'.
396  webHelpPath = wxT("https://")+HelpSystem::HelpHostname+HelpSystem::HelpServerManDir;
397  }
398 
399 #ifdef USE_ALPHA_MANUAL
400  webHelpPage = webHelpPath + PageName;
401 #else
402  webHelpPage = webHelpPath + releasePageName;
403 #endif
404 
405  wxLogMessage(wxT("Help button pressed: PageName %s, releasePageName %s"),
406  PageName, releasePageName);
407  wxLogMessage(wxT("webHelpPage %s, localHelpPage %s"),
408  webHelpPage, localHelpPage);
409 
410  wxASSERT(parent); // to justify safenew
411 
413  parent,
414  localHelpPage,
415  webHelpPage,
416  bModal
417  );
418 }

References HelpHostname, HelpServerHomeDir, HelpServerManDir, FileNames::HtmlHelpDir(), LocalHelpManDir, ReleaseSuffix, and ShowHelp().

Here is the call graph for this function:

◆ ShowHtmlText()

void HelpSystem::ShowHtmlText ( wxWindow *  pParent,
const TranslatableString Title,
const wxString &  HtmlText,
bool  bIsFile = false,
bool  bModal = false 
)
static

Displays a NEW window with wxHTML help.

Parameters
HtmlTextEither the literal HTML code to go into the window, or the name of the file to read said HTML code from (see below).
bIsFileIf true, treat HtmlText argument as a file name, if false (default), then it is the HTML code to display.
bModalWhether the resulting window should be modal or not. Default is modeless dialogue

Definition at line 126 of file HelpSystem.cpp.

131 {
132  LinkingHtmlWindow *html;
133 
134  wxASSERT(pParent); // to justify safenew
135  // JKC: ANSWER-ME: Why do we create a fake 'frame' and then put a BrowserDialog
136  // inside it, rather than have a variant of the BrowserDialog that is a
137  // frame??
138  // Bug 1412 seems to be related to the extra frame.
139  auto pFrame = safenew wxFrame {
140  pParent, wxID_ANY, Title.Translation(), wxDefaultPosition, wxDefaultSize,
141 #if defined(__WXMAC__)
142  // On OSX, the html frame can go behind the help dialog and if the help
143  // html frame is modal, you can't get back to it. Pressing escape gets
144  // you out of this, but it's just easier to add the wxSTAY_ON_TOP flag
145  // to prevent it from falling behind the dialog. Not the perfect solution
146  // but acceptable in this case.
147  wxSTAY_ON_TOP |
148 #endif
149  wxDEFAULT_FRAME_STYLE
150  };
151 
152  BrowserDialog * pWnd;
153  if( bModal )
154  pWnd = safenew HtmlTextHelpDialog{ pFrame, Title };
155  else
156  pWnd = safenew BrowserDialog{ pFrame, Title };
157 
158  // Bug 1412 workaround for 'extra window'. Hide the 'fake' window.
159  pFrame->SetTransparent(0);
160  ShuttleGui S( pWnd, eIsCreating );
161 
162  S.Style( wxNO_BORDER | wxTAB_TRAVERSAL )
163  .Prop(true)
164  .StartPanel();
165  {
166  S.StartHorizontalLay( wxEXPAND, false );
167  {
168  S.Id( wxID_BACKWARD )
169  .Disable()
170 #if wxUSE_TOOLTIPS
171  .ToolTip( XO("Backwards" ) )
172 #endif
173  /* i18n-hint arrowhead meaning backward movement */
174  .AddButton( XXO("<") );
175  S.Id( wxID_FORWARD )
176  .Disable()
177 #if wxUSE_TOOLTIPS
178  .ToolTip( XO("Forwards" ) )
179 #endif
180  /* i18n-hint arrowhead meaning forward movement */
181  .AddButton( XXO(">") );
182  }
183  S.EndHorizontalLay();
184 
185  html = safenew LinkingHtmlWindow(S.GetParent(), wxID_ANY,
186  wxDefaultPosition,
187  bIsFile ? wxSize(500, 400) : wxSize(480, 240),
188  wxHW_SCROLLBAR_AUTO | wxSUNKEN_BORDER);
189 
190  html->SetRelatedFrame( pFrame, wxT("Help: %s") );
191  if( bIsFile )
192  html->LoadFile( HtmlText );
193  else
194  html->SetPage( HtmlText);
195 
196  S.Prop(1).Focus().Position( wxEXPAND )
197  .AddWindow( html );
198 
199  S.Id( wxID_CANCEL ).AddButton( XXO("Close"), wxALIGN_CENTER, true );
200  }
201  S.EndPanel();
202 
203  // -- START of ICON stuff -----
204  // If this section (providing an icon) causes compilation errors on linux, comment it out for now.
205  // it will just mean that the icon is missing. Works OK on Windows.
206  #ifdef __WXMSW__
207  wxIcon ic{ wxICON(AudacityLogo) };
208  #else
209  wxIcon ic{};
210  ic.CopyFromBitmap(theTheme.Bitmap(bmpAudacityLogo48x48));
211  #endif
212  pFrame->SetIcon( ic );
213  // -- END of ICON stuff -----
214 
215 
216  pWnd->mpHtml = html;
217  pWnd->SetBackgroundColour( wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
218 
219  pFrame->CreateStatusBar();
220  pFrame->Centre();
221  pFrame->Layout();
222  pFrame->SetSizeHints(pWnd->GetSize());
223 
224  pFrame->SetName(Title.Translation());
225  if (bModal)
226  pWnd->ShowModal();
227  else {
228  pWnd->Show(true);
229  pFrame->Show(true);
230  }
231 
232  html->SetRelatedStatusBar( 0 );
233 
234  return;
235 }

References ShuttleGuiBase::AddButton(), ShuttleGuiBase::AddWindow(), ThemeBase::Bitmap(), ShuttleGui::Disable(), eIsCreating, ShuttleGuiBase::EndHorizontalLay(), ShuttleGuiBase::EndPanel(), ShuttleGui::Focus(), ShuttleGuiBase::GetParent(), ShuttleGui::Id(), BrowserDialog::mpHtml, ShuttleGui::Position(), ShuttleGui::Prop(), safenew, wxDialogWrapper::SetName(), ShuttleGuiBase::StartHorizontalLay(), ShuttleGuiBase::StartPanel(), ShuttleGui::Style(), theTheme, ShuttleGui::ToolTip(), TranslatableString::Translation(), XO, and XXO.

Referenced by ErrorDialog::OnHelp(), ErrorReportDialog::OnHelp(), and ShowHelp().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ShowInfoDialog()

void HelpSystem::ShowInfoDialog ( wxWindow *  parent,
const TranslatableString dlogTitle,
const TranslatableString shortMsg,
const wxString &  message,
const int  xSize,
const int  ySize 
)
static

Displays cuttable information in a text ctrl, with an OK button.

Mostly we use this so that we have the code for resizability in one place. Other considerations like screen readers are also handled by having the code in one place.

Definition at line 91 of file HelpSystem.cpp.

96 {
97  wxDialogWrapper dlog(parent, wxID_ANY,
98  dlogTitle,
99  wxDefaultPosition, wxDefaultSize,
100  wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxMAXIMIZE_BOX /*| wxDEFAULT_FRAME_STYLE */);
101 
102  dlog.SetName();
103  ShuttleGui S(&dlog, eIsCreating);
104 
105  S.StartVerticalLay(1);
106  {
107  S.AddTitle( shortMsg );
108  S.Style( wxTE_MULTILINE | wxTE_READONLY | wxTE_RICH | wxTE_RICH2 |
109  wxTE_AUTO_URL | wxTE_NOHIDESEL | wxHSCROLL )
110  .AddTextWindow(message);
111 
112  S.SetBorder( 0 );
113  S.StartHorizontalLay(wxALIGN_CENTER_HORIZONTAL, 0);
114  S.AddStandardButtons(eOkButton);
115  S.EndHorizontalLay();
116  }
117  S.EndVerticalLay();
118 
119  // Smallest size is half default size. Seems reasonable.
120  dlog.SetMinSize( wxSize(xSize/2, ySize/2) );
121  dlog.SetSize( wxSize(xSize, ySize) );
122  dlog.Center();
123  dlog.ShowModal();
124 }

References ShuttleGui::AddStandardButtons(), ShuttleGuiBase::AddTextWindow(), ShuttleGuiBase::AddTitle(), eIsCreating, ShuttleGuiBase::EndHorizontalLay(), ShuttleGuiBase::EndVerticalLay(), eOkButton, ShuttleGuiBase::SetBorder(), wxDialogWrapper::SetName(), ShuttleGuiBase::StartHorizontalLay(), ShuttleGuiBase::StartVerticalLay(), and ShuttleGui::Style().

Referenced by ExportMultipleDialog::OnExport().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ HelpHostname

const wxString HelpSystem::HelpHostname = wxT("manual.audacityteam.org")
static

Hostname (domain name including subdomain) of the server on which the online help is available

Definition at line 91 of file HelpSystem.h.

Referenced by ShowHelp(), and AudacityFileConfig::Warn().

◆ HelpServerHomeDir

const wxString HelpSystem::HelpServerHomeDir = wxT("/")
static

URL path on the help server to the root directory of the manual. index and quick_help are here in the on-line release manual. Must both start and end with '/' characters.

Definition at line 96 of file HelpSystem.h.

Referenced by ShowHelp(), and AudacityFileConfig::Warn().

◆ HelpServerManDir

const wxString HelpSystem::HelpServerManDir = wxT("/man/")
static

Path to sub-directory where the manual pages are located. index and quick_help are here only in the alpha manual. Must both start and end with '/' characters.

Definition at line 101 of file HelpSystem.h.

Referenced by ShowHelp().

◆ LocalHelpManDir

const wxString HelpSystem::LocalHelpManDir = wxT("/man/")
static

Sub-directory for local help pages (but not index.html or quick_help.html) Must both start and end with '/' characters.

Definition at line 106 of file HelpSystem.h.

Referenced by ShowHelp().

◆ ReleaseSuffix

const wxString HelpSystem::ReleaseSuffix = wxT(".html")
static

The string which is appended to the development manual page name in order obtain the file name in the local and release web copies of the manual

Definition at line 110 of file HelpSystem.h.

Referenced by ShowHelp().


The documentation for this class was generated from the following files:
BrowserDialog::mpHtml
HtmlWindow * mpHtml
Definition: HelpSystem.h:153
HelpSystem::LocalHelpManDir
static const wxString LocalHelpManDir
Definition: HelpSystem.h:106
HelpSystem::HelpHostname
static const wxString HelpHostname
Definition: HelpSystem.h:91
eIsCreating
@ eIsCreating
Definition: ShuttleGui.h:37
gPrefs
FileConfig * gPrefs
Definition: Prefs.cpp:68
ChoiceSetting::Write
bool Write(const wxString &value)
Definition: Prefs.cpp:272
XO
#define XO(s)
Definition: Internat.h:31
ThemeBase::Bitmap
wxBitmap & Bitmap(int iIndex)
Definition: Theme.cpp:1212
HelpSystem::HelpServerHomeDir
static const wxString HelpServerHomeDir
Definition: HelpSystem.h:96
HelpSystem::ShowHtmlText
static void ShowHtmlText(wxWindow *pParent, const TranslatableString &Title, const wxString &HtmlText, bool bIsFile=false, bool bModal=false)
Definition: HelpSystem.cpp:126
XXO
#define XXO(s)
Definition: Internat.h:44
LinkingHtmlWindow
An HtmlWindow that handles linked clicked - usually the link will go to our own local copy of the man...
Definition: HelpSystem.h:125
HelpSystem::HelpServerManDir
static const wxString HelpServerManDir
Definition: HelpSystem.h:101
wxDialogWrapper::SetName
void SetName(const TranslatableString &title)
Definition: wxPanelWrapper.cpp:76
OpenInDefaultBrowser
void OpenInDefaultBrowser(const wxHtmlLinkInfo &link)
Definition: HelpSystem.cpp:517
wxDialogWrapper
Definition: wxPanelWrapper.h:81
FileNames::HtmlHelpDir
AUDACITY_DLL_API FilePath HtmlHelpDir()
FileConfig::Flush
virtual bool Flush(bool bCurrentOnly=false) wxOVERRIDE
Definition: FileConfig.cpp:153
eOkButton
@ eOkButton
Definition: ShuttleGui.h:594
HelpSystem::ShowHelp
static void ShowHelp(wxWindow *parent, const wxString &localFileName, const wxString &remoteURL, bool bModal=false, bool alwaysDefaultBrowser=false)
Definition: HelpSystem.cpp:238
ChoiceSetting::Default
const EnumValueSymbol & Default() const
Definition: Prefs.cpp:228
GUIManualLocation
ChoiceSetting GUIManualLocation
Definition: GUIPrefs.cpp:131
ComponentInterfaceSymbol::Internal
const wxString & Internal() const
Definition: ComponentInterface.h:89
HelpSystem::ReleaseSuffix
static const wxString ReleaseSuffix
Definition: HelpSystem.h:110
BrowserDialog
Adds some event handling to an HtmlWindow.
Definition: HelpSystem.h:139
theTheme
AUDACITY_DLL_API Theme theTheme
Definition: Theme.cpp:202
TranslatableString::Translation
wxString Translation() const
Definition: TranslatableString.h:79
HelpText
AUDACITY_DLL_API wxString HelpText(const wxString &Key)
safenew
#define safenew
Definition: MemoryX.h:10
ShuttleGui
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI.
Definition: ShuttleGui.h:625