summaryrefslogtreecommitdiffstats
path: root/src/commands/search_string.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/commands/search_string.rs')
-rw-r--r--src/commands/search_string.rs70
1 files changed, 17 insertions, 53 deletions
diff --git a/src/commands/search_string.rs b/src/commands/search_string.rs
index 53d54ea..084fc89 100644
--- a/src/commands/search_string.rs
+++ b/src/commands/search_string.rs
@@ -1,65 +1,29 @@
-use crate::context::AppContext;
-use crate::tab::JoshutoTab;
-use crate::util::search::SearchPattern;
+use crate::context::{AppContext, MatchContext};
use super::cursor_move;
+use super::search;
-pub fn search_string_fwd(curr_tab: &JoshutoTab, pattern: &str) -> Option<usize> {
- let curr_list = curr_tab.curr_list_ref()?;
+pub fn search_string(context: &mut AppContext, pattern: &str, incremental: bool) {
+ let case_sensitivity = context
+ .config_ref()
+ .search_options_ref()
+ .string_case_sensitivity;
- let offset = curr_list.get_index()? + 1;
- let contents_len = curr_list.contents.len();
- for i in 0..contents_len {
- let file_name_lower = curr_list.contents[(offset + i) % contents_len]
- .file_name()
- .to_lowercase();
- if file_name_lower.contains(pattern) {
- return Some((offset + i) % contents_len);
- }
- }
- None
-}
+ let search_context = MatchContext::new_string(pattern, case_sensitivity);
-pub fn search_string_start(curr_tab: &JoshutoTab, pattern: &str) -> Option<usize> {
- let curr_list = curr_tab.curr_list_ref()?;
+ let curr_tab = context.tab_context_ref().curr_tab_ref();
- let contents_len = curr_list.contents.len();
- for i in 0..contents_len {
- let file_name_lower = curr_list.contents[i].file_name().to_lowercase();
- if file_name_lower.contains(pattern) {
- return Some(i);
+ if incremental {
+ if let Some(new_index) = search::search_next_impl(curr_tab, &search_context, 0) {
+ cursor_move::cursor_move(context, new_index);
}
- }
- None
-}
+ } else if let Some(index) = curr_tab.curr_list_ref().and_then(|c| c.get_index()) {
+ let offset = index + 1;
-pub fn search_string_rev(curr_tab: &JoshutoTab, pattern: &str) -> Option<usize> {
- let curr_list = curr_tab.curr_list_ref()?;
-
- let offset = curr_list.get_index()?;
- let contents_len = curr_list.contents.len();
- for i in (0..contents_len).rev() {
- let file_name_lower = curr_list.contents[(offset + i) % contents_len]
- .file_name()
- .to_lowercase();
- if file_name_lower.contains(pattern) {
- return Some((offset + i) % contents_len);
+ if let Some(new_index) = search::search_next_impl(curr_tab, &search_context, offset) {
+ cursor_move::cursor_move(context, new_index);
}
}
- None
-}
-
-pub fn search_string(context: &mut AppContext, pattern: &str, incremental: bool) {
- let pattern = pattern.to_lowercase();
- let curr_tab = context.tab_context_ref().curr_tab_ref();
- let index = if incremental {
- search_string_start(curr_tab, pattern.as_str())
- } else {
- search_string_fwd(curr_tab, pattern.as_str())
- };
- if let Some(index) = index {
- cursor_move::cursor_move(context, index);
- }
- context.set_search_context(SearchPattern::String(pattern));
+ context.set_search_context(search_context);
}