void wxButton::SetLabel( const wxString &lbl ) { wxCHECK_RET( m_widget != NULL, wxT("invalid button") ); wxString label(lbl); if (label.empty() && wxIsStockID(m_windowId)) label = wxGetStockLabel(m_windowId); wxControl::SetLabel(label); #ifdef __WXGTK20__ if (wxIsStockID(m_windowId) && wxIsStockLabel(m_windowId, label)) { const char *stock = wxGetStockGtkID(m_windowId); if (stock) { gtk_button_set_label(GTK_BUTTON(m_widget), stock); gtk_button_set_use_stock(GTK_BUTTON(m_widget), TRUE); return; } } wxString label2 = PrepareLabelMnemonics(label); gtk_button_set_label(GTK_BUTTON(m_widget), wxGTK_CONV(label2)); gtk_button_set_use_stock(GTK_BUTTON(m_widget), FALSE); ApplyWidgetStyle( false ); #else gtk_label_set(GTK_LABEL(BUTTON_CHILD(m_widget)), wxGTK_CONV(GetLabel())); #endif }
void wxButton::SetLabel( const wxString &lbl ) { wxCHECK_RET( m_widget != NULL, wxT("invalid button") ); wxString label(lbl); if (label.empty() && wxIsStockID(m_windowId)) label = wxGetStockLabel(m_windowId); wxControl::SetLabel(label); const wxString labelGTK = GTKConvertMnemonics(label); if (wxIsStockID(m_windowId) && wxIsStockLabel(m_windowId, label)) { const char *stock = wxGetStockGtkID(m_windowId); if (stock) { gtk_button_set_label(GTK_BUTTON(m_widget), stock); gtk_button_set_use_stock(GTK_BUTTON(m_widget), TRUE); return; } } gtk_button_set_label(GTK_BUTTON(m_widget), wxGTK_CONV(labelGTK)); gtk_button_set_use_stock(GTK_BUTTON(m_widget), FALSE); ApplyWidgetStyle( false ); }
wxMenuItem::wxMenuItem(wxMenu *pParentMenu, int id, const wxString& t, const wxString& strHelp, wxItemKind kind, wxMenu *pSubMenu) :wxMenuItemBase(pParentMenu, id, t, strHelp, kind, pSubMenu) { wxASSERT_MSG( id != 0 || pSubMenu != NULL , wxT("A MenuItem ID of Zero does not work under Mac") ) ; // In other languages there is no difference in naming the Exit/Quit menu item between MacOS and Windows guidelines // therefore these item must not be translated if (pParentMenu != NULL && !pParentMenu->GetNoEventsMode()) if ( wxStripMenuCodes(m_text).Upper() == wxT("EXIT") ) m_text = wxT("Quit\tCtrl+Q") ; m_radioGroup.start = -1; m_isRadioGroupStart = false; wxString text = wxStripMenuCodes(m_text, (pParentMenu != NULL && pParentMenu->GetNoEventsMode()) ? wxStrip_Accel : wxStrip_All); if (text.IsEmpty() && !IsSeparator()) { wxASSERT_MSG(wxIsStockID(GetId()), wxT("A non-stock menu item with an empty label?")); text = wxGetStockLabel(GetId(), wxSTOCK_WITH_ACCELERATOR|wxSTOCK_WITH_MNEMONIC); } wxAcceleratorEntry *entry = wxAcceleratorEntry::Create( m_text ) ; // use accessors for ID and Kind because they might have been changed in the base constructor m_peer = wxMenuItemImpl::Create( this, pParentMenu, GetId(), text, entry, strHelp, GetKind(), pSubMenu ); delete entry; }
bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& lbl, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name) { wxString label(lbl); if (label.empty() && wxIsStockID(id) && !(id == wxID_HELP)) label = wxGetStockLabel(id); m_macIsUserPane = false ; if ( !wxButtonBase::Create(parent, id, pos, size, style, validator, name) ) return false; m_labelOrig = m_label = label ; m_peer = wxWidgetImpl::CreateButton( this, parent, id, label, pos, size, style, GetExtraStyle() ); MacPostControlCreate( pos, size ); return true; }
VALUE _appendNormalItem(int argc,VALUE *argv,VALUE self) { VALUE id,text,help,temp; rb_scan_args(argc, argv, "1*",&id,&temp); if(rb_obj_is_kind_of(id,rb_cString) && rb_block_given_p()){ rb_scan_args(argc, argv, "11",&text,&help); wxMenu *m = new wxMenu; rb_yield(wrap(m)); return wrap(_self->AppendSubMenu(m,wrap<wxString>(text),wrap<wxString>(help))); }else{ rb_scan_args(argc, argv, "12",&id,&text,&help); wxWindowID wid = unwrapID(id); if(!wxIsStockID(wid) && NIL_P(text)) rb_raise(rb_eArgError,"id %d needs an text",wid); wxMenuItem *item = _self->Append(wid,wrap<wxString>(text),wrap<wxString>(help)); if(rb_block_given_p()){ VALUE proc = rb_block_proc(); #ifdef wxHAS_EVENT_BIND _self->Bind(wxEVT_COMMAND_MENU_SELECTED,RubyFunctor(proc),item->GetId()); #else _self->Connect(item->GetId(),wxEVT_COMMAND_MENU_SELECTED,wxCommandEventHandler(RubyFunctor::operator()),NULL,new RubyFunctor(proc)); #endif } return wrap(item); } }
VALUE _appendShift(VALUE self,VALUE val) { wxWindowID id = unwrapID(val); if(!wxIsStockID(id)) rb_raise(rb_eArgError,"id \"%s\" cant be fast added",wrap<char*>(val)); _self->Append(id); return self; }
void wxMenuItemBase::SetHelp(const wxString& str) { m_help = str; if ( m_help.empty() && !IsSeparator() && wxIsStockID(GetId()) ) { // get a stock help string m_help = wxGetStockHelpString(GetId()); } }
void wxTopLevelWindowMSW::ButtonMenu::SetButton(int id, const wxString& label, wxMenu *subMenu) { m_assigned = true; m_id = id; if(label.empty() && wxIsStockID(id)) m_label = wxGetStockLabel(id, false); else m_label = label; m_menu = subMenu; }
void wxMenuItemBase::SetText(const wxString& str) { m_text = str; if ( m_text.empty() && !IsSeparator() ) { wxASSERT_MSG( wxIsStockID(GetId()), wxT("A non-stock menu item with an empty label?") ); m_text = wxGetStockLabel(GetId(), wxSTOCK_WITH_ACCELERATOR | wxSTOCK_WITH_MNEMONIC); } }
bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& label, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name ) { QtCreate(parent); SetLabel( wxIsStockID( id ) ? wxGetStockLabel( id ) : label ); return QtCreateControl( parent, id, pos, size, style, validator, name ); }
void wxButton::SetLabel( const wxString &lbl ) { wxCHECK_RET( m_widget != NULL, wxT("invalid button") ); wxString label(lbl); if (label.empty() && wxIsStockID(m_windowId)) label = wxGetStockLabel(m_windowId); wxAnyButton::SetLabel(label); // don't use label if it was explicitly disabled if ( HasFlag(wxBU_NOTEXT) ) return; #if !defined(__WXGTK3__) || !GTK_CHECK_VERSION(3,10,0) if (wxIsStockID(m_windowId) && wxIsStockLabel(m_windowId, label)) { const char *stock = wxGetStockGtkID(m_windowId); if (stock) { gtk_button_set_label(GTK_BUTTON(m_widget), stock); gtk_button_set_use_stock(GTK_BUTTON(m_widget), TRUE); return; } } #endif // GTK < 3.10 // this call is necessary if the button had been initially created without // a (text) label -- then we didn't use gtk_button_new_with_mnemonic() and // so "use-underline" GtkButton property remained unset gtk_button_set_use_underline(GTK_BUTTON(m_widget), TRUE); const wxString labelGTK = GTKConvertMnemonics(label); gtk_button_set_label(GTK_BUTTON(m_widget), wxGTK_CONV(labelGTK)); #if !defined(__WXGTK3__) || !GTK_CHECK_VERSION(3,10,0) gtk_button_set_use_stock(GTK_BUTTON(m_widget), FALSE); #endif // GTK < 3.10 GTKApplyWidgetStyle( false ); }
bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& lbl, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name) { wxString label(lbl); if (label.empty() && wxIsStockID(id)) label = wxGetStockLabel(id); if( !CreateControl( parent, id, pos, size, style, validator, name ) ) return false; wxXmString text( GetLabelText(label) ); Widget parentWidget = (Widget) parent->GetClientWidget(); /* * 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, wxFont::GetFontTag(), m_font.GetFontTypeC(XtDisplay(parentWidget)), XmNlabelString, text(), XmNrecomputeSize, False, // See comment for wxButton::SetDefault // XmNdefaultButtonShadowThickness, 1, NULL); XtAddCallback ((Widget) m_mainWidget, XmNactivateCallback, (XtCallbackProc) wxButtonCallback, (XtPointer) this); wxSize best = GetBestSize(); if( size.x != -1 ) best.x = size.x; if( size.y != -1 ) best.y = size.y; AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, best.x, best.y); ChangeBackgroundColour(); return true; }
bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& labelOrig, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name) { DontCreatePeer(); m_marginX = m_marginY = 0; // FIXME: this hack is needed because we're called from // wxBitmapButton::Create() with this style and we currently use a // different wxWidgetImpl method (CreateBitmapButton() rather than // CreateButton()) for creating bitmap buttons, but we really ought // to unify the creation of buttons of all kinds and then remove // this check if ( style & wxBU_NOTEXT ) { return wxControl::Create(parent, id, pos, size, style, validator, name); } wxString label; // Ignore the standard label for help buttons if possible, they use "?" // label under Mac which looks better. if ( !IsHelpButtonWithStandardLabel(id, labelOrig) ) { label = labelOrig.empty() && wxIsStockID(id) ? wxGetStockLabel(id) : labelOrig; } if ( !wxButtonBase::Create(parent, id, pos, size, style, validator, name) ) return false; m_labelOrig = m_label = label ; SetPeer(wxWidgetImpl::CreateButton( this, parent, id, label, pos, size, style, GetExtraStyle() )); MacPostControlCreate( pos, size ); return true; }
void wxButton::SetLabel( const wxString &lbl ) { wxCHECK_RET( m_widget != NULL, wxT("invalid button") ); wxString label(lbl); if (label.empty() && wxIsStockID(m_windowId)) label = wxGetStockLabel(m_windowId); wxControl::SetLabel(label); const wxString labelGTK = GTKRemoveMnemonics(label); gtk_label_set(GTK_LABEL(BUTTON_CHILD(m_widget)), wxGTK_CONV(labelGTK)); }
bool wxToggleButton::Create(wxWindow *parent, wxWindowID id, const wxString& label, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name) { // create a checkable push button m_qtPushButton = new wxQtToggleButton( parent, this ); // this button is toggleable and has a text label SetLabel( wxIsStockID( id ) ? wxGetStockLabel( id ) : label ); return QtCreateControl( parent, id, pos, size, style, validator, name ); }
void wxMenuItem::UpdateItemText() { if ( !m_parentMenu ) return ; wxString text = wxStripMenuCodes(m_text, m_parentMenu != NULL && m_parentMenu->GetNoEventsMode() ? wxStrip_Accel : wxStrip_All); if (text.IsEmpty() && !IsSeparator()) { wxASSERT_MSG(wxIsStockID(GetId()), wxT("A non-stock menu item with an empty label?")); text = wxGetStockLabel(GetId(), wxSTOCK_WITH_ACCELERATOR|wxSTOCK_WITH_MNEMONIC); } wxAcceleratorEntry *entry = wxAcceleratorEntry::Create( m_text ) ; GetPeer()->SetLabel( text, entry ); delete entry ; }
bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& lbl, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name) { wxString label(lbl); if (label.empty() && wxIsStockID(id)) { // On Windows, some buttons aren't supposed to have // mnemonics, so strip them out. label = wxGetStockLabel(id #if defined(__WXMSW__) || defined(__WXWINCE__) , ( id != wxID_OK && id != wxID_CANCEL && id != wxID_CLOSE ) #endif ); } if ( !CreateControl(parent, id, pos, size, style, validator, name) ) return false; WXDWORD exstyle; WXDWORD msStyle = MSWGetStyle(style, &exstyle); #ifdef __WIN32__ // if the label contains several lines we must explicitly tell the button // about it or it wouldn't draw it correctly ("\n"s would just appear as // black boxes) // // NB: we do it here and not in MSWGetStyle() because we need the label // value and m_label is not set yet when MSWGetStyle() is called; // besides changing BS_MULTILINE during run-time is pointless anyhow if ( label.find(_T('\n')) != wxString::npos ) { msStyle |= BS_MULTILINE; } #endif // __WIN32__ return MSWCreateControl(_T("BUTTON"), msStyle, pos, size, label, exstyle); }
bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxBitmap& bitmap, const wxString &lbl, const wxPoint &pos, const wxSize &size, long style, const wxValidator& validator, const wxString &name) { wxString label(lbl); if (label.empty() && wxIsStockID(id)) label = wxGetStockLabel(id); long ctrl_style = style & ~wxBU_ALIGN_MASK; ctrl_style = ctrl_style & ~wxALIGN_MASK; if((style & wxBU_RIGHT) == wxBU_RIGHT) ctrl_style |= wxALIGN_RIGHT; else if((style & wxBU_LEFT) == wxBU_LEFT) ctrl_style |= wxALIGN_LEFT; else ctrl_style |= wxALIGN_CENTRE_HORIZONTAL; if((style & wxBU_TOP) == wxBU_TOP) ctrl_style |= wxALIGN_TOP; else if((style & wxBU_BOTTOM) == wxBU_BOTTOM) ctrl_style |= wxALIGN_BOTTOM; else ctrl_style |= wxALIGN_CENTRE_VERTICAL; if ( !wxControl::Create(parent, id, pos, size, ctrl_style, validator, name) ) return false; SetLabel(label); if (bitmap.IsOk()) SetBitmap(bitmap); // SetInitialSize called by SetBitmap() else SetInitialSize(size); CreateInputHandler(wxINP_HANDLER_BUTTON); return true; }
bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxBitmap& bitmap, const wxString &lbl, const wxPoint &pos, const wxSize &size, long style, const wxValidator& validator, const wxString &name) { wxString label(lbl); if (label.empty() && wxIsStockID(id)) label = wxGetStockLabel(id); long ctrl_style = style & !wxBU_ALIGN_MASK; wxASSERT_MSG( (ctrl_style & wxALIGN_MASK) == 0, _T("Some style conflicts with align flags") ); if((style & wxBU_RIGHT) == wxBU_RIGHT) ctrl_style |= wxALIGN_RIGHT; else if((style & wxBU_LEFT) == wxBU_LEFT) ctrl_style |= wxALIGN_LEFT; else ctrl_style |= wxALIGN_CENTRE_HORIZONTAL; if((style & wxBU_TOP) == wxBU_TOP) ctrl_style |= wxALIGN_TOP; else if((style & wxBU_BOTTOM) == wxBU_BOTTOM) ctrl_style |= wxALIGN_BOTTOM; else ctrl_style |= wxALIGN_CENTRE_VERTICAL; if ( !wxControl::Create(parent, id, pos, size, ctrl_style, validator, name) ) return false; SetLabel(label); SetImageLabel(bitmap); // SetBestSize(size); -- called by SetImageLabel() CreateInputHandler(wxINP_HANDLER_BUTTON); return true; }
bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& lbl, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name) { wxString label; if ( !(style & wxBU_NOTEXT) ) { label = lbl; if (label.empty() && wxIsStockID(id)) { // On Windows, some buttons aren't supposed to have mnemonics label = wxGetStockLabel ( id, id == wxID_OK || id == wxID_CANCEL || id == wxID_CLOSE ? wxSTOCK_NOFLAGS : wxSTOCK_WITH_MNEMONIC ); } } if ( !CreateControl(parent, id, pos, size, style, validator, name) ) return false; WXDWORD exstyle; WXDWORD msStyle = MSWGetStyle(style, &exstyle); // if the label contains several lines we must explicitly tell the button // about it or it wouldn't draw it correctly ("\n"s would just appear as // black boxes) // // NB: we do it here and not in MSWGetStyle() because we need the label // value and the label is not set yet when MSWGetStyle() is called msStyle |= wxMSWButton::GetMultilineStyle(label); return MSWCreateControl(wxT("BUTTON"), msStyle, pos, size, label, exstyle); }
void wxMenuItem::UpdateItemText() { if ( !m_parentMenu ) return ; MenuHandle mhandle = MAC_WXHMENU(m_parentMenu->GetHMenu()) ; MenuItemIndex index = m_parentMenu->MacGetIndexFromItem( this ) ; if (mhandle == NULL || index == 0) return ; wxString text = m_text; if (text.IsEmpty() && !IsSeparator()) { wxASSERT_MSG(wxIsStockID(GetId()), wxT("A non-stock menu item with an empty label?")); text = wxGetStockLabel(GetId(), wxSTOCK_WITH_ACCELERATOR|wxSTOCK_WITH_MNEMONIC); } UMASetMenuItemText( mhandle , index , wxStripMenuCodes(text) , wxFont::GetDefaultEncoding() ) ; wxAcceleratorEntry *entry = wxAcceleratorEntry::Create( text ) ; UMASetMenuItemShortcut( mhandle , index , entry ) ; delete entry ; }
bool wxButton::Create( wxWindow* pParent, wxWindowID vId, const wxString& rsLbl, const wxPoint& rPos, const wxSize& rSize, long lStyle, const wxValidator& rValidator, const wxString& rsName) { wxString rsLabel(rsLbl); if (rsLabel.empty() && wxIsStockID(vId)) rsLabel = wxGetStockLabel(vId); wxString sLabel = ::wxPMTextToLabel(rsLabel); SetName(rsName); #if wxUSE_VALIDATORS SetValidator(rValidator); #endif m_windowStyle = lStyle; pParent->AddChild((wxButton *)this); if (vId == -1) m_windowId = NewControlId(); else m_windowId = vId; lStyle = WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON; // // OS/2 PM does not have Right/Left/Top/Bottom styles. // We will have to define an additional style when we implement notebooks // for a notebook page button // if (m_windowStyle & wxCLIP_SIBLINGS ) lStyle |= WS_CLIPSIBLINGS; m_hWnd = (WXHWND)::WinCreateWindow( GetHwndOf(pParent) // Parent handle ,WC_BUTTON // A Button class window ,(PSZ)sLabel.c_str() // Button text ,lStyle // Button style ,0, 0, 0, 0 // Location and size ,GetHwndOf(pParent) // Owner handle ,HWND_TOP // Top of Z-Order ,vId // Identifier ,NULL // No control data ,NULL // No Presentation parameters ); if (m_hWnd == 0) { return false; } // // Subclass again for purposes of dialog editing mode // SubclassWin(m_hWnd); wxFont* pButtonFont = new wxFont( 8 ,wxSWISS ,wxNORMAL ,wxNORMAL ); SetFont(*pButtonFont); SetXComp(0); SetYComp(0); SetSize( rPos.x ,rPos.y ,rSize.x ,rSize.y ); delete pButtonFont; return true; } // end of wxButton::Create
void wxMenuItem::CreateItem (WXWidget menu, wxMenuBar * menuBar, wxMenu * topMenu, size_t index) { m_menuBar = menuBar; m_topMenu = topMenu; if (GetId() == -3) { // Id=-3 identifies a Title item. m_buttonWidget = (WXWidget) XtVaCreateManagedWidget (wxStripMenuCodes(m_text), xmLabelGadgetClass, (Widget) menu, NULL); } else if (!IsSeparator() && !m_subMenu) { wxString txt = m_text; if (m_text.IsEmpty()) { wxASSERT_MSG(wxIsStockID(GetId()), wxT("A non-stock menu item with an empty label?")); txt = wxGetStockLabel(GetId(), wxSTOCK_WITH_ACCELERATOR|wxSTOCK_WITH_MNEMONIC); } wxString strName = wxStripMenuCodes(txt); if (IsCheckable()) { m_buttonWidget = (WXWidget) XtVaCreateManagedWidget (strName, xmToggleButtonGadgetClass, (Widget) menu, #ifdef XmNpositionIndex XmNpositionIndex, index, #endif NULL); XtVaSetValues ((Widget) m_buttonWidget, XmNset, (Boolean) IsChecked(), NULL); } else m_buttonWidget = (WXWidget) XtVaCreateManagedWidget (strName, xmPushButtonGadgetClass, (Widget) menu, #ifdef XmNpositionIndex XmNpositionIndex, index, #endif NULL); char mnem = wxFindMnemonic (m_text); if (mnem != 0) XtVaSetValues ((Widget) m_buttonWidget, XmNmnemonic, mnem, NULL); //// TODO: proper accelerator treatment. What does wxFindAccelerator //// look for? strName = m_text; char *accel = wxFindAccelerator (strName); if (accel) XtVaSetValues ((Widget) m_buttonWidget, XmNaccelerator, accel, NULL); // TODO: What does this do? XmString accel_str = wxFindAcceleratorText (strName); if (accel_str) { XtVaSetValues ((Widget) m_buttonWidget, XmNacceleratorText, accel_str, NULL); XmStringFree (accel_str); } if (IsCheckable()) XtAddCallback ((Widget) m_buttonWidget, XmNvalueChangedCallback, (XtCallbackProc) wxMenuItemCallback, (XtPointer) this); else XtAddCallback ((Widget) m_buttonWidget, XmNactivateCallback, (XtCallbackProc) wxMenuItemCallback, (XtPointer) this); XtAddCallback ((Widget) m_buttonWidget, XmNarmCallback, (XtCallbackProc) wxMenuItemArmCallback, (XtPointer) this); XtAddCallback ((Widget) m_buttonWidget, XmNdisarmCallback, (XtCallbackProc) wxMenuItemDisarmCallback, (XtPointer) this); } else if (IsSeparator()) { m_buttonWidget = (WXWidget) XtVaCreateManagedWidget ("separator", xmSeparatorGadgetClass, (Widget) menu, #ifndef XmNpositionIndex XmNpositionIndex, index, #endif NULL); } else if (m_subMenu) { m_buttonWidget = m_subMenu->CreateMenu (menuBar, menu, topMenu, index, m_text, true); m_subMenu->SetButtonWidget(m_buttonWidget); XtAddCallback ((Widget) m_buttonWidget, XmNcascadingCallback, (XtCallbackProc) wxMenuItemArmCallback, (XtPointer) this); } if (m_buttonWidget) XtSetSensitive ((Widget) m_buttonWidget, (Boolean) IsEnabled()); }
bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString &label, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name) { if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, validator, name )) { wxFAIL_MSG( wxT("wxButton creation failed") ); return false; } // create either a standard button with text label (which may still contain // an image under GTK+ 2.6+) or a bitmap-only button if we don't have any // label const bool useLabel = !(style & wxBU_NOTEXT) && (!label.empty() || wxIsStockID(id)); if ( useLabel ) { m_widget = gtk_button_new_with_mnemonic(""); } else // no label, suppose we will have a bitmap { m_widget = gtk_button_new(); GtkWidget *image = gtk_image_new(); gtk_widget_show(image); gtk_container_add(GTK_CONTAINER(m_widget), image); } g_object_ref(m_widget); float x_alignment = 0.5; if (HasFlag(wxBU_LEFT)) x_alignment = 0.0; else if (HasFlag(wxBU_RIGHT)) x_alignment = 1.0; float y_alignment = 0.5; if (HasFlag(wxBU_TOP)) y_alignment = 0.0; else if (HasFlag(wxBU_BOTTOM)) y_alignment = 1.0; gtk_button_set_alignment(GTK_BUTTON(m_widget), x_alignment, y_alignment); if ( useLabel ) SetLabel(label); if (style & wxNO_BORDER) gtk_button_set_relief( GTK_BUTTON(m_widget), GTK_RELIEF_NONE ); g_signal_connect_after (m_widget, "clicked", G_CALLBACK (wxgtk_button_clicked_callback), this); g_signal_connect_after (m_widget, "style_set", G_CALLBACK (wxgtk_button_style_set_callback), this); m_parent->DoAddChild( this ); PostCreation(size); return true; }
void wxMenuItem::SetItemLabel( const wxString& string ) { wxString str = string; if ( str.empty() && !IsSeparator() ) { wxASSERT_MSG(wxIsStockID(GetId()), wxT("A non-stock menu item with an empty label?")); str = wxGetStockLabel(GetId(), wxSTOCK_WITH_ACCELERATOR | wxSTOCK_WITH_MNEMONIC); } // Some optimization to avoid flicker wxString oldLabel = m_text; oldLabel = wxStripMenuCodes(oldLabel); oldLabel.Replace(wxT("_"), wxEmptyString); wxString label1 = wxStripMenuCodes(str); wxString oldhotkey = GetHotKey(); // Store the old hotkey in Ctrl-foo format wxCharBuffer oldbuf = wxGTK_CONV( GetGtkHotKey(*this) ); // and as <control>foo DoSetText(str); if (oldLabel == label1 && oldhotkey == GetHotKey()) // Make sure we can change a hotkey even if the label is unaltered return; if (m_menuItem) { GtkLabel *label; if (m_labelWidget) label = (GtkLabel*) m_labelWidget; else label = GTK_LABEL( GTK_BIN(m_menuItem)->child ); // set new text gtk_label_set( label, wxGTK_CONV( m_text ) ); // reparse key accel (void)gtk_label_parse_uline (GTK_LABEL(label), wxGTK_CONV(m_text) ); gtk_accel_label_refetch( GTK_ACCEL_LABEL(label) ); } guint accel_key; GdkModifierType accel_mods; gtk_accelerator_parse( (const char*) oldbuf, &accel_key, &accel_mods); if (accel_key != 0) { gtk_widget_remove_accelerator( GTK_WIDGET(m_menuItem), m_parentMenu->m_accel, accel_key, accel_mods ); } wxCharBuffer buf = wxGTK_CONV( GetGtkHotKey(*this) ); gtk_accelerator_parse( (const char*) buf, &accel_key, &accel_mods); if (accel_key != 0) { gtk_widget_add_accelerator( GTK_WIDGET(m_menuItem), "activate", m_parentMenu->m_accel, accel_key, accel_mods, GTK_ACCEL_VISIBLE); } }