Hi Wim, Tried it. Pretty nice. :)
Yet, just out of curiosity: is there a particular reason why you didn't use a custom org.eclipse.jface.dialogs.Dialog internally which takes care of all the rendering already? That would make the framework taking care of stuff like positioning, themabilty and so on. I have noticed that there's alreday some similar widget available from Nebula, i.e.. the Notifier: https://wiki.eclipse.org/Nebula_Notifier Maybe it might be a good idea to enhance that one and make it configurable in regard to coloring and the position where it opens instead of creating another new wiget? As a user, I'd prefer to have a smaller set of highly configurable widgets instead of a multitude of widgets with some of them doing similar stuff. What do you think? Best, MP Am Mi., 7. Apr. 2021 um 18:19 Uhr schrieb Wim Jongman <wim.jong...@gmail.com >: > 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> wrote: > >> Hi Wim, >> >> Sounds interesting. :) >> Tell me more ... >> >> Best, >> MP >> >> Wim Jongman <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> 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 >>>> 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 >>> >> _______________________________________________ >> nebula-dev mailing list >> 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 >
_______________________________________________ nebula-dev mailing list nebula-dev@eclipse.org To unsubscribe from this list, visit https://www.eclipse.org/mailman/listinfo/nebula-dev