/*
* JavaXYQ Engine
*
* javaxyq@2008 all rights.
* http://www.javaxyq.com
*/
package com.javaxyq.ui;
import java.awt.Graphics;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import com.javaxyq.core.ResourceStore;
import com.javaxyq.core.Toolkit;
import com.javaxyq.event.PanelEvent;
import com.javaxyq.model.Option;
import com.javaxyq.util.StringUtils;
import com.javaxyq.widget.Sprite;
/**
* ����Ի����
*
* @author ����ΰ
* @history 2008-6-9 ����ΰ �½�
*/
public class TalkPanel extends Panel {
private static final long serialVersionUID = -1282924443598182483L;
private static final int HEAD_OFFSET = 12;
private String talker;
private MouseListener optionHandler = new OptionHandler(this);
private Option result;
private static class OptionHandler implements MouseListener {
private TalkPanel panel;
public OptionHandler(TalkPanel panel) {
this.panel = panel;
}
@Override
public void mouseClicked(MouseEvent e) {
OptionLabel label = (OptionLabel) e.getSource();
label.getOption().setSelected(true);
this.panel.setResult(label.getOption());
this.panel.close();
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
}
public TalkPanel(int width, int height) {
this(width, height, true, true);
}
public TalkPanel(int width, int height, boolean closable, boolean movable) {
super(width, height, closable, movable);
setClickClosabled(true);
}
@Override
public void paint(Graphics g) {
super.paint(g);
try {
if (this.talker != null) {
Sprite s = ResourceStore.getInstance().findPhoto(talker);
Shape oldclip = g.getClip();
g.translate(-getX(), -getY());
g.setClip(0, 0, 640, 480);
s.draw(g, getX() + HEAD_OFFSET, getY()- s.getHeight());
g.translate(getX(), getY());
g.setClip(oldclip);
}
} catch (Exception e) {
System.err.println("���ƶԻ�����ͷ��ʧ��! character="+talker);
e.printStackTrace();
}
}
@Override
public void paintImmediately(int x, int y, int w, int h) {
// super.paintImmediately(x, y, w, h);
}
public String getTalker() {
return talker;
}
public void setTalker(String talker) {
this.talker = talker;
}
public void initTalk(String text, Option[] options) {
this.result = null;
this.removeAll();
RichLabel lblText = Toolkit.getInstance().createRichLabel(16, 30, 450, 130, text);
this.add(lblText);
int y0 = lblText.getHeight() + lblText.getY() + 10;
for (int i = 0; options != null && i < options.length; i++) {
Option option = options[i];
OptionLabel label = Toolkit.getInstance().createOptionLabel(20, y0 + i * 20, 450, 18, option);
label.addMouseListener(optionHandler);
this.add(label);
}
}
/**
* @return
*/
public Option getResult() {
return result;
}
/**
* @param option
*/
protected void setResult(Option result) {
this.result = result;
if (!processDefaultActions()) {
PanelEvent evt = new PanelEvent(this, result.getAction(), StringUtils.split(String.valueOf(result
.getValue()), " "));
fireEvent(evt);
}
}
/**
* @param panel
* @param result
*/
private boolean processDefaultActions() {
System.out.println("processDefaultActions: " + result);
String action = result.getAction();
if (action != null) {
if ("close".equals(action)) {
//this.close();
return true;
} else if ("prev".equals(action)) {
// TODO ��һ������
return true;
} else if ("next".equals(action)) {
// TODO ��һ������
return true;
}
}
return false;
}
}