mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-15 14:16:07 -06:00
ide: clang-format integration
This commit is contained in:
parent
87034d3fe0
commit
2e77d71f12
19 changed files with 698 additions and 90 deletions
24
.clang-format
Normal file
24
.clang-format
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
# .clang-format file for U++ framework
|
||||||
|
|
||||||
|
---
|
||||||
|
BasedOnStyle: LLVM
|
||||||
|
UseTab: AlignWithSpaces
|
||||||
|
IndentWidth: 4
|
||||||
|
TabWidth: 4
|
||||||
|
ColumnLimit: 96
|
||||||
|
---
|
||||||
|
Language: Cpp
|
||||||
|
AccessModifierOffset: -4
|
||||||
|
AllowShortFunctionsOnASingleLine: All
|
||||||
|
AlwaysBreakTemplateDeclarations: true
|
||||||
|
BreakBeforeBraces: Stroustrup
|
||||||
|
BreakConstructorInitializers: BeforeComma
|
||||||
|
CompactNamespaces: true
|
||||||
|
DerivePointerAlignment: false
|
||||||
|
IfMacros: ['ONCELOCK']
|
||||||
|
PointerAlignment: Left
|
||||||
|
SpaceBeforeParens: Custom
|
||||||
|
SpaceBeforeParensOptions:
|
||||||
|
AfterControlStatements: false
|
||||||
|
IndentAccessModifiers: false
|
||||||
|
IndentPPDirectives: None
|
||||||
|
|
@ -12,7 +12,7 @@ AskContinue()
|
||||||
uname=`uname`
|
uname=`uname`
|
||||||
|
|
||||||
if [ -x "$(command -v apt-get)" ]; then
|
if [ -x "$(command -v apt-get)" ]; then
|
||||||
DEP="apt-get install g++ clang git make libgtk-3-dev libnotify-dev libbz2-dev libssl-dev xdotool"
|
DEP="apt-get install g++ clang git make libgtk-3-dev libnotify-dev libbz2-dev libssl-dev xdotool clang-format"
|
||||||
elif [ -x "$(command -v yum)" ]; then
|
elif [ -x "$(command -v yum)" ]; then
|
||||||
DEP="yum install gcc-c++ clang git make gtk3-devel libnotify-devel bzip2-devel freetype-devel openssl-devel"
|
DEP="yum install gcc-c++ clang git make gtk3-devel libnotify-devel bzip2-devel freetype-devel openssl-devel"
|
||||||
elif [ -x "$(command -v dnf)" ]; then
|
elif [ -x "$(command -v dnf)" ]; then
|
||||||
|
|
|
||||||
|
|
@ -345,7 +345,7 @@ bool LocalProcess::DoStart(const char *command, const Vector<String> *arg, bool
|
||||||
execv(app_full, args.Begin());
|
execv(app_full, args.Begin());
|
||||||
LLOG("execve failed, errno = " << errno);
|
LLOG("execve failed, errno = " << errno);
|
||||||
// printf("Error running '%s', error code %d\n", command, errno);
|
// printf("Error running '%s', error code %d\n", command, errno);
|
||||||
exit(-errno);
|
abort(); // do not use exit here: it calls global destructors...
|
||||||
return true;
|
return true;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,8 @@ bool AndroidManifest::Parse()
|
||||||
|
|
||||||
p.Skip();
|
p.Skip();
|
||||||
}
|
}
|
||||||
} catch(const XmlError& e) {
|
}
|
||||||
|
catch(const XmlError& e) {
|
||||||
Loge() << METHOD_NAME << "Failed to parse manifest file with error \"" + e + "\".";
|
Loge() << METHOD_NAME << "Failed to parse manifest file with error \"" + e + "\".";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -102,9 +102,9 @@ void MakeBuild::CreateHost(Host& host, const String& method, bool darkmode, bool
|
||||||
VectorMap<String, String> env = clone(Environment());
|
VectorMap<String, String> env = clone(Environment());
|
||||||
host.exedirs = SplitDirs(bm.Get("PATH", "") + ';' + env.Get("PATH", ""));
|
host.exedirs = SplitDirs(bm.Get("PATH", "") + ';' + env.Get("PATH", ""));
|
||||||
#ifdef PLATFORM_WIN32
|
#ifdef PLATFORM_WIN32
|
||||||
String p = GetExeDirFile("bin/mingit/cmd");
|
host.AddExecutable(GetExeDirFile("bin/mingit/cmd"), "git.exe");
|
||||||
if(FileExists(p + "/git.exe"))
|
host.AddExecutable(GetExeDirFile("bin/llvm/bin"), "clang-format.exe");
|
||||||
host.exedirs.Add(p);
|
|
||||||
env.GetAdd("PATH") = Join(host.exedirs, ";");
|
env.GetAdd("PATH") = Join(host.exedirs, ";");
|
||||||
#else
|
#else
|
||||||
env.GetAdd("PATH") = Join(host.exedirs, ":");
|
env.GetAdd("PATH") = Join(host.exedirs, ":");
|
||||||
|
|
|
||||||
|
|
@ -10,25 +10,6 @@ String LocalPath(const String& filename)
|
||||||
return AppendFileName(GetLocalDir(), filename);
|
return AppendFileName(GetLocalDir(), filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<String> IgnoreList()
|
|
||||||
{
|
|
||||||
Vector<String> ignore;
|
|
||||||
const Workspace& wspc = GetIdeWorkspace();
|
|
||||||
for(int i = 0; i < wspc.GetCount(); i++) {
|
|
||||||
const Package& pk = wspc.GetPackage(i);
|
|
||||||
for(int j = 0; j < pk.GetCount(); j++)
|
|
||||||
if(!pk[j].separator && pk[j] == "ignorelist") {
|
|
||||||
FileIn in(SourcePath(wspc[i], pk[j]));
|
|
||||||
while(in && !in.IsEof()) {
|
|
||||||
String s = in.GetLine();
|
|
||||||
if(!s.IsEmpty())
|
|
||||||
ignore.Add(s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ignore;
|
|
||||||
}
|
|
||||||
|
|
||||||
String FollowCygwinSymlink(const String& file) {
|
String FollowCygwinSymlink(const String& file) {
|
||||||
for(String fn = file;;) {
|
for(String fn = file;;) {
|
||||||
if(fn.IsEmpty())
|
if(fn.IsEmpty())
|
||||||
|
|
|
||||||
|
|
@ -365,8 +365,6 @@ String GetPackagePathNest(const String& path);
|
||||||
String GetLocalDir();
|
String GetLocalDir();
|
||||||
String LocalPath(const String& filename);
|
String LocalPath(const String& filename);
|
||||||
|
|
||||||
Vector<String> IgnoreList();
|
|
||||||
|
|
||||||
bool IsFullDirectory(const String& d);
|
bool IsFullDirectory(const String& d);
|
||||||
bool IsFolder(const String& path);
|
bool IsFolder(const String& path);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
#include "Core.h"
|
#include "Core.h"
|
||||||
|
|
||||||
#define LLOG(x)
|
|
||||||
|
|
||||||
#include <plugin/bz2/bz2.h>
|
#include <plugin/bz2/bz2.h>
|
||||||
|
|
||||||
|
#define LLOG(x)
|
||||||
|
#define METHOD_NAME "Host::" << UPP_FUNCTION_NAME << "(): "
|
||||||
|
|
||||||
Host::Host()
|
Host::Host()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
@ -381,6 +382,17 @@ const Vector<String>& Host::GetExecutablesDirs() const
|
||||||
return exedirs;
|
return exedirs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Host::AddExecutable(const String& dir, const String& exe)
|
||||||
|
{
|
||||||
|
String p = dir + DIR_SEPS + exe;
|
||||||
|
if(!FileExists(p)) {
|
||||||
|
Loge() << METHOD_NAME << "Following executable file \"" << p << "\" doesn't exists.";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
exedirs.Add(dir);
|
||||||
|
}
|
||||||
|
|
||||||
bool Host::HasPlatformFlag(const Index<String>& cfg)
|
bool Host::HasPlatformFlag(const Index<String>& cfg)
|
||||||
{
|
{
|
||||||
static const Index<String> platformFlags = {
|
static const Index<String> platformFlags = {
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@ struct Host {
|
||||||
void AddFlags(Index<String>& cfg);
|
void AddFlags(Index<String>& cfg);
|
||||||
|
|
||||||
const Vector<String>& GetExecutablesDirs() const;
|
const Vector<String>& GetExecutablesDirs() const;
|
||||||
|
void AddExecutable(const String& dir, const String& exe);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool HasPlatformFlag(const Index<String>& cfg);
|
bool HasPlatformFlag(const Index<String>& cfg);
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ void Ide::FormatJSON_XML(bool xml)
|
||||||
{
|
{
|
||||||
int l, h;
|
int l, h;
|
||||||
bool sel = editor.GetSelection(l, h);
|
bool sel = editor.GetSelection(l, h);
|
||||||
if((sel ? h - l : editor.GetLength()) > 75*1024*1024) {
|
if((sel ? h - l : editor.GetLength()) > 75 * 1024 * 1024) {
|
||||||
Exclamation("Too big to reformat");
|
Exclamation("Too big to reformat");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -51,28 +51,588 @@ void Ide::FormatJSON_XML(bool xml)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ide::FormatJSON()
|
void Ide::FormatJSON() { FormatJSON_XML(false); }
|
||||||
|
void Ide::FormatXML() { FormatJSON_XML(true); }
|
||||||
|
|
||||||
|
String Ide::FindClangFormatPath()
|
||||||
{
|
{
|
||||||
FormatJSON_XML(false);
|
String p;
|
||||||
|
auto Check = [&](const String& dir) {
|
||||||
|
for(String fn : { ".clang-format", "_clang-format" }) {
|
||||||
|
p = AppendFileName(dir, fn);
|
||||||
|
if(FileExists(p))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
for(String dir = GetFileFolder(editfile); dir.GetCount() > 3; dir = GetFileFolder(dir))
|
||||||
|
if(Check(dir))
|
||||||
|
return p;
|
||||||
|
|
||||||
|
for(String dir : GetUppDirs())
|
||||||
|
if(Check(dir))
|
||||||
|
return p;
|
||||||
|
|
||||||
|
return Null;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ide::FormatXML()
|
String ClangFormatPath()
|
||||||
{
|
{
|
||||||
FormatJSON_XML(true);
|
return ConfigFile("clang_format");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ide::FormatJSON_XML_File(bool xml)
|
VectorMap<String, String> ReadClangFormatFile(Stream& in)
|
||||||
{
|
{
|
||||||
if(IsNull(editfile))
|
VectorMap<String, String> val;
|
||||||
return;
|
String master_id;
|
||||||
if(GetFileLength(editfile) >= 75*1024*1024)
|
while(!in.IsEof()) {
|
||||||
Exclamation("Too big to reformat");
|
String l = in.GetLine();
|
||||||
SaveFile();
|
String id;
|
||||||
String text = LoadFile(editfile);
|
bool nested = findarg(*l, ' ', '\t') >= 0;
|
||||||
if(!ReFormatJSON_XML(text, xml))
|
CParser p(l);
|
||||||
return;
|
try {
|
||||||
if(PromptYesNo("Overwrite \1" + editfile + "\1 with reformated " + (xml ? "XML" : "JSON") + "?")) {
|
if(p.IsId()) {
|
||||||
Upp::SaveFile(editfile, text);
|
String id = p.ReadId();
|
||||||
EditAsText();
|
if(nested)
|
||||||
|
id = master_id + ":" + id;
|
||||||
|
else
|
||||||
|
master_id = id;
|
||||||
|
p.PassChar(':');
|
||||||
|
String value = TrimBoth(p.GetPtr());
|
||||||
|
int q = value.Find('#');
|
||||||
|
if(q >= 0)
|
||||||
|
value.Trim(q);
|
||||||
|
value = TrimBoth(value);
|
||||||
|
if(value.GetCount())
|
||||||
|
val.GetAdd(id) = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(CParser::Error) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
String ReformatCpp(CodeEditor& editor, bool setcursor)
|
||||||
|
{
|
||||||
|
String clang_format_path = ClangFormatPath();
|
||||||
|
FileIn in(clang_format_path);
|
||||||
|
VectorMap<String, String> fv = ReadClangFormatFile(in);
|
||||||
|
if(IsNull(fv.Get("BasedOnStyle", Null)))
|
||||||
|
clang_format_path = TheIde()->FindClangFormatPath();
|
||||||
|
int64 l, h;
|
||||||
|
bool sel = editor.GetSelection(l, h);
|
||||||
|
|
||||||
|
String cmd = "clang-format ";
|
||||||
|
if(sel) {
|
||||||
|
l = editor.GetLine(l) + 1;
|
||||||
|
h = editor.GetLine(h) + 1;
|
||||||
|
cmd << "--lines=" << l << ":" << h << " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
String temp_path = CacheFile(AsString(Random()) + AsString(Random()) + "_to_format.cpp");
|
||||||
|
{
|
||||||
|
FileOut out(temp_path);
|
||||||
|
editor.Save(out, CHARSET_UTF8, TextCtrl::LE_LF);
|
||||||
|
if(out.IsError()) {
|
||||||
|
Exclamation("Failed to save temporary file \1" + temp_path);
|
||||||
|
return "Failed to save temporary file " + temp_path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd << "\"--style=file:" << clang_format_path << "\" ";
|
||||||
|
|
||||||
|
String r;
|
||||||
|
int code = Sys(cmd + temp_path, r);
|
||||||
|
|
||||||
|
DeleteFile(temp_path);
|
||||||
|
|
||||||
|
if(code) {
|
||||||
|
if(code < 0)
|
||||||
|
return "Failed to start clang-format";
|
||||||
|
StringStream ss(r);
|
||||||
|
String l;
|
||||||
|
while(!ss.IsEof() && IsNull(l))
|
||||||
|
l = ss.GetLine();
|
||||||
|
int q = l.Find("error:");
|
||||||
|
if(q >= 0 && q < r.GetCount() - 2)
|
||||||
|
return TrimLeft(l.Mid(q + 6));
|
||||||
|
return Nvl(l, "Unspecified error.");
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector<String> ln = Split(r, '\n', false);
|
||||||
|
for(String& s : ln)
|
||||||
|
s.TrimEnd("\r");
|
||||||
|
int n = editor.GetLineCount();
|
||||||
|
l = h = n;
|
||||||
|
for(int i = 0; i < n; i++)
|
||||||
|
if(i >= ln.GetCount() || editor.GetUtf8Line(i) != ln[i]) {
|
||||||
|
l = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for(int i = 0; i < n; i++)
|
||||||
|
if(i >= ln.GetCount() || editor.GetUtf8Line(n - 1 - i) != ln[ln.GetCount() - 1 - i]) {
|
||||||
|
h = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(l + h >= n)
|
||||||
|
return Null;
|
||||||
|
|
||||||
|
editor.NextUndo();
|
||||||
|
int from = editor.GetPos(l);
|
||||||
|
editor.Remove(from, editor.GetPos(editor.GetLineCount() - h) - from);
|
||||||
|
ln.Remove(0, l);
|
||||||
|
ln.Trim(ln.GetCount() - h);
|
||||||
|
int pos = editor.Insert(from, Join(ln, "\n") + "\n", CHARSET_UTF8);
|
||||||
|
if(setcursor)
|
||||||
|
editor.SetCursor(pos);
|
||||||
|
|
||||||
|
return Null;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ClangFormat {
|
||||||
|
const char *id;
|
||||||
|
const char *type;
|
||||||
|
}
|
||||||
|
clang_format[] = {
|
||||||
|
{ "AccessModifierOffset", "@" }, // int
|
||||||
|
{ "AlignAfterOpenBracket", "Align:DontAlign:AlwaysBreak:BlockIndent" },
|
||||||
|
{ "AlignArrayOfStructures", "Left:Right:None" },
|
||||||
|
{ "AlignConsecutiveAssignments", "None:Consecutive:AcrossEmptyLines:AcrossComments:AcrossEmptyLinesAndComments" },
|
||||||
|
{ "AlignConsecutiveBitFields", "None:Consecutive:AcrossEmptyLines:AcrossComments:AcrossEmptyLinesAndComments" },
|
||||||
|
{ "AlignConsecutiveDeclarations", "None:Consecutive:AcrossEmptyLines:AcrossComments:AcrossEmptyLinesAndComments" },
|
||||||
|
{ "AlignConsecutiveMacros", "None:Consecutive:AcrossEmptyLines:AcrossComments:AcrossEmptyLinesAndComments" },
|
||||||
|
{ "AlignEscapedNewlines", "DontAlign:Left:Right" },
|
||||||
|
{ "AlignOperands", "DontAlign:Align:AlignAfterOperator" },
|
||||||
|
{ "AlignTrailingComments", "!" }, // bool
|
||||||
|
{ "AllowAllArgumentsOnNextLine", "!" },
|
||||||
|
{ "AllowAllConstructorInitializersOnNextLine", "!" },
|
||||||
|
{ "AllowAllParametersOfDeclarationOnNextLine", "!" },
|
||||||
|
{ "AllowShortBlocksOnASingleLine", "Never:Empty:Always" },
|
||||||
|
{ "AllowShortCaseLabelsOnASingleLine", "!" },
|
||||||
|
{ "AllowShortEnumsOnASingleLine", "!" },
|
||||||
|
{ "AllowShortFunctionsOnASingleLine", "None:InlineOnly:Empty:Inline:All" },
|
||||||
|
{ "AllowShortIfStatementsOnASingleLine", "Never:WithoutElse:OnlyFirstIf:AllIfsAndElse" },
|
||||||
|
{ "AllowShortLambdasOnASingleLine", "None:Empty:Inline:All" },
|
||||||
|
{ "AllowShortLoopsOnASingleLine", "!" },
|
||||||
|
{ "AlwaysBreakAfterDefinitionReturnType", "None:All:TopLevel" },
|
||||||
|
{ "AlwaysBreakAfterReturnType", "None:All:TopLevel:AllDefinitions:TopLevelDefinitions" },
|
||||||
|
{ "AlwaysBreakBeforeMultilineStrings", "!" },
|
||||||
|
{ "AlwaysBreakTemplateDeclarations", "No:MultiLine:Yes" },
|
||||||
|
{ "BinPackArguments", "!" },
|
||||||
|
{ "BinPackParameters", "!" },
|
||||||
|
{ "BitFieldColonSpacing", "Both:None:Before:After" },
|
||||||
|
{ "BraceWrapping", "" },
|
||||||
|
{ " AfterCaseLabel", "!" },
|
||||||
|
{ " AfterControlStatement", "Never:MultiLine:Always" },
|
||||||
|
{ " AfterEnum","!" },
|
||||||
|
{ " AfterFunction","!" },
|
||||||
|
{ " AfterNamespace","!" },
|
||||||
|
{ " AfterObjCDeclaration","!" },
|
||||||
|
{ " AfterStruct","!" },
|
||||||
|
{ " AfterUnion","!" },
|
||||||
|
{ " AfterExternBlock","!" },
|
||||||
|
{ " BeforeCatch","!" },
|
||||||
|
{ " BeforeElse","!" },
|
||||||
|
{ " BeforeLambdaBody","!" },
|
||||||
|
{ " BeforeWhile","!" },
|
||||||
|
{ " IndentBraces","!" },
|
||||||
|
{ " SplitEmptyFunction","!" },
|
||||||
|
{ " SplitEmptyRecord","!" },
|
||||||
|
{ " SplitEmptyNamespace","!" },
|
||||||
|
{ "BreakAfterAttributes", "Always:Leave:Never" },
|
||||||
|
{ "BreakBeforeBinaryOperators", "None:NonAssignment:All" },
|
||||||
|
{ "BreakBeforeBraces", "Attach:Linux:Mozilla:Stroustrup:Allman:Whitesmiths:GNU:WebKit:Custom" },
|
||||||
|
{ "BreakBeforeConceptDeclarations", "Never:Allowed:Always" },
|
||||||
|
{ "BreakBeforeInlineASMColon", "Never:OnlyMultiline:Always" },
|
||||||
|
{ "BreakBeforeTernaryOperators", "!" },
|
||||||
|
{ "BreakConstructorInitializers", "BeforeColon:BeforeComma:AfterColon" },
|
||||||
|
{ "BreakInheritanceList", "BeforeColon:BeforeComma:AfterColon:AfterComma" },
|
||||||
|
{ "BreakStringLiterals", "!" },
|
||||||
|
{ "ColumnLimit", "#" }, // unsigned
|
||||||
|
{ "CompactNamespaces", "!" },
|
||||||
|
{ "ConstructorInitializerIndentWidth", "#" },
|
||||||
|
{ "ContinuationIndentWidth", "#" },
|
||||||
|
{ "Cpp11BracedListStyle", "!" },
|
||||||
|
{ "DeriveLineEnding", "!" },
|
||||||
|
{ "DerivePointerAlignment", "!" },
|
||||||
|
{ "DisableFormat", "!" },
|
||||||
|
{ "EmptyLineAfterAccessModifier", "Never:Leave:Always" },
|
||||||
|
{ "EmptyLineBeforeAccessModifier", "Never:Leave:LogicalBlock:Always" },
|
||||||
|
{ "ExperimentalAutoDetectBinPacking", "!" },
|
||||||
|
{ "FixNamespaceComments", "!" },
|
||||||
|
{ "IndentAccessModifiers", "!" },
|
||||||
|
{ "IndentCaseBlocks", "!" },
|
||||||
|
{ "IndentCaseLabels", "!" },
|
||||||
|
{ "IndentExternBlock", "AfterExternBlock:NoIndent:Indent" },
|
||||||
|
{ "IndentGotoLabels", "!" },
|
||||||
|
{ "IndentPPDirectives", "None:AfterHash:BeforeHash" },
|
||||||
|
{ "IndentRequiresClause", "!" },
|
||||||
|
{ "IndentWidth", "#" },
|
||||||
|
{ "IndentWrappedFunctionNames", "!" },
|
||||||
|
{ "InsertBraces", "!" },
|
||||||
|
{ "InsertNewlineAtEOF", "!" },
|
||||||
|
{ "InsertTrailingCommas", "None:Wrapped" },
|
||||||
|
{ "IntegerLiteralSeparator", "" },
|
||||||
|
{ " Decimal", "@" },
|
||||||
|
{ " Hex", "@" },
|
||||||
|
{ " Binary", "@" },
|
||||||
|
{ "KeepEmptyLinesAtTheStartOfBlocks", "!" },
|
||||||
|
{ "LambdaBodyIndentation", "Signature:OuterScope" },
|
||||||
|
{ "MaxEmptyLinesToKeep", "#" },
|
||||||
|
{ "NamespaceIndentation", "None:Inner:All" },
|
||||||
|
{ "PPIndentWidth", "@" },
|
||||||
|
{ "PackConstructorInitializers", "Never:BinPack:CurrentLine:NextLine" },
|
||||||
|
{ "PenaltyBreakAssignment", "#" },
|
||||||
|
{ "PenaltyBreakBeforeFirstCallParameter", "#" },
|
||||||
|
{ "PenaltyBreakComment", "#" },
|
||||||
|
{ "PenaltyBreakFirstLessLess", "#" },
|
||||||
|
{ "PenaltyBreakOpenParenthesis", "#" },
|
||||||
|
{ "PenaltyBreakString", "#" },
|
||||||
|
{ "PenaltyBreakTemplateDeclaration", "#" },
|
||||||
|
{ "PenaltyExcessCharacter", "#" },
|
||||||
|
{ "PenaltyIndentedWhitespace", "#" },
|
||||||
|
{ "PenaltyReturnTypeOnItsOwnLine", "#" },
|
||||||
|
{ "PointerAlignment", "Left:Right:Middle" },
|
||||||
|
{ "QualifierAlignment", "Leave:Left:Right:Custom" },
|
||||||
|
{ "ReferenceAlignment", "Pointer:Left:Right:Middle" },
|
||||||
|
{ "ReflowComments", "!" },
|
||||||
|
{ "RemoveBracesLLVM", "!" },
|
||||||
|
{ "RemoveSemicolon", "!" },
|
||||||
|
{ "RequiresClausePosition", "OwnLine:WithPreceding:WithFollowing:SingleLine" },
|
||||||
|
{ "RequiresExpressionIndentation", "OuterScope:Keyword" },
|
||||||
|
{ "SeparateDefinitionBlocks", "Leave:Always:Never" },
|
||||||
|
{ "ShortNamespaceLines", "#" },
|
||||||
|
{ "SortIncludes", "Never:CaseSensitive:CaseInsensitive" },
|
||||||
|
{ "SortUsingDeclarations", "Never:Lexicographic:LexicographicNumeric" },
|
||||||
|
{ "SpaceAfterCStyleCast", "!" },
|
||||||
|
{ "SpaceAfterLogicalNot", "!" },
|
||||||
|
{ "SpaceAfterTemplateKeyword", "!" },
|
||||||
|
{ "SpaceAroundPointerQualifiers", "Default:Before:After:Both" },
|
||||||
|
{ "SpaceBeforeAssignmentOperators", "!" },
|
||||||
|
{ "SpaceBeforeCaseColon", "!" },
|
||||||
|
{ "SpaceBeforeCpp11BracedList", "!" },
|
||||||
|
{ "SpaceBeforeCtorInitializerColon", "!" },
|
||||||
|
{ "SpaceBeforeInheritanceColon", "!" },
|
||||||
|
{ "SpaceBeforeParens", "Never:ControlStatements:ControlStatementsExceptControlMacros:NonEmptyParentheses:Always:Custom" },
|
||||||
|
{ "SpaceBeforeParensOptions", "" },
|
||||||
|
{ " AfterControlStatements", "!" },
|
||||||
|
{ " AfterForeachMacros", "!" },
|
||||||
|
{ " AfterFunctionDeclarationName", "!" },
|
||||||
|
{ " AfterFunctionDefinitionName", "!" },
|
||||||
|
{ " AfterIfMacros", "!" },
|
||||||
|
{ " AfterOverloadedOperator", "!" },
|
||||||
|
{ " AfterRequiresInClause", "!" },
|
||||||
|
{ " AfterRequiresInExpression", "!" },
|
||||||
|
{ " BeforeNonEmptyParentheses", "!" },
|
||||||
|
{ "SpaceBeforeRangeBasedForLoopColon", "!" },
|
||||||
|
{ "SpaceBeforeSquareBrackets", "!" },
|
||||||
|
{ "SpaceInEmptyBlock", "!" },
|
||||||
|
{ "SpaceInEmptyParentheses", "!" },
|
||||||
|
{ "SpacesBeforeTrailingComments", "#" },
|
||||||
|
{ "SpacesInAngles", "Never:Always:Leave" },
|
||||||
|
{ "SpacesInCStyleCastParentheses", "!" },
|
||||||
|
{ "SpacesInConditionalStatement", "!" },
|
||||||
|
{ "SpacesInContainerLiterals", "!" },
|
||||||
|
{ "SpacesInLineCommentPrefix", "" },
|
||||||
|
{ " Minimum", "#" },
|
||||||
|
{ " Maximum", "#" },
|
||||||
|
{ "SpacesInParentheses", "!" },
|
||||||
|
{ "SpacesInSquareBrackets", "!" },
|
||||||
|
{ "TabWidth", "#" },
|
||||||
|
{ "UseTab", "Never:ForIndentation:ForContinuationAndIndentation:AlignWithSpaces:Always" },
|
||||||
|
#ifdef _DEBUG
|
||||||
|
{ "Test", "Never:ForIndentation:ForContinuationAndIndentation:AlignWithSpaces:Always" },
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ReformatDlg : WithReformatLayout<TopWindow> {
|
||||||
|
String editfile;
|
||||||
|
String code;
|
||||||
|
bool sel;
|
||||||
|
int l, h;
|
||||||
|
|
||||||
|
Array<Ctrl> option;
|
||||||
|
Array<Label> lbl;
|
||||||
|
ParentCtrl soptions;
|
||||||
|
int scy;
|
||||||
|
ScrollBar sb;
|
||||||
|
|
||||||
|
|
||||||
|
virtual void Layout() override;
|
||||||
|
virtual void MouseWheel(Point p, int zdelta, dword keyflags) override;
|
||||||
|
|
||||||
|
void Set(LineEdit& editor);
|
||||||
|
void Sync();
|
||||||
|
String Get();
|
||||||
|
void Set(Stream& in);
|
||||||
|
|
||||||
|
ReformatDlg();
|
||||||
|
~ReformatDlg();
|
||||||
|
};
|
||||||
|
|
||||||
|
ReformatDlg::ReformatDlg()
|
||||||
|
{
|
||||||
|
CtrlLayoutOKCancel(*this, "Reformat");
|
||||||
|
view.Highlight("cpp");
|
||||||
|
view.HideBar();
|
||||||
|
view.SetFont(CourierZ(12));
|
||||||
|
view.ShowSpaces();
|
||||||
|
view.ShowTabs();
|
||||||
|
view.SetReadOnly();
|
||||||
|
|
||||||
|
String p = TheIde()->FindClangFormatPath();
|
||||||
|
if(p.GetCount())
|
||||||
|
base.Add(Null, ".clang-format file " + p);
|
||||||
|
for(String id : { "LLVM", "Google", "Chromium", "Mozilla", "WebKit", "Microsoft", "GNU" })
|
||||||
|
base.Add("BasedOnStyle: " + id, "Based on style " + id);
|
||||||
|
base << [=] { Sync(); };
|
||||||
|
base.SetIndex(0);
|
||||||
|
|
||||||
|
int cy = EditField::GetStdHeight();
|
||||||
|
int y = 0;
|
||||||
|
int lw = 0;
|
||||||
|
for(const ClangFormat& f : clang_format)
|
||||||
|
if(f.type && *f.type != '!')
|
||||||
|
lw = max(lw, GetTextSize(f.id, StdFont().Bold()).cx + DPI(4) + (*f.id == ' ') * DPI(20));
|
||||||
|
for(const ClangFormat& f : clang_format) {
|
||||||
|
int x = 0;
|
||||||
|
String id = f.id;
|
||||||
|
if(*id == ' ') {
|
||||||
|
id = id.Mid(1);
|
||||||
|
x = DPI(20);
|
||||||
|
}
|
||||||
|
if(f.type && *f.type == '!') {
|
||||||
|
Option& o = option.Create<Option>();
|
||||||
|
o.ThreeState();
|
||||||
|
o.SetLabel(id);
|
||||||
|
o <<= Null;
|
||||||
|
o << [=] { Sync(); };
|
||||||
|
soptions << o.HSizePos(x, DPI(2)).TopPos(y, cy);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Label& l = lbl.Create<Label>();
|
||||||
|
l.SetLabel(id);
|
||||||
|
soptions << l.LeftPos(x, Zx(200)).TopPos(y, cy);
|
||||||
|
if(f.type) {
|
||||||
|
if(*f.type == '#' || *f.type == '@') {
|
||||||
|
WithDropChoice<EditIntSpin>& e = option.Create<WithDropChoice<EditIntSpin>>();
|
||||||
|
e.MinMax(*f.type == '@' ? -100 : 0, 100);
|
||||||
|
for(int q = *f.type == '@' ? -8 : 0; q <= 8; q++)
|
||||||
|
e.AddList(q);
|
||||||
|
e.NullText("default");
|
||||||
|
e << [=] { Sync(); };
|
||||||
|
soptions << e.HSizePos(lw, DPI(2)).TopPos(y, cy);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if(*f.type) {
|
||||||
|
DropList& dl = option.Create<DropList>();
|
||||||
|
dl.Add(Null, AttrText("default").Italic().NormalInk(SCyan()));
|
||||||
|
for(const String& s : Split(f.type, ':'))
|
||||||
|
dl.Add(s);
|
||||||
|
dl << [=] { Sync(); };
|
||||||
|
soptions << dl.HSizePos(lw, DPI(2)).TopPos(y, cy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
y += cy + DPI(2);
|
||||||
|
}
|
||||||
|
sb.SetTotal(y);
|
||||||
|
|
||||||
|
options.SetFrame(ViewFrame());
|
||||||
|
options.AddFrame(sb);
|
||||||
|
options << soptions.HSizePos().TopPos(0, sb.GetTotal());
|
||||||
|
|
||||||
|
sb << [=] {
|
||||||
|
soptions.TopPos(-sb, sb.GetTotal());
|
||||||
|
};
|
||||||
|
|
||||||
|
save << [=] {
|
||||||
|
SelectSaveFile("All files\t*.*", Get());
|
||||||
|
};
|
||||||
|
|
||||||
|
load << [=] {
|
||||||
|
SelectFileIn in("All files\t*.*");
|
||||||
|
Set(in);
|
||||||
|
};
|
||||||
|
|
||||||
|
clear << [=] {
|
||||||
|
if(PromptYesNo("Set all options to default?")) {
|
||||||
|
for(Ctrl& q : option)
|
||||||
|
q <<= Null;
|
||||||
|
Sync();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
FileIn in(ClangFormatPath());
|
||||||
|
Set(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
ReformatDlg::~ReformatDlg()
|
||||||
|
{
|
||||||
|
Sync();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReformatDlg::MouseWheel(Point, int zdelta, dword)
|
||||||
|
{
|
||||||
|
sb.Wheel(zdelta, EditField::GetStdHeight() + DPI(2));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReformatDlg::Set(Stream& in)
|
||||||
|
{
|
||||||
|
VectorMap<String, String> val = ReadClangFormatFile(in);
|
||||||
|
String s = val.Get("BasedOnStyle", Null);
|
||||||
|
if(s.GetCount()) {
|
||||||
|
s = "BasedOnStyle: " + s;
|
||||||
|
if(base.HasKey(s))
|
||||||
|
base <<= s;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
base.SetIndex(0);
|
||||||
|
|
||||||
|
int ii = 0;
|
||||||
|
String master_id;
|
||||||
|
for(const ClangFormat& f : clang_format) {
|
||||||
|
int x = 0;
|
||||||
|
String id = f.id;
|
||||||
|
if(*id == ' ')
|
||||||
|
id = master_id + ":" + TrimBoth(id);
|
||||||
|
else
|
||||||
|
master_id = id;
|
||||||
|
|
||||||
|
String v = val.Get(id, Null);
|
||||||
|
if(f.type && *f.type) {
|
||||||
|
Ctrl& o = option[ii++];
|
||||||
|
o <<= Null;
|
||||||
|
if(v.GetCount()) {
|
||||||
|
if(*f.type == '!')
|
||||||
|
o <<= decode(v, "true", true, "false", false, Null);
|
||||||
|
else
|
||||||
|
if(findarg(*f.type, '@', '#') >= 0)
|
||||||
|
o <<= StrInt(v);
|
||||||
|
else {
|
||||||
|
DropList *l = dynamic_cast<DropList *>(&o);
|
||||||
|
if(l && l->HasKey(v))
|
||||||
|
*l <<= v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String ReformatDlg::Get()
|
||||||
|
{
|
||||||
|
String out;
|
||||||
|
out << "Language: Cpp\n";
|
||||||
|
out << ~base << "\n";
|
||||||
|
int ii = 0;
|
||||||
|
String master_id;
|
||||||
|
for(const ClangFormat& f : clang_format) {
|
||||||
|
String value;
|
||||||
|
if(f.type && *f.type) {
|
||||||
|
value = ~~option[ii++];
|
||||||
|
if(*f.type == '!')
|
||||||
|
value = decode(value, "1", "true", "0", "false", "");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
master_id = f.id;
|
||||||
|
if(value.GetCount()) {
|
||||||
|
if(*f.id == ' ') {
|
||||||
|
if(master_id.GetCount()) {
|
||||||
|
out << master_id << ":\n";
|
||||||
|
master_id.Clear();
|
||||||
|
}
|
||||||
|
out << " ";
|
||||||
|
}
|
||||||
|
out << f.id << ": " << value << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReformatDlg::Layout()
|
||||||
|
{
|
||||||
|
sb.SetPage(options.GetSize().cy);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReformatDlg::Sync()
|
||||||
|
{
|
||||||
|
view.Set(code, CHARSET_UTF8);
|
||||||
|
view.ClearSelection();
|
||||||
|
if(sel)
|
||||||
|
view.SetSelection(l, h);
|
||||||
|
|
||||||
|
Upp::SaveFile(ClangFormatPath(), Get());
|
||||||
|
|
||||||
|
String err = ReformatCpp(view, false);
|
||||||
|
if(IsNull(err)) {
|
||||||
|
error.SetLabel("");
|
||||||
|
ok.Enable();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
error.SetLabel("Clang-format has failed: " + Filter(err, CharFilterNoCrLf));
|
||||||
|
ok.Disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
for(Ctrl& q : option)
|
||||||
|
q.Enable(!IsNull(base));
|
||||||
|
|
||||||
|
for(Label& q : lbl)
|
||||||
|
q.SetInk(IsNull(base) ? SColorDisabled() : SColorText());
|
||||||
|
|
||||||
|
view.SetCursor(l);
|
||||||
|
|
||||||
|
int ii = 0;
|
||||||
|
int li = 0;
|
||||||
|
for(const ClangFormat& f : clang_format) {
|
||||||
|
if(f.type && *f.type == '!') {
|
||||||
|
Option *o = dynamic_cast<Option *>(&option[ii++]);
|
||||||
|
o->SetFont(IsNull(*o) ? StdFont() : StdFont().Bold());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Label& l = lbl[li++];
|
||||||
|
if(f.type && *f.type) {
|
||||||
|
Ctrl& c = option[ii++];
|
||||||
|
l.SetFont(IsNull(c) ? StdFont() : StdFont().Bold());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReformatDlg::Set(LineEdit& editor)
|
||||||
|
{
|
||||||
|
sel = editor.GetSelection(l, h);
|
||||||
|
code = editor.Get(CHARSET_UTF8);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Ide::ReformatCodeDlg()
|
||||||
|
{
|
||||||
|
ReformatDlg dlg;
|
||||||
|
dlg.editfile = editfile;
|
||||||
|
dlg.Set(editor);
|
||||||
|
dlg.Sync();
|
||||||
|
|
||||||
|
if(dlg.Execute() == IDOK) {
|
||||||
|
String error = ReformatCpp(editor, true);
|
||||||
|
if(error.GetCount())
|
||||||
|
PromptOK("clang-format has failed:&\1" + error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Ide::ReformatCode()
|
||||||
|
{
|
||||||
|
String clang_format_path = FindClangFormatPath();
|
||||||
|
|
||||||
|
if(IsNull(clang_format_path)) {
|
||||||
|
ReformatCodeDlg();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ReformatCpp(editor, true).GetCount())
|
||||||
|
ReformatCodeDlg();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Ide::ReformatComment() { editor.ReformatComment(); }
|
||||||
|
|
|
||||||
|
|
@ -307,6 +307,7 @@ void Ide::EditorMenu(Bar& bar)
|
||||||
{
|
{
|
||||||
bar.Sub("Assist", [=](Bar& bar) { AssistMenu(bar); });
|
bar.Sub("Assist", [=](Bar& bar) { AssistMenu(bar); });
|
||||||
InsertAdvanced(bar);
|
InsertAdvanced(bar);
|
||||||
|
Reformat(bar);
|
||||||
bar.MenuSeparator();
|
bar.MenuSeparator();
|
||||||
OnlineSearchMenu(bar);
|
OnlineSearchMenu(bar);
|
||||||
bar.Add(IsClipboardAvailableText() && (editor.IsSelection() || editor.GetLength() < 1024*1024),
|
bar.Add(IsClipboardAvailableText() && (editor.IsSelection() || editor.GetLength() < 1024*1024),
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ NewPackageFileWindow::NewPackageFileWindow()
|
||||||
Type("js", "JavaScript");
|
Type("js", "JavaScript");
|
||||||
Type("py", "Python");
|
Type("py", "Python");
|
||||||
type.AddSeparator();
|
type.AddSeparator();
|
||||||
|
Type("clang-format", "ClangFormat configuration file");
|
||||||
Type("", "Other");
|
Type("", "Other");
|
||||||
|
|
||||||
name << [=] {
|
name << [=] {
|
||||||
|
|
@ -52,7 +53,6 @@ NewPackageFileWindow::NewPackageFileWindow()
|
||||||
Sync();
|
Sync();
|
||||||
};
|
};
|
||||||
name <<= ".cpp";
|
name <<= ".cpp";
|
||||||
|
|
||||||
type <<= "cpp";
|
type <<= "cpp";
|
||||||
|
|
||||||
type << [=] {
|
type << [=] {
|
||||||
|
|
@ -75,8 +75,12 @@ String NewPackageFileWindow::GetError()
|
||||||
String p = AppendFileName(folder, n);
|
String p = AppendFileName(folder, n);
|
||||||
if(FileExists(p))
|
if(FileExists(p))
|
||||||
return String().Cat() << "File&[* \1" << p << "\1]&already exists!";
|
return String().Cat() << "File&[* \1" << p << "\1]&already exists!";
|
||||||
if(*n == '.')
|
if(*n == '.') {
|
||||||
return "Invalid filename!";
|
Index<String> exceptions = {".clang-format"};
|
||||||
|
if(exceptions.Find(n) == -1) {
|
||||||
|
return "Invalid filename!";
|
||||||
|
}
|
||||||
|
}
|
||||||
return Null;
|
return Null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -648,7 +648,6 @@ public:
|
||||||
void FormatJSON_XML(bool xml);
|
void FormatJSON_XML(bool xml);
|
||||||
void FormatJSON();
|
void FormatJSON();
|
||||||
void FormatXML();
|
void FormatXML();
|
||||||
void FormatJSON_XML_File(bool xml);
|
|
||||||
|
|
||||||
bool browser_closeesc;
|
bool browser_closeesc;
|
||||||
bool bookmark_pos;
|
bool bookmark_pos;
|
||||||
|
|
@ -833,12 +832,19 @@ public:
|
||||||
void InsertMenu(Bar& bar);
|
void InsertMenu(Bar& bar);
|
||||||
void InsertInclude(Bar& bar);
|
void InsertInclude(Bar& bar);
|
||||||
void InsertAdvanced(Bar& bar);
|
void InsertAdvanced(Bar& bar);
|
||||||
|
void Reformat(Bar& bar);
|
||||||
void AssistEdit(Bar& menu);
|
void AssistEdit(Bar& menu);
|
||||||
void EditorMenu(Bar& bar);
|
void EditorMenu(Bar& bar);
|
||||||
void ToggleWordwrap();
|
void ToggleWordwrap();
|
||||||
|
|
||||||
void CopyPosition();
|
void CopyPosition();
|
||||||
void GotoPosition();
|
void GotoPosition();
|
||||||
|
|
||||||
|
void ReformatMenu(Bar& menu);
|
||||||
|
void ReformatCodeDlg();
|
||||||
|
void ReformatCode();
|
||||||
|
void ReformatComment();
|
||||||
|
String FindClangFormatPath();
|
||||||
|
|
||||||
void OnlineSearchMenu(Bar& menu);
|
void OnlineSearchMenu(Bar& menu);
|
||||||
|
|
||||||
|
|
@ -868,7 +874,6 @@ public:
|
||||||
void ToComment();
|
void ToComment();
|
||||||
void CommentLines();
|
void CommentLines();
|
||||||
void UnComment();
|
void UnComment();
|
||||||
void ReformatComment();
|
|
||||||
|
|
||||||
void MacroMenu(Bar& menu);
|
void MacroMenu(Bar& menu);
|
||||||
bool HasMacros();
|
bool HasMacros();
|
||||||
|
|
|
||||||
|
|
@ -38,10 +38,6 @@ KEY(LINEENDINGS, "Remove trailing tabs and spaces", 0)
|
||||||
KEY(DUPLICATEIT, "Duplicate line or selection", K_CTRL_D)
|
KEY(DUPLICATEIT, "Duplicate line or selection", K_CTRL_D)
|
||||||
KEY(WORDWRAP, "Word wrap", K_ALT_W)
|
KEY(WORDWRAP, "Word wrap", K_ALT_W)
|
||||||
|
|
||||||
KEY(FORMATCODE, "Format code in editor", 0)
|
|
||||||
KEY(FORMATJSON, "Reformat JSON in editor", 0)
|
|
||||||
KEY(FORMATXML, "Reformat XML in editor", 0)
|
|
||||||
|
|
||||||
KEY(ORGANIZER, "Package organizer..", 0)
|
KEY(ORGANIZER, "Package organizer..", 0)
|
||||||
KEY(CUSTOM, "Custom build steps..", 0)
|
KEY(CUSTOM, "Custom build steps..", 0)
|
||||||
KEY(MAINCONFIG, "Main package configuration..", 0)
|
KEY(MAINCONFIG, "Main package configuration..", 0)
|
||||||
|
|
@ -105,8 +101,6 @@ KEY(SWAPS, "Go to definition/declaration", K_ALT_I)
|
||||||
KEY(IDUSAGE, "Usage", K_ALT_U)
|
KEY(IDUSAGE, "Usage", K_ALT_U)
|
||||||
KEY(USAGE, "Usage of current function", K_SHIFT|K_ALT_U)
|
KEY(USAGE, "Usage of current function", K_SHIFT|K_ALT_U)
|
||||||
KEY(JUMPS, "Context go to", K_ALT_J)
|
KEY(JUMPS, "Context go to", K_ALT_J)
|
||||||
KEY(CLEARMARKERSFILE, "Remove change markers in file", K_ALT_R)
|
|
||||||
KEY(CLEARMARKERSALL, "Remove all change markers", K_SHIFT|K_ALT_R)
|
|
||||||
KEY(TOGGLEINDEX, "File index", K_CTRL_F12)
|
KEY(TOGGLEINDEX, "File index", K_CTRL_F12)
|
||||||
KEY(SEARCHINDEX, "File index search", K_F12)
|
KEY(SEARCHINDEX, "File index search", K_F12)
|
||||||
KEY(COMPLETE, "Complete identifier", K_CTRL_COMMA)
|
KEY(COMPLETE, "Complete identifier", K_CTRL_COMMA)
|
||||||
|
|
@ -120,7 +114,6 @@ KEY(TOCSTRING, "Convert to C string", 0)
|
||||||
KEY(TOCOMMENT, "Comment code", K_ALT_K)
|
KEY(TOCOMMENT, "Comment code", K_ALT_K)
|
||||||
KEY(COMMENTLINES, "Comment code lines", K_SHIFT|K_ALT_K)
|
KEY(COMMENTLINES, "Comment code lines", K_SHIFT|K_ALT_K)
|
||||||
KEY(UNCOMMENT, "Uncomment code", K_CTRL_K|K_ALT_K)
|
KEY(UNCOMMENT, "Uncomment code", K_CTRL_K|K_ALT_K)
|
||||||
KEY(REFORMAT_COMMENT, "Reformat comment paragraph", K_ALT_R)
|
|
||||||
|
|
||||||
KEY(DIFF, "File..", 0)
|
KEY(DIFF, "File..", 0)
|
||||||
KEY(DIFFLOG, "Log..", 0)
|
KEY(DIFFLOG, "Log..", 0)
|
||||||
|
|
@ -128,8 +121,11 @@ KEY(SVNDIFF, "Show repository history of file..", 0)
|
||||||
KEY(PATCH, "Display/apply patch..", 0)
|
KEY(PATCH, "Display/apply patch..", 0)
|
||||||
KEY(DIRDIFF, "Compare directories..", 0)
|
KEY(DIRDIFF, "Compare directories..", 0)
|
||||||
|
|
||||||
KEY(REFORMAT_JSON, "Reformat JSON file", 0);
|
KEY(REFORMAT_CODE, "Reformat code", K_ALT_R)
|
||||||
KEY(REFORMAT_XML, "Reformat XML file", 0);
|
KEY(REFORMAT_CODE2, "Reformat code with options..", K_SHIFT|K_ALT_R)
|
||||||
|
KEY(REFORMAT_JSON, "Reformat JSON", 0)
|
||||||
|
KEY(REFORMAT_XML, "Reformat XML", 0)
|
||||||
|
KEY(REFORMAT_COMMENT, "Reformat comment paragraph", K_SHIFT|K_ALT_P)
|
||||||
|
|
||||||
KEY(RESCANCURRENTFILE, "Rescan current file", 0)
|
KEY(RESCANCURRENTFILE, "Rescan current file", 0)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -907,3 +907,15 @@ LAYOUT(UppHubSettingsLayout, 544, 64)
|
||||||
ITEM(Upp::Button, cancel, SetLabel(t_("Cancel")).RightPosZ(8, 64).BottomPosZ(8, 24))
|
ITEM(Upp::Button, cancel, SetLabel(t_("Cancel")).RightPosZ(8, 64).BottomPosZ(8, 24))
|
||||||
END_LAYOUT
|
END_LAYOUT
|
||||||
|
|
||||||
|
LAYOUT(ReformatLayout, 1024, 724)
|
||||||
|
ITEM(Upp::DropList, base, LeftPosZ(4, 360).TopPosZ(8, 19))
|
||||||
|
ITEM(Upp::ParentCtrl, options, LeftPosZ(4, 360).TopPosZ(32, 652))
|
||||||
|
ITEM(CodeEditor, view, LeftPosZ(368, 652).TopPosZ(8, 676))
|
||||||
|
ITEM(Upp::Button, save, SetLabel(t_("Save..")).RightPosZ(956, 64).BottomPosZ(8, 24))
|
||||||
|
ITEM(Upp::Button, load, SetLabel(t_("Load..")).RightPosZ(888, 64).BottomPosZ(8, 24))
|
||||||
|
ITEM(Upp::Button, clear, SetLabel(t_("Clear")).RightPosZ(820, 64).BottomPosZ(8, 24))
|
||||||
|
ITEM(Upp::Label, error, SetLabel(t_("error")).SetAlign(Upp::ALIGN_CENTER).SetFont(Upp::StdFont().Bold()).SetInk(Upp::SRed).LeftPosZ(216, 656).TopPosZ(692, 24))
|
||||||
|
ITEM(Upp::Button, ok, SetLabel(t_("OK")).RightPosZ(72, 64).BottomPosZ(8, 24))
|
||||||
|
ITEM(Upp::Button, cancel, SetLabel(t_("Cancel")).RightPosZ(4, 64).BottomPosZ(8, 24))
|
||||||
|
END_LAYOUT
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,13 +28,13 @@ file
|
||||||
ide.h options(BUILDER_OPTION) PCH,
|
ide.h options(BUILDER_OPTION) PCH,
|
||||||
version.h,
|
version.h,
|
||||||
UppDlg.h,
|
UppDlg.h,
|
||||||
|
ide.key,
|
||||||
BaseDlg.cpp,
|
BaseDlg.cpp,
|
||||||
SelectPkg.cpp,
|
SelectPkg.cpp,
|
||||||
UppWspc.cpp,
|
UppWspc.cpp,
|
||||||
NewPackageFile.cpp,
|
NewPackageFile.cpp,
|
||||||
Organizer.cpp,
|
Organizer.cpp,
|
||||||
Template.cpp,
|
Template.cpp,
|
||||||
ide.key,
|
|
||||||
Console.cpp,
|
Console.cpp,
|
||||||
FindFile.cpp,
|
FindFile.cpp,
|
||||||
FindInFiles.cpp,
|
FindInFiles.cpp,
|
||||||
|
|
|
||||||
|
|
@ -127,6 +127,12 @@ void Ide::InsertAdvanced(Bar& bar)
|
||||||
bar.Add(b, "Advanced", THISBACK(EditSpecial));
|
bar.Add(b, "Advanced", THISBACK(EditSpecial));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Ide::Reformat(Bar& bar)
|
||||||
|
{
|
||||||
|
bool b = !editor.IsReadOnly();
|
||||||
|
bar.Sub(b, "Reformat", [=] (Bar& menu) { ReformatMenu(menu); });
|
||||||
|
}
|
||||||
|
|
||||||
void Ide::EditSpecial(Bar& menu)
|
void Ide::EditSpecial(Bar& menu)
|
||||||
{
|
{
|
||||||
bool b = !editor.IsReadOnly();
|
bool b = !editor.IsReadOnly();
|
||||||
|
|
@ -149,10 +155,6 @@ void Ide::EditSpecial(Bar& menu)
|
||||||
.Help("Copy the current identifier to the clipboard");
|
.Help("Copy the current identifier to the clipboard");
|
||||||
menu.Add(b, AK_DUPLICATEIT, THISBACK(Duplicate))
|
menu.Add(b, AK_DUPLICATEIT, THISBACK(Duplicate))
|
||||||
.Help("Duplicate the current line");
|
.Help("Duplicate the current line");
|
||||||
menu.Add(b, AK_FORMATJSON, THISBACK(FormatJSON))
|
|
||||||
.Help("Reformat JSON");
|
|
||||||
menu.Add(b, AK_FORMATXML, THISBACK(FormatXML))
|
|
||||||
.Help("Reformat XML");
|
|
||||||
menu.Add(b && editor.IsSelection(), AK_TOUPPER, THISBACK(TextToUpper))
|
menu.Add(b && editor.IsSelection(), AK_TOUPPER, THISBACK(TextToUpper))
|
||||||
.Help("Convert letters in selection to uppercase");
|
.Help("Convert letters in selection to uppercase");
|
||||||
menu.Add(b && editor.IsSelection(), AK_TOLOWER, THISBACK(TextToLower))
|
menu.Add(b && editor.IsSelection(), AK_TOLOWER, THISBACK(TextToLower))
|
||||||
|
|
@ -171,8 +173,6 @@ void Ide::EditSpecial(Bar& menu)
|
||||||
.Help("Comment code lines");
|
.Help("Comment code lines");
|
||||||
menu.Add(b && editor.IsSelection(), AK_UNCOMMENT, THISBACK(UnComment))
|
menu.Add(b && editor.IsSelection(), AK_UNCOMMENT, THISBACK(UnComment))
|
||||||
.Help("Uncomment code");
|
.Help("Uncomment code");
|
||||||
menu.Add(b, AK_REFORMAT_COMMENT, THISBACK(ReformatComment))
|
|
||||||
.Help("Reformat multiline comment into paragraph");
|
|
||||||
menu.Add(b, "Remove debugging logs (DDUMP...)", [=] { RemoveDs(); });
|
menu.Add(b, "Remove debugging logs (DDUMP...)", [=] { RemoveDs(); });
|
||||||
menu.MenuSeparator();
|
menu.MenuSeparator();
|
||||||
menu.Add(AK_COPY_POSITION, [=] { CopyPosition(); });
|
menu.Add(AK_COPY_POSITION, [=] { CopyPosition(); });
|
||||||
|
|
@ -283,8 +283,27 @@ void Ide::Edit(Bar& menu)
|
||||||
|
|
||||||
menu.Add("Find and Replace", THISBACK(SearchMenu));
|
menu.Add("Find and Replace", THISBACK(SearchMenu));
|
||||||
|
|
||||||
if(!designer && menu.IsMenuBar())
|
if(!designer && menu.IsMenuBar()) {
|
||||||
InsertAdvanced(menu);
|
InsertAdvanced(menu);
|
||||||
|
Reformat(menu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Ide::ReformatMenu(Bar& menu)
|
||||||
|
{
|
||||||
|
bool b = !editor.IsReadOnly();
|
||||||
|
|
||||||
|
menu.Add(b, AK_REFORMAT_CODE, [=] { ReformatCode(); })
|
||||||
|
.Help("Reformat current file with clang-format");
|
||||||
|
menu.Add(b, AK_REFORMAT_CODE2, [=] { ReformatCodeDlg(); });
|
||||||
|
menu.Separator();
|
||||||
|
menu.Add(b, AK_REFORMAT_JSON, [=] { FormatJSON(); })
|
||||||
|
.Help("Reformat JSON");
|
||||||
|
menu.Add(b, AK_REFORMAT_XML, [=] { FormatXML(); })
|
||||||
|
.Help("Reformat XML");
|
||||||
|
menu.Separator();
|
||||||
|
menu.Add(b, AK_REFORMAT_COMMENT, [=] { ReformatComment(); })
|
||||||
|
.Help("Reformat multiline comment into paragraph");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Ide::HasMacros()
|
bool Ide::HasMacros()
|
||||||
|
|
@ -772,6 +791,7 @@ void Ide::BrowseMenu(Bar& menu)
|
||||||
AssistMenu(menu);
|
AssistMenu(menu);
|
||||||
menu.Add(!designer, AK_GO_TO_LINE, THISBACK(GoToLine));
|
menu.Add(!designer, AK_GO_TO_LINE, THISBACK(GoToLine));
|
||||||
AssistEdit(menu);
|
AssistEdit(menu);
|
||||||
|
Reformat(menu);
|
||||||
menu.MenuSeparator();
|
menu.MenuSeparator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -804,8 +824,6 @@ void Ide::BrowseMenu(Bar& menu)
|
||||||
menu.AddMenu(AK_QTF, IdeCommonImg::Qtf(), THISBACK(Qtf));
|
menu.AddMenu(AK_QTF, IdeCommonImg::Qtf(), THISBACK(Qtf));
|
||||||
menu.AddMenu(!designer, AK_XML, IdeCommonImg::xml(), THISBACK(Xml));
|
menu.AddMenu(!designer, AK_XML, IdeCommonImg::xml(), THISBACK(Xml));
|
||||||
menu.AddMenu(!designer, AK_JSON, IdeCommonImg::json(), THISBACK(Json));
|
menu.AddMenu(!designer, AK_JSON, IdeCommonImg::json(), THISBACK(Json));
|
||||||
menu.Add(AK_REFORMAT_JSON, [=] { FormatJSON_XML_File(false); });
|
|
||||||
menu.Add(AK_REFORMAT_XML, [=] { FormatJSON_XML_File(true); });
|
|
||||||
menu.AddMenu(!designer, AK_ASERRORS, IdeImg::errors(), THISBACK(AsErrors));
|
menu.AddMenu(!designer, AK_ASERRORS, IdeImg::errors(), THISBACK(AsErrors));
|
||||||
menu.AddMenu(AK_DIRDIFF, DiffImg::DirDiff(), THISBACK(DoDirDiff));
|
menu.AddMenu(AK_DIRDIFF, DiffImg::DirDiff(), THISBACK(DoDirDiff));
|
||||||
menu.AddMenu(AK_PATCH, DiffImg::PatchDiff(), THISBACK(DoPatchDiff));
|
menu.AddMenu(AK_PATCH, DiffImg::PatchDiff(), THISBACK(DoPatchDiff));
|
||||||
|
|
|
||||||
|
|
@ -386,11 +386,6 @@ void Ide::UnComment()
|
||||||
AlterText(sUncomment);
|
AlterText(sUncomment);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ide::ReformatComment()
|
|
||||||
{
|
|
||||||
editor.ReformatComment();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Ide::Times()
|
void Ide::Times()
|
||||||
{
|
{
|
||||||
WithStatisticsLayout<TopWindow> statdlg;
|
WithStatisticsLayout<TopWindow> statdlg;
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,18 @@
|
||||||
LAYOUT(SpinLayout, 768, 500)
|
LAYOUT(SpinLayout, 768, 500)
|
||||||
ITEM(EditIntSpin, int_1, LeftPosZ(12, 160).TopPosZ(12, 19))
|
ITEM(Upp::EditIntSpin, int_1, LeftPosZ(12, 160).TopPosZ(12, 19))
|
||||||
ITEM(EditInt64Spin, int64_1, LeftPosZ(12, 160).TopPosZ(36, 19))
|
ITEM(Upp::EditInt64Spin, int64_1, LeftPosZ(12, 160).TopPosZ(36, 19))
|
||||||
ITEM(EditDoubleSpin, double_1, LeftPosZ(12, 160).TopPosZ(60, 19))
|
ITEM(Upp::EditDoubleSpin, double_1, LeftPosZ(12, 160).TopPosZ(60, 19))
|
||||||
ITEM(EditDateSpin, date_1, LeftPosZ(12, 160).TopPosZ(84, 19))
|
ITEM(Upp::EditDateSpin, date_1, LeftPosZ(12, 160).TopPosZ(84, 19))
|
||||||
ITEM(EditTimeSpin, time_1, LeftPosZ(12, 160).TopPosZ(108, 19))
|
ITEM(Upp::EditTimeSpin, time_1, LeftPosZ(12, 160).TopPosZ(108, 19))
|
||||||
ITEM(EditIntSpin, int_2, LeftPosZ(188, 160).TopPosZ(12, 19))
|
ITEM(Upp::EditIntSpin, int_2, LeftPosZ(188, 160).TopPosZ(12, 19))
|
||||||
ITEM(EditInt64Spin, int64_2, LeftPosZ(188, 160).TopPosZ(36, 19))
|
ITEM(Upp::EditInt64Spin, int64_2, LeftPosZ(188, 160).TopPosZ(36, 19))
|
||||||
ITEM(EditDoubleSpin, double_2, LeftPosZ(188, 160).TopPosZ(60, 19))
|
ITEM(Upp::EditDoubleSpin, double_2, LeftPosZ(188, 160).TopPosZ(60, 19))
|
||||||
ITEM(EditDateSpin, date_2, LeftPosZ(188, 160).TopPosZ(84, 19))
|
ITEM(Upp::EditDateSpin, date_2, LeftPosZ(188, 160).TopPosZ(84, 19))
|
||||||
ITEM(EditTimeSpin, time_2, LeftPosZ(188, 160).TopPosZ(108, 19))
|
ITEM(Upp::EditTimeSpin, time_2, LeftPosZ(188, 160).TopPosZ(108, 19))
|
||||||
ITEM(EditIntSpin, int_3, LeftPosZ(364, 160).TopPosZ(12, 19))
|
ITEM(Upp::EditIntSpin, int_3, LeftPosZ(364, 160).TopPosZ(12, 19))
|
||||||
ITEM(EditInt64Spin, int64_3, LeftPosZ(364, 160).TopPosZ(36, 19))
|
ITEM(Upp::EditInt64Spin, int64_3, LeftPosZ(364, 160).TopPosZ(36, 19))
|
||||||
ITEM(EditDoubleSpin, double_3, LeftPosZ(364, 160).TopPosZ(60, 19))
|
ITEM(Upp::EditDoubleSpin, double_3, LeftPosZ(364, 160).TopPosZ(60, 19))
|
||||||
ITEM(EditDateSpin, date_3, LeftPosZ(364, 160).TopPosZ(84, 19))
|
ITEM(Upp::EditDateSpin, date_3, LeftPosZ(364, 160).TopPosZ(84, 19))
|
||||||
ITEM(EditTimeSpin, time_3, LeftPosZ(364, 160).TopPosZ(108, 19))
|
ITEM(Upp::EditTimeSpin, time_3, LeftPosZ(364, 160).TopPosZ(108, 19))
|
||||||
END_LAYOUT
|
END_LAYOUT
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue