2016-01-29 1 views
0

Я использую WxWidgets 3.0.2 в статическом юникода сборки на Windows, 10. Я использую wxStyledTextCtrl, который рядом 1-к-1 отображение Scintilla а.WxWidgets/wxStyledTextCtrl - Выделите все вхождения, когда дважды щелкнув

Я ищу функциональность, похожую на Notepad ++, где при двойном нажатии на что-то в редакторе все элементы этого элемента выделяются. Трудно найти хорошие примеры, которые действительно демонстрируют стиль. Я просмотрел документацию по wxWidgets, документацию Scintilla, источник Notepad ++ и источник кода :: Blocks (последние два используют Scintilla в качестве текстовых редакторов), но до сих пор им не повезло.

Я пробовал много разных вариантов следующего кода, и он никогда не работает правильно. Либо ничего не выделено, а весь документ выделен. Я знаю, что чего-то не хватает, но я не могу понять, что.

//textarea is a wxStyledTextCtrl* 
textarea->StyleSetBackground(styleHightlightAllSelected, wxColor(80, 255, 80)); 

wxString selectedText = textarea->GetSelectedText(); 
int selSize = selectedText.size(); 
int selStart = textarea->GetSelectionStart(); 

int pos = 0; 
int curr = 0; 
int maxPos = textarea->GetLastPosition(); 
while(pos != -1){ 
    pos = textarea->FindText(curr, maxPos, selectedText); 
    if(pos == selStart){ //skip the actual highlighted item 
     curr = pos + selSize; 
    } else if(pos != -1){ 
     textarea->StartStyling(pos, 0x1F); 
     textarea->SetStyling(selSize, styleHightlightAllSelected); 
     curr = pos + selSize; 
    } 
} 

Поисковая часть цикла успешно находит выделенный текст; это просто, что стиль, похоже, не утихает.

Так мои вопросы, которые я не мог найти ответы на следующие:

  1. styleHightlightAllSelected является int набор 100. Когда я его в 0, то весь документ позеленел, когда дважды щелкнув. Я вижу, что стили 32-39 предопределены. Существуют ли другие типы, которые предопределены, но не документированы действительно. смысл, 100 нормально?
  2. Должен ли я установить весь стиль вверх, или я могу просто задать цвет фона, как я делаю выше?
  3. Достаточно ли сделать StartStyling() и SetStyling(), когда я нахожу появление и делаю с ним, или есть еще?
  4. StartStyling() В wxWidgets есть аргумент маски, но аналог Scintilla этого не делает. Я не могу четко определить, что я должен установить. Кажется, что 31 (00011111) сохранит 5 существующих битов стилизации/лексера? По сути, я не уверен, что установить это, если все, что я хочу сделать, это изменить цвет фона каждого события.
  5. Моя программа будет регулярно обрабатывать файлы размером в десятки и более мегабайт, поэтому я должен просто выделять видимые видимости и настраивать при необходимости при прокрутке/прыжке? В настоящий момент он ищет и (не удается) установить стиль в каждом вхождении, и он занимает около секунды в файле размером 50 МБ. Я заметил, что в том же файле, загруженном в Notepad ++, это происходит мгновенно, поэтому я предполагаю, что он делает это на видимой основе?
+0

Вы читаете раздел [Styling] (http://www.scintilla.org/ScintillaDoc.html#Styling) в документах Scintilla? Кажется, ответ на большинство ваших вопросов. – ekhumoro

+0

Как я уже упоминал в своем вопросе, я это прочитал. Это не помогло, так как документация Scintilla - это не более чем длинная версия имени функции/сообщения большую часть времени. – sorinev

ответ

0

Я закончил вопрос об этом на странице проблем github для проекта Notepad ++, и правильный способ сделать это - не использовать стили, а вместо этого использовать индикаторы. Так что мой код выше изменения к этому:

int maxPos = textarea->GetLastPosition(); 

textarea->IndicatorClearRange(0, maxPos); 
textarea->IndicatorSetStyle(styleHightlightAllSelected, wxSTC_INDIC_ROUNDBOX); 
textarea->IndicatorSetAlpha(styleHightlightAllSelected, 100); 
textarea->IndicatorSetUnder(styleHightlightAllSelected, true); 
textarea->IndicatorSetForeground(styleHightlightAllSelected, wxColor(0, 255, 0)); 

wxString selectedText = textarea->GetSelectedText(); 
int selSize = selectedText.size(); 
int selStart = textarea->GetSelectionStart(); 

int pos = 0; 
int curr = 0; 
vector<int> selectionList; 
while((pos = textarea->FindText(curr, maxPos, selectedText)) != -1){ 
    selectionList.push_back(pos); 
    curr = pos + selSize; 
} 

textarea->SetIndicatorCurrent(styleHightlightAllSelected); 
for(unsigned int i = 0; i < selectionList.size(); i++){ 
    if(selectionList[i] != selStart){ 
     textarea->IndicatorFillRange(selectionList[i], selSize); 
    } 
} 

Это не учитывает, однако, только выделяя видимый диапазон и только выделение новых вхождений, как они прокрутки в поле зрения (я добавлю позже), так что для файлов то есть десятки мегабайт в размере, для завершения подсветки потребуется 2-3 секунды.

Смежные вопросы