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

Reply via email to