]> git.saurik.com Git - wxWidgets.git/blobdiff - src/stc/PlatWX.cpp
removed SetVirtualSizeHints() and related code
[wxWidgets.git] / src / stc / PlatWX.cpp
index e19b281f8c690b4a7527d643d00f156b7e4fc685..46020203e9c7fd2eb35c9b319cfcc831af58a360 100644 (file)
@@ -4,9 +4,27 @@
 //                        Robin Dunn <robin@aldunn.com>
 // The License.txt file describes the conditions under which this software may be distributed.
 
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#if wxUSE_STC
+
+#ifndef WX_PRECOMP
+    #include "wx/menu.h"
+    #include "wx/dcmemory.h"
+    #include "wx/settings.h"
+#endif // WX_PRECOMP
+
 #include <ctype.h>
 
-#include "wx/wx.h"
+#if wxUSE_DISPLAY
+#include "wx/display.h"
+#endif
+
 #include "wx/encconv.h"
 #include "wx/listctrl.h"
 #include "wx/mstream.h"
@@ -21,6 +39,7 @@
 #include "Platform.h"
 #include "PlatWX.h"
 #include "wx/stc/stc.h"
+#include "wx/stc/private.h"
 
 
 
@@ -140,7 +159,7 @@ void Font::Create(const char *faceName, int characterSet, int size, bool bold, b
                     false,
                     stc2wx(faceName),
                     encoding);
-    font->SetNoAntiAliasing(!extraFontFlag);
+    //font->SetNoAntiAliasing(!extraFontFlag);
     id = font;
 }
 
@@ -349,11 +368,14 @@ void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize,
                                  ColourAllocated outline, int alphaOutline,
                                  int /*flags*/) {
 #ifdef wxHAVE_RAW_BITMAP
+
+    // TODO:  do something with cornerSize
+    wxUnusedVar(cornerSize);
+    
     int x, y;
     wxRect r = wxRectFromPRectangle(rc);
     wxBitmap bmp(r.width, r.height, 32);
     wxAlphaPixelData pixData(bmp);
-    pixData.UseAlpha();
 
     // Set the fill pixels
     ColourDesired cdf(fill.AsLong());
@@ -408,7 +430,10 @@ void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize,
     hdc->DrawBitmap(bmp, r.x, r.y, true);
 
 #else
-        RectangleDraw(rc, outline, fill);
+    wxUnusedVar(cornerSize);
+    wxUnusedVar(alphaFill);
+    wxUnusedVar(alphaOutline);
+    RectangleDraw(rc, outline, fill);
 #endif
 }
 
@@ -700,6 +725,19 @@ void Window::SetTitle(const char *s) {
 }
 
 
+// Returns rectangle of monitor pt is on
+PRectangle Window::GetMonitorRect(Point pt) {
+    wxRect rect;
+    if (! id) return PRectangle();
+#if wxUSE_DISPLAY
+    // Get the display the point is found on
+    int n = wxDisplay::GetFromPoint(wxPoint(pt.x, pt.y));
+    wxDisplay dpy(n == wxNOT_FOUND ? 0 : n);
+    rect = dpy.GetGeometry();
+#endif
+    return PRectangleFromwxRect(rect);
+}
+
 //----------------------------------------------------------------------
 // Helper classes for ListBox
 
@@ -762,7 +800,7 @@ END_EVENT_TABLE()
 
 
 #if wxUSE_POPUPWIN //-----------------------------------
-#include <wx/popupwin.h>
+#include "wx/popupwin.h"
 
 
 //
