Implemented DoGetBestSize for wxListBox, (native) wxComboBox and
wxTextCtrl, and used it when wxSize(-1, -1) is passed to Create, to set the initial size. Added wxDoChangeFont and wxXmStringToString helper functions, removed the use of m_stringList in native wxComboBox, removed some duplicated code in wxWindow. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@19296 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -91,6 +91,9 @@ protected:
|
|||||||
virtual void DoSetSize(int x, int y,
|
virtual void DoSetSize(int x, int y,
|
||||||
int width, int height,
|
int width, int height,
|
||||||
int sizeFlags = wxSIZE_AUTO);
|
int sizeFlags = wxSIZE_AUTO);
|
||||||
|
private:
|
||||||
|
// only implemented for native combo box
|
||||||
|
void AdjustDropDownListSize();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -88,6 +88,8 @@ public:
|
|||||||
virtual void DoToggleItem(int item, int x) {};
|
virtual void DoToggleItem(int item, int x) {};
|
||||||
#endif
|
#endif
|
||||||
protected:
|
protected:
|
||||||
|
virtual wxSize DoGetBestSize() const;
|
||||||
|
|
||||||
int m_noItems;
|
int m_noItems;
|
||||||
|
|
||||||
// List mapping positions->client data
|
// List mapping positions->client data
|
||||||
|
@@ -64,6 +64,7 @@ extern void wxDoChangeForegroundColour(WXWidget widget,
|
|||||||
extern void wxDoChangeBackgroundColour(WXWidget widget,
|
extern void wxDoChangeBackgroundColour(WXWidget widget,
|
||||||
wxColour& backgroundColour,
|
wxColour& backgroundColour,
|
||||||
bool changeArmColour = FALSE);
|
bool changeArmColour = FALSE);
|
||||||
|
extern void wxDoChangeFont(WXWidget widget, wxFont& font);
|
||||||
|
|
||||||
#define wxNO_COLORS 0x00
|
#define wxNO_COLORS 0x00
|
||||||
#define wxBACK_COLORS 0x01
|
#define wxBACK_COLORS 0x01
|
||||||
@@ -107,13 +108,20 @@ private:
|
|||||||
XmString m_string;
|
XmString m_string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
wxString wxXmStringToString( const XmString& xmString );
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Routines used in both wxTextCtrl/wxListBox and nativa wxComboBox
|
// Routines used in both wxTextCtrl/wxListBox and nativa wxComboBox
|
||||||
// (defined in src/motif/listbox.cpp or src/motif/textctrl.cpp
|
// (defined in src/motif/listbox.cpp or src/motif/textctrl.cpp
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
int wxDoFindStringInList( Widget listWidget, const wxString& str );
|
int wxDoFindStringInList( Widget listWidget, const wxString& str );
|
||||||
int wxDoGetSelectionInList(Widget listWidget);
|
int wxDoGetSelectionInList( Widget listWidget );
|
||||||
|
wxString wxDoGetStringInList( Widget listWidget, int n );
|
||||||
|
wxSize wxDoGetListBoxBestSize( Widget listWidget, const wxWindow* window );
|
||||||
|
|
||||||
|
wxSize wxDoGetSingleTextCtrlBestSize( Widget textWidget,
|
||||||
|
const wxWindow* window );
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// executes one main loop iteration (implemented in src/motif/evtloop.cpp)
|
// executes one main loop iteration (implemented in src/motif/evtloop.cpp)
|
||||||
|
@@ -133,7 +133,8 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
wxString m_fileName;
|
wxString m_fileName;
|
||||||
|
|
||||||
|
virtual wxSize DoGetBestSize() const;
|
||||||
public:
|
public:
|
||||||
// Motif-specific
|
// Motif-specific
|
||||||
void* m_tempCallbackStruct;
|
void* m_tempCallbackStruct;
|
||||||
|
@@ -176,10 +176,8 @@ int wxChoice::DoAppend(const wxString& item)
|
|||||||
|
|
||||||
DoChangeBackgroundColour((WXWidget) w, m_backgroundColour);
|
DoChangeBackgroundColour((WXWidget) w, m_backgroundColour);
|
||||||
|
|
||||||
if (m_font.Ok())
|
if( m_font.Ok() )
|
||||||
XtVaSetValues (w,
|
wxDoChangeFont( w, m_font );
|
||||||
XmNfontList, (XmFontList) m_font.GetFontList(1.0, XtDisplay((Widget) m_formWidget)),
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
m_widgetArray.Add(w);
|
m_widgetArray.Add(w);
|
||||||
|
|
||||||
|
@@ -83,6 +83,8 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
|
|||||||
( style & wxCB_DROPDOWN ) ? XmDROP_DOWN_COMBO_BOX :
|
( style & wxCB_DROPDOWN ) ? XmDROP_DOWN_COMBO_BOX :
|
||||||
// default to wxCB_DROPDOWN
|
// default to wxCB_DROPDOWN
|
||||||
XmDROP_DOWN_COMBO_BOX;
|
XmDROP_DOWN_COMBO_BOX;
|
||||||
|
if( cb_type == XmDROP_DOWN_COMBO_BOX )
|
||||||
|
SetWindowStyle( style | wxCB_DROPDOWN );
|
||||||
|
|
||||||
Widget buttonWidget= XtVaCreateManagedWidget(name.c_str(),
|
Widget buttonWidget= XtVaCreateManagedWidget(name.c_str(),
|
||||||
xmComboBoxWidgetClass, parentWidget,
|
xmComboBoxWidgetClass, parentWidget,
|
||||||
@@ -108,19 +110,36 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
|
|||||||
(XtCallbackProc) wxComboBoxCallback,
|
(XtCallbackProc) wxComboBoxCallback,
|
||||||
(XtPointer) this);
|
(XtPointer) this);
|
||||||
|
|
||||||
|
wxSize best = GetBestSize();
|
||||||
|
if( size.x != -1 ) best.x = size.x;
|
||||||
|
if( size.y != -1 ) best.y = size.y;
|
||||||
|
|
||||||
SetCanAddEventHandler(true);
|
SetCanAddEventHandler(true);
|
||||||
AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
|
AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
|
||||||
pos.x, pos.y, size.x, size.y);
|
pos.x, pos.y, best.x, best.y);
|
||||||
|
|
||||||
XtVaSetValues (GetXmList(this),
|
|
||||||
XmNvisibleItemCount, 10,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
ChangeBackgroundColour();
|
ChangeBackgroundColour();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxComboBox::AdjustDropDownListSize()
|
||||||
|
{
|
||||||
|
int newListCount = -1, itemCount = GetCount();
|
||||||
|
const int MAX = 12;
|
||||||
|
|
||||||
|
if( !itemCount )
|
||||||
|
newListCount = 1;
|
||||||
|
else if( itemCount < MAX )
|
||||||
|
newListCount = itemCount;
|
||||||
|
else
|
||||||
|
newListCount = MAX;
|
||||||
|
|
||||||
|
XtVaSetValues( GetXmList(this),
|
||||||
|
XmNvisibleItemCount, newListCount,
|
||||||
|
NULL );
|
||||||
|
}
|
||||||
|
|
||||||
wxComboBox::~wxComboBox()
|
wxComboBox::~wxComboBox()
|
||||||
{
|
{
|
||||||
DetachWidget((Widget) m_mainWidget); // Removes event handlers
|
DetachWidget((Widget) m_mainWidget); // Removes event handlers
|
||||||
@@ -171,8 +190,8 @@ int wxComboBox::DoAppend(const wxString& item)
|
|||||||
{
|
{
|
||||||
wxXmString str( item.c_str() );
|
wxXmString str( item.c_str() );
|
||||||
XmComboBoxAddItem((Widget) m_mainWidget, str(), 0, False);
|
XmComboBoxAddItem((Widget) m_mainWidget, str(), 0, False);
|
||||||
m_stringList.Add(item);
|
|
||||||
m_noStrings ++;
|
m_noStrings ++;
|
||||||
|
AdjustDropDownListSize();
|
||||||
|
|
||||||
return GetCount() - 1;
|
return GetCount() - 1;
|
||||||
}
|
}
|
||||||
@@ -185,14 +204,10 @@ void wxComboBox::Delete(int n)
|
|||||||
XmComboBoxDeletePos((Widget) m_mainWidget, n+1);
|
XmComboBoxDeletePos((Widget) m_mainWidget, n+1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
wxStringList::Node *node = m_stringList.Item(n);
|
|
||||||
if (node)
|
|
||||||
{
|
|
||||||
delete[] node->GetData();
|
|
||||||
delete node;
|
|
||||||
}
|
|
||||||
m_clientDataDict.Delete(n, HasClientObjectData());
|
m_clientDataDict.Delete(n, HasClientObjectData());
|
||||||
m_noStrings--;
|
m_noStrings--;
|
||||||
|
|
||||||
|
AdjustDropDownListSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxComboBox::Clear()
|
void wxComboBox::Clear()
|
||||||
@@ -204,13 +219,12 @@ void wxComboBox::Clear()
|
|||||||
{
|
{
|
||||||
XmComboBoxDeletePos((Widget) m_mainWidget, m_noStrings--);
|
XmComboBoxDeletePos((Widget) m_mainWidget, m_noStrings--);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_stringList.Clear();
|
|
||||||
|
|
||||||
if ( HasClientObjectData() )
|
if ( HasClientObjectData() )
|
||||||
m_clientDataDict.DestroyData();
|
m_clientDataDict.DestroyData();
|
||||||
m_noStrings = 0;
|
m_noStrings = 0;
|
||||||
|
AdjustDropDownListSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxComboBox::SetSelection (int n)
|
void wxComboBox::SetSelection (int n)
|
||||||
@@ -237,11 +251,7 @@ int wxComboBox::GetSelection (void) const
|
|||||||
|
|
||||||
wxString wxComboBox::GetString(int n) const
|
wxString wxComboBox::GetString(int n) const
|
||||||
{
|
{
|
||||||
wxStringList::Node *node = m_stringList.Item(n);
|
return wxDoGetStringInList( GetXmList(this), n );
|
||||||
if (node)
|
|
||||||
return wxString(node->GetData ());
|
|
||||||
else
|
|
||||||
return wxEmptyString;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxComboBox::FindString(const wxString& s) const
|
int wxComboBox::FindString(const wxString& s) const
|
||||||
@@ -356,6 +366,12 @@ void wxComboBoxCallback (Widget WXUNUSED(w), XtPointer clientData,
|
|||||||
|
|
||||||
void wxComboBox::ChangeFont(bool keepOriginalSize)
|
void wxComboBox::ChangeFont(bool keepOriginalSize)
|
||||||
{
|
{
|
||||||
|
if( m_font.Ok() )
|
||||||
|
{
|
||||||
|
wxDoChangeFont( GetXmText(this), m_font );
|
||||||
|
wxDoChangeFont( GetXmList(this), m_font );
|
||||||
|
}
|
||||||
|
|
||||||
// Don't use the base class wxChoice's ChangeFont
|
// Don't use the base class wxChoice's ChangeFont
|
||||||
wxWindow::ChangeFont(keepOriginalSize);
|
wxWindow::ChangeFont(keepOriginalSize);
|
||||||
}
|
}
|
||||||
@@ -372,7 +388,31 @@ void wxComboBox::ChangeForegroundColour()
|
|||||||
|
|
||||||
wxSize wxComboBox::DoGetBestSize() const
|
wxSize wxComboBox::DoGetBestSize() const
|
||||||
{
|
{
|
||||||
return wxWindow::DoGetBestSize();
|
if( (GetWindowStyle() & wxCB_DROPDOWN) == wxCB_DROPDOWN ||
|
||||||
|
(GetWindowStyle() & wxCB_READONLY) == wxCB_READONLY )
|
||||||
|
{
|
||||||
|
Dimension arrowW, arrowS, highlight, xmargin, ymargin, shadow;
|
||||||
|
|
||||||
|
XtVaGetValues( (Widget)m_mainWidget,
|
||||||
|
XmNarrowSize, &arrowW,
|
||||||
|
XmNarrowSpacing, &arrowS,
|
||||||
|
XmNhighlightThickness, &highlight,
|
||||||
|
XmNmarginWidth, &xmargin,
|
||||||
|
XmNmarginHeight, &ymargin,
|
||||||
|
XmNshadowThickness, &shadow,
|
||||||
|
NULL );
|
||||||
|
|
||||||
|
wxSize listSize = wxDoGetListBoxBestSize( GetXmList(this), this );
|
||||||
|
wxSize textSize = wxDoGetSingleTextCtrlBestSize( GetXmText(this),
|
||||||
|
this );
|
||||||
|
|
||||||
|
// FIXME arbitrary constants
|
||||||
|
return wxSize( listSize.x + arrowW + arrowS + 2 * highlight
|
||||||
|
+ 2 * shadow + 2 * xmargin ,
|
||||||
|
textSize.y + 2 * highlight + 2 * ymargin + 2 * shadow );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return wxWindow::DoGetBestSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // XmVersion >= 2000
|
#endif // XmVersion >= 2000
|
||||||
|
@@ -92,17 +92,30 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id,
|
|||||||
|
|
||||||
Widget parentWidget = (Widget) parent->GetClientWidget();
|
Widget parentWidget = (Widget) parent->GetClientWidget();
|
||||||
|
|
||||||
Arg args[3];
|
XmFontList fontList = (XmFontList)NULL;
|
||||||
|
|
||||||
|
if( m_font.Ok() )
|
||||||
|
{
|
||||||
|
fontList = (XmFontList)m_font.GetFontList(1.0,
|
||||||
|
XtDisplay(parentWidget));
|
||||||
|
}
|
||||||
|
|
||||||
|
Arg args[4];
|
||||||
int count = 0;
|
int count = 0;
|
||||||
XtSetArg( args[0], XmNlistSizePolicy, XmCONSTANT ); ++count;
|
XtSetArg( args[count], XmNlistSizePolicy, XmCONSTANT ); ++count;
|
||||||
XtSetArg( args[1], XmNselectionPolicy,
|
XtSetArg( args[count], XmNselectionPolicy,
|
||||||
( m_windowStyle & wxLB_MULTIPLE ) ? XmMULTIPLE_SELECT :
|
( m_windowStyle & wxLB_MULTIPLE ) ? XmMULTIPLE_SELECT :
|
||||||
( m_windowStyle & wxLB_EXTENDED ) ? XmEXTENDED_SELECT :
|
( m_windowStyle & wxLB_EXTENDED ) ? XmEXTENDED_SELECT :
|
||||||
XmBROWSE_SELECT );
|
XmBROWSE_SELECT );
|
||||||
++count;
|
++count;
|
||||||
|
if( fontList )
|
||||||
|
{
|
||||||
|
XtSetArg( args[count], XmNfontList, fontList );
|
||||||
|
++count;
|
||||||
|
}
|
||||||
if( m_windowStyle & wxLB_ALWAYS_SB )
|
if( m_windowStyle & wxLB_ALWAYS_SB )
|
||||||
{
|
{
|
||||||
XtSetArg( args[2], XmNscrollBarDisplayPolicy, XmSTATIC );
|
XtSetArg( args[count], XmNscrollBarDisplayPolicy, XmSTATIC );
|
||||||
++count;
|
++count;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,12 +128,9 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id,
|
|||||||
|
|
||||||
XtManageChild (listWidget);
|
XtManageChild (listWidget);
|
||||||
|
|
||||||
long width = size.x;
|
wxSize best = GetBestSize();
|
||||||
long height = size.y;
|
if( size.x != -1 ) best.x = size.x;
|
||||||
if (width == -1)
|
if( size.y != -1 ) best.y = size.y;
|
||||||
width = 150;
|
|
||||||
if (height == -1)
|
|
||||||
height = 80;
|
|
||||||
|
|
||||||
XtAddCallback (listWidget,
|
XtAddCallback (listWidget,
|
||||||
XmNbrowseSelectionCallback,
|
XmNbrowseSelectionCallback,
|
||||||
@@ -139,11 +149,9 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id,
|
|||||||
(XtCallbackProc) wxListBoxCallback,
|
(XtCallbackProc) wxListBoxCallback,
|
||||||
(XtPointer) this);
|
(XtPointer) this);
|
||||||
|
|
||||||
ChangeFont(FALSE);
|
|
||||||
|
|
||||||
SetCanAddEventHandler(TRUE);
|
SetCanAddEventHandler(TRUE);
|
||||||
AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
|
AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
|
||||||
pos.x, pos.y, width, height);
|
pos.x, pos.y, best.x, best.y);
|
||||||
|
|
||||||
ChangeBackgroundColour();
|
ChangeBackgroundColour();
|
||||||
|
|
||||||
@@ -443,28 +451,25 @@ int wxListBox::GetSelection() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Find string for position
|
// Find string for position
|
||||||
wxString wxListBox::GetString(int N) const
|
wxString wxDoGetStringInList( Widget listBox, int n )
|
||||||
{
|
{
|
||||||
Widget listBox = (Widget) m_mainWidget;
|
|
||||||
XmString *strlist;
|
XmString *strlist;
|
||||||
int n;
|
int count;
|
||||||
XtVaGetValues (listBox, XmNitemCount, &n, XmNitems, &strlist, NULL);
|
XtVaGetValues( listBox,
|
||||||
if (N <= n && N >= 0)
|
XmNitemCount, &count,
|
||||||
{
|
XmNitems, &strlist,
|
||||||
char *txt;
|
NULL );
|
||||||
if (XmStringGetLtoR (strlist[N], XmSTRING_DEFAULT_CHARSET, &txt))
|
if( n <= count && n >= 0 )
|
||||||
{
|
return wxXmStringToString( strlist[n] );
|
||||||
wxString str(txt);
|
|
||||||
XtFree (txt);
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return wxEmptyString;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
return wxEmptyString;
|
return wxEmptyString;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxString wxListBox::GetString( int n ) const
|
||||||
|
{
|
||||||
|
return wxDoGetStringInList( (Widget)m_mainWidget, n );
|
||||||
|
}
|
||||||
|
|
||||||
void wxListBox::DoInsertItems(const wxArrayString& items, int pos)
|
void wxListBox::DoInsertItems(const wxArrayString& items, int pos)
|
||||||
{
|
{
|
||||||
wxSizeKeeper sk( this );
|
wxSizeKeeper sk( this );
|
||||||
@@ -653,3 +658,51 @@ int wxListBox::GetCount() const
|
|||||||
{
|
{
|
||||||
return m_noItems;
|
return m_noItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define LIST_SCROLL_SPACING 6
|
||||||
|
|
||||||
|
wxSize wxDoGetListBoxBestSize( Widget listWidget, const wxWindow* window )
|
||||||
|
{
|
||||||
|
int max;
|
||||||
|
Dimension spacing, highlight, xmargin, ymargin, shadow;
|
||||||
|
int width = 0;
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
XtVaGetValues( listWidget,
|
||||||
|
XmNitemCount, &max,
|
||||||
|
XmNlistSpacing, &spacing,
|
||||||
|
XmNhighlightThickness, &highlight,
|
||||||
|
XmNlistMarginWidth, &xmargin,
|
||||||
|
XmNlistMarginHeight, &ymargin,
|
||||||
|
XmNshadowThickness, &shadow,
|
||||||
|
NULL );
|
||||||
|
|
||||||
|
for( size_t i = 0; i < (size_t)max; ++i )
|
||||||
|
{
|
||||||
|
window->GetTextExtent( wxDoGetStringInList( listWidget, i ), &x, &y );
|
||||||
|
width = wxMax( width, x );
|
||||||
|
}
|
||||||
|
|
||||||
|
// use some arbitrary value if there are no strings
|
||||||
|
if( width == 0 )
|
||||||
|
width = 100;
|
||||||
|
|
||||||
|
// get my
|
||||||
|
window->GetTextExtent( "v", &x, &y );
|
||||||
|
|
||||||
|
// make it a little larger than widest string, plus the scrollbar
|
||||||
|
width += wxSystemSettings::GetMetric( wxSYS_VSCROLL_X )
|
||||||
|
+ 2 * highlight + LIST_SCROLL_SPACING + 2 * xmargin + 2 * shadow;
|
||||||
|
|
||||||
|
// at least 3 items, at most 10
|
||||||
|
int height = wxMax( 3, wxMin( 10, max ) ) *
|
||||||
|
( y + spacing + 2 * highlight ) + 2 * ymargin + 2 * shadow;
|
||||||
|
|
||||||
|
return wxSize( width, height );
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSize wxListBox::DoGetBestSize() const
|
||||||
|
{
|
||||||
|
return wxDoGetListBoxBestSize( (Widget)m_mainWidget, this );
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -181,6 +181,9 @@ int wxSystemSettingsNative::GetMetric(wxSystemMetric index)
|
|||||||
{
|
{
|
||||||
switch ( index)
|
switch ( index)
|
||||||
{
|
{
|
||||||
|
case wxSYS_HSCROLL_Y:
|
||||||
|
case wxSYS_VSCROLL_X:
|
||||||
|
return 15;
|
||||||
case wxSYS_MOUSE_BUTTONS:
|
case wxSYS_MOUSE_BUTTONS:
|
||||||
// TODO
|
// TODO
|
||||||
case wxSYS_BORDER_X:
|
case wxSYS_BORDER_X:
|
||||||
@@ -233,10 +236,6 @@ int wxSystemSettingsNative::GetMetric(wxSystemMetric index)
|
|||||||
// TODO
|
// TODO
|
||||||
case wxSYS_SMALLICON_Y:
|
case wxSYS_SMALLICON_Y:
|
||||||
// TODO
|
// TODO
|
||||||
case wxSYS_HSCROLL_Y:
|
|
||||||
// TODO
|
|
||||||
case wxSYS_VSCROLL_X:
|
|
||||||
// TODO
|
|
||||||
case wxSYS_VSCROLL_ARROW_X:
|
case wxSYS_VSCROLL_ARROW_X:
|
||||||
// TODO
|
// TODO
|
||||||
case wxSYS_VSCROLL_ARROW_Y:
|
case wxSYS_VSCROLL_ARROW_Y:
|
||||||
|
@@ -107,24 +107,14 @@ bool wxTextCtrl::Create(wxWindow *parent,
|
|||||||
const wxValidator& validator,
|
const wxValidator& validator,
|
||||||
const wxString& name)
|
const wxString& name)
|
||||||
{
|
{
|
||||||
|
if( !CreateControl( parent, id, pos, size, style, validator, name ) )
|
||||||
|
return false;
|
||||||
|
|
||||||
m_tempCallbackStruct = (void*) NULL;
|
m_tempCallbackStruct = (void*) NULL;
|
||||||
m_modified = FALSE;
|
m_modified = FALSE;
|
||||||
m_processedDefault = FALSE;
|
m_processedDefault = FALSE;
|
||||||
// m_backgroundColour = parent->GetBackgroundColour();
|
|
||||||
m_backgroundColour = * wxWHITE;
|
|
||||||
m_foregroundColour = parent->GetForegroundColour();
|
|
||||||
|
|
||||||
SetName(name);
|
m_backgroundColour = *wxWHITE;
|
||||||
SetValidator(validator);
|
|
||||||
if (parent)
|
|
||||||
parent->AddChild(this);
|
|
||||||
|
|
||||||
m_windowStyle = style;
|
|
||||||
|
|
||||||
if ( id == -1 )
|
|
||||||
m_windowId = (int)NewControlId();
|
|
||||||
else
|
|
||||||
m_windowId = id;
|
|
||||||
|
|
||||||
Widget parentWidget = (Widget) parent->GetClientWidget();
|
Widget parentWidget = (Widget) parent->GetClientWidget();
|
||||||
|
|
||||||
@@ -180,20 +170,13 @@ bool wxTextCtrl::Create(wxWindow *parent,
|
|||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !!value )
|
if ( !value.empty() )
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
// don't do this because it is just linking the text to a source
|
|
||||||
// string which is unsafe. MB
|
|
||||||
//
|
|
||||||
XmTextSetString ((Widget) m_mainWidget, (char*)value.c_str());
|
|
||||||
#else
|
|
||||||
// do this instead... MB
|
// do this instead... MB
|
||||||
//
|
//
|
||||||
XtVaSetValues( (Widget) m_mainWidget,
|
XtVaSetValues( (Widget) m_mainWidget,
|
||||||
XmNvalue, (char *)value.c_str(),
|
XmNvalue, (char *)value.c_str(),
|
||||||
NULL);
|
NULL);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// install callbacks
|
// install callbacks
|
||||||
@@ -208,11 +191,15 @@ bool wxTextCtrl::Create(wxWindow *parent,
|
|||||||
XtAddCallback((Widget) m_mainWidget, XmNlosingFocusCallback, (XtCallbackProc)wxTextWindowLoseFocusProc, (XtPointer)this);
|
XtAddCallback((Widget) m_mainWidget, XmNlosingFocusCallback, (XtCallbackProc)wxTextWindowLoseFocusProc, (XtPointer)this);
|
||||||
|
|
||||||
// font
|
// font
|
||||||
m_font = parent->GetFont();
|
|
||||||
ChangeFont(FALSE);
|
ChangeFont(FALSE);
|
||||||
|
|
||||||
|
wxSize best = GetBestSize();
|
||||||
|
if( size.x != -1 ) best.x = size.x;
|
||||||
|
if( size.y != -1 ) best.y = size.y;
|
||||||
|
|
||||||
SetCanAddEventHandler(TRUE);
|
SetCanAddEventHandler(TRUE);
|
||||||
AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y);
|
AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
|
||||||
|
pos.x, pos.y, best.x, best.y);
|
||||||
|
|
||||||
ChangeBackgroundColour();
|
ChangeBackgroundColour();
|
||||||
|
|
||||||
@@ -260,18 +247,11 @@ void wxTextCtrl::SetValue(const wxString& value)
|
|||||||
{
|
{
|
||||||
m_inSetValue = TRUE;
|
m_inSetValue = TRUE;
|
||||||
|
|
||||||
#if 0
|
|
||||||
// don't do this because it is just linking the text to a source
|
|
||||||
// string which is unsafe. MB
|
|
||||||
//
|
|
||||||
XmTextSetString ((Widget) m_mainWidget, (char*)value.c_str());
|
|
||||||
#else
|
|
||||||
// do this instead... MB
|
// do this instead... MB
|
||||||
//
|
//
|
||||||
XtVaSetValues( (Widget) m_mainWidget,
|
XtVaSetValues( (Widget) m_mainWidget,
|
||||||
XmNvalue, (char *)value.c_str(),
|
XmNvalue, (char *)value.c_str(),
|
||||||
NULL);
|
NULL);
|
||||||
#endif
|
|
||||||
|
|
||||||
m_inSetValue = FALSE;
|
m_inSetValue = FALSE;
|
||||||
}
|
}
|
||||||
@@ -735,6 +715,38 @@ void wxTextCtrl::DoSendEvents(void *wxcbs, long keycode)
|
|||||||
m_tempCallbackStruct = NULL;
|
m_tempCallbackStruct = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxSize wxDoGetSingleTextCtrlBestSize( Widget textWidget,
|
||||||
|
const wxWindow* window )
|
||||||
|
{
|
||||||
|
Dimension xmargin, ymargin, highlight, shadow;
|
||||||
|
char* value;
|
||||||
|
|
||||||
|
XtVaGetValues( textWidget,
|
||||||
|
XmNmarginWidth, &xmargin,
|
||||||
|
XmNmarginHeight, &ymargin,
|
||||||
|
XmNvalue, &value,
|
||||||
|
XmNhighlightThickness, &highlight,
|
||||||
|
XmNshadowThickness, &shadow,
|
||||||
|
NULL );
|
||||||
|
if( !value )
|
||||||
|
value = "|";
|
||||||
|
|
||||||
|
int x, y;
|
||||||
|
window->GetTextExtent( value, &x, &y );
|
||||||
|
|
||||||
|
return wxSize( x + 2 * xmargin + 2 * highlight + 2 * shadow,
|
||||||
|
// MBN: +2 necessary: Lesstif bug or mine?
|
||||||
|
y + 2 * ymargin + 2 * highlight + 2 * shadow + 2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSize wxTextCtrl::DoGetBestSize() const
|
||||||
|
{
|
||||||
|
if( IsSingleLine() )
|
||||||
|
return wxDoGetSingleTextCtrlBestSize( (Widget)m_mainWidget, this );
|
||||||
|
else
|
||||||
|
return wxWindow::DoGetBestSize();
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// helpers and Motif callbacks
|
// helpers and Motif callbacks
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@@ -1247,6 +1247,21 @@ void wxDoChangeBackgroundColour(WXWidget widget, wxColour& backgroundColour, boo
|
|||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern void wxDoChangeFont(WXWidget widget, wxFont& font)
|
||||||
|
{
|
||||||
|
// lesstif 0.87 hangs here, but 0.93 does not
|
||||||
|
#if !defined(LESSTIF_VERSION) \
|
||||||
|
|| (defined(LesstifVersion) && LesstifVersion >= 93)
|
||||||
|
|
||||||
|
Widget w = (Widget)widget;
|
||||||
|
XmFontList fontList = (XmFontList)font.GetFontList(1.0, XtDisplay(w));
|
||||||
|
XtVaSetValues( w,
|
||||||
|
XmNfontList, fontList,
|
||||||
|
NULL );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
// __WXMOTIF__
|
// __WXMOTIF__
|
||||||
|
|
||||||
@@ -1257,3 +1272,17 @@ bool wxWindowIsVisible(Window win)
|
|||||||
|
|
||||||
return (wa.map_state == IsViewable);
|
return (wa.map_state == IsViewable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxString wxXmStringToString( const XmString& xmString )
|
||||||
|
{
|
||||||
|
char *txt;
|
||||||
|
if( XmStringGetLtoR( xmString, XmSTRING_DEFAULT_CHARSET, &txt ) )
|
||||||
|
{
|
||||||
|
wxString str(txt);
|
||||||
|
XtFree (txt);
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
return wxEmptyString;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2914,41 +2914,17 @@ void wxWindow::ChangeForegroundColour()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Change a widget's foreground and background colours.
|
// Change a widget's foreground and background colours.
|
||||||
void wxWindow::DoChangeForegroundColour(WXWidget widget, wxColour& foregroundColour)
|
void wxWindow::DoChangeForegroundColour(WXWidget widget,
|
||||||
|
wxColour& foregroundColour)
|
||||||
{
|
{
|
||||||
// When should we specify the foreground, if it's calculated
|
wxDoChangeForegroundColour( widget, foregroundColour );
|
||||||
// by wxComputeColours?
|
|
||||||
// Solution: say we start with the default (computed) foreground colour.
|
|
||||||
// If we call SetForegroundColour explicitly for a control or window,
|
|
||||||
// then the foreground is changed.
|
|
||||||
// Therefore SetBackgroundColour computes the foreground colour, and
|
|
||||||
// SetForegroundColour changes the foreground colour. The ordering is
|
|
||||||
// important.
|
|
||||||
|
|
||||||
Widget w = (Widget)widget;
|
|
||||||
XtVaSetValues(
|
|
||||||
w,
|
|
||||||
XmNforeground, foregroundColour.AllocColour(XtDisplay(w)),
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxWindow::DoChangeBackgroundColour(WXWidget widget, wxColour& backgroundColour, bool changeArmColour)
|
void wxWindow::DoChangeBackgroundColour(WXWidget widget,
|
||||||
|
wxColour& backgroundColour,
|
||||||
|
bool changeArmColour)
|
||||||
{
|
{
|
||||||
wxComputeColours (XtDisplay((Widget) widget), & backgroundColour,
|
wxDoChangeBackgroundColour( widget, backgroundColour, changeArmColour );
|
||||||
(wxColour*) NULL);
|
|
||||||
|
|
||||||
XtVaSetValues ((Widget) widget,
|
|
||||||
XmNbackground, g_itemColors[wxBACK_INDEX].pixel,
|
|
||||||
XmNtopShadowColor, g_itemColors[wxTOPS_INDEX].pixel,
|
|
||||||
XmNbottomShadowColor, g_itemColors[wxBOTS_INDEX].pixel,
|
|
||||||
XmNforeground, g_itemColors[wxFORE_INDEX].pixel,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
if (changeArmColour)
|
|
||||||
XtVaSetValues ((Widget) widget,
|
|
||||||
XmNarmColor, g_itemColors[wxSELE_INDEX].pixel,
|
|
||||||
NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxWindow::SetBackgroundColour(const wxColour& col)
|
bool wxWindow::SetBackgroundColour(const wxColour& col)
|
||||||
@@ -2982,13 +2958,7 @@ void wxWindow::ChangeFont(bool keepOriginalSize)
|
|||||||
int width, height, width1, height1;
|
int width, height, width1, height1;
|
||||||
GetSize(& width, & height);
|
GetSize(& width, & height);
|
||||||
|
|
||||||
// lesstif 0.87 hangs here, but 0.93 does not
|
wxDoChangeFont( GetLabelWidget(), m_font );
|
||||||
#if !defined(LESSTIF_VERSION) \
|
|
||||||
|| (defined(LesstifVersion) && LesstifVersion >= 93)
|
|
||||||
XtVaSetValues (w,
|
|
||||||
XmNfontList, (XmFontList) m_font.GetFontList(1.0, XtDisplay(w)),
|
|
||||||
NULL);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
GetSize(& width1, & height1);
|
GetSize(& width1, & height1);
|
||||||
if (keepOriginalSize && (width != width1 || height != height1))
|
if (keepOriginalSize && (width != width1 || height != height1))
|
||||||
|
Reference in New Issue
Block a user