ultimatepp/uppsrc/ide/FormatCode.cpp

247 lines
6.1 KiB
C++

#include "ide.h"
using namespace astyle;
/////////////////////////////////////////////////////////////////////////////////////////
// CLASS ASStreamIterator
class ASStreamIterator : public ASSourceIterator
{
protected:
enum EolMode { crlf, lf, cr, lfcr } ;
WString const &src;
int p;
EolMode eolMode;
public:
ASStreamIterator(WString const &Src);
virtual ~ASStreamIterator() {}
virtual bool hasMoreLines() const;
virtual WString nextLine();
WString getEol();
}; // END Class ASStreamIterator
// Constructor Class ASStreamIterator
ASStreamIterator::ASStreamIterator(WString const &Src) : ASSourceIterator(), src(Src)
{
// initializes buffer pointer
p = 0;
// initializes Eol Mode
eolMode = crlf;
} // END Constructor Class ASStreamIterator
WString ASStreamIterator::getEol()
{
switch(eolMode)
{
case cr:
return "\r";
case lf:
return "\n";
case lfcr:
return "\r\n";
default:
return "\n\r";
}
} // END ASStreamIterator::getEol()
bool ASStreamIterator::hasMoreLines() const
{
return src[p] != 0;
} // END ASStreamIterator::hasMoreLines()
WString ASStreamIterator::nextLine()
{
int p2 = p;
wchar c1, c2;
while(src[p2] && src[p2] != '\n' && src[p2] != '\r')
p2++;
WString line = src.Mid(p, p2 - p);
if( (c1 = src[p2]) != 0)
{
p2++;
c2 = src[p2];
if(c1 == '\r' && c2 == '\n')
{
p2++;
eolMode = crlf;
}
else if(c1 == '\n' && c2 == '\r')
{
p2++;
eolMode = lfcr;
}
else if(c1 == '\n')
eolMode = lf;
else
eolMode = cr;
}
p = p2;
return line;
} // END ASStreamIterator::nextLine()
/////////////////////////////////////////////////////////////////////////////////////////
// Formats a string of code with a given formatter
WString Ide::FormatCodeString(WString const &Src, ASFormatter &Formatter)
{
// Creates the output string
WString Dest;
// Creates the iterator for the formatter
ASStreamIterator streamIterator(Src);
// Initializes the formatter to work on selected stream
Formatter.init(&streamIterator);
// Processes all text in source file and put them in output file
while (Formatter.hasMoreLines())
Dest << Formatter.nextLine() << streamIterator.getEol();
// returns output string
return Dest;
} // END Ide::FormatCodeString()
/////////////////////////////////////////////////////////////////////////////////////////
// Formats editor's code with Ide format parameters
void Ide::FormatCode()
{
if(editor.IsReadOnly()) return;
// Gets editor contents from editor
WString Src;
int l, h;
bool sel = editor.GetSelection(l, h);
if(sel)
Src = editor.GetSelectionW();
else
Src = editor.GetW();
// Instantiate the formatter object
ASFormatter Formatter;
// Sets up the formatter for C++ formatting
Formatter.setCStyle();
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// Sets up astyle options
Formatter.setBracketIndent(astyle_BracketIndent);
Formatter.setNamespaceIndent(astyle_NamespaceIndent);
Formatter.setBlockIndent(astyle_BlockIndent);
Formatter.setCaseIndent(astyle_CaseIndent);
Formatter.setClassIndent(astyle_ClassIndent);
Formatter.setLabelIndent(astyle_LabelIndent);
Formatter.setSwitchIndent(astyle_SwitchIndent);
Formatter.setPreprocessorIndent(astyle_PreprocessorIndent);
Formatter.setMaxInStatementIndentLength(astyle_MaxInStatementIndentLength);
Formatter.setMinConditionalIndentLength(astyle_MinInStatementIndentLength);
Formatter.setBreakClosingHeaderBracketsMode(astyle_BreakClosingHeaderBracketsMode);
Formatter.setBreakElseIfsMode(astyle_BreakElseIfsMode);
Formatter.setBreakOneLineBlocksMode(astyle_BreakOneLineBlocksMode);
Formatter.setSingleStatementsMode(astyle_SingleStatementsMode);
Formatter.setBreakBlocksMode(astyle_BreakBlocksMode);
Formatter.setBreakClosingHeaderBlocksMode(astyle_BreakClosingHeaderBlocksMode);
Formatter.setBracketFormatMode((astyle::BracketMode)astyle_BracketFormatMode);
switch(astyle_ParensPaddingMode)
{
case PAD_INSIDE :
Formatter.setParensInsidePaddingMode(true);
Formatter.setParensOutsidePaddingMode(false);
break;
case PAD_OUTSIDE :
Formatter.setParensInsidePaddingMode(false);
Formatter.setParensOutsidePaddingMode(true);
break;
case PAD_BOTH :
Formatter.setParensInsidePaddingMode(true);
Formatter.setParensOutsidePaddingMode(true);
break;
default :
Formatter.setParensOutsidePaddingMode(false);
Formatter.setParensInsidePaddingMode(false);
break;
}
Formatter.setParensUnPaddingMode(astyle_ParensUnPaddingMode);
Formatter.setOperatorPaddingMode(astyle_OperatorPaddingMode);
Formatter.setEmptyLineFill(astyle_EmptyLineFill);
Formatter.setTabSpaceConversionMode(astyle_TabSpaceConversionMode);
if(!indent_spaces)
Formatter.setTabIndentation(editortabsize, true);
else
Formatter.setSpaceIndentation(indent_amount);
WString Dest = FormatCodeString(Src, Formatter);
editor.NextUndo();
if(sel) {
editor.Remove(l, h - l);
editor.SetSelection(l, l + editor.Insert(l, Dest));
}
else {
editor.Remove(0, editor.GetLength());
editor.Insert(0, Dest);
}
}
void Ide::FormatJSON_XML(bool xml)
{
int l, h;
bool sel = editor.GetSelection(l, h);
if((sel ? h - l : editor.GetLength()) > 75*1024*1024) {
Exclamation("Too big to reformat");
return;
}
String text;
if(sel)
text = editor.GetSelection();
else {
SaveFile();
text = LoadFile(editfile);
}
if(xml) {
try {
XmlNode n = ParseXML(text);
text = AsXML(n);
}
catch(XmlError) {
Exclamation("Error passing the XML!");
return;
}
}
else {
Value v = ParseJSON(text);
if(v.IsError()) {
Exclamation("Error passing the JSON!");
return;
}
text = AsJSON(v, true);
}
editor.NextUndo();
if(sel) {
editor.Remove(l, h - l);
editor.SetSelection(l, l + editor.Insert(l, text));
}
else {
editor.Remove(0, editor.GetLength());
editor.Insert(0, text);
}
}
void Ide::FormatJSON()
{
FormatJSON_XML(false);
}
void Ide::FormatXML()
{
FormatJSON_XML(true);
}