Skip to content

Commit 5787b9a

Browse files
committed
7091: JOverflow Instance View table should be sortable by clicking headers
Reviewed-by: hirt
1 parent c725078 commit 5787b9a

File tree

1 file changed

+59
-6
lines changed

1 file changed

+59
-6
lines changed

application/org.openjdk.jmc.joverflow.ui/src/main/java/org/openjdk/jmc/joverflow/ui/viewers/JavaThingTreeViewer.java

Lines changed: 59 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
2-
* Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
3-
* Copyright (c) 2019, Red Hat Inc. All rights reserved.
2+
* Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved.
3+
* Copyright (c) 2019, 2021, Red Hat Inc. All rights reserved.
44
*
55
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
66
*
@@ -42,9 +42,12 @@
4242
import org.eclipse.jface.viewers.ITreeContentProvider;
4343
import org.eclipse.jface.viewers.TreeViewer;
4444
import org.eclipse.jface.viewers.TreeViewerColumn;
45+
import org.eclipse.jface.viewers.Viewer;
46+
import org.eclipse.jface.viewers.ViewerComparator;
4547
import org.eclipse.swt.SWT;
48+
import org.eclipse.swt.events.SelectionEvent;
49+
import org.eclipse.swt.events.SelectionListener;
4650
import org.eclipse.swt.widgets.Composite;
47-
4851
import org.openjdk.jmc.joverflow.heap.model.JavaField;
4952
import org.openjdk.jmc.joverflow.heap.model.JavaObject;
5053
import org.openjdk.jmc.joverflow.heap.model.JavaObjectArray;
@@ -53,17 +56,49 @@
5356
import org.openjdk.jmc.joverflow.ui.model.JavaThingItem;
5457

5558
public class JavaThingTreeViewer<T extends JavaThingItem> extends TreeViewer {
59+
private static final String ELLIPSIS = "..."; //$NON-NLS-1$
60+
private static final String NAME_COLUMN = "Name"; //$NON-NLS-1$
61+
private static final String SIZE_COLUMN = "Size"; //$NON-NLS-1$
62+
private static final String VALUE_COLUMN = "Value"; //$NON-NLS-1$
63+
5664
public JavaThingTreeViewer(Composite parent, int style) {
5765
super(parent, style);
5866

5967
setContentProvider(new JavaThingItemContentProvider());
6068

61-
createTreeViewerColumn("Name", T::getName);
62-
createTreeViewerColumn("Value", T::getValue);
63-
createTreeViewerColumn("Size", T::getSize);
69+
createTreeViewerColumn(NAME_COLUMN, T::getName);
70+
createTreeViewerColumn(VALUE_COLUMN, T::getValue);
71+
createTreeViewerColumn(SIZE_COLUMN, T::getSize);
6472

6573
getTree().setLinesVisible(true);
6674
getTree().setHeaderVisible(true);
75+
76+
setComparator(new ViewerComparator() {
77+
@Override
78+
public int compare(Viewer viewer, Object e1, Object e2) {
79+
JavaThingItem item1 = (JavaThingItem) e1;
80+
JavaThingItem item2 = (JavaThingItem) e2;
81+
// keep the overflow ellipsis row at the bottom of the view
82+
if (item1.getName().equals(ELLIPSIS)) {
83+
return SWT.MAX;
84+
} else if (item2.getName().equals(ELLIPSIS)) {
85+
return -SWT.MAX;
86+
}
87+
int result = 0;
88+
int sortDirection = getTree().getSortDirection() == SWT.UP ? 1
89+
: getTree().getSortDirection() == SWT.DOWN ? -1 : SWT.NONE;
90+
if (getTree().getSortColumn() != null) {
91+
if (getTree().getSortColumn().getText().equals(NAME_COLUMN)) {
92+
result = item1.getName().compareTo(item2.getName());
93+
} else if (getTree().getSortColumn().getText().equals(VALUE_COLUMN)) {
94+
result = item1.getValue().compareTo(item2.getValue());
95+
} else if (getTree().getSortColumn().getText().equals(SIZE_COLUMN)) {
96+
result = Integer.parseInt(item1.getSize()) - Integer.parseInt(item2.getSize());
97+
}
98+
}
99+
return result * sortDirection;
100+
}
101+
});
67102
}
68103

69104
private void createTreeViewerColumn(String label, Function<T, String> labelProvider) {
@@ -79,6 +114,24 @@ public String getText(Object element) {
79114
return labelProvider.apply((T) element);
80115
}
81116
});
117+
118+
column.getColumn().addSelectionListener(new SelectionListener() {
119+
@Override
120+
public void widgetSelected(SelectionEvent e) {
121+
int newSortDirection = SWT.DOWN;
122+
if (getTree().getSortColumn() != null
123+
&& getTree().getSortColumn().getText().equals(column.getColumn().getText())) {
124+
newSortDirection = getTree().getSortDirection() == SWT.UP ? SWT.DOWN : SWT.UP;
125+
}
126+
getTree().setSortColumn(column.getColumn());
127+
getTree().setSortDirection(newSortDirection);
128+
refresh();
129+
}
130+
131+
@Override
132+
public void widgetDefaultSelected(SelectionEvent e) {
133+
}
134+
});
82135
}
83136

84137
private class JavaThingItemContentProvider implements ITreeContentProvider {

0 commit comments

Comments
 (0)