// Scintilla source code edit control
-// PlatWX.cxx - implementation of platform facilities on wxWindows
+// PlatWX.cxx - implementation of platform facilities on wxWidgets
// Copyright 1998-1999 by Neil Hodgson <neilh@scintilla.org>
// Robin Dunn <robin@aldunn.com>
// The License.txt file describes the conditions under which this software may be distributed.
}
wxRect wxRectFromPRectangle(PRectangle prc) {
- wxRect rc(prc.left, prc.top,
- prc.right-prc.left, prc.bottom-prc.top);
- return rc;
+ wxRect r(prc.left, prc.top,
+ prc.Width(), prc.Height());
+ return r;
}
PRectangle PRectangleFromwxRect(wxRect rc) {
Font::~Font() {
}
-void Font::Create(const char *faceName, int characterSet, int size, bool bold, bool italic) {
+void Font::Create(const char *faceName, int characterSet, int size, bool bold, bool italic, bool extraFontFlag) {
wxFontEncoding encoding;
Release();
if (ea.GetCount())
encoding = ea[0];
- id = new wxFont(size,
+ wxFont* font = new wxFont(size,
wxDEFAULT,
italic ? wxITALIC : wxNORMAL,
bold ? wxBOLD : wxNORMAL,
false,
stc2wx(faceName),
encoding);
+ font->SetNoAntiAliasing(!extraFontFlag);
+ id = font;
}
void SurfaceImpl::MeasureWidths(Font &font, const char *s, int len, int *positions) {
- wxString str = stc2wx(s, len);
- SetFont(font);
+ wxString str = stc2wx(s, len);
+ wxArrayInt tpos;
-#ifndef __WXMAC__
- // Calculate the position of each character based on the widths of
- // the previous characters
- int* tpos = new int[len+1];
- int totalWidth = 0;
- size_t i;
- for (i=0; i<str.Length(); i++) {
- int w, h;
- hdc->GetTextExtent(str[i], &w, &h);
- totalWidth += w;
- tpos[i] = totalWidth;
- }
-#else
- // Instead of a running total, remeasure from the begining of the
- // text for each character's position. This is because with AA fonts
- // on OS X widths can be fractions of pixels wide when more than one
- // are drawn together, so the sum of all character widths is not necessarily
- // (and probably not) the same as the whole string width.
- int* tpos = new int[len+1];
- size_t i;
- for (i=0; i<str.Length(); i++) {
- int w, h;
- hdc->GetTextExtent(str.Left(i+1), &w, &h);
- tpos[i] = w;
- }
-#endif
+ SetFont(font);
+ hdc->GetPartialTextExtents(str, tpos);
#if wxUSE_UNICODE
// Map the widths for UCS-2 characters back to the UTF-8 input string
// NOTE: I don't think this is right for when sizeof(wxChar) > 2, ie wxGTK2
// so figure it out and fix it!
- i = 0;
+ size_t i = 0;
size_t ui = 0;
while ((int)i < len) {
unsigned char uch = (unsigned char)s[i];
#else
// If not unicode then just use the widths we have
- memcpy(positions, tpos, len * sizeof(*tpos));
+ memcpy(positions, tpos.begin(), len * sizeof(int));
#endif
-
- delete [] tpos;
}
int SurfaceImpl::Height(Font &font) {
SetFont(font);
- return hdc->GetCharHeight();
+ return hdc->GetCharHeight() + 1;
}
int SurfaceImpl::AverageCharWidth(Font &font) {
: wxListView(parent, id, pos, size, style)
{}
+
void OnFocus(wxFocusEvent& event) {
GetParent()->SetFocus();
event.Skip();
}
- void OnKillFocus(wxFocusEvent& event) {
+ void OnKillFocus(wxFocusEvent& WXUNUSED(event)) {
// Do nothing. Prevents base class from resetting the colors...
}
+
+#ifdef __WXMAC__
+ // For some reason I don't understand yet the focus doesn't really leave
+ // the listbox like it should, so if we get any events feed them back to
+ // the wxSTC
+ void OnKeyDown(wxKeyEvent& event) {
+ GetGrandParent()->GetEventHandler()->ProcessEvent(event);
+ }
+ void OnChar(wxKeyEvent& event) {
+ GetGrandParent()->GetEventHandler()->ProcessEvent(event);
+ }
+ // And we need to force the focus back when being destroyed
+ ~wxSTCListBox() {
+ GetGrandParent()->SetFocus();
+ }
+#endif
+
private:
DECLARE_EVENT_TABLE()
};
BEGIN_EVENT_TABLE(wxSTCListBox, wxListView)
EVT_SET_FOCUS( wxSTCListBox::OnFocus)
EVT_KILL_FOCUS(wxSTCListBox::OnKillFocus)
+#ifdef __WXMAC__
+ EVT_KEY_DOWN( wxSTCListBox::OnKeyDown)
+ EVT_CHAR( wxSTCListBox::OnChar)
+#endif
END_EVENT_TABLE()
void* doubleClickActionData;
public:
wxSTCListBoxWin(wxWindow* parent, wxWindowID id) :
- wxWindow(parent, id, wxDefaultPosition, wxSize(0,0), wxNO_BORDER )
+ wxWindow(parent, id, wxDefaultPosition, wxSize(0,0), wxSIMPLE_BORDER )
{
- SetBackgroundColour(*wxBLACK);
lv = new wxSTCListBox(this, id, wxDefaultPosition, wxDefaultSize,
wxLC_REPORT | wxLC_SINGLE_SEL | wxLC_NO_HEADER | wxNO_BORDER);
lv->SetCursor(wxCursor(wxCURSOR_ARROW));
Hide();
}
-
+
// On OSX and (possibly others) there can still be pending
// messages/events for the list control when Scintilla wants to
// close it, so do a pending delete of it instead of destroying
// immediately.
bool Destroy() {
+#ifdef __WXMAC__
+ // The bottom edge of this window is not getting properly
+ // refreshed upon deletion, so help it out...
+ wxWindow* p = GetParent();
+ wxRect r(GetPosition(), GetSize());
+ r.SetHeight(r.GetHeight()+1);
+ p->Refresh(false, &r);
+#endif
if ( !wxPendingDelete.Member(this) )
wxPendingDelete.Append(this);
return TRUE;
}
void OnSize(wxSizeEvent& event) {
- // resize the child, leaving a 1 pixel border
+ // resize the child
wxSize sz = GetClientSize();
- lv->SetSize(1, 1, sz.x-2, sz.y-2);
+ lv->SetSize(sz);
// reset the column widths
lv->SetColumnWidth(0, IconWidth()+4);
lv->SetColumnWidth(1, sz.x - 2 - lv->GetColumnWidth(0) -
event.Skip();
}
- void OnActivate(wxListEvent& event) {
+ void OnActivate(wxListEvent& WXUNUSED(event)) {
doubleClickAction(doubleClickActionData);
}
virtual int GetSelection();
virtual int Find(const char *prefix);
virtual void GetValue(int n, char *value, int len);
- virtual void Sort();
virtual void RegisterImage(int type, const char *xpm_data);
virtual void ClearRegisteredImages();
virtual void SetDoubleClickAction(CallBackAction, void *);
value[len-1] = '\0';
}
-void ListBoxImpl::Sort() {
-}
-
void ListBoxImpl::RegisterImage(int type, const char *xpm_data) {
wxMemoryInputStream stream(xpm_data, strlen(xpm_data)+1);
#if wxUSE_UNICODE
wxString stc2wx(const char* str, size_t len)
{
+ // note: we assume that str is of length len not including the terminating null.
+
+ if (!len)
+ return wxEmptyString;
+ else if (str[len-1] == 0)
+ // It's already terminated correctly.
+ return wxString(str, wxConvUTF8, len);
+
char *buffer=new char[len+1];
strncpy(buffer, str, len);
buffer[len]=0;
- wxString cstr(buffer, wxConvUTF8);
+ wxString cstr(buffer, wxConvUTF8, len);
delete[] buffer;
return cstr;