]>
git.saurik.com Git - wxWidgets.git/blob - src/common/dlgcmn.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: common/dlgcmn.cpp
3 // Purpose: common (to all ports) wxDialog functions
4 // Author: Vadim Zeitlin
8 // Copyright: (c) Vadim Zeitlin
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
21 #pragma implementation "dialogbase.h"
24 // For compilers that support precompilation, includes "wx.h".
25 #include "wx/wxprec.h"
32 #include "wx/button.h"
33 #include "wx/dialog.h"
34 #include "wx/dcclient.h"
36 #include "wx/settings.h"
37 #include "wx/stattext.h"
39 #include "wx/button.h"
40 #include "wx/containr.h"
43 //--------------------------------------------------------------------------
45 //--------------------------------------------------------------------------
47 // FIXME - temporary hack in absence of wxtopLevelWindow, should be always used
48 #ifdef wxTopLevelWindowNative
49 BEGIN_EVENT_TABLE(wxDialogBase
, wxTopLevelWindow
)
50 WX_EVENT_TABLE_CONTROL_CONTAINER(wxDialogBase
)
53 WX_DELEGATE_TO_CONTROL_CONTAINER(wxDialogBase
)
56 void wxDialogBase::Init()
60 // the dialogs have this flag on by default to prevent the events from the
61 // dialog controls from reaching the parent frame which is usually
62 // undesirable and can lead to unexpected and hard to find bugs
63 SetExtraStyle(GetExtraStyle() | wxWS_EX_BLOCK_EVENTS
);
65 #ifdef wxTopLevelWindowNative // FIXME - temporary hack, should be always used!
66 m_container
.SetContainerWindow(this);
70 #if wxUSE_STATTEXT // && wxUSE_TEXTCTRL
72 wxSizer
*wxDialogBase::CreateTextSizer( const wxString
& message
)
74 bool is_pda
= (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA
);
76 wxString text
= message
;
78 // I admit that this is complete bogus, but it makes
79 // message boxes work for pda screens temporarily..
83 max_width
= wxSystemSettings::GetMetric( wxSYS_SCREEN_X
) - 25;
88 wxBoxSizer
*box
= new wxBoxSizer( wxVERTICAL
);
90 // get line height for empty lines
92 wxFont
font( GetFont() );
95 GetTextExtent( wxT("H"), (int*)NULL
, &y
, (int*)NULL
, (int*)NULL
, &font
);
97 size_t last_space
= 0;
99 for ( size_t pos
= 0; pos
< text
.length(); pos
++ )
106 wxStaticText
*s
= new wxStaticText( this, -1, line
);
117 // this is used as accel mnemonic prefix in the wxWidgets
118 // controls but in the static messages created by
119 // CreateTextSizer() (used by wxMessageBox, for example), we
120 // don't want this special meaning, so we need to quote it
123 // fall through to add it normally too
126 if (text
[pos
] == wxT(' '))
129 line
+= message
[pos
];
134 GetTextExtent( line
, &width
, (int*)NULL
, (int*)NULL
, (int*)NULL
, &font
);
136 if (width
> max_width
)
138 // exception if there was no previous space
142 int diff
= pos
-last_space
;
143 int len
= line
.Len();
144 line
.Remove( len
-diff
, diff
);
146 wxStaticText
*s
= new wxStaticText( this, -1, line
);
157 // remaining text behind last '\n'
160 wxStaticText
*s2
= new wxStaticText( this, -1, line
);
167 #endif // wxUSE_STATTEXT // && wxUSE_TEXTCTRL
171 wxSizer
*wxDialogBase::CreateButtonSizer( long flags
)
173 bool is_pda
= (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA
);
175 // If we have a PDA screen, put yes/no button over
176 // all other buttons, otherwise on the left side.
177 wxBoxSizer
*box
= is_pda
? new wxBoxSizer( wxVERTICAL
) : new wxBoxSizer( wxHORIZONTAL
);
179 wxBoxSizer
*inner_yes_no
= NULL
;
181 // Only create sizer containing yes/no
182 // if it is actually required
183 if ( (flags
& wxYES_NO
) != 0 )
185 inner_yes_no
= new wxBoxSizer( wxHORIZONTAL
);
186 box
->Add( inner_yes_no
, 0, wxBOTTOM
, 10 );
189 wxBoxSizer
*inner_rest
= new wxBoxSizer( wxHORIZONTAL
);
190 box
->Add( inner_rest
, 0, 0, 0 );
192 #if defined(__WXMSW__) || defined(__WXMAC__)
193 static const int margin
= 6;
195 static const int margin
= 10;
198 wxButton
*ok
= (wxButton
*) NULL
;
199 wxButton
*yes
= (wxButton
*) NULL
;
200 wxButton
*no
= (wxButton
*) NULL
;
202 // always show an OK button, unless we have both YES and NO
203 if ( (flags
& wxYES_NO
) != wxYES_NO
)
208 yes
= new wxButton(this, wxID_YES
, wxSTOCK_YES
,
209 wxEmptyString
, wxDefaultPosition
, wxCLIP_SIBLINGS
);
210 inner_yes_no
->Add( yes
, 0, wxLEFT
|wxRIGHT
, margin
);
214 no
= new wxButton(this, wxID_NO
, wxSTOCK_NO
,
215 wxEmptyString
, wxDefaultPosition
, wxCLIP_SIBLINGS
);
216 inner_yes_no
->Add( no
, 0, wxLEFT
|wxRIGHT
, margin
);
221 ok
= new wxButton(this, wxID_OK
, wxSTOCK_OK
,
222 wxEmptyString
, wxDefaultPosition
, wxCLIP_SIBLINGS
);
223 inner_rest
->Add( ok
, 0, wxLEFT
|wxRIGHT
, margin
);
226 if (flags
& wxFORWARD
)
227 inner_rest
->Add(new wxButton(this, wxID_FORWARD
, wxSTOCK_GO_FORWARD
,
228 wxEmptyString
, wxDefaultPosition
,
230 0, wxLEFT
|wxRIGHT
, margin
);
232 if (flags
& wxBACKWARD
)
233 inner_rest
->Add(new wxButton(this, wxID_BACKWARD
, wxSTOCK_GO_BACK
,
234 wxEmptyString
, wxDefaultPosition
,
236 0, wxLEFT
|wxRIGHT
, margin
);
239 inner_rest
->Add( new wxButton( this, wxID_SETUP
, _("Setup"),wxDefaultPosition
,wxDefaultSize
,wxCLIP_SIBLINGS
), 0, wxLEFT
|wxRIGHT
, margin
);
242 inner_rest
->Add( new wxButton( this, wxID_MORE
, _("More..."),wxDefaultPosition
,wxDefaultSize
,wxCLIP_SIBLINGS
), 0, wxLEFT
|wxRIGHT
, margin
);
245 inner_rest
->Add(new wxButton(this, wxID_HELP
, wxSTOCK_HELP
,
246 wxEmptyString
, wxDefaultPosition
,
248 0, wxLEFT
|wxRIGHT
, margin
);
250 if (flags
& wxCANCEL
)
252 wxButton
*cancel
= new wxButton(this, wxID_CANCEL
, wxSTOCK_CANCEL
,
253 wxEmptyString
, wxDefaultPosition
,
255 inner_rest
->Add( cancel
, 0, wxLEFT
|wxRIGHT
, margin
);
258 // choose the default button
259 if (flags
& wxNO_DEFAULT
)
284 #endif // wxUSE_BUTTON