4040import org .eclipse .jface .viewers .TreePath ;
4141import org .eclipse .jface .viewers .TreeSelection ;
4242import org .eclipse .jface .viewers .TreeViewer ;
43+ import org .eclipse .jface .viewers .ViewerComparator ;
4344import org .eclipse .lsp4e .LSPEclipseUtils ;
4445import org .eclipse .lsp4e .LanguageServerPlugin ;
4546import org .eclipse .lsp4e .LanguageServerWrapper ;
5354import org .eclipse .swt .widgets .Control ;
5455import org .eclipse .ui .IActionBars ;
5556import org .eclipse .ui .navigator .CommonViewer ;
56- import org .eclipse .ui .navigator .CommonViewerComparator ;
5757import org .eclipse .ui .texteditor .ITextEditor ;
5858import org .eclipse .ui .views .contentoutline .IContentOutlinePage ;
5959
@@ -75,6 +75,9 @@ public class CNFOutlinePage implements IContentOutlinePage, ILabelProviderListen
7575
7676 private final LanguageServerWrapper wrapper ;
7777
78+ @ Nullable
79+ private static Boolean canUseCommonViewerComparator ;
80+
7881 public CNFOutlinePage (LanguageServerWrapper wrapper , @ Nullable ITextEditor textEditor ) {
7982 preferences = InstanceScope .INSTANCE .getNode (LanguageServerPlugin .PLUGIN_ID );
8083 preferences .addPreferenceChangeListener (this );
@@ -90,7 +93,7 @@ public void createControl(final Composite parent) {
9093 if (document != null ) {
9194 outlineViewer .setInput (new OutlineViewerInput (document , wrapper , textEditor ));
9295 }
93- outlineViewer .setComparator (new CommonViewerComparator ());
96+ outlineViewer .setComparator (createComparator ());
9497 outlineViewer .getLabelProvider ().addListener (this );
9598 final var textEditor = this .textEditor ;
9699 if (textEditor != null ) {
@@ -124,6 +127,34 @@ public void createControl(final Composite parent) {
124127 }
125128 }
126129
130+ /**
131+ * Try to be compatible with older Eclipse versions (before 4.39) where
132+ * CommonViewerComparator is not available.
133+ *
134+ * @return comparator for the outline
135+ */
136+ private static ViewerComparator createComparator () {
137+ if (checkIfCommonViewerComparatorAvailable ()) {
138+ return Comparators .createCommonViewerComparator ();
139+ }
140+ // Can be removed if Eclipse 4.38 is no longer supported
141+ return Comparators .createCommonViewerSorter ();
142+ }
143+
144+ private static boolean checkIfCommonViewerComparatorAvailable () {
145+ if (canUseCommonViewerComparator != null ) {
146+ return canUseCommonViewerComparator .booleanValue ();
147+ }
148+ try {
149+ Class .forName ("org.eclipse.ui.navigator.CommonViewerComparator" ); //$NON-NLS-1$
150+ canUseCommonViewerComparator = Boolean .TRUE ;
151+ return true ;
152+ } catch (ClassNotFoundException e ) {
153+ canUseCommonViewerComparator = Boolean .FALSE ;
154+ return false ;
155+ }
156+ }
157+
127158 /**
128159 * Returns the range of the given selection and null otherwise.
129160 *
0 commit comments