X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4bb6408c2631988fab9925014c6619358bf867de..f377a3b58c509ceba8c9335dbe45d100cca615ad:/src/motif/button.cpp diff --git a/src/motif/button.cpp b/src/motif/button.cpp index d7cdab1c6a..f48bab4230 100644 --- a/src/motif/button.cpp +++ b/src/motif/button.cpp @@ -14,6 +14,14 @@ #endif #include "wx/button.h" +#include "wx/utils.h" + +#include +#include + +#include "wx/motif/private.h" + +void wxButtonCallback (Widget w, XtPointer clientData, XtPointer ptr); #if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxButton, wxControl) @@ -22,54 +30,128 @@ IMPLEMENT_DYNAMIC_CLASS(wxButton, wxControl) // Button bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& label, - const wxPoint& pos, - const wxSize& size, long style, - const wxValidator& validator, - const wxString& name) + const wxPoint& pos, + const wxSize& size, long style, + const wxValidator& validator, + const wxString& name) { SetName(name); SetValidator(validator); m_windowStyle = style; - + m_backgroundColour = parent->GetBackgroundColour(); + m_foregroundColour = parent->GetForegroundColour(); + m_font = parent->GetFont(); + parent->AddChild((wxButton *)this); - + if (id == -1) m_windowId = NewControlId(); else m_windowId = id; - - // TODO: create button - - return FALSE; -} - -void wxButton::SetSize(int x, int y, int width, int height, int sizeFlags) -{ - // TODO + + wxString label1(wxStripMenuCodes(label)); + + XmString text = XmStringCreateSimple ((char*) (const char*) label1); + Widget parentWidget = (Widget) parent->GetClientWidget(); + + XmFontList fontList = (XmFontList) m_font.GetFontList(1.0, XtDisplay(parentWidget)); + + /* + * Patch Note (important) + * There is no major reason to put a defaultButtonThickness here. + * Not requesting it give the ability to put wxButton with a spacing + * as small as requested. However, if some button become a DefaultButton, + * other buttons are no more aligned -- This is why we set + * defaultButtonThickness of ALL buttons belonging to the same wxPanel, + * in the ::SetDefaultButton method. + */ + m_mainWidget = (WXWidget) XtVaCreateManagedWidget ("button", + xmPushButtonWidgetClass, + parentWidget, + XmNfontList, fontList, + XmNlabelString, text, + // XmNdefaultButtonShadowThickness, 1, // See comment for wxButton::SetDefault + NULL); + + XmStringFree (text); + + XtAddCallback ((Widget) m_mainWidget, XmNactivateCallback, (XtCallbackProc) wxButtonCallback, + (XtPointer) this); + + SetCanAddEventHandler(TRUE); + AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y); + + ChangeBackgroundColour(); + + return TRUE; } void wxButton::SetDefault() { wxWindow *parent = (wxWindow *)GetParent(); +/* + TODO if (parent) parent->SetDefaultItem(this); +*/ + + // We initially do not set XmNdefaultShadowThickness, to have small buttons. + // Unfortunately, buttons are now mis-aligned. We try to correct this + // now -- setting this ressource to 1 for each button in the same row. + // Because it's very hard to find wxButton in the same row, + // correction is straighforward: we set resource for all wxButton + // in this parent (but not sub panels) + for (wxNode * node = parent->GetChildren().First (); node; node = node->Next ()) + { + wxButton *item = (wxButton *) node->Data (); + if (item->IsKindOf(CLASSINFO(wxButton))) + { + bool managed = XtIsManaged((Widget) item->GetMainWidget()); + if (managed) + XtUnmanageChild ((Widget) item->GetMainWidget()); + + XtVaSetValues ((Widget) item->GetMainWidget(), + XmNdefaultButtonShadowThickness, 1, + NULL); + + if (managed) + XtManageChild ((Widget) item->GetMainWidget()); + } + } // while + + // XtVaSetValues((Widget)handle, XmNshowAsDefault, 1, NULL); + XtVaSetValues ((Widget) parent->GetMainWidget(), XmNdefaultButton, (Widget) GetMainWidget(), NULL); +} - // TODO: make button the default +void wxButton::Command (wxCommandEvent & event) +{ + ProcessCommand (event); } -wxString wxButton::GetLabel() const +void wxButtonCallback (Widget w, XtPointer clientData, XtPointer WXUNUSED(ptr)) { - // TODO - return wxString(""); + if (!wxGetWindowFromTable(w)) + // Widget has been deleted! + return; + + wxButton *item = (wxButton *) clientData; + wxCommandEvent event (wxEVT_COMMAND_BUTTON_CLICKED, item->GetId()); + event.SetEventObject(item); + item->ProcessCommand (event); } -void wxButton::SetLabel(const wxString& label) +void wxButton::ChangeFont(bool keepOriginalSize) { - // TODO + wxWindow::ChangeFont(keepOriginalSize); } -void wxButton::Command (wxCommandEvent & event) +void wxButton::ChangeBackgroundColour() { - ProcessCommand (event); + DoChangeBackgroundColour(m_mainWidget, m_backgroundColour, TRUE); +} + +void wxButton::ChangeForegroundColour() +{ + wxWindow::ChangeForegroundColour(); }