f37d449208
This wrapper simply combines the calls to MakeAbsolute() and GetFullPath(), but using it results in shorter and more clear code, so it seems to be worth having.
843 lines
28 KiB
C++
843 lines
28 KiB
C++
//////////////////////////////////////////////////////////////////////////////
|
|
// File: contrib/samples/stc/stctest.cpp
|
|
// Purpose: STC test application
|
|
// Maintainer: Otto Wyss
|
|
// Created: 2003-09-01
|
|
// Copyright: (c) wxGuide
|
|
// Licence: wxWindows licence
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
//----------------------------------------------------------------------------
|
|
// headers
|
|
//----------------------------------------------------------------------------
|
|
|
|
// For compilers that support precompilation, includes "wx/wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
|
|
// for all others, include the necessary headers (this file is usually all you
|
|
// need because it includes almost all 'standard' wxWidgets headers)
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/wx.h"
|
|
#endif
|
|
|
|
//! wxWidgets headers
|
|
#include "wx/config.h" // configuration support
|
|
#include "wx/filedlg.h" // file dialog support
|
|
#include "wx/filename.h" // filename support
|
|
#include "wx/notebook.h" // notebook support
|
|
#include "wx/settings.h" // system settings
|
|
#include "wx/string.h" // strings support
|
|
#include "wx/image.h" // images support
|
|
#if wxUSE_PRINTING_ARCHITECTURE
|
|
#include "wx/paper.h"
|
|
#endif // wxUSE_PRINTING_ARCHITECTURE
|
|
|
|
//! application headers
|
|
#include "defsext.h" // Additional definitions
|
|
#include "edit.h" // Edit module
|
|
#include "prefs.h" // Prefs
|
|
|
|
//----------------------------------------------------------------------------
|
|
// resources
|
|
//----------------------------------------------------------------------------
|
|
|
|
// the application icon (under Windows it is in resources)
|
|
#ifndef wxHAS_IMAGES_IN_RESOURCES
|
|
#include "../sample.xpm"
|
|
#endif
|
|
|
|
//============================================================================
|
|
// declarations
|
|
//============================================================================
|
|
|
|
#define APP_NAME "STC-Test"
|
|
#define APP_DESCR "See http://wxguide.sourceforge.net/"
|
|
|
|
#define APP_MAINT "Otto Wyss"
|
|
#define APP_VENDOR "wxWidgets"
|
|
#define APP_COPYRIGTH "(C) 2003 Otto Wyss"
|
|
#define APP_LICENCE "wxWidgets"
|
|
|
|
#define APP_VERSION "0.1.alpha"
|
|
|
|
class AppBook;
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
//! global application name
|
|
wxString *g_appname = NULL;
|
|
|
|
#if wxUSE_PRINTING_ARCHITECTURE
|
|
|
|
//! global print data, to remember settings during the session
|
|
wxPrintData *g_printData = (wxPrintData*) NULL;
|
|
wxPageSetupDialogData *g_pageSetupData = (wxPageSetupDialogData*) NULL;
|
|
|
|
#endif // wxUSE_PRINTING_ARCHITECTURE
|
|
|
|
|
|
class AppFrame;
|
|
|
|
//----------------------------------------------------------------------------
|
|
//! application APP_VENDOR-APP_NAME.
|
|
class App: public wxApp {
|
|
friend class AppFrame;
|
|
|
|
public:
|
|
//! the main function called during application start
|
|
virtual bool OnInit () wxOVERRIDE;
|
|
|
|
//! application exit function
|
|
virtual int OnExit () wxOVERRIDE;
|
|
|
|
private:
|
|
//! frame window
|
|
AppFrame* m_frame;
|
|
|
|
wxFrame* MinimalEditor();
|
|
protected:
|
|
void OnMinimalEditor(wxCommandEvent&);
|
|
wxDECLARE_EVENT_TABLE();
|
|
};
|
|
|
|
// created dynamically by wxWidgets
|
|
wxDECLARE_APP(App);
|
|
|
|
//----------------------------------------------------------------------------
|
|
//! frame of the application APP_VENDOR-APP_NAME.
|
|
class AppFrame: public wxFrame {
|
|
friend class App;
|
|
friend class AppBook;
|
|
friend class AppAbout;
|
|
|
|
public:
|
|
//! constructor
|
|
AppFrame (const wxString &title);
|
|
|
|
//! destructor
|
|
~AppFrame ();
|
|
|
|
//! event handlers
|
|
//! common
|
|
void OnClose (wxCloseEvent &event);
|
|
void OnAbout (wxCommandEvent &event);
|
|
void OnExit (wxCommandEvent &event);
|
|
//! file
|
|
void OnFileOpen (wxCommandEvent &event);
|
|
void OnFileSave (wxCommandEvent &event);
|
|
void OnFileSaveAs (wxCommandEvent &event);
|
|
void OnFileClose (wxCommandEvent &event);
|
|
//! properties
|
|
void OnProperties (wxCommandEvent &event);
|
|
//! print
|
|
void OnPrintSetup (wxCommandEvent &event);
|
|
void OnPrintPreview (wxCommandEvent &event);
|
|
void OnPrint (wxCommandEvent &event);
|
|
//! edit events
|
|
void OnEdit (wxCommandEvent &event);
|
|
void OnContextMenu(wxContextMenuEvent& evt);
|
|
|
|
private:
|
|
// edit object
|
|
Edit *m_edit;
|
|
void FileOpen (wxString fname);
|
|
|
|
//! creates the application menu bar
|
|
wxMenuBar *m_menuBar;
|
|
void CreateMenu ();
|
|
|
|
// print preview position and size
|
|
wxRect DeterminePrintSize ();
|
|
|
|
wxDECLARE_EVENT_TABLE();
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
//! about box of the application APP_VENDOR-APP_NAME
|
|
class AppAbout: public wxDialog {
|
|
|
|
public:
|
|
//! constructor
|
|
AppAbout (wxWindow *parent,
|
|
int milliseconds = 0,
|
|
long style = 0);
|
|
|
|
//! destructor
|
|
~AppAbout ();
|
|
|
|
// event handlers
|
|
void OnTimerEvent (wxTimerEvent &event);
|
|
|
|
private:
|
|
// timer
|
|
wxTimer *m_timer;
|
|
|
|
wxDECLARE_EVENT_TABLE();
|
|
};
|
|
|
|
|
|
//============================================================================
|
|
// implementation
|
|
//============================================================================
|
|
|
|
wxIMPLEMENT_APP(App);
|
|
|
|
|
|
wxBEGIN_EVENT_TABLE(App, wxApp)
|
|
EVT_MENU(myID_WINDOW_MINIMAL, App::OnMinimalEditor)
|
|
wxEND_EVENT_TABLE()
|
|
|
|
//----------------------------------------------------------------------------
|
|
// App
|
|
//----------------------------------------------------------------------------
|
|
|
|
bool App::OnInit () {
|
|
|
|
wxInitAllImageHandlers();
|
|
|
|
// set application and vendor name
|
|
SetAppName (APP_NAME);
|
|
SetVendorName (APP_VENDOR);
|
|
g_appname = new wxString ();
|
|
g_appname->Append (APP_VENDOR);
|
|
g_appname->Append ("-");
|
|
g_appname->Append (APP_NAME);
|
|
|
|
#if wxUSE_PRINTING_ARCHITECTURE
|
|
// initialize print data and setup
|
|
g_printData = new wxPrintData;
|
|
wxPrintPaperType *paper = wxThePrintPaperDatabase->FindPaperType(wxPAPER_A4);
|
|
g_printData->SetPaperId(paper->GetId());
|
|
g_printData->SetPaperSize(paper->GetSize());
|
|
g_printData->SetOrientation(wxPORTRAIT);
|
|
|
|
g_pageSetupData = new wxPageSetupDialogData;
|
|
// copy over initial paper size from print record
|
|
(*g_pageSetupData) = *g_printData;
|
|
#endif // wxUSE_PRINTING_ARCHITECTURE
|
|
|
|
// create application frame
|
|
m_frame = new AppFrame (*g_appname);
|
|
|
|
// open application frame
|
|
m_frame->Layout ();
|
|
m_frame->Show (true);
|
|
|
|
return true;
|
|
}
|
|
|
|
int App::OnExit () {
|
|
|
|
// delete global appname
|
|
delete g_appname;
|
|
|
|
#if wxUSE_PRINTING_ARCHITECTURE
|
|
// delete global print data and setup
|
|
if (g_printData) delete g_printData;
|
|
if (g_pageSetupData) delete g_pageSetupData;
|
|
#endif // wxUSE_PRINTING_ARCHITECTURE
|
|
|
|
return 0;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// AppFrame
|
|
//----------------------------------------------------------------------------
|
|
|
|
wxBEGIN_EVENT_TABLE (AppFrame, wxFrame)
|
|
// common
|
|
EVT_CLOSE ( AppFrame::OnClose)
|
|
// file
|
|
EVT_MENU (wxID_OPEN, AppFrame::OnFileOpen)
|
|
EVT_MENU (wxID_SAVE, AppFrame::OnFileSave)
|
|
EVT_MENU (wxID_SAVEAS, AppFrame::OnFileSaveAs)
|
|
EVT_MENU (wxID_CLOSE, AppFrame::OnFileClose)
|
|
// properties
|
|
EVT_MENU (myID_PROPERTIES, AppFrame::OnProperties)
|
|
// print and exit
|
|
EVT_MENU (wxID_PRINT_SETUP, AppFrame::OnPrintSetup)
|
|
EVT_MENU (wxID_PREVIEW, AppFrame::OnPrintPreview)
|
|
EVT_MENU (wxID_PRINT, AppFrame::OnPrint)
|
|
EVT_MENU (wxID_EXIT, AppFrame::OnExit)
|
|
// Menu items with standard IDs forwarded to the editor.
|
|
EVT_MENU (wxID_CLEAR, AppFrame::OnEdit)
|
|
EVT_MENU (wxID_CUT, AppFrame::OnEdit)
|
|
EVT_MENU (wxID_COPY, AppFrame::OnEdit)
|
|
EVT_MENU (wxID_PASTE, AppFrame::OnEdit)
|
|
EVT_MENU (wxID_SELECTALL, AppFrame::OnEdit)
|
|
EVT_MENU (wxID_REDO, AppFrame::OnEdit)
|
|
EVT_MENU (wxID_UNDO, AppFrame::OnEdit)
|
|
EVT_MENU (wxID_FIND, AppFrame::OnEdit)
|
|
// And all our edit-related menu commands.
|
|
EVT_MENU_RANGE (myID_EDIT_FIRST, myID_EDIT_LAST,
|
|
AppFrame::OnEdit)
|
|
// help
|
|
EVT_MENU (wxID_ABOUT, AppFrame::OnAbout)
|
|
EVT_CONTEXT_MENU( AppFrame::OnContextMenu)
|
|
wxEND_EVENT_TABLE ()
|
|
|
|
AppFrame::AppFrame (const wxString &title)
|
|
: wxFrame ((wxFrame *)NULL, wxID_ANY, title, wxDefaultPosition, wxSize(750,550))
|
|
{
|
|
SetIcon(wxICON(sample));
|
|
|
|
// initialize important variables
|
|
m_edit = NULL;
|
|
|
|
// set icon and background
|
|
SetTitle (*g_appname);
|
|
SetBackgroundColour ("WHITE");
|
|
|
|
// create menu
|
|
m_menuBar = new wxMenuBar;
|
|
CreateMenu ();
|
|
|
|
// open first page
|
|
m_edit = new Edit (this, wxID_ANY);
|
|
m_edit->SetFocus();
|
|
|
|
FileOpen ("stctest.cpp");
|
|
}
|
|
|
|
AppFrame::~AppFrame () {
|
|
}
|
|
|
|
// common event handlers
|
|
void AppFrame::OnClose (wxCloseEvent &event) {
|
|
wxCommandEvent evt;
|
|
OnFileClose (evt);
|
|
if (m_edit && m_edit->Modified()) {
|
|
if (event.CanVeto()) event.Veto (true);
|
|
return;
|
|
}
|
|
Destroy();
|
|
}
|
|
|
|
void AppFrame::OnAbout (wxCommandEvent &WXUNUSED(event)) {
|
|
AppAbout dlg(this);
|
|
}
|
|
|
|
void AppFrame::OnExit (wxCommandEvent &WXUNUSED(event)) {
|
|
Close (true);
|
|
}
|
|
|
|
// file event handlers
|
|
void AppFrame::OnFileOpen (wxCommandEvent &WXUNUSED(event)) {
|
|
if (!m_edit) return;
|
|
#if wxUSE_FILEDLG
|
|
wxString fname;
|
|
wxFileDialog dlg (this, "Open file", wxEmptyString, wxEmptyString, "Any file (*)|*",
|
|
wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_CHANGE_DIR);
|
|
if (dlg.ShowModal() != wxID_OK) return;
|
|
fname = dlg.GetPath ();
|
|
FileOpen (fname);
|
|
#endif // wxUSE_FILEDLG
|
|
}
|
|
|
|
void AppFrame::OnFileSave (wxCommandEvent &WXUNUSED(event)) {
|
|
if (!m_edit) return;
|
|
if (!m_edit->Modified()) {
|
|
wxMessageBox (_("There is nothing to save!"), _("Save file"),
|
|
wxOK | wxICON_EXCLAMATION);
|
|
return;
|
|
}
|
|
m_edit->SaveFile ();
|
|
}
|
|
|
|
void AppFrame::OnFileSaveAs (wxCommandEvent &WXUNUSED(event)) {
|
|
if (!m_edit) return;
|
|
#if wxUSE_FILEDLG
|
|
wxString filename;
|
|
wxFileDialog dlg (this, "Save file", wxEmptyString, wxEmptyString, "Any file (*)|*", wxFD_SAVE|wxFD_OVERWRITE_PROMPT);
|
|
if (dlg.ShowModal() != wxID_OK) return;
|
|
filename = dlg.GetPath();
|
|
m_edit->SaveFile (filename);
|
|
#endif // wxUSE_FILEDLG
|
|
}
|
|
|
|
void AppFrame::OnFileClose (wxCommandEvent &WXUNUSED(event)) {
|
|
if (!m_edit) return;
|
|
if (m_edit->Modified()) {
|
|
if (wxMessageBox (_("Text is not saved, save before closing?"), _("Close"),
|
|
wxYES_NO | wxICON_QUESTION) == wxYES) {
|
|
m_edit->SaveFile();
|
|
if (m_edit->Modified()) {
|
|
wxMessageBox (_("Text could not be saved!"), _("Close abort"),
|
|
wxOK | wxICON_EXCLAMATION);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
m_edit->SetFilename (wxEmptyString);
|
|
m_edit->ClearAll();
|
|
m_edit->SetSavePoint();
|
|
}
|
|
|
|
// properties event handlers
|
|
void AppFrame::OnProperties (wxCommandEvent &WXUNUSED(event)) {
|
|
if (!m_edit) return;
|
|
EditProperties dlg(m_edit, 0);
|
|
}
|
|
|
|
// print event handlers
|
|
void AppFrame::OnPrintSetup (wxCommandEvent &WXUNUSED(event)) {
|
|
#if wxUSE_PRINTING_ARCHITECTURE
|
|
(*g_pageSetupData) = * g_printData;
|
|
wxPageSetupDialog pageSetupDialog(this, g_pageSetupData);
|
|
pageSetupDialog.ShowModal();
|
|
(*g_printData) = pageSetupDialog.GetPageSetupData().GetPrintData();
|
|
(*g_pageSetupData) = pageSetupDialog.GetPageSetupData();
|
|
#endif // wxUSE_PRINTING_ARCHITECTURE
|
|
}
|
|
|
|
void AppFrame::OnPrintPreview (wxCommandEvent &WXUNUSED(event)) {
|
|
#if wxUSE_PRINTING_ARCHITECTURE
|
|
wxPrintDialogData printDialogData( *g_printData);
|
|
wxPrintPreview *preview =
|
|
new wxPrintPreview (new EditPrint (m_edit),
|
|
new EditPrint (m_edit),
|
|
&printDialogData);
|
|
if (!preview->IsOk()) {
|
|
delete preview;
|
|
wxMessageBox (_("There was a problem with previewing.\n\
|
|
Perhaps your current printer is not correctly?"),
|
|
_("Previewing"), wxOK);
|
|
return;
|
|
}
|
|
wxRect rect = DeterminePrintSize();
|
|
wxPreviewFrame *frame = new wxPreviewFrame (preview, this, _("Print Preview"));
|
|
frame->SetSize (rect);
|
|
frame->Centre(wxBOTH);
|
|
frame->Initialize();
|
|
frame->Show(true);
|
|
#endif // wxUSE_PRINTING_ARCHITECTURE
|
|
}
|
|
|
|
void AppFrame::OnPrint (wxCommandEvent &WXUNUSED(event)) {
|
|
#if wxUSE_PRINTING_ARCHITECTURE
|
|
wxPrintDialogData printDialogData( *g_printData);
|
|
wxPrinter printer (&printDialogData);
|
|
EditPrint printout (m_edit);
|
|
if (!printer.Print (this, &printout, true)) {
|
|
if (wxPrinter::GetLastError() == wxPRINTER_ERROR) {
|
|
wxMessageBox (_("There was a problem with printing.\n\
|
|
Perhaps your current printer is not correctly?"),
|
|
_("Previewing"), wxOK);
|
|
return;
|
|
}
|
|
}
|
|
(*g_printData) = printer.GetPrintDialogData().GetPrintData();
|
|
#endif // wxUSE_PRINTING_ARCHITECTURE
|
|
}
|
|
|
|
// edit events
|
|
void AppFrame::OnEdit (wxCommandEvent &event) {
|
|
if (m_edit) m_edit->GetEventHandler()->ProcessEvent (event);
|
|
}
|
|
|
|
void AppFrame::OnContextMenu(wxContextMenuEvent& evt)
|
|
{
|
|
wxPoint point = evt.GetPosition();
|
|
// If from keyboard
|
|
if ( point.x == -1 && point.y == -1 )
|
|
{
|
|
wxSize size = GetSize();
|
|
point.x = size.x / 2;
|
|
point.y = size.y / 2;
|
|
}
|
|
else
|
|
{
|
|
point = ScreenToClient(point);
|
|
}
|
|
|
|
wxMenu menu;
|
|
menu.Append(wxID_ABOUT, "&About");
|
|
menu.Append(wxID_EXIT, "E&xit");
|
|
PopupMenu(&menu, point);
|
|
}
|
|
|
|
// private functions
|
|
void AppFrame::CreateMenu ()
|
|
{
|
|
// File menu
|
|
wxMenu *menuFile = new wxMenu;
|
|
menuFile->Append (wxID_OPEN, _("&Open ..\tCtrl+O"));
|
|
menuFile->Append (wxID_SAVE, _("&Save\tCtrl+S"));
|
|
menuFile->Append (wxID_SAVEAS, _("Save &as ..\tCtrl+Shift+S"));
|
|
menuFile->Append (wxID_CLOSE, _("&Close\tCtrl+W"));
|
|
menuFile->AppendSeparator();
|
|
menuFile->Append (myID_PROPERTIES, _("Proper&ties ..\tCtrl+I"));
|
|
menuFile->AppendSeparator();
|
|
menuFile->Append (wxID_PRINT_SETUP, _("Print Set&up .."));
|
|
menuFile->Append (wxID_PREVIEW, _("Print Pre&view\tCtrl+Shift+P"));
|
|
menuFile->Append (wxID_PRINT, _("&Print ..\tCtrl+P"));
|
|
menuFile->AppendSeparator();
|
|
menuFile->Append (wxID_EXIT, _("&Quit\tCtrl+Q"));
|
|
|
|
// Edit menu
|
|
wxMenu *menuEdit = new wxMenu;
|
|
menuEdit->Append (wxID_UNDO, _("&Undo\tCtrl+Z"));
|
|
menuEdit->Append (wxID_REDO, _("&Redo\tCtrl+Shift+Z"));
|
|
menuEdit->AppendSeparator();
|
|
menuEdit->Append (wxID_CUT, _("Cu&t\tCtrl+X"));
|
|
menuEdit->Append (wxID_COPY, _("&Copy\tCtrl+C"));
|
|
menuEdit->Append (wxID_PASTE, _("&Paste\tCtrl+V"));
|
|
menuEdit->Append (wxID_CLEAR, _("&Delete\tDel"));
|
|
menuEdit->AppendSeparator();
|
|
menuEdit->Append (wxID_FIND, _("&Find\tCtrl+F"));
|
|
menuEdit->Enable (wxID_FIND, false);
|
|
menuEdit->Append (myID_FINDNEXT, _("Find &next\tF3"));
|
|
menuEdit->Enable (myID_FINDNEXT, false);
|
|
menuEdit->Append (myID_REPLACE, _("&Replace\tCtrl+H"));
|
|
menuEdit->Enable (myID_REPLACE, false);
|
|
menuEdit->Append (myID_REPLACENEXT, _("Replace &again\tShift+F4"));
|
|
menuEdit->Enable (myID_REPLACENEXT, false);
|
|
menuEdit->AppendSeparator();
|
|
menuEdit->Append (myID_BRACEMATCH, _("&Match brace\tCtrl+M"));
|
|
menuEdit->Append (myID_GOTO, _("&Goto\tCtrl+G"));
|
|
menuEdit->Enable (myID_GOTO, false);
|
|
menuEdit->AppendSeparator();
|
|
menuEdit->Append (myID_INDENTINC, _("&Indent increase\tTab"));
|
|
menuEdit->Append (myID_INDENTRED, _("I&ndent reduce\tShift+Tab"));
|
|
menuEdit->AppendSeparator();
|
|
menuEdit->Append (wxID_SELECTALL, _("&Select all\tCtrl+A"));
|
|
menuEdit->Append (myID_SELECTLINE, _("Select &line\tCtrl+L"));
|
|
|
|
// highlight submenu
|
|
wxMenu *menuHighlight = new wxMenu;
|
|
int Nr;
|
|
for (Nr = 0; Nr < g_LanguagePrefsSize; Nr++) {
|
|
menuHighlight->Append (myID_HIGHLIGHTFIRST + Nr,
|
|
g_LanguagePrefs [Nr].name);
|
|
}
|
|
|
|
// charset submenu
|
|
wxMenu *menuCharset = new wxMenu;
|
|
menuCharset->Append (myID_CHARSETANSI, _("&ANSI (Windows)"));
|
|
menuCharset->Append (myID_CHARSETMAC, _("&MAC (Macintosh)"));
|
|
|
|
// View menu
|
|
wxMenu *menuView = new wxMenu;
|
|
menuView->Append (myID_HIGHLIGHTLANG, _("&Highlight language .."), menuHighlight);
|
|
menuView->AppendSeparator();
|
|
menuView->AppendCheckItem (myID_FOLDTOGGLE, _("&Toggle current fold\tCtrl+T"));
|
|
menuView->AppendCheckItem (myID_OVERTYPE, _("&Overwrite mode\tIns"));
|
|
menuView->AppendCheckItem (myID_WRAPMODEON, _("&Wrap mode\tCtrl+U"));
|
|
menuView->AppendSeparator();
|
|
menuView->AppendCheckItem (myID_DISPLAYEOL, _("Show line &endings"));
|
|
menuView->AppendCheckItem (myID_INDENTGUIDE, _("Show &indent guides"));
|
|
menuView->AppendCheckItem (myID_LINENUMBER, _("Show line &numbers"));
|
|
menuView->AppendCheckItem (myID_LONGLINEON, _("Show &long line marker"));
|
|
menuView->AppendCheckItem (myID_WHITESPACE, _("Show white&space"));
|
|
menuView->AppendSeparator();
|
|
menuView->Append (myID_USECHARSET, _("Use &code page of .."), menuCharset);
|
|
|
|
// Annotations menu
|
|
wxMenu* menuAnnotations = new wxMenu;
|
|
menuAnnotations->Append(myID_ANNOTATION_ADD, _("&Add or edit an annotation..."),
|
|
_("Add an annotation for the current line"));
|
|
menuAnnotations->Append(myID_ANNOTATION_REMOVE, _("&Remove annotation"),
|
|
_("Remove the annotation for the current line"));
|
|
menuAnnotations->Append(myID_ANNOTATION_CLEAR, _("&Clear all annotations"));
|
|
|
|
wxMenu* menuAnnotationsStyle = new wxMenu;
|
|
menuAnnotationsStyle->AppendRadioItem(myID_ANNOTATION_STYLE_HIDDEN, _("&Hidden"));
|
|
menuAnnotationsStyle->AppendRadioItem(myID_ANNOTATION_STYLE_STANDARD, _("&Standard"));
|
|
menuAnnotationsStyle->AppendRadioItem(myID_ANNOTATION_STYLE_BOXED, _("&Boxed"));
|
|
menuAnnotations->AppendSubMenu(menuAnnotationsStyle, "&Style");
|
|
|
|
// change case submenu
|
|
wxMenu *menuChangeCase = new wxMenu;
|
|
menuChangeCase->Append (myID_CHANGEUPPER, _("&Upper case"));
|
|
menuChangeCase->Append (myID_CHANGELOWER, _("&Lower case"));
|
|
|
|
// convert EOL submenu
|
|
wxMenu *menuConvertEOL = new wxMenu;
|
|
menuConvertEOL->Append (myID_CONVERTCR, _("CR (&Linux)"));
|
|
menuConvertEOL->Append (myID_CONVERTCRLF, _("CR+LF (&Windows)"));
|
|
menuConvertEOL->Append (myID_CONVERTLF, _("LF (&Macintosh)"));
|
|
|
|
// Extra menu
|
|
wxMenu *menuExtra = new wxMenu;
|
|
menuExtra->AppendCheckItem (myID_READONLY, _("&Readonly mode"));
|
|
menuExtra->AppendSeparator();
|
|
menuExtra->Append (myID_CHANGECASE, _("Change &case to .."), menuChangeCase);
|
|
menuExtra->AppendSeparator();
|
|
menuExtra->Append (myID_CONVERTEOL, _("Convert line &endings to .."), menuConvertEOL);
|
|
menuExtra->AppendCheckItem(myID_MULTIPLE_SELECTIONS, _("Toggle &multiple selections"));
|
|
menuExtra->AppendCheckItem(myID_MULTI_PASTE, _("Toggle multi-&paste"));
|
|
menuExtra->AppendCheckItem(myID_MULTIPLE_SELECTIONS_TYPING, _("Toggle t&yping on multiple selections"));
|
|
menuExtra->AppendSeparator();
|
|
#if defined(__WXMSW__) && wxUSE_GRAPHICS_DIRECT2D
|
|
wxMenu* menuTechnology = new wxMenu;
|
|
menuTechnology->AppendRadioItem(myID_TECHNOLOGY_DEFAULT, _("&Default"));
|
|
menuTechnology->AppendRadioItem(myID_TECHNOLOGY_DIRECTWRITE, _("Direct&Write"));
|
|
menuExtra->AppendSubMenu(menuTechnology, _("&Technology"));
|
|
menuExtra->AppendSeparator();
|
|
#endif
|
|
menuExtra->AppendCheckItem (myID_CUSTOM_POPUP, _("C&ustom context menu"));
|
|
|
|
// Window menu
|
|
wxMenu *menuWindow = new wxMenu;
|
|
menuWindow->Append(myID_WINDOW_MINIMAL, _("&Minimal editor"));
|
|
|
|
// Help menu
|
|
wxMenu *menuHelp = new wxMenu;
|
|
menuHelp->Append (wxID_ABOUT, _("&About ..\tCtrl+D"));
|
|
|
|
// construct menu
|
|
m_menuBar->Append (menuFile, _("&File"));
|
|
m_menuBar->Append (menuEdit, _("&Edit"));
|
|
m_menuBar->Append (menuView, _("&View"));
|
|
m_menuBar->Append (menuAnnotations, _("&Annotations"));
|
|
m_menuBar->Append (menuExtra, _("E&xtra"));
|
|
m_menuBar->Append (menuWindow, _("&Window"));
|
|
m_menuBar->Append (menuHelp, _("&Help"));
|
|
SetMenuBar (m_menuBar);
|
|
|
|
m_menuBar->Check(myID_ANNOTATION_STYLE_BOXED, true);
|
|
}
|
|
|
|
void AppFrame::FileOpen (wxString fname)
|
|
{
|
|
m_edit->LoadFile (wxFileName(fname).GetAbsolutePath());
|
|
m_edit->SelectNone();
|
|
}
|
|
|
|
wxRect AppFrame::DeterminePrintSize () {
|
|
|
|
wxSize scr = wxGetDisplaySize();
|
|
|
|
// determine position and size (shifting 16 left and down)
|
|
wxRect rect = GetRect();
|
|
rect.x += 16;
|
|
rect.y += 16;
|
|
rect.width = wxMin (rect.width, (scr.x - rect.x));
|
|
rect.height = wxMin (rect.height, (scr.x - rect.y));
|
|
|
|
return rect;
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
// AppAbout
|
|
//----------------------------------------------------------------------------
|
|
|
|
wxBEGIN_EVENT_TABLE (AppAbout, wxDialog)
|
|
EVT_TIMER (myID_ABOUTTIMER, AppAbout::OnTimerEvent)
|
|
wxEND_EVENT_TABLE ()
|
|
|
|
AppAbout::AppAbout (wxWindow *parent,
|
|
int milliseconds,
|
|
long style)
|
|
: wxDialog (parent, wxID_ANY, wxEmptyString,
|
|
wxDefaultPosition, wxDefaultSize,
|
|
style | wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) {
|
|
|
|
// set timer if any
|
|
m_timer = NULL;
|
|
if (milliseconds > 0) {
|
|
m_timer = new wxTimer (this, myID_ABOUTTIMER);
|
|
m_timer->Start (milliseconds, wxTIMER_ONE_SHOT);
|
|
}
|
|
|
|
// Get version of Scintilla
|
|
wxVersionInfo vi = wxStyledTextCtrl::GetLibraryVersionInfo();
|
|
|
|
// sets the application title
|
|
SetTitle (_("About .."));
|
|
|
|
// about info
|
|
wxGridSizer *aboutinfo = new wxGridSizer (2, 0, 2);
|
|
aboutinfo->Add (new wxStaticText(this, wxID_ANY, _("Written by: ")),
|
|
0, wxALIGN_LEFT);
|
|
aboutinfo->Add (new wxStaticText(this, wxID_ANY, APP_MAINT),
|
|
1, wxEXPAND | wxALIGN_LEFT);
|
|
aboutinfo->Add (new wxStaticText(this, wxID_ANY, _("Version: ")),
|
|
0, wxALIGN_LEFT);
|
|
aboutinfo->Add (new wxStaticText(this, wxID_ANY, wxString::Format("%s (%s)", APP_VERSION, vi.GetVersionString())),
|
|
1, wxEXPAND | wxALIGN_LEFT);
|
|
aboutinfo->Add (new wxStaticText(this, wxID_ANY, _("Licence type: ")),
|
|
0, wxALIGN_LEFT);
|
|
aboutinfo->Add (new wxStaticText(this, wxID_ANY, APP_LICENCE),
|
|
1, wxEXPAND | wxALIGN_LEFT);
|
|
aboutinfo->Add (new wxStaticText(this, wxID_ANY, _("Copyright: ")),
|
|
0, wxALIGN_LEFT);
|
|
aboutinfo->Add (new wxStaticText(this, wxID_ANY, APP_COPYRIGTH),
|
|
1, wxEXPAND | wxALIGN_LEFT);
|
|
|
|
// about icontitle//info
|
|
wxBoxSizer *aboutpane = new wxBoxSizer (wxHORIZONTAL);
|
|
wxBitmap bitmap = wxBitmap(wxICON (sample));
|
|
aboutpane->Add (new wxStaticBitmap (this, wxID_ANY, bitmap),
|
|
0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 20);
|
|
aboutpane->Add (aboutinfo, 1, wxEXPAND);
|
|
aboutpane->Add (60, 0);
|
|
|
|
// about complete
|
|
wxBoxSizer *totalpane = new wxBoxSizer (wxVERTICAL);
|
|
totalpane->Add (0, 20);
|
|
wxStaticText *appname = new wxStaticText(this, wxID_ANY, *g_appname);
|
|
appname->SetFont (wxFontInfo(24).Bold());
|
|
totalpane->Add (appname, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT, 40);
|
|
totalpane->Add (0, 10);
|
|
totalpane->Add (aboutpane, 0, wxEXPAND | wxALL, 4);
|
|
totalpane->Add (new wxStaticText(this, wxID_ANY, APP_DESCR),
|
|
0, wxALIGN_CENTER | wxALL, 10);
|
|
wxButton *okButton = new wxButton (this, wxID_OK, _("OK"));
|
|
okButton->SetDefault();
|
|
totalpane->Add (okButton, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT | wxBOTTOM, 10);
|
|
|
|
SetSizerAndFit (totalpane);
|
|
|
|
CenterOnScreen();
|
|
ShowModal();
|
|
}
|
|
|
|
AppAbout::~AppAbout () {
|
|
wxDELETE(m_timer);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// event handlers
|
|
void AppAbout::OnTimerEvent (wxTimerEvent &WXUNUSED(event)) {
|
|
wxDELETE(m_timer);
|
|
EndModal (wxID_OK);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Minimal editor added by Troels K 2008-04-08
|
|
// Thanks to geralds for SetLexerXml() - http://wxforum.shadonet.com/viewtopic.php?t=7155
|
|
|
|
class MinimalEditor : public wxStyledTextCtrl
|
|
{
|
|
enum
|
|
{
|
|
margin_id_lineno,
|
|
margin_id_fold,
|
|
};
|
|
|
|
public:
|
|
MinimalEditor(wxWindow* parent, wxWindowID id = wxID_ANY) : wxStyledTextCtrl(parent, id)
|
|
{
|
|
SetLexerXml();
|
|
|
|
SetProperty("fold", "1");
|
|
SetProperty("fold.comment", "1");
|
|
SetProperty("fold.compact", "1");
|
|
SetProperty("fold.preprocessor", "1");
|
|
SetProperty("fold.html", "1");
|
|
SetProperty("fold.html.preprocessor", "1");
|
|
|
|
SetMarginType(margin_id_lineno, wxSTC_MARGIN_NUMBER);
|
|
SetMarginWidth(margin_id_lineno, 32);
|
|
|
|
MarkerDefine(wxSTC_MARKNUM_FOLDER, wxSTC_MARK_BOXPLUS, "WHITE", "BLACK");
|
|
MarkerDefine(wxSTC_MARKNUM_FOLDEROPEN, wxSTC_MARK_BOXMINUS, "WHITE", "BLACK");
|
|
MarkerDefine(wxSTC_MARKNUM_FOLDERSUB, wxSTC_MARK_VLINE, "WHITE", "BLACK");
|
|
MarkerDefine(wxSTC_MARKNUM_FOLDEREND, wxSTC_MARK_BOXPLUSCONNECTED, "WHITE", "BLACK");
|
|
MarkerDefine(wxSTC_MARKNUM_FOLDEROPENMID, wxSTC_MARK_BOXMINUSCONNECTED, "WHITE", "BLACK");
|
|
MarkerDefine(wxSTC_MARKNUM_FOLDERMIDTAIL, wxSTC_MARK_TCORNER, "WHITE", "BLACK");
|
|
MarkerDefine(wxSTC_MARKNUM_FOLDERTAIL, wxSTC_MARK_LCORNER, "WHITE", "BLACK");
|
|
|
|
SetMarginMask(margin_id_fold, wxSTC_MASK_FOLDERS);
|
|
SetMarginWidth(margin_id_fold, 32);
|
|
SetMarginSensitive(margin_id_fold, true);
|
|
|
|
SetFoldFlags(wxSTC_FOLDFLAG_LINEBEFORE_CONTRACTED | wxSTC_FOLDFLAG_LINEAFTER_CONTRACTED);
|
|
|
|
SetTabWidth(4);
|
|
SetUseTabs(false);
|
|
SetWrapMode(wxSTC_WRAP_WORD);
|
|
SetWrapVisualFlags(wxSTC_WRAPVISUALFLAG_END);
|
|
}
|
|
virtual bool SetFont(const wxFont& font) wxOVERRIDE
|
|
{
|
|
StyleSetFont(wxSTC_STYLE_DEFAULT, font);
|
|
return wxStyledTextCtrl::SetFont(font);
|
|
}
|
|
void SetLexerXml()
|
|
{
|
|
SetLexer(wxSTC_LEX_XML);
|
|
StyleSetForeground(wxSTC_H_DEFAULT, *wxBLACK);
|
|
StyleSetForeground(wxSTC_H_TAG, *wxBLUE);
|
|
StyleSetForeground(wxSTC_H_TAGUNKNOWN, *wxBLUE);
|
|
StyleSetForeground(wxSTC_H_ATTRIBUTE, *wxRED);
|
|
StyleSetForeground(wxSTC_H_ATTRIBUTEUNKNOWN, *wxRED);
|
|
StyleSetBold(wxSTC_H_ATTRIBUTEUNKNOWN, true);
|
|
StyleSetForeground(wxSTC_H_NUMBER, *wxBLACK);
|
|
StyleSetForeground(wxSTC_H_DOUBLESTRING, *wxBLACK);
|
|
StyleSetForeground(wxSTC_H_SINGLESTRING, *wxBLACK);
|
|
StyleSetForeground(wxSTC_H_OTHER, *wxBLUE);
|
|
StyleSetForeground(wxSTC_H_COMMENT, wxColour("GREY"));
|
|
StyleSetForeground(wxSTC_H_ENTITY, *wxRED);
|
|
StyleSetBold(wxSTC_H_ENTITY, true);
|
|
StyleSetForeground(wxSTC_H_TAGEND, *wxBLUE);
|
|
StyleSetForeground(wxSTC_H_XMLSTART, *wxBLUE);
|
|
StyleSetForeground(wxSTC_H_XMLEND, *wxBLUE);
|
|
StyleSetForeground(wxSTC_H_CDATA, *wxRED);
|
|
}
|
|
protected:
|
|
void OnMarginClick(wxStyledTextEvent&);
|
|
void OnText(wxStyledTextEvent&);
|
|
wxDECLARE_EVENT_TABLE();
|
|
};
|
|
|
|
wxBEGIN_EVENT_TABLE(MinimalEditor, wxStyledTextCtrl)
|
|
EVT_STC_MARGINCLICK(wxID_ANY, MinimalEditor::OnMarginClick)
|
|
EVT_STC_CHANGE(wxID_ANY, MinimalEditor::OnText)
|
|
wxEND_EVENT_TABLE()
|
|
|
|
void MinimalEditor::OnMarginClick(wxStyledTextEvent &event)
|
|
{
|
|
if (event.GetMargin() == margin_id_fold)
|
|
{
|
|
int lineClick = LineFromPosition(event.GetPosition());
|
|
int levelClick = GetFoldLevel(lineClick);
|
|
if ((levelClick & wxSTC_FOLDLEVELHEADERFLAG) > 0)
|
|
{
|
|
ToggleFold(lineClick);
|
|
}
|
|
}
|
|
}
|
|
|
|
void MinimalEditor::OnText(wxStyledTextEvent& event)
|
|
{
|
|
wxLogDebug("Modified");
|
|
event.Skip();
|
|
}
|
|
|
|
class MinimalEditorFrame : public wxFrame
|
|
{
|
|
public:
|
|
MinimalEditorFrame() : wxFrame(NULL, wxID_ANY, _("Minimal Editor"))
|
|
{
|
|
MinimalEditor* editor = new MinimalEditor(this);
|
|
editor->SetFont(wxFontInfo().Family(wxFONTFAMILY_TELETYPE));
|
|
wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
|
|
sizer->Add(editor, 1, wxEXPAND);
|
|
SetSizer(sizer);
|
|
editor->SetText(
|
|
"<xml>\n"
|
|
" <text>\n"
|
|
" This is xml with syntax highlighting, line numbers, folding, word wrap and context menu\n"
|
|
" </text>\n"
|
|
"</xml>"
|
|
);
|
|
}
|
|
};
|
|
|
|
wxFrame* App::MinimalEditor()
|
|
{
|
|
MinimalEditorFrame* frame = new MinimalEditorFrame;
|
|
frame->Show();
|
|
return frame;
|
|
}
|
|
|
|
void App::OnMinimalEditor(wxCommandEvent& WXUNUSED(event))
|
|
{
|
|
MinimalEditor();
|
|
}
|
|
|