wxStyledTextCtrl

Introduction

The wxStyledTextCtrl (wxWidgets: wxStyledTextCtrl Class Reference) control is a source code editing component. It is a wrapper around the Scintilla source code editing component (http://www.scintilla.org/).

Basic Creation Example

The wxStyledTextCtrl control is a very powerful control and it takes some learning to take fully advantage of it. We will start with a very basic example that doesn't do much more than a simple wxTextCtrl. The example is based on the MinimalApp2 example we presented in the minimal application tutorial. The full source for this example is available from our GitHub repository: wxWidgetsTutorials/wxStyledTextCtrl/WxStyledTextCtrl1.

 File: wxStyledTextCtrl/WxStyledTextCtrl1/src/WxStyledTextCtrl1Frame.cpp
#include "WxStyledTextCtrl1Frame.h"
#include <wx/panel.h>
#include <wx/stc/stc.h>
#include <wx/sizer.h>

WxStyledTextCtrl1Frame::WxStyledTextCtrl1Frame(const wxString& title)
    : wxFrame(NULL, wxID_ANY, title)
{
    // Create a top-level panel to hold all the contents of the frame
    wxPanel* panel = new wxPanel(this, wxID_ANY);

    // Create a wxStyledTextCtrl control
    wxStyledTextCtrl* styledTextCtrl = new wxStyledTextCtrl(panel, wxID_ANY,
        wxDefaultPosition, wxSize(350, 200));

    styledTextCtrl->AddText("// A simple program\n\n");
    styledTextCtrl->AddText("#include <stdio.h>\n\n");
    styledTextCtrl->AddText("int main(int argc, char* argv[])\n");
    styledTextCtrl->AddText("{\n");
    styledTextCtrl->AddText("    printf(\"Hello World!\");\n");
    styledTextCtrl->AddText("    return 0;\n");
    styledTextCtrl->AddText("}\n");

    // Set up the sizer for the panel
    wxBoxSizer* panelSizer = new wxBoxSizer(wxHORIZONTAL);
    panelSizer->Add(styledTextCtrl, 1, wxEXPAND);
    panel->SetSizer(panelSizer);

    // Set up the sizer for the frame and resize the frame
    // according to its contents
    wxBoxSizer* topSizer = new wxBoxSizer(wxHORIZONTAL);
    topSizer->Add(panel, 1, wxEXPAND);
    SetSizerAndFit(topSizer);
}

The application is shown in Figure 1 below.

Figure 1: The WxStyledTextCtrl1 Application

The rest of the files don't have any significant changes but are shown here for completeness.

 File: wxStyledTextCtrl/WxStyledTextCtrl1/src/WxStyledTextCtrl1Frame.h
#ifndef _TUTORIALS_WXWIDGETS_WXSTYLEDTEXTCTRL1FRAME_H_
#define _TUTORIALS_WXWIDGETS_WXSTYLEDTEXTCTRL1FRAME_H_

#include <wx/frame.h>

class WxStyledTextCtrl1Frame : public wxFrame
{
public:
    WxStyledTextCtrl1Frame(const wxString& title);
};

#endif
 File: wxStyledTextCtrl/WxStyledTextCtrl1/src/WxStyledTextCtrl1App.h
#ifndef _TUTORIALS_WXWIDGETS_WXSTYLEDTEXTCTRL1APP_H_
#define _TUTORIALS_WXWIDGETS_WXSTYLEDTEXTCTRL1APP_H_

#include <wx/app.h>

class WxStyledTextCtrl1App : public wxApp
{
public:
    virtual bool OnInit();
};

#endif
 File: wxStyledTextCtrl/WxStyledTextCtrl1/src/WxStyledTextCtrl1App.cpp
#include "WxStyledTextCtrl1App.h"
#include "WxStyledTextCtrl1Frame.h"

wxIMPLEMENT_APP(WxStyledTextCtrl1App);

bool WxStyledTextCtrl1App::OnInit()
{
    WxStyledTextCtrl1Frame* frame = new WxStyledTextCtrl1Frame("WxStyledTextCtrl1");
    frame->Show(true);
    return true;
}

C++ Lexer Example

The previous example was displaying the code correctly but wasn't applying any specific highlighting that we would expect from a code editor. In this example we show how we can modify the code to recognize that the contents are C++ code and highlight some keywords.The full source for this example is available from our GitHub repository: wxWidgetsTutorials/wxStyledTextCtrl/WxStyledTextCtrl2.

 File: wxStyledTextCtrl/WxStyledTextCtrl2/src/WxStyledTextCtrl2Frame.cpp
#include "WxStyledTextCtrl2Frame.h"
#include <wx/panel.h>
#include <wx/stc/stc.h>
#include <wx/sizer.h>

WxStyledTextCtrl2Frame::WxStyledTextCtrl2Frame(const wxString& title)
    : wxFrame(NULL, wxID_ANY, title)
{
    // Create a top-level panel to hold all the contents of the frame
    wxPanel* panel = new wxPanel(this, wxID_ANY);

    // Create a wxStyledTextCtrl control
    wxStyledTextCtrl* styledTextCtrl = new wxStyledTextCtrl(panel, wxID_ANY,
        wxDefaultPosition, wxSize(350, 200));

    // Set the lexer to the C++ lexer
    styledTextCtrl->SetLexer(wxSTC_LEX_CPP);

    // Set the color to use for various elements
    styledTextCtrl->StyleSetForeground(wxSTC_C_COMMENTLINE, wxColor(60, 162, 2));
    styledTextCtrl->StyleSetForeground(wxSTC_C_PREPROCESSOR, wxColor(0, 0, 255));
    styledTextCtrl->StyleSetForeground(wxSTC_C_STRING, wxColor(255, 60, 10));
    styledTextCtrl->StyleSetForeground(wxSTC_C_WORD, wxColor(0, 0, 255));

    // Give a list of keywords. They will be given the style specified for
    // wxSTC_C_WORD items.
    styledTextCtrl->SetKeyWords(0, wxT("return int char"));

    // Populate the wxStyledTextCtrl with a small C++ program
    styledTextCtrl->AddText("// A simple program\n\n");
    styledTextCtrl->AddText("#include <stdio.h>\n\n");
    styledTextCtrl->AddText("int main(int argc, char* argv[])\n");
    styledTextCtrl->AddText("{\n");
    styledTextCtrl->AddText("    printf(\"Hello World!\");\n");
    styledTextCtrl->AddText("    return 0;\n");
    styledTextCtrl->AddText("}\n");

    // Set up the sizer for the panel
    wxBoxSizer* panelSizer = new wxBoxSizer(wxHORIZONTAL);
    panelSizer->Add(styledTextCtrl, 1, wxEXPAND);
    panel->SetSizer(panelSizer);

    // Set up the sizer for the frame and resize the frame
    // according to its contents
    wxBoxSizer* topSizer = new wxBoxSizer(wxHORIZONTAL);
    topSizer->Add(panel, 1, wxEXPAND);
    SetSizerAndFit(topSizer);
}
Figure 2: The WxStyledTextCtrl2 Application
 File: wxStyledTextCtrl/WxStyledTextCtrl2/src/WxStyledTextCtrl2Frame.h
#ifndef _TUTORIALS_WXWIDGETS_WXSTYLEDTEXTCTRL2FRAME_H_
#define _TUTORIALS_WXWIDGETS_WXSTYLEDTEXTCTRL2FRAME_H_

#include <wx/frame.h>

class WxStyledTextCtrl2Frame : public wxFrame
{
public:
    WxStyledTextCtrl2Frame(const wxString& title);
};

#endif
 File: wxStyledTextCtrl/WxStyledTextCtrl2/src/WxStyledTextCtrl2App.h
#ifndef _TUTORIALS_WXWIDGETS_WXSTYLEDTEXTCTRL2APP_H_
#define _TUTORIALS_WXWIDGETS_WXSTYLEDTEXTCTRL2APP_H_

#include <wx/app.h>

class WxStyledTextCtrl2App : public wxApp
{
public:
    virtual bool OnInit();
};

#endif
 File: wxStyledTextCtrl/WxStyledTextCtrl2/src/WxStyledTextCtrl2App.cpp
#include "WxStyledTextCtrl2App.h"
#include "WxStyledTextCtrl2Frame.h"

wxIMPLEMENT_APP(WxStyledTextCtrl2App);

bool WxStyledTextCtrl2App::OnInit()
{
    WxStyledTextCtrl2Frame* frame =  new WxStyledTextCtrl2Frame("WxStyledTextCtrl2");
    frame->Show(true);
    return true;
}