Skip to content

Commit 2e2a84c

Browse files
committed
Add Sorting Functionality for Quick Search Results
This commit adds sorting functionality to the Quick Search results, allowing users to sort entries by Line Number, Text, and Path. Fixes : #1940
1 parent e37e158 commit 2e2a84c

File tree

1 file changed

+79
-8
lines changed

1 file changed

+79
-8
lines changed

bundles/org.eclipse.text.quicksearch/src/org/eclipse/text/quicksearch/internal/ui/QuickSearchDialog.java

Lines changed: 79 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import java.util.ArrayList;
3333
import java.util.Arrays;
3434
import java.util.Collections;
35+
import java.util.Comparator;
3536
import java.util.Deque;
3637
import java.util.LinkedList;
3738
import java.util.List;
@@ -840,19 +841,47 @@ public void getName(AccessibleEvent e) {
840841
// new ScrollListener(list.getTable().getVerticalBar());
841842
// new SelectionChangedListener(list);
842843

844+
int[] sortColumnIndex = {-1};
845+
boolean[] sortDirectionAscending = {true};
846+
Table table = list.getTable();
843847
TableViewerColumn col = new TableViewerColumn(list, SWT.RIGHT);
848+
TableColumn column = col.getColumn();
849+
column.setText(Messages.QuickSearchDialog_line);
850+
column.setWidth(40);
851+
column.addSelectionListener(new SelectionAdapter() {
852+
@Override
853+
public void widgetSelected(SelectionEvent e) {
854+
Comparator<LineItem> lineNumberComparator = Comparator.comparingInt(LineItem::getLineNumber);
855+
handleColumnSort( table, 0, lineNumberComparator, sortColumnIndex, sortDirectionAscending);
856+
}
857+
});
844858
col.setLabelProvider(LINE_NUMBER_LABEL_PROVIDER);
845-
col.getColumn().setText(Messages.QuickSearchDialog_line);
846-
col.getColumn().setWidth(40);
859+
847860
col = new TableViewerColumn(list, SWT.LEFT);
848-
col.getColumn().setText(Messages.QuickSearchDialog_text);
861+
column = col.getColumn();
862+
column.setText(Messages.QuickSearchDialog_text);
863+
column.setWidth(400);
864+
column.addSelectionListener(new SelectionAdapter() {
865+
@Override
866+
public void widgetSelected(SelectionEvent e) {
867+
Comparator<LineItem> textComparator = Comparator.comparing( LineItem::getText);
868+
handleColumnSort( table, 1, textComparator, sortColumnIndex, sortDirectionAscending);
869+
}
870+
});
849871
col.setLabelProvider(LINE_TEXT_LABEL_PROVIDER);
850-
col.getColumn().setWidth(400);
872+
851873
col = new TableViewerColumn(list, SWT.LEFT);
852-
col.getColumn().setText(Messages.QuickSearchDialog_path);
874+
column = col.getColumn();
875+
column.setText(Messages.QuickSearchDialog_path);
876+
column.setWidth(150);
877+
column.addSelectionListener(new SelectionAdapter() {
878+
@Override
879+
public void widgetSelected(SelectionEvent e) {
880+
Comparator<LineItem> lineItemComparator = Comparator.comparing( item -> item.getFile().getFullPath().toString());
881+
handleColumnSort( table, 2,lineItemComparator, sortColumnIndex, sortDirectionAscending);
882+
}
883+
});
853884
col.setLabelProvider(LINE_FILE_LABEL_PROVIDER);
854-
col.getColumn().setWidth(150);
855-
856885
new TableResizeHelper(list).enableResizing();
857886

858887
//list.setLabelProvider(getItemsListLabelProvider());
@@ -951,6 +980,25 @@ public void keyPressed(KeyEvent e) {
951980
return dialogArea;
952981
}
953982

983+
private void handleColumnSort(Table table, int columnIndex, Comparator sorter,int[] sortColumnIndex, boolean[] sortDirectionAscending) {
984+
if (sortColumnIndex[0] == columnIndex) {
985+
sortDirectionAscending[0] = !sortDirectionAscending[0];
986+
} else {
987+
sortColumnIndex[0] = columnIndex;
988+
sortDirectionAscending[0] = true;
989+
}
990+
table.setSortColumn(table.getColumn(columnIndex));
991+
table.setSortDirection(sortDirectionAscending[0] ? SWT.UP : SWT.DOWN);
992+
993+
if(sortDirectionAscending[0]) {
994+
contentProvider.setComparator(sorter);
995+
} else {
996+
contentProvider.setComparator(sorter.reversed());
997+
}
998+
contentProvider.sortList();
999+
refreshWidgets();
1000+
}
1001+
9541002
private Composite createNestedComposite(Composite parent, int numRows, boolean equalRows) {
9551003
Composite nested = new Composite(parent, SWT.NONE);
9561004
{
@@ -1227,6 +1275,7 @@ protected IDialogSettings getDialogSettings() {
12271275
public void refreshWidgets() {
12281276
if (list != null && !list.getTable().isDisposed()) {
12291277
int itemCount = contentProvider.getNumberOfElements();
1278+
contentProvider.sortList();
12301279
list.setItemCount(itemCount);
12311280
if (itemCount < MAX_RESULTS) {
12321281
listLabel.setText(NLS.bind(Messages.QuickSearchDialog_listLabel, itemCount));
@@ -1468,7 +1517,7 @@ private void applyPathMatcher() {
14681517
private class ContentProvider implements IStructuredContentProvider, ILazyContentProvider {
14691518

14701519
private List items;
1471-
1520+
private Comparator<LineItem> comparator;
14721521
/**
14731522
* Creates new instance of <code>ContentProvider</code>.
14741523
*/
@@ -1511,6 +1560,9 @@ public void refresh() {
15111560
*/
15121561
@Override
15131562
public Object[] getElements(Object inputElement) {
1563+
if(comparator!=null) {
1564+
items.sort(comparator);
1565+
}
15141566
return items.toArray();
15151567
}
15161568

@@ -1551,6 +1603,25 @@ public void updateElement(int index) {
15511603

15521604
}
15531605

1606+
/**
1607+
* Sorts the current search results based on current comparator
1608+
*/
1609+
public void sortList() {
1610+
if(comparator==null) {
1611+
return;
1612+
}
1613+
items.sort(comparator);
1614+
}
1615+
1616+
/**
1617+
* Sets a custom comparator for comparing LineItem objects.
1618+
*
1619+
* @param comparator a <code>Comparator<code> object that defines the custom comparison logic.
1620+
*/
1621+
public void setComparator(Comparator<LineItem> comparator) {
1622+
this.comparator = comparator;
1623+
}
1624+
15541625
}
15551626

15561627
/**

0 commit comments

Comments
 (0)