+void WidgetsFrame::OnAutoCompleteDirectories(wxCommandEvent& WXUNUSED(event))
+{
+ wxTextEntryBase *entry = CurrentPage()->GetTextEntry();
+ wxCHECK_RET( entry, "menu item should be disabled" );
+
+ if ( entry->AutoCompleteDirectories() )
+ {
+ wxLogMessage("Enabled auto completion of directories.");
+ }
+ else
+ {
+ wxLogMessage("AutoCompleteDirectories() failed.");
+ }
+}
+
+void WidgetsFrame::OnAutoCompleteCustom(wxCommandEvent& WXUNUSED(event))
+{
+ wxTextEntryBase *entry = CurrentPage()->GetTextEntry();
+ wxCHECK_RET( entry, "menu item should be disabled" );
+
+ // This is a simple (and hence rather useless) example of a custom
+ // completer class that completes the first word (only) initially and only
+ // build the list of the possible second words once the first word is
+ // known. This allows to avoid building the full 676000 item list of
+ // possible strings all at once as the we have 1000 possibilities for the
+ // first word (000..999) and 676 (aa..zz) for the second one.
+ class CustomTextCompleter : public wxTextCompleterSimple
+ {
+ public:
+ virtual void GetCompletions(const wxString& prefix, wxArrayString& res)
+ {
+ // This is used for illustrative purposes only and shows how many
+ // completions we return every time when we're called.
+ class LogCompletions
+ {
+ public:
+ LogCompletions(const wxString& prefix, const wxArrayString& res)
+ : m_prefix(prefix),
+ m_res(res)
+ {
+ }
+
+ ~LogCompletions()
+ {
+ wxLogMessage("Returning %lu possible completions for "
+ "prefix \"%s\"",
+ m_res.size(), m_prefix);
+ }
+
+ private:
+ const wxString& m_prefix;
+ const wxArrayString& m_res;
+ } logCompletions(prefix, res);
+
+
+ // Normally it doesn't make sense to complete empty control, there
+ // are too many choices and listing them all wouldn't be helpful.
+ if ( prefix.empty() )
+ return;
+
+ // The only valid strings start with 3 digits so check for their
+ // presence proposing to complete the remaining ones.
+ if ( !wxIsdigit(prefix[0]) )
+ return;
+
+ if ( prefix.length() == 1 )
+ {
+ for ( int i = 0; i < 10; i++ )
+ for ( int j = 0; j < 10; j++ )
+ res.push_back(wxString::Format("%s%02d",
+ prefix, 10*i + j));
+ return;
+ }
+ else if ( !wxIsdigit(prefix[1]) )
+ return;
+
+ if ( prefix.length() == 2 )
+ {
+ for ( int i = 0; i < 10; i++ )
+ res.push_back(wxString::Format("%s%d", prefix, i));
+ return;
+ }
+ else if ( !wxIsdigit(prefix[2]) )
+ return;
+
+ // Next we must have a space and two letters.
+ wxString prefix2(prefix);
+ if ( prefix.length() == 3 )
+ prefix2 += ' ';
+ else if ( prefix[3] != ' ' )
+ return;
+
+ if ( prefix2.length() == 4 )
+ {
+ for ( char c = 'a'; c <= 'z'; c++ )
+ for ( char d = 'a'; d <= 'z'; d++ )
+ res.push_back(wxString::Format("%s%c%c", prefix2, c, d));
+ return;
+ }
+ else if ( !wxIslower(prefix[4]) )
+ return;
+
+ if ( prefix.length() == 5 )
+ {
+ for ( char c = 'a'; c <= 'z'; c++ )
+ res.push_back(prefix + c);
+ }
+ }
+ };
+
+ if ( entry->AutoComplete(new CustomTextCompleter) )
+ {
+ wxLogMessage("Enabled custom auto completer for \"NNN XX\" items "
+ "(where N is a digit and X is a letter).");
+ }
+ else
+ {
+ wxLogMessage("AutoComplete() failed.");
+ }
+}
+