Yes, I have done that, thanks. 在 8/15/14, 20:13, "Vojtech Szocs" <vsz...@redhat.com> 写入:
> > >----- Original Message ----- >> From: "Leaboy" <wlblea...@126.com> >> To: "Vojtech Szocs" <vsz...@redhat.com> >> Cc: devel@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" <vsz...@redhat.com> 写入: >> >> > >> > >> >----- Original Message ----- >> >> From: "Leaboy" <wlblea...@126.com> >> >> To: "Vojtech Szocs" <vsz...@redhat.com> >> >> Cc: devel@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" <vsz...@redhat.com> 写入: >> >> >> >> > >> >> > >> >> >----- Original Message ----- >> >> >> From: "Leaboy" <wlblea...@126.com> >> >> >> To: "Vojtech Szocs" <vsz...@redhat.com> >> >> >> Cc: devel@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" <vsz...@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" <vsz...@redhat.com> >> >> >> >> To: "力波 王" <wlblea...@126.com> >> >> >> >> Cc: devel@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().templa >>>>>>>>te >> >>>>>>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: "力波 王" <wlblea...@126.com> >> >> >> >> > To: devel@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().can >>>>>>>>ce >> >>>>>>l( >> >> >>>>)) >> >> >> >>; >> >> >> >> > tempVar2.setIsCancel(true); >> >> >> >> > model.getCommands().add(tempVar2); >> >> >> >> > >> >> >> >> > } >> >> >> >> > ======================================================== >> >> >> >> > >> >> >> >> > _______________________________________________ >> >> >> >> > Devel mailing list >> >> >> >> > Devel@ovirt.org >> >> >> >> > http://lists.ovirt.org/mailman/listinfo/devel >> >> >> >> _______________________________________________ >> >> >> >> Devel mailing list >> >> >> >> Devel@ovirt.org >> >> >> >> http://lists.ovirt.org/mailman/listinfo/devel >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> _______________________________________________ Devel mailing list Devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/devel