package minime.ui;
import javax.microedition.lcdui.Graphics;
import minime.Drawable;
import minime.Image;
import minime.Logger;
import minime.Portability;
import minime.core.Component;
import minime.core.Event;
import minime.gen.ImageRscId;
public class ScrollbarContainer extends Component{
static Logger LOG=Logger.getLogger("ScrollBar");
private Image scrollBgImage;
private Image scrollImage;
private ImagePanel scrollBgPanel;
private ImagePanel scrollPanel;
//The actual height of the sliding image
private int scrollBarHeight;
//The y-position of the scroll bar
private int top=0;
private IScrollObject scrollableObject;
public ScrollbarContainer(IScrollObject scrollableObject)
{
scrollBgImage=new Image(ImageRscId.IM_SCROLL_BACKGROUND);
scrollImage=new Image(ImageRscId.IM_SCROLL_IMAGE);
scrollBgPanel=new ImagePanel(scrollBgImage);
scrollPanel=new ImagePanel(scrollImage);
this.scrollableObject=scrollableObject;
}
public void setHeight(int height)
{
scrollableObject.setHeight(height);
super.setHeight(scrollableObject.getHeight());
}
public void setWidth(int width)
{
scrollableObject.setWidth(width-scrollBgPanel.getWidth());
super.setWidth(width);
}
/**
* Scale the scroll bar background image and the sliding image
*/
private void scaleScrollImages()
{
scrollBarHeight=(int)(scrollableObject.getDisplayPercentage()*getHeight());
LOG.debug("scroll background image width: "+scrollBgImage.getWidth()+" height:"+getHeight());
LOG.debug("scroll sliding image width: "+scrollImage.getWidth()+" height:"+scrollBarHeight);
scrollBgPanel.setImage(scrollBgImage.scaleBresenham(scrollBgImage.getWidth(),getHeight(),true));
scrollPanel.setImage(scrollImage.scaleBresenham(scrollImage.getWidth(),scrollBarHeight, true));
}
protected void layoutImp(){
scrollableObject.setPosition(0,0);
scrollableObject.layout();
if(scrollableObject.isScrollable())
{
scaleScrollImages();
scrollBgPanel.setPosition(getWidth()-scrollBgPanel.getWidth(),scrollableObject.getStartScrollTop());
scrollPanel.setPosition(getWidth()-scrollPanel.getWidth(),scrollableObject.getStartScrollTop()+top);
LOG.debug("Scroll panel top: "+scrollPanel.getTop()+" left:"+scrollPanel.getLeft());
}
}
public void renderImpl(Graphics gc) {
scrollableObject.render(gc);
if(scrollableObject.isScrollable())
{
scrollBgPanel.render(gc);
scrollPanel.render(gc);
}
}
public boolean onEvent(Event evt) {
boolean handled=false;
handled=scrollableObject.onEvent(evt);
if(evt.type==Event.KEY_EVENT&&scrollableObject.isScrollable())
{
//Handle the key_up and key_down event
if(evt.paramB==Portability.KEY_UP_GAME_ACTION||evt.paramB==Portability.KEY_DOWN_GAME_ACTION)
{
top=(int)(scrollableObject.getScrollPercentage()*getHeight())+scrollableObject.getStartScrollTop();
scrollPanel.setTop(top);
minime.core.Runtime.getInstance().repaint();
}
}
return handled;
}
public IScrollObject getScrollableObject() {
return scrollableObject;
}
}
|