4

I'm a GWT and Java newbie trying to figure out how to create a synchronous (modal) dialog in GWT, but I'm having difficulty. The DialogBox class has a flag that says:

modal - true if keyboard and mouse events for widgets not contained by the dialog should be ignored

But that doesn't make the dialog synchronous.

I read one suggestion that said that I need to place the code that processes the dialog's data entered by the user inside the OK button handler. I don't like that because it makes the dialog responsible for displaying the data and processing it too. This results in a poor "Separation of Concerns" and violates the "Single Responsibility Principle" of good design.

I placed the code I want to execute in the OK button handler and now want to have my GWT dialog used in two places in my code. In one case, the user's data from the dialog is added to a table when the OK button is pressed. In the other case, the data in the table is modified when the OK button is pressed. If I could create a truly synchronous dialog, I could handle the OK button outside the dialog when it returns from execution and easily reused the dialog.

If forced to use my current asynchronous model, I'll need to pass in additional data as described here. This seems like a lot of work for such a common task. Did I miss something? Are there other options?

Community
  • 1
  • 1
Mitch
  • 1,716
  • 3
  • 25
  • 41

3 Answers3

4

The modal flag basically makes the dialog take the focus of the UI. So nothing else can be clicked or interacted with except for what is in the dialog.

Unfortunately as you'll know, JavaScript (GWT) is inherently asynchronous - in the browser there is no JS code executing until the user does something to trigger an event. So it is events we have to respond to.

As far as I am aware GWT does not provide a synchronous dialog. If it did, it would mean that a blocking section of code is introduced. With JavaScript being single threaded, that would lock up your application in busy waiting - meaning that you couldn't do any meaningful processing in the dialog itself or anywhere else for that matter.

This is how I would handle it:

  • Create my own modal dialog class, wrapping a GWT DialogBox where I would implement the dialog outcomes eg: SAVE / OK / CANCEL buttons.
  • Provide a notification event or callback - onDialogExit for example, where the dialog result / OK / CANCEL / SAVE / ANYTHING would be provided to an interested party. When the user takes an action (such as clicking a button) to exit the dialog, simply raise the correct event. The event could also return a value if some data needs to result from the dialog.
  • Provide a callback for the event where ever dialog outcomes need to be handled.

This is very similar to the function pointer link you had mentioned - you'd just be writing your own event.

filip-fku
  • 3,265
  • 1
  • 21
  • 19
  • Thanks. Just knowing that there is no synchronous dialog in GWT is extremely helpful. Now I can stop looking for it. Thanks for the suggestion too. – Mitch Aug 20 '11 at 18:59
0

There is a better way than the asynchronous approach.

boolean okPressed = Window.confirm("Your Message Here");

Your application holds until the user presses 'ok' or 'cancel' and you can process the boolean returned.

Unfortunately, you cannot change the text of the 'ok' and 'cancel' buttons.

B. Miller
  • 1
  • 4
0

Check out DialogBox. You can use one of the constructors to make it modal.

maneesh
  • 1,692
  • 1
  • 14
  • 18
  • I'm using the DialogBox class. I'm not sure what exactly the modal flag does, but it doesn't make the code synchronous. I think it may keep focus inside the DialogBox, but I'd have to test that. – Mitch Aug 20 '11 at 06:50