Warning, file /kdevelop/kdevelop/plugins/astyle/astyle_preferences.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002     SPDX-FileCopyrightText: 2008 Cédric Pasteur <cedric.pasteur@free.fr>
0003     SPDX-FileCopyrightText: 2001 Matthias Hölzer-Klüpfel <mhk@caldera.de>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "astyle_preferences.h"
0009 
0010 #include "astyle_formatter.h"
0011 #include "astyle_plugin.h"
0012 
0013 using namespace KDevelop;
0014 
0015 namespace {
0016 
0017 const int INDENT_BLOCK = 0;
0018 const int INDENT_BRACKET = 1;
0019 const int INDENT_CASE = 2;
0020 const int INDENT_CLASS = 3;
0021 const int INDENT_LABEL = 4;
0022 const int INDENT_NAMESPACE = 5;
0023 const int INDENT_PREPROCESSOR = 6;
0024 const int INDENT_SWITCH = 7;
0025 
0026 const int PADDING_NOCHANGE = 0;
0027 const int PADDING_NO = 1;
0028 const int PADDING_IN = 2;
0029 const int PADDING_OUT = 3;
0030 const int PADDING_INOUT = 4;
0031 
0032 const int INDENT_TABS = 0;
0033 const int INDENT_TABSFORCE = 1;
0034 const int INDENT_SPACES = 2;
0035 
0036 const int BRACKET_NOCHANGE = 0;
0037 const int BRACKET_ATTACH = 1;
0038 const int BRACKET_BREAK = 2;
0039 const int BRACKET_LINUX = 3;
0040 const int BRACKET_RUNINMODE = 4;
0041 
0042 const int POINTERALIGN_NOCHANGE = 0;
0043 const int POINTERALIGN_NAME = 1;
0044 const int POINTERALIGN_MIDDLE = 2;
0045 const int POINTERALIGN_TYPE = 3;
0046 
0047 }
0048 
0049 AStylePreferences::AStylePreferences(Language lang, QWidget *parent)
0050     : SettingsWidget(parent)
0051     , m_formatter(new AStyleFormatter)
0052     , m_currentLanguage(lang)
0053 {
0054     setupUi(this);
0055     switch(lang) {
0056         case AStylePreferences::CPP:
0057         case AStylePreferences::ObjC:
0058             m_formatter->setCStyle();
0059             break;
0060         case AStylePreferences::Java:
0061             m_formatter->setJavaStyle();
0062             break;
0063         case AStylePreferences::CSharp:
0064             m_formatter->setSharpStyle();
0065             break;
0066     }
0067     m_enableWidgetSignals = true;
0068     init();
0069 }
0070 
0071 AStylePreferences::~AStylePreferences( )
0072 {
0073 }
0074 
0075 void AStylePreferences::init()
0076 {
0077     // setup list widget to have checked items
0078     for(int i = 0; i < listIdentObjects->count(); i++) {
0079         QListWidgetItem *item = listIdentObjects->item(i);
0080         item->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);
0081         item->setCheckState(Qt::Checked);
0082     }
0083 
0084     connect(tabWidget, &QTabWidget::currentChanged, this, &AStylePreferences::currentTabChanged);
0085 
0086     connect(cbIndentType, QOverload<int>::of(&KComboBox::currentIndexChanged), this, &AStylePreferences::indentChanged);
0087     connect(inpNuberSpaces, QOverload<int>::of(&QSpinBox::valueChanged), this, &AStylePreferences::indentChanged);
0088     connect(chkConvertTabs, &QCheckBox::stateChanged, this, &AStylePreferences::indentChanged);
0089     connect(chkFillEmptyLines, &QCheckBox::stateChanged, this, &AStylePreferences::indentChanged);
0090 
0091     connect(listIdentObjects, &QListWidget::itemChanged,
0092              this, &AStylePreferences::indentObjectsChanged);
0093 
0094     connect(inpMaxStatement, QOverload<int>::of(&QSpinBox::valueChanged), this, &AStylePreferences::minMaxValuesChanged);
0095     connect(inpMinConditional, QOverload<int>::of(&QSpinBox::valueChanged), this, &AStylePreferences::minMaxValuesChanged);
0096 
0097     connect(cbBrackets, QOverload<int>::of(&KComboBox::currentIndexChanged), this, &AStylePreferences::bracketsChanged);
0098     connect(chkBracketsCloseHeaders, &QCheckBox::stateChanged, this, &AStylePreferences::bracketsChanged);
0099     connect(chkBracesAdd, &QCheckBox::stateChanged, this, &AStylePreferences::bracketsChanged);
0100 
0101     connect(chkBlockBreak, &QCheckBox::stateChanged, this, &AStylePreferences::blocksChanged);
0102     connect(chkBlockBreakAll, &QCheckBox::stateChanged, this, &AStylePreferences::blocksChanged);
0103     connect(chkBlockIfElse, &QCheckBox::stateChanged, this, &AStylePreferences::blocksChanged);
0104 
0105     connect(cbParenthesisPadding, QOverload<int>::of(&KComboBox::currentIndexChanged), this, &AStylePreferences::paddingChanged);
0106     connect(chkPadParenthesisHeader, &QCheckBox::stateChanged, this, &AStylePreferences::paddingChanged);
0107     connect(chkPadOperators, &QCheckBox::stateChanged, this, &AStylePreferences::paddingChanged);
0108 
0109     connect(chkKeepStatements, &QCheckBox::stateChanged, this, &AStylePreferences::onelinersChanged);
0110     connect(chkKeepBlocks, &QCheckBox::stateChanged, this, &AStylePreferences::onelinersChanged);
0111 
0112     connect(cbPointerAlign, QOverload<int>::of(&QComboBox::currentIndexChanged),
0113             this, &AStylePreferences::pointerAlignChanged);
0114 
0115     connect(chkAfterParens, &QCheckBox::stateChanged, this, &AStylePreferences::afterParensChanged);
0116     connect(inpContinuation, QOverload<int>::of(&QSpinBox::valueChanged), this, &AStylePreferences::afterParensChanged);
0117 }
0118 
0119 void AStylePreferences::load(const SourceFormatterStyle &style)
0120 {
0121     m_formatter->loadStyle(style.content());
0122     updateWidgets();
0123     updatePreviewText();
0124 }
0125 
0126 QString AStylePreferences::save() const
0127 {
0128     return m_formatter->saveStyle();
0129 }
0130 
0131 void AStylePreferences::updateWidgets()
0132 {
0133     // block signals to avoid writing stuff to m_formatter
0134     m_enableWidgetSignals = false;
0135     //indent
0136     if(m_formatter->option(QStringLiteral("Fill")).toString() == QLatin1String("Tabs")) {
0137         chkConvertTabs->setEnabled(false);
0138         chkConvertTabs->setChecked(false);
0139         if (m_formatter->option(AStyleOptionKey::forceTabs()).toBool()) {
0140             cbIndentType->setCurrentIndex(INDENT_TABSFORCE);
0141         } else {
0142             cbIndentType->setCurrentIndex(INDENT_TABS);
0143         }
0144     } else {
0145         cbIndentType->setCurrentIndex(INDENT_SPACES);
0146         chkConvertTabs->setEnabled(true);
0147         chkConvertTabs->setChecked(m_formatter->option(AStyleOptionKey::tabSpaceConversion()).toBool());
0148     }
0149     inpNuberSpaces->setValue(m_formatter->option(QStringLiteral("FillCount")).toInt());
0150     chkFillEmptyLines->setChecked(m_formatter->option(AStyleOptionKey::fillEmptyLines()).toBool());
0151 
0152     // indent objects
0153     setItemChecked(INDENT_BLOCK, m_formatter->option(QStringLiteral("IndentBlocks")).toBool());
0154     setItemChecked(INDENT_BRACKET, m_formatter->option(QStringLiteral("IndentBrackets")).toBool());
0155     setItemChecked(INDENT_CASE, m_formatter->option(QStringLiteral("IndentCases")).toBool());
0156     setItemChecked(INDENT_CLASS, m_formatter->option(QStringLiteral("IndentClasses")).toBool());
0157     setItemChecked(INDENT_LABEL, m_formatter->option(QStringLiteral("IndentLabels")).toBool());
0158     setItemChecked(INDENT_NAMESPACE, m_formatter->option(QStringLiteral("IndentNamespaces")).toBool());
0159     setItemChecked(INDENT_PREPROCESSOR, m_formatter->option(QStringLiteral("IndentPreprocessors")).toBool());
0160     setItemChecked(INDENT_SWITCH, m_formatter->option(QStringLiteral("IndentSwitches")).toBool());
0161 
0162     inpMaxStatement->setValue(m_formatter->option(QStringLiteral("MaxStatement")).toInt());
0163     inpMinConditional->setValue(m_formatter->option(QStringLiteral("MinConditional")).toInt());
0164 
0165     chkAfterParens->setChecked(m_formatter->option(QStringLiteral("AfterParens")).toBool());
0166     inpContinuation->setValue(m_formatter->option(QStringLiteral("Continuation")).toInt());
0167     inpContinuation->setEnabled(chkAfterParens->isChecked());
0168 
0169     // brackets
0170     QString s = m_formatter->option(QStringLiteral("Brackets")).toString();
0171     if(s == QLatin1String("Attach"))
0172         cbBrackets->setCurrentIndex(BRACKET_ATTACH);
0173     else if(s == QLatin1String("Break"))
0174         cbBrackets->setCurrentIndex(BRACKET_BREAK);
0175     else if(s == QLatin1String("Linux"))
0176         cbBrackets->setCurrentIndex(BRACKET_LINUX);
0177     else
0178         cbBrackets->setCurrentIndex(BRACKET_NOCHANGE);
0179     chkBracketsCloseHeaders->setChecked(
0180         m_formatter->option(QStringLiteral("BracketsCloseHeaders")).toBool());
0181     chkBracesAdd->setChecked(m_formatter->option(AStyleOptionKey::bracesAdd()).toBool());
0182 
0183     // blocks
0184     chkBlockBreak->setChecked(m_formatter->option(QStringLiteral("BlockBreak")).toBool());
0185     chkBlockBreakAll->setChecked(m_formatter->option(QStringLiteral("BlockBreakAll")).toBool());
0186     chkBlockIfElse->setChecked(m_formatter->option(QStringLiteral("BlockIfElse")).toBool());
0187     // enable or not chkBlockBreakAll
0188     chkBlockBreakAll->setEnabled(chkBlockBreak->isChecked());
0189 
0190     // padding
0191     bool padin = m_formatter->option(QStringLiteral("PadParenthesesIn")).toBool();
0192     bool padout = m_formatter->option(QStringLiteral("PadParenthesesOut")).toBool();
0193     bool unpad = m_formatter->option(QStringLiteral("PadParenthesesUn")).toBool();
0194     if(unpad) {
0195         if(padin) {
0196             if(padout)
0197                 cbParenthesisPadding->setCurrentIndex(PADDING_INOUT);
0198             else
0199                 cbParenthesisPadding->setCurrentIndex(PADDING_IN);
0200         } else if(padout)
0201             cbParenthesisPadding->setCurrentIndex(PADDING_OUT);
0202         else
0203             cbParenthesisPadding->setCurrentIndex(PADDING_NO);
0204     } else
0205         cbParenthesisPadding->setCurrentIndex(PADDING_NOCHANGE);
0206 
0207     // padding header has no influence with padding out
0208     if (padout)
0209         chkPadParenthesisHeader->setDisabled(true);
0210 
0211     chkPadParenthesisHeader->setChecked(m_formatter->option(QStringLiteral("PadParenthesesHeader")).toBool());
0212     chkPadOperators->setChecked(m_formatter->option(QStringLiteral("PadOperators")).toBool());
0213     // oneliner
0214     chkKeepStatements->setChecked(m_formatter->option(QStringLiteral("KeepStatements")).toBool());
0215     chkKeepBlocks->setChecked(m_formatter->option(QStringLiteral("KeepBlocks")).toBool());
0216 
0217     // pointer align
0218     s = m_formatter->option(QStringLiteral("PointerAlign")).toString();
0219     if (s == QLatin1String("Name"))
0220         cbPointerAlign->setCurrentIndex(POINTERALIGN_NAME);
0221     else if (s == QLatin1String("Type"))
0222         cbPointerAlign->setCurrentIndex(POINTERALIGN_TYPE);
0223     else if (s == QLatin1String("Middle"))
0224         cbPointerAlign->setCurrentIndex(POINTERALIGN_MIDDLE);
0225     else
0226         cbPointerAlign->setCurrentIndex(POINTERALIGN_NOCHANGE);
0227 
0228     m_enableWidgetSignals = true; // re enable signals
0229 }
0230 
0231 void AStylePreferences::setItemChecked(int idx, bool checked)
0232 {
0233     QListWidgetItem *item = listIdentObjects->item(idx);
0234     if(!item)
0235         return;
0236 
0237     if(checked)
0238         item->setCheckState(Qt::Checked);
0239     else
0240         item->setCheckState(Qt::Unchecked);
0241 }
0242 
0243 void AStylePreferences::updatePreviewText()
0244 {
0245     if(tabWidget->currentIndex() == 0)
0246         emit previewTextChanged(AStylePlugin::indentingSample(m_currentLanguage));
0247     else
0248         emit previewTextChanged(AStylePlugin::formattingSample(m_currentLanguage));
0249 }
0250 
0251 void AStylePreferences::currentTabChanged()
0252 {
0253     updatePreviewText();
0254 }
0255 
0256 void AStylePreferences::indentChanged()
0257 {
0258     if(!m_enableWidgetSignals)
0259         return;
0260 
0261 
0262     switch(cbIndentType->currentIndex()) {
0263         case INDENT_TABS:
0264             m_formatter->setTabIndentation(inpNuberSpaces->value(), false);
0265             chkConvertTabs->setEnabled(false);
0266             break;
0267         case INDENT_TABSFORCE:
0268             m_formatter->setTabIndentation(inpNuberSpaces->value(), true);
0269             chkConvertTabs->setEnabled(false);
0270             break;
0271         case INDENT_SPACES:
0272             m_formatter->setSpaceIndentationAndTabSpaceConversion(inpNuberSpaces->value(), chkConvertTabs->isChecked());
0273             chkConvertTabs->setEnabled(true);
0274             break;
0275     }
0276 
0277     m_formatter->setEmptyLineFill(chkFillEmptyLines->isChecked());
0278 
0279     updatePreviewText();
0280 }
0281 
0282 void AStylePreferences::indentObjectsChanged(QListWidgetItem *item)
0283 {
0284     if(!m_enableWidgetSignals)
0285         return;
0286     if(!item)
0287         return;
0288 
0289     bool checked = (item->checkState() == Qt::Checked);
0290     switch(listIdentObjects->row(item)) {
0291         case INDENT_BLOCK: m_formatter->setBlockIndent(checked); break;
0292         case INDENT_BRACKET: m_formatter->setBracketIndent(checked); break;
0293         case INDENT_CASE: m_formatter->setCaseIndent(checked); break;
0294         case INDENT_CLASS: m_formatter->setClassIndent(checked); break;
0295         case INDENT_LABEL: m_formatter->setLabelIndent(checked); break;
0296         case INDENT_NAMESPACE: m_formatter->setNamespaceIndent(checked); break;
0297         case INDENT_PREPROCESSOR: m_formatter->setPreprocessorIndent(checked); break;
0298         case INDENT_SWITCH: m_formatter->setSwitchIndent(checked); break;
0299     }
0300 
0301     updatePreviewText();
0302 }
0303 
0304 void AStylePreferences::minMaxValuesChanged()
0305 {
0306     if(!m_enableWidgetSignals)
0307         return;
0308     m_formatter->setMaxInStatementIndentLength(inpMaxStatement->value());
0309     m_formatter->setMinConditionalIndentLength(inpMinConditional->value());
0310 
0311     updatePreviewText();
0312 }
0313 
0314 void AStylePreferences::bracketsChanged()
0315 {
0316     if(!m_enableWidgetSignals)
0317         return;
0318     switch(cbBrackets->currentIndex()) {
0319         case BRACKET_NOCHANGE: m_formatter->setBracketFormatMode(astyle::NONE_MODE); break;
0320         case BRACKET_ATTACH: m_formatter->setBracketFormatMode(astyle::ATTACH_MODE); break;
0321         case BRACKET_BREAK: m_formatter->setBracketFormatMode(astyle::BREAK_MODE); break;
0322         case BRACKET_LINUX: m_formatter->setBracketFormatMode(astyle::LINUX_MODE); break;
0323         case BRACKET_RUNINMODE: m_formatter->setBracketFormatMode(astyle::RUN_IN_MODE); break;
0324     }
0325 
0326     m_formatter->setBreakClosingHeaderBracketsMode(chkBracketsCloseHeaders->isChecked());
0327     m_formatter->setAddBracesMode(chkBracesAdd->isChecked());
0328 
0329     updatePreviewText();
0330 }
0331 
0332 void AStylePreferences::blocksChanged()
0333 {
0334     if(!m_enableWidgetSignals)
0335         return;
0336     m_formatter->setBreakBlocksMode(chkBlockBreak->isChecked());
0337     m_formatter->setBreakClosingHeaderBlocksMode(chkBlockBreakAll->isChecked());
0338     m_formatter->setBreakElseIfsMode(chkBlockIfElse->isChecked());
0339 
0340     chkBlockBreakAll->setEnabled(chkBlockBreak->isChecked());
0341 
0342     updatePreviewText();
0343 }
0344 
0345 void AStylePreferences::paddingChanged()
0346 {
0347     if(!m_enableWidgetSignals)
0348         return;
0349     switch(cbParenthesisPadding->currentIndex()) {
0350         case PADDING_NOCHANGE:
0351             m_formatter->setParensUnPaddingMode(false);
0352             m_formatter->setParensInsidePaddingMode(false);
0353             m_formatter->setParensOutsidePaddingMode(false);
0354             chkPadParenthesisHeader->setDisabled(false);
0355             break;
0356         case PADDING_NO:
0357             m_formatter->setParensUnPaddingMode(true);
0358             m_formatter->setParensInsidePaddingMode(false);
0359             m_formatter->setParensOutsidePaddingMode(false);
0360             chkPadParenthesisHeader->setDisabled(false);
0361             break;
0362         case PADDING_IN:
0363             m_formatter->setParensUnPaddingMode(true);
0364             m_formatter->setParensInsidePaddingMode(true);
0365             m_formatter->setParensOutsidePaddingMode(false);
0366             chkPadParenthesisHeader->setDisabled(false);
0367             break;
0368         case PADDING_OUT:
0369             m_formatter->setParensUnPaddingMode(true);
0370             m_formatter->setParensInsidePaddingMode(false);
0371             m_formatter->setParensOutsidePaddingMode(true);
0372             // padding header has no influence with padding out
0373             chkPadParenthesisHeader->setDisabled(true);
0374             break;
0375         case PADDING_INOUT:
0376             m_formatter->setParensUnPaddingMode(true);
0377             m_formatter->setParensInsidePaddingMode(true);
0378             m_formatter->setParensOutsidePaddingMode(true);
0379             // padding header has no influence with padding out
0380             chkPadParenthesisHeader->setDisabled(true);
0381             break;
0382     }
0383 
0384     m_formatter->setParensHeaderPaddingMode(chkPadParenthesisHeader->isChecked());
0385     m_formatter->setOperatorPaddingMode(chkPadOperators->isChecked());
0386 
0387     updatePreviewText();
0388 }
0389 
0390 void AStylePreferences::onelinersChanged()
0391 {
0392     if(!m_enableWidgetSignals)
0393         return;
0394     m_formatter->setBreakOneLineStatementsMode(!chkKeepStatements->isChecked());
0395     m_formatter->setBreakOneLineBlocksMode(!chkKeepBlocks->isChecked());
0396 
0397     updatePreviewText();
0398 }
0399 
0400 void AStylePreferences::pointerAlignChanged()
0401 {
0402     if(!m_enableWidgetSignals)
0403         return;
0404     switch (cbPointerAlign->currentIndex()) {
0405         case POINTERALIGN_NAME:
0406             m_formatter->setPointerAlignment(astyle::PTR_ALIGN_NAME);
0407             break;
0408         case POINTERALIGN_TYPE:
0409             m_formatter->setPointerAlignment(astyle::PTR_ALIGN_TYPE);
0410             break;
0411         case POINTERALIGN_MIDDLE:
0412             m_formatter->setPointerAlignment(astyle::PTR_ALIGN_MIDDLE);
0413             break;
0414         default:
0415         case POINTERALIGN_NOCHANGE:
0416             m_formatter->setPointerAlignment(astyle::PTR_ALIGN_NONE);
0417             break;
0418     }
0419 
0420     updatePreviewText();
0421 }
0422 
0423 void AStylePreferences::afterParensChanged()
0424 {
0425     if(!m_enableWidgetSignals)
0426         return;
0427     m_formatter->setAfterParens(chkAfterParens->isChecked());
0428     inpContinuation->setEnabled(chkAfterParens->isChecked());
0429     m_formatter->setContinuation(inpContinuation->value());
0430 
0431     updatePreviewText();
0432 }
0433 
0434 #include "moc_astyle_preferences.cpp"