]> git.saurik.com Git - wxWidgets.git/blobdiff - src/stc/PlatWX.cpp
fix for get best size when having empty labels
[wxWidgets.git] / src / stc / PlatWX.cpp
index ec41de273331d17a729f4bf07f449eb00325bfa8..46d478e701323eac44c006e730d70cd14ffa64bc 100644 (file)
@@ -28,9 +28,9 @@ Point Point::FromLong(long lpoint) {
 }
 
 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) {
@@ -100,7 +100,7 @@ Font::Font() {
 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();
@@ -185,13 +185,15 @@ void Font::Create(const char *faceName, int characterSet, int size, bool bold, b
     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;
 }
 
 
@@ -288,7 +290,7 @@ void SurfaceImpl::Init(SurfaceID hdc_, WindowID) {
     hdc = (wxDC*)hdc_;
 }
 
-void SurfaceImpl::InitPixMap(int width, int height, Surface *surface_, WindowID) {
+void SurfaceImpl::InitPixMap(int width, int height, Surface *WXUNUSED(surface_), WindowID) {
     Release();
     hdc = new wxMemoryDC();
     hdcOwned = true;
@@ -405,7 +407,7 @@ void SurfaceImpl::DrawTextNoClip(PRectangle rc, Font &font, int ybase,
     SetFont(font);
     hdc->SetTextForeground(wxColourFromCA(fore));
     hdc->SetTextBackground(wxColourFromCA(back));
-    //FillRectangle(rc, back);
+    FillRectangle(rc, back);
 
     // ybase is where the baseline should be, but wxWin uses the upper left
     // corner, so I need to calculate the real position for the text...
@@ -418,11 +420,12 @@ void SurfaceImpl::DrawTextClipped(PRectangle rc, Font &font, int ybase,
     SetFont(font);
     hdc->SetTextForeground(wxColourFromCA(fore));
     hdc->SetTextBackground(wxColourFromCA(back));
-    //FillRectangle(rc, back);
+    FillRectangle(rc, back);
     hdc->SetClippingRegion(wxRectFromPRectangle(rc));
 
     // see comments above
     hdc->DrawText(stc2wx(s, len), rc.left, ybase - font.ascent);
+    hdc->DestroyClippingRegion();
 }
 
 
@@ -444,44 +447,20 @@ void SurfaceImpl::DrawTextTransparent(PRectangle rc, Font &font, int ybase,
 
 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];
-    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];
-    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 (i < len) {
+    while ((int)i < len) {
         unsigned char uch = (unsigned char)s[i];
         positions[i++] = tpos[ui];
         if (uch >= 0x80) {
@@ -497,10 +476,8 @@ void SurfaceImpl::MeasureWidths(Font &font, const char *s, int len, int *positio
 #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;
 }
 
 
@@ -541,7 +518,7 @@ int SurfaceImpl::Descent(Font &font) {
     return d;
 }
 
-int SurfaceImpl::InternalLeading(Font &font) {
+int SurfaceImpl::InternalLeading(Font &WXUNUSED(font)) {
     return 0;
 }
 
@@ -554,7 +531,7 @@ int SurfaceImpl::ExternalLeading(Font &font) {
 
 int SurfaceImpl::Height(Font &font) {
     SetFont(font);
-    return hdc->GetCharHeight();
+    return hdc->GetCharHeight() + 1;
 }
 
 int SurfaceImpl::AverageCharWidth(Font &font) {
@@ -562,7 +539,7 @@ int SurfaceImpl::AverageCharWidth(Font &font) {
     return hdc->GetCharWidth();
 }
 
-int SurfaceImpl::SetPalette(Palette *pal, bool inBackGround) {
+int SurfaceImpl::SetPalette(Palette *WXUNUSED(pal), bool WXUNUSED(inBackGround)) {
     return 0;
 }
 
@@ -575,16 +552,9 @@ void SurfaceImpl::FlushCachedState() {
 
 void SurfaceImpl::SetUnicodeMode(bool unicodeMode_) {
     unicodeMode=unicodeMode_;
-#if wxUSE_UNICODE
-    wxASSERT_MSG(unicodeMode == wxUSE_UNICODE,
-                 wxT("Only unicode may be used when wxUSE_UNICODE is on."));
-#else
-    wxASSERT_MSG(unicodeMode == wxUSE_UNICODE,
-                 wxT("Only non-unicode may be used when wxUSE_UNICODE is off."));
-#endif
 }
 
-void SurfaceImpl::SetDBCSMode(int codePage) {
+void SurfaceImpl::SetDBCSMode(int WXUNUSED(codePage)) {
     // dbcsMode = codePage == SC_CP_DBCS;
 }
 
@@ -681,6 +651,7 @@ void Window::SetCursor(Cursor curs) {
         break;
     case cursorHand:
         cursorId = wxCURSOR_HAND;
+        break;
     default:
         cursorId = wxCURSOR_ARROW;
         break;
@@ -703,7 +674,7 @@ void Window::SetTitle(const char *s) {
 // Helper classes for ListBox
 
 
-// This is a simple subclass of wxLIstView that just resets focus to the
+// This is a simple subclass of wxListView that just resets focus to the
 // parent when it gets it.
 class wxSTCListBox : public wxListView {
 public:
@@ -718,12 +689,17 @@ public:
         event.Skip();
     }
 
+    void OnKillFocus(wxFocusEvent& WXUNUSED(event)) {
+        // Do nothing.  Prevents base class from resetting the colors...
+    }
+
 private:
     DECLARE_EVENT_TABLE()
 };
 
 BEGIN_EVENT_TABLE(wxSTCListBox, wxListView)
     EVT_SET_FOCUS( wxSTCListBox::OnFocus)
+    EVT_KILL_FOCUS(wxSTCListBox::OnKillFocus)
 END_EVENT_TABLE()
 
 
@@ -737,18 +713,42 @@ private:
     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));
         lv->InsertColumn(0, wxEmptyString);
         lv->InsertColumn(1, wxEmptyString);
+
+        // Eventhough we immediately reset the focus to the parent, this helps
+        // things to look right...
+        lv->SetFocus();
+
         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__
+        // There 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;
+    }
+
+    
     int IconWidth() {
         wxImageList* il = lv->GetImageList(wxIMAGE_LIST_SMALL);
         if (il != NULL) {
@@ -772,9 +772,9 @@ public:
     }
 
     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) -
@@ -782,7 +782,7 @@ public:
         event.Skip();
     }
 
-    void OnActivate(wxListEvent& event) {
+    void OnActivate(wxListEvent& WXUNUSED(event)) {
         doubleClickAction(doubleClickActionData);
     }
 
@@ -838,7 +838,6 @@ public:
     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 *);
@@ -894,7 +893,7 @@ PRectangle ListBoxImpl::GetDesiredRect() {
     // wxListCtrl doesn't have a DoGetBestSize, so instead we kept track of
     // the max size in Append and calculate it here...
     int maxw = maxStrWidth;
-    int maxh = 0;
+    int maxh ;
 
     // give it a default if there are no lines, and/or add a bit more
     if (maxw == 0) maxw = 100;
@@ -975,7 +974,7 @@ int ListBoxImpl::GetSelection() {
 }
 
 
-int ListBoxImpl::Find(const char *prefix) {
+int ListBoxImpl::Find(const char *WXUNUSED(prefix)) {
     // No longer used
     return -1;
 }
@@ -991,9 +990,6 @@ void ListBoxImpl::GetValue(int n, char *value, int len) {
     value[len-1] = '\0';
 }
 
-void ListBoxImpl::Sort() {
-}
-
 
 void ListBoxImpl::RegisterImage(int type, const char *xpm_data) {
     wxMemoryInputStream stream(xpm_data, strlen(xpm_data)+1);
@@ -1069,6 +1065,13 @@ void Menu::Show(Point pt, Window &w) {
 
 //----------------------------------------------------------------------
 
+DynamicLibrary *DynamicLibrary::Load(const char *WXUNUSED(modulePath)) {
+    wxFAIL_MSG(wxT("Dynamic lexer loading not implemented yet"));
+    return NULL;
+}
+
+//----------------------------------------------------------------------
+
 ColourDesired Platform::Chrome() {
     wxColour c;
     c = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
@@ -1102,7 +1105,7 @@ void Platform::DebugDisplay(const char *s) {
     wxLogDebug(stc2wx(s));
 }
 
-bool Platform::IsKeyDown(int key) {
+bool Platform::IsKeyDown(int WXUNUSED(key)) {
     return false;  // I don't think we'll need this.
 }
 
@@ -1195,16 +1198,16 @@ int Platform::Clamp(int val, int minVal, int maxVal) {
 }
 
 
-bool Platform::IsDBCSLeadByte(int codePage, char ch) {
+bool Platform::IsDBCSLeadByte(int WXUNUSED(codePage), char WXUNUSED(ch)) {
     return false;
 }
 
-int Platform::DBCSCharLength(int codePage, const char *s) {
-    return 0;
+int Platform::DBCSCharLength(int WXUNUSED(codePage), const char *WXUNUSED(s)) {
+    return 1;
 }
 
 int Platform::DBCSCharMaxLength() {
-    return 0;
+    return 1;
 }
 
 
@@ -1223,6 +1226,22 @@ double ElapsedTime::Duration(bool reset) {
 
 //----------------------------------------------------------------------
 
+#if wxUSE_UNICODE
+wxString stc2wx(const char* str, size_t len)
+{
+    char *buffer=new char[len+1];
+    strncpy(buffer, str, len);
+    buffer[len]=0;
+
+    wxString cstr(buffer, wxConvUTF8, len);
+
+    delete[] buffer;
+    return cstr;
+}
+#endif
+
+
+