#include "wx/stc/stc.h"
#include "PlatWX.h"
-
-//----------------------------------------------------------------------
-
-const int H_SCROLL_MAX = 4000;
-const int H_SCROLL_STEP = 20;
-const int H_SCROLL_PAGE = 200;
-
//----------------------------------------------------------------------
// Helper classes
#endif
+#ifdef __WXGTK__
+#undef wxSTC_USE_POPUP
+#define wxSTC_USE_POPUP 0
+#endif
+
#if wxUSE_POPUPWIN && wxSTC_USE_POPUP
#include <wx/popupwin.h>
#define wxSTCCallTipBase wxPopupWindow
m_ct = ct;
}
+ ~wxSTCCallTip() {
+ if (HasCapture()) ReleaseMouse();
+ }
+
void OnPaint(wxPaintEvent& evt) {
wxPaintDC dc(this);
Surface* surfaceWindow = Surface::Allocate();
virtual bool Show( bool show = TRUE ) {
bool retval = wxSTCCallTipBase::Show(show);
- if (show) {
+ if (show)
CaptureMouse();
- }
- else {
- ReleaseMouse();
- }
+ else
+ if (HasCapture()) ReleaseMouse();
return retval;
}
}
}
+const int H_SCROLL_STEP = 20;
bool ScintillaWX::ModifyScrollBars(int nMax, int nPage) {
bool modified = false;
+ // Check the vertical scrollbar
if (stc->m_vScrollBar == NULL) { // Use built-in scrollbar
int sbMax = stc->GetScrollRange(wxVERTICAL);
int sbThumb = stc->GetScrollThumb(wxVERTICAL);
int sbPos = stc->GetScrollPos(wxVERTICAL);
if (sbMax != nMax || sbThumb != nPage) {
- stc->SetScrollbar(wxVERTICAL, sbPos, nPage, nMax);
+ stc->SetScrollbar(wxVERTICAL, sbPos, nPage, nMax+1);
modified = true;
}
}
int sbPage = stc->m_vScrollBar->GetPageSize();
int sbPos = stc->m_vScrollBar->GetThumbPosition();
if (sbMax != nMax || sbPage != nPage) {
- stc->m_vScrollBar->SetScrollbar(sbPos, nPage, nMax, nPage);
+ stc->m_vScrollBar->SetScrollbar(sbPos, nPage, nMax+1, nPage);
modified = true;
}
}
- if (horizontalScrollBarVisible) {
- if (stc->m_hScrollBar == NULL) { // Use built-in scrollbar
- int sbMax = stc->GetScrollRange(wxHORIZONTAL);
- int sbThumb = stc->GetScrollThumb(wxHORIZONTAL);
- if ((sbMax != H_SCROLL_MAX) || (sbThumb != H_SCROLL_STEP)) {
- stc->SetScrollbar(wxHORIZONTAL, 0, H_SCROLL_STEP, H_SCROLL_MAX);
- modified = true;
+ // Check the horizontal scrollbar
+ PRectangle rcText = GetTextRectangle();
+ int horizEnd = scrollWidth;
+ if (horizEnd < 0)
+ horizEnd = 0;
+ if (!horizontalScrollBarVisible || (wrapState != eWrapNone))
+ horizEnd = 0;
+ int pageWidth = rcText.Width();
+
+ if (stc->m_hScrollBar == NULL) { // Use built-in scrollbar
+ int sbMax = stc->GetScrollRange(wxHORIZONTAL);
+ int sbThumb = stc->GetScrollThumb(wxHORIZONTAL);
+ int sbPos = stc->GetScrollPos(wxHORIZONTAL);
+ if ((sbMax != horizEnd) || (sbThumb != pageWidth) || (sbPos != 0)) {
+ stc->SetScrollbar(wxHORIZONTAL, 0, pageWidth, horizEnd);
+ modified = true;
+ if (scrollWidth < pageWidth) {
+ HorizontalScrollTo(0);
}
}
- else { // otherwise use the one that's been given to us
- int sbMax = stc->m_hScrollBar->GetRange();
- int sbPage = stc->m_hScrollBar->GetPageSize();
- if ((sbMax != H_SCROLL_MAX) || (sbPage != H_SCROLL_STEP)) {
- stc->m_hScrollBar->SetScrollbar(0, H_SCROLL_STEP, H_SCROLL_MAX, H_SCROLL_STEP);
- modified = true;
+ }
+ else { // otherwise use the one that's been given to us
+ int sbMax = stc->m_hScrollBar->GetRange();
+ int sbThumb = stc->m_hScrollBar->GetPageSize();
+ int sbPos = stc->m_hScrollBar->GetThumbPosition();
+ if ((sbMax != horizEnd) || (sbThumb != pageWidth) || (sbPos != 0)) {
+ stc->m_hScrollBar->SetScrollbar(0, pageWidth, horizEnd, pageWidth);
+ modified = true;
+ if (scrollWidth < pageWidth) {
+ HorizontalScrollTo(0);
}
}
}
+
return modified;
}
if (currentPos != anchor) {
SelectionText st;
CopySelectionRange(&st);
- wxTheClipboard->Open();
- wxString text = stc2wx(st.s, st.len);
- wxTheClipboard->SetData(new wxTextDataObject(text));
- wxTheClipboard->Close();
+ if (wxTheClipboard->Open()) {
+ wxTheClipboard->UsePrimarySelection();
+ wxString text = stc2wx(st.s, st.len);
+ wxTheClipboard->SetData(new wxTextDataObject(text));
+ wxTheClipboard->Close();
+ }
}
}
ClearSelection();
wxTextDataObject data;
- bool gotData;
+ bool gotData = FALSE;
- wxTheClipboard->Open();
- gotData = wxTheClipboard->GetData(data);
- wxTheClipboard->Close();
+ if (wxTheClipboard->Open()) {
+ wxTheClipboard->UsePrimarySelection();
+ gotData = wxTheClipboard->GetData(data);
+ wxTheClipboard->Close();
+ }
if (gotData) {
wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(data.GetText());
int len = strlen(buf);
bool ScintillaWX::CanPaste() {
- bool canPaste;
+ bool canPaste = FALSE;
+ bool didOpen;
- wxTheClipboard->Open();
- canPaste = wxTheClipboard->IsSupported(wxUSE_UNICODE ? wxDF_UNICODETEXT : wxDF_TEXT);
- wxTheClipboard->Close();
+ if ( (didOpen = !wxTheClipboard->IsOpened()) )
+ wxTheClipboard->Open();
+ if (wxTheClipboard->IsOpened()) {
+ wxTheClipboard->UsePrimarySelection();
+ canPaste = wxTheClipboard->IsSupported(wxUSE_UNICODE ? wxDF_UNICODETEXT : wxDF_TEXT);
+ if (didOpen)
+ wxTheClipboard->Close();
+ }
return canPaste;
}
void ScintillaWX::DoHScroll(int type, int pos) {
int xPos = xOffset;
+ PRectangle rcText = GetTextRectangle();
+ int pageWidth = rcText.Width() * 2 / 3;
if (type == wxEVT_SCROLLWIN_LINEUP || type == wxEVT_SCROLL_LINEUP)
xPos -= H_SCROLL_STEP;
else if (type == wxEVT_SCROLLWIN_LINEDOWN || type == wxEVT_SCROLL_LINEDOWN)
xPos += H_SCROLL_STEP;
else if (type == wxEVT_SCROLLWIN_PAGEUP || type == wxEVT_SCROLL_PAGEUP)
- xPos -= H_SCROLL_PAGE;
- else if (type == wxEVT_SCROLLWIN_PAGEDOWN || type == wxEVT_SCROLL_PAGEDOWN)
- xPos += H_SCROLL_PAGE;
+ xPos -= pageWidth;
+ else if (type == wxEVT_SCROLLWIN_PAGEDOWN || type == wxEVT_SCROLL_PAGEDOWN) {
+ xPos += pageWidth;
+ if (xPos > scrollWidth - rcText.Width()) {
+ xPos = scrollWidth - rcText.Width();
+ }
+ }
else if (type == wxEVT_SCROLLWIN_TOP || type == wxEVT_SCROLL_TOP)
xPos = 0;
else if (type == wxEVT_SCROLLWIN_BOTTOM || type == wxEVT_SCROLL_BOTTOM)
- xPos = H_SCROLL_MAX;
+ xPos = scrollWidth;
else if (type == wxEVT_SCROLLWIN_THUMBTRACK || type == wxEVT_SCROLL_THUMBTRACK)
xPos = pos;
ScrollTo(topLineNew);
}
-
-void ScintillaWX::DoMouseWheel(int rotation, int delta, int linesPerAction, int ctrlDown) {
+void ScintillaWX::DoMouseWheel(int rotation, int delta,
+ int linesPerAction, int ctrlDown,
+ bool isPageScroll ) {
int topLineNew = topLine;
int lines;
lines = wheelRotation / delta;
wheelRotation -= lines * delta;
if (lines != 0) {
- lines *= linesPerAction;
+ if (isPageScroll)
+ lines = lines * LinesOnScreen(); // lines is either +1 or -1
+ else
+ lines *= linesPerAction;
topLineNew -= lines;
ScrollTo(topLineNew);
}
}
int ScintillaWX::DoKeyDown(int key, bool shift, bool ctrl, bool alt, bool* consumed) {
-#ifdef __WXGTK__
+#if defined(__WXGTK__) || defined(__WXMAC__)
// Ctrl chars (A-Z) end up with the wrong keycode on wxGTK...
if (ctrl && key >= 1 && key <= 26)
key += 'A' - 1;
void ScintillaWX::DoContextMenu(Point pt) {
- ContextMenu(pt);
+ if (displayPopupMenu)
+ ContextMenu(pt);
}
void ScintillaWX::DoOnListBox() {