ext自定义编辑器
程序员文章站
2022-07-15 11:58:24
...
现在搞安卓已经有几个月了。安卓实在是博大精深,几个月下来感觉自己还是个门外汉,什么广播,什么aidl。。。都不怎么会用。做的软件总感觉把握不住。感觉道路还很漫长。既然学习路程这么漫长,过程中也有休息的时候,今天看了下以前学习ssh开发的一个系统,顿时感觉自己在退步。以前开发的,现在感觉做起来有点困难。
这个系统用的技术有ssh+jbpm+ext(呵呵,流行。。反正又是为学校做的,就不管三七二十一用上了自己想学的技术了)。
今天就讲下里面的一个自定义编辑器吧。
好像当时做的时候是百度过来一个别人写的一个自定义编辑器的。然后自己在此基础上做了几下修改。就是这样。贴下代码哦。是js代码哦。extjs的环境自己配哦。
Ext.namespace('Designer'); Ext.namespace('Designer.UI'); Ext.maxuiid = 1000; //界面元素开始序号 Ext.selectedobj = {}; //设置当前选中控件,默认为空对象, //某一时刻有且只有一个控件处于选中状态 Ext.onReady(function() { Ext.QuickTips.init(); Ext.form.Field.prototype.msgTarget = 'side'; var proxy_label = new Ext.dd.DragSource('proxy_label', {group:'dd'}); var proxy_textfield = new Ext.dd.DragSource('proxy_textfield', {group:'dd'}); //拖动完成的事件 proxy_label.afterDragDrop = function(target, e, id) { var destEl = Ext.get(id); var srcEl = Ext.get(this.getEl()); var uitype = srcEl.dom.id.split('_')[1]; /*获取X,Y坐标*/ var beginX = destEl.getX(); //目标区块的X轴初始坐标 var beginY = destEl.getY(); //目标区块的Y轴初始坐标 var eXY = e.getXY(); var dragtargetX = eXY[0]; var dragtargetY = eXY[1]; var X = dragtargetX - beginX; var Y = dragtargetY - beginY; //console.log("X:"+X+" "+"Y:"+Y); var uiobj = Designer.createui(uitype,X,Y,{});//创建UI元素 Designer.formPanel.add(uiobj); Designer.formPanel.doLayout(); } proxy_textfield.afterDragDrop=proxy_label.afterDragDrop; var target = new Ext.dd.DDTarget('target', 'dd'); //建立拖动目标区(这里的dd与上面拖动源的group:dd相同 //只有相同group的DDProxy/DragSource才会接受) var target2 = new Ext.dd.DDTarget('target2', 'dd'); Designer.uxForm(); //右侧属性表格 var right_prop = Designer.propsGrid(); right_prop.show(); }); //创建控件 Designer.createui = function(uitype,X,Y,object){ var obj = {x:X,y:Y,id:(uitype+Ext.maxuiid)}; Ext.maxuiid += 1; var uiobj=null; // 控制添加的控件类型 if(uitype=="label") { obj.text = "请输入标签"; uiobj = new Ext.form.uxLabel(obj); } else if(uitype=="textfield") { obj.text = "1@100@无"; obj.style = "background:#D9E8FB;width:100px;color:#D4D0C8;"; uiobj = new Ext.form.uxLabel(obj); } if(uitype=="label") { uiobj.on("click",function(){ //改变文本背景颜色 var el = uiobj.getEl(); //如果已经选中某个控件,则将其选中状态去除 if(Ext.selectedobj.id!=undefined){ var selectd_el = document.getElementById(Ext.selectedobj.id); var classname = selectd_el.className; if(classname.indexOf("selecteditem")!= -1){ selectd_el.className = selectd_el.className.replace("selecteditem", '') } } //设置新的选中控件,并改变其样式 Ext.selectedobj = obj ; el.addClass("selecteditem"); //将该对象的相关属性保存到以uiid为key的对象中 var uiid = obj.id; Designer.UI.uiid = obj; var formid = uiobj.getEl().findParent('form').id; ////////////////////////////////////////////////// var pos = gettargetXY(el,formid,this.getEl()); /*打开属性列表*/ if(obj.clicked!=true){ right_prop = Designer.propsGrid(); right_prop.show(); } //当前状态有且只有一个控件处于选中状态 if(uitype=="label"){ var prop_sourceobj = { "标签值":Ext.getCmp(Ext.selectedobj.id).text, "横坐标" : pos.x, "纵坐标" : pos.y }; }else { var prop_sourceobj = {}; } right_prop.setSource(prop_sourceobj); if(uitype=="label") { right_prop.on("afteredit",function() { //更新实际值 Ext.getCmp(Ext.selectedobj.id).text=right_prop.getSource().标签值; //更新显示值 Ext.getCmp(Ext.selectedobj.id).getEl().update(right_prop.getSource().标签值) // Designer.formPanel.items.each(function(item,index,length){ // alert(item.initialConfig.id); // alert(Ext.getCmp(item.id).text) // }); } ) } //增加状态控制,防止一个控件创建多次属性表格 obj.clicked = true; var label = new Ext.Resizable(uiobj.id, { handles:'all' }); ////////////////////////////////////////////////// //创建一个拖拽对象 var target = new Ext.dd.DDProxy(uiobj.id, 'dd'); //拖拽函数处理 target.onDragDrop = function(e,id){ var newpos = gettargetXY(e,id,this.getEl()); /*打开属性列表*/ if(obj.clicked!=true){ right_prop = Designer.propsGrid(); right_prop.show(); } right_prop.setSource({ "标签值":Ext.getCmp(Ext.selectedobj.id).text, "横坐标" : newpos.x, "纵坐标" : newpos.y }); //增加状态控制,防止创建多个属性表格 obj.clicked = true; //增加是否已经拖拽过,如果已经拖拽过则再拖拽的时候,默认先选中并显示属性表格 obj.dragged = true; } }); } else if(uitype=='textfield'){ uiobj.on("click",function(){ //改变文本背景颜色 var el = uiobj.getEl(); //如果已经选中某个控件,则将其选中状态去除 if(Ext.selectedobj.id!=undefined){ var selectd_el = document.getElementById(Ext.selectedobj.id); var classname = selectd_el.className; if(classname.indexOf("selecteditem")!= -1){ selectd_el.className = selectd_el.className.replace("selecteditem", '') } } //设置新的选中控件,并改变其样式 Ext.selectedobj = obj ; el.addClass("selecteditem"); //将该对象的相关属性保存到以uiid为key的对象中 var uiid = obj.id; Designer.UI.uiid = obj; var formid = uiobj.getEl().findParent('form').id; ////////////////////////////////////////////////// var pos = gettargetXY(el,formid,this.getEl()); /*打开属性列表*/ if(obj.clicked!=true){ right_prop = Designer.propsGrid(); right_prop.show(); } //当前状态有且只有一个控件处于选中状态 if(uitype=="textfield"){ var prop_sourceobj = { "横坐标" : pos.x, "纵坐标" : pos.y, "最小长度":Ext.getCmp(Ext.selectedobj.id).text.split("@")[0], "最大长度":Ext.getCmp(Ext.selectedobj.id).text.split("@")[1], "约束条件":Ext.getCmp(Ext.selectedobj.id).text.split("@")[2] }; }else { var prop_sourceobj = {}; } right_prop.setSource(prop_sourceobj); if(uitype=="textfield") { right_prop.on("afteredit",function() { //更新实际值 Ext.getCmp(Ext.selectedobj.id).text=right_prop.getSource().最小长度+"@"+right_prop.getSource().最大长度 +"@"+right_prop.getSource().约束条件; //更新显示值 Ext.getCmp(Ext.selectedobj.id).getEl().update(right_prop.getSource().最小长度+"@"+right_prop.getSource().最大长度 +"@"+right_prop.getSource().约束条件) } ) } //增加状态控制,防止一个控件创建多次属性表格 obj.clicked = true; var label = new Ext.Resizable(uiobj.id, { handles:'all' }); ////////////////////////////////////////////////// //创建一个拖拽对象 var target = new Ext.dd.DDProxy(uiobj.id, 'dd'); //拖拽函数处理 target.onDragDrop = function(e,id){ var newpos = gettargetXY(e,id,this.getEl()); /*打开属性列表*/ if(obj.clicked!=true){ right_prop = Designer.propsGrid(); right_prop.show(); } right_prop.setSource({ "横坐标":newpos.x, "纵坐标":newpos.y, "最小长度":Ext.selectedobj.text.split("@")[0], "最大长度":Ext.selectedobj.text.split("@")[1], "约束条件":Ext.selectedobj.text.split("@")[2] }); //增加状态控制,防止创建多个属性表格 obj.clicked = true; //增加是否已经拖拽过,如果已经拖拽过则再拖拽的时候,默认先选中并显示属性表格 obj.dragged = true; } }); } return uiobj; } Designer.uxForm = function (){ var formPanel = new Ext.form.FormPanel({ id:'formpanelid', header:false, //frame:true, border:true, layout:"absolute", width :750, height :600, renderTo:"uxform", buttonAlign:'center', buttons:[ { text:'提交', handler:function() { Ext.MessageBox.prompt("系统提示","请输入模板名称",function(e,text){ if(e=="ok") { if(text!="") { //传递模板相关信息 var templatename=text; var positionx=new Array(); var positiony=new Array(); var modulename=new Array(); var modulevalue=new Array(); var width=new Array(); var height=new Array(); formPanel.items.each(function(item,index,length){ var pos = gettargetXY(item.getEl(),formpanelid,this.getEl()); positionx.push(pos.x) positiony.push(pos.y) modulename.push(item.initialConfig.id) modulevalue.push(Ext.getCmp(item.id).text) width.push(item.getWidth()) height.push(item.getHeight()) }); Ext.Ajax.request({ url: 'doaddmoduleAction.action', waitTitle : '系统提示', waitMsg : '正在添加,请稍候...', success: function(response) { Ext.Msg.alert('添加成功', "添加成功"); }, failure: function(response) { Ext.Msg.alert('添加失败', "建议您重新刷新后,再使用,如还是不行,请联系开发人员"); }, params: {templatename:templatename,positionx:positionx,positiony:positiony,modulename:modulename,modulevalue:modulevalue,width:width,height:height,templatename:templatename} }); } else { Ext.Msg.alert("系统提示","模板名称不能为空") } } }) } } ] }); Designer.formPanel = formPanel; var formPanelDropTargetEl = formPanel.body.dom; var formPanelDropTarget = new Ext.dd.DropTarget(formPanelDropTargetEl, { id:'targetid', group : 'dd', notifyEnter : function(ddSource, e, data) { }, notifyDrop : function(ddSource, e, data){ } }); Designer.target = formPanelDropTarget; } /*获取相对父容器的坐标值的方法*/ function gettargetXY(e,id,el){ var destEl = Ext.get(id); var srcEl = el; /*获取X,Y坐标*/ var beginX = destEl.getX(); //目标区块的X轴初始坐标 var beginY = destEl.getY(); //目标区块的Y轴初始坐标 var eXY = e.getXY(); var dragtargetX = eXY[0]; var dragtargetY = eXY[1]; var X = dragtargetX - beginX; var Y = dragtargetY - beginY; return {x:X,y:Y}; } /*属性表格的定义*/ Designer.propsGrid = function(){ if(typeof Ext.grid_propgrid !='undefined' ){ return Ext.grid_propgrid; } Ext.grid_propgrid = new Ext.grid.PropertyGrid({ id:"prop_grid_right", renderTo: 'prop-grid', width: 300, hidden:true, autoHeight: true, source: { "横坐标":0, "纵坐标":0 }, customEditors: { "约束条件": new Ext.grid.GridEditor( new Ext.form.ComboBox({ fieldLabel : '约束条件', hiddenName : 'permissionobjectName', store : new Ext.data.SimpleStore({ fields : ['objectValue', 'permissionobjectName'], data : [['数字', '数字'], ['字母或数字', '字母或数字'], ['中文', '中文'], ['无', '无'] ] }), valueField : 'objectValue', displayField : 'permissionobjectName', typeAhead : true, mode : 'local', triggerAction : 'all', allowBlank:false, blankText : '请对象名称', emptyText : '选择对象名称', selectOnFocus : true }) )}, viewConfig : { forceFit: true, scrollOffset: 2 // the grid will never have scrollbars } }); return Ext.grid_propgrid; } Ext.form.uxLabel = Ext.extend(Ext.form.Label, { }); Ext.form.uxLabel.prototype.afterRender = Ext.form.uxLabel.prototype.afterRender.createSequence( function() { this.relayEvents(this.el, ['click']); } );
这应该就是核心的代码了。老实说当时是怎么在原来的基础上改的我也忘了。extjs我也已经忘得差不多了,但我存了些基本控件代码。
表达的不是很好,但我会好好提高上去的。