From a294c6d53ed8be5b92c31e1eb7e3366ba1642fa7 Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Mon, 24 Jan 2000 18:26:54 +0000
Subject: [PATCH] added wxGetPasswordFromUser(), dialogs sample shows it,
 documented it

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5639 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/changes.txt              |  2 ++
 docs/latex/wx/function.tex    | 13 ++++++++
 docs/latex/wx/textdlg.tex     |  4 ++-
 include/wx/generic/textdlgg.h | 18 ++++++++---
 samples/dialogs/dialogs.cpp   | 57 +++++++++++++++++++++++------------
 samples/dialogs/dialogs.h     | 33 +++++++++++---------
 src/generic/textdlgg.cpp      |  4 ++-
 7 files changed, 92 insertions(+), 39 deletions(-)

diff --git a/docs/changes.txt b/docs/changes.txt
index c955171a8a..02ad05fa76 100644
--- a/docs/changes.txt
+++ b/docs/changes.txt
@@ -48,6 +48,8 @@ all (GUI):
 - TIFF support added (libtiff required and included in the distribution)
 - PCX files can now be written (24 bit only so far)
 
+- wxTextEntryDialog may be used for entering passwords (supports wxTE_PASSWORD)
+
 wxMSW:
 
 - support for enhanced metafiles added, support for copying/pasting metafiles
diff --git a/docs/latex/wx/function.tex b/docs/latex/wx/function.tex
index 507e0339f3..4ec3c25aec 100644
--- a/docs/latex/wx/function.tex
+++ b/docs/latex/wx/function.tex
@@ -609,6 +609,19 @@ Dialog is centered on its {\it parent} unless an explicit position is given in
 
 <wx/textdlg.h>
 
