/******************************************************************************
* Copyright (c) 2016 Oracle
* 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:
* Konstantin Komissarchik - initial implementation and ongoing maintenance
******************************************************************************/
package org.eclipse.sapphire.samples.calendar.integrated.internal;
import java.util.List;
import org.eclipse.sapphire.ElementList;
import org.eclipse.sapphire.ElementType;
import org.eclipse.sapphire.FilteredListener;
import org.eclipse.sapphire.LayeredListPropertyBinding;
import org.eclipse.sapphire.ListPropertyBinding;
import org.eclipse.sapphire.Listener;
import org.eclipse.sapphire.Property;
import org.eclipse.sapphire.PropertyBinding;
import org.eclipse.sapphire.PropertyDef;
import org.eclipse.sapphire.PropertyEvent;
import org.eclipse.sapphire.Resource;
import org.eclipse.sapphire.ValuePropertyBinding;
import org.eclipse.sapphire.samples.calendar.integrated.IAttendee;
import org.eclipse.sapphire.samples.calendar.integrated.IEvent;
import org.eclipse.sapphire.samples.calendar.integrated.IEventAttachment;
/**
* @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a>
*/
public final class EventResource extends Resource
{
private final org.eclipse.sapphire.samples.calendar.IEvent base;
public EventResource( final Resource parent,
final org.eclipse.sapphire.samples.calendar.IEvent base )
{
super( parent );
this.base = base;
final Listener listener = new FilteredListener<PropertyEvent>()
{
@Override
protected void handleTypedEvent( final PropertyEvent event )
{
final PropertyDef property = event.property().definition();
final IEvent calevent = (IEvent) element();
if( property == org.eclipse.sapphire.samples.calendar.IEvent.PROP_SUBJECT )
{
calevent.getSubject().refresh();
}
else if( property == org.eclipse.sapphire.samples.calendar.IEvent.PROP_LOCATION )
{
calevent.getLocation().refresh();
}
else if( property == org.eclipse.sapphire.samples.calendar.IEvent.PROP_NOTES )
{
calevent.getNotes().refresh();
}
else if( property == org.eclipse.sapphire.samples.calendar.IEvent.PROP_START_TIME )
{
calevent.getStartTime().refresh();
}
else if( property == org.eclipse.sapphire.samples.calendar.IEvent.PROP_END_TIME )
{
calevent.getEndTime().refresh();
}
else if( property == org.eclipse.sapphire.samples.calendar.IEvent.PROP_ATTENDEES )
{
calevent.getAttendees().refresh();
}
else if( property == org.eclipse.sapphire.samples.calendar.IEvent.PROP_ATTACHMENTS )
{
calevent.getAttachments().refresh();
}
}
};
this.base.attach( listener );
}
public org.eclipse.sapphire.samples.calendar.IEvent getBase()
{
return this.base;
}
@Override
protected PropertyBinding createBinding( final Property property )
{
final PropertyDef pdef = property.definition();
if( pdef == IEvent.PROP_SUBJECT )
{
return new ValuePropertyBinding()
{
@Override
public String read()
{
return getBase().getSubject().text( false );
}
@Override
public void write( final String value )
{
getBase().setSubject( value );
}
};
}
else if( pdef == IEvent.PROP_LOCATION )
{
return new ValuePropertyBinding()
{
@Override
public String read()
{
return getBase().getLocation().text( false );
}
@Override
public void write( final String value )
{
getBase().setLocation( value );
}
};
}
else if( pdef == IEvent.PROP_NOTES )
{
return new ValuePropertyBinding()
{
@Override
public String read()
{
return getBase().getNotes().text( false );
}
@Override
public void write( final String value )
{
getBase().setNotes( value );
}
};
}
else if( pdef == IEvent.PROP_START_TIME )
{
return new ValuePropertyBinding()
{
@Override
public String read()
{
return getBase().getStartTime().text( false );
}
@Override
public void write( final String value )
{
getBase().setStartTime( value );
}
};
}
else if( pdef == IEvent.PROP_END_TIME )
{
return new ValuePropertyBinding()
{
@Override
public String read()
{
return getBase().getEndTime().text( false );
}
@Override
public void write( final String value )
{
getBase().setEndTime( value );
}
};
}
else if( pdef == IEvent.PROP_ATTENDEES )
{
final ListPropertyBinding binding = new LayeredListPropertyBinding()
{
private final ElementList<org.eclipse.sapphire.samples.calendar.IAttendee> base
= EventResource.this.base.getAttendees();
@Override
public ElementType type( final Resource resource )
{
return IAttendee.TYPE;
}
@Override
protected Resource resource( final Object obj )
{
return new AttendeeResource( EventResource.this, (org.eclipse.sapphire.samples.calendar.IAttendee) obj );
}
@Override
protected List<?> readUnderlyingList()
{
return this.base;
}
@Override
protected Object insertUnderlyingObject( final ElementType type,
final int position )
{
return this.base.insert( org.eclipse.sapphire.samples.calendar.IAttendee.TYPE, position );
}
@Override
public void move( final Resource resource,
final int position )
{
this.base.move( ( (AttendeeResource) resource ).getBase(), position );
}
@Override
public void remove( final Resource resource )
{
this.base.remove( ( (AttendeeResource) resource ).getBase() );
}
};
return binding;
}
else if( pdef == IEvent.PROP_ATTACHMENTS )
{
final ListPropertyBinding binding = new LayeredListPropertyBinding()
{
private final ElementList<org.eclipse.sapphire.samples.calendar.IEventAttachment> base
= EventResource.this.base.getAttachments();
@Override
public ElementType type( final Resource resource )
{
return IEventAttachment.TYPE;
}
@Override
protected Resource resource( final Object obj )
{
return new EventAttachmentResource( EventResource.this, (org.eclipse.sapphire.samples.calendar.IEventAttachment) obj );
}
@Override
protected List<?> readUnderlyingList()
{
return this.base;
}
@Override
protected Object insertUnderlyingObject( final ElementType type,
final int position )
{
return this.base.insert( org.eclipse.sapphire.samples.calendar.IEventAttachment.TYPE, position );
}
@Override
public void move( final Resource resource,
final int position )
{
this.base.move( ( (EventAttachmentResource) resource ).getBase(), position );
}
@Override
public void remove( final Resource resource )
{
this.base.remove( ( (EventAttachmentResource) resource ).getBase() );
}
};
return binding;
}
return null;
}
@Override
public <A> A adapt( final Class<A> adapterType )
{
A res = super.adapt( adapterType );
if( res == null )
{
res = this.base.adapt( adapterType );
}
return res;
}
}