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,8 @@ public class CNFOutlinePage implements IContentOutlinePage, ILabelProviderListen
7575
7676 private final LanguageServerWrapper wrapper ;
7777
78+ private static Boolean canUseCommonViewerComparator ;
79+
7880 public CNFOutlinePage (LanguageServerWrapper wrapper , @ Nullable ITextEditor textEditor ) {
7981 preferences = InstanceScope .INSTANCE .getNode (LanguageServerPlugin .PLUGIN_ID );
8082 preferences .addPreferenceChangeListener (this );
@@ -90,7 +92,7 @@ public void createControl(final Composite parent) {
9092 if (document != null ) {
9193 outlineViewer .setInput (new OutlineViewerInput (document , wrapper , textEditor ));
9294 }
93- outlineViewer .setComparator (new CommonViewerComparator ());
95+ outlineViewer .setComparator (createComparator ());
9496 outlineViewer .getLabelProvider ().addListener (this );
9597 final var textEditor = this .textEditor ;
9698 if (textEditor != null ) {
@@ -124,6 +126,34 @@ public void createControl(final Composite parent) {
124126 }
125127 }
126128
129+ /**
130+ * Try to be compatible with older Eclipse versions (before 4.39) where
131+ * CommonViewerComparator is not available.
132+ *
133+ * @return comparator for the outline
134+ */
135+ private static ViewerComparator createComparator () {
136+ if (checkIfCommonViewerComparatorAvailable ()) {
137+ return Comparators .createCommonViewerComparator ();
138+ }
139+ // Can be removed if Eclipse 4.38 is no longer supported
140+ return Comparators .createCommonViewerSorter ();
141+ }
142+
143+ private static boolean checkIfCommonViewerComparatorAvailable () {
144+ if (canUseCommonViewerComparator != null ) {
145+ return canUseCommonViewerComparator .booleanValue ();
146+ }
147+ try {
148+ Class .forName ("org.eclipse.ui.navigator.CommonViewerComparator" ); //$NON-NLS-1$
149+ canUseCommonViewerComparator = Boolean .TRUE ;
150+ return true ;
151+ } catch (ClassNotFoundException e ) {
152+ canUseCommonViewerComparator = Boolean .FALSE ;
153+ return false ;
154+ }
155+ }
156+
127157 /**
128158 * Returns the range of the given selection and null otherwise.
129159 *
0 commit comments