+\membersection{::wxGetPasswordFromUser}\label{wxgetpasswordfromuser}
+
+\func{wxString}{wxGetTextFromUser}{\param{const wxString\& }{message}, \param{const wxString\& }{caption = ``Input text"},\\
+ \param{const wxString\& }{default\_value = ``"}, \param{wxWindow *}{parent = NULL}}
+
+Similar to \helpref{wxGetTextFromUser}{wxgettextfromuser} but the text entered
+in the dialog is not shown on screen but replaced with stars. This is intended
+to be used for entering passwords as the function name implies.
+
+\wxheading{Include files}
+
+<wx/textdlg.h>
+
 \membersection{::wxGetTextFromUser}\label{wxgettextfromuser}
 
 \func{wxString}{wxGetTextFromUser}{\param{const wxString\& }{message}, \param{const wxString\& }{caption = ``Input text"},\\
diff --git a/docs/latex/wx/textdlg.tex b/docs/latex/wx/textdlg.tex
index ef13e0b1d5..2cd79bfc80 100644
--- a/docs/latex/wx/textdlg.tex
+++ b/docs/latex/wx/textdlg.tex
@@ -35,7 +35,9 @@ Constructor. Use \helpref{wxTextEntryDialog::ShowModal}{wxtextentrydialogshowmod
 
 \docparam{defaultValue}{The default value, which may be the empty string.}
 
-\docparam{style}{A dialog style, specifying the buttons (wxOK, wxCANCEL) and an optional wxCENTRE style.}
+\docparam{style}{A dialog style, specifying the buttons (wxOK, wxCANCEL)
+and an optional wxCENTRE style. Additionally, wxTextCtrl styles (such as
+{\tt wxTE\_PASSWORD} may be specified here.}
 
 \docparam{pos}{Dialog position.}
 
diff --git a/include/wx/generic/textdlgg.h b/include/wx/generic/textdlgg.h
index 61b9117583..7f6cb35a2c 100644
--- a/include/wx/generic/textdlgg.h
+++ b/include/wx/generic/textdlgg.h
@@ -22,20 +22,23 @@
 
 class WXDLLEXPORT wxTextCtrl;
 
-// Handy dialog functions (will be converted into classes at some point)
 WXDLLEXPORT_DATA(extern const wxChar*) wxGetTextFromUserPromptStr;
 WXDLLEXPORT_DATA(extern const wxChar*) wxEmptyString;
 
+#define wxTextEntryDialogStyle (wxOK | wxCANCEL | wxCENTRE)
+
+// ----------------------------------------------------------------------------
+// wxTextEntryDialog: a dialog with text control, [ok] and [cancel] buttons
+// ----------------------------------------------------------------------------
+
 class WXDLLEXPORT wxTextEntryDialog : public wxDialog
 {
-    DECLARE_DYNAMIC_CLASS(wxTextEntryDialog)
-
 public:
     wxTextEntryDialog(wxWindow *parent,
                       const wxString& message,
                       const wxString& caption = wxGetTextFromUserPromptStr,
                       const wxString& value = wxEmptyString,
-                      long style = wxOK | wxCANCEL | wxCENTRE,
+                      long style = wxTextEntryDialogStyle,
                       const wxPoint& pos = wxDefaultPosition);
 
     void SetValue(const wxString& val) { m_value = val; }
@@ -51,6 +54,7 @@ protected:
 
 private:
     DECLARE_EVENT_TABLE()
+    DECLARE_DYNAMIC_CLASS(wxTextEntryDialog)
 };
 
 // ----------------------------------------------------------------------------
@@ -66,5 +70,11 @@ wxGetTextFromUser(const wxString& message,
                   int y = -1,
                   bool centre = TRUE);
 
+wxString WXDLLEXPORT
+wxGetPasswordFromUser(const wxString& message,
+                      const wxString& caption = wxGetTextFromUserPromptStr,
+                      const wxString& default_value = wxEmptyString,
+                      wxWindow *parent = (wxWindow *) NULL);
+
 #endif
     // __TEXTDLGH_G__
diff --git a/samples/dialogs/dialogs.cpp b/samples/dialogs/dialogs.cpp
index 59873ce715..c54c263b5f 100644
--- a/samples/dialogs/dialogs.cpp
+++ b/samples/dialogs/dialogs.cpp
@@ -78,13 +78,14 @@ bool MyApp::OnInit(void)
   file_menu->Append(DIALOGS_LOG_DIALOG, "&Log dialog\tCtrl-L");
   file_menu->Append(DIALOGS_MESSAGE_BOX, "&Message box\tCtrl-M");
   file_menu->Append(DIALOGS_TEXT_ENTRY,  "Text &entry\tCtrl-E");
+  file_menu->Append(DIALOGS_PASSWORD_ENTRY,  "&Password entry\tCtrl-P");
   file_menu->Append(DIALOGS_NUM_ENTRY, "&Numeric entry\tCtrl-N");
   file_menu->Append(DIALOGS_SINGLE_CHOICE,  "&Single choice\tCtrl-S");
   file_menu->AppendSeparator();
   file_menu->Append(DIALOGS_TIP,  "&Tip of the day\tCtrl-T");
   file_menu->AppendSeparator();
   file_menu->Append(DIALOGS_FILE_OPEN,  "&Open file\tCtrl-O");
-  file_menu->Append(DIALOGS_FILES_OPEN,  "&Open files\tCtrl-Q");
+  file_menu->Append(DIALOGS_FILES_OPEN,  "Open &files\tCtrl-Q");
   file_menu->Append(DIALOGS_FILE_SAVE,  "Sa&ve file");
   file_menu->Append(DIALOGS_DIR_CHOOSE,  "&Choose a directory\tCtrl-D");
   file_menu->AppendSeparator();
@@ -233,10 +234,27 @@ void MyFrame::NumericEntry(wxCommandEvent& WXUNUSED(event) )
     wxMessageBox(msg, "Numeric test result", wxOK | icon, this);
 }
 
-void MyFrame::TextEntry(wxCommandEvent& WXUNUSED(event) )
+void MyFrame::PasswordEntry(wxCommandEvent& WXUNUSED(event))
 {
-  wxTextEntryDialog dialog(this, "This is a small sample\nA long, long string to test out the text entrybox",
-      "Please enter a string", "Default value", wxOK|wxCANCEL);
+    wxString pwd = wxGetPasswordFromUser("Enter password:",
+                                         "Passowrd entry dialog",
+                                         "",
+                                         this);
+    if ( !!pwd )
+    {
+        wxMessageBox(wxString::Format("Your password is '%s'", pwd.c_str()),
+                     "Got password", wxOK | wxICON_INFORMATION, this);
+    }
+}
+
+void MyFrame::TextEntry(wxCommandEvent& WXUNUSED(event))
+{
+  wxTextEntryDialog dialog(this,
+                           "This is a small sample\n"
+                           "A long, long string to test out the text entrybox",
+                           "Please enter a string",
+                           "Default value",
+                           wxOK | wxCANCEL);
 
   if (dialog.ShowModal() == wxID_OK)
   {
@@ -386,22 +404,23 @@ BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
 END_EVENT_TABLE()
 
 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
-    EVT_MENU(DIALOGS_CHOOSE_COLOUR,                MyFrame::ChooseColour)
-    EVT_MENU(DIALOGS_CHOOSE_FONT,                MyFrame::ChooseFont)
-    EVT_MENU(DIALOGS_LOG_DIALOG,                MyFrame::LogDialog)
-    EVT_MENU(DIALOGS_MESSAGE_BOX,                MyFrame::MessageBox)
-    EVT_MENU(DIALOGS_TEXT_ENTRY,                MyFrame::TextEntry)
-    EVT_MENU(DIALOGS_NUM_ENTRY,                MyFrame::NumericEntry)
-    EVT_MENU(DIALOGS_SINGLE_CHOICE,                MyFrame::SingleChoice)
-    EVT_MENU(DIALOGS_FILE_OPEN,                    MyFrame::FileOpen)
-    EVT_MENU(DIALOGS_FILES_OPEN,                   MyFrame::FilesOpen)
-    EVT_MENU(DIALOGS_FILE_SAVE,                    MyFrame::FileSave)
-    EVT_MENU(DIALOGS_DIR_CHOOSE,                MyFrame::DirChoose)
-    EVT_MENU(DIALOGS_TIP,                        MyFrame::ShowTip)
+    EVT_MENU(DIALOGS_CHOOSE_COLOUR,                 MyFrame::ChooseColour)
+    EVT_MENU(DIALOGS_CHOOSE_FONT,                   MyFrame::ChooseFont)
+    EVT_MENU(DIALOGS_LOG_DIALOG,                    MyFrame::LogDialog)
+    EVT_MENU(DIALOGS_MESSAGE_BOX,                   MyFrame::MessageBox)
+    EVT_MENU(DIALOGS_TEXT_ENTRY,                    MyFrame::TextEntry)
+    EVT_MENU(DIALOGS_PASSWORD_ENTRY,                MyFrame::PasswordEntry)
+    EVT_MENU(DIALOGS_NUM_ENTRY,                     MyFrame::NumericEntry)
+    EVT_MENU(DIALOGS_SINGLE_CHOICE,                 MyFrame::SingleChoice)
+    EVT_MENU(DIALOGS_FILE_OPEN,                     MyFrame::FileOpen)
+    EVT_MENU(DIALOGS_FILES_OPEN,                    MyFrame::FilesOpen)
+    EVT_MENU(DIALOGS_FILE_SAVE,                     MyFrame::FileSave)
+    EVT_MENU(DIALOGS_DIR_CHOOSE,                    MyFrame::DirChoose)
+    EVT_MENU(DIALOGS_TIP,                           MyFrame::ShowTip)
 #if defined(__WXMSW__) && wxTEST_GENERIC_DIALOGS_IN_MSW
-    EVT_MENU(DIALOGS_CHOOSE_COLOUR_GENERIC,        MyFrame::ChooseColourGeneric)
-    EVT_MENU(DIALOGS_CHOOSE_FONT_GENERIC,        MyFrame::ChooseFontGeneric)
+    EVT_MENU(DIALOGS_CHOOSE_COLOUR_GENERIC,         MyFrame::ChooseColourGeneric)
+    EVT_MENU(DIALOGS_CHOOSE_FONT_GENERIC,           MyFrame::ChooseFontGeneric)
 #endif
-    EVT_MENU(wxID_EXIT,                            MyFrame::OnExit)
+    EVT_MENU(wxID_EXIT,                             MyFrame::OnExit)
 END_EVENT_TABLE()
 
diff --git a/samples/dialogs/dialogs.h b/samples/dialogs/dialogs.h
index c1173e38df..5992fcf63b 100644
--- a/samples/dialogs/dialogs.h
+++ b/samples/dialogs/dialogs.h
@@ -35,6 +35,7 @@ public:
     void MessageBox(wxCommandEvent& event);
     void SingleChoice(wxCommandEvent& event);
     void TextEntry(wxCommandEvent& event);
+    void PasswordEntry(wxCommandEvent& event);
     void NumericEntry(wxCommandEvent& event);
     void FileOpen(wxCommandEvent& event);
     void FilesOpen(wxCommandEvent& event);
@@ -64,20 +65,24 @@ public:
 
 
 // Menu IDs
-#define DIALOGS_CHOOSE_COLOUR               1
-#define DIALOGS_CHOOSE_COLOUR_GENERIC       2
-#define DIALOGS_CHOOSE_FONT                 3
-#define DIALOGS_CHOOSE_FONT_GENERIC         4
-#define DIALOGS_MESSAGE_BOX                 5
-#define DIALOGS_SINGLE_CHOICE               6
-#define DIALOGS_TEXT_ENTRY                  7
-#define DIALOGS_FILE_OPEN                   8
-#define DIALOGS_FILES_OPEN                  9
-#define DIALOGS_FILE_SAVE                   10
-#define DIALOGS_DIR_CHOOSE                  11
-#define DIALOGS_TIP                         12
-#define DIALOGS_NUM_ENTRY                   13
-#define DIALOGS_LOG_DIALOG                  14
+enum
+{
+    DIALOGS_CHOOSE_COLOUR = 1,
+    DIALOGS_CHOOSE_COLOUR_GENERIC,
+    DIALOGS_CHOOSE_FONT,
+    DIALOGS_CHOOSE_FONT_GENERIC,
+    DIALOGS_MESSAGE_BOX,
+    DIALOGS_SINGLE_CHOICE,
+    DIALOGS_TEXT_ENTRY,
+    DIALOGS_PASSWORD_ENTRY,
+    DIALOGS_FILE_OPEN,
+    DIALOGS_FILES_OPEN,
+    DIALOGS_FILE_SAVE,
+    DIALOGS_DIR_CHOOSE,
+    DIALOGS_TIP,
+    DIALOGS_NUM_ENTRY,
+    DIALOGS_LOG_DIALOG
+};
 
 #endif
 
diff --git a/src/generic/textdlgg.cpp b/src/generic/textdlgg.cpp
index e5e86c96e1..d34210a7c9 100644
--- a/src/generic/textdlgg.cpp
+++ b/src/generic/textdlgg.cpp
@@ -87,7 +87,9 @@ wxTextEntryDialog::wxTextEntryDialog(wxWindow *parent,
     topsizer->Add( CreateTextSizer( message ), 0, wxALL, 10 );
 
     // 2) text ctrl
-    m_textctrl = new wxTextCtrl(this, wxID_TEXT, value, wxDefaultPosition, wxSize(300, -1));
+    m_textctrl = new wxTextCtrl(this, wxID_TEXT, value,
+                                wxDefaultPosition, wxSize(300, -1),
+                                style & ~wxTextEntryDialogStyle);
     topsizer->Add( m_textctrl, 1, wxEXPAND | wxLEFT|wxRIGHT, 15 );
 
 #if wxUSE_STATLINE
-- 
2.50.0

