diff --git a/lsp/org.eclipse.cdt.lsp.core.tests/src/org/eclipse/cdt/lsp/core/tests/ShowStatusTest.java b/lsp/org.eclipse.cdt.lsp.core.tests/src/org/eclipse/cdt/lsp/core/tests/ShowStatusTest.java new file mode 100644 index 00000000000..cf9d15a0b4f --- /dev/null +++ b/lsp/org.eclipse.cdt.lsp.core.tests/src/org/eclipse/cdt/lsp/core/tests/ShowStatusTest.java @@ -0,0 +1,41 @@ +/******************************************************************************* + * Copyright (c) 2020 ArSysOp and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Alexander Fedorov (ArSysOp) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.lsp.core.tests; + +import static org.junit.Assert.assertEquals; + +import org.eclipse.cdt.lsp.internal.core.LspCoreMessages; +import org.eclipse.cdt.lsp.internal.core.ShowStatus; +import org.eclipse.osgi.util.NLS; +import org.junit.Test; + +public class ShowStatusTest { + + @Test + public void busy() { + StringBuilder sb = new StringBuilder(); + ShowStatus show = new ShowStatus(() -> "Busy", sb::append); + show.accept(() -> 100500); + assertEquals(NLS.bind(LspCoreMessages.ShowStatus_busy, "Busy", 100500), sb.toString()); + } + + @Test + public void idle() { + StringBuilder sb = new StringBuilder(); + ShowStatus show = new ShowStatus(() -> "Idle", sb::append); + show.accept(() -> 0); + assertEquals(NLS.bind(LspCoreMessages.ShowStatus_idle, "Idle"), sb.toString()); + } + +} diff --git a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/internal/cquery/CqueryMessages.java b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/internal/cquery/CqueryMessages.java index ec310694880..e279b7888e3 100644 --- a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/internal/cquery/CqueryMessages.java +++ b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/internal/cquery/CqueryMessages.java @@ -24,8 +24,7 @@ public class CqueryMessages extends NLS { } public static String CquerySymbolKind_e_illegal_value; - public static String Server2ClientProtocolExtension_cquery_busy; - public static String Server2ClientProtocolExtension_cquery_idle; + public static String Server2ClientProtocolExtension_cquery_name; public static String StorageClass_e_illegal_value; private CqueryMessages() { diff --git a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/internal/cquery/CqueryMessages.properties b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/internal/cquery/CqueryMessages.properties index 26bf2ea054f..2bc2141f500 100644 --- a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/internal/cquery/CqueryMessages.properties +++ b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/internal/cquery/CqueryMessages.properties @@ -13,6 +13,5 @@ ############################################################################### CquerySymbolKind_e_illegal_value=Illegal value {0} for cquery symbol kind -Server2ClientProtocolExtension_cquery_busy=CQuery : Busy | {0} Jobs -Server2ClientProtocolExtension_cquery_idle=CQuery : Idle +Server2ClientProtocolExtension_cquery_name=CQuery StorageClass_e_illegal_value=Illegal enum value: {0} diff --git a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/core/Server2ClientProtocolExtension.java b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/core/Server2ClientProtocolExtension.java index ec9767e4fb6..36a45ae2799 100644 --- a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/core/Server2ClientProtocolExtension.java +++ b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/core/Server2ClientProtocolExtension.java @@ -28,11 +28,11 @@ import org.eclipse.cdt.internal.cquery.CqueryMessages; import org.eclipse.cdt.internal.cquery.ui.HighlightingNames; import org.eclipse.cdt.internal.ui.editor.SemanticHighlightingManager.HighlightedPosition; import org.eclipse.cdt.internal.ui.editor.SemanticHighlightingManager.HighlightingStyle; +import org.eclipse.cdt.lsp.internal.core.ShowStatus; import org.eclipse.cdt.lsp.internal.text.ResolveDocumentUri; +import org.eclipse.cdt.lsp.internal.ui.StatusLineMessage; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.PreferenceConstants; -import org.eclipse.jface.action.StatusLineContributionItem; -import org.eclipse.jface.action.StatusLineManager; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.text.BadLocationException; @@ -45,45 +45,26 @@ import org.eclipse.jface.text.TextPresentation; import org.eclipse.lsp4e.LanguageClientImpl; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.jsonrpc.services.JsonNotification; -import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.widgets.Display; -import org.eclipse.ui.IWorkbenchWindow; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.internal.WorkbenchWindow; //FIXME: AF: currently this extension is cquery-specific and it should be contributed from cquery-specific part @SuppressWarnings("restriction") public class Server2ClientProtocolExtension extends LanguageClientImpl { private final ResolveDocumentUri uri; + private final ShowStatus progress; public Server2ClientProtocolExtension() { this.uri = new ResolveDocumentUri(); + this.progress = new ShowStatus(() -> CqueryMessages.Server2ClientProtocolExtension_cquery_name, + new StatusLineMessage()); } @JsonNotification("$cquery/progress") public final void indexingProgress(IndexingProgressStats stats) { - - Display.getDefault().asyncExec(() -> { - final String cqueryStatusFieldId = "org.eclipse.cdt.lsp.core.status"; //$NON-NLS-1$ - final int width = 28; - IWorkbenchWindow[] workbenchWindows = PlatformUI.getWorkbench().getWorkbenchWindows(); - for (IWorkbenchWindow window : workbenchWindows) { - StatusLineManager statusLine = ((WorkbenchWindow) window).getStatusLineManager(); - StatusLineContributionItem cqueryStatusField = (StatusLineContributionItem) statusLine - .find(cqueryStatusFieldId); - if (cqueryStatusField == null) { - cqueryStatusField = new StatusLineContributionItem(cqueryStatusFieldId, width); - statusLine.add(cqueryStatusField); - } - String msg = stats.getTotalJobs() > 0 - ? NLS.bind(CqueryMessages.Server2ClientProtocolExtension_cquery_busy, stats.getTotalJobs()) - : CqueryMessages.Server2ClientProtocolExtension_cquery_idle; - cqueryStatusField.setText(msg); - } - }); + progress.accept(stats::getTotalJobs); } @JsonNotification("$cquery/setInactiveRegions") diff --git a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/LspCoreMessages.java b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/LspCoreMessages.java index eb7649656b1..fa17f5e41bb 100644 --- a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/LspCoreMessages.java +++ b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/LspCoreMessages.java @@ -24,6 +24,8 @@ public class LspCoreMessages extends NLS { } public static String CPPStreamConnectionProvider_e_unsupported; + public static String ShowStatus_busy; + public static String ShowStatus_idle; private LspCoreMessages() { } diff --git a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/LspCoreMessages.properties b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/LspCoreMessages.properties index bb6ba35d9df..a471c5007cd 100644 --- a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/LspCoreMessages.properties +++ b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/LspCoreMessages.properties @@ -13,3 +13,5 @@ ############################################################################### CPPStreamConnectionProvider_e_unsupported=Unsupported Language Server +ShowStatus_busy={0} : Busy | {1} Jobs +ShowStatus_idle={0} : Idle diff --git a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/ShowStatus.java b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/ShowStatus.java new file mode 100644 index 00000000000..9116457bb9b --- /dev/null +++ b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/ShowStatus.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2020 ArSysOp and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Alexander Fedorov (ArSysOp) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.lsp.internal.core; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +import org.eclipse.osgi.util.NLS; + +public final class ShowStatus implements Consumer> { + + private final Supplier name; + private final Consumer target; + + public ShowStatus(Supplier name, Consumer target) { + this.name = name; + this.target = target; + } + + @Override + public void accept(Supplier jobs) { + target.accept(message(jobs.get())); + } + + private String message(int total) { + return total > 0 ? // + NLS.bind(LspCoreMessages.ShowStatus_busy, name.get(), total) : // + NLS.bind(LspCoreMessages.ShowStatus_idle, name.get()); + } + +} diff --git a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/ui/StatusLineMessage.java b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/ui/StatusLineMessage.java new file mode 100644 index 00000000000..f348e96203b --- /dev/null +++ b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/ui/StatusLineMessage.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (c) 2020 ArSysOp and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Alexander Fedorov (ArSysOp) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.lsp.internal.ui; + +import java.util.Arrays; +import java.util.Optional; +import java.util.function.Consumer; + +import org.eclipse.jface.action.StatusLineContributionItem; +import org.eclipse.jface.action.StatusLineManager; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.internal.WorkbenchWindow; + +@SuppressWarnings("restriction") +public class StatusLineMessage implements Consumer { + + private final int width = 28; + private final String id = "org.eclipse.cdt.lsp.ui.status"; //$NON-NLS-1$ + + @Override + public void accept(String message) { + Display.getDefault().asyncExec(() -> // + Arrays.stream(PlatformUI.getWorkbench().getWorkbenchWindows())// + .map(this::ensure)// + .forEach(item -> item.setText(message))); + } + + private StatusLineContributionItem ensure(IWorkbenchWindow window) { + //FIXME: find via MToolControl with "org.eclipse.ui.StatusLine" identifier + StatusLineManager line = ((WorkbenchWindow) window).getStatusLineManager(); + return Optional.ofNullable(line.find(id))// + .filter(StatusLineContributionItem.class::isInstance)// + .map(StatusLineContributionItem.class::cast)// + .orElseGet(() -> create(line)); + } + + private StatusLineContributionItem create(StatusLineManager line) { + StatusLineContributionItem item = new StatusLineContributionItem(id, width); + line.add(item); + return item; + } +}