#include "ide.h" #define LLOG(x) // LOG(x) int CharFilterVar(int c) { return IsAlNum(c) || c == '_' ? c : 0; } void DlCharset(DropList& d) { d.Add(CHARSET_UTF8, "UTF8"); for(int i = 1; i < CharsetCount(); i++) d.Add(i, CharsetName(i)); } class FontSelectManager { DropList *face; DropList *height; Option *bold; Option *italic; Option *naa; void FaceSelect(); void Select(); public: Callback WhenAction; typedef FontSelectManager CLASSNAME; void Set(DropList& _face, DropList& _height, Option& _bold, Option& _italic, Option& _naa); void Set(Font f); Font Get(); }; void FontSelectManager::FaceSelect() { Select(); } void FontSelectManager::Select() { WhenAction(); } void LoadFonts(DropList *face, Index& fni, bool fixed) { for(int i = 0; i < Font::GetFaceCount(); i++) if(!!(Font::GetFaceInfo(i) & Font::FIXEDPITCH) == fixed) { String n = Font::GetFaceName(i); if(fni.Find(n) < 0) { fni.Add(n); face->Add(i, n); } } } void FontSelectManager::Set(DropList& _face, DropList& _height, Option& _bold, Option& _italic, Option& _naa) { face = &_face; face->WhenAction = THISBACK(FaceSelect); height = &_height; height->WhenAction = THISBACK(Select); bold = &_bold; bold->WhenAction = THISBACK(Select); italic = &_italic; italic->WhenAction = THISBACK(Select); naa = &_naa; naa->WhenAction = THISBACK(Select); face->Clear(); Index fni; LoadFonts(face, fni, true); face->AddSeparator(); LoadFonts(face, fni, false); face->SetIndex(0); height->ClearList(); for(int i = 6; i < 32; i++) height->Add(i); FaceSelect(); } void FontSelectManager::Set(Font f) { int fi = f.GetFace(); if(!face->HasKey(fi)) { fi = face->FindValue(f.GetFaceName()); if(fi < 0) fi = Font::COURIER; else fi = face->GetKey(fi); } face->SetData(fi); FaceSelect(); height->SetData(f.GetHeight()); for(int i = 0; i < height->GetCount(); i++) { int q = height->GetKey(i); if(f.GetHeight() <= q) { height->SetData(q); break; } } *bold = f.IsBold(); *italic = f.IsItalic(); *naa = f.IsNonAntiAliased(); } Font FontSelectManager::Get() { Font f(face->GetData(), height->GetData()); if(*bold) f.Bold(); if(*italic) f.Italic(); if(*naa) f.NonAntiAliased(); return f; } void Ide::UpdateFormat(CodeEditor& editor, QuickTabs& tabs) { if(!IsActiveFile() || ActiveFile().tabsize <= 0) editor.TabSize(editortabsize); if(!designer) if(filetabs) editor.SetFrame(tabs); else editor.SetFrame(ViewFrame()); editor.IndentSpaces(indent_spaces); editor.IndentAmount(indent_amount); editor.ShowTabs(show_tabs); editor.NoParenthesisIndent(no_parenthesis_indent); editor.HiliteScope(hilite_scope); editor.HiliteBracket(hilite_bracket); editor.HiliteIfDef(hilite_ifdef); editor.HiliteIfEndif(hilite_if_endif); editor.LineNumbers(line_numbers); editor.AutoEnclose(auto_enclose); editor.MarkLines(mark_lines); editor.BorderColumn(bordercolumn, bordercolor); editor.Refresh(); tabs.Grouping(tabs_grouping); tabs.FileIcons(tabs_icons); tabs.Crosses(tabs_crosses); } void Ide::UpdateFormat() { SetupEditor(); UpdateFormat(editor, tabs); UpdateFormat(editor2, tabs2); console.SetFont(consolefont); console.WrapText(wrap_console_text); console2.SetFont(consolefont); console2.WrapText(wrap_console_text); statusbar.Show(show_status_bar); SetupBars(); } void Ide::EditorFontScroll(int d) { if(!IsActiveFile()) return; Package::File& f = ActiveFile(); if(f.font != 0 || editorsplit.GetZoom() < 0) return; int h = editorfont.GetCy(); int q = editorfont.GetHeight(); while(editorfont.GetCy() == h && (d < 0 ? editorfont.GetCy() > 5 : editorfont.GetCy() < 40)) editorfont.Height(q += d); editor.SetFont(editorfont); } struct FormatDlg : TabDlg { ColorPusher hl_color[CodeEditor::HL_COUNT]; }; void HlPusherFactory(One& ctrl) { ctrl.Create().NotNull().Track(); } void Ide::ReadHlStyles(ArrayCtrl& hlstyle) { hlstyle.Clear(); for(int i = 0; i < CodeEditor::HL_COUNT; i++) { const CodeEditor::HlStyle& s = editor.GetHlStyle(i); hlstyle.Add(editor.GetHlName(i), s.color, s.bold, s.italic, s.underline); } } class AStyleSetupDialog : public WithSetupAstyleLayout { Ide *ide; typedef AStyleSetupDialog CLASSNAME; public: AStyleSetupDialog(Ide *_ide); void AstyleTest(); void UppDefaults(); }; AStyleSetupDialog::AStyleSetupDialog(Ide *_ide) { ide = _ide; BracketFormatMode.Add(astyle::NONE_MODE, "none"); BracketFormatMode.Add(astyle::ATTACH_MODE, "attach"); BracketFormatMode.Add(astyle::BREAK_MODE, "break"); ParensPaddingMode.Add(astyle::PAD_NONE, "no space pad around parenthesis"); ParensPaddingMode.Add(astyle::PAD_INSIDE, "pad parenthesis inside with space"); ParensPaddingMode.Add(astyle::PAD_OUTSIDE, "pad parenthesis outside with space"); ParensPaddingMode.Add(astyle::PAD_BOTH, "pad both parenthesis sides with spaces"); Test <<= THISBACK(AstyleTest); Defaults << THISBACK(UppDefaults); } void AStyleSetupDialog::AstyleTest() { astyle::ASFormatter Formatter; // sets up parameters from astyle dialog Formatter.setBracketIndent(BracketIndent); Formatter.setNamespaceIndent(NamespaceIndent); Formatter.setBlockIndent(BlockIndent); Formatter.setCaseIndent(CaseIndent); Formatter.setClassIndent(ClassIndent); Formatter.setLabelIndent(LabelIndent); Formatter.setSwitchIndent(SwitchIndent); Formatter.setPreprocessorIndent(PreprocessorIndent); Formatter.setMaxInStatementIndentLength(MaxInStatementIndentLength); Formatter.setMinConditionalIndentLength(MinInStatementIndentLength); Formatter.setBreakClosingHeaderBracketsMode(BreakClosingHeaderBracketsMode); Formatter.setBreakElseIfsMode(BreakElseIfsMode); Formatter.setBreakOneLineBlocksMode(BreakOneLineBlocksMode); Formatter.setSingleStatementsMode(SingleStatementsMode); Formatter.setBreakBlocksMode(BreakBlocksMode); Formatter.setBreakClosingHeaderBlocksMode(BreakClosingHeaderBlocksMode); Formatter.setBracketFormatMode((astyle::BracketMode)BracketFormatMode.GetIndex()); switch(ParensPaddingMode.GetIndex()) { case astyle::PAD_INSIDE : Formatter.setParensInsidePaddingMode(true); Formatter.setParensOutsidePaddingMode(false); break; case astyle::PAD_OUTSIDE : Formatter.setParensInsidePaddingMode(false); Formatter.setParensOutsidePaddingMode(true); break; case astyle::PAD_BOTH : Formatter.setParensInsidePaddingMode(true); Formatter.setParensOutsidePaddingMode(true); break; default : Formatter.setParensOutsidePaddingMode(false); Formatter.setParensInsidePaddingMode(false); break; } Formatter.setParensUnPaddingMode(ParensUnPaddingMode); Formatter.setOperatorPaddingMode(OperatorPaddingMode); Formatter.setEmptyLineFill(EmptyLineFill); Formatter.setTabSpaceConversionMode(TabSpaceConversionMode); Formatter.setTabIndentation(ide->editortabsize, ide->indent_spaces ? false : true); Formatter.setSpaceIndentation(ide->indent_spaces ? ide->indent_amount : ide->editortabsize); // formats text in test box TestBox.Set(ide->FormatCodeString(TestBox.GetW(), Formatter)); } void AStyleSetupDialog::UppDefaults() { BracketIndent = false; NamespaceIndent = true; BlockIndent = false; CaseIndent = true; ClassIndent = true; LabelIndent = true; SwitchIndent = true; PreprocessorIndent = false; MaxInStatementIndentLength = 20; MinInStatementIndentLength = 2; BreakClosingHeaderBracketsMode = 0; BreakElseIfsMode = true; BreakOneLineBlocksMode = true; SingleStatementsMode = true; BreakBlocksMode = false; BreakClosingHeaderBlocksMode = false; BracketFormatMode.SetIndex(1); ParensPaddingMode.SetIndex(0); ParensUnPaddingMode = true; OperatorPaddingMode = false; EmptyLineFill = false; TabSpaceConversionMode = false; } void SetConsole(EditString *e, const char *text) { *e <<= text; } void Ide::SetupFormat() { FormatDlg dlg; dlg.Title("Format setup"); WithSetupFontLayout fnt; WithSetupHlLayout hlt; WithSetupEditorLayout edt; WithSetupIdeLayout ide; AStyleSetupDialog ast(this); #ifdef PLATFORM_WIN32 ide.console_txt.Hide(); ide.console.Hide(); ide.kde.Hide(); ide.gnome.Hide(); ide.xterm.Hide(); #endif ide.kde <<= callback2(SetConsole, &ide.console, "/usr/bin/konsole -e"); ide.gnome <<= callback2(SetConsole, &ide.console, "/usr/bin/gnome-terminal -x"); ide.xterm <<= callback2(SetConsole, &ide.console, "/usr/bin/xterm -e"); dlg.Add(fnt, "Fonts"); dlg.Add(hlt, "Syntax highlighting"); dlg.Add(edt, "Editor"); dlg.Add(ide, "IDE"); dlg.Add(ast, "Code formatting"); dlg.WhenClose = dlg.Acceptor(IDYES); FontSelectManager ed, vf, con, f1, f2, tf; ed.Set(fnt.face, fnt.height, fnt.bold, fnt.italic, fnt.naa); vf.Set(fnt.vface, fnt.vheight, fnt.vbold, fnt.vitalic, fnt.vnaa); con.Set(fnt.cface, fnt.cheight, fnt.cbold, fnt.citalic, fnt.cnaa); tf.Set(fnt.tface, fnt.theight, fnt.tbold, fnt.titalic, fnt.tnaa); f1.Set(fnt.face1, fnt.height1, fnt.bold1, fnt.italic1, fnt.naa1); f2.Set(fnt.face2, fnt.height2, fnt.bold2, fnt.italic2, fnt.naa2); ed.Set(editorfont); vf.Set(veditorfont); con.Set(consolefont); tf.Set(tfont); f1.Set(font1); f2.Set(font2); DlCharset(edt.charset); edt.tabsize.MinMax(1, 100).NotNull(); edt.tabsize <<= editortabsize; edt.indent_amount.MinMax(1, 100).NotNull(); edt.indent_amount <<= indent_spaces ? indent_amount : editortabsize; edt.indent_amount.Enable(indent_spaces); CtrlRetriever rtvr; int hs = hilite_scope; rtvr (hlt.hilite_scope, hs) (hlt.hilite_bracket, hilite_bracket) (hlt.hilite_ifdef, hilite_ifdef) (hlt.hilite_if_endif, hilite_if_endif) (edt.indent_spaces, indent_spaces) (edt.no_parenthesis_indent, no_parenthesis_indent) (edt.showtabs, show_tabs) (edt.tabs_icons, tabs_icons) (edt.tabs_crosses, tabs_crosses) (edt.tabs_grouping, tabs_grouping) (edt.tabs_serialize, tabs_serialize) (edt.filetabs, filetabs) (edt.numbers, line_numbers) (edt.bookmark_pos, bookmark_pos) (edt.header_guards, header_guards) (edt.insert_include, insert_include) (edt.auto_enclose, auto_enclose) (edt.mark_lines, mark_lines) (edt.bordercolumn, bordercolumn) (edt.bordercolor, bordercolor) (edt.showtime, showtime) (ide.show_status_bar, show_status_bar) (ide.toolbar_in_row, toolbar_in_row) (ide.splash_screen, splash_screen) (ide.sort, sort) (ide.mute_sounds, mute_sounds) (ide.wrap_console_text, wrap_console_text) (ide.assist, editor.auto_assist) (ide.commentdp, editor.commentdp) (ide.hydra1_threads, hydra1_threads) (ide.chstyle, chstyle) (ide.console, LinuxHostConsole) (ast.BracketIndent, astyle_BracketIndent) (ast.NamespaceIndent, astyle_NamespaceIndent) (ast.BlockIndent, astyle_BlockIndent) (ast.CaseIndent, astyle_CaseIndent) (ast.ClassIndent, astyle_ClassIndent) (ast.LabelIndent, astyle_LabelIndent) (ast.SwitchIndent, astyle_SwitchIndent) (ast.PreprocessorIndent, astyle_PreprocessorIndent) (ast.MinInStatementIndentLength, astyle_MinInStatementIndentLength) (ast.MaxInStatementIndentLength, astyle_MaxInStatementIndentLength) (ast.BreakClosingHeaderBracketsMode,astyle_BreakClosingHeaderBracketsMode) (ast.BreakElseIfsMode, astyle_BreakElseIfsMode) (ast.BreakOneLineBlocksMode, astyle_BreakOneLineBlocksMode) (ast.SingleStatementsMode, astyle_SingleStatementsMode) (ast.BreakBlocksMode, astyle_BreakBlocksMode) (ast.BreakClosingHeaderBlocksMode, astyle_BreakClosingHeaderBlocksMode) (ast.BracketFormatMode, astyle_BracketFormatMode) (ast.ParensPaddingMode, astyle_ParensPaddingMode) (ast.ParensUnPaddingMode, astyle_ParensUnPaddingMode) (ast.OperatorPaddingMode, astyle_OperatorPaddingMode) (ast.EmptyLineFill, astyle_EmptyLineFill) (ast.TabSpaceConversionMode, astyle_TabSpaceConversionMode) (ast.TestBox, astyle_TestBox) ; hlt.hlstyle.AddColumn("Style"); hlt.hlstyle.AddColumn("Color").Ctrls(HlPusherFactory); hlt.hlstyle.AddColumn("Bold").Ctrls