As a matter of fact, some time ago we have implemented a similar sort of
Notifier in our company that has some useful features like configurable up
time, optional acknowledgeability, sounds and stacking of notifications.
Maybe that would be a good opportunity to enhance the Nebula Notifier with
some of those features now and thus make it even more useful for Users?

Am Do., 8. Apr. 2021 um 08:05 Uhr schrieb Matthias Paul Scholz <
matthias.paul.sch...@gmail.com>:

> 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