void ClangCodeCompletion::HighlightOccurrences(cbEditor* ed) { ClTranslUnitId translId = GetCurrentTranslationUnitId(); cbStyledTextCtrl* stc = ed->GetControl(); int pos = stc->GetCurrentPos(); const wxChar ch = stc->GetCharAt(pos); if (pos > 0 && (wxIsspace(ch) || (ch != wxT('_') && wxIspunct(ch))) && !wxIsspace(stc->GetCharAt(pos - 1))) { --pos; } // chosen a high value for indicator, hoping not to interfere with the indicators used by some lexers // if they get updated from deprecated old style indicators someday. const int theIndicator = 16; stc->SetIndicatorCurrent(theIndicator); // Set Styling: // clear all style indications set in a previous run (is also done once after text gets unselected) stc->IndicatorClearRange(0, stc->GetLength()); if (stc->GetTextRange(pos - 1, pos + 1).Strip().IsEmpty()) return; // TODO: use independent key wxColour highlightColour(Manager::Get()->GetColourManager()->GetColour(wxT("editor_highlight_occurrence"))); stc->IndicatorSetStyle(theIndicator, wxSCI_INDIC_HIGHLIGHT); stc->IndicatorSetForeground(theIndicator, highlightColour); stc->IndicatorSetUnder(theIndicator, true); const int line = stc->LineFromPosition(pos); ClTokenPosition loc(line + 1, pos - stc->PositionFromLine(line) + 1); std::vector< std::pair<int, int> > occurrences; m_pClangPlugin->GetOccurrencesOf( translId, ed->GetFilename(), loc, 100, occurrences ); for (std::vector< std::pair<int, int> >::const_iterator tkn = occurrences.begin(); tkn != occurrences.end(); ++tkn) { stc->IndicatorFillRange(tkn->first, tkn->second); } }
MiniStyledTextCtrl::MiniStyledTextCtrl(wxWindow* pParent, int id, const wxPoint& pos, const wxSize& size, long style): cbStyledTextCtrl(pParent, id, pos, size, style) { Init(); ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("editor")); if (cfg->ReadBool(_T("/highlight_occurrence/enabled"), true)) { const int theIndicator = 10; wxColour highlightColour(Manager::Get()->GetColourManager()->GetColour(wxT("editor_highlight_occurrence"))); IndicatorSetStyle(theIndicator, wxSCI_INDIC_HIGHLIGHT); IndicatorSetForeground(theIndicator, highlightColour ); #ifndef wxHAVE_RAW_BITMAP IndicatorSetUnder(theIndicator,true); #endif } const int thePermIndicator = 12; IndicatorSetStyle(thePermIndicator, wxSCI_INDIC_HIGHLIGHT); IndicatorSetForeground(thePermIndicator, wxColour(Manager::Get()->GetColourManager()->GetColour(wxT("editor_highlight_occurrence_permanently"))) ); #ifndef wxHAVE_RAW_BITMAP IndicatorSetUnder(thePermIndicator,true); #endif const int theFindFoudIndicator = 21; IndicatorSetStyle(theFindFoudIndicator, wxSCI_INDIC_HIGHLIGHT); IndicatorSetForeground(theFindFoudIndicator, wxColour(cfg->ReadColour(_T("/incremental_search/text_found_colour"), wxColour(160, 32, 240))) ); #ifndef wxHAVE_RAW_BITMAP IndicatorSetUnder(theFindFoudIndicator,true); #endif const int theFindHighlightIndicator = 22; IndicatorSetStyle(theFindHighlightIndicator, wxSCI_INDIC_HIGHLIGHT); IndicatorSetForeground(theFindHighlightIndicator, wxColour(cfg->ReadColour(_T("/incremental_search/highlight_colour"), wxColour(255, 165, 0))) ); #ifndef wxHAVE_RAW_BITMAP IndicatorSetUnder(theFindHighlightIndicator,true); #endif }
void Highlighter::HighlightOccurrencesOfSelection(cbEditor* ctrl)const { // chosen a high value for indicator, hoping not to interfere with the indicators used by some lexers // if they get updated from deprecated oldstyle indicators somedays. cbStyledTextCtrl *control = ctrl->GetControl(); const int theIndicator = 10; std::pair<long, long> curr; control->GetSelection(&curr.first, &curr.second); control->SetIndicatorCurrent(theIndicator); if (m_OldHighlightSelectionCtrl == control && m_HighlightSelectedOccurencesLastPos == curr) // whatever the current state is, we've already done it once return; m_HighlightSelectedOccurencesLastPos = curr; m_OldHighlightSelectionCtrl = control; int eof = control->GetLength(); // Set Styling: // clear all style indications set in a previous run (is also done once after text gets unselected) control->IndicatorClearRange(0, eof); // if there is no text selected, it stops here and does not hog the cpu further if (curr.first == curr.second) return; // check if the selected text has space, tab or new line in it wxString selectedText(control->GetTextRange(curr.first, curr.second)); if (selectedText.find_first_of(wxT(" \t\n")) != wxString::npos) return; ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("editor")); // check if the feature is enabled if (!cfg->ReadBool(_T("/highlight_occurrence/enabled"), true)) return; // selected text has a minimal length of controlled by the user (by default it is 3) wxString::size_type minLength = std::max(cfg->ReadInt(_T("/highlight_occurrence/min_length"), 3), 1); if (selectedText.length() >= minLength) { wxColour highlightColour(Manager::Get()->GetColourManager()->GetColour(wxT("editor_highlight_occurrence"))); if ( ctrl->GetLeftSplitViewControl() ) { ctrl->GetLeftSplitViewControl()->IndicatorSetStyle(theIndicator, wxSCI_INDIC_HIGHLIGHT); ctrl->GetLeftSplitViewControl()->IndicatorSetForeground(theIndicator, highlightColour ); #ifndef wxHAVE_RAW_BITMAP // If wxWidgets is build without rawbitmap-support, the indicators become opaque // and hide the text, so we show them under the text. // Not enabled as default, because the readability is a little bit worse. ctrl->GetLeftSplitViewControl()->IndicatorSetUnder(theIndicator,true); #endif } if ( ctrl->GetRightSplitViewControl() ) { ctrl->GetRightSplitViewControl()->IndicatorSetStyle(theIndicator, wxSCI_INDIC_HIGHLIGHT); ctrl->GetRightSplitViewControl()->IndicatorSetForeground(theIndicator, highlightColour ); #ifndef wxHAVE_RAW_BITMAP ctrl->GetRightSplitViewControl()->IndicatorSetUnder(theIndicator,true); #endif } int flag = 0; if (cfg->ReadBool(_T("/highlight_occurrence/case_sensitive"), true)) { flag |= wxSCI_FIND_MATCHCASE; } if (cfg->ReadBool(_T("/highlight_occurrence/whole_word"), true)) { flag |= wxSCI_FIND_WHOLEWORD; } // list all selections and sort them typedef std::vector<std::pair<long, long> > Selections; Selections selections; int count = control->GetSelections(); for (int ii = 0; ii < count; ++ii) { selections.push_back(Selections::value_type(control->GetSelectionNStart(ii), control->GetSelectionNEnd(ii))); } std::sort(selections.begin(), selections.end()); Selections::const_iterator currSelection = selections.begin(); // search for every occurence int lengthFound = 0; // we need this to work properly with multibyte characters for ( int pos = control->FindText(0, eof, selectedText, flag, &lengthFound); pos != wxSCI_INVALID_POSITION ; pos = control->FindText(pos+=selectedText.Len(), eof, selectedText, flag, &lengthFound) ) { // check if the found text is selected // if it is don't add indicator for it, because it looks ugly bool skip = false; for (; currSelection != selections.end(); ++currSelection) { // the found text is after the current selection, go to the next one if (currSelection->second < pos) continue; // if the end of the found text is not before the current selection start // then it must match and it should be skipped if (pos + lengthFound >= currSelection->first) skip = true; break; } if (skip) continue; // does not make sense anymore: check that the found occurrence is not the same as the selected, // since it is not selected in the second view -> so highlight it control->IndicatorFillRange(pos, lengthFound); } } }