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 *
4242import org .eclipse .jface .viewers .ITreeContentProvider ;
4343import org .eclipse .jface .viewers .TreeViewer ;
4444import org .eclipse .jface .viewers .TreeViewerColumn ;
45+ import org .eclipse .jface .viewers .Viewer ;
46+ import org .eclipse .jface .viewers .ViewerComparator ;
4547import org .eclipse .swt .SWT ;
48+ import org .eclipse .swt .events .SelectionEvent ;
49+ import org .eclipse .swt .events .SelectionListener ;
4650import org .eclipse .swt .widgets .Composite ;
47-
4851import org .openjdk .jmc .joverflow .heap .model .JavaField ;
4952import org .openjdk .jmc .joverflow .heap .model .JavaObject ;
5053import org .openjdk .jmc .joverflow .heap .model .JavaObjectArray ;
5356import org .openjdk .jmc .joverflow .ui .model .JavaThingItem ;
5457
5558public 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