X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5e99793eca269084aa3082cbda54ebced7fdf802..7749035c4edc84ff7ad722c0de8ff1679b68976f:/src/stc/PlatWX.cpp diff --git a/src/stc/PlatWX.cpp b/src/stc/PlatWX.cpp index 06497eb0dd..0e92b30e8a 100644 --- a/src/stc/PlatWX.cpp +++ b/src/stc/PlatWX.cpp @@ -6,12 +6,17 @@ #include <ctype.h> -#include <wx/wx.h> -#include <wx/encconv.h> -#include <wx/listctrl.h> -#include <wx/mstream.h> -#include <wx/image.h> -#include <wx/imaglist.h> +#include "wx/wx.h" +#include "wx/encconv.h" +#include "wx/listctrl.h" +#include "wx/mstream.h" +#include "wx/image.h" +#include "wx/imaglist.h" +#include "wx/tokenzr.h" + +#ifdef wxHAVE_RAW_BITMAP +#include "wx/rawbmp.h" +#endif #include "Platform.h" #include "PlatWX.h" @@ -46,14 +51,21 @@ wxColour wxColourFromCA(const ColourAllocated& ca) { Palette::Palette() { used = 0; allowRealization = false; + size = 100; + entries = new ColourPair[size]; } Palette::~Palette() { Release(); + delete [] entries; + entries = 0; } void Palette::Release() { used = 0; + delete [] entries; + size = 100; + entries = new ColourPair[size]; } // This method either adds a colour to the list of wanted colours (want==true) @@ -66,11 +78,20 @@ void Palette::WantFind(ColourPair &cp, bool want) { return; } - if (used < numEntries) { - entries[used].desired = cp.desired; - entries[used].allocated.Set(cp.desired.AsLong()); - used++; + if (used >= size) { + int sizeNew = size * 2; + ColourPair *entriesNew = new ColourPair[sizeNew]; + for (int j=0; j<size; j++) { + entriesNew[j] = entries[j]; + } + delete []entries; + entries = entriesNew; + size = sizeNew; } + + entries[used].desired = cp.desired; + entries[used].allocated.Set(cp.desired.AsLong()); + used++; } else { for (int i=0; i < used; i++) { if (entries[i].desired == cp.desired) { @@ -107,7 +128,7 @@ void Font::Create(const char *faceName, int characterSet, int size, bool bold, b // so we adjust the encoding before passing it to Scintilla. See also // wxStyledTextCtrl::StyleSetCharacterSet wxFontEncoding encoding = (wxFontEncoding)(characterSet-1); - + wxFontEncodingArray ea = wxEncodingConverter::GetPlatformEquivalents(encoding); if (ea.GetCount()) encoding = ea[0]; @@ -161,6 +182,8 @@ public: virtual void FillRectangle(PRectangle rc, ColourAllocated back); virtual void FillRectangle(PRectangle rc, Surface &surfacePattern); virtual void RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back); + virtual void AlphaRectangle(PRectangle rc, int cornerSize, ColourAllocated fill, int alphaFill, + ColourAllocated outline, int alphaOutline, int flags); virtual void Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back); virtual void Copy(PRectangle rc, Point from, Surface &surfaceSource); @@ -315,6 +338,87 @@ void SurfaceImpl::RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAl hdc->DrawRoundedRectangle(wxRectFromPRectangle(rc), 4); } +#ifdef __WXMSW__ +#define wxPy_premultiply(p, a) ((p) * (a) / 0xff) +#else +#define wxPy_premultiply(p, a) (p) +#endif + +void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize, + ColourAllocated fill, int alphaFill, + 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()); + int red = cdf.GetRed(); + int green = cdf.GetGreen(); + int blue = cdf.GetBlue(); + + wxAlphaPixelData::Iterator p(pixData); + for (y=0; y<r.height; y++) { + p.MoveTo(pixData, 0, y); + for (x=0; x<r.width; x++) { + p.Red() = wxPy_premultiply(red, alphaFill); + p.Green() = wxPy_premultiply(green, alphaFill); + p.Blue() = wxPy_premultiply(blue, alphaFill); + p.Alpha() = alphaFill; + ++p; + } + } + + // Set the outline pixels + ColourDesired cdo(outline.AsLong()); + red = cdo.GetRed(); + green = cdo.GetGreen(); + blue = cdo.GetBlue(); + for (x=0; x<r.width; x++) { + p.MoveTo(pixData, x, 0); + p.Red() = wxPy_premultiply(red, alphaOutline); + p.Green() = wxPy_premultiply(green, alphaOutline); + p.Blue() = wxPy_premultiply(blue, alphaOutline); + p.Alpha() = alphaOutline; + p.MoveTo(pixData, x, r.height-1); + p.Red() = wxPy_premultiply(red, alphaOutline); + p.Green() = wxPy_premultiply(green, alphaOutline); + p.Blue() = wxPy_premultiply(blue, alphaOutline); + p.Alpha() = alphaOutline; + } + + for (y=0; y<r.height; y++) { + p.MoveTo(pixData, 0, y); + p.Red() = wxPy_premultiply(red, alphaOutline); + p.Green() = wxPy_premultiply(green, alphaOutline); + p.Blue() = wxPy_premultiply(blue, alphaOutline); + p.Alpha() = alphaOutline; + p.MoveTo(pixData, r.width-1, y); + p.Red() = wxPy_premultiply(red, alphaOutline); + p.Green() = wxPy_premultiply(green, alphaOutline); + p.Blue() = wxPy_premultiply(blue, alphaOutline); + p.Alpha() = alphaOutline; + } + + // Draw the bitmap + hdc->DrawBitmap(bmp, r.x, r.y, true); + +#else + wxUnusedVar(cornerSize); + wxUnusedVar(alphaFill); + wxUnusedVar(alphaOutline); + RectangleDraw(rc, outline, fill); +#endif +} + void SurfaceImpl::Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back) { PenColour(fore); BrushColour(back); @@ -542,13 +646,11 @@ void Window::Show(bool show) { void Window::InvalidateAll() { GETWIN(id)->Refresh(false); - wxWakeUpIdle(); } void Window::InvalidateRectangle(PRectangle rc) { wxRect r = wxRectFromPRectangle(rc); GETWIN(id)->Refresh(false, &r); - wxWakeUpIdle(); } void Window::SetFont(Font &font) { @@ -601,7 +703,7 @@ void Window::SetCursor(Cursor curs) { void Window::SetTitle(const char *s) { - GETWIN(id)->SetTitle(stc2wx(s)); + GETWIN(id)->SetLabel(stc2wx(s)); } @@ -666,7 +768,7 @@ END_EVENT_TABLE() -#if wxUSE_POPUPWIN //----------------------------------- +#if wxUSE_POPUPWIN //----------------------------------- #include <wx/popupwin.h> @@ -676,9 +778,9 @@ END_EVENT_TABLE() // implement wxPopupWindow for the Mac!!) // // In the meantime, be careful to duplicate any changes as needed... -// - -// A popup window to place the wxSTCListBox upon +// + +// A popup window to place the wxSTCListBox upon class wxSTCListBoxWin : public wxPopupWindow { private: @@ -686,7 +788,7 @@ private: CallBackAction doubleClickAction; void* doubleClickActionData; public: - wxSTCListBoxWin(wxWindow* parent, wxWindowID id) : + wxSTCListBoxWin(wxWindow* parent, wxWindowID id, Point WXUNUSED(location)) : wxPopupWindow(parent, wxBORDER_NONE) { SetBackgroundColour(*wxBLACK); // for our simple border @@ -702,7 +804,7 @@ public: // "right" to the user. But since the wxPopupWindow or its children // can't receive focus then we have to pull a fast one and temporarily // parent the listctrl on the STC window and then call SetFocus and - // then reparent it back to the popup. + // then reparent it back to the popup. lv->SetFocus(); lv->Reparent(this); #ifdef __WXMSW__ @@ -793,7 +895,7 @@ BEGIN_EVENT_TABLE(wxSTCListBoxWin, wxPopupWindow) EVT_LIST_ITEM_ACTIVATED(wxID_ANY, wxSTCListBoxWin::OnActivate) END_EVENT_TABLE() - + #else // wxUSE_POPUPWIN ----------------------------------- @@ -804,8 +906,8 @@ private: CallBackAction doubleClickAction; void* doubleClickActionData; public: - wxSTCListBoxWin(wxWindow* parent, wxWindowID id) : - wxWindow(parent, id, wxDefaultPosition, wxSize(0,0), wxSIMPLE_BORDER ) + wxSTCListBoxWin(wxWindow* parent, wxWindowID id, Point location) : + wxWindow(parent, id, wxPoint(location.x, location.y), wxSize(0,0), wxSIMPLE_BORDER ) { lv = new wxSTCListBox(this, id, wxDefaultPosition, wxDefaultSize, @@ -881,7 +983,7 @@ public: return rv; } #endif - + void OnActivate(wxListEvent& WXUNUSED(event)) { doubleClickAction(doubleClickActionData); } @@ -918,7 +1020,8 @@ private: bool unicodeMode; int desiredVisibleRows; int aveCharWidth; - int maxStrWidth; + size_t maxStrWidth; + Point location; // Caret location at which the list is opened wxImageList* imgList; wxArrayInt* imgTypeMap; @@ -927,13 +1030,15 @@ public: ~ListBoxImpl(); virtual void SetFont(Font &font); - virtual void Create(Window &parent, int ctrlID, int lineHeight_, bool unicodeMode_); + virtual void Create(Window &parent, int ctrlID, Point location_, int lineHeight_, bool unicodeMode_); virtual void SetAverageCharWidth(int width); virtual void SetVisibleRows(int rows); + virtual int GetVisibleRows() const; virtual PRectangle GetDesiredRect(); virtual int CaretFromEdge(); virtual void Clear(); virtual void Append(char *s, int type = -1); + void Append(const wxString& text, int type); virtual int Length(); virtual void Select(int n); virtual int GetSelection(); @@ -942,7 +1047,7 @@ public: virtual void RegisterImage(int type, const char *xpm_data); virtual void ClearRegisteredImages(); virtual void SetDoubleClickAction(CallBackAction, void *); - + virtual void SetList(const char* list, char separator, char typesep); }; @@ -970,11 +1075,12 @@ void ListBoxImpl::SetFont(Font &font) { } -void ListBoxImpl::Create(Window &parent, int ctrlID, int lineHeight_, bool unicodeMode_) { +void ListBoxImpl::Create(Window &parent, int ctrlID, Point location_, int lineHeight_, bool unicodeMode_) { + location = location_; lineHeight = lineHeight_; unicodeMode = unicodeMode_; maxStrWidth = 0; - id = new wxSTCListBoxWin(GETWIN(parent.GetID()), ctrlID); + id = new wxSTCListBoxWin(GETWIN(parent.GetID()), ctrlID, location); if (imgList != NULL) GETLB(id)->SetImageList(imgList, wxIMAGE_LIST_SMALL); } @@ -990,10 +1096,14 @@ void ListBoxImpl::SetVisibleRows(int rows) { } +int ListBoxImpl::GetVisibleRows() const { + return desiredVisibleRows; +} + 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 maxw = maxStrWidth * aveCharWidth; int maxh ; // give it a default if there are no lines, and/or add a bit more @@ -1039,13 +1149,14 @@ void ListBoxImpl::Clear() { void ListBoxImpl::Append(char *s, int type) { - wxString text = stc2wx(s); + Append(stc2wx(s), type); +} + +void ListBoxImpl::Append(const wxString& text, int type) { long count = GETLB(id)->GetItemCount(); long itemID = GETLB(id)->InsertItem(count, wxEmptyString); GETLB(id)->SetItem(itemID, 1, text); - int itemWidth = 0; - GETLB(id)->GetTextExtent(text, &itemWidth, NULL); - maxStrWidth = wxMax(maxStrWidth, itemWidth); + maxStrWidth = wxMax(maxStrWidth, text.length()); if (type != -1) { wxCHECK_RET(imgTypeMap, wxT("Unexpected NULL imgTypeMap")); long idx = imgTypeMap->Item(type); @@ -1053,6 +1164,23 @@ void ListBoxImpl::Append(char *s, int type) { } } +void ListBoxImpl::SetList(const char* list, char separator, char typesep) { + GETLB(id)->Freeze(); + Clear(); + wxStringTokenizer tkzr(stc2wx(list), (wxChar)separator); + while ( tkzr.HasMoreTokens() ) { + wxString token = tkzr.GetNextToken(); + long type = -1; + int pos = token.Find(typesep); + if (pos != -1) { + token.Mid(pos+1).ToLong(&type); + token.Truncate(pos); + } + Append(token, (int)type); + } + GETLB(id)->Thaw(); +} + int ListBoxImpl::Length() { return GETLB(id)->GetItemCount(); @@ -1133,7 +1261,6 @@ void ListBoxImpl::SetDoubleClickAction(CallBackAction action, void *data) { } - ListBox::ListBox() { } @@ -1203,9 +1330,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. @@ -1246,7 +1370,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 @@ -1269,6 +1401,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) { @@ -1276,18 +1409,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 } @@ -1316,11 +1447,20 @@ int Platform::DBCSCharMaxLength() { //---------------------------------------------------------------------- ElapsedTime::ElapsedTime() { - wxStartTimer(); + wxLongLong localTime = wxGetLocalTimeMillis(); + littleBit = localTime.GetLo(); + bigBit = localTime.GetHi(); } double ElapsedTime::Duration(bool reset) { - double result = wxGetElapsedTime(reset); + wxLongLong prevTime(bigBit, littleBit); + wxLongLong localTime = wxGetLocalTimeMillis(); + if(reset) { + littleBit = localTime.GetLo(); + bigBit = localTime.GetHi(); + } + wxLongLong duration = localTime - prevTime; + double result = duration.ToDouble(); result /= 1000.0; return result; } @@ -1370,9 +1510,3 @@ const wxWX2MBbuf wx2stc(const wxString& str) } #endif - - - - - -