package org.korsakow.ide.ui.interfacebuilder.widget;
import java.awt.BorderLayout;
import java.awt.Component;
import org.apache.commons.logging.LogFactory;
import org.dsrg.soenea.domain.MapperException;
import org.korsakow.domain.interf.IMedia;
import org.korsakow.domain.interf.ISnu;
import org.korsakow.domain.mapper.input.MediaInputMapper;
import org.korsakow.domain.mapper.input.SnuInputMapper;
import org.korsakow.ide.Application;
import org.korsakow.ide.lang.LanguageBundle;
import org.korsakow.ide.resources.ResourceType;
import org.korsakow.ide.resources.WidgetType;
import org.korsakow.ide.resources.media.MediaFactory;
import org.korsakow.ide.resources.media.Playable;
import org.korsakow.ide.resources.property.LongProperty;
import org.korsakow.ide.resources.widget.ScalingPolicy;
import org.korsakow.ide.resources.widget.WidgetComponent;
import org.korsakow.ide.resources.widget.WidgetModel;
import org.korsakow.ide.resources.widget.WidgetPropertiesEditor;
import org.korsakow.ide.resources.widget.editors.SnuFixedLinkWidgetEditor;
import org.korsakow.ide.ui.components.ResourceIcon;
import org.korsakow.ide.ui.interfacebuilder.widget.MediaArea.AspectRatioWrapper;
public class SnuFixedLink extends AbstractLink
{
protected static class SnuFixedLinkWidgetComponent extends AbstractLinkWidgetComponent
{
protected ResourceIcon icon;
private Component mediaComponent;
private AspectRatioWrapper wrapper;
private Playable playable;
public SnuFixedLinkWidgetComponent(WidgetModel owner)
{
super(owner);
}
@Override
protected void initUI()
{
super.initUI();
setLayout(new BorderLayout());
add(label, BorderLayout.NORTH);
label.setText(LanguageBundle.getString("widget.snufixedlink.label"));
icon = new ResourceIcon();
// add(icon);
}
public void setSnu(Long snuId)
{
if (snuId != null) {
ISnu snu;
try {
snu = SnuInputMapper.map( snuId );
} catch (MapperException e) {
Application.getInstance().showUnhandledErrorDialog( e );
icon.clear();
setMedia(null);
return;
}
icon.setResource(ResourceType.forId(snu.getType()).getIcon(), snu.getName());
try {
setMedia(MediaInputMapper.map(snu.getMainMedia().getId()));
} catch (MapperException e) {
LogFactory.getLog(getClass()).error("", e);
icon.clear();
setMedia(null);
}
} else {
icon.clear();
setMedia(null);
}
}
private void setMedia(IMedia media)
{
if (playable != null) {
playable.dispose();
playable = null;
}
if (mediaComponent != null) {
mediaComponent.getParent().remove(mediaComponent);
mediaComponent = null;
}
label.setVisible(media == null);
if (media != null) {
playable = MediaFactory.getMediaNoThrow(media);
mediaComponent = playable.getComponent();
wrapper = new MediaArea.AspectRatioWrapper(mediaComponent, playable, getWidget().getScalingPolicy());
add(wrapper, BorderLayout.CENTER);
}
revalidate();
repaint();
}
@Override
public SnuFixedLink getWidget() {
return (SnuFixedLink)super.getWidget();
}
public AspectRatioWrapper getWrapper() {
return wrapper;
}
}
@Override
protected WidgetComponent createComponent()
{
return new SnuFixedLinkWidgetComponent(this);
}
@Override
protected WidgetPropertiesEditor createWidgetEditor()
{
return new SnuFixedLinkWidgetEditor(this);
}
private Long snuId;
public SnuFixedLink()
{
super(WidgetType.SnuFixedLink);
scalingPolicy = ScalingPolicy.MaintainAspectRatio;
addProperty(new LongProperty("snuId") {
@Override
public Long getValue() { return snuId; }
@Override
public void setValue(Long value) { setSnu(value); }
});
}
@Override
public SnuFixedLinkWidgetComponent getComponent() {
return (SnuFixedLinkWidgetComponent)super.getComponent();
}
public void setSnu(Long snu)
{
Long oldSnu = snuId;
snuId = snu;
getComponent().setSnu(snu);
firePropertyChange("snu", oldSnu, snuId);
}
public Long getSnu()
{
return snuId;
}
@Override
public void setScalingPolicy(ScalingPolicy scalingPolicy)
{
if (getComponent().getWrapper() != null)
getComponent().getWrapper().setScalingPolicy(scalingPolicy);
super.setScalingPolicy(scalingPolicy);
}
}