1///////////////////////////////////////////////////////////////////////////// 2// Name: src/univ/control.cpp 3// Purpose: universal wxControl: adds handling of mnemonics 4// Author: Vadim Zeitlin 5// Modified by: 6// Created: 14.08.00 7// RCS-ID: $Id: control.cpp 41183 2006-09-12 22:20:15Z VZ $ 8// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) 9// Licence: wxWindows licence 10///////////////////////////////////////////////////////////////////////////// 11 12// ============================================================================ 13// declarations 14// ============================================================================ 15 16// ---------------------------------------------------------------------------- 17// headers 18// ---------------------------------------------------------------------------- 19 20#include "wx/wxprec.h" 21 22#ifdef __BORLANDC__ 23 #pragma hdrstop 24#endif 25 26#if wxUSE_CONTROLS 27 28#include "wx/control.h" 29 30#ifndef WX_PRECOMP 31 #include "wx/app.h" 32 #include "wx/dcclient.h" 33#endif 34 35#include "wx/univ/renderer.h" 36#include "wx/univ/inphand.h" 37#include "wx/univ/theme.h" 38 39// ============================================================================ 40// implementation 41// ============================================================================ 42 43IMPLEMENT_DYNAMIC_CLASS(wxControl, wxWindow) 44 45BEGIN_EVENT_TABLE(wxControl, wxControlBase) 46 WX_EVENT_TABLE_INPUT_CONSUMER(wxControl) 47END_EVENT_TABLE() 48 49WX_FORWARD_TO_INPUT_CONSUMER(wxControl) 50 51// ---------------------------------------------------------------------------- 52// creation 53// ---------------------------------------------------------------------------- 54 55void wxControl::Init() 56{ 57 m_indexAccel = -1; 58} 59 60bool wxControl::Create(wxWindow *parent, 61 wxWindowID id, 62 const wxPoint& pos, 63 const wxSize& size, 64 long style, 65 const wxValidator& validator, 66 const wxString& name) 67{ 68 if ( !wxControlBase::Create(parent, id, pos, size, style, validator, name) ) 69 { 70 // underlying window creation failed? 71 return false; 72 } 73 74 return true; 75} 76 77// ---------------------------------------------------------------------------- 78// mnemonics handling 79// ---------------------------------------------------------------------------- 80 81/* static */ 82int wxControl::FindAccelIndex(const wxString& label, wxString *labelOnly) 83{ 84 // the character following MNEMONIC_PREFIX is the accelerator for this 85 // control unless it is MNEMONIC_PREFIX too - this allows to insert 86 // literal MNEMONIC_PREFIX chars into the label 87 static const wxChar MNEMONIC_PREFIX = _T('&'); 88 89 if ( labelOnly ) 90 { 91 labelOnly->Empty(); 92 labelOnly->Alloc(label.length()); 93 } 94 95 int indexAccel = -1; 96 for ( const wxChar *pc = label; *pc != wxT('\0'); pc++ ) 97 { 98 if ( *pc == MNEMONIC_PREFIX ) 99 { 100 pc++; // skip it 101 if ( *pc != MNEMONIC_PREFIX ) 102 { 103 if ( indexAccel == -1 ) 104 { 105 // remember it (-1 is for MNEMONIC_PREFIX itself 106 indexAccel = pc - label.c_str() - 1; 107 } 108 else 109 { 110 wxFAIL_MSG(_T("duplicate accel char in control label")); 111 } 112 } 113 } 114 115 if ( labelOnly ) 116 { 117 *labelOnly += *pc; 118 } 119 } 120 121 return indexAccel; 122} 123 124void wxControl::SetLabel(const wxString& label) 125{ 126 wxString labelOld = m_label; 127 m_indexAccel = FindAccelIndex(label, &m_label); 128 129 if ( m_label != labelOld ) 130 { 131 Refresh(); 132 } 133} 134 135wxString wxControl::GetLabel() const 136{ 137 return m_label; 138} 139 140#endif // wxUSE_CONTROLS 141