基于Extjs的web表单设计器 第四节——控件拖放
接着上一节介绍控件拖放的设计。
通过前面的介绍知道,我们的区域类型的容器控件有三种:Card、Table、Mixed。
Card 可以支持几乎所有的常用控件,包括:文本TextField、多文本TextArea、数字NumberField、金额NumberField、日期DateField、下拉树NetDropDown、按钮Button、复选框CheckBox、单选框Radio;Table可以支持的常用控件比Card稍微少一点,它不支持button类型的控件以及多文本TextArea控件;Mixed不支持常用控件,它只支持我们的容器控件类型,就是它本身和Card和Table,它的作用就是一个嵌套作用,让我们可以生成复杂的表单模板。三个类型的容器控件支持的子控件各不相同,我们先定义一个公共的Object对象来存储一些容器相关的信息,方便我们后面处理控件拖放事件的时候做一些判断使用。
//公共配置信息
ftConfig = {
isDraging: false, //表示是否正在拖放控件
dragXY: { x: , y: }, //拖动控件时候记录坐标
panelType: 'Card Table Mixed',//表示我们容器控件类型的字符串
tableRejectType: 'Button TextArea CheckBox Radio'//表格区域不接受的控件类型字符串
};
然后就是我们具体的拖放处理代码逻辑。上一节我们介绍了使用一个Droptarget来为我们的画布控件添加了可以接收拖动、释放的功能,在Droptarget里面我们为它定义了两个事件1. notifyEnter事件,当我们的鼠标拖动控件到画布区域上面后就设置配置信息的isDraging=true;
2. notifyDrop事件,当我们在画布上释放拖动的控件后就会触发该事件,通过该事件我们获取到拖放的控件信息,并进行相关的拖放处理。
ftConfig = {
regNum: ,//区域序号
ctrolNum: ,//控件序号
isDraging: false, //表示是否正在拖放控件
dragXY: { x: , y: }, //拖动控件时候记录坐标
panelType: 'card table mixed',//表示我们容器控件类型的字符串
tableRejectType: 'button textarea checkbox radio'//表格区域不接受的控件类型字符串
};
function notifyDrop(dd, e, data) {
var c, d = data.records[].data, dropId,
type = d.type.toLocaleLowerCase();
ftConfig.isDraging = false;
switch (type) {
case 'card':
c = {
id: 'region' + ftConfig.regNum,
title: '卡片区域' + ftConfig.regNum,
type: type,
cols: , //默认为卡片区域设置4列
minHeight: ,
border: true,
collapsible: true,
bodyPadding: '5 20px 5 0',
margin: '0px 0px 5px 0',
layout: 'column',
closable: true,
defaults: { labelAlign: 'right', labelWidth: , margin: '3,0' }
}; break;
case 'table':
c = {
id: 'region' + ftConfig.regNum,
title: '表格区域' + ftConfig.regNum,
type: type,
xtype: 'grid',
height: ,
margin: '0px 0px 5px 0',
collapsible: true,
autoScroll: true,
closable: true,
columns: {}
}; break;
case 'mixed':
c = {
id: 'region' + ftConfig.regNum,
title: '混合区域' + ftConfig.regNum,
type: type,
border: true,
collapsible: true,
closable: true,
minHeight: ,
bodyPadding: '10px',
margin: '0px 0px 5px 0'
}; break;
default:
c = {
id: newID('ct'),
index: ftConfig.ctrolNum,
type: type,
xtype: type,
fieldLabel: '控件'
}; break;
}
dropId = e.target.id.split('-')[];
dropId = dropId === 'gridview' ? e.target.parentNode.id.split('-')[] : dropId;
return addRegionControl(dropId, c);
}
notifyDrop function
//添加控件到区域
function addRegionControl(pid, c) {
var p = findRegion(pid);
if (!p) return false;
if (ftConfig.panelType.indexOf(c.type) >= && p.type !== 'mixed') {//如果是区域控件就只能放在mixed类型panel里面;
p = p.findParentByType('panel');
if (p) {
return addRegionControl(p.id, c);
}
return false;
}
else if (ftConfig.panelType.indexOf(c.type) < ) {
if (p.type === 'mixed') {//如果是其他控件就不能放到mixed类型panel里面;
return false;
}
else if (p.type === 'table') {//如果是控件添加到表格区域的处理
var index = p.columns.length + ;
p.addColumn({ text: '列' + index, width: , cls: "center", align: 'left' });
}
else {//(p.type === 'card') 如果是添加控件到卡片区域的处理
c.columnWidth = / p.cols;
p.add(c);
}
}
else {
p.add(c);
}
ftConfig.ptype.indexOf(c.type) >= ? ftConfig.regNum++ : ftConfig.ctrolNum++;
return true;
}
//根据Id查找区域的可用控件或者父级控件
function findRegion(id) {
if (!id || !(c = Ext.getCmp(id)))
return null;
if (c.type && ftConfig.panelType.indexOf(c.type) >= ) {
return c;
}
else {
var p = c.findParentByType('panel');
if (p) {
return findRegion(p.id);
}
return null;
}
}
add control process
通过上面的拖放处理逻辑我们已经可以初步的设计表单模板了,下面附上4张图片操作效果图:
图一

