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>
11 #include <wx/listctrl.h>
12 #include <wx/mstream.h>
14 #include <wx/imaglist.h>
18 #include "wx/stc/stc.h"
26 Point
Point::FromLong(long lpoint
) {
27 return Point(lpoint
& 0xFFFF, lpoint
>> 16);
30 wxRect
wxRectFromPRectangle(PRectangle prc
) {
31 wxRect
rc(prc
.left
, prc
.top
,
32 prc
.right
-prc
.left
, prc
.bottom
-prc
.top
);
36 PRectangle
PRectangleFromwxRect(wxRect rc
) {
37 return PRectangle(rc
.GetLeft(), rc
.GetTop(),
38 rc
.GetRight()+1, rc
.GetBottom()+1);
41 wxColour
wxColourFromCA(const ColourAllocated
& ca
) {
42 ColourDesired
cd(ca
.AsLong());
43 return wxColour(cd
.GetRed(), cd
.GetGreen(), cd
.GetBlue());
46 //----------------------------------------------------------------------
50 allowRealization
= false;
57 void Palette::Release() {
61 // This method either adds a colour to the list of wanted colours (want==true)
62 // or retrieves the allocated colour back to the ColourPair.
63 // This is one method to make it easier to keep the code for wanting and retrieving in sync.
64 void Palette::WantFind(ColourPair
&cp
, bool want
) {
66 for (int i
=0; i
< used
; i
++) {
67 if (entries
[i
].desired
== cp
.desired
)
71 if (used
< numEntries
) {
72 entries
[used
].desired
= cp
.desired
;
73 entries
[used
].allocated
.Set(cp
.desired
.AsLong());
77 for (int i
=0; i
< used
; i
++) {
78 if (entries
[i
].desired
== cp
.desired
) {
79 cp
.allocated
= entries
[i
].allocated
;
83 cp
.allocated
.Set(cp
.desired
.AsLong());
87 void Palette::Allocate(Window
&) {
88 if (allowRealization
) {
93 //----------------------------------------------------------------------
103 void Font::Create(const char *faceName
, int characterSet
, int size
, bool bold
, bool italic
) {
104 wxFontEncoding encoding
;
108 switch (characterSet
) {
110 case wxSTC_CHARSET_ANSI
:
111 case wxSTC_CHARSET_DEFAULT
:
112 encoding
= wxFONTENCODING_DEFAULT
;
115 case wxSTC_CHARSET_BALTIC
:
116 encoding
= wxFONTENCODING_ISO8859_13
;
119 case wxSTC_CHARSET_CHINESEBIG5
:
120 encoding
= wxFONTENCODING_CP950
;
123 case wxSTC_CHARSET_EASTEUROPE
:
124 encoding
= wxFONTENCODING_ISO8859_2
;
127 case wxSTC_CHARSET_GB2312
:
128 encoding
= wxFONTENCODING_CP936
;
131 case wxSTC_CHARSET_GREEK
:
132 encoding
= wxFONTENCODING_ISO8859_7
;
135 case wxSTC_CHARSET_HANGUL
:
136 encoding
= wxFONTENCODING_CP949
;
139 case wxSTC_CHARSET_MAC
:
140 encoding
= wxFONTENCODING_DEFAULT
;
143 case wxSTC_CHARSET_OEM
:
144 encoding
= wxFONTENCODING_DEFAULT
;
147 case wxSTC_CHARSET_RUSSIAN
:
148 encoding
= wxFONTENCODING_KOI8
;
151 case wxSTC_CHARSET_SHIFTJIS
:
152 encoding
= wxFONTENCODING_CP932
;
155 case wxSTC_CHARSET_SYMBOL
:
156 encoding
= wxFONTENCODING_DEFAULT
;
159 case wxSTC_CHARSET_TURKISH
:
160 encoding
= wxFONTENCODING_ISO8859_9
;
163 case wxSTC_CHARSET_JOHAB
:
164 encoding
= wxFONTENCODING_DEFAULT
;
167 case wxSTC_CHARSET_HEBREW
:
168 encoding
= wxFONTENCODING_ISO8859_8
;
171 case wxSTC_CHARSET_ARABIC
:
172 encoding
= wxFONTENCODING_ISO8859_6
;
175 case wxSTC_CHARSET_VIETNAMESE
:
176 encoding
= wxFONTENCODING_DEFAULT
;
179 case wxSTC_CHARSET_THAI
:
180 encoding
= wxFONTENCODING_ISO8859_11
;
184 wxFontEncodingArray ea
= wxEncodingConverter::GetPlatformEquivalents(encoding
);
188 id
= new wxFont(size
,
190 italic
? wxITALIC
: wxNORMAL
,
191 bold
? wxBOLD
: wxNORMAL
,
198 void Font::Release() {
204 //----------------------------------------------------------------------
206 class SurfaceImpl
: public Surface
{
219 virtual void Init(WindowID wid
);
220 virtual void Init(SurfaceID sid
, WindowID wid
);
221 virtual void InitPixMap(int width
, int height
, Surface
*surface_
, WindowID wid
);
223 virtual void Release();
224 virtual bool Initialised();
225 virtual void PenColour(ColourAllocated fore
);
226 virtual int LogPixelsY();
227 virtual int DeviceHeightFont(int points
);
228 virtual void MoveTo(int x_
, int y_
);
229 virtual void LineTo(int x_
, int y_
);
230 virtual void Polygon(Point
*pts
, int npts
, ColourAllocated fore
, ColourAllocated back
);
231 virtual void RectangleDraw(PRectangle rc
, ColourAllocated fore
, ColourAllocated back
);
232 virtual void FillRectangle(PRectangle rc
, ColourAllocated back
);
233 virtual void FillRectangle(PRectangle rc
, Surface
&surfacePattern
);
234 virtual void RoundedRectangle(PRectangle rc
, ColourAllocated fore
, ColourAllocated back
);
235 virtual void Ellipse(PRectangle rc
, ColourAllocated fore
, ColourAllocated back
);
236 virtual void Copy(PRectangle rc
, Point from
, Surface
&surfaceSource
);
238 virtual void DrawTextNoClip(PRectangle rc
, Font
&font_
, int ybase
, const char *s
, int len
, ColourAllocated fore
, ColourAllocated back
);
239 virtual void DrawTextClipped(PRectangle rc
, Font
&font_
, int ybase
, const char *s
, int len
, ColourAllocated fore
, ColourAllocated back
);
240 virtual void DrawTextTransparent(PRectangle rc
, Font
&font_
, int ybase
, const char *s
, int len
, ColourAllocated fore
);
241 virtual void MeasureWidths(Font
&font_
, const char *s
, int len
, int *positions
);
242 virtual int WidthText(Font
&font_
, const char *s
, int len
);
243 virtual int WidthChar(Font
&font_
, char ch
);
244 virtual int Ascent(Font
&font_
);
245 virtual int Descent(Font
&font_
);
246 virtual int InternalLeading(Font
&font_
);
247 virtual int ExternalLeading(Font
&font_
);
248 virtual int Height(Font
&font_
);
249 virtual int AverageCharWidth(Font
&font_
);
251 virtual int SetPalette(Palette
*pal
, bool inBackGround
);
252 virtual void SetClip(PRectangle rc
);
253 virtual void FlushCachedState();
255 virtual void SetUnicodeMode(bool unicodeMode_
);
256 virtual void SetDBCSMode(int codePage
);
258 void BrushColour(ColourAllocated back
);
259 void SetFont(Font
&font_
);
264 SurfaceImpl::SurfaceImpl() :
265 hdc(0), hdcOwned(0), bitmap(0),
266 x(0), y(0), unicodeMode(0)
269 SurfaceImpl::~SurfaceImpl() {
273 void SurfaceImpl::Init(WindowID wid
) {
276 hdc
= new wxMemoryDC();
279 // On Mac and GTK the DC is not really valid until it has a bitmap
280 // selected into it. So instead of just creating the DC with no bitmap,
281 // go ahead and give it one.
282 InitPixMap(1,1,NULL
,wid
);
286 void SurfaceImpl::Init(SurfaceID hdc_
, WindowID
) {
291 void SurfaceImpl::InitPixMap(int width
, int height
, Surface
*surface_
, WindowID
) {
293 hdc
= new wxMemoryDC();
295 if (width
< 1) width
= 1;
296 if (height
< 1) height
= 1;
297 bitmap
= new wxBitmap(width
, height
);
298 ((wxMemoryDC
*)hdc
)->SelectObject(*bitmap
);
302 void SurfaceImpl::Release() {
304 ((wxMemoryDC
*)hdc
)->SelectObject(wxNullBitmap
);
316 bool SurfaceImpl::Initialised() {
321 void SurfaceImpl::PenColour(ColourAllocated fore
) {
322 hdc
->SetPen(wxPen(wxColourFromCA(fore
), 1, wxSOLID
));
325 void SurfaceImpl::BrushColour(ColourAllocated back
) {
326 hdc
->SetBrush(wxBrush(wxColourFromCA(back
), wxSOLID
));
329 void SurfaceImpl::SetFont(Font
&font_
) {
331 hdc
->SetFont(*((wxFont
*)font_
.GetID()));
335 int SurfaceImpl::LogPixelsY() {
336 return hdc
->GetPPI().y
;
339 int SurfaceImpl::DeviceHeightFont(int points
) {
343 void SurfaceImpl::MoveTo(int x_
, int y_
) {
348 void SurfaceImpl::LineTo(int x_
, int y_
) {
349 hdc
->DrawLine(x
,y
, x_
,y_
);
354 void SurfaceImpl::Polygon(Point
*pts
, int npts
, ColourAllocated fore
, ColourAllocated back
) {
357 hdc
->DrawPolygon(npts
, (wxPoint
*)pts
);
360 void SurfaceImpl::RectangleDraw(PRectangle rc
, ColourAllocated fore
, ColourAllocated back
) {
363 hdc
->DrawRectangle(wxRectFromPRectangle(rc
));
366 void SurfaceImpl::FillRectangle(PRectangle rc
, ColourAllocated back
) {
368 hdc
->SetPen(*wxTRANSPARENT_PEN
);
369 hdc
->DrawRectangle(wxRectFromPRectangle(rc
));
372 void SurfaceImpl::FillRectangle(PRectangle rc
, Surface
&surfacePattern
) {
374 if (((SurfaceImpl
&)surfacePattern
).bitmap
)
375 br
= wxBrush(*((SurfaceImpl
&)surfacePattern
).bitmap
);
376 else // Something is wrong so display in red
377 br
= wxBrush(*wxRED
, wxSOLID
);
378 hdc
->SetPen(*wxTRANSPARENT_PEN
);
380 hdc
->DrawRectangle(wxRectFromPRectangle(rc
));
383 void SurfaceImpl::RoundedRectangle(PRectangle rc
, ColourAllocated fore
, ColourAllocated back
) {
386 hdc
->DrawRoundedRectangle(wxRectFromPRectangle(rc
), 4);
389 void SurfaceImpl::Ellipse(PRectangle rc
, ColourAllocated fore
, ColourAllocated back
) {
392 hdc
->DrawEllipse(wxRectFromPRectangle(rc
));
395 void SurfaceImpl::Copy(PRectangle rc
, Point from
, Surface
&surfaceSource
) {
396 wxRect r
= wxRectFromPRectangle(rc
);
397 hdc
->Blit(r
.x
, r
.y
, r
.width
, r
.height
,
398 ((SurfaceImpl
&)surfaceSource
).hdc
,
399 from
.x
, from
.y
, wxCOPY
);
402 void SurfaceImpl::DrawTextNoClip(PRectangle rc
, Font
&font
, int ybase
,
403 const char *s
, int len
,
404 ColourAllocated fore
, ColourAllocated back
) {
406 hdc
->SetTextForeground(wxColourFromCA(fore
));
407 hdc
->SetTextBackground(wxColourFromCA(back
));
408 FillRectangle(rc
, back
);
410 // ybase is where the baseline should be, but wxWin uses the upper left
411 // corner, so I need to calculate the real position for the text...
412 hdc
->DrawText(stc2wx(s
, len
), rc
.left
, ybase
- font
.ascent
);
415 void SurfaceImpl::DrawTextClipped(PRectangle rc
, Font
&font
, int ybase
,
416 const char *s
, int len
,
417 ColourAllocated fore
, ColourAllocated back
) {
419 hdc
->SetTextForeground(wxColourFromCA(fore
));
420 hdc
->SetTextBackground(wxColourFromCA(back
));
421 FillRectangle(rc
, back
);
422 hdc
->SetClippingRegion(wxRectFromPRectangle(rc
));
424 // see comments above
425 hdc
->DrawText(stc2wx(s
, len
), rc
.left
, ybase
- font
.ascent
);
426 hdc
->DestroyClippingRegion();
430 void SurfaceImpl::DrawTextTransparent(PRectangle rc
, Font
&font
, int ybase
,
431 const char *s
, int len
,
432 ColourAllocated fore
) {
435 hdc
->SetTextForeground(wxColourFromCA(fore
));
436 hdc
->SetBackgroundMode(wxTRANSPARENT
);
438 // ybase is where the baseline should be, but wxWin uses the upper left
439 // corner, so I need to calculate the real position for the text...
440 hdc
->DrawText(stc2wx(s
, len
), rc
.left
, ybase
- font
.ascent
);
442 hdc
->SetBackgroundMode(wxSOLID
);
446 void SurfaceImpl::MeasureWidths(Font
&font
, const char *s
, int len
, int *positions
) {
448 wxString str
= stc2wx(s
, len
);
452 // Calculate the position of each character based on the widths of
453 // the previous characters
454 int* tpos
= new int[len
+1];
457 for (i
=0; i
<str
.Length(); i
++) {
459 hdc
->GetTextExtent(str
[i
], &w
, &h
);
461 tpos
[i
] = totalWidth
;
464 // Instead of a running total, remeasure from the begining of the
465 // text for each character's position. This is because with AA fonts
466 // on OS X widths can be fractions of pixels wide when more than one
467 // are drawn together, so the sum of all character widths is not necessarily
468 // (and probably not) the same as the whole string width.
469 int* tpos
= new int[len
+1];
471 for (i
=0; i
<str
.Length(); i
++) {
473 hdc
->GetTextExtent(str
.Left(i
+1), &w
, &h
);
480 // Map the widths for UCS-2 characters back to the UTF-8 input string
481 // NOTE: I don't think this is right for when sizeof(wxChar) > 2, ie wxGTK2
482 // so figure it out and fix it!
485 while ((int)i
< len
) {
486 unsigned char uch
= (unsigned char)s
[i
];
487 positions
[i
++] = tpos
[ui
];
489 if (uch
< (0x80 + 0x40 + 0x20)) {
490 positions
[i
++] = tpos
[ui
];
492 positions
[i
++] = tpos
[ui
];
493 positions
[i
++] = tpos
[ui
];
500 // If not unicode then just use the widths we have
501 memcpy(positions
, tpos
, len
* sizeof(*tpos
));
508 int SurfaceImpl::WidthText(Font
&font
, const char *s
, int len
) {
513 hdc
->GetTextExtent(stc2wx(s
, len
), &w
, &h
);
518 int SurfaceImpl::WidthChar(Font
&font
, char ch
) {
522 char s
[2] = { ch
, 0 };
524 hdc
->GetTextExtent(stc2wx(s
, 1), &w
, &h
);
528 #define EXTENT_TEST wxT(" `~!@#$%^&*()-_=+\\|[]{};:\"\'<,>.?/1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
530 int SurfaceImpl::Ascent(Font
&font
) {
533 hdc
->GetTextExtent(EXTENT_TEST
, &w
, &h
, &d
, &e
);
538 int SurfaceImpl::Descent(Font
&font
) {
541 hdc
->GetTextExtent(EXTENT_TEST
, &w
, &h
, &d
, &e
);
545 int SurfaceImpl::InternalLeading(Font
&font
) {
549 int SurfaceImpl::ExternalLeading(Font
&font
) {
552 hdc
->GetTextExtent(EXTENT_TEST
, &w
, &h
, &d
, &e
);
556 int SurfaceImpl::Height(Font
&font
) {
558 return hdc
->GetCharHeight();
561 int SurfaceImpl::AverageCharWidth(Font
&font
) {
563 return hdc
->GetCharWidth();
566 int SurfaceImpl::SetPalette(Palette
*pal
, bool inBackGround
) {
570 void SurfaceImpl::SetClip(PRectangle rc
) {
571 hdc
->SetClippingRegion(wxRectFromPRectangle(rc
));
574 void SurfaceImpl::FlushCachedState() {
577 void SurfaceImpl::SetUnicodeMode(bool unicodeMode_
) {
578 unicodeMode
=unicodeMode_
;
581 void SurfaceImpl::SetDBCSMode(int codePage
) {
582 // dbcsMode = codePage == SC_CP_DBCS;
586 Surface
*Surface::Allocate() {
587 return new SurfaceImpl
;
591 //----------------------------------------------------------------------
594 inline wxWindow
* GETWIN(WindowID id
) { return (wxWindow
*)id
; }
599 void Window::Destroy() {
602 GETWIN(id
)->Destroy();
607 bool Window::HasFocus() {
608 return wxWindow::FindFocus() == GETWIN(id
);
611 PRectangle
Window::GetPosition() {
612 if (! id
) return PRectangle();
613 wxRect
rc(GETWIN(id
)->GetPosition(), GETWIN(id
)->GetSize());
614 return PRectangleFromwxRect(rc
);
617 void Window::SetPosition(PRectangle rc
) {
618 wxRect r
= wxRectFromPRectangle(rc
);
619 GETWIN(id
)->SetSize(r
);
622 void Window::SetPositionRelative(PRectangle rc
, Window
) {
623 SetPosition(rc
); // ????
626 PRectangle
Window::GetClientPosition() {
627 if (! id
) return PRectangle();
628 wxSize sz
= GETWIN(id
)->GetClientSize();
629 return PRectangle(0, 0, sz
.x
, sz
.y
);
632 void Window::Show(bool show
) {
633 GETWIN(id
)->Show(show
);
636 void Window::InvalidateAll() {
637 GETWIN(id
)->Refresh(false);
641 void Window::InvalidateRectangle(PRectangle rc
) {
642 wxRect r
= wxRectFromPRectangle(rc
);
643 GETWIN(id
)->Refresh(false, &r
);
647 void Window::SetFont(Font
&font
) {
648 GETWIN(id
)->SetFont(*((wxFont
*)font
.GetID()));
651 void Window::SetCursor(Cursor curs
) {
656 cursorId
= wxCURSOR_IBEAM
;
659 cursorId
= wxCURSOR_ARROW
;
662 cursorId
= wxCURSOR_ARROW
; // ** no up arrow... wxCURSOR_UPARROW;
665 cursorId
= wxCURSOR_WAIT
;
668 cursorId
= wxCURSOR_SIZEWE
;
671 cursorId
= wxCURSOR_SIZENS
;
673 case cursorReverseArrow
:
674 cursorId
= wxCURSOR_RIGHT_ARROW
;
677 cursorId
= wxCURSOR_HAND
;
679 cursorId
= wxCURSOR_ARROW
;
683 wxCursor wc
= wxStockCursor(cursorId
) ;
685 wxCursor wc
= wxCursor(cursorId
) ;
687 GETWIN(id
)->SetCursor(wc
);
691 void Window::SetTitle(const char *s
) {
692 GETWIN(id
)->SetTitle(stc2wx(s
));
696 //----------------------------------------------------------------------
697 // Helper classes for ListBox
700 // This is a simple subclass of wxLIstView that just resets focus to the
701 // parent when it gets it.
702 class wxSTCListBox
: public wxListView
{
704 wxSTCListBox(wxWindow
* parent
, wxWindowID id
,
705 const wxPoint
& pos
, const wxSize
& size
,
707 : wxListView(parent
, id
, pos
, size
, style
)
710 void OnFocus(wxFocusEvent
& event
) {
711 GetParent()->SetFocus();
716 DECLARE_EVENT_TABLE()
719 BEGIN_EVENT_TABLE(wxSTCListBox
, wxListView
)
720 EVT_SET_FOCUS( wxSTCListBox::OnFocus
)
726 // A window to place the wxSTCListBox upon
727 class wxSTCListBoxWin
: public wxWindow
{
730 CallBackAction doubleClickAction
;
731 void* doubleClickActionData
;
733 wxSTCListBoxWin(wxWindow
* parent
, wxWindowID id
) :
734 wxWindow(parent
, id
, wxDefaultPosition
, wxSize(0,0), wxNO_BORDER
)
737 SetBackgroundColour(*wxBLACK
);
738 lv
= new wxSTCListBox(this, id
, wxDefaultPosition
, wxDefaultSize
,
739 wxLC_REPORT
| wxLC_SINGLE_SEL
| wxLC_NO_HEADER
| wxNO_BORDER
);
740 lv
->SetCursor(wxCursor(wxCURSOR_ARROW
));
741 lv
->InsertColumn(0, wxEmptyString
);
742 lv
->InsertColumn(1, wxEmptyString
);
747 wxImageList
* il
= lv
->GetImageList(wxIMAGE_LIST_SMALL
);
750 il
->GetSize(0, w
, h
);
757 void SetDoubleClickAction(CallBackAction action
, void *data
) {
758 doubleClickAction
= action
;
759 doubleClickActionData
= data
;
763 void OnFocus(wxFocusEvent
& event
) {
764 GetParent()->SetFocus();
768 void OnSize(wxSizeEvent
& event
) {
769 // resize the child, leaving a 1 pixel border
770 wxSize sz
= GetClientSize();
771 lv
->SetSize(1, 1, sz
.x
-2, sz
.y
-2);
772 // reset the column widths
773 lv
->SetColumnWidth(0, IconWidth()+4);
774 lv
->SetColumnWidth(1, sz
.x
- 2 - lv
->GetColumnWidth(0) -
775 wxSystemSettings::GetMetric(wxSYS_VSCROLL_X
));
779 void OnActivate(wxListEvent
& event
) {
780 doubleClickAction(doubleClickActionData
);
783 wxListView
* GetLB() { return lv
; }
786 DECLARE_EVENT_TABLE()
790 BEGIN_EVENT_TABLE(wxSTCListBoxWin
, wxWindow
)
791 EVT_SET_FOCUS ( wxSTCListBoxWin::OnFocus
)
792 EVT_SIZE ( wxSTCListBoxWin::OnSize
)
793 EVT_LIST_ITEM_ACTIVATED(-1, wxSTCListBoxWin::OnActivate
)
798 inline wxSTCListBoxWin
* GETLBW(WindowID win
) {
799 return ((wxSTCListBoxWin
*)win
);
802 inline wxListView
* GETLB(WindowID win
) {
803 return GETLBW(win
)->GetLB();
806 //----------------------------------------------------------------------
808 class ListBoxImpl
: public ListBox
{
812 int desiredVisibleRows
;
815 wxImageList
* imgList
;
816 wxArrayInt
* imgTypeMap
;
822 virtual void SetFont(Font
&font
);
823 virtual void Create(Window
&parent
, int ctrlID
, int lineHeight_
, bool unicodeMode_
);
824 virtual void SetAverageCharWidth(int width
);
825 virtual void SetVisibleRows(int rows
);
826 virtual PRectangle
GetDesiredRect();
827 virtual int CaretFromEdge();
828 virtual void Clear();
829 virtual void Append(char *s
, int type
= -1);
830 virtual int Length();
831 virtual void Select(int n
);
832 virtual int GetSelection();
833 virtual int Find(const char *prefix
);
834 virtual void GetValue(int n
, char *value
, int len
);
836 virtual void RegisterImage(int type
, const char *xpm_data
);
837 virtual void ClearRegisteredImages();
838 virtual void SetDoubleClickAction(CallBackAction
, void *);
843 ListBoxImpl::ListBoxImpl()
844 : lineHeight(10), unicodeMode(false),
845 desiredVisibleRows(5), aveCharWidth(8), maxStrWidth(0),
846 imgList(NULL
), imgTypeMap(NULL
)
850 ListBoxImpl::~ListBoxImpl() {
862 void ListBoxImpl::SetFont(Font
&font
) {
863 GETLB(id
)->SetFont(*((wxFont
*)font
.GetID()));
867 void ListBoxImpl::Create(Window
&parent
, int ctrlID
, int lineHeight_
, bool unicodeMode_
) {
868 lineHeight
= lineHeight_
;
869 unicodeMode
= unicodeMode_
;
871 id
= new wxSTCListBoxWin(GETWIN(parent
.GetID()), ctrlID
);
873 GETLB(id
)->SetImageList(imgList
, wxIMAGE_LIST_SMALL
);
877 void ListBoxImpl::SetAverageCharWidth(int width
) {
878 aveCharWidth
= width
;
882 void ListBoxImpl::SetVisibleRows(int rows
) {
883 desiredVisibleRows
= rows
;
887 PRectangle
ListBoxImpl::GetDesiredRect() {
888 // wxListCtrl doesn't have a DoGetBestSize, so instead we kept track of
889 // the max size in Append and calculate it here...
890 int maxw
= maxStrWidth
;
893 // give it a default if there are no lines, and/or add a bit more
894 if (maxw
== 0) maxw
= 100;
895 maxw
+= aveCharWidth
* 3 +
896 GETLBW(id
)->IconWidth() + wxSystemSettings::GetMetric(wxSYS_VSCROLL_X
);
900 // estimate a desired height
901 int count
= GETLB(id
)->GetItemCount();
904 GETLB(id
)->GetItemRect(0, rect
);
905 maxh
= count
* rect
.GetHeight();
906 if (maxh
> 140) // TODO: Use desiredVisibleRows??
909 // Try to make the size an exact multiple of some number of lines
910 int lines
= maxh
/ rect
.GetHeight();
911 maxh
= (lines
+ 1) * rect
.GetHeight() + 2;
925 int ListBoxImpl::CaretFromEdge() {
926 return 4 + GETLBW(id
)->IconWidth();
930 void ListBoxImpl::Clear() {
931 GETLB(id
)->DeleteAllItems();
935 void ListBoxImpl::Append(char *s
, int type
) {
936 wxString text
= stc2wx(s
);
937 long count
= GETLB(id
)->GetItemCount();
938 long itemID
= GETLB(id
)->InsertItem(count
, wxEmptyString
);
939 GETLB(id
)->SetItem(itemID
, 1, text
);
941 GETLB(id
)->GetTextExtent(text
, &itemWidth
, NULL
);
942 maxStrWidth
= wxMax(maxStrWidth
, itemWidth
);
944 wxCHECK_RET(imgTypeMap
, wxT("Unexpected NULL imgTypeMap"));
945 long idx
= imgTypeMap
->Item(type
);
946 GETLB(id
)->SetItemImage(itemID
, idx
, idx
);
951 int ListBoxImpl::Length() {
952 return GETLB(id
)->GetItemCount();
956 void ListBoxImpl::Select(int n
) {
963 GETLB(id
)->Select(n
, select
);
967 int ListBoxImpl::GetSelection() {
968 return GETLB(id
)->GetFirstSelected();
972 int ListBoxImpl::Find(const char *prefix
) {
978 void ListBoxImpl::GetValue(int n
, char *value
, int len
) {
982 item
.SetMask(wxLIST_MASK_TEXT
);
983 GETLB(id
)->GetItem(item
);
984 strncpy(value
, wx2stc(item
.GetText()), len
);
988 void ListBoxImpl::Sort() {
992 void ListBoxImpl::RegisterImage(int type
, const char *xpm_data
) {
993 wxMemoryInputStream
stream(xpm_data
, strlen(xpm_data
)+1);
994 wxBitmap
bmp(wxImage(stream
, wxBITMAP_TYPE_XPM
));
997 // assumes all images are the same size
998 imgList
= new wxImageList(bmp
.GetWidth(), bmp
.GetHeight(), TRUE
);
999 imgTypeMap
= new wxArrayInt
;
1002 int idx
= imgList
->Add(bmp
);
1004 // do we need to extend the mapping array?
1005 wxArrayInt
& itm
= *imgTypeMap
;
1006 if ( itm
.GetCount() < (size_t)type
+1)
1007 itm
.Add(-1, type
- itm
.GetCount() + 1);
1009 // Add an item that maps type to the image index
1013 void ListBoxImpl::ClearRegisteredImages() {
1023 GETLB(id
)->SetImageList(NULL
, wxIMAGE_LIST_SMALL
);
1027 void ListBoxImpl::SetDoubleClickAction(CallBackAction action
, void *data
) {
1028 GETLBW(id
)->SetDoubleClickAction(action
, data
);
1033 ListBox::ListBox() {
1036 ListBox::~ListBox() {
1039 ListBox
*ListBox::Allocate() {
1040 return new ListBoxImpl();
1043 //----------------------------------------------------------------------
1045 Menu::Menu() : id(0) {
1048 void Menu::CreatePopUp() {
1053 void Menu::Destroy() {
1059 void Menu::Show(Point pt
, Window
&w
) {
1060 GETWIN(w
.GetID())->PopupMenu((wxMenu
*)id
, pt
.x
- 4, pt
.y
);
1064 //----------------------------------------------------------------------
1066 DynamicLibrary
*DynamicLibrary::Load(const char *modulePath
) {
1067 wxFAIL_MSG(wxT("Dynamic lexer loading not implemented yet"));
1071 //----------------------------------------------------------------------
1073 ColourDesired
Platform::Chrome() {
1075 c
= wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE
);
1076 return ColourDesired(c
.Red(), c
.Green(), c
.Blue());
1079 ColourDesired
Platform::ChromeHighlight() {
1081 c
= wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT
);
1082 return ColourDesired(c
.Red(), c
.Green(), c
.Blue());
1085 const char *Platform::DefaultFont() {
1086 static char buf
[128];
1087 strcpy(buf
, wxNORMAL_FONT
->GetFaceName().mbc_str());
1091 int Platform::DefaultFontSize() {
1092 return wxNORMAL_FONT
->GetPointSize();
1095 unsigned int Platform::DoubleClickTime() {
1096 return 500; // **** ::GetDoubleClickTime();
1099 bool Platform::MouseButtonBounce() {
1102 void Platform::DebugDisplay(const char *s
) {
1103 wxLogDebug(stc2wx(s
));
1106 bool Platform::IsKeyDown(int key
) {
1107 return false; // I don't think we'll need this.
1110 long Platform::SendScintilla(WindowID w
,
1112 unsigned long wParam
,
1115 wxStyledTextCtrl
* stc
= (wxStyledTextCtrl
*)w
;
1116 return stc
->SendMsg(msg
, wParam
, lParam
);
1119 long Platform::SendScintillaPointer(WindowID w
,
1121 unsigned long wParam
,
1124 wxStyledTextCtrl
* stc
= (wxStyledTextCtrl
*)w
;
1125 return stc
->SendMsg(msg
, wParam
, (long)lParam
);
1129 // These are utility functions not really tied to a platform
1131 int Platform::Minimum(int a
, int b
) {
1138 int Platform::Maximum(int a
, int b
) {
1147 void Platform::DebugPrintf(const char *format
, ...) {
1151 va_start(pArguments
, format
);
1152 vsprintf(buffer
,format
,pArguments
);
1154 Platform::DebugDisplay(buffer
);
1159 static bool assertionPopUps
= true;
1161 bool Platform::ShowAssertionPopUps(bool assertionPopUps_
) {
1162 bool ret
= assertionPopUps
;
1163 assertionPopUps
= assertionPopUps_
;
1167 void Platform::Assert(const char *c
, const char *file
, int line
) {
1169 sprintf(buffer
, "Assertion [%s] failed at %s %d", c
, file
, line
);
1170 if (assertionPopUps
) {
1172 wxMessageBox(stc2wx(buffer
),
1173 wxT("Assertion failure"),
1174 wxICON_HAND
| wxOK
);
1175 // if (idButton == IDRETRY) {
1177 // } else if (idButton == IDIGNORE) {
1183 strcat(buffer
, "\r\n");
1184 Platform::DebugDisplay(buffer
);
1190 int Platform::Clamp(int val
, int minVal
, int maxVal
) {
1199 bool Platform::IsDBCSLeadByte(int codePage
, char ch
) {
1203 int Platform::DBCSCharLength(int codePage
, const char *s
) {
1207 int Platform::DBCSCharMaxLength() {
1212 //----------------------------------------------------------------------
1214 ElapsedTime::ElapsedTime() {
1218 double ElapsedTime::Duration(bool reset
) {
1219 double result
= wxGetElapsedTime(reset
);
1225 //----------------------------------------------------------------------
1228 wxString
stc2wx(const char* str
, size_t len
)
1230 char *buffer
=new char[len
+1];
1231 strncpy(buffer
, str
, len
);
1234 wxString
cstr(buffer
, wxConvUTF8
);