1 // Scintilla source code edit control 
   2 // PlatWX.cxx - implementation of platform facilities on wxWindows 
   3 // Copyright 1998-1999 by Neil Hodgson <neilh@scintilla.org> 
   4 //                        Robin Dunn <robin@aldunn.com> 
   5 // The License.txt file describes the conditions under which this software may be distributed. 
  10 #include <wx/encconv.h> 
  15 #include "wx/stc/stc.h" 
  23 Point 
Point::FromLong(long lpoint
) { 
  24     return Point(lpoint 
& 0xFFFF, lpoint 
>> 16); 
  27 wxRect 
wxRectFromPRectangle(PRectangle prc
) { 
  28     wxRect 
rc(prc
.left
, prc
.top
, 
  29               prc
.right
-prc
.left
, prc
.bottom
-prc
.top
); 
  33 PRectangle 
PRectangleFromwxRect(wxRect rc
) { 
  34     return PRectangle(rc
.GetLeft(), rc
.GetTop(), 
  35                       rc
.GetRight()+1, rc
.GetBottom()+1); 
  38 wxColour 
wxColourFromCA(const ColourAllocated
& ca
) { 
  39     ColourDesired 
cd(ca
.AsLong()); 
  40     return wxColour(cd
.GetRed(), cd
.GetGreen(), cd
.GetBlue()); 
  43 //---------------------------------------------------------------------- 
  47     allowRealization 
= false; 
  54 void Palette::Release() { 
  58 // This method either adds a colour to the list of wanted colours (want==true) 
  59 // or retrieves the allocated colour back to the ColourPair. 
  60 // This is one method to make it easier to keep the code for wanting and retrieving in sync. 
  61 void Palette::WantFind(ColourPair 
&cp
, bool want
) { 
  63         for (int i
=0; i 
< used
; i
++) { 
  64             if (entries
[i
].desired 
== cp
.desired
) 
  68         if (used 
< numEntries
) { 
  69             entries
[used
].desired 
= cp
.desired
; 
  70             entries
[used
].allocated
.Set(cp
.desired
.AsLong()); 
  74         for (int i
=0; i 
< used
; i
++) { 
  75             if (entries
[i
].desired 
== cp
.desired
) { 
  76                 cp
.allocated 
= entries
[i
].allocated
; 
  80         cp
.allocated
.Set(cp
.desired
.AsLong()); 
  84 void Palette::Allocate(Window 
&) { 
  85     if (allowRealization
) { 
  90 //---------------------------------------------------------------------- 
 100 void Font::Create(const char *faceName
, int characterSet
, int size
, bool bold
, bool italic
) { 
 101     wxFontEncoding encoding
; 
 105     switch (characterSet
) { 
 107         case wxSTC_CHARSET_ANSI
: 
 108         case wxSTC_CHARSET_DEFAULT
: 
 109             encoding 
= wxFONTENCODING_DEFAULT
; 
 112         case wxSTC_CHARSET_BALTIC
: 
 113             encoding 
= wxFONTENCODING_ISO8859_13
; 
 116         case wxSTC_CHARSET_CHINESEBIG5
: 
 117             encoding 
= wxFONTENCODING_CP950
; 
 120         case wxSTC_CHARSET_EASTEUROPE
: 
 121             encoding 
= wxFONTENCODING_ISO8859_2
; 
 124         case wxSTC_CHARSET_GB2312
: 
 125             encoding 
= wxFONTENCODING_CP936
; 
 128         case wxSTC_CHARSET_GREEK
: 
 129             encoding 
= wxFONTENCODING_ISO8859_7
; 
 132         case wxSTC_CHARSET_HANGUL
: 
 133             encoding 
= wxFONTENCODING_CP949
; 
 136         case wxSTC_CHARSET_MAC
: 
 137             encoding 
= wxFONTENCODING_DEFAULT
; 
 140         case wxSTC_CHARSET_OEM
: 
 141             encoding 
= wxFONTENCODING_DEFAULT
; 
 144         case wxSTC_CHARSET_RUSSIAN
: 
 145             encoding 
= wxFONTENCODING_KOI8
; 
 148         case wxSTC_CHARSET_SHIFTJIS
: 
 149             encoding 
= wxFONTENCODING_CP932
; 
 152         case wxSTC_CHARSET_SYMBOL
: 
 153             encoding 
= wxFONTENCODING_DEFAULT
; 
 156         case wxSTC_CHARSET_TURKISH
: 
 157             encoding 
= wxFONTENCODING_ISO8859_9
; 
 160         case wxSTC_CHARSET_JOHAB
: 
 161             encoding 
= wxFONTENCODING_DEFAULT
; 
 164         case wxSTC_CHARSET_HEBREW
: 
 165             encoding 
= wxFONTENCODING_ISO8859_8
; 
 168         case wxSTC_CHARSET_ARABIC
: 
 169             encoding 
= wxFONTENCODING_ISO8859_6
; 
 172         case wxSTC_CHARSET_VIETNAMESE
: 
 173             encoding 
= wxFONTENCODING_DEFAULT
; 
 176         case wxSTC_CHARSET_THAI
: 
 177             encoding 
= wxFONTENCODING_ISO8859_11
; 
 181     wxFontEncodingArray ea 
= wxEncodingConverter::GetPlatformEquivalents(encoding
); 
 185     id 
= new wxFont(size
, 
 187                     italic 
? wxITALIC 
:  wxNORMAL
, 
 188                     bold 
? wxBOLD 
: wxNORMAL
, 
 195 void Font::Release() { 
 201 //---------------------------------------------------------------------- 
 203 class SurfaceImpl 
: public Surface 
{ 
 217     void Init(SurfaceID sid
); 
 218     void InitPixMap(int width
, int height
, Surface 
*surface_
); 
 222     void PenColour(ColourAllocated fore
); 
 224     int DeviceHeightFont(int points
); 
 225     void MoveTo(int x_
, int y_
); 
 226     void LineTo(int x_
, int y_
); 
 227     void Polygon(Point 
*pts
, int npts
, ColourAllocated fore
, ColourAllocated back
); 
 228     void RectangleDraw(PRectangle rc
, ColourAllocated fore
, ColourAllocated back
); 
 229     void FillRectangle(PRectangle rc
, ColourAllocated back
); 
 230     void FillRectangle(PRectangle rc
, Surface 
&surfacePattern
); 
 231     void RoundedRectangle(PRectangle rc
, ColourAllocated fore
, ColourAllocated back
); 
 232     void Ellipse(PRectangle rc
, ColourAllocated fore
, ColourAllocated back
); 
 233     void Copy(PRectangle rc
, Point from
, Surface 
&surfaceSource
); 
 235     void DrawTextNoClip(PRectangle rc
, Font 
&font_
, int ybase
, const char *s
, int len
, ColourAllocated fore
, ColourAllocated back
); 
 236     void DrawTextClipped(PRectangle rc
, Font 
&font_
, int ybase
, const char *s
, int len
, ColourAllocated fore
, ColourAllocated back
); 
 237     void MeasureWidths(Font 
&font_
, const char *s
, int len
, int *positions
); 
 238     int WidthText(Font 
&font_
, const char *s
, int len
); 
 239     int WidthChar(Font 
&font_
, char ch
); 
 240     int Ascent(Font 
&font_
); 
 241     int Descent(Font 
&font_
); 
 242     int InternalLeading(Font 
&font_
); 
 243     int ExternalLeading(Font 
&font_
); 
 244     int Height(Font 
&font_
); 
 245     int AverageCharWidth(Font 
&font_
); 
 247     int SetPalette(Palette 
*pal
, bool inBackGround
); 
 248     void SetClip(PRectangle rc
); 
 249     void FlushCachedState(); 
 251     void SetUnicodeMode(bool unicodeMode_
); 
 253     void BrushColour(ColourAllocated back
); 
 254     void SetFont(Font 
&font_
); 
 259 SurfaceImpl::SurfaceImpl() : 
 260     hdc(0), hdcOwned(0), bitmap(0), 
 261     x(0), y(0), unicodeMode(0) 
 264 SurfaceImpl::~SurfaceImpl() { 
 268 void SurfaceImpl::Release() { 
 270         ((wxMemoryDC
*)hdc
)->SelectObject(wxNullBitmap
); 
 282 bool SurfaceImpl::Initialised() { 
 286 void SurfaceImpl::Init() { 
 289     hdc 
= new wxMemoryDC(); 
 292     // On Mac and GTK the DC is not really valid until it has a bitmap 
 293     // selected into it.  So instead of just creating the DC with no bitmap, 
 294     // go ahead and give it one. 
 295     InitPixMap(1,1,NULL
); 
 299 void SurfaceImpl::Init(SurfaceID hdc_
) { 
 304 void SurfaceImpl::InitPixMap(int width
, int height
, Surface 
*surface_
) { 
 306     hdc 
= new wxMemoryDC(); 
 308     if (width 
< 1) width 
= 1; 
 309     if (height 
< 1) height 
= 1; 
 310     bitmap 
= new wxBitmap(width
, height
); 
 311     ((wxMemoryDC
*)hdc
)->SelectObject(*bitmap
); 
 314 void SurfaceImpl::PenColour(ColourAllocated fore
) { 
 315     hdc
->SetPen(wxPen(wxColourFromCA(fore
), 1, wxSOLID
)); 
 318 void SurfaceImpl::BrushColour(ColourAllocated back
) { 
 319     hdc
->SetBrush(wxBrush(wxColourFromCA(back
), wxSOLID
)); 
 322 void SurfaceImpl::SetFont(Font 
&font_
) { 
 324       hdc
->SetFont(*((wxFont
*)font_
.GetID())); 
 328 int SurfaceImpl::LogPixelsY() { 
 329     return hdc
->GetPPI().y
; 
 332 int SurfaceImpl::DeviceHeightFont(int points
) { 
 336 void SurfaceImpl::MoveTo(int x_
, int y_
) { 
 341 void SurfaceImpl::LineTo(int x_
, int y_
) { 
 342     hdc
->DrawLine(x
,y
, x_
,y_
); 
 347 void SurfaceImpl::Polygon(Point 
*pts
, int npts
, ColourAllocated fore
, ColourAllocated back
) { 
 350     hdc
->DrawPolygon(npts
, (wxPoint
*)pts
); 
 353 void SurfaceImpl::RectangleDraw(PRectangle rc
, ColourAllocated fore
, ColourAllocated back
) { 
 356     hdc
->DrawRectangle(wxRectFromPRectangle(rc
)); 
 359 void SurfaceImpl::FillRectangle(PRectangle rc
, ColourAllocated back
) { 
 361     hdc
->SetPen(*wxTRANSPARENT_PEN
); 
 362     hdc
->DrawRectangle(wxRectFromPRectangle(rc
)); 
 365 void SurfaceImpl::FillRectangle(PRectangle rc
, Surface 
&surfacePattern
) { 
 367     if (((SurfaceImpl
&)surfacePattern
).bitmap
) 
 368         br 
= wxBrush(*((SurfaceImpl
&)surfacePattern
).bitmap
); 
 369     else    // Something is wrong so display in red 
 370         br 
= wxBrush(*wxRED
, wxSOLID
); 
 371     hdc
->SetPen(*wxTRANSPARENT_PEN
); 
 373     hdc
->DrawRectangle(wxRectFromPRectangle(rc
)); 
 376 void SurfaceImpl::RoundedRectangle(PRectangle rc
, ColourAllocated fore
, ColourAllocated back
) { 
 379     hdc
->DrawRoundedRectangle(wxRectFromPRectangle(rc
), 4); 
 382 void SurfaceImpl::Ellipse(PRectangle rc
, ColourAllocated fore
, ColourAllocated back
) { 
 385     hdc
->DrawEllipse(wxRectFromPRectangle(rc
)); 
 388 void SurfaceImpl::Copy(PRectangle rc
, Point from
, Surface 
&surfaceSource
) { 
 389     wxRect r 
= wxRectFromPRectangle(rc
); 
 390     hdc
->Blit(r
.x
, r
.y
, r
.width
, r
.height
, 
 391               ((SurfaceImpl
&)surfaceSource
).hdc
, 
 392               from
.x
, from
.y
, wxCOPY
); 
 395 void SurfaceImpl::DrawTextNoClip(PRectangle rc
, Font 
&font
, int ybase
, 
 396                                  const char *s
, int len
, 
 397                                  ColourAllocated fore
, ColourAllocated back
) { 
 399     hdc
->SetTextForeground(wxColourFromCA(fore
)); 
 400     hdc
->SetTextBackground(wxColourFromCA(back
)); 
 401     FillRectangle(rc
, back
); 
 403     // ybase is where the baseline should be, but wxWin uses the upper left 
 404     // corner, so I need to calculate the real position for the text... 
 405     hdc
->DrawText(stc2wx(s
, len
), rc
.left
, ybase 
- font
.ascent
); 
 408 void SurfaceImpl::DrawTextClipped(PRectangle rc
, Font 
&font
, int ybase
, 
 409                                   const char *s
, int len
, 
 410                                   ColourAllocated fore
, ColourAllocated back
) { 
 412     hdc
->SetTextForeground(wxColourFromCA(fore
)); 
 413     hdc
->SetTextBackground(wxColourFromCA(back
)); 
 414     FillRectangle(rc
, back
); 
 415     hdc
->SetClippingRegion(wxRectFromPRectangle(rc
)); 
 417     // see comments above 
 418     hdc
->DrawText(stc2wx(s
, len
), rc
.left
, ybase 
- font
.ascent
); 
 419     hdc
->DestroyClippingRegion(); 
 422 int SurfaceImpl::WidthText(Font 
&font
, const char *s
, int len
) { 
 427     hdc
->GetTextExtent(stc2wx(s
, len
), &w
, &h
); 
 432 void SurfaceImpl::MeasureWidths(Font 
&font
, const char *s
, int len
, int *positions
) { 
 433     wxString str 
= stc2wx(s
, len
); 
 436     // Calculate the position of each character based on the widths of 
 437     // the previous characters 
 438     int* tpos 
= new int[len
]; 
 441     for (i
=0; i
<str
.Length(); i
++) { 
 443         hdc
->GetTextExtent(str
[i
], &w
, &h
); 
 445         tpos
[i
] = totalWidth
; 
 449     // Map the widths for UCS-2 characters back to the UTF-8 input string 
 453         unsigned char uch 
= (unsigned char)s
[i
]; 
 454         positions
[i
++] = tpos
[ui
]; 
 456             if (uch 
< (0x80 + 0x40 + 0x20)) { 
 457                 positions
[i
++] = tpos
[ui
]; 
 459                 positions
[i
++] = tpos
[ui
]; 
 460                 positions
[i
++] = tpos
[ui
]; 
 467     // If not unicode then just use the widths we have 
 468     memcpy(positions
, tpos
, len 
* sizeof(*tpos
)); 
 475 int SurfaceImpl::WidthChar(Font 
&font
, char ch
) { 
 479     char s
[2] = { ch
, 0 }; 
 481     hdc
->GetTextExtent(stc2wx(s
, 1), &w
, &h
); 
 485 #define EXTENT_TEST wxT(" `~!@#$%^&*()-_=+\\|[]{};:\"\'<,>.?/1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") 
 487 int SurfaceImpl::Ascent(Font 
&font
) { 
 490     hdc
->GetTextExtent(EXTENT_TEST
, &w
, &h
, &d
, &e
); 
 495 int SurfaceImpl::Descent(Font 
&font
) { 
 498     hdc
->GetTextExtent(EXTENT_TEST
, &w
, &h
, &d
, &e
); 
 502 int SurfaceImpl::InternalLeading(Font 
&font
) { 
 506 int SurfaceImpl::ExternalLeading(Font 
&font
) { 
 509     hdc
->GetTextExtent(EXTENT_TEST
, &w
, &h
, &d
, &e
); 
 513 int SurfaceImpl::Height(Font 
&font
) { 
 515     return hdc
->GetCharHeight(); 
 518 int SurfaceImpl::AverageCharWidth(Font 
&font
) { 
 520     return hdc
->GetCharWidth(); 
 523 int SurfaceImpl::SetPalette(Palette 
*pal
, bool inBackGround
) { 
 527 void SurfaceImpl::SetClip(PRectangle rc
) { 
 528     hdc
->SetClippingRegion(wxRectFromPRectangle(rc
)); 
 531 void SurfaceImpl::FlushCachedState() { 
 534 void SurfaceImpl::SetUnicodeMode(bool unicodeMode_
) { 
 535     unicodeMode
=unicodeMode_
; 
 537     wxASSERT_MSG(unicodeMode 
== wxUSE_UNICODE
, 
 538                  wxT("Only unicode may be used when wxUSE_UNICODE is on.")); 
 540     wxASSERT_MSG(unicodeMode 
== wxUSE_UNICODE
, 
 541                  wxT("Only non-unicode may be used when wxUSE_UNICODE is off.")); 
 545 Surface 
*Surface::Allocate() { 
 546     return new SurfaceImpl
; 
 550 //---------------------------------------------------------------------- 
 553 inline wxWindow
* GETWIN(WindowID id
) { return (wxWindow
*)id
; } 
 558 void Window::Destroy() { 
 560         GETWIN(id
)->Destroy(); 
 564 bool Window::HasFocus() { 
 565     return wxWindow::FindFocus() == GETWIN(id
); 
 568 PRectangle 
Window::GetPosition() { 
 569     wxRect 
rc(GETWIN(id
)->GetPosition(), GETWIN(id
)->GetSize()); 
 570     return PRectangleFromwxRect(rc
); 
 573 void Window::SetPosition(PRectangle rc
) { 
 574     wxRect r 
= wxRectFromPRectangle(rc
); 
 575     GETWIN(id
)->SetSize(r
); 
 578 void Window::SetPositionRelative(PRectangle rc
, Window
) { 
 579     SetPosition(rc
);  // ???? 
 582 PRectangle 
Window::GetClientPosition() { 
 583     wxSize sz 
= GETWIN(id
)->GetClientSize(); 
 584     return  PRectangle(0, 0, sz
.x
, sz
.y
); 
 587 void Window::Show(bool show
) { 
 588     GETWIN(id
)->Show(show
); 
 591 void Window::InvalidateAll() { 
 592     GETWIN(id
)->Refresh(false); 
 596 void Window::InvalidateRectangle(PRectangle rc
) { 
 597     wxRect r 
= wxRectFromPRectangle(rc
); 
 598     GETWIN(id
)->Refresh(false, &r
); 
 602 void Window::SetFont(Font 
&font
) { 
 603     GETWIN(id
)->SetFont(*((wxFont
*)font
.GetID())); 
 606 void Window::SetCursor(Cursor curs
) { 
 611         cursorId 
= wxCURSOR_IBEAM
; 
 614         cursorId 
= wxCURSOR_ARROW
; 
 617         cursorId 
= wxCURSOR_ARROW
; // ** no up arrow...  wxCURSOR_UPARROW; 
 620         cursorId 
= wxCURSOR_WAIT
; 
 623         cursorId 
= wxCURSOR_SIZEWE
; 
 626         cursorId 
= wxCURSOR_SIZENS
; 
 628     case cursorReverseArrow
: 
 629         cursorId 
= wxCURSOR_RIGHT_ARROW
; 
 632         cursorId 
= wxCURSOR_ARROW
; 
 636        wxCursor wc 
= wxStockCursor(cursorId
) ; 
 638        wxCursor wc 
= wxCursor(cursorId
) ; 
 640        GETWIN(id
)->SetCursor(wc
); 
 644 void Window::SetTitle(const char *s
) { 
 645     GETWIN(id
)->SetTitle(stc2wx(s
)); 
 649 //---------------------------------------------------------------------- 
 650 // Helper classes for ListBox 
 653 #if 1 // defined(__WXMAC__) 
 654 class wxSTCListBoxWin 
: public wxListBox 
{ 
 656     wxSTCListBoxWin(wxWindow
* parent
, wxWindowID id
) 
 657         : wxListBox(parent
, id
, wxDefaultPosition
, wxSize(0,0), 
 658                     0, NULL
, wxLB_SINGLE 
| wxSIMPLE_BORDER
) { 
 659         SetCursor(wxCursor(wxCURSOR_ARROW
)); 
 663     void OnFocus(wxFocusEvent
& event
) { 
 664         GetParent()->SetFocus(); 
 668     wxListBox
* GetLB() { return this; } 
 671     DECLARE_EVENT_TABLE() 
 675 BEGIN_EVENT_TABLE(wxSTCListBoxWin
, wxListBox
) 
 676     EVT_SET_FOCUS(wxSTCListBoxWin::OnFocus
) 
 684 class wxSTCListBox 
: public wxListBox 
{ 
 686     wxSTCListBox(wxWindow
* parent
, wxWindowID id
) 
 687         : wxListBox(parent
, id
, wxDefaultPosition
, wxDefaultSize
, 
 688                     0, NULL
, wxLB_SINGLE 
| wxSIMPLE_BORDER 
| wxWANTS_CHARS
) 
 691     void OnKeyDown(wxKeyEvent
& event
) { 
 692         // Give the key events to the STC.  It will then update 
 693         // the listbox as needed. 
 694         GetGrandParent()->GetEventHandler()->ProcessEvent(event
); 
 698     DECLARE_EVENT_TABLE() 
 701 BEGIN_EVENT_TABLE(wxSTCListBox
, wxListBox
) 
 702     EVT_KEY_DOWN(wxSTCListBox::OnKeyDown
) 
 703     EVT_CHAR(wxSTCListBox::OnKeyDown
) 
 708 #undef  wxSTC_USE_POPUP 
 709 #define wxSTC_USE_POPUP 0  // wxPopupWindow just doesn't work well in this case... 
 711 // A window to place the listbox upon.  If wxPopupWindow is supported then 
 712 // that will be used so the listbox can extend beyond the client area of the 
 714 #if wxUSE_POPUPWIN && wxSTC_USE_POPUP 
 715 #include <wx/popupwin.h> 
 716 #define wxSTCListBoxWinBase wxPopupWindow 
 717 #define param2  wxBORDER_NONE  // popup's 2nd param is flags 
 719 #define wxSTCListBoxWinBase wxWindow 
 720 #define param2 -1 // wxWindow's 2nd param is ID 
 723 class wxSTCListBoxWin 
: public wxSTCListBoxWinBase 
{ 
 725     wxSTCListBoxWin(wxWindow
* parent
, wxWindowID id
) 
 726         : wxSTCListBoxWinBase(parent
, param2
) { 
 727         lb 
= new wxSTCListBox(this, id
); 
 728         lb
->SetCursor(wxCursor(wxCURSOR_ARROW
)); 
 732     void OnSize(wxSizeEvent
& event
) { 
 733         lb
->SetSize(GetSize()); 
 736     wxListBox
* GetLB() { return lb
; } 
 738 #if wxUSE_POPUPWIN && wxSTC_USE_POPUP 
 739     virtual void DoSetSize(int x
, int y
, 
 740                            int width
, int height
, 
 741                            int sizeFlags 
= wxSIZE_AUTO
) { 
 743             GetParent()->ClientToScreen(&x
, NULL
); 
 745             GetParent()->ClientToScreen(NULL
, &y
); 
 746         wxSTCListBoxWinBase::DoSetSize(x
, y
, width
, height
, sizeFlags
); 
 752     DECLARE_EVENT_TABLE() 
 755 BEGIN_EVENT_TABLE(wxSTCListBoxWin
, wxSTCListBoxWinBase
) 
 756     EVT_SIZE(wxSTCListBoxWin::OnSize
) 
 760 inline wxListBox
* GETLB(WindowID win
) { 
 761     return (((wxSTCListBoxWin
*)win
)->GetLB()); 
 764 //---------------------------------------------------------------------- 
 769 ListBox::~ListBox() { 
 772 void ListBox::Create(Window 
&parent
, int ctrlID
) { 
 773     id 
= new wxSTCListBoxWin(GETWIN(parent
.GetID()), ctrlID
); 
 776 void ListBox::SetVisibleRows(int rows
) { 
 777     desiredVisibleRows 
= rows
; 
 780 PRectangle 
ListBox::GetDesiredRect() { 
 781     wxSize sz 
= GETLB(id
)->GetBestSize(); 
 787     if (sz
.y 
> 140)  // TODO:  Use desiredVisibleRows?? 
 794 void ListBox::SetAverageCharWidth(int width
) { 
 795     aveCharWidth 
= width
; 
 798 void ListBox::SetFont(Font 
&font
) { 
 799     GETLB(id
)->SetFont(*((wxFont
*)font
.GetID())); 
 802 void ListBox::Clear() { 
 806 void ListBox::Append(char *s
) { 
 807     GETLB(id
)->Append(s
); 
 810 int ListBox::Length() { 
 811     return GETLB(id
)->GetCount(); 
 814 void ListBox::Select(int n
) { 
 815     GETLB(id
)->SetSelection(n
); 
 821     GETLB(id
)->SetFirstItem(n
); 
 825 int ListBox::GetSelection() { 
 826     return GETLB(id
)->GetSelection(); 
 829 int ListBox::Find(const char *prefix
) { 
 834 void ListBox::GetValue(int n
, char *value
, int len
) { 
 835     wxString text 
= GETLB(id
)->GetString(n
); 
 836     strncpy(value
, wx2stc(text
), len
); 
 840 void ListBox::Sort() { 
 843 //---------------------------------------------------------------------- 
 845 Menu::Menu() : id(0) { 
 848 void Menu::CreatePopUp() { 
 853 void Menu::Destroy() { 
 859 void Menu::Show(Point pt
, Window 
&w
) { 
 860     GETWIN(w
.GetID())->PopupMenu((wxMenu
*)id
, pt
.x 
- 4, pt
.y
); 
 864 //---------------------------------------------------------------------- 
 866 ColourDesired 
Platform::Chrome() { 
 868     c 
= wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE
); 
 869     return ColourDesired(c
.Red(), c
.Green(), c
.Blue()); 
 872 ColourDesired 
Platform::ChromeHighlight() { 
 874     c 
= wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT
); 
 875     return ColourDesired(c
.Red(), c
.Green(), c
.Blue()); 
 878 const char *Platform::DefaultFont() { 
 879     static char buf
[128]; 
 880     strcpy(buf
, wxNORMAL_FONT
->GetFaceName().mbc_str()); 
 884 int Platform::DefaultFontSize() { 
 888 unsigned int Platform::DoubleClickTime() { 
 889     return 500;   // **** ::GetDoubleClickTime(); 
 892 void Platform::DebugDisplay(const char *s
) { 
 893     wxLogDebug(stc2wx(s
)); 
 896 bool Platform::IsKeyDown(int key
) { 
 897     return false;  // I don't think we'll need this. 
 900 long Platform::SendScintilla(WindowID w
, 
 902                              unsigned long wParam
, 
 905     wxStyledTextCtrl
* stc 
= (wxStyledTextCtrl
*)w
; 
 906     return stc
->SendMsg(msg
, wParam
, lParam
); 
 909 long Platform::SendScintillaPointer(WindowID w
, 
 911                                     unsigned long wParam
, 
 914     wxStyledTextCtrl
* stc 
= (wxStyledTextCtrl
*)w
; 
 915     return stc
->SendMsg(msg
, wParam
, (long)lParam
); 
 919 // These are utility functions not really tied to a platform 
 921 int Platform::Minimum(int a
, int b
) { 
 928 int Platform::Maximum(int a
, int b
) { 
 937 void Platform::DebugPrintf(const char *format
, ...) { 
 941     va_start(pArguments
, format
); 
 942     vsprintf(buffer
,format
,pArguments
); 
 944     Platform::DebugDisplay(buffer
); 
 949 static bool assertionPopUps 
= true; 
 951 bool Platform::ShowAssertionPopUps(bool assertionPopUps_
) { 
 952         bool ret 
= assertionPopUps
; 
 953         assertionPopUps 
= assertionPopUps_
; 
 957 void Platform::Assert(const char *c
, const char *file
, int line
) { 
 959         sprintf(buffer
, "Assertion [%s] failed at %s %d", c
, file
, line
); 
 960         if (assertionPopUps
) { 
 962             wxMessageBox(stc2wx(buffer
), 
 963                          wxT("Assertion failure"), 
 965 //              if (idButton == IDRETRY) { 
 967 //              } else if (idButton == IDIGNORE) { 
 973                 strcat(buffer
, "\r\n"); 
 974                 Platform::DebugDisplay(buffer
); 
 980 int Platform::Clamp(int val
, int minVal
, int maxVal
) { 
 989 bool Platform::IsDBCSLeadByte(int codePage
, char ch
) { 
 995 //---------------------------------------------------------------------- 
 997 ElapsedTime::ElapsedTime() { 
1001 double ElapsedTime::Duration(bool reset
) { 
1002     double result 
= wxGetElapsedTime(reset
); 
1008 //----------------------------------------------------------------------