]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/dialogs/dialogs.cpp
fixed typo in the last before one change (UNIV_HDR, not UNIX_HDR)
[wxWidgets.git] / samples / dialogs / dialogs.cpp
index 7296bfa0b8e936d00aa8026444c6e3932dab0ccc..9828815a22147700a3ee9dd5cd0769f017ffd779 100644 (file)
     #include "wx/progdlg.h"
 #endif // wxUSE_PROGRESSDLG
 
     #include "wx/progdlg.h"
 #endif // wxUSE_PROGRESSDLG
 
+#if wxUSE_ABOUTDLG
+    #include "wx/aboutdlg.h"
+
+    // these headers are only needed for custom about dialog
+    #include "wx/statline.h"
+    #include "wx/generic/aboutdlgg.h"
+#endif // wxUSE_ABOUTDLG
+
 #if wxUSE_BUSYINFO
     #include "wx/busyinfo.h"
 #endif // wxUSE_BUSYINFO
 #if wxUSE_BUSYINFO
     #include "wx/busyinfo.h"
 #endif // wxUSE_BUSYINFO
@@ -179,6 +187,13 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_MENU(DIALOGS_PROGRESS,                      MyFrame::ShowProgress)
 #endif // wxUSE_PROGRESSDLG
 
     EVT_MENU(DIALOGS_PROGRESS,                      MyFrame::ShowProgress)
 #endif // wxUSE_PROGRESSDLG
 
+#if wxUSE_ABOUTDLG
+    EVT_MENU(DIALOGS_ABOUTDLG_SIMPLE,               MyFrame::ShowSimpleAboutDialog)
+    EVT_MENU(DIALOGS_ABOUTDLG_FANCY,                MyFrame::ShowFancyAboutDialog)
+    EVT_MENU(DIALOGS_ABOUTDLG_FULL,                 MyFrame::ShowFullAboutDialog)
+    EVT_MENU(DIALOGS_ABOUTDLG_CUSTOM,               MyFrame::ShowCustomAboutDialog)
+#endif // wxUSE_ABOUTDLG
+
 #if wxUSE_BUSYINFO
     EVT_MENU(DIALOGS_BUSYINFO,                      MyFrame::ShowBusyInfo)
 #endif // wxUSE_BUSYINFO
 #if wxUSE_BUSYINFO
     EVT_MENU(DIALOGS_BUSYINFO,                      MyFrame::ShowBusyInfo)
 #endif // wxUSE_BUSYINFO
@@ -234,9 +249,9 @@ bool MyApp::OnInit()
     MyFrame *frame = new MyFrame((wxFrame *) NULL, _T("wxWidgets dialogs example"));
 
     // Make a menubar
     MyFrame *frame = new MyFrame((wxFrame *) NULL, _T("wxWidgets dialogs example"));
 
     // Make a menubar
-    wxMenu *file_menu = new wxMenu;
+    wxMenu *menuDlg = new wxMenu;
 
 
-    file_menu->Append(DIALOGS_MESSAGE_BOX, _T("&Message box\tCtrl-M"));
+    menuDlg->Append(DIALOGS_MESSAGE_BOX, _T("&Message box\tCtrl-M"));
 
 
 #if wxUSE_COLOURDLG || wxUSE_FONTDLG || wxUSE_CHOICEDLG
 
 
 #if wxUSE_COLOURDLG || wxUSE_FONTDLG || wxUSE_CHOICEDLG
@@ -268,7 +283,7 @@ bool MyApp::OnInit()
         choices_menu->Append(DIALOGS_CHOOSE_FONT_GENERIC, _T("Choose &font (generic)"));
     #endif // USE_FONTDLG_GENERIC
 
         choices_menu->Append(DIALOGS_CHOOSE_FONT_GENERIC, _T("Choose &font (generic)"));
     #endif // USE_FONTDLG_GENERIC
 
-    file_menu->Append(wxID_ANY,_T("&Choices and selectors"),choices_menu);
+    menuDlg->Append(wxID_ANY,_T("&Choices and selectors"),choices_menu);
 #endif // wxUSE_COLOURDLG || wxUSE_FONTDLG || wxUSE_CHOICEDLG
 
 
 #endif // wxUSE_COLOURDLG || wxUSE_FONTDLG || wxUSE_CHOICEDLG
 
 
