X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e4f39334abbf32f08c80865f4e78284c442b7f4b..c2b2c10ed65dab95f0ec880a4730826f0706a156:/contrib/src/stc/PlatWX.cpp diff --git a/contrib/src/stc/PlatWX.cpp b/contrib/src/stc/PlatWX.cpp index f9fac1a844..2e80894a47 100644 --- a/contrib/src/stc/PlatWX.cpp +++ b/contrib/src/stc/PlatWX.cpp @@ -6,12 +6,13 @@ #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" #include "Platform.h" #include "PlatWX.h" @@ -46,14 +47,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 +74,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) { @@ -99,85 +116,14 @@ Font::~Font() { } void Font::Create(const char *faceName, int characterSet, int size, bool bold, bool italic, bool extraFontFlag) { - wxFontEncoding encoding; Release(); - switch (characterSet) { - default: - case wxSTC_CHARSET_ANSI: - case wxSTC_CHARSET_DEFAULT: - encoding = wxFONTENCODING_DEFAULT; - break; - - case wxSTC_CHARSET_BALTIC: - encoding = wxFONTENCODING_ISO8859_13; - break; - - case wxSTC_CHARSET_CHINESEBIG5: - encoding = wxFONTENCODING_CP950; - break; - - case wxSTC_CHARSET_EASTEUROPE: - encoding = wxFONTENCODING_ISO8859_2; - break; - - case wxSTC_CHARSET_GB2312: - encoding = wxFONTENCODING_CP936; - break; - - case wxSTC_CHARSET_GREEK: - encoding = wxFONTENCODING_ISO8859_7; - break; - - case wxSTC_CHARSET_HANGUL: - encoding = wxFONTENCODING_CP949; - break; - - case wxSTC_CHARSET_MAC: - encoding = wxFONTENCODING_DEFAULT; - break; - - case wxSTC_CHARSET_OEM: - encoding = wxFONTENCODING_DEFAULT; - break; - - case wxSTC_CHARSET_RUSSIAN: - encoding = wxFONTENCODING_KOI8; - break; - - case wxSTC_CHARSET_SHIFTJIS: - encoding = wxFONTENCODING_CP932; - break; - - case wxSTC_CHARSET_SYMBOL: - encoding = wxFONTENCODING_DEFAULT; - break; - - case wxSTC_CHARSET_TURKISH: - encoding = wxFONTENCODING_ISO8859_9; - break; - - case wxSTC_CHARSET_JOHAB: - encoding = wxFONTENCODING_DEFAULT; - break; - - case wxSTC_CHARSET_HEBREW: - encoding = wxFONTENCODING_ISO8859_8; - break; - - case wxSTC_CHARSET_ARABIC: - encoding = wxFONTENCODING_ISO8859_6; - break; - - case wxSTC_CHARSET_VIETNAMESE: - encoding = wxFONTENCODING_DEFAULT; - break; - - case wxSTC_CHARSET_THAI: - encoding = wxFONTENCODING_ISO8859_11; - break; - } + // The minus one is done because since Scintilla uses SC_SHARSET_DEFAULT + // internally and we need to have wxFONENCODING_DEFAULT == SC_SHARSET_DEFAULT + // 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()) @@ -232,6 +178,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); @@ -386,6 +334,14 @@ void SurfaceImpl::RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAl hdc->DrawRoundedRectangle(wxRectFromPRectangle(rc), 4); } +void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize, + ColourAllocated fill, int alphaFill, + ColourAllocated outline, int alphaOutline, int flags) { +// ** TODO + + RectangleDraw(rc, outline, fill); +} + void SurfaceImpl::Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back) { PenColour(fore); BrushColour(back); @@ -474,8 +430,12 @@ void SurfaceImpl::MeasureWidths(Font &font, const char *s, int len, int *positio #else // If not unicode then just use the widths we have +#if wxUSE_STL + std::copy(tpos.begin(), tpos.end(), positions); +#else memcpy(positions, tpos.begin(), len * sizeof(int)); #endif +#endif } @@ -609,13 +569,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) { @@ -659,12 +617,16 @@ void Window::SetCursor(Cursor curs) { #else wxCursor wc = wxCursor(cursorId) ; #endif - GETWIN(id)->SetCursor(wc); + if(curs != cursorLast) + { + GETWIN(id)->SetCursor(wc); + cursorLast = curs; + } } void Window::SetTitle(const char *s) { - GETWIN(id)->SetTitle(stc2wx(s)); + GETWIN(id)->SetLabel(stc2wx(s)); } @@ -679,8 +641,13 @@ public: wxSTCListBox(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) - : wxListView(parent, id, pos, size, style) - {} + : wxListView() + { +#ifdef __WXMSW__ + Hide(); // don't flicker as we move it around... +#endif + Create(parent, id, pos, size, style); + } void OnFocus(wxFocusEvent& event) { @@ -724,16 +691,146 @@ END_EVENT_TABLE() +#if wxUSE_POPUPWIN //----------------------------------- +#include <wx/popupwin.h> + -// A window to place the wxSTCListBox upon +// +// TODO: Refactor these two classes to have a common base (or a mix-in) to get +// rid of the code duplication. (Either that or convince somebody to +// implement wxPopupWindow for the Mac!!) +// +// In the meantime, be careful to duplicate any changes as needed... +// + +// A popup window to place the wxSTCListBox upon +class wxSTCListBoxWin : public wxPopupWindow +{ +private: + wxListView* lv; + CallBackAction doubleClickAction; + void* doubleClickActionData; +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, + wxLC_REPORT | wxLC_SINGLE_SEL | wxLC_NO_HEADER | wxBORDER_NONE); + lv->SetCursor(wxCursor(wxCURSOR_ARROW)); + lv->InsertColumn(0, wxEmptyString); + lv->InsertColumn(1, wxEmptyString); + + // NOTE: We need to fool the wxListView into thinking that it has the + // focus so it will use the normal selection colour and will look + // "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. + lv->SetFocus(); + lv->Reparent(this); +#ifdef __WXMSW__ + lv->Show(); +#endif + } + + + // Set position in client coords + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO) { + if (x != wxDefaultCoord) { + GetParent()->ClientToScreen(&x, NULL); + } + if (y != wxDefaultCoord) { + GetParent()->ClientToScreen(NULL, &y); + } + wxPopupWindow::DoSetSize(x, y, width, height, sizeFlags); + } + + // return position as if it were in client coords + virtual void DoGetPosition( int *x, int *y ) const { + int sx, sy; + wxPopupWindow::DoGetPosition(&sx, &sy); + GetParent()->ScreenToClient(&sx, &sy); + if (x) *x = sx; + if (y) *y = sy; + } + + + bool Destroy() { + if ( !wxPendingDelete.Member(this) ) + wxPendingDelete.Append(this); + return true; + } + + + int IconWidth() { + wxImageList* il = lv->GetImageList(wxIMAGE_LIST_SMALL); + if (il != NULL) { + int w, h; + il->GetSize(0, w, h); + return w; + } + return 0; + } + + + void SetDoubleClickAction(CallBackAction action, void *data) { + doubleClickAction = action; + doubleClickActionData = data; + } + + + void OnFocus(wxFocusEvent& event) { + GetParent()->SetFocus(); + event.Skip(); + } + + void OnSize(wxSizeEvent& event) { + // resize the child + wxSize sz = GetSize(); + sz.x -= 2; + sz.y -= 2; + lv->SetSize(1, 1, sz.x, sz.y); + // reset the column widths + lv->SetColumnWidth(0, IconWidth()+4); + lv->SetColumnWidth(1, sz.x - 2 - lv->GetColumnWidth(0) - + wxSystemSettings::GetMetric(wxSYS_VSCROLL_X)); + event.Skip(); + } + + void OnActivate(wxListEvent& WXUNUSED(event)) { + doubleClickAction(doubleClickActionData); + } + + wxListView* GetLB() { return lv; } + +private: + DECLARE_EVENT_TABLE() + +}; + +BEGIN_EVENT_TABLE(wxSTCListBoxWin, wxPopupWindow) + EVT_SET_FOCUS ( wxSTCListBoxWin::OnFocus) + EVT_SIZE ( wxSTCListBoxWin::OnSize) + EVT_LIST_ITEM_ACTIVATED(wxID_ANY, wxSTCListBoxWin::OnActivate) +END_EVENT_TABLE() + + + +#else // wxUSE_POPUPWIN ----------------------------------- + +// A normal window to place the wxSTCListBox upon. class wxSTCListBoxWin : public wxWindow { private: wxListView* lv; 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, @@ -809,7 +906,7 @@ public: return rv; } #endif - + void OnActivate(wxListEvent& WXUNUSED(event)) { doubleClickAction(doubleClickActionData); } @@ -827,6 +924,7 @@ BEGIN_EVENT_TABLE(wxSTCListBoxWin, wxWindow) EVT_LIST_ITEM_ACTIVATED(wxID_ANY, wxSTCListBoxWin::OnActivate) END_EVENT_TABLE() +#endif // wxUSE_POPUPWIN ----------------------------------- inline wxSTCListBoxWin* GETLBW(WindowID win) { @@ -845,7 +943,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; @@ -854,13 +953,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(); @@ -869,7 +970,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); }; @@ -897,11 +998,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); } @@ -917,10 +1019,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 @@ -966,13 +1072,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); @@ -980,6 +1087,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(); @@ -1060,7 +1184,6 @@ void ListBoxImpl::SetDoubleClickAction(CallBackAction action, void *data) { } - ListBox::ListBox() { } @@ -1243,11 +1366,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; } @@ -1297,9 +1429,3 @@ const wxWX2MBbuf wx2stc(const wxString& str) } #endif - - - - - -