DS-Pokemon-Rom-Editor/DS_Map/ScintillaUtils/SearchManager.cs
2021-08-06 02:09:14 +02:00

136 lines
3.8 KiB
C#

using System;
using System.Windows.Forms;
namespace ScintillaNET.Utils {
internal class SearchManager {
public Form MainProgram { get; private set; }
public Scintilla textAreaScintilla { get; private set; }
public Panel searchPanel { get; private set; }
public TextBox searchBox { get; private set; }
public string lastSearched = "";
public int LastSearchIndex { get; private set; }
public bool SearchIsOpen = false;
public SearchManager(Form mainprogram, Scintilla TextArea, TextBox SearchBox, Panel SearchPanel) {
this.MainProgram = mainprogram;
this.textAreaScintilla = TextArea;
this.searchBox = SearchBox;
this.searchPanel = SearchPanel;
}
public void Find(bool next, bool incremental, string searchThis = null) {
bool firstTimeResearchingThis = lastSearched != searchThis;
lastSearched = searchThis == null ? searchBox.Text : searchThis;
if (lastSearched.Length > 0) {
if (next) {
// SEARCH FOR THE NEXT OCCURRENCE
// Search the document at the last search index
textAreaScintilla.TargetStart = LastSearchIndex - 1;
textAreaScintilla.TargetEnd = LastSearchIndex + (lastSearched.Length + 1);
textAreaScintilla.SearchFlags = SearchFlags.None;
// Search, and if not found..
if (!incremental || textAreaScintilla.SearchInTarget(lastSearched) == -1) {
// Search the document from the caret onwards
textAreaScintilla.TargetStart = textAreaScintilla.CurrentPosition;
textAreaScintilla.TargetEnd = textAreaScintilla.TextLength;
textAreaScintilla.SearchFlags = SearchFlags.None;
// Search, and if not found..
if (textAreaScintilla.SearchInTarget(lastSearched) == -1) {
// Search again from top
textAreaScintilla.TargetStart = 0;
textAreaScintilla.TargetEnd = textAreaScintilla.TextLength;
// Search, and if not found..
if (textAreaScintilla.SearchInTarget(lastSearched) == -1) {
// clear selection and exit
textAreaScintilla.ClearSelections();
return;
}
}
}
} else {
// SEARCH FOR THE PREVIOUS OCCURRENCE
// Search the document from the beginning to the caret
textAreaScintilla.TargetStart = textAreaScintilla.CurrentPosition-1;
textAreaScintilla.TargetEnd = 0;
textAreaScintilla.SearchFlags = SearchFlags.None;
// Search, and if not found..
if (textAreaScintilla.SearchInTarget(lastSearched) == -1) {
// Search again from the caret onwards
textAreaScintilla.TargetStart = textAreaScintilla.CurrentPosition;
textAreaScintilla.TargetEnd = textAreaScintilla.TextLength;
// Search, and if not found..
if (textAreaScintilla.SearchInTarget(lastSearched) == -1) {
// clear selection and exit
textAreaScintilla.ClearSelections();
return;
}
}
}
// Select the occurance
this.LastSearchIndex = textAreaScintilla.TargetStart;
textAreaScintilla.SetSelection(textAreaScintilla.TargetEnd, textAreaScintilla.TargetStart);
textAreaScintilla.ScrollCaret();
}
searchBox.Focus();
}
public void OpenSearch() {
if (!SearchIsOpen) {
SearchIsOpen = true;
InvokeIfNeeded(MainProgram, delegate () {
searchPanel.Visible = true;
searchBox.Text = lastSearched;
searchBox.Focus();
searchBox.SelectAll();
});
} else {
InvokeIfNeeded(MainProgram, delegate() {
searchBox.Focus();
searchBox.SelectAll();
});
}
}
public void CloseSearch() {
if (SearchIsOpen) {
SearchIsOpen = false;
InvokeIfNeeded(MainProgram, delegate() {
searchPanel.Visible = false;
//CurBrowser.GetBrowser().StopFinding(true);
});
}
}
public void InvokeIfNeeded(Form MainProgram, Action action) {
if (MainProgram.InvokeRequired) {
MainProgram.BeginInvoke(action);
} else {
action.Invoke();
}
}
}
}