Tried it, that’s kinda cool. One comment, maybe display the message on top left or above the cursor so you can read easier.
Don From: nebula-dev [mailto:nebula-dev-boun...@eclipse.org] On Behalf Of Wim Jongman Sent: Wednesday, April 7, 2021 9:19 AM To: Nebula Dev <nebula-dev@eclipse.org> Subject: [EXTERNAL] Re: [nebula-dev] Urgent Nebula bugs to tackle? EXT email: be mindful of links/attachments. Sometimes we want to give the user a little feedback. "Saved!", "Please wait...", "Loading..", without having to resort to those bulky dialogs. For these use cases, we have invented MiniMessage. MM can display a small message at the current mouse pointer or above a specific control. Just paste the source code below into a UI project package and run as java application. It would be nice if this would make it into Nebula It would be nice if the message box could be round/square/balloon/closable, etc.. Let me know what you think. Cheers, Wim /******************************************************************************* * Copyright (c) 2021 Remain Software - http://remainsoftware.com * All rights reserved. This program is made available under the terms * of the Eclipse Public License v1.0 which does not accompanies this * distribution but is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Wim Jongman - Initial Impl *******************************************************************************/ package com.remainsoftware.common.licensing.util; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; /** * Shows a mini message for those cases when you want to supply a quick feedback * to the user without going through the workflow of showing a dialog and * letting the user press Ok. * <p/> * Usage: * <p/> * <code> * // Show mini message just above cursor position * MiniMessage.get(2000).open("Saved!"); * // Show mini message just above this control * MiniMessage(2000).get(1000).above(Control).open("Saved!"); * </code> * * @author Wim Jongman * */ public class MiniMessage { public static void main(String[] args) { Display display = new Display(); MiniMessage.get(2000).openWait("Hello, World!"); display.dispose(); } /** Error message */ public static final String ERROR = "E"; /** Info message (default) */ public static final String INFO = "I"; /** Warning message */ public static final String WARNING = "W"; private StyledText fStyledText; private Shell fShell; private int fWaitBeforeFade = 0; private Control fControl; private String fType = INFO; /** * Constructs a {@link MiniMessage}. * * @param waitBeforeFade waits n milliseconds before the message starts to fade. * Fading itself takes about a second. */ private MiniMessage(int waitBeforeFade) { this.fWaitBeforeFade = waitBeforeFade; } /** * Factory method to get a new MiniMessage. * * @param pWaitBeforeFade * @return */ public static MiniMessage get(int pWaitBeforeFade) { return new MiniMessage(pWaitBeforeFade); } public MiniMessage above(Control pControl) { this.fControl = pControl; return this; } /** * Opens the {@link MiniMessage} just above the current cursor position showing * the passed text. It does not wait until the message has faded. * * @param text the text to show as the mini message. * * @see #openWait(String) */ public void openWait(String message) { doOpen(message, true); } /** * Submits the mini message to the UI queue so that it is processed at the next * convenience. Use this is you want to show some message after for example the * createPartControl method in a view has finished. * * Must be called from the UI thread. * * @param text the text to show as the mini message. * * @see #open(String) * @see #openWait(String) */ public void submit(final String text) { Runnable runner = () -> doOpen(text, false); Display.getCurrent().asyncExec(runner); } /** * Opens the {@link MiniMessage} just above the current cursor position showing * the passed text. It does not wait until the message has faded. * * @param text the text to show as the mini message. * * @see #openWait(String) */ public void open(String text) { doOpen(text, false); } private void doOpen(String text, boolean wait) { try { Display display = Display.getDefault(); fShell = new Shell(display, SWT.NO_TRIM | SWT.ON_TOP | SWT.NO_FOCUS); GridLayout gridLayout = new GridLayout(1, false); gridLayout.marginWidth = 1; gridLayout.marginHeight = 1; gridLayout.verticalSpacing = 0; gridLayout.horizontalSpacing = 0; createContents(fShell, SWT.NONE); setText(text); Control focusControl = display.getFocusControl(); fShell.setLayout(gridLayout); fShell.pack(); fShell.setLocation(getLocation()); fShell.open(); fShell.layout(); if (focusControl != null) { focusControl.forceFocus(); } Thread thread = new Thread(new Fader(fWaitBeforeFade)); thread.run(); while (wait && !fShell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } catch (Exception e) { e.printStackTrace(); } } private Point getLocation() { if (fControl == null || fControl.isDisposed() || fControl.getParent() == null) { Display display = Display.getDefault(); return display.getCursorLocation(); } return fControl.getParent().toDisplay( fControl.getLocation().x + (fControl.getSize().x / 2) - (fShell.getSize().x / 2), fControl.getLocation().y - fControl.getSize().y - 10); } private void setText(String string) { fStyledText.setText(string); } /** * Create the composite. * * @param parent * @param style */ private void createContents(Composite parent, int style) { GridLayout gridLayout = new GridLayout(); gridLayout.marginWidth = 9; gridLayout.marginHeight = 9; parent.setLayout(gridLayout); fStyledText = new StyledText(parent, SWT.BORDER); fStyledText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); fStyledText.setEditable(false); fStyledText.setEnabled(false); if (ERROR.equals(fType)) { fStyledText.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_DARK_RED)); fStyledText.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE)); } if (WARNING.equals(fType)) { fStyledText.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_DARK_YELLOW)); fStyledText.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE)); } else { fStyledText.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_DARK_GREEN)); fStyledText.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE)); } } private class Fader implements Runnable { int fAlpha = 255; private int fTimerWait = 10; private int fWaitBeforeFade = 0; public Fader(int waitBeforeFade) { this.fWaitBeforeFade = waitBeforeFade; } @Override public void run() { if (fWaitBeforeFade > 0) { fShell.getDisplay().timerExec(fWaitBeforeFade, this); fWaitBeforeFade = 0; } else if (fAlpha <= 5) { fShell.dispose(); } else { fAlpha -= 5; if (fAlpha < 255) { fShell.setAlpha(fAlpha); } fShell.getDisplay().timerExec(fTimerWait, this); } } } /** * Sets the type. If the type is not any of the valid values then * {@link MiniMessage#INFO} will be assumed. * * @param pType * @return this object for chaining * * @see #ERROR * @see #WARNING * @see #INFO */ public MiniMessage setType(String pType) { fType = pType; return this; } } On Wed, Apr 7, 2021 at 5:16 PM Matthias Paul Scholz <matthias.paul.sch...@gmail.com<mailto:matthias.paul.sch...@gmail.com>> wrote: Hi Wim, Sounds interesting. :) Tell me more ... Best, MP Wim Jongman <wim.jong...@gmail.com<mailto:wim.jong...@gmail.com>> schrieb am Mi., 7. Apr. 2021, 12:36: Hey Matthias, How about a shiny new widget. I have a prototype of a new widget that we already use internally. It is very useful but primitive and I think you can make a great widget out of it. WDYT? Cheers, Wim On Wed, Apr 7, 2021 at 8:13 AM Matthias Paul Scholz <matthias.paul.sch...@gmail.com<mailto:matthias.paul.sch...@gmail.com>> wrote: Hi Wim and Laurent, Are there any urgent Nebula bugs that needs particular attention? I'd like to give back something to the project and maybe you could point me to something that has high priority here. How about https://bugs.eclipse.org/bugs/show_bug.cgi?id=572568, for instance? Best, MP _______________________________________________ nebula-dev mailing list nebula-dev@eclipse.org<mailto:nebula-dev@eclipse.org> To unsubscribe from this list, visit https://www.eclipse.org/mailman/listinfo/nebula-dev _______________________________________________ nebula-dev mailing list nebula-dev@eclipse.org<mailto:nebula-dev@eclipse.org> To unsubscribe from this list, visit https://www.eclipse.org/mailman/listinfo/nebula-dev _______________________________________________ nebula-dev mailing list nebula-dev@eclipse.org<mailto:nebula-dev@eclipse.org> To unsubscribe from this list, visit https://www.eclipse.org/mailman/listinfo/nebula-dev
_______________________________________________ nebula-dev mailing list nebula-dev@eclipse.org To unsubscribe from this list, visit https://www.eclipse.org/mailman/listinfo/nebula-dev