|
|
|
@ -422,7 +422,7 @@ void Source::ClangViewParse::show_type_tooltips(const Gdk::Rectangle &rectangle) |
|
|
|
|
|
|
|
|
|
|
|
//Clang indentation.
|
|
|
|
//Clang indentation.
|
|
|
|
bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) { |
|
|
|
bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) { |
|
|
|
if(spellcheck_suggestions_dialog_shown) { |
|
|
|
if(spellcheck_suggestions_dialog && spellcheck_suggestions_dialog->shown) { |
|
|
|
if(spellcheck_suggestions_dialog->on_key_press(key)) |
|
|
|
if(spellcheck_suggestions_dialog->on_key_press(key)) |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -610,7 +610,7 @@ bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) { |
|
|
|
Source::ClangViewAutocomplete::ClangViewAutocomplete(const boost::filesystem::path &file_path, const boost::filesystem::path& project_path, Glib::RefPtr<Gsv::Language> language): |
|
|
|
Source::ClangViewAutocomplete::ClangViewAutocomplete(const boost::filesystem::path &file_path, const boost::filesystem::path& project_path, Glib::RefPtr<Gsv::Language> language): |
|
|
|
Source::ClangViewParse(file_path, project_path, language), autocomplete_state(AutocompleteState::IDLE) { |
|
|
|
Source::ClangViewParse(file_path, project_path, language), autocomplete_state(AutocompleteState::IDLE) { |
|
|
|
get_buffer()->signal_changed().connect([this](){ |
|
|
|
get_buffer()->signal_changed().connect([this](){ |
|
|
|
if(autocomplete_state==AutocompleteState::SHOWN) |
|
|
|
if(autocomplete_dialog && autocomplete_dialog->shown) |
|
|
|
delayed_reparse_connection.disconnect(); |
|
|
|
delayed_reparse_connection.disconnect(); |
|
|
|
else { |
|
|
|
else { |
|
|
|
if(!has_focus()) |
|
|
|
if(!has_focus()) |
|
|
|
@ -621,7 +621,7 @@ Source::ClangViewParse(file_path, project_path, language), autocomplete_state(Au |
|
|
|
autocomplete_check(); |
|
|
|
autocomplete_check(); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
else { |
|
|
|
if(autocomplete_state==AutocompleteState::STARTING) |
|
|
|
if(autocomplete_state==AutocompleteState::STARTING || autocomplete_state==AutocompleteState::RESTARTING) |
|
|
|
autocomplete_state=AutocompleteState::CANCELED; |
|
|
|
autocomplete_state=AutocompleteState::CANCELED; |
|
|
|
else { |
|
|
|
else { |
|
|
|
auto iter=get_buffer()->get_insert()->get_iter(); |
|
|
|
auto iter=get_buffer()->get_insert()->get_iter(); |
|
|
|
@ -633,19 +633,12 @@ Source::ClangViewParse(file_path, project_path, language), autocomplete_state(Au |
|
|
|
}); |
|
|
|
}); |
|
|
|
get_buffer()->signal_mark_set().connect([this](const Gtk::TextBuffer::iterator& iterator, const Glib::RefPtr<Gtk::TextBuffer::Mark>& mark){ |
|
|
|
get_buffer()->signal_mark_set().connect([this](const Gtk::TextBuffer::iterator& iterator, const Glib::RefPtr<Gtk::TextBuffer::Mark>& mark){ |
|
|
|
if(mark->get_name()=="insert") { |
|
|
|
if(mark->get_name()=="insert") { |
|
|
|
if(autocomplete_state==AutocompleteState::SHOWN) |
|
|
|
if(autocomplete_state==AutocompleteState::STARTING || autocomplete_state==AutocompleteState::RESTARTING) |
|
|
|
autocomplete_dialog->hide(); |
|
|
|
|
|
|
|
if(autocomplete_state==AutocompleteState::STARTING) |
|
|
|
|
|
|
|
autocomplete_state=AutocompleteState::CANCELED; |
|
|
|
autocomplete_state=AutocompleteState::CANCELED; |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
signal_scroll_event().connect([this](GdkEventScroll* event){ |
|
|
|
|
|
|
|
if(autocomplete_state==AutocompleteState::SHOWN) |
|
|
|
|
|
|
|
autocomplete_dialog->hide(); |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
}, false); |
|
|
|
|
|
|
|
signal_key_release_event().connect([this](GdkEventKey* key){ |
|
|
|
signal_key_release_event().connect([this](GdkEventKey* key){ |
|
|
|
if(autocomplete_state==AutocompleteState::SHOWN) { |
|
|
|
if(autocomplete_dialog && autocomplete_dialog->shown) { |
|
|
|
if(autocomplete_dialog->on_key_release(key)) |
|
|
|
if(autocomplete_dialog->on_key_release(key)) |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -654,9 +647,7 @@ Source::ClangViewParse(file_path, project_path, language), autocomplete_state(Au |
|
|
|
}, false); |
|
|
|
}, false); |
|
|
|
|
|
|
|
|
|
|
|
signal_focus_out_event().connect([this](GdkEventFocus* event) { |
|
|
|
signal_focus_out_event().connect([this](GdkEventFocus* event) { |
|
|
|
if(autocomplete_state==AutocompleteState::SHOWN) |
|
|
|
if(autocomplete_state==AutocompleteState::STARTING || autocomplete_state==AutocompleteState::RESTARTING) |
|
|
|
autocomplete_dialog->hide(); |
|
|
|
|
|
|
|
if(autocomplete_state==AutocompleteState::STARTING) |
|
|
|
|
|
|
|
autocomplete_state=AutocompleteState::CANCELED; |
|
|
|
autocomplete_state=AutocompleteState::CANCELED; |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
}); |
|
|
|
}); |
|
|
|
@ -666,6 +657,11 @@ Source::ClangViewParse(file_path, project_path, language), autocomplete_state(Au |
|
|
|
set_status(""); |
|
|
|
set_status(""); |
|
|
|
soft_reparse(); |
|
|
|
soft_reparse(); |
|
|
|
autocomplete_state=AutocompleteState::IDLE; |
|
|
|
autocomplete_state=AutocompleteState::IDLE; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if(autocomplete_state==AutocompleteState::RESTARTING) { |
|
|
|
|
|
|
|
set_status(""); |
|
|
|
|
|
|
|
soft_reparse(); |
|
|
|
|
|
|
|
autocomplete_state=AutocompleteState::IDLE; |
|
|
|
autocomplete_restart(); |
|
|
|
autocomplete_restart(); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
else { |
|
|
|
@ -693,15 +689,13 @@ Source::ClangViewParse(file_path, project_path, language), autocomplete_state(Au |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
set_status(""); |
|
|
|
set_status(""); |
|
|
|
|
|
|
|
autocomplete_state=AutocompleteState::IDLE; |
|
|
|
if (!autocomplete_dialog_rows.empty()) { |
|
|
|
if (!autocomplete_dialog_rows.empty()) { |
|
|
|
autocomplete_state=AutocompleteState::SHOWN; |
|
|
|
|
|
|
|
get_source_buffer()->begin_user_action(); |
|
|
|
get_source_buffer()->begin_user_action(); |
|
|
|
autocomplete_dialog->show(); |
|
|
|
autocomplete_dialog->show(); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
else |
|
|
|
autocomplete_state=AutocompleteState::IDLE; |
|
|
|
|
|
|
|
soft_reparse(); |
|
|
|
soft_reparse(); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
@ -728,7 +722,7 @@ Source::ClangViewParse(file_path, project_path, language), autocomplete_state(Au |
|
|
|
|
|
|
|
|
|
|
|
bool Source::ClangViewAutocomplete::on_key_press_event(GdkEventKey *key) { |
|
|
|
bool Source::ClangViewAutocomplete::on_key_press_event(GdkEventKey *key) { |
|
|
|
last_keyval=key->keyval; |
|
|
|
last_keyval=key->keyval; |
|
|
|
if(autocomplete_state==AutocompleteState::SHOWN) { |
|
|
|
if(autocomplete_dialog && autocomplete_dialog->shown) { |
|
|
|
if(autocomplete_dialog->on_key_press(key)) |
|
|
|
if(autocomplete_dialog->on_key_press(key)) |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -743,7 +737,6 @@ void Source::ClangViewAutocomplete::autocomplete_dialog_setup() { |
|
|
|
autocomplete_dialog_rows.clear(); |
|
|
|
autocomplete_dialog_rows.clear(); |
|
|
|
autocomplete_dialog->on_hide=[this](){ |
|
|
|
autocomplete_dialog->on_hide=[this](){ |
|
|
|
get_source_buffer()->end_user_action(); |
|
|
|
get_source_buffer()->end_user_action(); |
|
|
|
autocomplete_state=AutocompleteState::IDLE; |
|
|
|
|
|
|
|
parsed=false; |
|
|
|
parsed=false; |
|
|
|
soft_reparse(); |
|
|
|
soft_reparse(); |
|
|
|
}; |
|
|
|
}; |
|
|
|
@ -759,7 +752,6 @@ void Source::ClangViewAutocomplete::autocomplete_dialog_setup() { |
|
|
|
} |
|
|
|
} |
|
|
|
get_buffer()->insert(autocomplete_dialog->start_mark->get_iter(), row); |
|
|
|
get_buffer()->insert(autocomplete_dialog->start_mark->get_iter(), row); |
|
|
|
if(hide_window) { |
|
|
|
if(hide_window) { |
|
|
|
autocomplete_state=AutocompleteState::IDLE; |
|
|
|
|
|
|
|
auto para_pos=row.find('('); |
|
|
|
auto para_pos=row.find('('); |
|
|
|
auto angle_pos=row.find('<'); |
|
|
|
auto angle_pos=row.find('<'); |
|
|
|
size_t start_pos=std::string::npos; |
|
|
|
size_t start_pos=std::string::npos; |
|
|
|
@ -793,10 +785,8 @@ void Source::ClangViewAutocomplete::autocomplete_dialog_setup() { |
|
|
|
else { |
|
|
|
else { |
|
|
|
//new autocomplete after for instance when selecting "std::"
|
|
|
|
//new autocomplete after for instance when selecting "std::"
|
|
|
|
auto iter=get_buffer()->get_insert()->get_iter(); |
|
|
|
auto iter=get_buffer()->get_insert()->get_iter(); |
|
|
|
if(iter.backward_char() && *iter==':') { |
|
|
|
if(iter.backward_char() && *iter==':') |
|
|
|
autocomplete_state=AutocompleteState::IDLE; |
|
|
|
|
|
|
|
autocomplete_restart(); |
|
|
|
autocomplete_restart(); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
}; |
|
|
|
@ -815,14 +805,14 @@ void Source::ClangViewAutocomplete::autocomplete_check() { |
|
|
|
prefix_mutex.lock(); |
|
|
|
prefix_mutex.lock(); |
|
|
|
prefix=sm[3].str(); |
|
|
|
prefix=sm[3].str(); |
|
|
|
prefix_mutex.unlock(); |
|
|
|
prefix_mutex.unlock(); |
|
|
|
if(autocomplete_state==AutocompleteState::IDLE && (prefix.size()==0 || prefix[0]<'0' || prefix[0]>'9')) |
|
|
|
if(prefix.size()==0 || prefix[0]<'0' || prefix[0]>'9') |
|
|
|
autocomplete(); |
|
|
|
autocomplete(); |
|
|
|
} |
|
|
|
} |
|
|
|
else if(boost::regex_match(line, sm, within_namespace)) { |
|
|
|
else if(boost::regex_match(line, sm, within_namespace)) { |
|
|
|
prefix_mutex.lock(); |
|
|
|
prefix_mutex.lock(); |
|
|
|
prefix=sm[3].str(); |
|
|
|
prefix=sm[3].str(); |
|
|
|
prefix_mutex.unlock(); |
|
|
|
prefix_mutex.unlock(); |
|
|
|
if(autocomplete_state==AutocompleteState::IDLE && (prefix.size()==0 || prefix[0]<'0' || prefix[0]>'9')) |
|
|
|
if(prefix.size()==0 || prefix[0]<'0' || prefix[0]>'9') |
|
|
|
autocomplete(); |
|
|
|
autocomplete(); |
|
|
|
} |
|
|
|
} |
|
|
|
if(autocomplete_state!=AutocompleteState::IDLE) |
|
|
|
if(autocomplete_state!=AutocompleteState::IDLE) |
|
|
|
@ -832,12 +822,13 @@ void Source::ClangViewAutocomplete::autocomplete_check() { |
|
|
|
void Source::ClangViewAutocomplete::autocomplete() { |
|
|
|
void Source::ClangViewAutocomplete::autocomplete() { |
|
|
|
if(parse_state!=ParseState::PROCESSING) |
|
|
|
if(parse_state!=ParseState::PROCESSING) |
|
|
|
return; |
|
|
|
return; |
|
|
|
if(autocomplete_state==AutocompleteState::STARTING) { |
|
|
|
|
|
|
|
autocomplete_state=AutocompleteState::CANCELED; |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if(autocomplete_state==AutocompleteState::CANCELED) |
|
|
|
if(autocomplete_state==AutocompleteState::CANCELED) |
|
|
|
|
|
|
|
autocomplete_state=AutocompleteState::RESTARTING; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(autocomplete_state!=AutocompleteState::IDLE) |
|
|
|
return; |
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
autocomplete_state=AutocompleteState::STARTING; |
|
|
|
autocomplete_state=AutocompleteState::STARTING; |
|
|
|
|
|
|
|
|
|
|
|
autocomplete_data.clear(); |
|
|
|
autocomplete_data.clear(); |
|
|
|
|