Vincent,
I finally wrote some codes about Flex and joda-time.
I have some requests and I need some help.
Requests:
- add a getter for DefaultRemoteViewFactory.guidGenerator
- set DefaultRemoteViewFactory.createRDateField as protected
- set RemoteConnectorFactory.attachListeners as protected
Help:
At the moment I get the joda date fields, but:
- there is no synchronisation between detail and list pages
- if I edit in the list page, I need to reenter in the field to get the date displaying
It must be related with some listeners but I'm stuck here.
Regards
Pierre
PS: new classes
===============================================================================
package org.jspresso.framework.binding.remote;
[...]
public class PopsuiteRemoteConnectorFactory extends RemoteConnectorFactory{
@Override
public IValueConnector createValueConnector(String id) {
RemoteValueConnector connector = new PopsuiteValueConnector(id, this);
attachListeners(connector);
return connector;
}
@Override
public IFormattedValueConnector createFormattedValueConnector(String id, IFormatter formatter) {
RemoteFormattedValueConnector connector = new PopsuiteFormattedValueConnector(id, this, formatter);
attachListeners(connector);
return connector;
}
}
===============================================================================
package org.jspresso.framework.binding.remote;
[...]
public class PopsuiteValueConnector extends RemoteValueConnector{
public PopsuiteValueConnector(String id,
RemoteConnectorFactory connectorFactory) {
super(id, connectorFactory);
}
@Override
protected Object getConnecteeValue() {
Object result = super.getConnecteeValue();
if (null == result) return null;
Class<?> expectedType = ((IModelValueConnector) getModelConnector()).getModelDescriptor().getModelType();
if (LocalDateTime.class.equals(expectedType)) {
return LocalDateTime.fromDateFields((Date) result);
} else if (LocalDate.class.equals(expectedType)) {
return LocalDate.fromDateFields((Date) result);
}
return result;
}
@Override
protected void setConnecteeValue(Object connecteeValue) {
Object result = connecteeValue;
if (connecteeValue instanceof LocalDate) {
result = isUnknown(connecteeValue) ? null : ((LocalDate) connecteeValue).toDateMidnight().toDate();
}
else if(connecteeValue instanceof LocalDateTime) {
result = isUnknown(connecteeValue) ? null : ((LocalDateTime) connecteeValue).toDateTime().toDate();
}
super.setConnecteeValue(result);
}
}
===============================================================================
package org.popsuite.framework.view.remote;
[...]
public class PopsuiteRemoteViewFactory
extends DefaultRemoteViewFactory {
private IGUIDGenerator guidGenerator;
@Override
protected IView<RComponent> createPropertyView(
IPropertyDescriptor propertyDescriptor,
List<String> renderedChildProperties,
IActionHandler actionHandler,
Locale locale) {
IView<RComponent> view = null;
if (propertyDescriptor instanceof ILocalDatePropertyDescriptor) { // must come before ILocalDateTimePropertyDescriptor
view = createDatePropertyView(
(ILocalDatePropertyDescriptor) propertyDescriptor,
actionHandler,
locale);
}
else if (propertyDescriptor instanceof ILocalDateTimePropertyDescriptor) {
view = createDatePropertyView(
(ILocalDateTimePropertyDescriptor) propertyDescriptor,
actionHandler,
locale);
}
if (view != null) {
decorateWithDescription(propertyDescriptor, locale, view);
} else {
view = super.createPropertyView(
propertyDescriptor,
renderedChildProperties,
actionHandler,
locale);
}
if ((view != null) && (propertyDescriptor.getName() != null)) {
view.getPeer().setLabel(
propertyDescriptor.getI18nName(getTranslationProvider(), locale));
}
return view;
}
protected IView<RComponent> createDatePropertyView(
ILocalDatePropertyDescriptor propertyDescriptor,
IActionHandler actionHandler,
Locale locale) {
IValueConnector connector;
if (isDateServerParse()) {
connector = getConnectorFactory().createFormattedValueConnector(
propertyDescriptor.getName(),
createDateFormatter(propertyDescriptor, locale));
} else {
connector = getConnectorFactory().createValueConnector(
propertyDescriptor.getName());
}
connector.setExceptionHandler(actionHandler);
RDateField viewComponent = createRDateField(connector);
viewComponent.setType(propertyDescriptor.getType().toString());
IView<RComponent> view = constructView(viewComponent, null, connector);
return view;
}
protected IView<RComponent> createDatePropertyView(
ILocalDateTimePropertyDescriptor propertyDescriptor,
IActionHandler actionHandler,
Locale locale) {
IValueConnector connector;
if (isDateServerParse()) {
connector = getConnectorFactory().createFormattedValueConnector(
propertyDescriptor.getName(),
createDateFormatter(propertyDescriptor, locale));
} else {
connector = getConnectorFactory().createValueConnector(
propertyDescriptor.getName());
}
connector.setExceptionHandler(actionHandler);
RDateField viewComponent = createRDateField(connector);
viewComponent.setType(propertyDescriptor.getType().toString());
IView<RComponent> view = constructView(viewComponent, null, connector);
return view;
}
private RDateField createRDateField(IValueConnector connector) {
RDateField component = new RDateField(guidGenerator.generateGUID());
if (connector instanceof IRemoteStateOwner) {
component.setState(((IRemoteStateOwner) connector).getState());
}
return component;
}
@Override
public void setGuidGenerator(IGUIDGenerator guidGenerator) {
this.guidGenerator = guidGenerator;
super.setGuidGenerator(guidGenerator);
}
private IFormatter createDateFormatter(
ILocalDatePropertyDescriptor propertyDescriptor,
Locale locale) {
return createFormatter(createDateFormat(propertyDescriptor, locale), propertyDescriptor);
}
private IFormatter createDateFormatter(
ILocalDateTimePropertyDescriptor propertyDescriptor,
Locale locale) {
return createFormatter(createDateFormat(propertyDescriptor, locale), propertyDescriptor);
}
private IFormatter createFormatter(DateFormat format, ILocalDatePropertyDescriptor marker) {
return new LocalDateFormatAdapter(format);
}
private IFormatter createFormatter(DateFormat format, ILocalDateTimePropertyDescriptor marker) {
return new LocalDateTimeFormatAdapter(format);
}
}
