GWT MVP & Multiple Areas Doubt

302 views
Skip to first unread message

vehdra music

unread,
Dec 3, 2011, 3:07:26 PM12/3/11
to Google Web Toolkit
In my app I have layout like gmail. A header, a left panel (with a
menu), a main content area (with a header and a content area).

Example:

---------------------------------------------------------------
| username logout|
------------------------------------------------------------------
| aside | add, delete, other action |
| menu | ----------------------------------------------------|
| | filter by a, b, c |
| | ----------------------------------------------------|
| | maincontent (ie: celltable) |
| | |
| | |
| | |
| | |
| | |
-------------------------------------------------------------------

Aside Menu will be created after the user logins and remains during
the entire session.

The same for the header.

Now, my doubt is about the main content area (actions panel, filters
panel and main content panel).

What I did to get this layout working is:

1. I created two widgets, MainDisplayFilters and MainDisplayActions.
2. I created an AppLayout and injected those widgets.
3. In every one of my views, for example UsersListView, I inject
MainDisplayFilters and MainDisplayActions, clear the widgets, and add
to the widgets the buttons for the actions and the filters that I need
in the current activity.

I really DONT like this approach :) but I can't figure how can I do it
in a better way. Should I create an ActionsActivityMapper and a
FiltersActivityMapper, and diferent activities / views for this panels
for every place that the user goes? For example, if the user goes to
UserListPlace, load the UserListActionsActvity (with it owns view) and
the UserListFiltersActivity? It doesn't make many sense, I think.

I was reading about Thomas Broyer post http://tbroyer.posterous.com/gwt-21-activities-nesting-yagni
but actions panels and filters panels are in someway connected to the
maincontent activity, that's why I believe that I don't need more than
one ActivityMapper.

I neither don't like the idea to have the actions panel + the filters
panel + content panel all in one view, beacause if in the future I
want to change something in the layout (for example add a pagination
control on the right of my actions panel), I would have to do it in
every view.

Wich one would be the best way to handle a layout like this?

Thomas Broyer

unread,
Dec 3, 2011, 7:53:35 PM12/3/11
to google-we...@googlegroups.com
If your 3 parts are tightly linked (you have different actions and different filters for each different "main content"), given that they're displayed next to each other, then you only need one activity.

I'd however try to code them as three distinct "components" (widgets) linked only through events (true events with event-handlers using addHandler, or simply using callbacks). That should make it easier maintain the whole thing (otherwise your "main content with actions and filters" could grow and become unmaintainable) but more importantly, if you think you could visually separate them later, that would make it easier (in that event, route the events through the event bus and "you're done"). It would make it possible/easier to reuse one part in different views (e.g. if most/all lists have the same set of actions).

I'm afraid there's no "one size fits all" approach; it (in part) depends how you imagine your app will evolve. The whole idea of activities are to decouple things, it doesn't make sense for things that are tightly coupled (unless they're separated visually into non-adjacent areas). The idea is that, for instance, a "main menu", a "list of things" and "details about one thing" could all appear on the screen at the same time on a desktop, but appear as "sequential screens" on a smart phone (and using MVP within an activity, you can in addition decouple the view –wide on a desktop, narrower on a smartphone– from the behavior)

To me, however, your current design is clearly not the best (or i misunderstood it): why use MainDisplayFilters and MainDisplayActions as singletons that you clear/populate each time instead of simply using distinct instances in each view?

vehdra music

unread,
Dec 4, 2011, 2:31:48 PM12/4/11
to Google Web Toolkit

On Dec 3, 9:53 pm, Thomas Broyer <t.bro...@gmail.com> wrote:
> If your 3 parts are tightly linked (you have different actions and
> different filters for each different "main content"), given that they're
> displayed next to each other, then you only need one activity.
>
> I'd however try to code them as three distinct "components" (widgets)
> linked only through events (true events with event-handlers using
> addHandler, or simply using callbacks).

So, for example I will have to create with (or without) UIBinder a
widget for every actions menu or filters menu that I need (dispite of
reusing anyone when I could). For example UsersListActions widget and
UsersListsFilter widget.

On more doubt. Wich one would be the way to communicate between this
widgets (actions and filters panels) and the current presenter (in my
case, the current activity)?

That should make it easier maintain
> the whole thing (otherwise your "main content with actions and filters"
> could grow and become unmaintainable) but more importantly, if you think
> you could visually separate them later, that would make it easier (in that
> event, route the events through the event bus and "you're done"). It would
> make it possible/easier to reuse one part in different views (e.g. if
> most/all lists have the same set of actions).
>
> I'm afraid there's no "one size fits all" approach; it (in part) depends
> how you imagine your app will evolve. The whole idea of activities are to
> decouple things, it doesn't make sense for things that are tightly coupled
> (unless they're separated visually into non-adjacent areas). The idea is
> that, for instance, a "main menu", a "list of things" and "details about
> one thing" could all appear on the screen at the same time on a desktop,
> but appear as "sequential screens" on a smart phone (and using MVP within
> an activity, you can in addition decouple the view –wide on a desktop,
> narrower on a smartphone– from the behavior)
>
> To me, however, your current design is clearly not the best (or i
> misunderstood it): why use MainDisplayFilters and MainDisplayActions as
> singletons that you clear/populate each time instead of simply using
> distinct instances in each view?

I did it in this way because I don't know how can I tell to my
presenter from some widget to perform some action (ie: delete some
users) or how to communicate to the vie.

For example, on the start method of UserListActivity I make a rpc to
load the users and populate my UsersListViewImpl. IE: How can I tell
to my UsersListsActions widget that there are n users? Or how can I
know from my UsersListsActions widget how many rows are selected in my
UsersListViewImpl? How can I tell from my UsersListsActions to my
UserListPresenter to delete some users?

Please sorry if I am asking some dumb question because my low level of
knowlegde :)

I was reading and reading GWT & MVP but I am just a little dizzy.

Thomas Broyer

unread,
Dec 4, 2011, 4:44:14 PM12/4/11
to google-we...@googlegroups.com


On Sunday, December 4, 2011 8:31:48 PM UTC+1, vehdra music wrote:

On Dec 3, 9:53 pm, Thomas Broyer <t.br...@gmail.com> wrote:
> If your 3 parts are tightly linked (you have different actions and
> different filters for each different "main content"), given that they're
> displayed next to each other, then you only need one activity.
>
> I'd however try to code them as three distinct "components" (widgets)
> linked only through events (true events with event-handlers using
> addHandler, or simply using callbacks).

So, for example I will have to create with (or without) UIBinder a
widget for every actions menu or filters menu that I need (dispite of
reusing anyone when I could). For example UsersListActions widget and
UsersListsFilter widget.


Hard (impossible?) to answer without knowing more about your specific needs, but do the Simplest Thing That Could Possibly Work™

On more doubt. Wich one would be the way to communicate between this
widgets (actions and filters panels) and the current presenter (in my
case, the current activity)?

Your widgets are part of the view, and your presenter is, well, the presenter for the view (you can segregate the widgets behind "sub interfaces").
What I understood is that you're using singletons and when you need them, you tell them "forget everything, and know this is what you should know/do". I'm just saying that instead of singletons and "forget everything", you should create instances that the activity/view *owns* and are initialized once and for all.

Reply all
Reply to author
Forward
0 new messages