📄 edit.cpp
字号:
StyleSetForeground (wxSTC_STYLE_DEFAULT, wxColour (_T("DARK GREY"))); StyleSetForeground (wxSTC_STYLE_INDENTGUIDE, wxColour (_T("DARK GREY"))); // initialize settings if (g_CommonPrefs.syntaxEnable) { int keywordnr = 0; for (Nr = 0; Nr < STYLE_TYPES_COUNT; Nr++) { if (curInfo->styles[Nr].type == -1) continue; const StyleInfo &curType = g_StylePrefs [curInfo->styles[Nr].type]; wxFont font (curType.fontsize, wxMODERN, wxNORMAL, wxNORMAL, false, curType.fontname); StyleSetFont (Nr, font); if (curType.foreground) { StyleSetForeground (Nr, wxColour (curType.foreground)); } if (curType.background) { StyleSetBackground (Nr, wxColour (curType.background)); } StyleSetBold (Nr, (curType.fontstyle & mySTC_STYLE_BOLD) > 0); StyleSetItalic (Nr, (curType.fontstyle & mySTC_STYLE_ITALIC) > 0); StyleSetUnderline (Nr, (curType.fontstyle & mySTC_STYLE_UNDERL) > 0); StyleSetVisible (Nr, (curType.fontstyle & mySTC_STYLE_HIDDEN) == 0); StyleSetCase (Nr, curType.lettercase); const wxChar *pwords = curInfo->styles[Nr].words; if (pwords) { SetKeyWords (keywordnr, pwords); keywordnr += 1; } } } // set margin as unused SetMarginType (m_DividerID, wxSTC_MARGIN_SYMBOL); SetMarginWidth (m_DividerID, 0); SetMarginSensitive (m_DividerID, false); // folding SetMarginType (m_FoldingID, wxSTC_MARGIN_SYMBOL); SetMarginMask (m_FoldingID, wxSTC_MASK_FOLDERS); StyleSetBackground (m_FoldingID, *wxWHITE); SetMarginWidth (m_FoldingID, 0); SetMarginSensitive (m_FoldingID, false); if (g_CommonPrefs.foldEnable) { SetMarginWidth (m_FoldingID, curInfo->folds != 0? m_FoldingMargin: 0); SetMarginSensitive (m_FoldingID, curInfo->folds != 0); SetProperty (_T("fold"), curInfo->folds != 0? _T("1"): _T("0")); SetProperty (_T("fold.comment"), (curInfo->folds & mySTC_FOLD_COMMENT) > 0? _T("1"): _T("0")); SetProperty (_T("fold.compact"), (curInfo->folds & mySTC_FOLD_COMPACT) > 0? _T("1"): _T("0")); SetProperty (_T("fold.preprocessor"), (curInfo->folds & mySTC_FOLD_PREPROC) > 0? _T("1"): _T("0")); SetProperty (_T("fold.html"), (curInfo->folds & mySTC_FOLD_HTML) > 0? _T("1"): _T("0")); SetProperty (_T("fold.html.preprocessor"), (curInfo->folds & mySTC_FOLD_HTMLPREP) > 0? _T("1"): _T("0")); SetProperty (_T("fold.comment.python"), (curInfo->folds & mySTC_FOLD_COMMENTPY) > 0? _T("1"): _T("0")); SetProperty (_T("fold.quotes.python"), (curInfo->folds & mySTC_FOLD_QUOTESPY) > 0? _T("1"): _T("0")); } SetFoldFlags (wxSTC_FOLDFLAG_LINEBEFORE_CONTRACTED | wxSTC_FOLDFLAG_LINEAFTER_CONTRACTED); // set spaces and indention SetTabWidth (4); SetUseTabs (false); SetTabIndents (true); SetBackSpaceUnIndents (true); SetIndent (g_CommonPrefs.indentEnable? 4: 0); // others SetViewEOL (g_CommonPrefs.displayEOLEnable); SetIndentationGuides (g_CommonPrefs.indentGuideEnable); SetEdgeColumn (80); SetEdgeMode (g_CommonPrefs.longLineOnEnable? wxSTC_EDGE_LINE: wxSTC_EDGE_NONE); SetViewWhiteSpace (g_CommonPrefs.whiteSpaceEnable? wxSTC_WS_VISIBLEALWAYS: wxSTC_WS_INVISIBLE); SetOvertype (g_CommonPrefs.overTypeInitial); SetReadOnly (g_CommonPrefs.readOnlyInitial); SetWrapMode (g_CommonPrefs.wrapModeInitial? wxSTC_WRAP_WORD: wxSTC_WRAP_NONE); return true;}bool Edit::LoadFile (){#if wxUSE_FILEDLG // get filname if (!m_filename) { wxFileDialog dlg (this, _T("Open file"), wxEmptyString, wxEmptyString, _T("Any file (*)|*"), wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_CHANGE_DIR); if (dlg.ShowModal() != wxID_OK) return false; m_filename = dlg.GetPath(); } // load file return LoadFile (m_filename);#else return false;#endif // wxUSE_FILEDLG}bool Edit::LoadFile (const wxString &filename) { // load file in edit and clear undo if (!filename.empty()) m_filename = filename;// wxFile file (m_filename);// if (!file.IsOpened()) return false; ClearAll ();// long lng = file.Length ();// if (lng > 0) {// wxString buf;// wxChar *buff = buf.GetWriteBuf (lng);// file.Read (buff, lng);// buf.UngetWriteBuf ();// InsertText (0, buf);// }// file.Close(); wxStyledTextCtrl::LoadFile(m_filename); EmptyUndoBuffer(); // determine lexer language wxFileName fname (m_filename); InitializePrefs (DeterminePrefs (fname.GetFullName())); return true;}bool Edit::SaveFile (){#if wxUSE_FILEDLG // return if no change if (!Modified()) return true; // get filname if (!m_filename) { wxFileDialog dlg (this, _T("Save file"), wxEmptyString, wxEmptyString, _T("Any file (*)|*"), wxFD_SAVE | wxFD_OVERWRITE_PROMPT); if (dlg.ShowModal() != wxID_OK) return false; m_filename = dlg.GetPath(); } // save file return SaveFile (m_filename);#else return false;#endif // wxUSE_FILEDLG}bool Edit::SaveFile (const wxString &filename) { // return if no change if (!Modified()) return true;// // save edit in file and clear undo// if (!filename.empty()) m_filename = filename;// wxFile file (m_filename, wxFile::write);// if (!file.IsOpened()) return false;// wxString buf = GetText();// bool okay = file.Write (buf);// file.Close();// if (!okay) return false;// EmptyUndoBuffer();// SetSavePoint();// return true; return wxStyledTextCtrl::SaveFile(filename);}bool Edit::Modified () { // return modified state return (GetModify() && !GetReadOnly());}//----------------------------------------------------------------------------// EditProperties//----------------------------------------------------------------------------EditProperties::EditProperties (Edit *edit, long style) : wxDialog (edit, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, style | wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) { // sets the application title SetTitle (_("Properties")); wxString text; // fullname wxBoxSizer *fullname = new wxBoxSizer (wxHORIZONTAL); fullname->Add (10, 0); fullname->Add (new wxStaticText (this, wxID_ANY, _("Full filename"), wxDefaultPosition, wxSize(80, wxDefaultCoord)), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL); fullname->Add (new wxStaticText (this, wxID_ANY, edit->GetFilename()), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL); // text info wxGridSizer *textinfo = new wxGridSizer (4, 0, 2); textinfo->Add (new wxStaticText (this, wxID_ANY, _("Language"), wxDefaultPosition, wxSize(80, wxDefaultCoord)), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxLEFT, 4); textinfo->Add (new wxStaticText (this, wxID_ANY, edit->m_language->name), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 4); textinfo->Add (new wxStaticText (this, wxID_ANY, _("Lexer-ID: "), wxDefaultPosition, wxSize(80, wxDefaultCoord)), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxLEFT, 4); text = wxString::Format (_T("%d"), edit->GetLexer()); textinfo->Add (new wxStaticText (this, wxID_ANY, text), 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 4); wxString EOLtype = wxEmptyString; switch (edit->GetEOLMode()) { case wxSTC_EOL_CR: {EOLtype = _T("CR (Unix)"); break; } case wxSTC_EOL_CRLF: {EOLtype = _T("CRLF (Windows)"); break; } case wxSTC_EOL_LF: {EOLtype = _T("CR (Macintosh)"); break; } } textinfo->Add (new wxStaticText (this, wxID_ANY, _("Line endings"), wxDefaultPosition, wxSize(80, wxDefaultCoord)), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxLEFT, 4); textinfo->Add (new wxStaticText (this, wxID_ANY, EOLtype), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 4); // text info box wxStaticBoxSizer *textinfos = new wxStaticBoxSizer ( new wxStaticBox (this, wxID_ANY, _("Informations")), wxVERTICAL); textinfos->Add (textinfo, 0, wxEXPAND); textinfos->Add (0, 6); // statistic wxGridSizer *statistic = new wxGridSizer (4, 0, 2); statistic->Add (new wxStaticText (this, wxID_ANY, _("Total lines"), wxDefaultPosition, wxSize(80, wxDefaultCoord)), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxLEFT, 4); text = wxString::Format (_T("%d"), edit->GetLineCount()); statistic->Add (new wxStaticText (this, wxID_ANY, text), 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 4); statistic->Add (new wxStaticText (this, wxID_ANY, _("Total chars"), wxDefaultPosition, wxSize(80, wxDefaultCoord)), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxLEFT, 4); text = wxString::Format (_T("%d"), edit->GetTextLength()); statistic->Add (new wxStaticText (this, wxID_ANY, text), 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 4); statistic->Add (new wxStaticText (this, wxID_ANY, _("Current line"), wxDefaultPosition, wxSize(80, wxDefaultCoord)), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxLEFT, 4); text = wxString::Format (_T("%d"), edit->GetCurrentLine()); statistic->Add (new wxStaticText (this, wxID_ANY, text), 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 4); statistic->Add (new wxStaticText (this, wxID_ANY, _("Current pos"), wxDefaultPosition, wxSize(80, wxDefaultCoord)), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxLEFT, 4); text = wxString::Format (_T("%d"), edit->GetCurrentPos()); statistic->Add (new wxStaticText (this, wxID_ANY, text), 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 4); // char/line statistics wxStaticBoxSizer *statistics = new wxStaticBoxSizer ( new wxStaticBox (this, wxID_ANY, _("Statistics")), wxVERTICAL); statistics->Add (statistic, 0, wxEXPAND); statistics->Add (0, 6); // total pane wxBoxSizer *totalpane = new wxBoxSizer (wxVERTICAL); totalpane->Add (fullname, 0, wxEXPAND | wxLEFT | wxRIGHT | wxTOP, 10); totalpane->Add (0, 6); totalpane->Add (textinfos, 0, wxEXPAND | wxLEFT | wxRIGHT, 10); totalpane->Add (0, 10); totalpane->Add (statistics, 0, wxEXPAND | wxLEFT | wxRIGHT, 10); totalpane->Add (0, 6); wxButton *okButton = new wxButton (this, wxID_OK, _("OK")); okButton->SetDefault(); totalpane->Add (okButton, 0, wxALIGN_CENTER | wxALL, 10); SetSizerAndFit (totalpane); ShowModal();}#if wxUSE_PRINTING_ARCHITECTURE//----------------------------------------------------------------------------// EditPrint//----------------------------------------------------------------------------EditPrint::EditPrint (Edit *edit, wxChar *title) : wxPrintout(title) { m_edit = edit; m_printed = 0;}bool EditPrint::OnPrintPage (int page) { wxDC *dc = GetDC(); if (!dc) return false; // scale DC PrintScaling (dc); // print page if (page == 1) m_printed = 0; m_printed = m_edit->FormatRange (1, m_printed, m_edit->GetLength(), dc, dc, m_printRect, m_pageRect); return true;}bool EditPrint::OnBeginDocument (int startPage, int endPage) { if (!wxPrintout::OnBeginDocument (startPage, endPage)) { return false; } return true;}void EditPrint::GetPageInfo (int *minPage, int *maxPage, int *selPageFrom, int *selPageTo) { // initialize values *minPage = 0; *maxPage = 0; *selPageFrom = 0; *selPageTo = 0; // scale DC if possible wxDC *dc = GetDC(); if (!dc) return; PrintScaling (dc); // get print page informations and convert to printer pixels wxSize ppiScr; GetPPIScreen (&ppiScr.x, &ppiScr.y); wxSize page = g_pageSetupData->GetPaperSize(); page.x = static_cast<int> (page.x * ppiScr.x / 25.4); page.y = static_cast<int> (page.y * ppiScr.y / 25.4); m_pageRect = wxRect (0, 0, page.x, page.y); // get margins informations and convert to printer pixels wxPoint pt = g_pageSetupData->GetMarginTopLeft(); int left = pt.x; int top = pt.y; pt = g_pageSetupData->GetMarginBottomRight(); int right = pt.x; int bottom = pt.y; top = static_cast<int> (top * ppiScr.y / 25.4); bottom = static_cast<int> (bottom * ppiScr.y / 25.4); left = static_cast<int> (left * ppiScr.x / 25.4); right = static_cast<int> (right * ppiScr.x / 25.4); m_printRect = wxRect (left, top, page.x - (left + right), page.y - (top + bottom)); // count pages while (HasPage (*maxPage)) { m_printed = m_edit->FormatRange (0, m_printed, m_edit->GetLength(), dc, dc, m_printRect, m_pageRect); *maxPage += 1; } if (*maxPage > 0) *minPage = 1; *selPageFrom = *minPage; *selPageTo = *maxPage;}bool EditPrint::HasPage (int WXUNUSED(page)) { return (m_printed < m_edit->GetLength());}bool EditPrint::PrintScaling (wxDC *dc){ // check for dc, return if none if (!dc) return false; // get printer and screen sizing values wxSize ppiScr; GetPPIScreen (&ppiScr.x, &ppiScr.y); if (ppiScr.x == 0) { // most possible guess 96 dpi ppiScr.x = 96; ppiScr.y = 96; } wxSize ppiPrt; GetPPIPrinter (&ppiPrt.x, &ppiPrt.y); if (ppiPrt.x == 0) { // scaling factor to 1 ppiPrt.x = ppiScr.x; ppiPrt.y = ppiScr.y; } wxSize dcSize = dc->GetSize(); wxSize pageSize; GetPageSizePixels (&pageSize.x, &pageSize.y); // set user scale float scale_x = (float)(ppiPrt.x * dcSize.x) / (float)(ppiScr.x * pageSize.x); float scale_y = (float)(ppiPrt.y * dcSize.y) / (float)(ppiScr.y * pageSize.y); dc->SetUserScale (scale_x, scale_y); return true;}#endif // wxUSE_PRINTING_ARCHITECTURE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -