基于gef的minigui可视化开发工具设计
1 概 述
随着嵌入式系统的广泛应用,图形用户界面(graphical user interface,gui)在嵌入式系统中的地位也越来越重要。
目前比较成熟的嵌入式gui系统包括microwin-dows、qt/embedded、minigui等。microwindows可移植性好,开发重点在底层的图形引擎,但窗口系统和图形接口方面的功能还比较欠缺。qt/embedded可移植性较好,基于qt的x window程序可以非常方便地移植到嵌入式系统,但对系统硬件要求较高,主要用于手持设备。minigui最初是为了工业控制系统设计开发的,定制能力强,速度快,性能好,特别适合于实时性要求高的场合。由于受到嵌入式系统硬件资源的限制,对嵌入式系统gui的基本要求包括:占用资源少、高性能、高可靠性、可配置。本文设计的可视化开发工具选择minigui作为图形界面支持系统。
minigui是一款遵循lgpl条款的纯自由软件,是根据嵌入式系统应用特点量身定做的图形界面支持系统,得到了广泛应用。它提供了完备的多窗口机制和消息传递机制,以及对话框和常用的控件类,包括文本框、按钮、编辑框、列表框等;非常小巧,包含全部功能的库文件仅为300 kb左右。传统的minigui程序开发是基于文本编辑器的,开发人员在程序源代码编写过程中无法预先看到窗口、控件的整体效果,缺乏一个可视化的开发环境。因此,本文设计了一个minigui可视化开发工具,并使用eclipse gef(graphical editing framework)实现。
2 可视化开发工具整体设计
2.1 功能需求
可视化开发工具要提供界面布局设计功能,主要包括:界面上控件位置的摆放、属性的设置,为每个控件定义callback函数;菜单、状态条、位图编辑;响应界面编辑过程中发生的交互事件,比如drop/drag、undo/redo、move、de-lete、resize等;保存及解析呈现相应布局的功能;根据用户设计生成可运行的minigui源代码。
2.2 整体结构
可视化开发工具主要由界面设计工具和源代码生成工具两部分组成。整体结构如图1所示。
界面设计工具:实现所见即所得的界面编辑器功能,可以根据需要改变和调整显示的内容和形式,这使得用户界面的制作非常方便。采用传统的面向对象设计方法来开发可视化界面,会遇到用户界面和底层的数据杂合、接口扩展导致的类膨胀等问题,因此界面设计工具使用mvc模式设计。用户通过界面设计工具的“控件设计”设置控件属性;“交互事件响应”用于响应界面编辑过程中发生的交互事件,完成控件属性的修改。这两部分对应mvc中的control-ler。“控件类”保存控件的各种属性,对应model。“控件显示”根据控件类的属性设置显示控件,对应view。xml文档则负责保存界面布局,控件类也能够根据xml解析文档内容得到自身属性。
源代码生成工具:通过遍历所有控件类的属性,将图形用户界面布局按照运行平台要求(目前仅支持rtems)生成相应的minigui源代码。
2.3 组织结构
所有控件类通过树的形式来管理。树的顶层表示一个管理的工程,其下包括所有的对话框、菜单、状态条及位图资源,对话框的子节点是其上显示的所有控件,菜单包括弹出菜单和菜单项,状态条与对话框类似,树形结构如图2所示。由于xml文档会被java解析成树形结构,解析界面布局的过程就是一个树的遍历过程。使用树形结构来组织控件类,能够让软件在逻辑上简单易懂,控件组织关系清晰明了,并且通过树的遍历可以保存界面布局及生成源代码。
由于图形用户界面中许多元素具有共同属性,本文把这些元素的共有属性及方法抽象出来作为基类。主要使用2个基类:容器类content和控件类control。content主要包括容器id、文字属性及保存解析控件等方法;control主要包括控件id、位置大小、控件风格等属性,以及保存解析控件、生成源代码等方法。其中,对话框、菜单、状态条和位图继承自content,如图3(a)所示;对话框控件继承自control,如图3(b)所示。在生成源代码等操作时自顶向下遍历整个界面工程,可直接调用基类的方法,无需区分控件具体的类别。这样提高了代码的重用度,减少了冗余代码。
3 系统实现
gef基于mvc框架,可以方便地实现drop/drag、undo/redo、move、delete、resize等图形编辑器的基本功能,并且提供了常用的布局器,非常适合用于开发所见即所得的界面编辑器。其中,gef的editpart对应mvc中的controller,figure对应view。
本工具基于gef开发,可以最大限度地减小开发工作量,增强软件的稳定性。同时,java开发使得本工具可以在任何具有java虚拟机的系统上运行,具有良好的跨平台性。
3.1 基于gef实现的界面设计工具
本工具提供对菜单、状态条、位图,以及对话框控件(包括checkbox, combobox,pushbutton, radiobutton,monthcalendar,gridview,m1edit,progressbar,property-sheet,static,staticbox,treeview,trackbar,spinbox等)的编辑功能。对于控件的修改,可以通过属性页和在界面上直接操作来进行。属性页上的编辑通过ipropertysource接口的setpropertyvalue方法告知model,model再通过propertychangesupport类的firepropertychange方法通知editpart做出修改;来自界面上的变化被封装成request派发给editpart,editpart再通过command修改model中的数据,model在修改完数据之后告知editpart有数据被修改;editpart收到property改变的通知后,根据修改数据类型做出相应操作(比如重绘figure等)。以对cheekbox的操作为例来说明基于gef的控件处理流程,如图4所示。其中,操作a是从工具箱拖拽一个新的checkbox到dialog中;操作b是通过属性页修改checkbox显示的文本(text);操作c直接通过选中checkbox拖拽改变其大小。操作a1~a4、b1~b3、c1~c3为具体的执行流程。
3.2 图形显示问题
在gef中,每个视图只有在其父视图的有效范围内才能响应交互事件。如果直接按照minigui的控件关系来组织模型,则界面设计工具不能很好地完成与用户的交互。
以菜单为例,生成minigui中菜单部分的代码仅需完成一棵树的遍历。这棵树的每个非叶节点都是一个弹出菜单,叶节点是普通的菜单项,根节点是一个虚节点,用于串连起整个菜单,如图5(a)所示。每个节点都被称作menuitem。这种树形结构在gef显示时根据model创建的figure如图5(b)所示,其中figure11为figure1的childfigure。在gef中,只有childfigure被包含在parentfigure的有效范围内,对childfigure提出的请求才能被其parentfigure派发给childfigure对应的control-ler,并反映给model,如图5(c)所示。显然树形结构无法满足修改菜单项的需求,因此,在menuitem构成的树形结构基础上增加了由meinu组成的链表结构,同时每个menuitem都增加一个指向自己上一级menuitem的par-ent指针,如图5(d)所示。每个menu(ij)记录包括的所有menuitem(ij,k),以及创建自己的menultem(i,j)。menuitem(ij,k)表示属于menu(ij)的第k个menuitem,menu(ij)表示menuitem(i,j)展开的下级menu。所有的menu组成一个链表,gef显示的是这个链表的内容,而不是原来的menuitem树。这样,每个menuitem对应的figure就可以包含在其parentfigure中,相应的controller也就能够收到界面上传来的请求。
将menuitem属性改变为popup,可以为其建立下级子menu。新建函数的流程如下(参数是当前属性修改为popup的menuitem):
为menu新建一个menuitem的函数:
menuitem对应的figure还应提供方法dimensiongetpreferredsize(int hint,int hint2),用于获得menuitem属性改变导致的figure新的大小和位置。
menu的editpart还应提供以下方法:
①重绘自己和下面所有的menuitem及其下级的menu。函数rectangle calcmenusize(menueditpart)用于得到一个能够容纳下包括的所有menuitem的矩形。
②递归地将要update的menueditpart的下级menu中,当前可见的所有menu及其对应的menuitem变为不可见。
3.3 数据存储
可扩展标记语言(extensible markup language,xml)与其他格式的语言相比,具有以下优势:具有良好的扩展性,允许使用者创建和使用自己定义的标记来定义控件的类型和属性;树状存储结构和良好的自描述性,非常适合对界面元素进行描述;xml的灵活性提供了一种结构化的数据表示方式,使得用户界面分离于结构化数据。
因此,界面设计工具将界面设计结果存储为xml格式。由于java中提供了xml文档生成和解析的类,因而简化了编码工作量,增强了软件可靠性。
示例如下:
最外层的project表示内层都是界面的布局,第2层dialog表示其内层对应一个对话框布局,第3层由多个和对构成(xxctrl对应不同的控件名,比如buttonctrl对应button控件)。每个xxctrl代表一个控件,和对里面是控件的属性。第2层也可由多个和对构成,content可为dialog(对话框)、menu(菜单)、tool-bar(状态条)、icon(位图),其内层根据content不同而由不同的xxctrl对构成。
4 实验结果
可视化工具的运行界面如图6所示。左侧为工程管理区,可以看到当前工程建立的所有界面布局。中间部分的编辑区是一个打开的对话框布局,可在这里进行控件的drop/drag、undo/redo、move、delete、resize等操作。右侧是控件属性编辑区,用于修改控件属性(比如id、文字风格、边框等)。
结 语
本文设计了一个minigui可视化开发工具,利用eclipse gef实现。用户使用本工具可以对图形用户界面进行可视化的设计及修改,同时可以扩充自己的控件、定义控件的属性,丰富界面的表现形式。实验表明,本工具在实际系统中运行良好稳定,有效地提高了图形用户界面的开发效率。
台积电官宣3nm正式量产,五年产出1.5万亿美元
摩托罗拉改进LTE自组织网络解决方案
14项或将实现的打击犯罪新科技
Gigantic巨页与CMA的完全结合
海尔中央空调通过线上线下N个触点网络 全方位联动升级用户体验
基于GEF的MiniGUI可视化开发工具设计
养老院IPTV数字电视系统概述及功能
Python程序语法元素及程序格式框架分析
STM32CUBEMX开发GD32F303(16)----移植兆易创新SPI Nor Flash之GD25Q64Flash
配网故障定位:关键步骤与解决方案
Python爬虫之requests模块教程
【BI系统】选型常见问题解答二
中国移动杨光:打造行业应用示范,全面推动5G融入千行百业
俄罗斯推液体黄金手机?苹果iPhone X只需要3万?
Mouser引入Panasonic PAN1760模块 为您揭秘蓝牙技术
基于芯片实现高精度数字温度计测量系统的设计
魅族PRO 6s直降200,现售2499元!魅族PRO 6s大降价:5.2寸压感屏,4G+64G+24W快充!
被高通骁龙835卡住喉咙的小米6、诺基亚8结局是又被推迟!
美国推出采血机器人 有望解决使无数护士头疼的事
同轴电缆有屏蔽层吗