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() { 
 288     hdc 
= new wxMemoryDC(); 
 292 void SurfaceImpl::Init(SurfaceID hdc_
) { 
 297 void SurfaceImpl::InitPixMap(int width
, int height
, Surface 
*surface_
) { 
 299     hdc 
= new wxMemoryDC(); 
 301     if (width 
< 1) width 
= 1; 
 302     if (height 
< 1) height 
= 1; 
 303     bitmap 
= new wxBitmap(width
, height
); 
 304     ((wxMemoryDC
*)hdc
)->SelectObject(*bitmap
); 
 307 void SurfaceImpl::PenColour(ColourAllocated fore
) { 
 308     hdc
->SetPen(wxPen(wxColourFromCA(fore
), 1, wxSOLID
)); 
 311 void SurfaceImpl::BrushColour(ColourAllocated back
) { 
 312     hdc
->SetBrush(wxBrush(wxColourFromCA(back
), wxSOLID
)); 
 315 void SurfaceImpl::SetFont(Font 
&font_
) { 
 317       hdc
->SetFont(*((wxFont
*)font_
.GetID())); 
 321 int SurfaceImpl::LogPixelsY() { 
 322     return hdc
->GetPPI().y
; 
 325 int SurfaceImpl::DeviceHeightFont(int points
) { 
 329 void SurfaceImpl::MoveTo(int x_
, int y_
) { 
 334 void SurfaceImpl::LineTo(int x_
, int y_
) { 
 335     hdc
->DrawLine(x
,y
, x_
,y_
); 
 340 void SurfaceImpl::Polygon(Point 
*pts
, int npts
, ColourAllocated fore
, ColourAllocated back
) { 
 343     hdc
->DrawPolygon(npts
, (wxPoint
*)pts
); 
 346 void SurfaceImpl::RectangleDraw(PRectangle rc
, ColourAllocated fore
, ColourAllocated back
) { 
 349     hdc
->DrawRectangle(wxRectFromPRectangle(rc
)); 
 352 void SurfaceImpl::FillRectangle(PRectangle rc
, ColourAllocated back
) { 
 354     hdc
->SetPen(*wxTRANSPARENT_PEN
); 
 355     hdc
->DrawRectangle(wxRectFromPRectangle(rc
)); 
 358 void SurfaceImpl::FillRectangle(PRectangle rc
, Surface 
&surfacePattern
) { 
 360     if (((SurfaceImpl
&)surfacePattern
).bitmap
) 
 361         br 
= wxBrush(*((SurfaceImpl
&)surfacePattern
).bitmap
); 
 362     else    // Something is wrong so display in red 
 363         br 
= wxBrush(*wxRED
, wxSOLID
); 
 364     hdc
->SetPen(*wxTRANSPARENT_PEN
); 
 366     hdc
->DrawRectangle(wxRectFromPRectangle(rc
)); 
 369 void SurfaceImpl::RoundedRectangle(PRectangle rc
, ColourAllocated fore
, ColourAllocated back
) { 
 372     hdc
->DrawRoundedRectangle(wxRectFromPRectangle(rc
), 4); 
 375 void SurfaceImpl::Ellipse(PRectangle rc
, ColourAllocated fore
, ColourAllocated back
) { 
 378     hdc
->DrawEllipse(wxRectFromPRectangle(rc
)); 
 381 void SurfaceImpl::Copy(PRectangle rc
, Point from
, Surface 
&surfaceSource
) { 
 382     wxRect r 
= wxRectFromPRectangle(rc
); 
 383     hdc
->Blit(r
.x
, r
.y
, r
.width
, r
.height
, 
 384               ((SurfaceImpl
&)surfaceSource
).hdc
, 
 385               from
.x
, from
.y
, wxCOPY
); 
 388 void SurfaceImpl::DrawTextNoClip(PRectangle rc
, Font 
&font
, int ybase
, 
 389                                  const char *s
, int len
, 
 390                                  ColourAllocated fore
, ColourAllocated back
) { 
 392     hdc
->SetTextForeground(wxColourFromCA(fore
)); 
 393     hdc
->SetTextBackground(wxColourFromCA(back
)); 
 394     FillRectangle(rc
, back
); 
 396     // ybase is where the baseline should be, but wxWin uses the upper left 
 397     // corner, so I need to calculate the real position for the text... 
 398     hdc
->DrawText(stc2wx(s
, len
), rc
.left
, ybase 
- font
.ascent
); 
 401 void SurfaceImpl::DrawTextClipped(PRectangle rc
, Font 
&font
, int ybase
, 
 402                                   const char *s
, int len
, 
 403                                   ColourAllocated fore
, ColourAllocated back
) { 
 405     hdc
->SetTextForeground(wxColourFromCA(fore
)); 
 406     hdc
->SetTextBackground(wxColourFromCA(back
)); 
 407     FillRectangle(rc
, back
); 
 408     hdc
->SetClippingRegion(wxRectFromPRectangle(rc
)); 
 410     // see comments above 
 411     hdc
->DrawText(stc2wx(s
, len
), rc
.left
, ybase 
- font
.ascent
); 
 412     hdc
->DestroyClippingRegion(); 
 415 int SurfaceImpl::WidthText(Font 
&font
, const char *s
, int len
) { 
 420     hdc
->GetTextExtent(stc2wx(s
, len
), &w
, &h
); 
 425 void SurfaceImpl::MeasureWidths(Font 
&font
, const char *s
, int len
, int *positions
) { 
 426     wxString str 
= stc2wx(s
, len
); 
 429     // Calculate the position of each character based on the widths of 
 430     // the previous characters 
 431     int* tpos 
= new int[len
]; 
 434     for (i
=0; i
<str
.Length(); i
++) { 
 436         hdc
->GetTextExtent(str
[i
], &w
, &h
); 
 438         tpos
[i
] = totalWidth
; 
 442     // Map the widths for UCS-2 characters back to the UTF-8 input string 
 446         unsigned char uch 
= (unsigned char)s
[i
]; 
 447         positions
[i
++] = tpos
[ui
]; 
 449             if (uch 
< (0x80 + 0x40 + 0x20)) { 
 450                 positions
[i
++] = tpos
[ui
]; 
 452                 positions
[i
++] = tpos
[ui
]; 
 453                 positions
[i
++] = tpos
[ui
]; 
 460     // If not unicode then just use the widths we have 
 461     memcpy(positions
, tpos
, len 
* sizeof(*tpos
)); 
 468 int SurfaceImpl::WidthChar(Font 
&font
, char ch
) { 
 472     char s
[2] = { ch
, 0 }; 
 474     hdc
->GetTextExtent(stc2wx(s
, 1), &w
, &h
); 
 478 #define EXTENT_TEST wxT(" `~!@#$%^&*()-_=+\\|[]{};:\"\'<,>.?/1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") 
 480 int SurfaceImpl::Ascent(Font 
&font
) { 
 483     hdc
->GetTextExtent(EXTENT_TEST
, &w
, &h
, &d
, &e
); 
 488 int SurfaceImpl::Descent(Font 
&font
) { 
 491     hdc
->GetTextExtent(EXTENT_TEST
, &w
, &h
, &d
, &e
); 
 495 int SurfaceImpl::InternalLeading(Font 
&font
) { 
 499 int SurfaceImpl::ExternalLeading(Font 
&font
) { 
 502     hdc
->GetTextExtent(EXTENT_TEST
, &w
, &h
, &d
, &e
); 
 506 int SurfaceImpl::Height(Font 
&font
) { 
 508     return hdc
->GetCharHeight(); 
 511 int SurfaceImpl::AverageCharWidth(Font 
&font
) { 
 513     return hdc
->GetCharWidth(); 
 516 int SurfaceImpl::SetPalette(Palette 
*pal
, bool inBackGround
) { 
 520 void SurfaceImpl::SetClip(PRectangle rc
) { 
 521     hdc
->SetClippingRegion(wxRectFromPRectangle(rc
)); 
 524 void SurfaceImpl::FlushCachedState() { 
 527 void SurfaceImpl::SetUnicodeMode(bool unicodeMode_
) { 
 528     unicodeMode
=unicodeMode_
; 
 530     wxASSERT_MSG(unicodeMode 
== wxUSE_UNICODE
, 
 531                  wxT("Only unicode may be used when wxUSE_UNICODE is on.")); 
 533     wxASSERT_MSG(unicodeMode 
== wxUSE_UNICODE
, 
 534                  wxT("Only non-unicode may be used when wxUSE_UNICODE is off.")); 
 538 Surface 
*Surface::Allocate() { 
 539     return new SurfaceImpl
; 
 543 //---------------------------------------------------------------------- 
 546 inline wxWindow
* GETWIN(WindowID id
) { return (wxWindow
*)id
; } 
 551 void Window::Destroy() { 
 553         GETWIN(id
)->Destroy(); 
 557 bool Window::HasFocus() { 
 558     return wxWindow::FindFocus() == GETWIN(id
); 
 561 PRectangle 
Window::GetPosition() { 
 562     wxRect 
rc(GETWIN(id
)->GetPosition(), GETWIN(id
)->GetSize()); 
 563     return PRectangleFromwxRect(rc
); 
 566 void Window::SetPosition(PRectangle rc
) { 
 567     wxRect r 
= wxRectFromPRectangle(rc
); 
 568     GETWIN(id
)->SetSize(r
); 
 571 void Window::SetPositionRelative(PRectangle rc
, Window
) { 
 572     SetPosition(rc
);  // ???? 
 575 PRectangle 
Window::GetClientPosition() { 
 576     wxSize sz 
= GETWIN(id
)->GetClientSize(); 
 577     return  PRectangle(0, 0, sz
.x
, sz
.y
); 
 580 void Window::Show(bool show
) { 
 581     GETWIN(id
)->Show(show
); 
 584 void Window::InvalidateAll() { 
 585     GETWIN(id
)->Refresh(false); 
 589 void Window::InvalidateRectangle(PRectangle rc
) { 
 590     wxRect r 
= wxRectFromPRectangle(rc
); 
 591     GETWIN(id
)->Refresh(false, &r
); 
 595 void Window::SetFont(Font 
&font
) { 
 596     GETWIN(id
)->SetFont(*((wxFont
*)font
.GetID())); 
 599 void Window::SetCursor(Cursor curs
) { 
 604         cursorId 
= wxCURSOR_IBEAM
; 
 607         cursorId 
= wxCURSOR_ARROW
; 
 610         cursorId 
= wxCURSOR_ARROW
; // ** no up arrow...  wxCURSOR_UPARROW; 
 613         cursorId 
= wxCURSOR_WAIT
; 
 616         cursorId 
= wxCURSOR_SIZEWE
; 
 619         cursorId 
= wxCURSOR_SIZENS
; 
 621     case cursorReverseArrow
: 
 622         cursorId 
= wxCURSOR_RIGHT_ARROW
; 
 625         cursorId 
= wxCURSOR_ARROW
; 
 629     GETWIN(id
)->SetCursor(wxCursor(cursorId
)); 
 633 void Window::SetTitle(const char *s
) { 
 634     GETWIN(id
)->SetTitle(stc2wx(s
)); 
 638 //---------------------------------------------------------------------- 
 639 // Helper classes for ListBox 
 642 // #undef  wxSTC_USE_POPUP 
 643 // #define wxSTC_USE_POPUP 0 
 646 // A wxListBox that gives focus back to its parent if it gets it. 
 647 class wxSTCListBox 
: public wxListBox 
{ 
 649     wxSTCListBox(wxWindow
* parent
, wxWindowID id
) 
 650         : wxListBox(parent
, id
, wxDefaultPosition
, wxDefaultSize
, 
 651                     0, NULL
, wxLB_SINGLE 
| wxSIMPLE_BORDER
) 
 654     void OnKeyDown(wxKeyEvent
& event
) { 
 655         // Give the key events to the STC.  It will then update 
 656         // the listbox as needed. 
 657         GetGrandParent()->GetEventHandler()->ProcessEvent(event
); 
 661     DECLARE_EVENT_TABLE() 
 664 BEGIN_EVENT_TABLE(wxSTCListBox
, wxListBox
) 
 665     EVT_KEY_DOWN(wxSTCListBox::OnKeyDown
) 
 666     EVT_CHAR(wxSTCListBox::OnKeyDown
) 
 671 // A window to place the listbox upon.  If wxPopupWindow is supported then 
 672 // that will be used so the listbox can extend beyond the client area of the 
 674 #if wxUSE_POPUPWIN && wxSTC_USE_POPUP 
 675 #include <wx/popupwin.h> 
 676 #define wxSTCListBoxWinBase wxPopupWindow 
 677 #define param2  wxBORDER_NONE  // popup's 2nd param is flags 
 679 #define wxSTCListBoxWinBase wxWindow 
 680 #define param2 -1 // wxWindow's 2nd param is ID 
 683 class wxSTCListBoxWin 
: public wxSTCListBoxWinBase 
{ 
 685     wxSTCListBoxWin(wxWindow
* parent
, wxWindowID id
) 
 686         : wxSTCListBoxWinBase(parent
, param2
) { 
 687         lb 
= new wxSTCListBox(this, id
); 
 688         lb
->SetCursor(wxCursor(wxCURSOR_ARROW
)); 
 692     void OnSize(wxSizeEvent
& event
) { 
 693         lb
->SetSize(GetSize()); 
 696     wxListBox
* GetLB() { return lb
; } 
 698 #if wxUSE_POPUPWIN && wxSTC_USE_POPUP 
 699     virtual void DoSetSize(int x
, int y
, 
 700                            int width
, int height
, 
 701                            int sizeFlags 
= wxSIZE_AUTO
) { 
 703             GetParent()->ClientToScreen(&x
, NULL
); 
 705             GetParent()->ClientToScreen(NULL
, &y
); 
 706         wxSTCListBoxWinBase::DoSetSize(x
, y
, width
, height
, sizeFlags
); 
 712     DECLARE_EVENT_TABLE() 
 715 BEGIN_EVENT_TABLE(wxSTCListBoxWin
, wxSTCListBoxWinBase
) 
 716     EVT_SIZE(wxSTCListBoxWin::OnSize
) 
 720 inline wxListBox
* GETLB(WindowID win
) { 
 721     return (((wxSTCListBoxWin
*)win
)->GetLB()); 
 724 //---------------------------------------------------------------------- 
 729 ListBox::~ListBox() { 
 732 void ListBox::Create(Window 
&parent
, int ctrlID
) { 
 733     id 
= new wxSTCListBoxWin(GETWIN(parent
.GetID()), ctrlID
); 
 736 void ListBox::SetVisibleRows(int rows
) { 
 737     desiredVisibleRows 
= rows
; 
 740 PRectangle 
ListBox::GetDesiredRect() { 
 741     wxSize sz 
= GETLB(id
)->GetBestSize(); 
 747     if (sz
.y 
> 140)  // TODO:  Use desiredVisibleRows?? 
 754 void ListBox::SetAverageCharWidth(int width
) { 
 755     aveCharWidth 
= width
; 
 758 void ListBox::SetFont(Font 
&font
) { 
 759     GETLB(id
)->SetFont(*((wxFont
*)font
.GetID())); 
 762 void ListBox::Clear() { 
 766 void ListBox::Append(char *s
) { 
 767     GETLB(id
)->Append(s
); 
 770 int ListBox::Length() { 
 771     return GETLB(id
)->GetCount(); 
 774 void ListBox::Select(int n
) { 
 775     GETLB(id
)->SetSelection(n
); 
 781     GETLB(id
)->SetFirstItem(n
); 
 785 int ListBox::GetSelection() { 
 786     return GETLB(id
)->GetSelection(); 
 789 int ListBox::Find(const char *prefix
) { 
 794 void ListBox::GetValue(int n
, char *value
, int len
) { 
 795     wxString text 
= GETLB(id
)->GetString(n
); 
 796     strncpy(value
, wx2stc(text
), len
); 
 800 void ListBox::Sort() { 
 803 //---------------------------------------------------------------------- 
 805 Menu::Menu() : id(0) { 
 808 void Menu::CreatePopUp() { 
 813 void Menu::Destroy() { 
 819 void Menu::Show(Point pt
, Window 
&w
) { 
 820     GETWIN(w
.GetID())->PopupMenu((wxMenu
*)id
, pt
.x 
- 4, pt
.y
); 
 824 //---------------------------------------------------------------------- 
 826 ColourDesired 
Platform::Chrome() { 
 828     c 
= wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE
); 
 829     return ColourDesired(c
.Red(), c
.Green(), c
.Blue()); 
 832 ColourDesired 
Platform::ChromeHighlight() { 
 834     c 
= wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT
); 
 835     return ColourDesired(c
.Red(), c
.Green(), c
.Blue()); 
 838 const char *Platform::DefaultFont() { 
 839     static char buf
[128]; 
 840     strcpy(buf
, wxNORMAL_FONT
->GetFaceName().mbc_str()); 
 844 int Platform::DefaultFontSize() { 
 848 unsigned int Platform::DoubleClickTime() { 
 849     return 500;   // **** ::GetDoubleClickTime(); 
 852 void Platform::DebugDisplay(const char *s
) { 
 853     wxLogDebug(stc2wx(s
)); 
 856 bool Platform::IsKeyDown(int key
) { 
 857     return false;  // I don't think we'll need this. 
 860 long Platform::SendScintilla(WindowID w
, 
 862                              unsigned long wParam
, 
 865     wxStyledTextCtrl
* stc 
= (wxStyledTextCtrl
*)w
; 
 866     return stc
->SendMsg(msg
, wParam
, lParam
); 
 870 // These are utility functions not really tied to a platform 
 872 int Platform::Minimum(int a
, int b
) { 
 879 int Platform::Maximum(int a
, int b
) { 
 888 void Platform::DebugPrintf(const char *format
, ...) { 
 892     va_start(pArguments
, format
); 
 893     vsprintf(buffer
,format
,pArguments
); 
 895     Platform::DebugDisplay(buffer
); 
 900 static bool assertionPopUps 
= true; 
 902 bool Platform::ShowAssertionPopUps(bool assertionPopUps_
) { 
 903         bool ret 
= assertionPopUps
; 
 904         assertionPopUps 
= assertionPopUps_
; 
 908 void Platform::Assert(const char *c
, const char *file
, int line
) { 
 910         sprintf(buffer
, "Assertion [%s] failed at %s %d", c
, file
, line
); 
 911         if (assertionPopUps
) { 
 913             wxMessageBox(stc2wx(buffer
), 
 914                          wxT("Assertion failure"), 
 916 //              if (idButton == IDRETRY) { 
 918 //              } else if (idButton == IDIGNORE) { 
 924                 strcat(buffer
, "\r\n"); 
 925                 Platform::DebugDisplay(buffer
); 
 931 int Platform::Clamp(int val
, int minVal
, int maxVal
) { 
 940 bool Platform::IsDBCSLeadByte(int codePage
, char ch
) { 
 946 //---------------------------------------------------------------------- 
 948 ElapsedTime::ElapsedTime() { 
 952 double ElapsedTime::Duration(bool reset
) { 
 953     double result 
= wxGetElapsedTime(reset
); 
 959 //----------------------------------------------------------------------