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"