package com.smartgwt.sample.client; import com.smartgwt.client.data.Record; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.IButton; import com.smartgwt.client.widgets.Label; import com.smartgwt.client.widgets.Window; import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.layout.HLayout; import com.smartgwt.client.widgets.layout.VLayout; import com.smartgwt.client.widgets.viewer.DetailViewer; import com.smartgwt.client.widgets.viewer.DetailViewerField; /** * A window to be displayed when concurrency save occurs. Will display both the * database record and the currently edited record, and allow user to opt to * continue editing, to cancel his changes or to overwrite the database values. */ public class ConcurrentConflictDialog extends Window { /** * Possible user actions */ public enum UserAction { UNKNOWN, KEEP_EDITING, SAVE_ANYWAY, DISCARD_CHANGES } public UserAction userAction; ConcurrentConflictDialogCallback callback; /** * Constructs this conflict dialog with user supplied data to be displayed to user and a callback * through which to act upon a choice made by the user. * * @param serverValues the current row values as they are in the database. these values * are server sent back by the server * * @param editedValues the edited row values. This should include the changes the user made * * @param fields the list of fields each record has. * * @param cb the callback to be called on action performed. */ public ConcurrentConflictDialog(Record serverValues, Record editedValues, String[] fields, final ConcurrentConflictDialogCallback cb) { super(); this.callback = cb; userAction = UserAction.UNKNOWN; // set some general attributes setWidth(500); setHeight(350); setTitle("Concurrent change detected!"); setShowMinimizeButton(false); setShowCloseButton(false); setIsModal(true); setShowModalMask(true); centerInPage(); //create a horizontal layout for the labels on top of detail viewer // and place inside the detail labels. HLayout labels = new HLayout(5); labels.setWidth100(); labels.setHeight(30); labels.setMargin(10); Label l1= new Label("Current database record"); l1.setWidth("50%"); Label l2 = new Label("Your record"); l2.setWidth("50%"); labels.addMember(l1); labels.addMember(l2); // create a horizontal layout for the detail viewers HLayout details = new HLayout(); details.setWidth100(); details.setHeight("*"); details.setPadding(5); details.setMembersMargin(5); // create a detail viewer to display the values we got from the server final DetailViewer old = new DetailViewer(); old.setData(new Record[]{serverValues}); old.setTitle("Concurent changes"); // create a detail viewer to display values we changed DetailViewer nw = new DetailViewer(); nw.setData(new Record[]{editedValues}); nw.setTitle("New changes"); // set the fields to be displayed in both detail viewers DetailViewerField[] f = new DetailViewerField[fields.length]; for(int i=0;i