@@ -285,7 +300,7 @@ bool MyApp::OnInit()
         entry_menu->Append(DIALOGS_NUM_ENTRY, _T("&Numeric entry\tCtrl-N"));
     #endif // wxUSE_NUMBERDLG
 
         entry_menu->Append(DIALOGS_NUM_ENTRY, _T("&Numeric entry\tCtrl-N"));
     #endif // wxUSE_NUMBERDLG
 
-    file_menu->Append(wxID_ANY,_T("&Entry dialogs"),entry_menu);
+    menuDlg->Append(wxID_ANY,_T("&Entry dialogs"),entry_menu);
 
 #endif // wxUSE_TEXTDLG || wxUSE_NUMBERDLG
 
 
 #endif // wxUSE_TEXTDLG || wxUSE_NUMBERDLG
 
@@ -305,7 +320,7 @@ bool MyApp::OnInit()
         filedlg_menu->Append(DIALOGS_FILE_SAVE_GENERIC,  _T("Sa&ve file (generic)"));
     #endif // USE_FILEDLG_GENERIC
 
         filedlg_menu->Append(DIALOGS_FILE_SAVE_GENERIC,  _T("Sa&ve file (generic)"));
     #endif // USE_FILEDLG_GENERIC
 
-    file_menu->Append(wxID_ANY,_T("&File operations"),filedlg_menu);
+    menuDlg->Append(wxID_ANY,_T("&File operations"),filedlg_menu);
 
 #endif // wxUSE_FILEDLG
 
 
 #endif // wxUSE_FILEDLG
 
@@ -314,7 +329,7 @@ bool MyApp::OnInit()
 
     dir_menu->Append(DIALOGS_DIR_CHOOSE,  _T("&Choose a directory\tCtrl-D"));
     dir_menu->Append(DIALOGS_DIRNEW_CHOOSE,  _T("Choose a directory (with \"Ne&w\" button)\tShift-Ctrl-D"));
 
     dir_menu->Append(DIALOGS_DIR_CHOOSE,  _T("&Choose a directory\tCtrl-D"));
     dir_menu->Append(DIALOGS_DIRNEW_CHOOSE,  _T("Choose a directory (with \"Ne&w\" button)\tShift-Ctrl-D"));
-    file_menu->Append(wxID_ANY,_T("&Directory operations"),dir_menu);
+    menuDlg->Append(wxID_ANY,_T("&Directory operations"),dir_menu);
 
     #if USE_DIRDLG_GENERIC
         dir_menu->AppendSeparator();
 
     #if USE_DIRDLG_GENERIC
         dir_menu->AppendSeparator();
@@ -344,7 +359,7 @@ bool MyApp::OnInit()
        info_menu->Append(DIALOGS_LOG_DIALOG, _T("&Log dialog\tCtrl-L"));
     #endif // wxUSE_LOG_DIALOG
 
        info_menu->Append(DIALOGS_LOG_DIALOG, _T("&Log dialog\tCtrl-L"));
     #endif // wxUSE_LOG_DIALOG
 
-    file_menu->Append(wxID_ANY,_T("&Informative dialogs"),info_menu);
+    menuDlg->Append(wxID_ANY,_T("&Informative dialogs"),info_menu);
 
 #endif // wxUSE_STARTUP_TIPS || wxUSE_PROGRESSDLG || wxUSE_BUSYINFO || wxUSE_LOG_DIALOG
 
 
 #endif // wxUSE_STARTUP_TIPS || wxUSE_PROGRESSDLG || wxUSE_BUSYINFO || wxUSE_LOG_DIALOG
 
@@ -353,7 +368,7 @@ bool MyApp::OnInit()
     wxMenu *find_menu = new wxMenu;
     find_menu->AppendCheckItem(DIALOGS_FIND, _T("&Find dialog\tCtrl-F"));
     find_menu->AppendCheckItem(DIALOGS_REPLACE, _T("Find and &replace dialog\tShift-Ctrl-F"));
     wxMenu *find_menu = new wxMenu;
     find_menu->AppendCheckItem(DIALOGS_FIND, _T("&Find dialog\tCtrl-F"));
     find_menu->AppendCheckItem(DIALOGS_REPLACE, _T("Find and &replace dialog\tShift-Ctrl-F"));
