Added click on search result to open match location

This commit is contained in:
Hans-Albert Maritz 2015-03-10 15:12:49 +11:00
parent 057dfa66ab
commit ceccd53123
1 changed files with 61 additions and 18 deletions

View File

@ -1,4 +1,4 @@
module dlangide.ui.searchPanel; module dlangide.ui.searchPanel;
import dlangui; import dlangui;
@ -6,19 +6,24 @@ import dlangui.core.editable;
import dlangide.ui.frame; import dlangide.ui.frame;
import dlangide.ui.wspanel; import dlangide.ui.wspanel;
import dlangui.widgets.tabs; //TODO: This is required for navigating to decleration of TabWidget / BUG //import dlangui.widgets.tabs; //TODO: This is required for navigating to decleration of TabWidget / BUG
import dlangide.workspace.workspace; import dlangide.workspace.workspace;
import dlangide.workspace.project; import dlangide.workspace.project;
import std.string; import std.string;
import std.conv; import std.conv;
interface SearchResultClickHandler {
bool onSearchResultClick(int line);
}
class SearchLogWidget : LogWidget { class SearchLogWidget : LogWidget {
Signal!SearchResultClickHandler searchResultClickHandler;
this(string ID){ this(string ID){
super(ID); super(ID);
scrollLock = false; scrollLock = false;
} }
override protected CustomCharProps[] handleCustomLineHighlight(int line, dstring txt, ref CustomCharProps[] buf) { override protected CustomCharProps[] handleCustomLineHighlight(int line, dstring txt, ref CustomCharProps[] buf) {
@ -72,14 +77,29 @@ class SearchLogWidget : LogWidget {
return colors; return colors;
} }
} }
auto getCaretPos() { return _caretPos; }
override bool onMouseEvent(MouseEvent event) {
super.onMouseEvent(event);
if (event.action == MouseAction.ButtonDown && event.button == MouseButton.Left) {
int line = _caretPos.line;
if (searchResultClickHandler.assigned) {
searchResultClickHandler(line);
return true;
}
}
return false;
}
} }
class SearchWidget : TabWidget { class SearchWidget : TabWidget {
HorizontalLayout _layout; HorizontalLayout _layout;
EditLine _findText; EditLine _findText;
LogWidget _resultLog; SearchLogWidget _resultLog;
protected IDEFrame _frame; protected IDEFrame _frame;
protected SearchMatchList[] _matchedList;
struct SearchMatch { struct SearchMatch {
int line; int line;
@ -95,6 +115,7 @@ class SearchWidget : TabWidget {
this(string ID, IDEFrame frame) { this(string ID, IDEFrame frame) {
super(ID); super(ID);
_frame = frame; _frame = frame;
layoutHeight(FILL_PARENT); layoutHeight(FILL_PARENT);
//Remove title, more button //Remove title, more button
@ -117,15 +138,16 @@ class SearchWidget : TabWidget {
addChild(_layout); addChild(_layout);
_resultLog = new SearchLogWidget("SearchLogWidget"); _resultLog = new SearchLogWidget("SearchLogWidget");
_resultLog.searchResultClickHandler = &onMatchClick;
_resultLog.layoutHeight(FILL_PARENT); _resultLog.layoutHeight(FILL_PARENT);
addChild(_resultLog); addChild(_resultLog);
} }
void searchInProject(ProjectItem project, ref SearchMatchList[] matchList, dstring text) { void searchInProject(ProjectItem project, dstring text) {
if(project.isFolder == true) { if (project.isFolder == true) {
ProjectFolder projFolder = cast(ProjectFolder) project; ProjectFolder projFolder = cast(ProjectFolder) project;
for(int i = 0; i < projFolder.childCount; i++) { for (int i = 0; i < projFolder.childCount; i++) {
searchInProject(projFolder.child(i), matchList, text); searchInProject(projFolder.child(i), text);
} }
} }
else { else {
@ -137,42 +159,63 @@ class SearchWidget : TabWidget {
foreach(int lineIndex, dstring line; content.lines) { foreach(int lineIndex, dstring line; content.lines) {
auto colIndex = line.indexOf(text); auto colIndex = line.indexOf(text);
if( colIndex != -1) { if (colIndex != -1) {
match.matches ~= SearchMatch(lineIndex+1, colIndex, line); match.matches ~= SearchMatch(lineIndex, colIndex, line);
} }
} }
if(match.matches.length > 0) { if(match.matches.length > 0) {
matchList ~= match; _matchedList ~= match;
} }
} }
} }
bool findText(dstring source) { bool findText(dstring source) {
Log.d("Finding " ~ source); Log.d("Finding " ~ source);
SearchMatchList[] matches;
_resultLog.text = ""d; _resultLog.text = ""d;
_matchedList = [];
//TODO Should not crash when in homepage. //TODO Should not crash when in homepage.
foreach(Project project; _frame._wsPanel.workspace.projects) { foreach(Project project; _frame._wsPanel.workspace.projects) {
Log.d("Searching in project " ~ project.filename); Log.d("Searching in project " ~ project.filename);
searchInProject(project.items, matches, source); searchInProject(project.items, source);
} }
if(matches.length == 0) { if (_matchedList.length == 0) {
_resultLog.appendText(to!dstring("No matches found.\n")); _resultLog.appendText(to!dstring("No matches found.\n"));
} }
else { else {
foreach(SearchMatchList fileMatchList; matches) { foreach(SearchMatchList fileMatchList; _matchedList) {
_resultLog.appendText("Matches in "d ~ to!dstring(fileMatchList.filename) ~ '\n'); _resultLog.appendText("Matches in "d ~ to!dstring(fileMatchList.filename) ~ '\n');
foreach(SearchMatch match; fileMatchList.matches) { foreach(SearchMatch match; fileMatchList.matches) {
_resultLog.appendText(" --> ["d ~ to!dstring(match.line) ~ ":"d ~ to!dstring(match.col) ~ "]" ~ match.lineContent ~"\n"d); _resultLog.appendText(" --> ["d ~ to!dstring(match.line+1) ~ ":"d ~ to!dstring(match.col) ~ "]" ~ match.lineContent ~"\n"d);
} }
} }
} }
return true; return true;
} }
bool onMatchClick(int line) {
line++;
foreach(matchList; _matchedList){
line--;
if (line == 0) {
_frame.openSourceFile(matchList.filename);
_frame.currentEditor.setFocus();
return true;
}
foreach(match; matchList.matches) {
line--;
if (line == 0) {
_frame.openSourceFile(matchList.filename);
_frame.currentEditor.setCaretPos(match.line, to!int(match.col));
_frame.currentEditor.setFocus();
return true;
}
}
}
return false;
}
} }