bool CppDocumentationCommentHelper::handleKeyPressEvent(QKeyEvent *e) const { if (!m_settings.m_enableDoxygen && !m_settings.m_leadingAsterisks) return false; if (e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) { QTextCursor cursor = m_editorWidget->textCursor(); if (!m_editorWidget->autoCompleter()->isInComment(cursor)) return false; // We are interested on two particular cases: // 1) The cursor is right after a /**, /*!, /// or ///! and the user pressed enter. // If Doxygen is enabled we need to generate an entire comment block. // 2) The cursor is already in the middle of a multi-line comment and the user pressed // enter. If leading asterisk(s) is set we need to write a comment continuation // with those. if (m_settings.m_enableDoxygen && cursor.positionInBlock() >= 3) { const int pos = cursor.position(); if (isStartOfDoxygenComment(cursor)) { QTextDocument *textDocument = m_editorWidget->document(); DoxygenGenerator::DocumentationStyle style = doxygenStyle(cursor, textDocument); // Check if we're already in a CppStyle Doxygen comment => continuation // Needs special handling since CppStyle does not have start and end markers if ((style == DoxygenGenerator::CppStyleA || style == DoxygenGenerator::CppStyleB) && isCppStyleContinuation(cursor)) { return handleDoxygenCppStyleContinuation(cursor, e); } DoxygenGenerator doxygen; doxygen.setStyle(style); doxygen.setAddLeadingAsterisks(m_settings.m_leadingAsterisks); doxygen.setGenerateBrief(m_settings.m_generateBrief); doxygen.setStartComment(false); // Move until we reach any possibly meaningful content. while (textDocument->characterAt(cursor.position()).isSpace() && cursor.movePosition(QTextCursor::NextCharacter)) { } if (!cursor.atEnd()) { const QString &comment = doxygen.generate(cursor); if (!comment.isEmpty()) { cursor.beginEditBlock(); cursor.setPosition(pos); cursor.insertText(comment); cursor.setPosition(pos - 3, QTextCursor::KeepAnchor); m_editorWidget->textDocument()->autoIndent(cursor); cursor.endEditBlock(); e->accept(); return true; } } } } // right after first doxygen comment return handleDoxygenContinuation(cursor, e, m_editorWidget->document(), m_settings.m_enableDoxygen, m_settings.m_leadingAsterisks); } return false; }
bool trySplitComment(TextEditor::TextEditorWidget *editorWidget, const CPlusPlus::Snapshot &snapshot) { const CommentsSettings &settings = CppToolsSettings::instance()->commentsSettings(); if (!settings.m_enableDoxygen && !settings.m_leadingAsterisks) return false; QTextCursor cursor = editorWidget->textCursor(); if (!CPlusPlus::MatchingText::isInCommentHelper(cursor)) return false; // We are interested on two particular cases: // 1) The cursor is right after a /**, /*!, /// or ///! and the user pressed enter. // If Doxygen is enabled we need to generate an entire comment block. // 2) The cursor is already in the middle of a multi-line comment and the user pressed // enter. If leading asterisk(s) is set we need to write a comment continuation // with those. if (settings.m_enableDoxygen && cursor.positionInBlock() >= 3) { const int pos = cursor.position(); if (isStartOfDoxygenComment(cursor)) { QTextDocument *textDocument = editorWidget->document(); DoxygenGenerator::DocumentationStyle style = doxygenStyle(cursor, textDocument); // Check if we're already in a CppStyle Doxygen comment => continuation // Needs special handling since CppStyle does not have start and end markers if ((style == DoxygenGenerator::CppStyleA || style == DoxygenGenerator::CppStyleB) && isCppStyleContinuation(cursor)) { return handleDoxygenCppStyleContinuation(cursor); } DoxygenGenerator doxygen; doxygen.setStyle(style); doxygen.setAddLeadingAsterisks(settings.m_leadingAsterisks); doxygen.setGenerateBrief(settings.m_generateBrief); doxygen.setStartComment(false); // Move until we reach any possibly meaningful content. while (textDocument->characterAt(cursor.position()).isSpace() && cursor.movePosition(QTextCursor::NextCharacter)) { } if (!cursor.atEnd()) { const QString &comment = doxygen.generate(cursor, snapshot, editorWidget->textDocument()->filePath()); if (!comment.isEmpty()) { cursor.beginEditBlock(); cursor.setPosition(pos); cursor.insertText(comment); cursor.setPosition(pos - 3, QTextCursor::KeepAnchor); editorWidget->textDocument()->autoIndent(cursor); cursor.endEditBlock(); return true; } } } } // right after first doxygen comment return handleDoxygenContinuation(cursor, editorWidget, settings.m_enableDoxygen, settings.m_leadingAsterisks); }