-    file_menu->Append(wxID_ANY,_T("&Searching"),find_menu);
+    menuDlg->Append(wxID_ANY,_T("&Searching"),find_menu);
 #endif // wxUSE_FINDREPLDLG
 
 #if USE_MODAL_PRESENTATION
 #endif // wxUSE_FINDREPLDLG
 
 #if USE_MODAL_PRESENTATION
@@ -362,7 +377,7 @@ bool MyApp::OnInit()
     dialogs_menu->AppendCheckItem(DIALOGS_MODELESS, _T("Mode&less dialog\tCtrl-Z"));
     dialogs_menu->Append(DIALOGS_CENTRE_SCREEN, _T("Centered on &screen\tShift-Ctrl-1"));
     dialogs_menu->Append(DIALOGS_CENTRE_PARENT, _T("Centered on &parent\tShift-Ctrl-2"));
     dialogs_menu->AppendCheckItem(DIALOGS_MODELESS, _T("Mode&less dialog\tCtrl-Z"));
     dialogs_menu->Append(DIALOGS_CENTRE_SCREEN, _T("Centered on &screen\tShift-Ctrl-1"));
     dialogs_menu->Append(DIALOGS_CENTRE_PARENT, _T("Centered on &parent\tShift-Ctrl-2"));
-    file_menu->Append(wxID_ANY, _T("&Generic dialogs"), dialogs_menu);
+    menuDlg->Append(wxID_ANY, _T("&Generic dialogs"), dialogs_menu);
 #endif // USE_MODAL_PRESENTATION
 
 #if USE_SETTINGS_DIALOG
 #endif // USE_MODAL_PRESENTATION
 
 #if USE_SETTINGS_DIALOG
@@ -377,17 +392,29 @@ bool MyApp::OnInit()
     sheet_menu->Append(DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK, _T("Button &Toolbook sheet\tShift-Ctrl-U"));
 #endif
 */
     sheet_menu->Append(DIALOGS_PROPERTY_SHEET_BUTTONTOOLBOOK, _T("Button &Toolbook sheet\tShift-Ctrl-U"));
 #endif
 */
-    file_menu->Append(wxID_ANY, _T("&Property sheets"), sheet_menu);
+    menuDlg->Append(wxID_ANY, _T("&Property sheets"), sheet_menu);
 #endif // USE_SETTINGS_DIALOG
 
 #endif // USE_SETTINGS_DIALOG
 
-    file_menu->Append(DIALOGS_REQUEST, _T("&Request user attention\tCtrl-R"));
+    menuDlg->Append(DIALOGS_REQUEST, _T("&Request user attention\tCtrl-R"));
+
+    menuDlg->AppendSeparator();
+    menuDlg->Append(wxID_EXIT, _T("E&xit\tAlt-X"));
 
 
-    file_menu->AppendSeparator();
-    file_menu->Append(wxID_EXIT, _T("E&xit\tAlt-X"));
+#if wxUSE_ABOUTDLG
+    wxMenu *menuHelp = new wxMenu;
+    menuHelp->Append(DIALOGS_ABOUTDLG_SIMPLE, _T("&About (simple)...\tF1"));
+    menuHelp->Append(DIALOGS_ABOUTDLG_FANCY, _T("About (&fancy)...\tShift-F1"));
+    menuHelp->Append(DIALOGS_ABOUTDLG_FULL, _T("About (f&ull)...\tCtrl-F1"));
+    menuHelp->Append(DIALOGS_ABOUTDLG_CUSTOM, _T("About (&custom)...\tCtrl-Shift-F1"));
+#endif // wxUSE_ABOUTDLG
 
 
-    wxMenuBar *menu_bar = new wxMenuBar;
-    menu_bar->Append(file_menu, _T("&File"));
-    frame->SetMenuBar(menu_bar);
+    wxMenuBar *menubar = new wxMenuBar;
+    menubar->Append(menuDlg, _T("&Dialogs"));
+#if wxUSE_ABOUTDLG
+    menubar->Append(menuHelp, _T("&Help"));
+#endif // wxUSE_ABOUTDLG
+
+    frame->SetMenuBar(menubar);
 
     myCanvas = new MyCanvas(frame);
     myCanvas->SetBackgroundColour(*wxWHITE);
 
     myCanvas = new MyCanvas(frame);
     myCanvas->SetBackgroundColour(*wxWHITE);
