catch up with branch daily

Signed-off-by: Ralf Mollik <ramollik@compex-commerce.com>
diff --git a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/DialogProvider.java b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/DialogProvider.java
index 339584f..f0ef321 100644
--- a/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/DialogProvider.java
+++ b/org.eclipse.osbp.vaaclipse.addons.softwarefactory/src/org/eclipse/osbp/vaaclipse/addons/softwarefactory/perspective/DialogProvider.java
@@ -85,6 +85,7 @@
 import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent.EventDispatcherDataTag;
 import org.eclipse.osbp.runtime.common.event.IEventDispatcher;
 import org.eclipse.osbp.runtime.common.event.SelectionStore;
+import org.eclipse.osbp.runtime.common.filter.IDTOHistorizedService;
 import org.eclipse.osbp.runtime.common.filter.IDTOService;
 import org.eclipse.osbp.runtime.common.filter.IDTOService;
 import org.eclipse.osbp.runtime.common.validation.IStatus;
@@ -605,11 +606,17 @@
 		createNew(dto);
 	}
 
+	/**
+	 * Check other dialogs whether we could use their selection to prefill owners.
+	 * Check eclipse context for information to prefill owners
+	 *
+	 * @param newDto the new dto
+	 */
 	private void prefillOwners(Object newDto) {
 		if(mPart != null) {
 			MPerspective mPersp = mPart.getContext().get(MPerspective.class);
-			for (Field field : DtoUtils.getOwnerDomainReferences(newDto.getClass())) {
-				if (mPersp != null) {
+			if (mPersp != null) {
+				for (Field field : DtoUtils.getOwnerDomainReferences(newDto.getClass())) {
 					// look in dialog's contexts
 					List<IViewContext> contexts = ecviewContainer.getECViews(mPersp);
 					for (IViewContext context : contexts) {
@@ -644,6 +651,28 @@
 		}
 	}
 
+	/**
+	 * If there comes a selections event with a potential owner we use it to prefill owners.
+	 *
+	 * @param event the event
+	 */
+	private void reflectOwners(final EventDispatcherEvent event) {
+		List<Field> owners = DtoUtils.getOwnerDomainReferences(dto);
+		for(Field field:owners) {
+			String key = EntityUtils.getQualifiedEntityNameForQualifiedDtoName(field.getType().getName())+"."+DtoUtils.getIdField(field.getType()).getName();
+			if(key.equals(event.getTopic())) {
+				Object currentDto = viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
+				if(currentDto != null) {
+					Object bean = getDtoFromEvent(event, field.getType().getName());
+					if(bean != null) {
+						DtoUtils.setValue(currentDto, field.getName(), bean);
+						DtoUtils.getAdapter(DirtyStateAdapter.class, currentDto).resetDirty();
+					}
+				}
+			}
+		}
+	}
+
 	/*
 	 * (non-Javadoc)
 	 * 
@@ -890,15 +919,15 @@
 		}
 	}
 
-	protected void showSaveDialog(Object newDto) {
-		final Object dto = newDto;
-		AcceptSaveDialog.showDialog(dslMetadataService, themeResourceService, new Runnable() {
-			@Override
-			public void run() {
-				viewContext = ecviewComponent.setValue(viewId, dto, renderingParams);
-			}
-		}, null);
-	}
+//	protected void showSaveDialog(Object newDto) {
+//		final Object dto = newDto;
+//		AcceptSaveDialog.showDialog(dslMetadataService, themeResourceService, new Runnable() {
+//			@Override
+//			public void run() {
+//				viewContext = ecviewComponent.setValue(viewId, dto, renderingParams);
+//			}
+//		}, null);
+//	}
 
 	protected void showDeleteDialog(Object currentDto) {
 		if(isDirtyDto(currentDto)) {
@@ -978,29 +1007,47 @@
 				allowedSenderParts = (ArrayList<String>) eclipseContext.getActive(MPart.class).getTransientData().get(IPerspectiveProvider.EventDispatcherConstants.ACCEPTED_SENDERS);
 			}
 			if((event.getPerspective() == null || (perspective != null && event.getPerspective().equals(perspective))) && ((allowedSenderParts != null && allowedSenderParts.contains(event.getSender())) || allowedSenderParts == null)){
-				if (dtoService != null && viewContext != null && !event.getSender().equals(viewId) && (event.getTopic().equals(dtoName) || event.getTopic().equals(primaryKey))) {
-	    			handleSelectEvent(event);	    				
+				if (dtoService != null && viewContext != null && !event.getSender().equals(viewId)) {
+					if(event.getTopic().equals(dtoName) || event.getTopic().equals(primaryKey)) {
+						handleSelectEvent(event);
+					} else if(newCreatedDto){	// while in mode "new" then reflect all external selections to the owner fields
+						reflectOwners(event);
+					}
 	    		}
 			}
 			break;
 		case REFRESH:
 			if (!event.getSender().equals(viewId) && event.getTopic().equals(entityName)) {
 				if (!newCreatedDto) {
+					final UI currentUi = eclipseContext.get(UI.class); 
 					DTO currentDto = (DTO) viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
 					IDto newDto = (IDto) dtoService.get(DtoUtils.getIdValue(currentDto));
-					showLoosingDataDialog(newDto, currentDto);
+					currentUi.accessSynchronously(new Runnable() {
+						@Override
+						public void run() {
+							VaadinObservables.activateRealm(currentUi);
+							showLoosingDataDialog(newDto, currentDto);
+						}
+					});
 				}
 			}
 			break;
 		case SAVE:
 			if (!event.getSender().equals(viewId) && event.getTopic().equals(entityName)) {
 				if (event.getData().containsKey(EventDispatcherDataTag.ID)) {
+					final UI currentUi = eclipseContext.get(UI.class); 
 					Object eventDataId = event.getData().get(EventDispatcherDataTag.ID);
 					DTO currentDto = (DTO) viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
 					Object currentDtoId = DtoUtils.getIdValue(currentDto);
 					IDto newDto = (IDto) dtoService.get(eventDataId);
 					if (eventDataId != null && idEquals(eventDataId, currentDtoId)) {
-						showLoosingDataDialog(newDto, currentDto);
+						currentUi.accessSynchronously(new Runnable() {
+							@Override
+							public void run() {
+								VaadinObservables.activateRealm(currentUi);
+								showLoosingDataDialog(newDto, currentDto);
+							}
+						});
 					}
 				}
 			}
@@ -1008,11 +1055,18 @@
 		case DELETE:
 			if (!event.getSender().equals(viewId) && event.getTopic().equals(entityName)) {
 				if (event.getData().containsKey(EventDispatcherDataTag.ID)) {
+					final UI currentUi = eclipseContext.get(UI.class); 
 					Object eventDataId = event.getData().get(EventDispatcherDataTag.ID);
 					DTO currentDto = (DTO) viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
 					Object currentDtoId = DtoUtils.getIdValue(currentDto);
 					if (eventDataId != null && idEquals(eventDataId, currentDtoId)) {
-						showDeleteDialog(currentDto);
+						currentUi.accessSynchronously(new Runnable() {
+							@Override
+							public void run() {
+								VaadinObservables.activateRealm(currentUi);
+								showDeleteDialog(currentDto);
+							}
+						});
 					}
 				}
 			}
@@ -1132,7 +1186,6 @@
 
 	private void handleSelectEvent(EventDispatcherEvent event) {
 		log.debug("buffer select. Class:{} ObjectID:{}", getClass().getName(), System.identityHashCode(this));
-		final UI currentUi = eclipseContext.get(UI.class); 
 		if(timer != null && timer.isRunning()) {
 			log.debug("{}", "buffered select restarted.");
 			timer.restart();
@@ -1140,12 +1193,13 @@
 			timer = new Timer(50, new ActionListener(){
 				@Override
 				public void actionPerformed(ActionEvent e) {
+					final UI currentUi = eclipseContext.get(UI.class); 
+					Object newDto = getDtoFromEvent(event);
+					Object currentDto = viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
 					currentUi.accessSynchronously(new Runnable() {
 						@Override
 						public void run() {
 							VaadinObservables.activateRealm(currentUi);
-							Object newDto = getDtoFromEvent(event);
-							Object currentDto = viewContext.getBean(IViewContext.MAIN_BEAN_SLOT);
 							showLoosingDataDialog(newDto, currentDto);
 						}
 					});
@@ -1157,11 +1211,23 @@
 	}
 
 	private Object getDtoFromEvent(EventDispatcherEvent event) {
+		return getDtoFromEvent(event, null);
+	}
+	
+	private Object getDtoFromEvent(EventDispatcherEvent event, String refDtoName) {
 		Object dto = null;
 		if (event.getData().containsKey(EventDispatcherDataTag.ID)) {
 			Object id = event.getData().get(EventDispatcherDataTag.ID);
 			if (id != null) {
-				dto = dtoService.get(id);
+				if(refDtoName == null) {
+					if(dtoService instanceof IDTOHistorizedService) {
+						dto = ((IDTOHistorizedService<DTO>)dtoService).get(id, true);
+					} else {
+						dto = dtoService.get(id);
+					}
+				} else {
+					dto = DtoServiceAccess.getService(refDtoName).get(id);
+				}
 			}
 		} else if (event.getData().containsKey(EventDispatcherDataTag.DTO)) {
 			dto = event.getData().get(EventDispatcherDataTag.DTO);
@@ -1189,22 +1255,23 @@
 		log.debug("create new");
 		Object newDto = null;
 		try {
-			newDto = type.newInstance();
+			if(type != null){				
+				newDto = type.newInstance();
+				setNewCreatedDto(true);
+				prefillOwners(newDto);
+				initializeDto(newDto);
+				if(DtoUtils.getAdapter(DirtyStateAdapter.class, newDto) == null) {
+					log.debug("register dirty adapter {}", newDto.getClass().getName());
+					DtoUtils.registerAdapter(dirtyStateAdapter, newDto);
+				}
+				DtoUtils.getAdapter(DirtyStateAdapter.class, newDto).resetDirty();
+				DtoUtils.getAdapter(DirtyStateAdapter.class, newDto).setActive(true);
+				updateBindings(newDto);
+				viewContext.setBean(BEAN_SLOT__VALIDATION_ERROR, Boolean.FALSE);
+			}
 		} catch (InstantiationException | IllegalAccessException e) {
 			log.error("{}", e);
-			return newDto;
 		}
-		setNewCreatedDto(true);
-		prefillOwners(newDto);
-		initializeDto(newDto);
-		if(DtoUtils.getAdapter(DirtyStateAdapter.class, newDto) == null) {
-			log.debug("register dirty adapter {}", newDto.getClass().getName());
-			DtoUtils.registerAdapter(dirtyStateAdapter, newDto);
-		}
-		DtoUtils.getAdapter(DirtyStateAdapter.class, newDto).resetDirty();
-		DtoUtils.getAdapter(DirtyStateAdapter.class, newDto).setActive(true);
-		updateBindings(newDto);
-		viewContext.setBean(BEAN_SLOT__VALIDATION_ERROR, Boolean.FALSE);
 		return newDto;
 	}