/*
* JavaXYQ Source Code
* by kylixs
* at 2009-11-27
* please visit http://javaxyq.googlecode.com
* or mail to kylixs@qq.com
*/
package ui;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.swing.JComponent;
import javax.swing.SwingUtilities;
import org.apache.commons.jexl2.JexlContext;
import org.apache.commons.jexl2.JexlEngine;
import org.apache.commons.jexl2.MapContext;
import org.apache.commons.jexl2.UnifiedJEXL;
import org.apache.commons.jexl2.UnifiedJEXL.Expression;
import com.javaxyq.core.SpriteFactory;
import com.javaxyq.data.ItemInstance;
import com.javaxyq.data.WeaponItem;
import com.javaxyq.event.ActionEvent;
import com.javaxyq.event.PanelEvent;
import com.javaxyq.event.PanelHandler;
import com.javaxyq.model.ItemTypes;
import com.javaxyq.ui.ItemDetailLabel;
import com.javaxyq.ui.ItemLabel;
import com.javaxyq.ui.ItemLabel.CellType;
import com.javaxyq.ui.Label;
import com.javaxyq.ui.Panel;
import com.javaxyq.ui.UIHelper;
import com.javaxyq.util.StringUtils;
import com.javaxyq.widget.Player;
/**
* �������ҶԻ���ű�
* @author dewitt
* @date 2009-11-27 create
*/
public class item extends PanelHandler implements MouseListener,MouseMotionListener {
int x0=28,y0 = 198;
int rows = 4,cols = 5;
int cellWidth = 51,cellHeight = 51;
int x1 =197, y1 =26;
int erows = 3,ecols = 2;
int ecellWidth = 54,ecellHeight = 54;
private ItemDetailLabel detailLabel;
private ItemLabel[] itemlabels ;
private int selectedIndex = -1;
private Label selectedBorder = null;
private Label selectingBorder = null;
private ItemLabel selItemLabel = null;
private Expression expression;
public item() {
this.detailLabel = new ItemDetailLabel();
itemlabels = new ItemLabel[rows*cols+erows*ecols];
selectedBorder = new Label(SpriteFactory.loadAnimation("wzife/button/itemselected.tcp"));
selectingBorder = new Label(SpriteFactory.loadAnimation("wzife/button/itemselecting.tcp"));
}
public void initial(PanelEvent evt) {
super.initial(evt);
UIHelper.removeAllMouseListeners(panel);
this.panel.addMouseListener(this);
this.panel.addMouseMotionListener(this);
Player player = context.getPlayer();
Label face = (Label) this.panel.findCompByName("face");
face.setAnim(SpriteFactory.loadAnimation("wzife/photo/facebig/"+player.getCharacter()+".tcp"));
this.updateItems();
this.updateLabels(this.panel);
this.setAutoUpdate(true);
}
public void dispose(PanelEvent evt) {
super.dispose(evt);
this.panel.removeMouseListener(this);
this.panel.removeMouseMotionListener(this);
}
public void update(PanelEvent evt) {
this.updateLabels(this.panel);
}
/**
* װ��װ����
*/
private void takeupEquipment(ItemInstance item){
//----|-----
// 0 | 1
//----|-----
// 2 | 3
//----|-----
// 4 | 5
Player player = context.getPlayer();
int targetIndex = 0;
if(ItemTypes.isWeapon(item.getItem())){
targetIndex = 2;
player.takeupWeapon((WeaponItem) item.getItem());
System.out.println("takeup weapon: "+item.getItem());
// }else if(ItemTypes.isType(item.getItem(), ItemTypes.TYPE_EQUIPMENT)){
// targetIndex = 3;
//takeup equipment
}
ItemInstance oldItem = dataManager.getItemAt(player, targetIndex);
if(oldItem != item) {
dataManager.removeItemFromPlayer(player, item);
dataManager.setItem(player, targetIndex, item);
if(oldItem != null) {
dataManager.addItemToPlayerBag(player, oldItem);
}
}
}
/**
* ��װ����ж��
* @param item
*/
private void takeoffEquipment(ItemInstance item){
Player player = context.getPlayer();
if(ItemTypes.isWeapon(item.getItem())){
player.takeoffWeapon();
// }else if(ItemTypes.isType(item.getItem(), ItemTypes.TYPE_EQUIPMENT)){
//player.takeoffEquipment();
}
dataManager.removeItemFromPlayer(player, item);
dataManager.addItemToPlayerBag(player, item);
}
/* ������Ʒ
* @param evt
*/
public void destory_item(ActionEvent evt){
if(selItemLabel==null) {//δѡ����Ʒ
context.getWindow().getHelper().prompt("����ѡ��Ҫ���ٵ���Ʒ��Ȼ���ٵ�������١���ť��", 3000);
return;
}
dataManager.removeItemFromPlayer(context.getPlayer(), selectedIndex);
stopMoving();
updateItems();
}
/**
* ���µ�����
*/
synchronized private void updateItems() {
ItemInstance[] items = dataManager.getItems(context.getPlayer());
//----|-----
// 0 | 1
//----|-----
// 2 | 3
//----|-----
// 4 | 5
//װ����
for(int r=0;r<erows;r++) {
for(int c=0;c<ecols;c++) {
//create label
int index = r*ecols + c;
ItemInstance item = items[index];
ItemLabel label = itemlabels[index];
if(item!=null) {//�������item
if(label!=null) {//��������Ʒ
if(label.getItem() != item) {//�������ͬһ����Ʒ
label.setItem(item);
}
}else {//���ӿ���
try {
label = new ItemLabel(item);
label.setLocation(x1 + c*ecellWidth , y1+r*ecellHeight+1);
label.addMouseListener(this);
label.addMouseMotionListener(this);
panel.add(label,0);
itemlabels[index] = label;
}catch(Exception e1) {
System.out.println("���itemʧ�ܣ�"+item);
e1.printStackTrace();
}
}
label.setCellType(CellType.EQUIP);
}else {//�������
if(label!=null) {
panel.remove(label);
label.removeMouseListener(this);
label.removeMouseMotionListener(this);
itemlabels[index] = null;
}
}
}
}
//������
for(int r=0;r<rows;r++) {
for(int c=0;c<cols;c++) {
//create label
int index = r*cols + c + (erows*ecols);
ItemInstance item = items[index];
ItemLabel label = itemlabels[index];
if(item!=null) {//�������item
if(label!=null) {//��������Ʒ
if(label.getItem() != item) {//�������ͬһ����Ʒ
label.setItem(item);
}
}else {//���ӿ���
try {
label = new ItemLabel(item);
label.setLocation(x0 + c*cellWidth , y0+r*cellHeight+1);
UIHelper.removeAllMouseListeners(label);
label.addMouseListener(this);
label.addMouseMotionListener(this);
panel.add(label);
itemlabels[index] = label;
}catch(Exception e) {
System.out.println("���itemʧ�ܣ�"+item);
e.printStackTrace();
}
}
label.setCellType(CellType.BAG);
}else {//�������
if(label!=null) {
panel.remove(label);
label.removeMouseListener(this);
label.removeMouseMotionListener(this);
itemlabels[index] = null;
}
}
}
}
}
private void updateLabels(Panel panel) {
Component[] comps = panel.getComponents();
List<Label>labels = new ArrayList<Label>();
for (Component c : comps) {
if (c instanceof Label) {
labels.add((Label) c);
}
}
if(expression == null) {
try {
List<String> vars = new ArrayList<String>();
for(Label label : labels) {
String name = label.getName();
if(StringUtils.isNotBlank(name)) {
vars.add(name+"#="+ label.getTextTpl());
}
}
String tpl = StringUtils.join(vars,"#;");
JexlEngine jexl = new JexlEngine();
UnifiedJEXL ujexl = new UnifiedJEXL(jexl);
expression = ujexl.parse(tpl);
} catch (Exception e) {
System.out.println("����JEXL���ʽʧ��");
e.printStackTrace();
}
}
if(expression != null) {
Map<String, Object> properties = dataManager.getProperties(context.getPlayer());
JexlContext jexlcontext = new MapContext(properties);
String result = expression.evaluate(jexlcontext).toString();
String[] items = result.split("#;");
for (String item : items) {
String[] values = item.split("#=");
Label label = (Label) panel.findCompByName(values[0]);
label.setText(values[1]);
}
}
}
public void mouseClicked(MouseEvent e) {
e.consume();
switch(e.getButton()){
case MouseEvent.BUTTON1:
//�������ƶ���Ʒ
moveItems(e);
break;
case MouseEvent.BUTTON3:
//�Ҽ����ʹ����Ʒ
useItem(e);
break;
}
}
/**
* �ƶ���Ʒ
* @param e
*/
synchronized private void moveItems(MouseEvent e){
Object src = e.getComponent();
Point cell = getCell(e);
if(cell!=null) {
int newIndex = cell.x + cols*cell.y + 6;
if(selItemLabel!=null) {//�Ѿ�ѡ������Ʒ
if(selectedIndex == newIndex) {
stopMoving();
return;
}
Player player = context.getPlayer();
//������ܵ�����Ʒ������ƶ�
if(!overlayItems(selectedIndex, newIndex)) {
//����ģ���е�����
dataManager.swapItem(player, selectedIndex, newIndex);
}
//����ƶ�
updateItems();
stopMoving();
}else if(src instanceof ItemLabel){//ѡ����Ʒ
ItemLabel label = (ItemLabel) src;
selectedBorder.setLocation(x0+cell.x*cellWidth, y0+cell.y*cellHeight);
panel.add(selectedBorder,0);
label.setVisible(false);
helper.setMovingObject(label.getAnim(), new Point(-e.getX(),-e.getY()));
selItemLabel = label;
selectedIndex = newIndex;
}
}else {//û�е���ڵ�Ԫ���ϣ������ƶ���Ʒ
stopMoving();
}
}
/**
* ֹͣ�ƶ���Ʒ���ƶ���ɻ���ȡ���ƶ���
*/
private void stopMoving() {
if(selItemLabel!=null) {
selItemLabel.setVisible(true);
}
selectedIndex = -1;
selItemLabel = null;
helper.removeMovingObject();
panel.remove(selectedBorder);
}
/**
* �ж�������Ʒ�Ƿ���Ե��ӣ������������е���
* @param srcIndex
* @param destIndex
* @return
*/
private boolean overlayItems(int srcIndex,int destIndex) {
ItemInstance[] items = dataManager.getItems(context.getPlayer());
if(items[srcIndex]!=null && items[destIndex]!=null) {
//������ӳɹ�
if(dataManager.overlayItems(items[srcIndex],items[destIndex])) {
if(items[srcIndex].getAmount()==0) {//�����Ʒ����Ϊ0��������֮
items[srcIndex] = null;
}
return true;
}
}
return false;
}
/**
* ʹ����Ʒ
* @param e
* @return
*/
public boolean useItem(MouseEvent e) {
Component c = e.getComponent();
if (c instanceof ItemLabel) {
ItemLabel label = (ItemLabel) c;
ItemInstance item = label.getItem();
//�����װ������
if(CellType.EQUIP.equals(label.getCellType())) {
takeoffEquipment(label.getItem());
}else {
//����ڱ��������������������װ���ϣ�����ʹ����Ʒ
if(ItemTypes.isWeapon(item.getItem())){
takeupEquipment(label.getItem());
}else {
application.getItemManager().useItem(context.getPlayer(),label.getItem());
}
}
updateItems();
return true;
}
return false;
}
public void mouseMoved(MouseEvent e){
Object src = e.getComponent();
Point bagCell = getCell(e);
Point equipCell = getEquipCell1(e);
if(bagCell!=null) {
selectingBorder.setLocation(x0+bagCell.x*cellWidth-1, y0+bagCell.y*cellHeight-1);
panel.add(selectingBorder,0);
}else if(equipCell!=null){
selectingBorder.setLocation(x1+equipCell.x*ecellWidth-1, y1+equipCell.y*ecellHeight-1);
panel.add(selectingBorder,0);
}else {
panel.remove(selectingBorder);
}
if (src instanceof ItemLabel) {
ItemLabel label = (ItemLabel) src;
if(label.isVisible()) {
this.detailLabel.setItem(label.getItem());
helper.showToolTip(this.detailLabel,label,e);
}
}else {
//panel.remove(this.detailLabel);
helper.hideToolTip(this.detailLabel);
}
}
private Point getCell(MouseEvent e) {
JComponent src = (JComponent) e.getComponent();
Point p = e.getPoint();
if(src != panel) {
p = SwingUtilities.convertPoint(src, p, panel);
}
if(p.x>x0 && p.x <x0+cellWidth*cols && p.y>y0 && p.y<y0+cellHeight*rows) {
int r = (p.y-y0)/cellHeight;
int c = (p.x-x0)/cellWidth;
return new Point(c,r);
}
return null;
}
private Point getEquipCell1(MouseEvent e){
JComponent src = (JComponent) e.getComponent();
Point p = e.getPoint();
if(src != panel) {
p = SwingUtilities.convertPoint(src, p, panel);
}
if(p.x>x1 && p.x <x1+ecellWidth*ecols && p.y>y1 && p.y<y1+ecellHeight*erows) {
int r = (p.y-y1)/ecellHeight;
int c = (p.x-x1)/ecellWidth;
return new Point(c,r);
}
return null;
}
public void mousePressed(MouseEvent e) {e.consume();}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseDragged(MouseEvent e){}
}