@@ -1043,33 +1070,7 @@ void MyFrame::OnExit(wxCommandEvent& WXUNUSED(event) )
 
 void MyFrame::ShowProgress( wxCommandEvent& WXUNUSED(event) )
 {
 
 void MyFrame::ShowProgress( wxCommandEvent& WXUNUSED(event) )
 {
-    #if wxUSE_STOPWATCH && wxUSE_LONGLONG
-    // check the performance
-    int countrandomnumbers = 0, count = 0;
-    wxTimeSpan tsTest(0,0,0,250);
-    wxDateTime DT2, DT1 = wxDateTime::UNow();
-    srand(0);
-    while(1)
-    {
-        rand();
-        ++countrandomnumbers;
-        if ( countrandomnumbers == 1000 )
-        {
-            srand(0);
-            countrandomnumbers = 0;
-            ++count;
-            DT2 = wxDateTime::UNow();
-            wxTimeSpan ts = DT2.Subtract( DT1 );
-            if ( ts.IsLongerThan( tsTest ) )
-            {
-                break;
-            }
-        }
-    }
-    const int max = 40 * count;
-    #else
-    static const int max = 10;
-    #endif // wxUSE_STOPWATCH && wxUSE_LONGLONG
+    static const int max = 100;
 
     wxProgressDialog dialog(_T("Progress dialog example"),
                             _T("An informative message"),
 
     wxProgressDialog dialog(_T("Progress dialog example"),
                             _T("An informative message"),
@@ -1081,53 +1082,48 @@ void MyFrame::ShowProgress( wxCommandEvent& WXUNUSED(event) )
                             // wxPD_AUTO_HIDE | -- try this as well
                             wxPD_ELAPSED_TIME |
                             wxPD_ESTIMATED_TIME |
                             // wxPD_AUTO_HIDE | -- try this as well
                             wxPD_ELAPSED_TIME |
                             wxPD_ESTIMATED_TIME |
-                            wxPD_REMAINING_TIME |
-                            wxPD_SMOOTH);
+                            wxPD_REMAINING_TIME
+                            | wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small
+                            );
 
     bool cont = true;
 
     bool cont = true;
-    bool skip = false;
-    // each skip will move progress about quarter forward
-    for ( int i = 0; i <= max; i = wxMin(i+(skip?int(max/4):1), max+1), skip = false )
+    for ( int i = 0; i <= max; i++ )
     {
     {
-        #if wxUSE_STOPWATCH && wxUSE_LONGLONG
-        // do (almost) the same operations as we did for the performance test
-        srand(0);
-        for ( int j = 0; j < 1000; j++ )
-        {
-            rand();
-            if ( j == 999 )
-            {
-                DT2 = wxDateTime::UNow();
-                wxTimeSpan ts = DT2.Subtract( DT1 );
-                if ( ts.IsLongerThan( tsTest ) )
-                {
-                    // nothing to do
-                }
-            }
-        }
-        #else
-        wxSleep(1);
-        #endif
+        wxMilliSleep(200);
 
         wxString msg;
 
 
         wxString msg;
 
+        // test both modes of wxProgressDialog behaviour: start in
+        // indeterminate mode but switch to the determinate one later
+        const bool determinate = i > max/2;
+
         if ( i == max )
         {
             msg = _T("That's all, folks!");
         }
         if ( i == max )
         {
             msg = _T("That's all, folks!");
         }
-        else if ( i > max / 2 )
+        else if ( !determinate )
+        {
+            msg = _T("Testing indeterminate mode");
+        }
+        else if ( determinate )
         {
         {
-            msg = _T("Only a half left (very long message)!");
+            msg = _T("Now in standard determinate mode");
         }
 
         }
 
-#if wxUSE_STOPWATCH && wxUSE_LONGLONG
-        if ( (i % (max/100)) == 0 ) // // only 100 updates, this makes it much faster
+        // will be set to true if "Skip" button was pressed
+        bool skip = false;
+        if ( determinate )
         {
             cont = dialog.Update(i, msg, &skip);
         }
         {
             cont = dialog.Update(i, msg, &skip);
         }
-#else
-        cont = dialog.Update(i, msg, &skip);
-#endif
+        else
+        {
+            cont = dialog.Pulse(msg, &skip);
+        }
+
+        // each skip will move progress about quarter forward
+        if ( skip )
+            i += max/4;
 
         if ( !cont )
         {
 
         if ( !cont )
         {
@@ -1153,6 +1149,110 @@ void MyFrame::ShowProgress( wxCommandEvent& WXUNUSED(event) )
 
 #endif // wxUSE_PROGRESSDLG
 
 
 #endif // wxUSE_PROGRESSDLG
 
+#if wxUSE_ABOUTDLG
+
+static void InitAboutInfoMinimal(wxAboutDialogInfo& info)
+{
+    info.SetName(_T("Dialogs Sample"));
+    info.SetVersion(wxVERSION_NUM_DOT_STRING_T);
+    info.SetDescription(_T("This sample shows different wxWidgets dialogs"));
+    info.SetCopyright(_T("(C) 1998-2006 wxWidgets dev team"));
+    info.AddDeveloper(_T("Vadim Zeitlin"));
+}
+
+static void InitAboutInfoWebsite(wxAboutDialogInfo& info)
+{
+    InitAboutInfoMinimal(info);
+
+    info.SetWebSite(_T("http://www.wxwidgets.org/"), _T("wxWidgets web site"));
+}
+
+static void InitAboutInfoAll(wxAboutDialogInfo& info)
+{
+    InitAboutInfoMinimal(info);
+
+    // we can add a second developer
+    info.AddDeveloper(_T("A.N. Other"));
+
+    // or we can add several persons at once like this
+    static const wxChar *docwriters[] =
+    {
+        _T("First D. Writer"),
+        _T("Second One"),
+    };
+
+    info.SetDocWriters(wxArrayString(WXSIZEOF(docwriters), docwriters));
+    info.SetLicence(wxString::FromAscii(
+"                wxWindows Library Licence, Version 3.1\n"
+"                ======================================\n"
+"\n"
+"  Copyright (c) 1998-2005 Julian Smart, Robert Roebling et al\n"
+"\n"
+"  Everyone is permitted to copy and distribute verbatim copies\n"
+"  of this licence document, but changing it is not allowed.\n"
+"\n"
+"                       WXWINDOWS LIBRARY LICENCE\n"
+"     TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n"
+"\n"
+"                    ...and so on and so forth...\n"
+    ));
+
+    info.AddTranslator(_T("Wun Ngo Wen (Martian)"));
+}
+
+void MyFrame::ShowSimpleAboutDialog(wxCommandEvent& WXUNUSED(event))
+{
+    wxAboutDialogInfo info;
+    InitAboutInfoMinimal(info);
+
+    wxAboutBox(info);
+}
+
+void MyFrame::ShowFancyAboutDialog(wxCommandEvent& WXUNUSED(event))
+{
+    wxAboutDialogInfo info;
+    InitAboutInfoWebsite(info);
+
+    wxAboutBox(info);
+}
+
+void MyFrame::ShowFullAboutDialog(wxCommandEvent& WXUNUSED(event))
+{
+    wxAboutDialogInfo info;
+    InitAboutInfoAll(info);
+
+    wxAboutBox(info);
+}
+
+// a trivial example of a custom dialog class
+class MyAboutDialog : public wxGenericAboutDialog
+{
+public:
+    MyAboutDialog(const wxAboutDialogInfo& info)
+    {
+        Create(info);
+    }
+
+    // add some custom controls
+    virtual void DoAddCustomControls()
+    {
+        AddControl(new wxStaticLine(this), wxSizerFlags().Expand());
+        AddText(_T("Some custom text"));
+        AddControl(new wxStaticLine(this), wxSizerFlags().Expand());
+    }
+};
+
+void MyFrame::ShowCustomAboutDialog(wxCommandEvent& WXUNUSED(event))
+{
+    wxAboutDialogInfo info;
+    InitAboutInfoAll(info);
+
+    MyAboutDialog dlg(info);
+    dlg.ShowModal();
+}
+
+#endif // wxUSE_ABOUTDLG
+
 #if wxUSE_BUSYINFO
 
 void MyFrame::ShowBusyInfo(wxCommandEvent& WXUNUSED(event))
 #if wxUSE_BUSYINFO
 
 void MyFrame::ShowBusyInfo(wxCommandEvent& WXUNUSED(event))