void XMLCodeCompletion::OnCodeCompleted(clCodeCompletionEvent& event) { event.Skip(); if(event.GetEventObject() != this) { return; } // sanity IEditor* editor = clGetManager()->GetActiveEditor(); if(!editor) return; // HTML triggered the code complete? if(m_completeReason == kHtmlOpenSequence) { event.Skip(false); const wxString& selection = event.GetWord(); if(XMLBuffer::IsEmptyHtmlTag(selection) && !HasSpecialInsertPattern(selection)) { // an empty html tag, just complete it wxString textToInsert = selection; textToInsert << ">"; int selStart = GetWordStartPos(editor); int selEnd = editor->GetCurrentPosition(); if((selEnd - selStart) >= 0) { editor->SelectText(selStart, selEnd - selStart); editor->ReplaceSelection(textToInsert); editor->SetCaretAt(selStart + textToInsert.length()); } } else { wxString completePattern = GetCompletePattern(selection); int caretPos = completePattern.Find("|"); completePattern.Replace("|", ""); int selStart = GetWordStartPos(editor); int selEnd = editor->GetCurrentPosition(); if((selEnd - selStart) >= 0) { editor->SelectText(selStart, selEnd - selStart); editor->ReplaceSelection(completePattern); editor->SetCaretAt(selStart + caretPos); } } } else if(m_completeReason == kCloseSequence) { // User typed "</" event.Skip(false); const wxString& selection = event.GetWord(); int selStart = GetWordStartPos(editor); int selEnd = editor->GetCurrentPosition(); if((selEnd - selStart) >= 0) { editor->SelectText(selStart, selEnd - selStart); editor->ReplaceSelection(selection); editor->SetCaretAt(selStart + selection.length()); } } else { event.Skip(); } }
void PHPCodeCompletion::OnFunctionCallTip(clCodeCompletionEvent& e) { e.Skip(); if(PHPWorkspace::Get()->IsOpen()) { if(!CanCodeComplete(e)) return; IEditor* editor = dynamic_cast<IEditor*>(e.GetEditor()); if(editor) { // we handle only .php files if(IsPHPFile(editor)) { // this is our to complete e.Skip(false); // get the position PHPEntityBase::Ptr_t resolved = DoGetPHPEntryUnderTheAtPos(editor, editor->GetCurrentPosition(), true); if(resolved) { // In PHP there is no overloading, so there can be only one signature for a function // so we simply place our match into TagEntryPtrVector_t structure and pass it to the editor TagEntryPtrVector_t tags; tags.push_back(DoPHPEntityToTagEntry(resolved)); clCallTipPtr callTip(new clCallTip(tags)); editor->ShowCalltip(callTip); } } } } }
//------------------------------------------------------------ void SnipWiz::OnMenuExpandSwitch(wxCommandEvent& e) { IEditor* editor = GetEditor(); if(!editor) return; bool isSelection = false; wxString var = editor->GetSelection(); if(!var.IsEmpty()) isSelection = true; var = ::wxGetTextFromUser(_("Enter identifier name"), _("switch(...)"), var); if(var.IsEmpty()) return; long count = ::wxGetNumberFromUser(_("Enter number of cases"), _("Cases:"), _("switch(...)"), 1, 1, 20); if(count < 1) return; int curEol = editor->GetEOL(); int curPos = editor->GetCurrentPosition(); wxString tabs = GetTabs(editor, curPos); wxString output = wxString::Format(wxT("switch( %s )%s%s{%s"), var.c_str(), eol[curEol].c_str(), tabs.c_str(), eol[curEol].c_str()); for(long i = 0; i < count; i++) output += wxString::Format(wxT("%scase :%s%sbreak;%s"), tabs.c_str(), eol[curEol].c_str(), tabs.c_str(), eol[curEol].c_str()); output += tabs.c_str(); output += wxT("}"); if(isSelection) editor->ReplaceSelection(output); else editor->InsertText(curPos, output); }
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 PHPCodeCompletion::OnCodeComplete(clCodeCompletionEvent& e) { e.Skip(true); if(PHPWorkspace::Get()->IsOpen()) { IEditor* editor = dynamic_cast<IEditor*>(e.GetEditor()); if(editor && IsPHPFile(editor)) { e.Skip(false); // Update the settings TagsOptionsData d; clConfig ccConfig("code-completion.conf"); ccConfig.ReadItem(&d); m_lookupTable.SetSizeLimit(d.GetCcNumberOfDisplayItems()); // Check if the code completion was triggered due to user // typing '(', in this case, call OnFunctionCallTip() wxChar charAtPos = editor->GetCharAtPos(editor->GetCurrentPosition() - 1); if(charAtPos == '(') { OnFunctionCallTip(e); } else { // Perform the code completion here PHPExpression::Ptr_t expr(new PHPExpression(editor->GetTextRange(0, e.GetPosition()))); bool isExprStartsWithOpenTag = expr->IsExprStartsWithOpenTag(); PHPEntityBase::Ptr_t entity = expr->Resolve(m_lookupTable, editor->GetFileName().GetFullPath()); if(entity) { // Suggets members for the resolved entity PHPEntityBase::List_t matches; expr->Suggest(entity, m_lookupTable, matches); if(!expr->GetFilter().IsEmpty() && (expr->GetCount() == 0)) { // Word completion PHPEntityBase::List_t keywords = PhpKeywords(expr->GetFilter()); // Preprend the keywords matches.insert(matches.end(), keywords.begin(), keywords.end()); // Did user typed "<?ph" or "<?php" ?? // If so, clear the matches if(isExprStartsWithOpenTag && (expr->GetFilter() == "ph" || expr->GetFilter() == "php")) { matches.clear(); } } // Remove duplicates from the list if(!matches.empty()) { // Show the code completion box DoShowCompletionBox(matches, expr); } } } } } }
void CMakeHelpTab::OnInsert(wxCommandEvent& event) { IManager* manager = m_plugin->GetManager(); wxASSERT(manager); IEditor* editor = manager->GetActiveEditor(); // No active editor if(!editor) return; // Insert value editor->InsertText(editor->GetCurrentPosition(), m_listBoxList->GetString(event.GetInt())); }
void PHPCodeCompletion::OnFindSymbol(clCodeCompletionEvent& e) { if(PHPWorkspace::Get()->IsOpen()) { if(!CanCodeComplete(e)) return; IEditor* editor = dynamic_cast<IEditor*>(e.GetEditor()); if(editor) { PHPEntityBase::Ptr_t resolved = GetPHPEntryUnderTheAtPos(editor, editor->GetCurrentPosition()); if(resolved) { m_manager->OpenFile(resolved->GetFilename().GetFullPath(), "", resolved->GetLine()); } } } else { e.Skip(); } }
void PHPEditorContextMenu::OnGenerateSettersGetters(wxCommandEvent& e) { // CHeck the current context IEditor* editor = m_manager->GetActiveEditor(); if(editor) { // determine the scope name at the current position // Parse until the current position wxString text = editor->GetTextRange(0, editor->GetCurrentPosition()); PHPSourceFile sourceFile(text); sourceFile.SetParseFunctionBody(true); sourceFile.SetFilename(editor->GetFileName()); sourceFile.Parse(); const PHPEntityClass* scopeAtPoint = sourceFile.Class()->Cast<PHPEntityClass>(); if(!scopeAtPoint) { // Could not determine the scope at the give location return; } // get the class name wxString className = scopeAtPoint->GetShortName(); // generate the code to generate wxString textToAdd; PHPSettersGettersDialog dlg(EventNotifier::Get()->TopFrame(), editor, m_manager); if(dlg.ShowModal() == wxID_OK) { PHPSetterGetterEntry::Vec_t members = dlg.GetMembers(); for(size_t i = 0; i < members.size(); ++i) { textToAdd << members.at(i).GetSetter(dlg.GetScope(), dlg.GetFlags()) << "\n"; textToAdd << members.at(i).GetGetter(dlg.GetFlags()) << "\n"; } if(!textToAdd.IsEmpty()) { int line = PHPCodeCompletion::Instance()->GetLocationForSettersGetters( editor->GetTextRange(0, editor->GetLength()), className); if(!textToAdd.IsEmpty() && line != wxNOT_FOUND) { editor->GetCtrl()->InsertText(editor->PosFromLine(line), textToAdd); } } } } }
//------------------------------------------------------------ void SnipWiz::OnMenuPaste(wxCommandEvent& e) { wxUnusedVar(e); IEditor* editor = GetEditor(); if(!editor) return; if(m_clipboard.IsEmpty()) return; // otherwise insert text wxString output = FormatOutput(editor, m_clipboard); wxString selection = editor->GetSelection(); int curPos = editor->GetCurrentPosition() - selection.Len(); // get caret position long cursorPos = output.Find(REAL_CARET_STR); if(cursorPos != wxNOT_FOUND) output.Remove(cursorPos, wxStrlen(REAL_CARET_STR)); editor->ReplaceSelection(output); // set caret if(cursorPos != wxNOT_FOUND) editor->SetCaretAt(curPos + cursorPos); else editor->SetCaretAt(curPos + output.Len()); }
void PHPCodeCompletion::OnCodeComplete(clCodeCompletionEvent& e) { if(PHPWorkspace::Get()->IsOpen()) { if(!CanCodeComplete(e)) return; IEditor* editor = dynamic_cast<IEditor*>(e.GetEditor()); if(editor) { // we handle only .php files if(IsPHPFile(editor)) { // Check if the code completion was triggered due to user // typing '(', in this case, call OnFunctionCallTip() wxChar charAtPos = editor->GetCharAtPos(editor->GetCurrentPosition() - 1); if(charAtPos == '(') { OnFunctionCallTip(e); } else { // Perform the code completion here PHPExpression::Ptr_t expr(new PHPExpression(editor->GetTextRange(0, e.GetPosition()))); PHPEntityBase::Ptr_t entity = expr->Resolve(m_lookupTable, editor->GetFileName().GetFullPath()); if(entity) { // Suggets members for the resolved entity PHPEntityBase::List_t matches; expr->Suggest(entity, m_lookupTable, matches); // Remove duplicates from the list if(!matches.empty()) { // Show the code completion box DoShowCompletionBox(matches, expr); } } } } } } else { e.Skip(); } }
void PHPCodeCompletion::OnInsertDoxyBlock(clCodeCompletionEvent& e) { e.Skip(); // Do we have a workspace open? CHECK_COND_RET(PHPWorkspace::Get()->IsOpen()); // Sanity IEditor* editor = dynamic_cast<IEditor*>(e.GetEditor()); CHECK_PTR_RET(editor); // Is this a PHP editor? CHECK_COND_RET(IsPHPFile(editor)); // Get the text from the caret current position // until the end of file wxString unsavedBuffer = editor->GetTextRange(editor->GetCurrentPosition(), editor->GetLength()); unsavedBuffer.Trim().Trim(false); PHPSourceFile source("<?php " + unsavedBuffer); source.SetParseFunctionBody(false); source.Parse(); PHPEntityBase::Ptr_t ns = source.Namespace(); if(ns) { const PHPEntityBase::List_t& children = ns->GetChildren(); for(PHPEntityBase::List_t::const_iterator iter = children.begin(); iter != children.end(); ++iter) { PHPEntityBase::Ptr_t match = *iter; if(match->GetLine() == 0 && match->Is(kEntityTypeFunction)) { e.Skip(false); // notify codelite to stop processing this event wxString phpdoc = match->FormatPhpDoc(); phpdoc.Trim(); e.SetTooltip(phpdoc); } } } }
//------------------------------------------------------------ void SnipWiz::OnMenuSnippets(wxCommandEvent& e) { IEditor* editor = GetEditor(); if(!editor) return; bool crtl = ::wxGetKeyState(WXK_CONTROL); bool sourceIsMenu(false); wxMenu* m = dynamic_cast<wxMenu*>(e.GetEventObject()); if(m) { sourceIsMenu = true; } if(e.GetId() >= IDM_ADDSTART && e.GetId() < (IDM_ADDSTART + (int)m_snippets.GetCount())) { wxString key = m_snippets.Item(e.GetId() - IDM_ADDSTART); wxString srText = m_StringDb.GetSnippetString(key); wxString selection = editor->GetSelection(); // replace template eols with current int curEol = editor->GetEOL(); if(srText.Find(eol[2]) != wxNOT_FOUND) srText.Replace(eol[2], eol[curEol].c_str()); // Replace any escaped carets/selection strings srText.Replace(USER_ESC_CARET, TMP_ESC_CARET_STR); srText.Replace(USER_ESC_SELECTION, TMP_ESC_SELECTION_STR); srText.Replace(CARET, REAL_CARET_STR); srText.Replace(SELECTION, REAL_SELECTION_STR); // selection ? if(srText.Find(REAL_SELECTION_STR) != wxNOT_FOUND) srText.Replace(REAL_SELECTION_STR, selection.c_str()); // restore the escaped selection, this time without the escaping backslash srText.Replace(TMP_ESC_SELECTION_STR, SELECTION); // restore the escaped caret, this time without the escaping backslash srText.Replace(TMP_ESC_CARET_STR, CARET); // if the user pressed control while clicking if(crtl && sourceIsMenu) { m_clipboard = srText; // remove caret mark if there srText.Replace(REAL_CARET_STR, wxT("")); // copy text to clipboard if(wxTheClipboard->Open()) { wxTheClipboard->SetData(new wxTextDataObject(srText)); wxTheClipboard->Close(); } } else { // otherwise insert text // format the text for insertion wxString output = FormatOutput(editor, srText); int curPos = editor->GetCurrentPosition(); if(selection.Len() != 0) { curPos = editor->GetSelectionStart(); } // get caret position long cursorPos = output.Find(REAL_CARET_STR); if(cursorPos != wxNOT_FOUND) output.Remove(cursorPos, wxStrlen(REAL_CARET_STR)); editor->ReplaceSelection(output); // set caret if(cursorPos != wxNOT_FOUND) editor->SetCaretAt(curPos + cursorPos); else editor->SetCaretAt(curPos + output.Len()); } } }
bool AbbreviationPlugin::InsertExpansion(const wxString& abbreviation) { // get the active editor IEditor *editor = m_mgr->GetActiveEditor(); if (!editor || !abbreviation) return false; // hide the completion box if (editor->IsCompletionBoxShown()) { editor->HideCompletionBox(); } // search for abbreviation that matches str // prepate list of abbreviations AbbreviationJSONEntry jsonData; if ( !m_config.ReadItem(&jsonData) ) { // merge the data from the old configuration AbbreviationEntry data; m_mgr->GetConfigTool()->ReadObject(wxT("AbbreviationsData"), &data); jsonData.SetAutoInsert( data.GetAutoInsert() ); jsonData.SetEntries( data.GetEntries() ); m_config.WriteItem( &jsonData ); } // search for the old item const JSONElement::wxStringMap_t& entries = jsonData.GetEntries(); JSONElement::wxStringMap_t::const_iterator iter = entries.find(abbreviation); if (iter != entries.end()) { wxString text = iter->second; int selStart = editor->WordStartPos(editor->GetCurrentPosition(), true); int selEnd = editor->WordEndPos(editor->GetCurrentPosition(), true); int curPos = editor->GetCurrentPosition(); int typedWordLen = curPos - selStart; if (typedWordLen < 0) { typedWordLen = 0; } // format the text to insert bool appendEol(false); if (text.EndsWith(wxT("\r")) || text.EndsWith(wxT("\n"))) { appendEol = true; } text = editor->FormatTextKeepIndent(text, selStart, Format_Text_Save_Empty_Lines); // remove the first line indenation that might have been placed by CL text.Trim(false).Trim(); if (appendEol) { wxString eol; switch (editor->GetEOL()) { case 1: eol = wxT("\r"); break; case 0: eol = wxT("\r\n"); break; case 2: eol = wxT("\n"); break; } text << eol; } //-------------------------------------------- // replace any place holders //-------------------------------------------- wxString project; text = MacroManager::Instance()->Expand(text, m_mgr, editor->GetProjectName()); // locate the caret int where = text.Find(wxT("|")); if (where == wxNOT_FOUND) { where = text.length(); } // remove the pipe (|) character text.Replace(wxT("|"), wxT("")); if (selEnd - selStart >= 0) { editor->SelectText(selStart, selEnd - selStart); editor->ReplaceSelection(text); editor->SetCaretAt(curPos + where - typedWordLen); } return true; } else return false; }