blob: be97442b0a6bc267c6648bfb41e3c1b29365a4b8 [file] [log] [blame]
/**
*
* Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
*/
package org.eclipse.osbp.xtext.dialogdsl.common;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
import javax.inject.Named;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.e4.ui.di.Focus;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.workbench.IPresentationEngine;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.osbp.core.api.persistence.IPersistenceService;
import org.eclipse.osbp.dsl.common.datatypes.IDto;
import org.eclipse.osbp.ecview.core.common.context.IViewContext;
import org.eclipse.osbp.ecview.core.common.editpart.IFieldEditpart;
import org.eclipse.osbp.ecview.core.common.model.core.YEmbeddable;
import org.eclipse.osbp.ecview.core.common.model.core.YField;
import org.eclipse.osbp.ecview.core.common.model.core.YFocusable;
import org.eclipse.osbp.ecview.core.common.model.core.YView;
import org.eclipse.osbp.ecview.core.common.model.core.util.BindingIdUtil;
import org.eclipse.osbp.ecview.core.common.notification.AbstractReloadRequestService;
import org.eclipse.osbp.ecview.core.common.notification.IReloadRequestService;
import org.eclipse.osbp.ecview.core.common.store.IViewStore;
import org.eclipse.osbp.ecview.core.common.validation.IFieldValidationManager;
import org.eclipse.osbp.ecview.core.util.emf.ModelUtil;
import org.eclipse.osbp.ecview.extension.model.YDelegatingLayoutingStrategy;
import org.eclipse.osbp.ecview.extension.model.YECviewFactory;
import org.eclipse.osbp.ecview.extension.model.YStrategyLayout;
import org.eclipse.osbp.ecview.extension.presentation.vaadin.components.common.ECViewComponent;
import org.eclipse.osbp.eventbroker.EventBrokerMsg;
import org.eclipse.osbp.osgi.hybrid.api.AbstractHybridVaaclipseView;
import org.eclipse.osbp.runtime.common.annotations.DirtyStateAdapter;
import org.eclipse.osbp.runtime.common.annotations.DtoUtils;
import org.eclipse.osbp.runtime.common.annotations.IsValid;
import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent;
import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent.EventDispatcherDataTag;
import org.eclipse.osbp.runtime.common.event.IEventDispatcher;
import org.eclipse.osbp.runtime.common.filter.IDTOServiceWithMutablePersistence;
import org.eclipse.osbp.runtime.common.i18n.II18nService;
import org.eclipse.osbp.runtime.common.validation.IStatus;
import org.eclipse.osbp.runtime.common.validation.ValidationKind;
import org.eclipse.osbp.runtime.web.vaadin.components.dialogs.AcceptDeleteDialog;
import org.eclipse.osbp.runtime.web.vaadin.components.dialogs.AcceptLoosingDataDialog;
import org.eclipse.osbp.runtime.web.vaadin.components.dialogs.AcceptSaveDialog;
import org.eclipse.osbp.runtime.web.vaadin.components.dialogs.QueryDeleteDialog;
import org.eclipse.osbp.ui.api.e4.IE4Dialog;
import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
import org.eclipse.osbp.ui.api.report.IReportProvider;
import org.eclipse.osbp.ui.api.themes.IThemeResourceService;
import org.eclipse.osbp.ui.api.user.IUser;
import org.eclipse.osbp.ui.common.helper.ICommonUIHelper;
import org.eclipse.osbp.utils.vaadin.SelectDialog;
import org.eclipse.osbp.utils.vaadin.ViewLayoutManager;
import org.eclipse.osbp.vaaclipse.addons.common.api.di.Validate;
import org.eclipse.osbp.vaaclipse.addons.common.api.status.IStatusManager;
import org.eclipse.osbp.vaaclipse.addons.common.api.status.IStatusScope;
import org.eclipse.osbp.vaaclipse.common.ecview.E4EventBrokerAdapter;
import org.eclipse.osbp.vaaclipse.common.ecview.ECViewToE4ServiceBridge;
import org.eclipse.osbp.vaaclipse.common.ecview.api.IECViewContainer;
import org.eclipse.osbp.xtext.action.DialogActionEnum;
import org.eclipse.osbp.xtext.action.common.IToolbarAction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.vaadin.ui.Label;
import com.vaadin.ui.Notification;
import com.vaadin.ui.Notification.Type;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
/**
* The Class AbstractECViewDialog.
*
* @param <DTO>
* the generic type
*/
@SuppressWarnings("all")
public abstract class AbstractECViewDialog<DTO> extends AbstractHybridVaaclipseView implements IUser.UserLocaleListener,
IEventDispatcher.Receiver, IFieldValidationManager.Listener , IE4Dialog{
/** The Constant log. */
private final static Logger log = LoggerFactory.getLogger("vaaclipseDialog");
private static final String BEAN_SLOT__VALIDATION_ERROR = "validationError";
/** The user id. */
@Inject
@Named("userId")
@Optional
String userId;
@Inject
private MPart mPart;
/** The event broker. */
@Inject
private IEventBroker eventBroker;
/** The event broker. */
@Inject
private IECViewContainer ecviewContainer;
/** The rendering engine. */
@Inject
private IPresentationEngine renderingEngine;
/** The persistence service. */
@Inject
private IPersistenceService persistenceService;
/** The theme resource service. */
@Inject
private IThemeResourceService themeResourceService;
@Inject
private IEventDispatcher eventDispatcher;
/** The common ui helper. */
@Inject
private ICommonUIHelper commonUIHelper;
/** The translator class service. */
@Inject
private IDSLMetadataService dslMetadataService;
/** The report provider. */
@Inject
IReportProvider reportProvider;
/** The i18n service. */
@Inject
private II18nService i18nService;
/** The view store. */
@Inject
private IViewStore viewStore;
/** The eclipse context. */
@Inject
private IEclipseContext eclipseContext;
@Inject
private IUser user;
@Inject
private IStatusManager statusManager;
/** The strategy event handler. */
private StrategyEventHandler strategyEventHandler;
/** The view context. */
// ecview stuff
private IViewContext viewContext;
/** The ecview component. */
private ECViewComponent ecviewComponent;
/** The rendering params. */
private Map<String, Object> renderingParams;
/** The dto service. */
private IDTOServiceWithMutablePersistence<DTO> dtoService;
/** The layout manager. */
private ViewLayoutManager layoutManager;
/** The toolbar helper. */
private IToolbarAction toolbarHelper;
/** The uuid. */
protected String uuid = UUID.randomUUID().toString();
private Label dialogLabel;
private boolean newCreatedDto = false;
private SelectDialog selectDialog;
private Window selectWindow;
private DirtyStateAdapter dirtyStateAdapter;
/** The ecview field validation manager. */
private IFieldValidationManager ecviewFieldValidationManager;
/** The validation result. */
private Set<IStatus> validationResult;
private IReloadRequestService reloadRequestService = new AbstractReloadRequestService() {
@Override
public void requestReload(YEmbeddable component, Object newDto) {
updateData(newDto);
}
};
/**
* Instantiates a new abstract ec view dialog.
*
* @param parent
* the parent
* @param context
* the context
* @param app
* the app
*/
public AbstractECViewDialog(final VerticalLayout parent, final IEclipseContext context, final MApplication app) {
super(parent, context, app);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.osbp.osgi.hybrid.api.AbstractHybridVaaclipseView#createView
* (com.vaadin.ui.VerticalLayout)
*/
@Override
public void createView(final VerticalLayout parent) {
eclipseContext.set(IE4Dialog.class, this);
layoutManager = new ViewLayoutManager();
layoutManager.init(parent);
dirtyStateAdapter = new DirtyStateAdapter();
// create the toolbar
//
toolbarHelper = createToobarHelper();
if (toolbarHelper != null) {
toolbarHelper.createToolbar(getContext(), renderingEngine, themeResourceService);
}
if (viewStore != null) {
ecviewComponent = new ECViewComponent(new ECViewComponent.ViewProviderCallback() {
@Override
public YView getView(String viewId, Map<String, Object> properties) {
// use the view store to find a user saved view
return viewStore.getMostRecentView(userId, viewId);
}
});
} else {
ecviewComponent = new ECViewComponent();
}
ecviewComponent.setSizeFull();
layoutManager.getDataArea().addComponent(ecviewComponent);
// create the rendering params used for ECView
renderingParams = createRenderingParams();
// create the event handlers
strategyEventHandler = new StrategyEventHandler();
selectDialog = new SelectDialog();
}
@Override
public void validationChanged(IFieldValidationManager.Event event) {
// add them to the Vaaclipse status manager
IStatusScope scope = statusManager.getScopeFor(mPart);
scope.modifyStatus(event.getOldStatus(), event.getNewStatus());
applyValidationResult();
}
/**
* Apply the validation result to the view.
*/
protected void applyValidationResult() {
// set the validation result
viewContext.setBean(BEAN_SLOT__VALIDATION_ERROR, Boolean.FALSE);
for (IStatus status : statusManager.getScopeFor(mPart).getAllStatus()) {
if (status.isError()) {
viewContext.setBean(BEAN_SLOT__VALIDATION_ERROR, Boolean.TRUE);
break;
}
}
log.debug("applyValidationResult {}", ((Boolean)viewContext.getBean(BEAN_SLOT__VALIDATION_ERROR)).booleanValue());
}
@IsValid
public boolean isDataValid() {
if(viewContext == null) {
return true;
}
Boolean result = (Boolean) viewContext.getBean(BEAN_SLOT__VALIDATION_ERROR);
if(result == null) {
return true;
}
return (boolean) !result;
}
@Focus
public void setFocus() {
if(viewContext != null) {
YView yView = null;
YField yField = null;
Iterator<EObject> iter = ((EObject) viewContext.getViewEditpart().getModel()).eAllContents();
while (iter.hasNext()) {
EObject eObject = iter.next();
if(eObject instanceof YStrategyLayout) {
YStrategyLayout yLayout = (YStrategyLayout)eObject;
yView = yLayout.getView();
}
if (eObject instanceof YField) {
if(eObject instanceof YFocusable && ((YField) eObject).isVisible() && ((YField) eObject).isEditable() && ((YField) eObject).isEnabled()) {
yField = (YField) eObject;
break;
}
}
}
if(yView != null && yField != null) {
yView.setCurrentFocus(yField);
}
}
}
/**
* Creates a new dto.
*
* @param typeName
* the type name for the dto
*/
protected void createNew(String typeName) {
Object newDto = null;
Class<?> clazz = null;
try {
clazz = dslMetadataService.createType(typeName);
} catch (ClassNotFoundException e) {
log.error("{}", e);
return;
}
try {
newDto = clazz.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
log.error("{}", e);
return;
}
Object currentDto = viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
if (currentDto != null) {
boolean dirty = false;
// check if any dto in the dto tree is dirty
DirtyStateAdapter adapter = DtoUtils.getAdapter(DirtyStateAdapter.class, currentDto);
if (adapter != null) {
dirty = adapter.isDirty();
}
if (dirty) {
showNewLoosingDataDialog(viewContext, currentDto, newDto);
} else if (!((IDto) currentDto).equalVersions(((IDto) newDto))) {
initNew(newDto);
}
} else {
initNew(newDto);
}
}
private void initNew(Object newDto) {
newCreatedDto = true;
viewContext.setBean(BEAN_SLOT__VALIDATION_ERROR, Boolean.FALSE);
ecviewComponent.setValue(getViewId(), newDto, renderingParams);
if (viewContext != null) {
prefillOwners(newDto);
updateData(newDto);
reloadRequestService.setMode(false);
if (DtoUtils.getAdapter(DirtyStateAdapter.class, newDto) == null) {
DtoUtils.registerAdapter(dirtyStateAdapter, newDto);
dirtyStateAdapter.setActive(true);
}
}
}
/**
* Deletes the current dto entry.
*/
protected void doDelete() {
DTO deletedDto = (DTO) viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
dtoService.delete(deletedDto);
ecviewComponent.setValue(getViewId(), null, renderingParams);
newCreatedDto = false;
reloadRequestService.setMode(false);
Notification.show(dslMetadataService.translate(user.getLocale().toLanguageTag(), "deleted"),Notification.Type.HUMANIZED_MESSAGE);
// initial state of the dialog has to be NEW. This
// fills
// the view context with a initial blank bean.
createNew(getBaseDtoName());
}
private void prefillOwners(Object newDto) {
MPerspective mPersp = mPart.getContext().get(MPerspective.class);
for (Field field : DtoUtils.getOwnerDomainReferences(newDto.getClass())) {
String name = field.getType().getName();
if (mPersp != null) {
List<IViewContext> contexts = ecviewContainer.getECViews(mPersp);
for (IViewContext context : contexts) {
if (this.viewContext == context) {
continue;
}
Object bean = context.getBean(IViewContext.MAIN_BEAN_SLOT);
if (bean instanceof IDto) {
if (field.getType().isAssignableFrom(bean.getClass())) {
try {
field.setAccessible(true);
field.set(newDto, bean);
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.osbp.osgi.hybrid.api.AbstractHybridVaaclipseView#
* createComponents ()
*/
@Override
public void createComponents() {
registerPersistenceUnit(persistenceService);
// DTO Services (via DS)
dtoService = getDtoService();
// OSBP UI Code
viewContext = ecviewComponent.setValue(getViewId(), null, renderingParams);
if (viewContext == null) {
String message = "ViewContext could not be set for '" + getViewId() + "'";
log.error(message);
Notification.show(message, Type.ERROR_MESSAGE);
} else {
viewContext.setLocale(user.getLocale());
viewContext.createBeanSlot(BEAN_SLOT__VALIDATION_ERROR, Boolean.class);
viewContext.setBean(BEAN_SLOT__VALIDATION_ERROR, Boolean.FALSE);
mPart.getContext().set(IViewContext.class, viewContext);
// bridges the validation from ECView core to Vaaclipse
setupValidationBridge();
// enable the suggest mode of suggest textfields
reloadRequestService.setMode(true);
YView yView = (YView) viewContext.getViewEditpart().getModel();
if (yView == null) {
Notification.show("Dialog could not be found!", Type.ERROR_MESSAGE);
return;
}
// render the Vaadin UI
YStrategyLayout yStrategyLayoutT = commonUIHelper.findLayout(yView);
if (yStrategyLayoutT != null) {
yStrategyLayoutT.setDefaultFocusingEnhancerId("DefaultFocusingEnhancer");
if (!getLayoutingStrategyId().isEmpty()){
YDelegatingLayoutingStrategy layoutingStrategy = YECviewFactory.eINSTANCE.createYDelegatingLayoutingStrategy();
layoutingStrategy.setDelegateStrategyId(getLayoutingStrategyId());
yStrategyLayoutT.setLayoutingStrategy(layoutingStrategy);
}
}
// Creating event handler for receiving events from StrategyCombo
strategyEventHandler.setViewContext(viewContext);
strategyEventHandler.setUi(UI.getCurrent());
strategyEventHandler.setLayout(commonUIHelper.findLayout(yView));
// initial state of the dialog has to be NEW. This fills the view
// context with a initial blank bean.
createNew(getBaseDtoName());
}
}
/**
* Setup validation bridge.
*/
protected void setupValidationBridge() {
// create a validation enhancer. If an error message is added to the
// field validation manager. The enhancer will set the id of the mpart
// to the status.
ecviewFieldValidationManager = viewContext.getService(IFieldValidationManager.class.getName());
ecviewFieldValidationManager.setEnhancer(new IFieldValidationManager.Enhancer() {
@Override
public void enhance(IStatus status) {
status.putProperty(IStatus.PROP_UI_APPLICATION_ID, mPart.getElementId());
}
});
ecviewFieldValidationManager.addListener(this);
}
@Validate
public void validate(@Named("commandId") String commandId) {
if (commandId != null) {
Set<IStatus> oldValidationResult = validationResult != null ? new HashSet<IStatus>(validationResult)
: new HashSet<IStatus>();
final DTO mainDto = (DTO) viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
validationResult = dtoService.validate(mainDto, ValidationKind.OTHER, null);
for (IStatus status : validationResult) {
// set the application id to the status
status.putProperty(IStatus.PROP_UI_APPLICATION_ID, mPart.getElementId());
if (status.containsProperty(IStatus.PROP_FIELD_ID)
&& status.containsProperty(IStatus.PROP_FIELD_I18N_KEY)) {
continue;
}
// fix the field id. Therefore we try to find the yField that is
// bound to the property path of javax.validation result.
if (!status.containsProperty(IStatus.PROP_FIELD_ID)) {
if (status.containsProperty(IStatus.PROP_JAVAX_PROPERTY_PATH)) {
String path = (String) status.getProperty(IStatus.PROP_JAVAX_PROPERTY_PATH);
// if path points to a collection, then remove all the
// collection stuff, since Vaadin can not focus rows
if (path.matches(".*\\[\\d*\\].*")) {
path = path.substring(0, path.indexOf("["));
}
// using a regex to find the yElement:
// "beanslot/.*/{propertyPath}"
YEmbeddable yElement = (YEmbeddable) viewContext
.findBoundField(String.format("%s.*/%s", BindingIdUtil.BEANSLOT, path));
if (yElement != null) {
status.putProperty(IStatus.PROP_FIELD_ID, yElement.getId());
status.putProperty(IStatus.PROP_FIELD_I18N_KEY, yElement.getLabelI18nKey());
}
}
}
}
// now update the field with the new Status instances
//
for (IStatus status : oldValidationResult) {
String fieldId = (String) status.getProperty(IStatus.PROP_FIELD_ID);
if (fieldId != null && !fieldId.trim().equals("")) {
YField yField = (YField) viewContext.findModelElement(fieldId);
IFieldEditpart editpart = ModelUtil.findEditpart(yField);
if (editpart != null) {
editpart.removeExternalStatus(status);
}
}
}
for (IStatus status : validationResult) {
String fieldId = (String) status.getProperty(IStatus.PROP_FIELD_ID);
if (fieldId != null && !fieldId.trim().equals("")) {
YField yField = (YField) viewContext.findModelElement(fieldId);
IFieldEditpart editpart = ModelUtil.findEditpart(yField);
if (editpart != null) {
editpart.addExternalStatus(status);
}
}
}
statusManager.getScopeFor(mPart).modifyStatus(oldValidationResult, validationResult);
applyValidationResult();
}
}
/**
* Removes the old view.
*/
private void removeOldView() {
if (viewContext != null) {
viewContext.dispose();
}
if (layoutManager.getDataArea().getComponentCount() > 0) {
layoutManager.getDataArea().removeAllComponents();
}
}
/**
* Creates the rendering parameters.
*
* @return the map
*/
protected Map<String, Object> createRenderingParams() {
Map<String, Object> params = new HashMap<String, Object>();
Map<String, Object> services = new HashMap<String, Object>();
params.put(IViewContext.PARAM_SERVICES, services);
params.put(ECViewComponent.PROP_SLOT, IViewContext.MAIN_BEAN_SLOT);
params.put(IViewContext.PARAM_THIRDPARTY_SERVICE_PROVIDER, new ECViewToE4ServiceBridge(getContext()));
services.put(org.eclipse.osbp.runtime.common.event.IEventBroker.class.getName(),
new E4EventBrokerAdapter(eventBroker));
services.put(IUser.class.getName(), user);
// this service will handle reload requests from YSuggestTextField
services.put(IReloadRequestService.class.getName(), reloadRequestService);
return params;
}
/**
* Shows a dialog which warns about loosing data.
*
* @param context
* the context
* @param currentDto
* the current dto
* @param newDto
* the new dto
*/
protected void showLoosingDataDialog(IViewContext context, Object currentDto, Object newDto) {
AcceptLoosingDataDialog.showDialog(dslMetadataService, themeResourceService, new Runnable() {
@Override
public void run() {
viewContext.setBean(IViewContext.MAIN_BEAN_SLOT, newDto);
}
}, null);
}
protected void showNewLoosingDataDialog(IViewContext context, Object currentDto, Object newDto) {
AcceptLoosingDataDialog.showDialog(dslMetadataService, themeResourceService, new Runnable() {
@Override
public void run() {
initNew(newDto);
}
}, null);
}
protected void showSaveDialog(Object newDto) {
AcceptSaveDialog.showDialog(dslMetadataService, themeResourceService, new Runnable() {
@Override
public void run() {
viewContext.setBean(IViewContext.MAIN_BEAN_SLOT, newDto);
}
}, null);
}
protected void showDeleteDialog() {
AcceptDeleteDialog.showDialog(dslMetadataService, themeResourceService, new Runnable() {
@Override
public void run() {
createNew(getBaseDtoName());
}
}, null);
}
protected void showQueryDeleteDialog() {
QueryDeleteDialog.showDialog(dslMetadataService, themeResourceService, new Runnable() {
@Override
public void run() {
doDelete();
}
}, null);
}
/**
* Gets the uuid.
*
* @return the uuid
*/
protected String getUUID() {
return uuid;
}
@Override
public void localeChanged(final Locale locale) {
if(viewContext != null) {
viewContext.setLocale(locale);
}
if (layoutManager != null) {
layoutManager.setLabelValue(
dslMetadataService.translate(user.getLocale().toLanguageTag(), getBindingPropertyName()));
}
}
@Override
public void receiveEvent(final EventDispatcherEvent event) {
switch (event.getCommand()) {
case OK:
if (selectWindow != null) {
selectWindow.close();
UI.getCurrent().removeWindow(selectWindow);
selectWindow = null;
}
createNew("");
break;
case SELECT:
if (viewContext != null && !event.getSender().equals(getViewId())
&& (event.getTopic().equals(getBaseDtoName()) || event.getTopic().equals(getPrimaryKey()))) {
log.debug("got SELECT event");
Object dto = null;
if (event.getData().containsKey(EventDispatcherDataTag.ID)) {
log.debug("got SELECT event with id");
Object id = event.getData().get(EventDispatcherDataTag.ID);
if (id != null) {
log.debug("got SELECT event with id:{}", id);
dto = dtoService.get(id);
}
} else if (event.getData().containsKey(EventDispatcherDataTag.DTO)) {
dto = event.getData().get(EventDispatcherDataTag.DTO);
}
log.debug("got SELECT event found dto:{}", dto);
if (dto != null) {
updateData(dto);
newCreatedDto = false;
reloadRequestService.setMode(true);
} else {
createNew(getBaseDtoName());
}
}
break;
case REFRESH:
if (!event.getSender().equals(getViewId()) && event.getTopic().equals(getBaseEntityName())) {
if (!newCreatedDto) {
DTO currentDto = (DTO) viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
IDto newDto = (IDto) dtoService.get(getIdForDto(currentDto));
updateData(newDto);
}
}
break;
case SAVE:
if (!event.getSender().equals(getViewId()) && event.getTopic().equals(getBaseEntityName())) {
if (event.getData().containsKey(EventDispatcherDataTag.ID)) {
Object eventDataId = event.getData().get(EventDispatcherDataTag.ID);
DTO currentDto = (DTO) viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
Object currentDtoId = getIdForDto(currentDto);
IDto newDto = (IDto) dtoService.get(eventDataId);
if (eventDataId != null && idEquals(eventDataId, currentDtoId)
&& !newDto.equalVersions((IDto) currentDto)) {
showSaveDialog(newDto);
}
}
}
break;
case DELETE:
if (!event.getSender().equals(getViewId()) && event.getTopic().equals(getBaseEntityName())) {
if (event.getData().containsKey(EventDispatcherDataTag.ID)) {
Object eventDataId = event.getData().get(EventDispatcherDataTag.ID);
DTO currentDto = (DTO) viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
Object currentDtoId = getIdForDto(currentDto);
if (eventDataId != null && idEquals(eventDataId, currentDtoId)) {
showDeleteDialog();
}
}
}
break;
case ACTION:
if (uuid.equals(event.getTopic()) && event.getData().containsKey(EventDispatcherDataTag.BUTTON_ID)) {
Object id = event.getData().get(EventDispatcherDataTag.BUTTON_ID);
if (id instanceof DialogActionEnum) {
DialogActionEnum enumId = (DialogActionEnum) id;
switch (enumId) {
case DIALOG_ACTION_NEW:
String dtoFQN = getBaseDtoName();
Map<String, String> subTypes = dslMetadataService
.getAllTypeNames(user.getLocale().toLanguageTag(), dtoFQN);
if (subTypes.size() > 1) {
selectWindow = selectDialog.init(eventDispatcher, getClass().getCanonicalName(), uuid, subTypes, dtoFQN, dslMetadataService.translate(user.getLocale().toLanguageTag(), "Select SubType"), dslMetadataService.translate(user.getLocale().toLanguageTag(), "Ok"));
UI.getCurrent().addWindow(selectWindow);
} else {
createNew(dtoFQN);
}
break;
case DIALOG_ACTION_SAVE:
DTO savedDto = (DTO) viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
dtoService.update(savedDto);
DTO newInstance = dtoService.get(getIdForDto(savedDto));
ecviewComponent.setValue(getViewId(), newInstance, renderingParams);
newCreatedDto = false;
reloadRequestService.setMode(true);
Notification.show(dslMetadataService.translate(user.getLocale().toLanguageTag(), "saved"),Notification.Type.HUMANIZED_MESSAGE);
break;
case DIALOG_ACTION_DELETE:
showQueryDeleteDialog();
break;
case DIALOG_ACTION_CANCEL:
DTO canceledDto = (DTO) viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
DTO oldInstanceCompanyDto = dtoService.get(getIdForDto(canceledDto));
ecviewComponent.setValue(getViewId(), oldInstanceCompanyDto, renderingParams);
reloadRequestService.setMode(false);
break;
}
}
}
break;
}
}
/**
* Subscribe.
*/
protected void subscribe() {
eventBroker.subscribe(EventBrokerMsg.DIALOG_STRATEGY_CHANGED, strategyEventHandler);
}
/**
* Unsubscribe.
*/
protected void unsubscribe() {
eventBroker.unsubscribe(strategyEventHandler);
}
@PostConstruct
public void activate() {
user.addUserLocaleListener(this);
eventDispatcher.addEventReceiver(this);
subscribe();
}
@PreDestroy
public void deactivate() {
user.removeUserLocaleListener(this);
eventDispatcher.removeEventReceiver(this);
unsubscribe();
}
private boolean idEquals(Object id, Object id2) {
if (id2.getClass().isAssignableFrom(id.getClass())) {
if (id instanceof String) {
return ((String) id).equals(id2);
} else if (id instanceof Integer) {
return ((Integer) id).intValue() == ((Integer) id2).intValue();
}
}
return false;
}
/**
* Update data with a new dto and protect dirty data.
*
* @param newDto
* the new dto
*/
private void updateData(Object newDto) {
if (viewContext == null) {
return;
}
viewContext.setBean(BEAN_SLOT__VALIDATION_ERROR, Boolean.FALSE);
Object currentDto = viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
if (currentDto != null) {
boolean dirty = false;
// check if any dto in the dto tree is dirty
DirtyStateAdapter adapter = DtoUtils.getAdapter(DirtyStateAdapter.class, currentDto);
if (adapter != null) {
dirty = adapter.isDirty();
}
if (dirty) {
showLoosingDataDialog(viewContext, currentDto, newDto);
} else if (!((IDto) currentDto).equalVersions(((IDto) newDto))) {
viewContext.setBean(IViewContext.MAIN_BEAN_SLOT, newDto);
}
} else {
viewContext.setBean(IViewContext.MAIN_BEAN_SLOT, newDto);
}
}
/**
* Gets the view id.
*
* @return the view id
*/
protected abstract String getViewId();
/**
* Gets the full qualified dto name.
*
* @return the base class dto name
*/
protected abstract String getBaseDtoName();
/**
* Gets the full qualified entity name.
*
* @return the base class entity name
*/
protected abstract String getBaseEntityName();
/**
* Gets the id for dto.
*
* @param savedDto
* the saved dto
* @return the id for dto
*/
protected abstract Object getIdForDto(DTO savedDto);
/**
* Gets the data name.
*
* @return the data name
*/
protected abstract String getDataName();
/**
* Gets the qualified primary key.
*
* @return the primary key
*/
protected abstract String getPrimaryKey();
/**
* Gets the binding property name.
*
* @return the binding property name
*/
protected abstract String getBindingPropertyName();
/**
* Gets the layouting strategy id.
*
* @return the layouting strategy id
*/
protected abstract String getLayoutingStrategyId();
/**
* Gets the dto service.
*
* @return the dto service
*/
protected abstract IDTOServiceWithMutablePersistence<DTO> getDtoService();
protected abstract void registerPersistenceUnit(IPersistenceService persistenceService);
/**
* Creates the toobar helper.
*
* @return the i dialog toolbar action
*/
protected abstract IToolbarAction createToobarHelper();
}