1. added wxGetNumberFromUser (to textdlgg.cpp and dialogs sample)

2. wxTE_RICH style added to wxMSW, the text controls don't use RICHEDIT
   class by default any more
3. wxRadioBox doesn't generate button events any more (grrr...)
4. commented out code in log.cpp restored and a bug corrected


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3088 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 1999-07-22 23:39:47 +00:00
parent 953704c1c7
commit c49245f8ba
15 changed files with 302 additions and 112 deletions

View File

@ -472,6 +472,33 @@ if (s)
<wx/filedlg.h>
\membersection{::wxGetNumberFromUser}\label{wxgetnumberfromuser}
\func{long}{wxGetNumberFromUser}{
\param{const wxString\& }{message},
\param{const wxString\& }{prompt},
\param{const wxString\& }{caption},
\param{long }{value},
\param{long }{min = 0},
\param{long }{max = 100},
\param{wxWindow *}{parent = NULL},
\param{const wxPoint\& }{pos = wxDefaultPosition}}
Shows a dialog asking the user for numeric input. The dialogs title is set to
{\it caption}, it contains a (possibly) multiline {\it message} above the
single line {\it prompt} and the zone for entering the number.
The number entered must be in the range {\it min}..{\it max} (both of which
should be positive) and {\it value} is the initial value of it. If the user
enters an invalid value or cancels the dialog, the function will return -1.
Dialog is centered on its {\it parent} unless an explicit position is given in
{\it pos}.
\wxheading{Include files}
<wx/textdlg.h>
\membersection{::wxGetTextFromUser}\label{wxgettextfromuser}
\func{wxString}{wxGetTextFromUser}{\param{const wxString\& }{message}, \param{const wxString\& }{caption = ``Input text"},\\

View File

@ -59,6 +59,7 @@ wx_include_HEADERS = \
event.h \
expr.h \
extdlg.h \
ffile.h \
file.h \
fileconf.h \
filedlg.h \

View File

@ -693,6 +693,9 @@ enum
#define wxTE_READONLY 0x0010
#define wxTE_MULTILINE 0x0020
#define wxTE_PROCESS_TAB 0x0040
// this style means to use RICHEDIT control and does something only under wxMSW
// and Win32 and is silently ignored under all other platforms
#define wxTE_RICH 0x0080
/*
* wxComboBox style flags

View File

@ -52,6 +52,10 @@ private:
DECLARE_EVENT_TABLE()
};
// ----------------------------------------------------------------------------
// functions to get a string or a number from user
// ----------------------------------------------------------------------------
wxString WXDLLEXPORT
wxGetTextFromUser(const wxString& message,
const wxString& caption = wxGetTextFromUserPromptStr,
@ -61,5 +65,15 @@ wxGetTextFromUser(const wxString& message,
int y = -1,
bool centre = TRUE);
long WXDLLEXPORT
wxGetNumberFromUser(const wxString& message,
const wxString& prompt,
const wxString& caption,
long value = 0,
long min = 0,
long max = 100,
wxWindow *parent = (wxWindow *)NULL,
const wxPoint& pos = wxDefaultPosition);
#endif
// __TEXTDLGH_G__

View File

@ -6,21 +6,20 @@
// Created: 01/02/97
// RCS-ID: $Id$
// Copyright: (c) Julian Smart
// Licence: wxWindows licence
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_RADIOBOX_H_
#define _WX_RADIOBOX_H_
#ifdef __GNUG__
#pragma interface "radiobox.h"
#pragma interface "radiobox.h"
#endif
#include "wx/control.h"
WXDLLEXPORT_DATA(extern const wxChar*) wxRadioBoxNameStr;
// List box item
class WXDLLEXPORT wxBitmap;
class WXDLLEXPORT wxRadioBox : public wxControl
@ -30,13 +29,6 @@ class WXDLLEXPORT wxRadioBox : public wxControl
public:
wxRadioBox();
#if WXWIN_COMPATIBILITY
wxRadioBox(wxWindow *parent, wxFunction func, const char *title,
int x = -1, int y = -1, int width = -1, int height = -1,
int n = 0, char **choices = NULL,
int majorDim = 0, long style = wxRA_HORIZONTAL, const char *name = wxRadioBoxNameStr);
#endif // WXWIN_COMPATIBILITY
wxRadioBox(wxWindow *parent, wxWindowID id, const wxString& title,
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
int n = 0, const wxString choices[] = NULL,
@ -85,16 +77,23 @@ public:
int GetNumberOfRowsOrCols() const { return m_noRowsOrCols; }
void SetNumberOfRowsOrCols(int n) { m_noRowsOrCols = n; }
// Implementation
// implementation only from now on
// -------------------------------
WXHWND *GetRadioButtons() const { return m_radioButtons; }
bool ContainsHWND(WXHWND hWnd) const;
void SendNotificationEvent();
long MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
// get the number of buttons per column/row
inline int GetNumVer() const;
inline int GetNumHor() const;
int GetNumVer() const;
int GetNumHor() const;
#if WXWIN_COMPATIBILITY
wxRadioBox(wxWindow *parent, wxFunction func, const char *title,
int x = -1, int y = -1, int width = -1, int height = -1,
int n = 0, char **choices = NULL,
int majorDim = 0, long style = wxRA_HORIZONTAL, const char *name = wxRadioBoxNameStr);
#endif // WXWIN_COMPATIBILITY
protected:
void SubclassRadioButton(WXHWND hWndBtn);

View File

@ -29,21 +29,21 @@ public:
wxStaticBox() { }
wxStaticBox(wxWindow *parent, wxWindowID id,
const wxString& label,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxString& name = wxStaticBoxNameStr)
const wxString& label,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxString& name = wxStaticBoxNameStr)
{
Create(parent, id, label, pos, size, style, name);
}
bool Create(wxWindow *parent, wxWindowID id,
const wxString& label,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxString& name = wxStaticBoxNameStr);
const wxString& label,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxString& name = wxStaticBoxNameStr);
// implementation from now on
// --------------------------
@ -59,9 +59,6 @@ public:
virtual bool AcceptsFocus() const { return FALSE; }
protected:
virtual void DoSetSize(int x, int y,
int width, int height,
int sizeFlags = wxSIZE_AUTO);
virtual wxSize DoGetBestSize();
private:

View File

@ -44,14 +44,18 @@ wxResizeableDialog DIALOG DISCARDABLE 34, 22, 144, 75
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION ""
BEGIN
LTEXT "", -1,-2,-2,1,1 //necessary for __WATCOMC__
#ifdef __WATCOMC__
LTEXT "", -1,-2,-2,1,1
#endif
END
wxCaptionDialog DIALOG DISCARDABLE 34, 22, 144, 75
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
STYLE DS_MODALFRAME | WS_CAPTION | WS_POPUP | WS_SYSMENU
CAPTION "Dummy dialog"
BEGIN
LTEXT "", -1,-2,-2,1,1 //necessary for __WATCOMC__
#ifdef __WATCOMC__
LTEXT "", -1,-2,-2,1,1
#endif
END
//
@ -60,7 +64,9 @@ END
wxNoCaptionDialog DIALOG 34, 22, 144, 75
STYLE WS_POPUP
BEGIN
LTEXT "", -1,-2,-2,1,1 //necessary for __WATCOMC__
#ifdef __WATCOMC__
LTEXT "", -1,-2,-2,1,1
#endif
END
//////////////////////////////////////////////////////////////////////////////

View File

@ -78,6 +78,7 @@ bool MyApp::OnInit(void)
file_menu->AppendSeparator();
file_menu->Append(DIALOGS_MESSAGE_BOX, "&Message box");
file_menu->Append(DIALOGS_TEXT_ENTRY, "Text &entry");
file_menu->Append(DIALOGS_NUM_ENTRY, "&Numeric entry\tCtrl-N");
file_menu->Append(DIALOGS_SINGLE_CHOICE, "&Single choice");
file_menu->Append(DIALOGS_EXT_DIALOG, "&Extended dialog");
file_menu->AppendSeparator();
@ -237,6 +238,27 @@ void MyFrame::MessageBox(wxCommandEvent& WXUNUSED(event) )
dialog.ShowModal();
}
void MyFrame::NumericEntry(wxCommandEvent& WXUNUSED(event) )
{
long res = wxGetNumberFromUser("", "Enter a number:", "Numeric input test",
50, 0, 100, this);
wxString msg;
int icon;
if ( res == -1 )
{
msg = "Invalid number entered or dialog cancelled.";
icon = wxICON_HAND;
}
else
{
msg.Printf("You've entered %lu", res);
icon = wxICON_INFORMATION;
}
wxMessageBox(msg, "Numeric test result", wxOK | icon, this);
}
void MyFrame::TextEntry(wxCommandEvent& WXUNUSED(event) )
{
wxTextEntryDialog dialog(this, "This is a small sample\nA long, long string to test out the text entrybox",
@ -362,6 +384,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(DIALOGS_CHOOSE_FONT, MyFrame::ChooseFont)
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_FILE_SAVE, MyFrame::FileSave)

View File

@ -6,7 +6,7 @@
// Created: 04/01/98
// RCS-ID: $Id$
// Copyright: (c) Julian Smart and Markus Holzem
// Licence: wxWindows license
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#ifndef __DIALOGSH__
@ -14,8 +14,9 @@
// Define a new application type
class MyApp: public wxApp
{ public:
bool OnInit(void);
{
public:
bool OnInit();
wxFont m_canvasFont;
wxColour m_canvasTextColour;
@ -23,15 +24,17 @@ class MyApp: public wxApp
// Define a new frame type
class MyFrame: public wxFrame
{ public:
MyFrame(wxWindow *parent, const wxString& title, const wxPoint& pos,
const wxSize& size);
{
public:
MyFrame(wxWindow *parent, const wxString& title,
const wxPoint& pos, const wxSize& size);
void ChooseColour(wxCommandEvent& event);
void ChooseFont(wxCommandEvent& event);
void MessageBox(wxCommandEvent& event);
void SingleChoice(wxCommandEvent& event);
void TextEntry(wxCommandEvent& event);
void NumericEntry(wxCommandEvent& event);
void FileOpen(wxCommandEvent& event);
void FileSave(wxCommandEvent& event);
void DirChoose(wxCommandEvent& event);
@ -42,20 +45,20 @@ class MyFrame: public wxFrame
void ChooseColourGeneric(wxCommandEvent& event);
void ChooseFontGeneric(wxCommandEvent& event);
#endif
void OnExit(wxCommandEvent& event);
DECLARE_EVENT_TABLE()
};
class MyCanvas: public wxScrolledWindow
{
public:
MyCanvas(wxWindow *parent):
wxScrolledWindow(parent)
{
}
void OnPaint(wxPaintEvent& event);
DECLARE_EVENT_TABLE()
public:
MyCanvas(wxWindow *parent) : wxScrolledWindow(parent) { }
void OnPaint(wxPaintEvent& event);
DECLARE_EVENT_TABLE()
};
@ -72,6 +75,7 @@ DECLARE_EVENT_TABLE()
#define DIALOGS_DIR_CHOOSE 10
#define DIALOGS_TIP 11
#define DIALOGS_EXT_DIALOG 12
#define DIALOGS_NUM_ENTRY 13
#endif

View File

@ -323,7 +323,7 @@ void wxLog::TimeStamp(wxString *str)
wxChar buf[256];
time_t timeNow;
(void)time(&timeNow);
// wxStrftime(buf, WXSIZEOF(buf), ms_timestamp, localtime(&timeNow));
wxStrftime(buf, WXSIZEOF(buf), ms_timestamp, localtime(&timeNow));
str->Empty();
*str << buf << _T(": ");
@ -577,7 +577,6 @@ void wxLogGui::DoLog(wxLogLevel level, const wxChar *szString, time_t t)
if ( !m_bErrors ) {
m_aMessages.Empty();
m_aTimes.Empty();
m_bHasMessages = TRUE;
m_bErrors = TRUE;
}
// fall through
@ -590,6 +589,7 @@ void wxLogGui::DoLog(wxLogLevel level, const wxChar *szString, time_t t)
m_aMessages.Add(szString);
m_aTimes.Add((long)t);
m_bHasMessages = TRUE;
break;
}
}

View File

@ -45,11 +45,40 @@
#include "wx/generic/textdlgg.h"
// ----------------------------------------------------------------------------
// private classes
// ----------------------------------------------------------------------------
class WXDLLEXPORT wxNumberEntryDialog : public wxDialog
{
public:
wxNumberEntryDialog(wxWindow *parent,
const wxString& message,
const wxString& prompt,
const wxString& caption,
long value, long min, long max,
const wxPoint& pos);
long GetValue() const { return m_value; }
// implementation only
void OnOK(wxCommandEvent& event);
void OnCancel(wxCommandEvent& event);
protected:
wxTextCtrl *m_spinctrl; // TODO replace it with wxSpinCtrl once it's done
long m_value, m_min, m_max;
private:
DECLARE_EVENT_TABLE()
};
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
#define wxID_TEXT 3000
static const int wxID_TEXT = 3000;
// ============================================================================
// implementation
@ -60,6 +89,11 @@
// ----------------------------------------------------------------------------
#if !USE_SHARED_LIBRARY
BEGIN_EVENT_TABLE(wxNumberEntryDialog, wxDialog)
EVT_BUTTON(wxID_OK, wxNumberEntryDialog::OnOK)
EVT_BUTTON(wxID_CANCEL, wxNumberEntryDialog::OnCancel)
END_EVENT_TABLE()
BEGIN_EVENT_TABLE(wxTextEntryDialog, wxDialog)
EVT_BUTTON(wxID_OK, wxTextEntryDialog::OnOK)
END_EVENT_TABLE()
@ -135,3 +169,128 @@ void wxTextEntryDialog::OnOK(wxCommandEvent& WXUNUSED(event) )
EndModal(wxID_OK);
}
// ----------------------------------------------------------------------------
// wxNumberEntryDialog
// ----------------------------------------------------------------------------
wxNumberEntryDialog::wxNumberEntryDialog(wxWindow *parent,
const wxString& message,
const wxString& prompt,
const wxString& caption,
long value,
long min,
long max,
const wxPoint& pos)
: wxDialog(parent, -1, caption,
pos, wxDefaultSize,
wxDEFAULT_DIALOG_STYLE | wxDIALOG_MODAL)
{
// init members
// ------------
m_value = value;
m_max = max;
m_min = min;
// calculate the sizes
// -------------------
wxArrayString lines;
wxSize sizeText = SplitTextMessage(message, &lines);
wxSize sizeBtn = GetStandardButtonSize();
int wPrompt, hPrompt;
GetTextExtent(prompt, &wPrompt, &hPrompt);
long wText = wxMax(2*sizeBtn.GetWidth(),
wxMax(wPrompt, sizeText.GetWidth()));
long hText = GetStandardTextHeight();
long wDialog = 5*LAYOUT_X_MARGIN + wText + wPrompt;
long hDialog = 2*LAYOUT_Y_MARGIN +
sizeText.GetHeight() * lines.GetCount() +
2*LAYOUT_Y_MARGIN +
hText +
2*LAYOUT_Y_MARGIN +
sizeBtn.GetHeight() +
2*LAYOUT_Y_MARGIN;
// create the controls
// -------------------
// message
long x = 2*LAYOUT_X_MARGIN;
long y = CreateTextMessage(lines,
wxPoint(x, 2*LAYOUT_Y_MARGIN),
sizeText);
y += 2*LAYOUT_X_MARGIN;
// prompt
(void)new wxStaticText(this, -1, prompt,
wxPoint(x, y),
wxSize(wPrompt, hPrompt));
// spin ctrl
wxString valStr;
valStr.Printf("%lu", m_value);
m_spinctrl = new wxTextCtrl(this, -1, valStr,
wxPoint(x + wPrompt + LAYOUT_X_MARGIN, y),
wxSize(wText, hText));
y += hText + 2*LAYOUT_X_MARGIN;
// and buttons
CreateStandardButtons(wDialog, y, sizeBtn.GetWidth(), sizeBtn.GetHeight());
// set the dialog size and position
SetClientSize(wDialog, hDialog);
if ( pos == wxDefaultPosition )
{
// centre the dialog if no explicit position given
Centre(wxBOTH | wxCENTER_FRAME);
}
m_spinctrl->SetFocus();
}
void wxNumberEntryDialog::OnOK(wxCommandEvent& event)
{
if ( (sscanf(m_spinctrl->GetValue(), "%lu", &m_value) != 1) ||
(m_value < m_min) || (m_value > m_max) )
{
// not a number or out of range
m_value = -1;
}
EndModal(wxID_OK);
}
void wxNumberEntryDialog::OnCancel(wxCommandEvent& event)
{
m_value = -1;
EndModal(wxID_CANCEL);
}
// ----------------------------------------------------------------------------
// global functions
// ----------------------------------------------------------------------------
// wxGetTextFromUser is in utilscmn.cpp
long wxGetNumberFromUser(const wxString& msg,
const wxString& prompt,
const wxString& title,
long value,
long min,
long max,
wxWindow *parent,
const wxPoint& pos)
{
wxNumberEntryDialog dialog(parent, msg, prompt, title,
value, min, max, pos);
(void)dialog.ShowModal();
return dialog.GetValue();
}

View File

@ -204,15 +204,19 @@ bool wxApp::Initialize()
#endif // __WIN95__
#if wxUSE_OLE
#ifdef __WIN16__
// for OLE, enlarge message queue to be as large as possible
int iMsg = 96;
while (!SetMessageQueue(iMsg) && (iMsg -= 8));
while (!SetMessageQueue(iMsg) && (iMsg -= 8))
;
#endif // Win16
#if wxUSE_OLE
// we need to initialize OLE library
if ( FAILED(::OleInitialize(NULL)) )
wxLogError(_("Cannot initialize OLE"));
#endif
#endif // wxUSE_OLE
#if wxUSE_CTL3D
if (!Ctl3dRegister(wxhInstance))

View File

@ -682,37 +682,6 @@ void wxRadioBox::Command (wxCommandEvent & event)
ProcessCommand (event);
}
long wxRadioBox::MSWWindowProc(WXUINT msg, WXWPARAM wParam, WXLPARAM lParam)
{
long rc = 0;
bool processed = FALSE;
switch ( msg )
{
case WM_NCHITTEST:
{
int xPos = LOWORD(lParam); // horizontal position of cursor
int yPos = HIWORD(lParam); // vertical position of cursor
ScreenToClient(&xPos, &yPos);
// Make sure you can drag by the top of the groupbox, but let
// other (enclosed) controls get mouse events also
if ( yPos < 10 )
{
rc = HTCLIENT;
processed = TRUE;
}
}
break;
}
if ( !processed )
rc = wxControl::MSWWindowProc(msg, wParam, lParam);
return rc;
}
void wxRadioBox::SubclassRadioButton(WXHWND hWndBtn)
{
#ifdef __WIN32__

View File

@ -6,7 +6,7 @@
// Created: 04/01/98
// RCS-ID: $Id$
// Copyright: (c) Julian Smart and Markus Holzem
// Licence: wxWindows license
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
@ -113,23 +113,10 @@ wxSize wxStaticBox::DoGetBestSize()
return wxSize(wBox, hBox);
}
void wxStaticBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
{
wxControl::DoSetSize(x, y, width, height, sizeFlags);
return;
// the static box should always be on the bottom of the Z-order, otherwise
// it may hide controls which are positioned inside it
if ( !::SetWindowPos(GetHwnd(), HWND_TOP, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE) )
{
wxLogLastError(_T("SetWindowPos"));
}
}
WXHBRUSH wxStaticBox::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
WXUINT message,
WXWPARAM wParam,
WXLPARAM lParam)
{
#if wxUSE_CTL3D
if ( m_useCtl3D )
@ -174,9 +161,9 @@ void wxStaticBox::OnEraseBackground(wxEraseEvent& event)
// Alternatively, just make sure that wxStaticBox is always at the back! There are probably
// few other circumstances where it matters about child clipping. But what about painting onto
// to panel, inside a groupbox? Doesn't appear, because the box wipes it out.
wxWindow *parent = 0; //GetParent();
if ( parent && parent->GetHWND() && (::GetWindowLong((HWND) parent->GetHWND(), GWL_STYLE) & WS_CLIPCHILDREN) )
{
wxWindow *parent = GetParent();
if ( parent && parent->GetHWND() && (::GetWindowLong((HWND) parent->GetHWND(), GWL_STYLE) & WS_CLIPCHILDREN) )
{
// TODO: May in fact need to generate a paint event for inside this
// control's rectangle, otherwise all controls are going to be clipped -
// ugh.
@ -189,11 +176,11 @@ void wxStaticBox::OnEraseBackground(wxEraseEvent& event)
::FillRect ((HDC) event.GetDC()->GetHDC(), &rect, hBrush);
::DeleteObject(hBrush);
::SetMapMode((HDC) event.GetDC()->GetHDC(), mode);
}
else
{
event.Skip();
}
}
else
{
event.Skip();
}
}
long wxStaticBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)

View File

@ -164,10 +164,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
const wxChar *windowClass = _T("EDIT");
#if wxUSE_RICHEDIT
// multiline edit controls are RICHEDITs except for those which have a
// simple border (VZ: why??)
if ( (m_windowStyle & wxTE_MULTILINE) &&
!(m_windowStyle & wxSIMPLE_BORDER) )
if ( m_windowStyle & wxTE_RICH )
{
msStyle |= ES_AUTOVSCROLL;
m_isRich = TRUE;