From: "Leaboy" <wlbleaboy(a)126.com>
To: "Vojtech Szocs" <vszocs(a)redhat.com>
Cc: devel(a)ovirt.org
Sent: Friday, August 15, 2014 9:31:34 AM
Subject: Re: [ovirt-devel] popup dialog
which type does result.getReturnValue() got,
public void executed(FrontendActionAsyncResult result) { ... }
result.getReturnValue() returns VdcReturnValueBase
result.getReturnValue().getActionReturnValue() returns
the result of backend command ("action") execution
For example, your backend command does this:
getReturnValue().setActionReturnValue(obj);
Then "obj" is what you get on frontend with:
result.getReturnValue().getActionReturnValue();
And how could I set it in the backend.
在 8/14/14, 21:57, "Vojtech Szocs" <vszocs(a)redhat.com> 写入:
>
>
>----- Original Message -----
>> From: "Leaboy" <wlbleaboy(a)126.com>
>> To: "Vojtech Szocs" <vszocs(a)redhat.com>
>> Cc: devel(a)ovirt.org
>> Sent: Thursday, August 14, 2014 2:12:37 PM
>> Subject: Re: [ovirt-devel] popup dialog
>>
>> Hi:
>> you said that ,I have done, and the dialog
>> Can display, and I can pass a parameter from dialog
>> To the backend executeCommand().
>>
>> Now the question is, after executeCommand(),
>> Hou could I get the return value in the frontend.
>>
>> For example, when I clicked backup button,
>> A dialog is display, now I type some parameters into
>> The dialog, click OK button, the backend executeCommand()
>> Do something, now, I need some value from executeCommand()
>> to frontend.
>
>Sorry, I missed that your question was about executing backend
>command (I thought you referred to Model.executeCommand) ...
>
>Backup dialog's OK button is represented by:
>
> UICommand tempVar = new UICommand("OnBackup", this);
>
>When user clicks OK button, that ^^ UICommand is executed.
>Model's executeCommand should route flow to some onBackup()
>method, I assume you already did this:
>
> // inside TemplateListModel#executeCommand
> ...
> else if ("OnBackup".equals(command.getName())) {
> onBackup();
> }
> ...
>
> // inside TemplateListModel
> private void onBackup() {
> TemplateBackupModel windowModel = (TemplateBackupModel) getWindow();
>
> // do nothing if windowModel is already doing something -or- if
> // windowModel validation failed (i.e. bad/missing user input)
> if (windowModel.getProgress() != null || !windowModel.validate()) {
> return;
> }
>
> // this replaces dialog content UI with "progress" animated image
> // to indicate that a call to backend is about to be initiated
> windowModel.startProgress(null);
>
> // on backend, assume you have TemplateBackupCommand that works
> // with parameter type TemplateBackupParameters
> TemplateBackupParameters params = new TemplateBackupParameters();
> // update params according to window model
> params.setFoo(windowModel.getFoo().getEntity());
>
> // this is the async callback executed when backend command
> // (TemplateBackupCommand in our case) has done its job
> IFrontendActionAsyncCallback callback = new
>IFrontendActionAsyncCallback() {
> @Override
> public void executed(FrontendActionAsyncResult result) {
> TemplateListModel listModel = (TemplateListModel)
>result.getState();
> listModel.postOnBackup(result.getReturnValue());
> }
> };
>
> // call backend
> Frontend.getInstance().runAction(
> VdcActionType.TemplateBackup, params, callback, this);
> }
>
> // still inside TemplateListModel
> private void postOnBackup(VdcReturnValueBase returnValue) {
> // at this point, backend has replied with returnValue,
> // we can remove "progress" animated image in dialog
> getWindow().stopProgress();
>
> // if the backend operation was successful, close the
> // dialog (otherwise the dialog will remain open)
> if (returnValue != null && returnValue.getSucceeded()) {
> setWindow(null);
> }
> }
>
>Regards,
>Vojtech
>
>
>>
>>
>> 在 8/14/14, 19:48, "Vojtech Szocs" <vszocs(a)redhat.com> 写入:
>>
>> >
>> >
>> >----- Original Message -----
>> >> From: "Leaboy" <wlbleaboy(a)126.com>
>> >> To: "Vojtech Szocs" <vszocs(a)redhat.com>
>> >> Cc: devel(a)ovirt.org
>> >> Sent: Thursday, August 14, 2014 6:19:17 AM
>> >> Subject: Re: [ovirt-devel] popup dialog
>> >>
>> >> Hi,Vojtech Szocs:
>> >> Thanks for your help, I have let it work,
>> >>
>> >> The Error I got just because I miss the step 3 you noted.
>> >>
>> >> Another question is how could I got the returnValue after
>> >> executeCommand , and let the returnValue display on the oher
>> >> Popup dialog.
>> >
>> >Please add this into MainTabTemplateView:
>> >
>> > ...
>> > getTable().addActionButton(new
>> >WebAdminButtonDefinition<VmTemplate>(constants.templateBackup()) {
>> > @Override
>> > protected UICommand resolveCommand() {
>> > return getMainModel().getTemplateBackupCommand();
>> > }
>> > });
>> > ...
>> >
>> >This adds a button under "Template" main tab. When clicked, it
executes
>> >given command (getTemplateBackupCommand) on model (TemplateListModel).
>> >
>> >Model's executeCommand() ensures that backup() method is called. Inside
>> >backup() method, you call setWindow(model) which triggers an event - UI
>> >infra handles this event and uses "getModelPopup" (see
TemplateModule)
>> >to resolve "window model" to GWTP PresenterWidget which is then
>>revealed
>> >as popup. This is how dialogs work in UiCommon / UI (GWTP) infra.
>> >
>> >> how could I got the returnValue after executeCommand
>> >
>> >As I wrote above, executeCommand() just calls appropriate method (like
>> >backup) on the list model. That method has no return value (void) since
>> >it uses setWindow(model) to trigger event to notify UI infra to reveal
>> >a dialog.
>> >
>> >If you need to pass data to dialog, for example:
>> >
>> > ...
>> > TemplateBackupModel model = new TemplateBackupModel();
>> > setWindow(model);
>> > ... set window model's title, help tag, hash name ...
>> > model.setSomeData(abc);
>> > model.doSomething();
>> > ...
>> >
>> >In other words, after you call setWindow(model) you can modify state
>> >of window model (TemplateBackupModel) which can be reflected into UI
>> >(TemplateBackupPopupView) by use of editor widgets.
>> >
>> >As for binding window model's (TemplateBackupModel) attributes to UI
>> >(TemplateBackupPopupView) fields:
>> >
>> > // inside TemplateBackupModel
>> > private EntityModel<String> foo;
>> > public EntityModel<String> getFoo() {
>> > return foo;
>> > }
>> > public void setFoo(EntityModel<String> value) {
>> > foo = value;
>> > }
>> >
>> > // inside TemplateBackupPopupView
>> > @UiField
>> > @Path(value = "foo.entity")
>> > StringEntityModelTextBoxEditor fooEditor;
>> >
>> >Please see DataCenterPopupView.java & DataCenterPopupView.ui.xml
>> >(simple dialog view as example) for details.
>> >
>> >Regards,
>> >Vojtech
>> >
>> >>
>> >>
>> >> 在 8/14/14, 0:07, "Vojtech Szocs" <vszocs(a)redhat.com>
写入:
>> >>
>> >> >Hi,
>> >> >
>> >> >forgot to mention, one more thing needs to be done:
>> >> >
>> >> > // in PresenterModule
>> >> > bindPresenterWidget(TemplateBackupPopupPresenterWidget.class,
>> >> > TemplateBackupPopupPresenterWidget.ViewDef.class,
>> >> > TemplateBackupPopupView.class);
>> >> >
>> >> >(Above binds popup PresenterWidget/View within GIN DI context.)
>> >> >
>> >> >Regards,
>> >> >Vojtech
>> >> >
>> >> >
>> >> >----- Original Message -----
>> >> >> From: "Vojtech Szocs" <vszocs(a)redhat.com>
>> >> >> To: "力波 王" <wlbleaboy(a)126.com>
>> >> >> Cc: devel(a)ovirt.org
>> >> >> Sent: Wednesday, August 13, 2014 6:00:08 PM
>> >> >> Subject: Re: [ovirt-devel] popup dialog
>> >> >>
>> >> >> Hi,
>> >> >>
>> >> >> in order to add new dialog, follow these steps:
>> >> >>
>> >> >> 1, create UiCommon model for the dialog, I see you already
did
>>this
>> >> >> (TemplateBackupModel) - however from your code I don't
>>understand
>> >> >> why is there an unused "_asyncQuery" inside model
constructor
>> >> >>
>> >> >> 2, modify existing list model to trigger your new dialog, I
see
>>you
>> >> >> also did this (second code snippet), I assume you put that
code
>> >> >> inside TemplateListModel:
>> >> >>
>> >> >> // inside TemplateListModel#backup - this method should be
>>private
>> >> >> // since UI code executes this method via associated
UICommand
>> >> >> ...
>> >> >> TemplateBackupModel model = new TemplateBackupModel();
>> >> >> setWindow(model);
>> >> >>
>> >>
>>
>>>>>>model.setTitle(ConstantsManager.getInstance().getConstants().template
>>>>>>Ba
>> >>>>ck
>> >> >>upTitle());
>> >> >> model.setHelpTag(HelpTag.template_backup);
>> >> >>
model.setHashName("template_backup");//$NON-NLS-1$
>> >> >> ...
>> >> >>
>> >> >> now, expose UICommand that triggers your dialog like this:
>> >> >>
>> >> >> public UICommand getTemplateBackupCommand() {
>> >> >> return privateTemplateBackupCommand;
>> >> >> }
>> >> >>
>> >> >> private void setTemplateBackupCommand(UICommand value) {
>> >> >> privateExportCommand = value;
>> >> >> }
>> >> >>
>> >> >> // inside TemplateListModel constructor
>> >> >> ...
>> >> >> setTemplateBackupCommand(new
UICommand("TemplateBackup", this));
>> >> >> //$NON-NLS-1$
>> >> >> ...
>> >> >>
>> >> >> // inside TemplateListModel#executeCommand
>> >> >> ...
>> >> >> else if (command == getTemplateBackupCommand()) {
>> >> >> backup();
>> >> >> }
>> >> >> ...
>> >> >>
>> >> >> 3, tell UI (GWTP) infra how to handle your dialog model - in
this
>> >> >> particular case, edit
TemplateModule#getTemplateListProvider:
>> >> >>
>> >> >> ...
>> >> >> if (lastExecutedCommand == model.getEditCommand()) {
>> >> >> return popupProvider.get();
>> >> >> } else if (lastExecutedCommand ==
>>getModel().getExportCommand()) {
>> >> >> return exportPopupProvider.get();
>> >> >> } else if (lastExecutedCommand ==
>> >> >>getModel().getTemplateBackupCommand()) {
>> >> >> return templateBackupProvider.get();
>> >> >> } else {
>> >> >> return super.getModelPopup(source, lastExecutedCommand,
>> >> >>windowModel);
>> >> >> }
>> >> >> ...
>> >> >>
>> >> >> now, add parameter to
TemplateModule#getTemplateListProvider:
>> >> >>
>> >> >> @Provides
>> >> >> @Singleton
>> >> >> public MainModelProvider<VmTemplate,
TemplateListModel>
>> >> >> getTemplateListProvider(
>> >> >> ...
>> >> >> final Provider<TemplateBackupPopupPresenterWidget>
>> >> >> templateBackupPopupProvider) {
>> >> >> ...
>> >> >>
>> >> >> 4, create PresenterWidget & View for your dialog, this is
the
>>visual
>> >> >> part of the dialog (dialog model just encapsulates the
dialog
>> >>logic)
>> >> >>
>> >> >> public class TemplateBackupPopupPresenterWidget extends
>> >> >>
AbstractModelBoundPopupPresenterWidget<TemplateBackupModel,
>> >> >> TemplateBackupPopupPresenterWidget.ViewDef> {
>> >> >>
>> >> >> public interface ViewDef extends
>> >> >>
>>
>>AbstractModelBoundPopupPresenterWidget.ViewDef<TemplateBackupModel>
>> >> >>{
>> >> >> }
>> >> >>
>> >> >> @Inject
>> >> >> public TemplateBackupPopupPresenterWidget(EventBus
eventBus,
>> >>ViewDef
>> >> >> view) {
>> >> >> super(eventBus, view);
>> >> >> }
>> >> >>
>> >> >> }
>> >> >>
>> >> >> ---
>> >> >>
>> >> >> public class TemplateBackupPopupView extends
>> >> >> AbstractModelBoundPopupView<TemplateBackupModel>
implements
>> >> >> TemplateBackupPopupPresenterWidget.ViewDef {
>> >> >>
>> >> >> // you can get some inspiration from VmExportPopupView
>> >> >>
>> >> >> }
>> >> >>
>> >> >> 5, you are done :)
>> >> >>
>> >> >> Vojtech
>> >> >>
>> >> >>
>> >> >> ----- Original Message -----
>> >> >> > From: "力波 王" <wlbleaboy(a)126.com>
>> >> >> > To: devel(a)ovirt.org
>> >> >> > Sent: Tuesday, August 12, 2014 7:57:24 AM
>> >> >> > Subject: [ovirt-devel] popup dialog
>> >> >> >
>> >> >> > Hi, everyone:
>> >> >> > I add a button, named backup in the Template Tab,
>> >> >> > And the click event is ok.
>> >> >> > Now I want add a dialog after clicked the button,
>> >> >> > So, I add a model , but the dialog didn’t display at
all.
>> >> >> >
>> >> >> > So, I want to know is there some necessary class need
>> >> >> > To modify or add?
>> >> >> >
>> >> >> > The model code is like this:
>> >> >> > TemplateBackupModel.java
>> >> >> > ========================================================
>> >> >> > public class TemplateBackupModel extends Model {
>> >> >> >
>> >> >> > private EntityModel privatePassword;
>> >> >> >
>> >> >> > public EntityModel getPassword()
>> >> >> > {
>> >> >> > return privatePassword;
>> >> >> > }
>> >> >> >
>> >> >> > public void setPassword(EntityModel value)
>> >> >> > {
>> >> >> > privatePassword = value;
>> >> >> > }
>> >> >> >
>> >> >> > public TemplateBackupModel(){
>> >> >> >
>> >> >> > setPassword(new EntityModel());
>> >> >> >
>> >> >> > AsyncQuery _asyncQuery = new AsyncQuery();
>> >> >> > _asyncQuery.setModel(this);
>> >> >> > _asyncQuery.asyncCallback = new INewAsyncCallback() {
>> >> >> > @Override
>> >> >> > public void onSuccess(Object model, Object result)
>> >> >> > {
>> >> >> >
>> >> >> > }
>> >> >> > };
>> >> >> >
>> >> >> > }
>> >> >> >
>> >> >> > @Override
>> >> >> > public void eventRaised(Event ev, Object sender,
EventArgs
>>args) {
>> >> >> > super.eventRaised(ev, sender, args);
>> >> >> > }
>> >> >> >
>> >> >> > public boolean validate(){
>> >> >> > return true;
>> >> >> > }
>> >> >> > }
>> >> >> > ========================================================
>> >> >> >
>> >> >> > And created a model in the backup button click callback
like
>>this:
>> >> >> > ========================================================
>> >> >> > public void backup()
>> >> >> > {
>> >> >> >
>> >> >> > if (getWindow() != null)
>> >> >> > {
>> >> >> > return;
>> >> >> > }
>> >> >> >
>> >> >> > TemplateBackupModel model = new TemplateBackupModel();
>> >> >> > setWindow(model);
>> >> >> > model.setTitle("TemplateBackup");//$NON-NLS-1$
>> >> >> >
model.setHashName("TemplateBackup");//$NON-NLS-1$
>> >> >> >
>> >> >> >
>> >> >> > UICommand tempVar = new UICommand("OnBackup",
this);
>>//$NON-NLS-1$
>> >> >> >
>> >>tempVar.setTitle(ConstantsManager.getInstance().getConstants().ok());
>> >> >> > tempVar.setIsDefault(true);
>> >> >> > model.getCommands().add(tempVar);
>> >> >> > UICommand tempVar2 = new UICommand("Cancel",
this);
>>//$NON-NLS-1$
>> >> >> >
>> >>
>>
>>>>>>tempVar2.setTitle(ConstantsManager.getInstance().getConstants().cance
>>>>>>l(
>> >>>>))
>> >> >>;
>> >> >> > tempVar2.setIsCancel(true);
>> >> >> > model.getCommands().add(tempVar2);
>> >> >> >
>> >> >> > }
>> >> >> > ========================================================
>> >> >> >
>> >> >> > _______________________________________________
>> >> >> > Devel mailing list
>> >> >> > Devel(a)ovirt.org
>> >> >> >
http://lists.ovirt.org/mailman/listinfo/devel
>> >> >> _______________________________________________
>> >> >> Devel mailing list
>> >> >> Devel(a)ovirt.org
>> >> >>
http://lists.ovirt.org/mailman/listinfo/devel
>> >>
>> >>
>> >>
>> >>
>>
>>
>>
>>