@@ -784,9 +822,10 @@ public:
     wxSTCListBoxWin(wxWindow* parent, wxWindowID id, Point WXUNUSED(location)) :
         wxPopupWindow(parent, wxBORDER_NONE)
     {
+        
         SetBackgroundColour(*wxBLACK);  // for our simple border
 
-        lv = new wxSTCListBox(parent, id, wxDefaultPosition, wxDefaultSize,
+        lv = new wxSTCListBox(parent, id, wxPoint(-50,-50), wxDefaultSize,
                               wxLC_REPORT | wxLC_SINGLE_SEL | wxLC_NO_HEADER | wxBORDER_NONE);
         lv->SetCursor(wxCursor(wxCURSOR_ARROW));
         lv->InsertColumn(0, wxEmptyString);
@@ -890,17 +929,28 @@ END_EVENT_TABLE()
 
 
 
-#else // wxUSE_POPUPWIN -----------------------------------
+#else // !wxUSE_POPUPWIN -----------------------------------
+#include "wx/frame.h"
 
-// A normal window to place the wxSTCListBox upon.
-class wxSTCListBoxWin : public wxWindow {
+// A normal window to place the wxSTCListBox upon, but make it behave as much
+// like a wxPopupWindow as possible
+class wxSTCListBoxWin : public wxFrame {
 private:
     wxListView*         lv;
     CallBackAction      doubleClickAction;
     void*               doubleClickActionData;
 public:
     wxSTCListBoxWin(wxWindow* parent, wxWindowID id, Point location) :
-        wxWindow(parent, id, wxPoint(location.x, location.y), wxSize(0,0), wxSIMPLE_BORDER )
+        wxFrame(parent, id, wxEmptyString, wxPoint(location.x, location.y), wxSize(0,0),
+                wxFRAME_NO_TASKBAR
+                | wxFRAME_FLOAT_ON_PARENT
+#ifdef __WXMAC__
+                | wxPOPUP_WINDOW 
+                | wxNO_BORDER
+#else
+                | wxSIMPLE_BORDER
+#endif
+            )
     {
 
         lv = new wxSTCListBox(this, id, wxDefaultPosition, wxDefaultSize,
@@ -914,14 +964,15 @@ public:
         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() {
+    bool Destroy()
+    {
 #ifdef __WXMAC__
         // The bottom edge of this window is not getting properly
         // refreshed upon deletion, so help it out...
@@ -936,7 +987,8 @@ public:
     }
 
 
-    int IconWidth() {
+    int IconWidth()
+    {
         wxImageList* il = lv->GetImageList(wxIMAGE_LIST_SMALL);
         if (il != NULL) {
             int w, h;
@@ -947,18 +999,22 @@ public:
     }
 
 
-    void SetDoubleClickAction(CallBackAction action, void *data) {
+    void SetDoubleClickAction(CallBackAction action, void *data)
+    {
         doubleClickAction = action;
         doubleClickActionData = data;
     }
 
 
-    void OnFocus(wxFocusEvent& event) {
+    void OnFocus(wxFocusEvent& event)
+    {
+        ActivateParent();
         GetParent()->SetFocus();
         event.Skip();
     }
 
-    void OnSize(wxSizeEvent& event) {
+    void OnSize(wxSizeEvent& event)
+    {
         // resize the child
         wxSize sz = GetClientSize();
         lv->SetSize(sz);
@@ -969,15 +1025,44 @@ public:
         event.Skip();
     }
 
+    void ActivateParent()
+    {
+        // Although we're a frame, we always want the parent to be active, so
+        // raise it whenever we get shown, focused, etc.
+        wxTopLevelWindow *frame = wxDynamicCast(
+            wxGetTopLevelParent(GetParent()), wxTopLevelWindow);
+        if (frame)
+            frame->Raise();
+    }
+        
+
+    virtual void DoSetSize(int x, int y,
+                           int width, int height,
+                           int sizeFlags = wxSIZE_AUTO)
+    {
+        // convert coords to screen coords since we're a top-level window
+        if (x != wxDefaultCoord) {
+            GetParent()->ClientToScreen(&x, NULL);
+        }
+        if (y != wxDefaultCoord) {
+            GetParent()->ClientToScreen(NULL, &y);
+        }
+        wxFrame::DoSetSize(x, y, width, height, sizeFlags);
+    }
+
+    virtual bool Show(bool show = true)
+    {
+        bool rv = wxFrame::Show(show);
+        if (rv && show)
+            ActivateParent();
 #ifdef __WXMAC__
-    virtual bool Show(bool show = true) {
-        bool rv = wxWindow::Show(show);
         GetParent()->Refresh(false);
+#endif
         return rv;
     }
-#endif
 
-    void OnActivate(wxListEvent& WXUNUSED(event)) {
+    void OnActivate(wxListEvent& WXUNUSED(event))
+    {
         doubleClickAction(doubleClickActionData);
     }
 
@@ -1186,7 +1271,7 @@ void ListBoxImpl::Select(int n) {
         n = 0;
         select = false;
     }
-    GETLB(id)->Focus(n);
+    GETLB(id)->EnsureVisible(n);
     GETLB(id)->Select(n, select);
 }
 
@@ -1323,9 +1408,6 @@ unsigned int Platform::DoubleClickTime() {
 bool Platform::MouseButtonBounce() {
     return false;
 }
-void Platform::DebugDisplay(const char *s) {
-    wxLogDebug(stc2wx(s));
-}
 
 bool Platform::IsKeyDown(int WXUNUSED(key)) {
     return false;  // I don't think we'll need this.
@@ -1366,7 +1448,15 @@ int Platform::Maximum(int a, int b) {
         return b;
 }
 
-#define TRACE
+//#define TRACE
+
+void Platform::DebugDisplay(const char *s) {
+#ifdef TRACE
+    wxLogDebug(stc2wx(s));
+#else
+    wxUnusedVar(s);
+#endif
+}
 
 void Platform::DebugPrintf(const char *format, ...) {
 #ifdef TRACE
@@ -1376,6 +1466,8 @@ void Platform::DebugPrintf(const char *format, ...) {
     vsprintf(buffer,format,pArguments);
     va_end(pArguments);
     Platform::DebugDisplay(buffer);
+#else
+    wxUnusedVar(format);
 #endif
 }
 
@@ -1389,6 +1481,7 @@ bool Platform::ShowAssertionPopUps(bool assertionPopUps_) {
 }
 
 void Platform::Assert(const char *c, const char *file, int line) {
+#ifdef TRACE
     char buffer[2000];
     sprintf(buffer, "Assertion [%s] failed at %s %d", c, file, line);
     if (assertionPopUps) {
@@ -1396,18 +1489,16 @@ void Platform::Assert(const char *c, const char *file, int line) {
         wxMessageBox(stc2wx(buffer),
                      wxT("Assertion failure"),
                      wxICON_HAND | wxOK);
-//      if (idButton == IDRETRY) {
-//          ::DebugBreak();
-//      } else if (idButton == IDIGNORE) {
-//          // all OK
-//      } else {
-//          abort();
-//      }
     } else {
         strcat(buffer, "\r\n");
         Platform::DebugDisplay(buffer);
         abort();
     }
+#else
+    wxUnusedVar(c);
+    wxUnusedVar(file);
+    wxUnusedVar(line);
+#endif
 }
 
 
@@ -1469,10 +1560,10 @@ wxString stc2wx(const char* str, size_t len)
     if (!len)
         return wxEmptyString;
 
-    size_t wclen = UCS2Length(str, len);
+    size_t wclen = UTF16Length(str, len);
     wxWCharBuffer buffer(wclen+1);
 
-    size_t actualLen = UCS2FromUTF8(str, len, buffer.data(), wclen+1);
+    size_t actualLen = UTF16FromUTF8(str, len, buffer.data(), wclen+1);
     return wxString(buffer.data(), actualLen);
 }
 
@@ -1491,7 +1582,7 @@ const wxWX2MBbuf wx2stc(const wxString& str)
     size_t len           = UTF8Length(wcstr, wclen);
 
     wxCharBuffer buffer(len+1);
-    UTF8FromUCS2(wcstr, wclen, buffer.data(), len);
+    UTF8FromUTF16(wcstr, wclen, buffer.data(), len);
 
     // TODO check NULL termination!!
 
@@ -1499,3 +1590,5 @@ const wxWX2MBbuf wx2stc(const wxString& str)
 }
 
 #endif
+
+#endif // wxUSE_STC