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 PHPCodeCompletion::OnCodeCompletionGetTagComment(clCodeCompletionEvent& e) { if(PHPWorkspace::Get()->IsOpen()) { TagEntryPtr tag = e.GetTagEntry(); void* data = tag->GetUserData(); if(data) { PHPCCUserData* userData = reinterpret_cast<PHPCCUserData*>(data); wxString comment, docComment; docComment = userData->entry->GetDocComment(); if(docComment.IsEmpty() == false) { docComment.Trim().Trim(false); // The Doc comment comment << docComment << wxT("\n<hr>"); // HLine } wxFileName fn(userData->entry->GetFilename()); fn.MakeRelativeTo(PHPWorkspace::Get()->GetFilename().GetPath()); comment << fn.GetFullName() << wxT(" : ") << userData->entry->GetLine(); e.SetTooltip(comment); } } else { e.Skip(); } }
/* static */ bool PHPCodeCompletion::CanCodeComplete(clCodeCompletionEvent& e) { int pos = e.GetPosition(); if(pos) pos -= 1; IEditor* editor = dynamic_cast<IEditor*>(e.GetEditor()); if(!editor) return false; // we can get style 0 if we added chars and they were not styled just yet // sd we use the first style near our position (backward) int lineNumber = editor->LineFromPos(pos); int lineStartPos = editor->PosFromLine(lineNumber); if(lineStartPos > pos) return false; int styleAt(0); int retryLeft(pos - lineStartPos + 2); while((styleAt == 0) && retryLeft && pos > 0) { styleAt = editor->GetStyleAtPos(pos); if(styleAt == 0) { --pos; } --retryLeft; } return (editor && !e.IsInsideCommentOrString() && IsPHPSection(styleAt) && !IsPHPCommentOrString(styleAt)); }
void WebTools::OnCodeComplete(clCodeCompletionEvent& event) { event.Skip(); IEditor* editor = m_mgr->GetActiveEditor(); if(editor && m_jsCodeComplete && IsJavaScriptFile(editor)) { event.Skip(false); if(InsideJSComment(editor) || InsideJSString(editor)) { // User the word completion plugin instead m_jsCodeComplete->TriggerWordCompletion(); } else { m_jsCodeComplete->CodeComplete(editor); } } else if(editor && m_xmlCodeComplete && editor->GetCtrl()->GetLexer() == wxSTC_LEX_XML) { // an XML file event.Skip(false); m_xmlCodeComplete->XmlCodeComplete(editor); } else if(editor && m_xmlCodeComplete && IsHTMLFile(editor)) { // Html code completion event.Skip(false); m_xmlCodeComplete->HtmlCodeComplete(editor); } else if(editor && m_cssCodeComplete && IsCSSFile(editor)) { // CSS code completion event.Skip(false); m_cssCodeComplete->CssCodeComplete(editor); } }
void PHPCodeCompletion::OnQuickJump(clCodeCompletionEvent& e) { e.Skip(); if(PHPWorkspace::Get()->IsOpen()) { e.Skip(false); GotoDefinition(m_manager->GetActiveEditor(), e.GetInt()); } }
void WebTools::OnFindSymbol(clCodeCompletionEvent& event) { event.Skip(); IEditor* editor = m_mgr->GetActiveEditor(); if(editor && m_jsCodeComplete && IsJavaScriptFile(editor) && !InsideJSComment(editor)) { event.Skip(false); m_jsCodeComplete->FindDefinition(editor); } }
void WebTools::OnCodeCompleteFunctionCalltip(clCodeCompletionEvent& event) { event.Skip(); IEditor* editor = m_mgr->GetActiveEditor(); if(editor && m_jsCodeComplete && IsJavaScriptFile(editor) && !InsideJSComment(editor)) { event.Skip(false); m_jsCodeComplete->CodeComplete(editor); } }
void AbbreviationPlugin::OnAbbrevSelected(clCodeCompletionEvent& e) { if(e.GetEventObject() != this) { e.Skip(); return; } wxString wordAtCaret = e.GetWord(); InsertExpansion( wordAtCaret ); }
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 XMLCodeCompletion::OnCodeComplete(clCodeCompletionEvent& event) { event.Skip(); IEditor* editor = dynamic_cast<IEditor*>(event.GetEditor()); if(editor && editor->GetCtrl()->GetLexer() == wxSTC_LEX_XML) { // an XML file event.Skip(false); XmlCodeComplete(editor); } else if(editor && m_plugin->IsHTMLFile(editor)) { // Html code completion event.Skip(false); HtmlCodeComplete(editor); } }
void PhpPlugin::OnShowQuickOutline(clCodeCompletionEvent& e) { IEditor* editor = dynamic_cast<IEditor*>(e.GetEditor()); if(editor) { // we handle only .php files if(!IsPHPFile(editor)) { // get the position e.Skip(); return; } PHPQuickOutlineDlg dlg(m_mgr->GetTheApp()->GetTopWindow(), editor, m_mgr); dlg.ShowModal(); CallAfter(&PhpPlugin::SetEditorActive, editor); } }
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 PHPCodeCompletion::OnTypeinfoTip(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)) { // FIXME: implement this using the new method return; } } } else { e.Skip(); } }
void PHPCodeCompletion::OnFindSymbol(clCodeCompletionEvent& e) { e.Skip(); if(PHPWorkspace::Get()->IsOpen()) { if(!CanCodeComplete(e)) return; e.Skip(false); IEditor* editor = dynamic_cast<IEditor*>(e.GetEditor()); if(editor) { wxString word = editor->GetWordAtCaret(); if(word.IsEmpty()) return; PHPEntityBase::List_t symbols = m_lookupTable.FindSymbol(word); if(symbols.size() == 1) { PHPEntityBase::Ptr_t match = *symbols.begin(); DoOpenEditorForEntry(match); } else { // Convert the matches to clSelectSymbolDialogEntry::List_t clSelectSymbolDialogEntry::List_t entries; std::for_each(symbols.begin(), symbols.end(), [&](PHPEntityBase::Ptr_t entry) { TagEntryPtr tag = DoPHPEntityToTagEntry(entry); wxBitmap bmp = wxCodeCompletionBox::GetBitmap(tag); clSelectSymbolDialogEntry m; m.bmp = bmp; m.name = entry->GetFullName(); m.clientData = new PHPFindSymbol_ClientData(entry); m.help = tag->GetKind(); entries.push_back(m); }); // Show selection dialog clSelectSymbolDialog dlg(EventNotifier::Get()->TopFrame(), entries); if(dlg.ShowModal() != wxID_OK) return; PHPFindSymbol_ClientData* cd = dynamic_cast<PHPFindSymbol_ClientData*>(dlg.GetSelection()); if(cd) { DoOpenEditorForEntry(cd->m_ptr); } } } } }
void PHPCodeCompletion::OnTypeinfoTip(clCodeCompletionEvent& e) { if(PHPWorkspace::Get()->IsOpen()) { if(!CanCodeComplete(e)) return; IEditor* editor = dynamic_cast<IEditor*>(e.GetEditor()); if(editor) { if(IsPHPFile(editor)) { PHPEntityBase::Ptr_t entity = GetPHPEntityAtPos(editor, e.GetPosition()); if(entity) { e.SetTooltip(entity->ToTooltip()); } return; } } } else { e.Skip(); } }
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 SmartCompletion::OnCodeCompletionSelectionMade(clCodeCompletionEvent& event) { event.Skip(); if(!m_config.IsEnabled()) return; CHECK_PTR_RET(event.GetEntry()); // Collect info about this match TagEntryPtr tag = event.GetEntry()->GetTag(); if(tag) { WeightTable_t& T = *m_pCCWeight; // we have an associated tag wxString k = tag->GetScope() + "::" + tag->GetName(); if(T.count(k) == 0) { T[k] = 1; } else { T[k]++; } m_config.GetUsageDb().StoreCCUsage(k, T[k]); } }
void SmartCompletion::OnCodeCompletionShowing(clCodeCompletionEvent& event) { event.Skip(); if(!m_config.IsEnabled()) return; // Sort the entries by their weight wxCodeCompletionBoxEntry::Vec_t& entries = event.GetEntries(); // We dont want to mess with the default sorting. We just want to place the onse with weight at the top // so we split the list into 2: entries with weight geater than 0 and 0 wxCodeCompletionBoxEntry::Vec_t importantEntries; wxCodeCompletionBoxEntry::Vec_t normalEntries; wxCodeCompletionBoxEntry::Vec_t::iterator iter = entries.begin(); for(; iter != entries.end(); ++iter) { wxCodeCompletionBoxEntry::Ptr_t entry = (*iter); if(entry->GetTag()) { wxString k = entry->GetTag()->GetScope() + "::" + entry->GetTag()->GetName(); if(m_pCCWeight->count(k)) { entry->SetWeight((*m_pCCWeight)[k]); importantEntries.push_back(entry); } else { normalEntries.push_back(entry); } } else { normalEntries.push_back(entry); } } entries.swap(normalEntries); // Step 2: sort the important entries, based on their weight std::sort(importantEntries.begin(), importantEntries.end(), [&](wxCodeCompletionBoxEntry::Ptr_t a, wxCodeCompletionBoxEntry::Ptr_t b) { // Sort in desecnding order return a->GetWeight() > b->GetWeight(); }); // Step 3: prepend the important entries entries.insert(entries.begin(), importantEntries.begin(), importantEntries.end()); }
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 CodeCompletionManager::OnBlockCommentWordComplete(clCodeCompletionEvent& event) { event.Skip(); wxStyledTextCtrl* ctrl = clGetManager()->GetActiveEditor()->GetCtrl(); CHECK_PTR_RET(ctrl); wxCodeCompletionBoxEntry::Vec_t entries; if(CreateBlockCommentKeywordsList(entries) == 0) { return; } wxCodeCompletionBox::BmpVec_t bitmaps; bitmaps.push_back(clGetManager()->GetStdIcons()->LoadBitmap("cpp_keyword")); int startPos = ctrl->WordStartPosition(ctrl->GetCurrentPos(), true); wxCodeCompletionBoxManager::Get().ShowCompletionBox(ctrl, entries, bitmaps, wxCodeCompletionBox::kRefreshOnKeyType, startPos); }
void PHPCodeCompletion::OnCodeCompleteLangKeywords(clCodeCompletionEvent& e) { // disable the default behavior of the keyword CC // by simply hooking into this event and calling Skip(false); e.Skip(false); }
void PHPCodeCompletion::OnCodeCompleteLangKeywords(clCodeCompletionEvent& e) { e.Skip(); }
void WordCompletionPlugin::OnWordComplete(clCodeCompletionEvent& event) { event.Skip(); // Always skip this IEditor* activeEditor = dynamic_cast<IEditor*>(event.GetEditor()); CHECK_PTR_RET(activeEditor); WordCompletionSettings settings; settings.Load(); // Enabled? if(!settings.IsEnabled()) { return; } // Build the suggetsion list static wxBitmap sBmp = wxNullBitmap; if(!sBmp.IsOk()) { sBmp = m_mgr->GetStdIcons()->LoadBitmap("word"); } // Filter (what the user has typed so far) // wxStyledTextCtrl* stc = activeEditor->GetCtrl(); // int curPos = stc->GetCurrentPos(); // int start = stc->WordStartPosition(stc->GetCurrentPos(), true); // if(curPos < start) return; wxString filter = event.GetWord().Lower(); // stc->GetTextRange(start, curPos); wxStringSet_t words = m_dictionary->GetWords(); // Parse the current bufer (if modified), to include non saved words if(activeEditor->IsModified()) { // For performance (this parsing is done in the main thread) // only parse the visible area of the document wxStringSet_t unsavedBufferWords; wxStyledTextCtrl* stc = activeEditor->GetCtrl(); int startPos = stc->PositionFromLine(stc->GetFirstVisibleLine()); int endPos = stc->GetCurrentPos(); wxString buffer = stc->GetTextRange(startPos, endPos); WordCompletionThread::ParseBuffer(buffer, unsavedBufferWords); // Merge the results words.insert(unsavedBufferWords.begin(), unsavedBufferWords.end()); } // Get the editor keywords and add them LexerConf::Ptr_t lexer = ColoursAndFontsManager::Get().GetLexerForFile(activeEditor->GetFileName().GetFullName()); if(lexer) { wxString keywords; for(size_t i = 0; i < wxSTC_KEYWORDSET_MAX; ++i) { keywords << lexer->GetKeyWords(i) << " "; } wxArrayString langWords = ::wxStringTokenize(keywords, "\n\t \r", wxTOKEN_STRTOK); words.insert(langWords.begin(), langWords.end()); } wxStringSet_t filterdSet; if(filter.IsEmpty()) { filterdSet.swap(words); } else { for(wxStringSet_t::iterator iter = words.begin(); iter != words.end(); ++iter) { wxString word = *iter; wxString lcWord = word.Lower(); if(settings.GetComparisonMethod() == WordCompletionSettings::kComparisonStartsWith) { if(lcWord.StartsWith(filter) && filter != word) { filterdSet.insert(word); } } else { if(lcWord.Contains(filter) && filter != word) { filterdSet.insert(word); } } } } wxCodeCompletionBoxEntry::Vec_t entries; for(wxStringSet_t::iterator iter = filterdSet.begin(); iter != filterdSet.end(); ++iter) { entries.push_back(wxCodeCompletionBoxEntry::New(*iter, sBmp)); } event.GetEntries().insert(event.GetEntries().end(), entries.begin(), entries.end()); }
void PHPCodeCompletion::OnCodeCompletionBoxDismissed(clCodeCompletionEvent& e) { e.Skip(); }