package ui; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.Component; import java.awt.Font; import java.awt.Color; import java.awt.FontMetrics; import javax.swing.AbstractButton; import javax.swing.JLabel; 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 java.util.*; import com.javaxyq.battle.BattleCanvas; import com.javaxyq.core.GameMain; import com.javaxyq.core.SpriteFactory; import com.javaxyq.event.ActionEvent; import com.javaxyq.event.PanelEvent; import com.javaxyq.event.PanelHandler; import com.javaxyq.config.ImageConfig; import com.javaxyq.ui.ItemLabel; import com.javaxyq.ui.Label; import com.javaxyq.ui.Panel; import com.javaxyq.util.StringUtils; import com.javaxyq.widget.Player; import com.javaxyq.model.Skill; import com.javaxyq.core.*; import com.javaxyq.data.BaseItemDAO; import com.javaxyq.data.SkillMain; /** * @author wpaul * @date 2014-5-15 create */ public class main_skill extends PanelHandler implements MouseListener,MouseMotionListener{ private List<SkillMain> skills; private List<Skill> magicskills; private List<Label>labels; private List<AbstractButton>buttons; private int textrow; private StringBuffer sb; private Expression expression; //private int index; public void initial(PanelEvent evt) { super.initial(evt); //this.updateLabels(panel); labels = new ArrayList<Label>(); buttons = new ArrayList<AbstractButton>(); Player player = context.getPlayer(); String school = player.getData().school; skills = dataManager.findMainSkill(school); magicskills = new ArrayList<Skill>(); sb = new StringBuffer(); textrow = 0; for(int s=0; s<skills.size(); s++){ SkillMain skill = skills.get(s); Label mainskill = (Label) this.panel.findCompByName("����"+s); Label mskilllevel = (Label) this.panel.findCompByName("skill"+s); mainskill.setAnim(SpriteFactory.loadAnimation("wzife/skillmain/normal/"+ skill.getId()+".tcp")); mainskill.addMouseListener(this); mainskill.addMouseMotionListener(this); labels.add(mainskill); labels.add(mskilllevel); } this.updateLabels(this.panel); AbstractButton button_down = (AbstractButton)this.panel.findCompByName("���°�ť"); AbstractButton button_up = (AbstractButton)this.panel.findCompByName("���ϰ�ť"); buttons.add(button_up); buttons.add(button_down); } public void school_skill(ActionEvent evt) { Player player = context.getPlayer(); String school = player.getData().school; skills = dataManager.findMainSkill(school); /*for(int s=0; s<skills.size(); s++){ SkillMain skill = skills.get(s); Label mainskill = (Label) this.panel.findCompByName("����"+s); mainskill.setAnim(SpriteFactory.loadAnimation("wzife/skillmain/normal/"+ skill.getId()+".tcp")); mainskill.addMouseListener(this); mainskill.addMouseMotionListener(this); labels.add(mainskill); }*/ for(Label label:labels){ System.out.println("label is:"+label); panel.add(label); } for(AbstractButton button:buttons){ panel.add(button); } String background = "/wzife/dialog/mskill.tcp/"; panel.setBgImage(new ImageConfig(background)); //updateSkills(); //println "background is : $background" //this.panel.setBgImage(new ImageConfig(background)); } public void plot_skill(ActionEvent evt) { for(Label label:labels){ //label.setAnim(SpriteFactory.loadAnimation("")); panel.remove(label); //label.removeMouseListener(this); //label.removeMouseMotionListener(this); } String background = "/wzife/dialog/plotskill.tcp/"; panel.setBgImage(new ImageConfig(background)); //println "background is : $background" //this.panel.setBgImage(new ImageConfig(background)); } public void assist_skill(ActionEvent evt) { for(Label label:labels){ //label.setAnim(SpriteFactory.loadAnimation("")); panel.remove(label); //label.removeMouseListener(this); //label.removeMouseMotionListener(this); } String background = "/wzife/dialog/assistskill.tcp/"; panel.setBgImage(new ImageConfig(background)); //Component[] comps = panel.getComponents(); //println "background is : $background" //this.panel.setBgImage(new ImageConfig(background)); } public void practice_skill(ActionEvent evt) { for(Label label:labels){ //label.setAnim(SpriteFactory.loadAnimation("")); panel.remove(label); //label.setText(""); //label.removeMouseListener(this); //label.removeMouseMotionListener(this); } for(AbstractButton button:buttons){ panel.remove(button); } String background = "/wzife/dialog/practiceskill.tcp/"; panel.setBgImage(new ImageConfig(background)); //println "background is : $background" //this.panel.setBgImage(new ImageConfig(background)); } public void qjbm(ActionEvent evt) { /*String fname = "wzife.wd2" String background = "���� "+evt.getActionCommand();*/ } public void text_down(ActionEvent evt){ if(!sb.toString().equals("")){ Label skilldes = (Label) this.panel.findCompByName("����˵��"); textrow++; String tt = sb.toString(); for(int i=0; i<textrow; i++){ int index = tt.indexOf("<br>")+4; tt = tt.substring(index); } String sdes = "<html>" + tt + "</html>"; skilldes.setText(sdes); } } public void text_up(ActionEvent event){ Label skilldes = (Label) this.panel.findCompByName("����˵��"); if(textrow>0){ textrow--; } String tt = sb.toString(); for(int i=textrow; i>0; i--){ int index = tt.indexOf("<br>")+4; tt = tt.substring(index); } String sdes = "<html>" + tt + "</html>"; skilldes.setText(sdes); } /*private void updateLabels(Panel panel) { Component[] comps = panel.getComponents(); labels = new ArrayList<Label>(); for (Component c : comps) { if (c instanceof Label) { System.out.println("lable"+c); labels.add((Label) c); } } for(Label label : labels) { label.addMouseListener(this); label.addMouseMotionListener(this); } }*/ private void processSkill(MouseEvent e){ Object c = e.getComponent(); if(c instanceof Label){ Label label = (Label)c; String name = label.getName(); if(name.contains("����")){ int index = Integer.parseInt(name.substring(2)); String[] magics = skills.get(index).getMagicSkill().split("��"); magicskills.removeAll(magicskills); int p = 0; for(String magic:magics){ if(StringUtils.equals(magic, "0")){ break; } Skill skill = dataManager.findSkillByName(magic); magicskills.add(skill); Label magicskill = (Label) this.panel.findCompByName("����"+(p++)); magicskill.setAnim(SpriteFactory.loadAnimation("wzife/skillmagic/normal/"+ skill.getId()+".tcp")); magicskill.addMouseListener(this); magicskill.addMouseMotionListener(this); labels.add(magicskill); } for(int i=p;i<13;i++){ Label magicskill = (Label) this.panel.findCompByName("����"+i); magicskill.setAnim(SpriteFactory.loadAnimation("")); } processText(skills.get(index)); } else if(name.contains("����")){ int index = Integer.parseInt(name.substring(2)); processText(magicskills.get(index)); } } } private void processText(Skill skill) { //�������� String sname = skill.getName(); Label skillname = (Label) this.panel.findCompByName("��������"); skillname.setText(sname); //����˵�� textrow = 0; sb.setLength(0); Label skilldes = (Label) this.panel.findCompByName("����˵��"); skilldes.setVerticalAlignment(JLabel.NORTH); labels.add(skilldes); labels.add(skillname); //�������� String des = skill.getDescription(); sb.append(linefeed(skilldes,des)); //Ч�� String effect = skill.getEffection(); if(!effect.equals("0")){ sb.append(linefeed(skilldes,effect)); } //ʹ������ if(skill.getConditions() != null){ String conditions = skill.getConditions(); sb.append(linefeed(skilldes,conditions)); } //ʹ������ if(skill.getConsumption() != null){ String consumption = skill.getConsumption(); sb.append(linefeed(skilldes,consumption)); } String sdes = "<html>" + sb.toString() + "</html>"; skilldes.setText(sdes); } /** * * @param skilldes * @desc �Զ����� * @return */ private String linefeed(Label skilldes,String des){ StringBuffer sb = new StringBuffer(); char[] deschar = des.toCharArray(); FontMetrics fm = skilldes.getFontMetrics(skilldes.getFont()); int linelen = 0; int offset = 0; for (int i=0;i<deschar.length;i++){ if(linelen <= skilldes.getWidth()-fm.charWidth(deschar[0])){ linelen += fm.charWidth(deschar[i]); }else{ sb.append(deschar, offset, i-offset); sb.append("<br>"); linelen = fm.charWidth(deschar[i]); offset = i; } } sb.append(deschar, offset, deschar.length-offset); sb.append("<br>"); /*int fw = fm.charWidth(deschar[0]); int fh = fm.getHeight(); int linelen = deschar.length*fw/skilldes.getWidth()+1; int offset = skilldes.getWidth()/fw; for (int i=0;i<linelen;i++){ if(i<linelen-1){ sb.append(deschar, i*offset, offset); sb.append("<br>"); }else{ sb.append(deschar,i*offset,deschar.length-i*offset); sb.append("<br>"); } }*/ return sb.toString(); } public void mouseClicked(MouseEvent e) { e.consume(); switch(e.getButton()){ case MouseEvent.BUTTON1: //����������ͼ�� processSkill(e); break; } } 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(); String text = label.getTextTpl(); if(StringUtils.isNotBlank(name) && text!=null) { System.out.println("getTextTpl is:"+text); 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()); System.out.println("proerties is:"+properties); JexlContext jexlcontext = new MapContext(properties); String result = expression.evaluate(jexlcontext).toString(); System.out.println("result is:"+result); String[] items = result.split("#;"); for (String item : items) { String[] values = item.split("#="); if(values.length>1){ System.out.println("item is:"+item); Label label = (Label) panel.findCompByName(values[0]); label.setText(values[1]); } } } } public void mouseMoved(MouseEvent e) {} 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){} }