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 wxCodeCompletionBox::ShowCompletionBox(wxStyledTextCtrl* ctrl, const wxCodeCompletionBoxEntry::Vec_t& entries) { m_index = 0; m_stc = ctrl; m_allEntries = entries; // Keep the start position if(m_startPos == wxNOT_FOUND) { m_startPos = m_stc->WordStartPosition(m_stc->GetCurrentPos(), true); } // Filter all duplicate entries from the list (based on simple string match) RemoveDuplicateEntries(); // Filter results based on user input FilterResults(); // If we got a single match - insert it if((m_entries.size() == 1) && (m_flags & kInsertSingleMatch)) { // single match InsertSelection(); DoDestroy(); return; } if(m_entries.empty()) { // no entries to display DoDestroy(); return; } DoShowCompletionBox(); if(m_stc) { // Set the focus back to the completion control m_stc->CallAfter(&wxStyledTextCtrl::SetFocus); } // Display the help window DoDisplayTipWindow(); }
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(); } }