图二

图三

图四

大家可以看看拖放前后四张图的区别。
至此我们实现了设计器最重要的一步——拖拽控件,好吧这一节就先到这里。。。洗洗睡了。
基于Extjs的web表单设计器 第四节——控件拖放的更多相关文章
- 基于Extjs的web表单设计器 第七节——取数公式设计之取数公式的使用
基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extj ...
- 基于Extjs的web表单设计器 第六节——界面框架设计
基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extj ...
- 基于Extjs的web表单设计器 第五节——数据库设计
这里列出表单设计器系列的内容,6.7.8节的内容应该在春节后才有时间出了.因为这周末就请假回老家了,准备我的结婚大事.在此提前祝大家春节快乐! 基于Extjs的web表单设计器 基于Extjs的web ...
- 基于Extjs的web表单设计器 第三节——控件拖放
看过之前设计器截图的朋友应该有印象,可能会发觉我们的设计器UI设计布局其实类似Visual studio 的设计界面,采用的是左.中.右三个区域布局.左侧为控件区域.中间为表单的画布设区域.右侧为属性 ...
- 基于Extjs的web表单设计器
由于这样工作和自身的一些原因很长一段时间没有写过博客了.最近想把自己前面一段时间搞出的一个表单设计器的相关经验或者经历记录下来.分享给大家,也算是对自己前2个月的一个总结回顾吧. 首先介绍一下开发此版 ...
- 基于Extjs的web表单设计器 第一节
前面一节介绍了表单设计器的背景和最终的大概样式,本节主要介绍表单设计器的需求及功能设计. 在讲需求之前先明确几个常用的概念: 主表或者卡片表——具有多行多列的一个区域的控件块,如下图所示. 明细表—— ...
- 基于Extjs的web表单设计器 第二节——表单控件设计
这一节介绍表单设计器的常用控件的设计. 在前面两章节的附图中我已经给出了表单控件的两大分类:区域控件.常用控件.这里对每个分类以及分类所包含的控件的作用进行一一的介绍,因为它们很重要,是表单设计器的基 ...
- YbSoftwareFactory 代码生成插件【十六】:Web 下灵活、强大的审批流程实现(含流程控制组件、流程设计器和表单设计器)
程序=数据结构+算法,而企业级的软件=数据+流程,流程往往千差万别,客户自身有时都搞不清楚,随时变化的情况更是家常便饭,抛开功能等不谈,需求变化很大程度上就是流程的变化,流程的变化会给开发工作造成很大 ...
- .net web 开发平台- 表单设计器 一(web版)
如今为了适应需求的不断变化,动态表单设计器应运而生.它主要是为了满足界面的不断变化和提高开发速度.比如:一些页面客户可能也无法确定页面的终于布局,控件的位置,在哪种情况下显示或不显示等可能须要随时改动 ...
随机推荐
- 支持高并发的IIS Web服务器常用设置 II
适用的IIS版本:IIS 7.0, IIS 7.5, IIS 8.0 适用的Windows版本:Windows Server 2008, Windows Server 2008 R2, Windows ...
- unity3d webplayer 16:9 居中显示模板
原地址:http://www.cnblogs.com/88999660/archive/2013/04/12/3016773.html <!DOCTYPE html PUBLIC "- ...
- [BZOJ3624][Apio2008]免费道路
[BZOJ3624][Apio2008]免费道路 试题描述 输入 输出 输入示例 输出示例 数据规模及约定 见“输入”. 题解 第一步,先尽量加入 c = 1 的边,若未形成一个连通块,则得到必须加入 ...
- HDU 1231 最大连续子序列 &&HDU 1003Max Sum (区间dp问题)
C - 最大连续子序列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- jQuery backgroundColor的animate效果
我们知道jQuery几乎是我们最常用的javascript库了,不过尽管他自己本身拥有大量的特效,但却仍然缺少一些动画效果.比如说,颜色.背景颜色的变换. animate一般只支持大小,位置,透明度的 ...
- Longest Substring with At Most K Distinct Characters
Given a string, find the longest substring that contains only two unique characters. For example, gi ...
- Android Volley获取json格式的数据
为了让Android能够快速地访问网络和解析通用的数据格式Google专门推出了Volley库,用于Android系统的网络传输.volley库可以方便地获取远程服务器的图片.字符串.json对象和j ...
- c标签设置jsp页面的绝对路径
<%@ page language="java" pageEncoding="UTF-8"%><%@ taglib prefix=" ...
- JDK1.7 HashMap 源码分析
概述 HashMap是Java里基本的存储Key.Value的一个数据类型,了解它的内部实现,可以帮我们编写出更高效的Java代码. 本文主要分析JDK1.7中HashMap实现,JDK1.8中的Ha ...
- July 30th, Week 31st Saturday, 2016
No matter how far you may fly, never forget where you come from. 无论你能飞多远,都别忘了你来自何方. No matter how fa ...