void PHPEditorContextMenu::OnInsertDoxyComment(wxCommandEvent& e) { IEditor* editor = m_manager->GetActiveEditor(); if(editor) { PHPEntityBase::Ptr_t entry = PHPCodeCompletion::Instance()->GetPHPEntityAtPos(editor, editor->GetCurrentPosition()); if(entry) { wxStyledTextCtrl* ctrl = editor->GetCtrl(); ctrl->BeginUndoAction(); wxString comment = entry->FormatPhpDoc(); // Create the whitespace buffer int lineStartPos = ctrl->PositionFromLine(ctrl->GetCurrentLine()); int lineEndPos = lineStartPos + ctrl->LineLength(ctrl->GetCurrentLine()); // Collect all whitespace from the begining of the line until the first non whitespace // character we find wxString whitespace; for(int i = lineStartPos; lineStartPos < lineEndPos; ++i) { if(ctrl->GetCharAt(i) == ' ' || ctrl->GetCharAt(i) == '\t') { whitespace << (wxChar)ctrl->GetCharAt(i); } else { break; } } // Prepare the comment block wxArrayString lines = ::wxStringTokenize(comment, "\n", wxTOKEN_STRTOK); for(size_t i = 0; i < lines.size(); ++i) { lines.Item(i).Prepend(whitespace); } // Glue the lines back together wxString doxyBlock = ::wxJoin(lines, '\n'); doxyBlock << "\n"; // Insert the text ctrl->InsertText(lineStartPos, doxyBlock); // Try to place the caret after the @brief wxRegEx reBrief("[@\\]brief[ \t]*"); if(reBrief.IsValid() && reBrief.Matches(doxyBlock)) { wxString match = reBrief.GetMatch(doxyBlock); // Get the index int where = doxyBlock.Find(match); if(where != wxNOT_FOUND) { where += match.length(); int caretPos = lineStartPos + where; editor->SetCaretAt(caretPos); // Remove the @brief as its non standard in the PHP world editor->GetCtrl()->DeleteRange(caretPos - match.length(), match.length()); } } editor->GetCtrl()->EndUndoAction(); } } }
void ContextBase::AutoAddComment() { LEditor& rCtrl = GetCtrl(); CommentConfigData data; EditorConfigST::Get()->ReadObject(wxT("CommentConfigData"), &data); int curpos = rCtrl.GetCurrentPos(); int line = rCtrl.LineFromPosition(curpos); int cur_style = rCtrl.GetStyleAt(curpos); wxString text = rCtrl.GetLine(line - 1).Trim(false); bool dontadd = false; if(IsAtLineComment()) { dontadd = !text.StartsWith(wxT("//")) || !data.GetContinueCppComment(); } else if(IsAtBlockComment()) { dontadd = !data.GetAddStarOnCComment(); } else { dontadd = true; } if(dontadd) { ContextBase::AutoIndent(wxT('\n')); return; } wxString toInsert; if(IsAtLineComment()) { if(text.StartsWith(wxT("//"))) { toInsert = wxT("// "); } } else if(IsAtBlockComment()) { // Check the text typed before this char int startPos = rCtrl.PositionBefore(curpos); startPos -= 3; // for "/**" if(startPos >= 0) { wxString textTyped = rCtrl.GetTextRange(startPos, rCtrl.PositionBefore(curpos)); if(((textTyped == "/**") || (textTyped == "/*!")) && data.IsAutoInsertAfterSlash2Stars()) { // Let the plugins/codelite check if they can provide a doxy comment // for the current entry clCodeCompletionEvent event(wxEVT_CC_GENERATE_DOXY_BLOCK); event.SetEditor(&rCtrl); if(EventNotifier::Get()->ProcessEvent(event) && !event.GetTooltip().IsEmpty()) { rCtrl.BeginUndoAction(); // To make the doxy block fit in, we need to prepend each line // with the exact whitespace of the line that starts with "/**" int lineStartPos = rCtrl.PositionFromLine(rCtrl.LineFromPos(startPos)); wxString whitespace = rCtrl.GetTextRange(lineStartPos, startPos); // Break the comment, for each line, prepend the 'whitespace' buffer wxArrayString lines = ::wxStringTokenize(event.GetTooltip(), "\n", wxTOKEN_STRTOK); for(size_t i = 0; i < lines.GetCount(); ++i) { if(i) { // don't add it to the first line (it already exists in the editor) lines.Item(i).Prepend(whitespace); } } // Join the lines back wxString doxyBlock = ::wxJoin(lines, '\n'); rCtrl.SetSelection(startPos, curpos); rCtrl.ReplaceSelection(doxyBlock); // Try to place the caret after the @brief wxRegEx reBrief("[@\\]brief[ \t]*"); if(reBrief.IsValid() && reBrief.Matches(doxyBlock)) { wxString match = reBrief.GetMatch(doxyBlock); // Get the index int where = doxyBlock.Find(match); if(where != wxNOT_FOUND) { where += match.length(); int caretPos = startPos + where; rCtrl.SetCaretAt(caretPos); // Remove the @brief as its non standard in the PHP world rCtrl.DeleteRange(caretPos - match.length(), match.length()); } } rCtrl.EndUndoAction(); return; } } } if(rCtrl.GetStyleAt(rCtrl.PositionBefore(rCtrl.PositionBefore(curpos))) == cur_style) { toInsert = rCtrl.GetCharAt(rCtrl.GetLineIndentPosition(line - 1)) == wxT('*') ? wxT("* ") : wxT(" * "); } } if(!toInsert.IsEmpty()) { rCtrl.SetLineIndentation(line, rCtrl.GetLineIndentation(line - 1)); int insertPos = rCtrl.GetLineIndentPosition(line); rCtrl.InsertText(insertPos, toInsert); rCtrl.SetCaretAt(insertPos + toInsert.Length()); rCtrl.ChooseCaretX(); // set new column as "current" column } }