]> git.saurik.com Git - wxWidgets.git/blob - src/stc/PlatWX.cpp
added missing wxListItem copy ctor to wxMSW, moved wxListItem to the header
[wxWidgets.git] / src / stc / PlatWX.cpp
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.
6
7 #include <ctype.h>
8
9 #include <wx/wx.h>
10 #include <wx/encconv.h>
11
12
13 #include "Platform.h"
14 #include "PlatWX.h"
15 #include "wx/stc/stc.h"
16
17
18 #ifdef __WXGTK__
19 #include <gtk/gtk.h>
20 #endif
21
22
23 Point Point::FromLong(long lpoint) {
24 return Point(lpoint & 0xFFFF, lpoint >> 16);
25 }
26
27 wxRect wxRectFromPRectangle(PRectangle prc) {
28 wxRect rc(prc.left, prc.top,
29 prc.right-prc.left, prc.bottom-prc.top);
30 return rc;
31 }
32
33 PRectangle PRectangleFromwxRect(wxRect rc) {
34 return PRectangle(rc.GetLeft(), rc.GetTop(),
35 rc.GetRight()+1, rc.GetBottom()+1);
36 }
37
38 wxColour wxColourFromCA(const ColourAllocated& ca) {
39 ColourDesired cd(ca.AsLong());
40 return wxColour(cd.GetRed(), cd.GetGreen(), cd.GetBlue());
41 }
42
43 //----------------------------------------------------------------------
44
45 Palette::Palette() {
46 used = 0;
47 allowRealization = false;
48 }
49
50 Palette::~Palette() {
51 Release();
52 }
53
54 void Palette::Release() {
55 used = 0;
56 }
57
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) {
62 if (want) {
63 for (int i=0; i < used; i++) {
64 if (entries[i].desired == cp.desired)
65 return;
66 }
67
68 if (used < numEntries) {
69 entries[used].desired = cp.desired;
70 entries[used].allocated.Set(cp.desired.AsLong());
71 used++;
72 }
73 } else {
74 for (int i=0; i < used; i++) {
75 if (entries[i].desired == cp.desired) {
76 cp.allocated = entries[i].allocated;
77 return;
78 }
79 }
80 cp.allocated.Set(cp.desired.AsLong());
81 }
82 }
83
84 void Palette::Allocate(Window &) {
85 if (allowRealization) {
86 }
87 }
88
89
90 //----------------------------------------------------------------------
91
92 Font::Font() {
93 id = 0;
94 ascent = 0;
95 }
96
97 Font::~Font() {
98 }
99
100 void Font::Create(const char *faceName, int characterSet, int size, bool bold, bool italic) {
101 wxFontEncoding encoding;
102
103 Release();
104
105 switch (characterSet) {
106 default:
107 case wxSTC_CHARSET_ANSI:
108 case wxSTC_CHARSET_DEFAULT:
109 encoding = wxFONTENCODING_DEFAULT;
110 break;
111
112 case wxSTC_CHARSET_BALTIC:
113 encoding = wxFONTENCODING_ISO8859_13;
114 break;
115
116 case wxSTC_CHARSET_CHINESEBIG5:
117 encoding = wxFONTENCODING_CP950;
118 break;
119
120 case wxSTC_CHARSET_EASTEUROPE:
121 encoding = wxFONTENCODING_ISO8859_2;
122 break;
123
124 case wxSTC_CHARSET_GB2312:
125 encoding = wxFONTENCODING_CP936;
126 break;
127
128 case wxSTC_CHARSET_GREEK:
129 encoding = wxFONTENCODING_ISO8859_7;
130 break;
131
132 case wxSTC_CHARSET_HANGUL:
133 encoding = wxFONTENCODING_CP949;
134 break;
135
136 case wxSTC_CHARSET_MAC:
137 encoding = wxFONTENCODING_DEFAULT;
138 break;
139
140 case wxSTC_CHARSET_OEM:
141 encoding = wxFONTENCODING_DEFAULT;
142 break;
143
144 case wxSTC_CHARSET_RUSSIAN:
145 encoding = wxFONTENCODING_KOI8;
146 break;
147
148 case wxSTC_CHARSET_SHIFTJIS:
149 encoding = wxFONTENCODING_CP932;
150 break;
151
152 case wxSTC_CHARSET_SYMBOL:
153 encoding = wxFONTENCODING_DEFAULT;
154 break;
155
156 case wxSTC_CHARSET_TURKISH:
157 encoding = wxFONTENCODING_ISO8859_9;
158 break;
159
160 case wxSTC_CHARSET_JOHAB:
161 encoding = wxFONTENCODING_DEFAULT;
162 break;
163
164 case wxSTC_CHARSET_HEBREW:
165 encoding = wxFONTENCODING_ISO8859_8;
166 break;
167
168 case wxSTC_CHARSET_ARABIC:
169 encoding = wxFONTENCODING_ISO8859_6;
170 break;
171
172 case wxSTC_CHARSET_VIETNAMESE:
173 encoding = wxFONTENCODING_DEFAULT;
174 break;
175
176 case wxSTC_CHARSET_THAI:
177 encoding = wxFONTENCODING_ISO8859_11;
178 break;
179 }
180
181 wxFontEncodingArray ea = wxEncodingConverter::GetPlatformEquivalents(encoding);
182 if (ea.GetCount())
183 encoding = ea[0];
184
185 id = new wxFont(size,
186 wxDEFAULT,
187 italic ? wxITALIC : wxNORMAL,
188 bold ? wxBOLD : wxNORMAL,
189 false,
190 wxString(faceName, wxConvUTF8),
191 encoding);
192 }
193
194
195 void Font::Release() {
196 if (id)
197 delete (wxFont*)id;
198 id = 0;
199 }
200
201 //----------------------------------------------------------------------
202
203 class SurfaceImpl : public Surface {
204 private:
205 wxDC* hdc;
206 bool hdcOwned;
207 wxBitmap* bitmap;
208 int x;
209 int y;
210 bool unicodeMode;
211
212 public:
213 SurfaceImpl();
214 ~SurfaceImpl();
215
216 void Init();
217 void Init(SurfaceID sid);
218 void InitPixMap(int width, int height, Surface *surface_);
219
220 void Release();
221 bool Initialised();
222 void PenColour(ColourAllocated fore);
223 int LogPixelsY();
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);
234
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_);
246
247 int SetPalette(Palette *pal, bool inBackGround);
248 void SetClip(PRectangle rc);
249 void FlushCachedState();
250
251 void SetUnicodeMode(bool unicodeMode_);
252
253 void BrushColour(ColourAllocated back);
254 void SetFont(Font &font_);
255 };
256
257
258
259 SurfaceImpl::SurfaceImpl() :
260 hdc(0), hdcOwned(0), bitmap(0),
261 x(0), y(0), unicodeMode(0)
262 {}
263
264 SurfaceImpl::~SurfaceImpl() {
265 Release();
266 }
267
268 void SurfaceImpl::Release() {
269 if (bitmap) {
270 ((wxMemoryDC*)hdc)->SelectObject(wxNullBitmap);
271 delete bitmap;
272 bitmap = 0;
273 }
274 if (hdcOwned) {
275 delete hdc;
276 hdc = 0;
277 hdcOwned = false;
278 }
279 }
280
281
282 bool SurfaceImpl::Initialised() {
283 return hdc != 0;
284 }
285
286 void SurfaceImpl::Init() {
287 Release();
288 hdc = new wxMemoryDC();
289 hdcOwned = true;
290 }
291
292 void SurfaceImpl::Init(SurfaceID hdc_) {
293 Release();
294 hdc = (wxDC*)hdc_;
295 }
296
297 void SurfaceImpl::InitPixMap(int width, int height, Surface *surface_) {
298 Release();
299 hdc = new wxMemoryDC();
300 hdcOwned = true;
301 if (width < 1) width = 1;
302 if (height < 1) height = 1;
303 bitmap = new wxBitmap(width, height);
304 ((wxMemoryDC*)hdc)->SelectObject(*bitmap);
305 }
306
307 void SurfaceImpl::PenColour(ColourAllocated fore) {
308 hdc->SetPen(wxPen(wxColourFromCA(fore), 1, wxSOLID));
309 }
310
311 void SurfaceImpl::BrushColour(ColourAllocated back) {
312 hdc->SetBrush(wxBrush(wxColourFromCA(back), wxSOLID));
313 }
314
315 void SurfaceImpl::SetFont(Font &font_) {
316 if (font_.GetID()) {
317 hdc->SetFont(*((wxFont*)font_.GetID()));
318 }
319 }
320
321 int SurfaceImpl::LogPixelsY() {
322 return hdc->GetPPI().y;
323 }
324
325 int SurfaceImpl::DeviceHeightFont(int points) {
326 return points;
327 }
328
329 void SurfaceImpl::MoveTo(int x_, int y_) {
330 x = x_;
331 y = y_;
332 }
333
334 void SurfaceImpl::LineTo(int x_, int y_) {
335 hdc->DrawLine(x,y, x_,y_);
336 x = x_;
337 y = y_;
338 }
339
340 void SurfaceImpl::Polygon(Point *pts, int npts, ColourAllocated fore, ColourAllocated back) {
341 PenColour(fore);
342 BrushColour(back);
343 hdc->DrawPolygon(npts, (wxPoint*)pts);
344 }
345
346 void SurfaceImpl::RectangleDraw(PRectangle rc, ColourAllocated fore, ColourAllocated back) {
347 PenColour(fore);
348 BrushColour(back);
349 hdc->DrawRectangle(wxRectFromPRectangle(rc));
350 }
351
352 void SurfaceImpl::FillRectangle(PRectangle rc, ColourAllocated back) {
353 BrushColour(back);
354 hdc->SetPen(*wxTRANSPARENT_PEN);
355 hdc->DrawRectangle(wxRectFromPRectangle(rc));
356 }
357
358 void SurfaceImpl::FillRectangle(PRectangle rc, Surface &surfacePattern) {
359 wxBrush br;
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);
365 hdc->SetBrush(br);
366 hdc->DrawRectangle(wxRectFromPRectangle(rc));
367 }
368
369 void SurfaceImpl::RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back) {
370 PenColour(fore);
371 BrushColour(back);
372 hdc->DrawRoundedRectangle(wxRectFromPRectangle(rc), 4);
373 }
374
375 void SurfaceImpl::Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back) {
376 PenColour(fore);
377 BrushColour(back);
378 hdc->DrawEllipse(wxRectFromPRectangle(rc));
379 }
380
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);
386 }
387
388 void SurfaceImpl::DrawTextNoClip(PRectangle rc, Font &font, int ybase,
389 const char *s, int len,
390 ColourAllocated fore, ColourAllocated back) {
391 SetFont(font);
392 hdc->SetTextForeground(wxColourFromCA(fore));
393 hdc->SetTextBackground(wxColourFromCA(back));
394 FillRectangle(rc, back);
395
396 // will convert from UTF-8 in unicode mode
397 wxString str(s, wxConvUTF8, len);
398
399 // ybase is where the baseline should be, but wxWin uses the upper left
400 // corner, so I need to calculate the real position for the text...
401 hdc->DrawText(str, rc.left, ybase - font.ascent);
402 }
403
404 void SurfaceImpl::DrawTextClipped(PRectangle rc, Font &font, int ybase,
405 const char *s, int len,
406 ColourAllocated fore, ColourAllocated back) {
407 SetFont(font);
408 hdc->SetTextForeground(wxColourFromCA(fore));
409 hdc->SetTextBackground(wxColourFromCA(back));
410 FillRectangle(rc, back);
411 hdc->SetClippingRegion(wxRectFromPRectangle(rc));
412
413 // will convert from UTF-8 in unicode mode
414 wxString str(s, wxConvUTF8, len);
415
416 // see comments above
417 hdc->DrawText(str, rc.left, ybase - font.ascent);
418 hdc->DestroyClippingRegion();
419 }
420
421 int SurfaceImpl::WidthText(Font &font, const char *s, int len) {
422 SetFont(font);
423 int w;
424 int h;
425
426 // will convert from UTF-8 in unicode mode
427 wxString str(s, wxConvUTF8, len);
428
429 hdc->GetTextExtent(str, &w, &h);
430 return w;
431 }
432
433
434 void SurfaceImpl::MeasureWidths(Font &font, const char *s, int len, int *positions) {
435 // will convert from UTF-8 in unicode mode
436 wxString str(s, wxConvUTF8, len);
437 SetFont(font);
438
439 // Calculate the position of each character based on the widths of
440 // the previous characters
441 int* tpos = new int[len];
442 int totalWidth = 0;
443 size_t i;
444 for (i=0; i<str.Length(); i++) {
445 int w, h;
446 hdc->GetTextExtent(str[i], &w, &h);
447 totalWidth += w;
448 tpos[i] = totalWidth;
449 }
450
451 #if wxUSE_UNICODE
452 // Map the widths for UCS-2 characters back to the UTF-8 input string
453 i = 0;
454 size_t ui = 0;
455 while (i < len) {
456 unsigned char uch = (unsigned char)s[i];
457 positions[i++] = tpos[ui];
458 if (uch >= 0x80) {
459 if (uch < (0x80 + 0x40 + 0x20)) {
460 positions[i++] = tpos[ui];
461 } else {
462 positions[i++] = tpos[ui];
463 positions[i++] = tpos[ui];
464 }
465 }
466 ui++;
467 }
468 #else
469
470 // If not unicode then just use the widths we have
471 memcpy(positions, tpos, len * sizeof(*tpos));
472 #endif
473
474 delete [] tpos;
475 }
476
477
478 int SurfaceImpl::WidthChar(Font &font, char ch) {
479 SetFont(font);
480 int w;
481 int h;
482 char s[2] = { ch, 0 };
483
484 // will convert from UTF-8 in unicode mode
485 wxString str(s, wxConvUTF8, 1);
486 hdc->GetTextExtent(str, &w, &h);
487 return w;
488 }
489
490 #define EXTENT_TEST wxT(" `~!@#$%^&*()-_=+\\|[]{};:\"\'<,>.?/1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
491
492 int SurfaceImpl::Ascent(Font &font) {
493 SetFont(font);
494 int w, h, d, e;
495 hdc->GetTextExtent(EXTENT_TEST, &w, &h, &d, &e);
496 font.ascent = h - d;
497 return font.ascent;
498 }
499
500 int SurfaceImpl::Descent(Font &font) {
501 SetFont(font);
502 int w, h, d, e;
503 hdc->GetTextExtent(EXTENT_TEST, &w, &h, &d, &e);
504 return d;
505 }
506
507 int SurfaceImpl::InternalLeading(Font &font) {
508 return 0;
509 }
510
511 int SurfaceImpl::ExternalLeading(Font &font) {
512 SetFont(font);
513 int w, h, d, e;
514 hdc->GetTextExtent(EXTENT_TEST, &w, &h, &d, &e);
515 return e;
516 }
517
518 int SurfaceImpl::Height(Font &font) {
519 SetFont(font);
520 return hdc->GetCharHeight();
521 }
522
523 int SurfaceImpl::AverageCharWidth(Font &font) {
524 SetFont(font);
525 return hdc->GetCharWidth();
526 }
527
528 int SurfaceImpl::SetPalette(Palette *pal, bool inBackGround) {
529 return 0;
530 }
531
532 void SurfaceImpl::SetClip(PRectangle rc) {
533 hdc->SetClippingRegion(wxRectFromPRectangle(rc));
534 }
535
536 void SurfaceImpl::FlushCachedState() {
537 }
538
539 void SurfaceImpl::SetUnicodeMode(bool unicodeMode_) {
540 unicodeMode=unicodeMode_;
541 #if wxUSE_UNICODE
542 wxASSERT_MSG(unicodeMode == wxUSE_UNICODE,
543 wxT("Only unicode may be used when wxUSE_UNICODE is on."));
544 #else
545 wxASSERT_MSG(unicodeMode == wxUSE_UNICODE,
546 wxT("Only non-unicode may be used when wxUSE_UNICODE is off."));
547 #endif
548 }
549
550 Surface *Surface::Allocate() {
551 return new SurfaceImpl;
552 }
553
554
555 //----------------------------------------------------------------------
556
557
558 inline wxWindow* GETWIN(WindowID id) { return (wxWindow*)id; }
559
560 Window::~Window() {
561 }
562
563 void Window::Destroy() {
564 if (id)
565 GETWIN(id)->Destroy();
566 id = 0;
567 }
568
569 bool Window::HasFocus() {
570 return wxWindow::FindFocus() == GETWIN(id);
571 }
572
573 PRectangle Window::GetPosition() {
574 wxRect rc(GETWIN(id)->GetPosition(), GETWIN(id)->GetSize());
575 return PRectangleFromwxRect(rc);
576 }
577
578 void Window::SetPosition(PRectangle rc) {
579 wxRect r = wxRectFromPRectangle(rc);
580 GETWIN(id)->SetSize(r);
581 }
582
583 void Window::SetPositionRelative(PRectangle rc, Window) {
584 SetPosition(rc); // ????
585 }
586
587 PRectangle Window::GetClientPosition() {
588 wxSize sz = GETWIN(id)->GetClientSize();
589 return PRectangle(0, 0, sz.x, sz.y);
590 }
591
592 void Window::Show(bool show) {
593 GETWIN(id)->Show(show);
594 }
595
596 void Window::InvalidateAll() {
597 GETWIN(id)->Refresh(false);
598 wxWakeUpIdle();
599 }
600
601 void Window::InvalidateRectangle(PRectangle rc) {
602 wxRect r = wxRectFromPRectangle(rc);
603 GETWIN(id)->Refresh(false, &r);
604 wxWakeUpIdle();
605 }
606
607 void Window::SetFont(Font &font) {
608 GETWIN(id)->SetFont(*((wxFont*)font.GetID()));
609 }
610
611 void Window::SetCursor(Cursor curs) {
612 int cursorId;
613
614 switch (curs) {
615 case cursorText:
616 cursorId = wxCURSOR_IBEAM;
617 break;
618 case cursorArrow:
619 cursorId = wxCURSOR_ARROW;
620 break;
621 case cursorUp:
622 cursorId = wxCURSOR_ARROW; // ** no up arrow... wxCURSOR_UPARROW;
623 break;
624 case cursorWait:
625 cursorId = wxCURSOR_WAIT;
626 break;
627 case cursorHoriz:
628 cursorId = wxCURSOR_SIZEWE;
629 break;
630 case cursorVert:
631 cursorId = wxCURSOR_SIZENS;
632 break;
633 case cursorReverseArrow:
634 cursorId = wxCURSOR_RIGHT_ARROW;
635 break;
636 default:
637 cursorId = wxCURSOR_ARROW;
638 break;
639 }
640
641 GETWIN(id)->SetCursor(wxCursor(cursorId));
642 }
643
644
645 void Window::SetTitle(const char *s) {
646 // will convert from UTF-8 in unicode mode
647 wxString str(s, wxConvUTF8);
648 GETWIN(id)->SetTitle(str);
649 }
650
651
652 //----------------------------------------------------------------------
653 // Helper classes for ListBox
654
655 // A wxListBox that gives focus back to its parent if it gets it.
656 class wxSTCListBox : public wxListBox {
657 public:
658 wxSTCListBox(wxWindow* parent, wxWindowID id)
659 : wxListBox(parent, id, wxDefaultPosition, wxDefaultSize,
660 0, NULL, wxLB_SINGLE | wxSIMPLE_BORDER)
661 {}
662
663 void OnFocus(wxFocusEvent& event) {
664 GetParent()->SetFocus();
665 event.Skip();
666 }
667
668 private:
669 DECLARE_EVENT_TABLE()
670 };
671
672 BEGIN_EVENT_TABLE(wxSTCListBox, wxListBox)
673 EVT_SET_FOCUS(wxSTCListBox::OnFocus)
674 END_EVENT_TABLE()
675
676 #undef wxSTC_USE_POPUP
677 #define wxSTC_USE_POPUP 0 // Leave it off for this one...
678
679
680 // A window to place the listbox upon. If wxPopupWindow is supported then
681 // that will be used so the listbox can extend beyond the client area of the
682 // wxSTC if needed.
683 #if wxUSE_POPUPWIN && wxSTC_USE_POPUP
684 #include <wx/popupwin.h>
685 #define wxSTCListBoxWinBase wxPopupWindow
686 #define param2 wxBORDER_NONE // popup's 2nd param is flags
687 #else
688 #define wxSTCListBoxWinBase wxWindow
689 #define param2 -1 // wxWindow's 2nd param is ID
690 #endif
691
692 class wxSTCListBoxWin : public wxSTCListBoxWinBase {
693 public:
694 wxSTCListBoxWin(wxWindow* parent, wxWindowID id)
695 : wxSTCListBoxWinBase(parent, param2) {
696 lb = new wxSTCListBox(this, id);
697 lb->SetCursor(wxCursor(wxCURSOR_ARROW));
698 }
699
700 void OnSize(wxSizeEvent& event) {
701 lb->SetSize(GetSize());
702 }
703 void OnFocus(wxFocusEvent& event) {
704 GetParent()->SetFocus();
705 event.Skip();
706 }
707
708 wxListBox* GetLB() { return lb; }
709
710 #if wxUSE_POPUPWIN && wxSTC_USE_POPUP
711 virtual void DoSetSize(int x, int y,
712 int width, int height,
713 int sizeFlags = wxSIZE_AUTO) {
714 if (x != -1)
715 GetParent()->ClientToScreen(&x, NULL);
716 if (y != -1)
717 GetParent()->ClientToScreen(NULL, &y);
718 wxSTCListBoxWinBase::DoSetSize(x, y, width, height, sizeFlags);
719 }
720 #endif
721
722 private:
723 wxSTCListBox* lb;
724 DECLARE_EVENT_TABLE()
725 };
726
727 BEGIN_EVENT_TABLE(wxSTCListBoxWin, wxSTCListBoxWinBase)
728 EVT_SIZE (wxSTCListBoxWin::OnSize)
729 EVT_SET_FOCUS (wxSTCListBoxWin::OnFocus)
730 END_EVENT_TABLE()
731
732
733 inline wxListBox* GETLB(WindowID win) {
734 return (((wxSTCListBoxWin*)win)->GetLB());
735 }
736
737 //----------------------------------------------------------------------
738
739 ListBox::ListBox() {
740 }
741
742 ListBox::~ListBox() {
743 }
744
745 void ListBox::Create(Window &parent, int ctrlID) {
746 id = new wxSTCListBoxWin(GETWIN(parent.GetID()), ctrlID);
747 }
748
749 void ListBox::SetVisibleRows(int rows) {
750 desiredVisibleRows = rows;
751 }
752
753 PRectangle ListBox::GetDesiredRect() {
754 wxSize sz = GETLB(id)->GetBestSize();
755 PRectangle rc;
756 rc.top = 0;
757 rc.left = 0;
758 if (sz.x > 400)
759 sz.x = 400;
760 if (sz.y > 140) // TODO: Use desiredVisibleRows??
761 sz.y = 140;
762 rc.right = sz.x;
763 rc.bottom = sz.y;
764 return rc;
765 }
766
767 void ListBox::SetAverageCharWidth(int width) {
768 aveCharWidth = width;
769 }
770
771 void ListBox::SetFont(Font &font) {
772 GETLB(id)->SetFont(*((wxFont*)font.GetID()));
773 }
774
775 void ListBox::Clear() {
776 GETLB(id)->Clear();
777 }
778
779 void ListBox::Append(char *s) {
780 GETLB(id)->Append(s);
781 }
782
783 int ListBox::Length() {
784 return GETLB(id)->GetCount();
785 }
786
787 void ListBox::Select(int n) {
788 GETLB(id)->SetSelection(n);
789 #ifdef __WXGTK__
790 if (n > 4)
791 n = n - 4;
792 else
793 n = 1;
794 GETLB(id)->SetFirstItem(n);
795 #endif
796 }
797
798 int ListBox::GetSelection() {
799 return GETLB(id)->GetSelection();
800 }
801
802 int ListBox::Find(const char *prefix) {
803 // No longer used
804 return -1;
805 }
806
807 void ListBox::GetValue(int n, char *value, int len) {
808 wxString text = GETLB(id)->GetString(n);
809 strncpy(value, text.mb_str(wxConvUTF8), len);
810 value[len-1] = '\0';
811 }
812
813 void ListBox::Sort() {
814 }
815
816 //----------------------------------------------------------------------
817
818 Menu::Menu() : id(0) {
819 }
820
821 void Menu::CreatePopUp() {
822 Destroy();
823 id = new wxMenu();
824 }
825
826 void Menu::Destroy() {
827 if (id)
828 delete (wxMenu*)id;
829 id = 0;
830 }
831
832 void Menu::Show(Point pt, Window &w) {
833 GETWIN(w.GetID())->PopupMenu((wxMenu*)id, pt.x - 4, pt.y);
834 Destroy();
835 }
836
837 //----------------------------------------------------------------------
838
839 ColourDesired Platform::Chrome() {
840 wxColour c;
841 c = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
842 return ColourDesired(c.Red(), c.Green(), c.Blue());
843 }
844
845 ColourDesired Platform::ChromeHighlight() {
846 wxColour c;
847 c = wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT);
848 return ColourDesired(c.Red(), c.Green(), c.Blue());
849 }
850
851 const char *Platform::DefaultFont() {
852 static char buf[128];
853 strcpy(buf, wxNORMAL_FONT->GetFaceName().mbc_str());
854 return buf;
855 }
856
857 int Platform::DefaultFontSize() {
858 return 8;
859 }
860
861 unsigned int Platform::DoubleClickTime() {
862 return 500; // **** ::GetDoubleClickTime();
863 }
864
865 void Platform::DebugDisplay(const char *s) {
866 wxLogDebug(wxString(s, *wxConvCurrent));
867 }
868
869 bool Platform::IsKeyDown(int key) {
870 return false; // I don't think we'll need this.
871 }
872
873 long Platform::SendScintilla(WindowID w,
874 unsigned int msg,
875 unsigned long wParam,
876 long lParam) {
877
878 wxStyledTextCtrl* stc = (wxStyledTextCtrl*)w;
879 return stc->SendMsg(msg, wParam, lParam);
880 }
881
882
883 // These are utility functions not really tied to a platform
884
885 int Platform::Minimum(int a, int b) {
886 if (a < b)
887 return a;
888 else
889 return b;
890 }
891
892 int Platform::Maximum(int a, int b) {
893 if (a > b)
894 return a;
895 else
896 return b;
897 }
898
899 #define TRACE
900
901 void Platform::DebugPrintf(const char *format, ...) {
902 #ifdef TRACE
903 char buffer[2000];
904 va_list pArguments;
905 va_start(pArguments, format);
906 vsprintf(buffer,format,pArguments);
907 va_end(pArguments);
908 Platform::DebugDisplay(buffer);
909 #endif
910 }
911
912
913 static bool assertionPopUps = true;
914
915 bool Platform::ShowAssertionPopUps(bool assertionPopUps_) {
916 bool ret = assertionPopUps;
917 assertionPopUps = assertionPopUps_;
918 return ret;
919 }
920
921 void Platform::Assert(const char *c, const char *file, int line) {
922 char buffer[2000];
923 sprintf(buffer, "Assertion [%s] failed at %s %d", c, file, line);
924 if (assertionPopUps) {
925 int idButton = wxMessageBox(wxString(buffer, *wxConvCurrent),
926 wxT("Assertion failure"),
927 wxICON_HAND | wxOK);
928 // if (idButton == IDRETRY) {
929 // ::DebugBreak();
930 // } else if (idButton == IDIGNORE) {
931 // // all OK
932 // } else {
933 // abort();
934 // }
935 } else {
936 strcat(buffer, "\r\n");
937 Platform::DebugDisplay(buffer);
938 abort();
939 }
940 }
941
942
943 int Platform::Clamp(int val, int minVal, int maxVal) {
944 if (val > maxVal)
945 val = maxVal;
946 if (val < minVal)
947 val = minVal;
948 return val;
949 }
950
951
952 bool Platform::IsDBCSLeadByte(int codePage, char ch) {
953 return false;
954 }
955
956
957
958 //----------------------------------------------------------------------
959
960 ElapsedTime::ElapsedTime() {
961 wxStartTimer();
962 }
963
964 double ElapsedTime::Duration(bool reset) {
965 double result = wxGetElapsedTime(reset);
966 result /= 1000.0;
967 return result;
968 }
969
970
971 //----------------------------------------------------------------------
972
973
974
975