////////////////////////////////////////////////////////////////////////////
// Name: stc.cpp
-// Purpose: A wxWindows implementation of Scintilla. This class is the
+// Purpose: A wxWidgets implementation of Scintilla. This class is the
// one meant to be used directly by wx applications. It does not
// derive directly from the Scintilla classes, but instead
// delegates most things to the real Scintilla class.
static wxColour wxColourFromLong(long c) {
wxColour clr;
- clr.Set(c & 0xff, (c >> 8) & 0xff, (c >> 16) & 0xff);
+ clr.Set((unsigned char)(c & 0xff),
+ (unsigned char)((c >> 8) & 0xff),
+ (unsigned char)((c >> 16) & 0xff));
return clr;
}
static wxColour wxColourFromSpec(const wxString& spec) {
- // spec should be "#RRGGBB"
- long red, green, blue;
- red = green = blue = 0;
- spec.Mid(1,2).ToLong(&red, 16);
- spec.Mid(3,2).ToLong(&green, 16);
- spec.Mid(5,2).ToLong(&blue, 16);
- return wxColour(red, green, blue);
+ // spec should be a colour name or "#RRGGBB"
+ if (spec.GetChar(0) == wxT('#')) {
+
+ long red, green, blue;
+ red = green = blue = 0;
+ spec.Mid(1,2).ToLong(&red, 16);
+ spec.Mid(3,2).ToLong(&green, 16);
+ spec.Mid(5,2).ToLong(&blue, 16);
+ return wxColour((unsigned char)red,
+ (unsigned char)green,
+ (unsigned char)blue);
+ }
+ else
+ return wxColour(spec);
}
//----------------------------------------------------------------------
DEFINE_EVENT_TYPE( wxEVT_STC_MACRORECORD )
DEFINE_EVENT_TYPE( wxEVT_STC_MARGINCLICK )
DEFINE_EVENT_TYPE( wxEVT_STC_NEEDSHOWN )
-DEFINE_EVENT_TYPE( wxEVT_STC_POSCHANGED )
DEFINE_EVENT_TYPE( wxEVT_STC_PAINTED )
DEFINE_EVENT_TYPE( wxEVT_STC_USERLISTSELECTION )
DEFINE_EVENT_TYPE( wxEVT_STC_URIDROPPED )
EVT_SYS_COLOUR_CHANGED (wxStyledTextCtrl::OnSysColourChanged)
EVT_ERASE_BACKGROUND (wxStyledTextCtrl::OnEraseBackground)
EVT_MENU_RANGE (10, 16, wxStyledTextCtrl::OnMenu)
- EVT_LISTBOX_DCLICK (-1, wxStyledTextCtrl::OnListBox)
+ EVT_LISTBOX_DCLICK (wxID_ANY, wxStyledTextCtrl::OnListBox)
END_EVENT_TABLE()
#endif
m_swx = new ScintillaWX(this);
m_stopWatch.Start();
- m_lastKeyDownConsumed = FALSE;
+ m_lastKeyDownConsumed = false;
m_vScrollBar = NULL;
m_hScrollBar = NULL;
#if wxUSE_UNICODE
// Put Scintilla into unicode (UTF-8) mode
SetCodePage(wxSTC_CP_UTF8);
#endif
+
+ SetBestFittingSize(size);
}
return m_swx->WndProc(msg, wp, lp);
}
+//----------------------------------------------------------------------
+
+// Set the vertical scrollbar to use instead of the ont that's built-in.
+void wxStyledTextCtrl::SetVScrollBar(wxScrollBar* bar) {
+ m_vScrollBar = bar;
+ if (bar != NULL) {
+ // ensure that the built-in scrollbar is not visible
+ SetScrollbar(wxVERTICAL, 0, 0, 0);
+ }
+}
+// Set the horizontal scrollbar to use instead of the ont that's built-in.
+void wxStyledTextCtrl::SetHScrollBar(wxScrollBar* bar) {
+ m_hScrollBar = bar;
+ if (bar != NULL) {
+ // ensure that the built-in scrollbar is not visible
+ SetScrollbar(wxHORIZONTAL, 0, 0, 0);
+ }
+}
+
//----------------------------------------------------------------------
// BEGIN generated section. The following code is automatically generated
// by gen_iface.py from the contents of Scintilla.iface. Do not edit
// this file. Edit stc.cpp.in or gen_iface.py instead and regenerate.
-// Add text to the document.
+// Add text to the document at current position.
void wxStyledTextCtrl::AddText(const wxString& text) {
wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text);
SendMsg(2001, strlen(buf), (long)(const char*)buf);
SendMsg(2005, 0, 0);
}
-// The number of characters in the document.
+// Returns the number of characters in the document.
int wxStyledTextCtrl::GetLength() {
return SendMsg(2006, 0, 0);
}
return SendMsg(2269, 0, 0);
}
+// Set the display mode of visual flags for wrapped lines.
+void wxStyledTextCtrl::SetWrapVisualFlags(int wrapVisualFlags) {
+ SendMsg(2460, wrapVisualFlags, 0);
+}
+
+// Retrive the display mode of visual flags for wrapped lines.
+int wxStyledTextCtrl::GetWrapVisualFlags() {
+ return SendMsg(2461, 0, 0);
+}
+
+// Set the location of visual flags for wrapped lines.
+void wxStyledTextCtrl::SetWrapVisualFlagsLocation(int wrapVisualFlagsLocation) {
+ SendMsg(2462, wrapVisualFlagsLocation, 0);
+}
+
+// Retrive the location of visual flags for wrapped lines.
+int wxStyledTextCtrl::GetWrapVisualFlagsLocation() {
+ return SendMsg(2463, 0, 0);
+}
+
+// Set the start indent for wrapped lines.
+void wxStyledTextCtrl::SetWrapStartIndent(int indent) {
+ SendMsg(2464, indent, 0);
+}
+
+// Retrive the start indent for wrapped lines.
+int wxStyledTextCtrl::GetWrapStartIndent() {
+ return SendMsg(2465, 0, 0);
+}
+
// Sets the degree of caching of layout information.
void wxStyledTextCtrl::SetLayoutCache(int mode) {
SendMsg(2272, mode, 0);
return SendMsg(2445, 0, 0);
}
+// Enlarge the document to a particular size of text bytes.
+void wxStyledTextCtrl::Allocate(int bytes) {
+ SendMsg(2446, bytes, 0);
+}
+
+// Find the position of a column on a line taking into account tabs and
+// multi-byte characters. If beyond end of line, return line end position.
+int wxStyledTextCtrl::FindColumn(int line, int column) {
+ return SendMsg(2456, line, column);
+}
+
// Start notifying the container of all key presses and commands.
void wxStyledTextCtrl::StartRecord() {
SendMsg(3001, 0, 0);
//
// bold turns on bold
// italic turns on italics
-// fore:#RRGGBB sets the foreground colour
-// back:#RRGGBB sets the background colour
+// fore:[name or #RRGGBB] sets the foreground colour
+// back:[name or #RRGGBB] sets the background colour
// face:[facename] sets the font face name to use
// size:[num] sets the font size in points
// eol turns on eol filling
wxFile file(filename, wxFile::write);
if (!file.IsOpened())
- return FALSE;
+ return false;
bool success = file.Write(GetText(), *wxConvCurrent);
if (file.IsOpened())
{
wxString contents;
- off_t len = file.Length();
+ // get the file size (assume it is not huge file...)
+ ssize_t len = (ssize_t)file.Length();
+
if (len > 0)
{
#if wxUSE_UNICODE
- wxMemoryBuffer buffer(len);
+ wxMemoryBuffer buffer(len+1);
success = (file.Read(buffer.GetData(), len) == len);
- contents = wxString(buffer, *wxConvCurrent);
+ if (success) {
+ ((char*)buffer.GetData())[len] = 0;
+ contents = wxString(buffer, *wxConvCurrent, len);
+ }
#else
wxString buffer;
success = (file.Read(wxStringBuffer(buffer, len), len) == len);
#endif
}
else
- success = true; // empty file is ok
+ {
+ if (len == 0)
+ success = true; // empty file is ok
+ else
+ success = false; // len == wxInvalidOffset
+ }
if (success)
{
#if wxUSE_DRAG_AND_DROP
-wxDragResult wxStyledTextCtrl::DoDragOver(wxCoord x, wxCoord y, wxDragResult def) {
- return m_swx->DoDragOver(x, y, def);
-}
+wxDragResult wxStyledTextCtrl::DoDragOver(wxCoord x, wxCoord y, wxDragResult def) {
+ return m_swx->DoDragOver(x, y, def);
+}
-bool wxStyledTextCtrl::DoDropText(long x, long y, const wxString& data) {
+bool wxStyledTextCtrl::DoDropText(long x, long y, const wxString& data) {
return m_swx->DoDropText(x, y, data);
}
#endif
void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) {
- // On (some?) non-US keyboards the AltGr key is required to enter some
+ // On (some?) non-US PC keyboards the AltGr key is required to enter some
// common characters. It comes to us as both Alt and Ctrl down so we need
// to let the char through in that case, otherwise if only ctrl or only
// alt let's skip it.
bool ctrl = evt.ControlDown();
+#ifdef __WXMAC__
+ // On the Mac the Alt key is just a modifier key (like Shift) so we need
+ // to allow the char events to be processed when Alt is pressed.
+ // TODO: Should we check MetaDown instead in this case?
+ bool alt = false;
+#else
bool alt = evt.AltDown();
+#endif
bool skip = ((ctrl || alt) && ! (ctrl && alt));
- int key = evt.GetKeyCode();
-
-// printf("OnChar key:%d consumed:%d ctrl:%d alt:%d skip:%d\n",
-// key, m_lastKeyDownConsumed, ctrl, alt, skip);
-
- if ( (key <= WXK_START || key > WXK_COMMAND) &&
- !m_lastKeyDownConsumed && !skip) {
- m_swx->DoAddChar(key);
- return;
+ if (!m_lastKeyDownConsumed && !skip) {
+#if wxUSE_UNICODE
+ int key = evt.GetUnicodeKey();
+ bool keyOk = true;
+
+ // if the unicode key code is not really a unicode character (it may
+ // be a function key or etc., the platforms appear to always give us a
+ // small value in this case) then fallback to the ascii key code but
+ // don't do anything for function keys or etc.
+ if (key <= 255) {
+ key = evt.GetKeyCode();
+ keyOk = (key <= 255);
+ }
+ if (keyOk) {
+ m_swx->DoAddChar(key);
+ return;
+ }
+#else
+ int key = evt.GetKeyCode();
+ if (key <= WXK_START || key > WXK_COMMAND) {
+ m_swx->DoAddChar(key);
+ return;
+ }
+#endif
}
+
evt.Skip();
}
void wxStyledTextCtrl::OnKeyDown(wxKeyEvent& evt) {
- int key = evt.GetKeyCode();
- bool shift = evt.ShiftDown(),
- ctrl = evt.ControlDown(),
- alt = evt.AltDown(),
- meta = evt.MetaDown();
-
- int processed = m_swx->DoKeyDown(key, shift, ctrl, alt, meta, &m_lastKeyDownConsumed);
-
-// printf("KeyDn key:%d shift:%d ctrl:%d alt:%d processed:%d consumed:%d\n",
-// key, shift, ctrl, alt, processed, m_lastKeyDownConsumed);
-
+ int processed = m_swx->DoKeyDown(evt, &m_lastKeyDownConsumed);
if (!processed && !m_lastKeyDownConsumed)
evt.Skip();
}
}
+wxSize wxStyledTextCtrl::DoGetBestSize() const
+{
+ // What would be the best size for a wxSTC?
+ // Just give a reasonable minimum until something else can be figured out.
+ return wxSize(200,100);
+}
+
+
//----------------------------------------------------------------------
// Turn notifications from Scintilla into events
m_listType = 0;
m_x = 0;
m_y = 0;
- m_dragAllowMove = FALSE;
+ m_dragAllowMove = false;
#if wxUSE_DRAG_AND_DROP
m_dragResult = wxDragNone;
#endif