显示大型软件系统分层信息的方法及装置的制作方法

文档序号:6408143阅读:450来源:国知局
专利名称:显示大型软件系统分层信息的方法及装置的制作方法
技术领域
本发明涉及计算机系统,更具体地涉及图形显示大型软件系统的关键特性的方法及装置。
开发一百万行以上源代码的大型软件系统,需要许多训练有素的专业人员付出长时间的艰苦努力。软件系统具有一个总体结构,正如一座大型建筑物具有一个总体结构一样。在大型软件系统的总体结构内,有子系统,目录和文件,它们提供系统的特定功能,正如大型建筑物的层楼、边房和房间提供建筑物的功能一样。如果功能需要演化,则系统的子系统、目录和文件也可另外演化,正如当建筑物需求改变时,可以增加、去除或修复一个建筑物的边房和房间。大型建筑物具有其原始结构,显示于一系列称为篮图的易于形象化的技术说明中。为助于以后对建筑物的建造和修复,对篮图进行修改,使得原始结构和构造以及以后对原始结构和构造所做的任何改变都以视觉上可辨认并易于理解的方式显示出来。不幸的是,对于含有子系统、目录和文件的大型软件系统的原始结构和构造,以及以后的改变,以视觉可识别并易于理解的方式进行显示的方法,当前并不存在。
所知的小型软件系统的显示和显象技术不能成攻地扩大到用于大型软件系统。大型软件系统的源代码列表具有太多的细节,而难于理解。流程图和结构框图不仅变得具有过多细节,而且后来对软件系统的改变也可能放弃了与系统的当前版本毫不相关的原始流程、结构和抽象用语。另外,目前出现的大型系统的显示和显象技术,如91年《显象学报》(Proceedings Visualization)中,Johnson和Shneiderman在文章“三图显象分层信息结构的一种空间填充方法”中所提出的三图(three-map)技术,产生难于理解的显示。该三图技术用矩形填充显示区域,矩形的受控量是其面积。仅控制矩形面积造成某些矩形长且窄,某些短且宽,还有接近正方形的,但具有相同的面积。这使得结构细节难于显象,因为观者必须比较许多具有不同长度和宽度的矩形的面积,以做相应的判断。这样,在技术中,有必要以可理解的方式,对与大型软件系统的子系统、目录和文件有关的信息和统计量进行图形显示,为以后的软件维护和开发人员所用。
本发明的一个目的,是提供一种显示大型软件系统的结构和构造的装置,使得技术人员能够理解其子系统、目录和文件之间的关系。
本发明的另一个目的,是提供一种显示与大型软件系统的代码变化有关的信息和统计量的装置,使得技术人员能够理解该系统、其子系统、目录和文件的功能演化。
本发明的再一个目的,是提供一种显示大型软件系统的结构和构造的方法,使得技术人员能够理解其子系统、目录和文件之间的关系。
本发明还有一个目的,是提供一种显示与大型软件系统的代码变化有关的信息和统计量的方法,以帮助技术人员看到并理解该系统、其子系统、目录和文件的功能的演化。
根据本发明一方面的简述,前述目的通过提供一种对实体分级结构的至少一种统计量进行显示的装置实现,在计算机系统的显示中统计信息适用于该实体。该装置包括显示中的第一区,它与分级结构的最高级的一个实体相应。第一区中所含的是多个被包含的区,排列成至少一行,各行高度基本相同。每个被包含的区与最高级的一个实体之外的实体相应。每个被包含的区的面积代表相应实体的统计量。一个区中所含的每个被包含的区与分级结构的下一最高级中的一个实体相应。直接含在包含区中的被包含的区具有形状,使得直接被包含的区的相对尺寸易于从显示中看出。
根据本发明另一方面,发明目的通过提供一种对实体分级结构的至少一种统计量进行显示的方法实现,在计算机系统的显示中统计信息适用于该实体。该方法在显示中分配第一区,与分级结构中最高级一个实体相应;并且将第一区分为多个含在第一区中的被包含的区,排列为至少一行,每行高度基本相同,每个被包含的区与除最高级的一个实体之外的实体相应,每个被包含的区的面积代表相应实体的统计量,一个区中所含的每个被包含的区与分级结构的下一最高级中的一个实体相应,并且直接含在包含区中的被包含的区具有形状,使得直接被包含的区的相对尺寸易于从显示中看出。
尽管说明书得出所附的对本发明主题进行了具体明确说明的权利要求书,但通过以下描述并结合附图,本发明将更好理解。


图1是显示分层软件系统的计算机系统例的框图。
图2是显示装置和方法的读关键特性部分的流程图。
图3是以多行显示子系统相对尺寸和新开发代码比例的显示画面。
图3A是单行显示与图3所示相同信息的显示画面。
图4是最佳实施方式中显示每个子系统的相对尺寸、新开发代码比例以及目录细节的显示画面。
图5是图4中一个子系统的经放大至充满显示屏的画面。
图6是最佳实施方式中显示每个子系统中与新的、非注释源代码行和软件错误修复有关的子系统尺寸的显示画面。
图7是显示与用于软件错误修复的新的、非注释源代码行以用为修复先前软件错误中的错误而需的软件错误修复数目有关的子系统尺寸的显示画面。
图8、9和10是最佳实施方式中显示子系统尺寸关于时间(即发行版本)而变化的显示屏幕的画面。
参照图1,计算机系统101示于框图中。计算机系统101含有终端103,它向操作计算机系统101的技术人员提供输出并从之接收输入,处理机113,它执行实际操作,存储器115,它含有处理机113所执行的程序117,以及数据区119,它含有与分层软件系统有关的数据,也可含有分层软件系统本身。计算机系统101还具有一个海量存储部件120,用于存储大型程序和大量数据。
更具体些,终端103含有一个显示屏105,处理机113在显示屏上向操作员显示信息。显示屏105还含有一个指示箭头107,它确定显示屏105上的一个位置,并可在键盘109或鼠标器111的控制下移动。操作员通过从键盘109和/或鼠标器111输入对计算机系统101的运行进行控制。处理机113可以是任何种类的处理机,从个人计算机到巨型计算机。存储器115可以含有程序和数据存储用的随机存取存储器和只读存储器。海量存储部件120可以含有一个磁盘、一个光盘,或者甚至一个远程数据库。
当使用计算机系统101处理并显示大型分层软件系统的信息,即统计量时,操作员利用键盘109或鼠标器111输入一条或多条命令;处理机113如所需执行程序117,以执行命令,并在显示屏105上显示结果。然后操作员能够利用键盘109和/或鼠标器111发布一条或多条命令,以便更详细地检查或处理该结果。
现在参照图1和2,一个软件系统的名称已经在键盘109上键入或通过鼠标器111选择,以便开始对所选的软件系统的特性和结构进行显示。与关键特性有关的统计量关联于所选的软件系统,并且将这些统计量读入存储器115,若不在其中,则加以存储以备本发明的显示程序122使用。然后,处理机113处理软件系统显示程序122,以提供显示,有助于操作员更容易地理解软件系统的特性和结构。附录A中给出C语言编程的显示程序122的列表。
处理机113读入软件系统的一种发行版本(如最新版本)的非注释源代码行(NCS行)的数目,以及一个或多个先前版本的NC5行数目。NCS行数作为许多显示的基线,如下所述。技术人员将认识到能够使用其他基线单位,如源代码量,而不是NCS行数量。这样小的修改是在本发明的范围之内的。
参照图2,显示出由处理机113读入的子系统特性和统计量。每个子系统的名字与其发行标志和NCS数一起读入。另外,对于一个发行标志的每个子系统,读入新NCS行数,各子系统内的每个目录的名字,各目录内的每个文件的名字,每个目录内NCS行数,以及每个目录文件的新NCS行数。再者,也读入每个目录的软件错误修正的数目和对先前软件修正的软件错误修正数目。将统计量读入存储器115,可以对这些统计量进行快速访问,所以操作员能够使用本发明的交互和/或动画特性,而没有因经常从诸如磁盘驱动器那样的慢速设备访问数据而造成延迟。
现在参照图3,将解释对大型分层软件系统的统计量和特性的显示。首先,在显示屏301上定义一个系统显示空间303,在其中显示子系统统计量和特性。显示屏301也具有一个控制和指示空间305,位于显示空间303的左下方。显示空间303是一个交互窗口,在指示箭头和鼠标器控制下,可以在x和y方向变化尺寸。显示空间303是矩形的,这是最佳的,因为矩形表示是易于直观地理解的形式,尽管可以使用其他几何形状,如椭圆或圆,它们在本发明的范围内。
显示空间303被分为数个几何形状307,每个几何形状的尺寸,即面积代表各子系统的NCS行数。几何形状307是矩形的,但是可以使用其他几何形状,如三角形、梯形等。尤其如果使用圆形显示空间,则使用同心相临环,而不是这些环的弧和段作为几何形状代表每个子系统。
将显示空间303分为一行或多行几何形状307。每行在y方向上的延伸(即高度)基本上相同。如只有一行,如图3A所示,则所有形状在y方向上具有相同的延伸。这造成很高很窄的几何形状,难于直观地解释各空间之间的尺寸关系,仅具有统一的高度。因为很高很窄的几何形状难于直观地解释,则所以设置一个交互式行控制滑动区309。利用指示箭头107和鼠标器111将指示条从MIN拖到MAX,使显示区303中的行数从1增加到软件系统中子系统的数目作为最大数目。操作员可以选择其易于解释的行数。图3所示为6行。
子系统在每行中从左到右以降字母序排列。由于次序是由名字而不是尺寸确定的,所以显示每个几何形状307的方法也含有对不便的子系统尺寸的解决方案,如可能产生的在行尾出现非常大的文件。该方法取子系统数Subs,并除以行数Rows,取子系统的NCS数NCSL,并除以行数。显示程序122在第一行中以字母序分配待显示的子系统。显示程序122试探性地将(Subs/Rows)的商作为第一行中的子系统数。然后,显示程序122将第一行中所分配的子系统的NCS行数相加,并与(NCSL)/(Rows)的商相比。如果试探性分配的子系统的NCS行数小,则显示系统可以在该行中分配一个附加的子系统。一旦第一行分配完毕,则调节该行的高度,使得其面积与显示空间303的总面积的比值,与第一行中的子系统的NCS行数与所有子系统的NCS行总数的比值相同。该方法以同样方式处理后续行。因为每行的面积被调节为显示空间303的相应部分,则始终有用于剩余子系统的空间。这样,本发明的方案在于对高度进行稍许改变,或者在一行为所有子系统提供较多的面积,以便得到该行中的最后一个文件,或者提供较少的面积,并将行尾的最后一个文件强制到下一行首。这种行高自调节使得可以不必使用不规则的行长,或者不必在几何形状中间断开,以使填充显示空间303中不需要的行。该方案提供了显示空间303的百分之百的利用。
如上所述,每个几何形状307的面积对整个显示空间303的比例,与其相应子系统的NCS行数对整个软件系统的NCS行总数的比例相同。某些几何形状307被轻微地遮盖了。图3中,阴影的这种对比代表子系统中新编写的NCS行的比例。这样,图3显示了两种统计量,每个子系统的相对尺寸和相对于每个子系统尺寸的新代码量。如图3A所示,单行显示303A,对于显示每个子系统中新代码量是有用的,尽管难于对各子系统的相对尺寸进行解释。子系统中缺少新代码可能指示着增加新功能的地方。
图3A中,几何形状307A具有代表非新NCS行量的具有灰度的阴影。将该阴影改变到不同的灰度,指示各子系统的尺寸。在具有256或更多灰度级的灰度级计算机显示器上,这是容易提供的。可选择地,对于具有彩色显示的系统,可以使用色彩。对比色可以有助于操作员看到正被分折的系统。例如,对于彩色显示,形状307A中的非新NCS行可以用一个色彩表示,如深篮色,而形状307A中的新NCS行可以用灰色、较浅的篮色或其他对比色表示。因为色彩区分对于眼睛易于鉴别,本发明的最佳实施方式采用彩色显示,对于具有彩色显示的系统,附录A是一致的。
现在参照图4,可以显示软件系统的进一步的细节。显示空间403基本上与显示空间303相同,除代表一个子系统的每个几何形状407还具有显示于其内的相应子系统的目录。每个目录用一个几何形状表示,其尺寸,即面积,对其子系统几何形状407的面积的比率,与目录的NCS行数对其相应子系统的NCS行数的比率相同。以字母序在各子系统中排列目录。每个目录的统计量和特性也得以显示。通常统计量和特性以及目录名字在显示403中的不可读的。鉴于此,控制空间405具有交互式信息区410,逻辑上链接于指示箭头107的位置。信息区410给出指示箭头107所在处的子系统的NCS行数。该信息由滑块上的指示器的位置以图形方式给出,并由信息区410中的数字表示给出。同样,信息区410在一字母数字表示中指明指示箭头107所在处的子系统的名字。控制空间405具有变焦交互区412,并且如果指示箭头107点亮一个如子系统w1的子系统时,指示箭头位于变焦区412上,且由鼠标器111选择变焦特性,显示程序在前景中从显示空间403打开一个窗口。控制空间405的最佳实施方式也是具有多种可用色彩的显示空间。
现在参照图5,显示了一个所选子系统w1的窗口501。该实施方式中,代表子系统w1的几何形状507是矩形的,几何形状507被分成矩形509,所有矩形509在y方向上具有相同的延伸。所以,每个目录矩形509的相对尺寸,取决于其在x方向上的延伸。每个目录的名字大致位于各矩形的x方向的中心,但如果在相邻目录矩形中有可用空间,则可以伸到边界外。为避免冲突,目录的对中的名字在正x和y方向以斜线序排列。
窗口501中显示了三种阴影。浅灰520和黑522提供一个背景,它代表几何形状507所代表的整个子系统w1的代码的新NCS行的百分比(浅灰)和代码的先有NCS行的百分比(深灰或黑)。在窗口501的前景中的中灰524,代表每个目录509中新NCS行的百分比。这样,在窗口501中,所选子系统中的新NCS行的百分比,组成子系统的目录的相对尺寸,以及子系统中的每个目录的修改的NCS行量,所有这些都易于视觉比较。
在显示301的前景中可变焦打开多于一个的窗口。利用多窗口帮助操作员,每个窗口由指示箭头107的位置逻辑上键接到信息区410,以使数字和字母区显示指示箭头107所在处的子系统,甚至在子系统的变焦窗口中。当操作员完成一个窗口时,如窗口501,可以在键盘109上键入适当命令,或用鼠标器111激活相同命令,关闭窗口。
现在参照图6,描述另一重要统计量的显示。显示空间603与图4中的显示403相同,都具有代表当前发行版本的子系统及其当前目目录的相对尺寸的几何形状。然而,在显示空间603中,每个几何形状607的尺寸代表子系统中新NCS行数对软件系统中新NCS行数的比率,每个目录的尺寸代表其相应子系统的新NCS行数。再者,每个几何形状607中的对比阴影,用一个灰色阴影代表为修正软件错误而在每个子系统中包括的新NCS行的百分比,用不同的灰色阴影代表为修正一个软件错误或多个软件错误而在每个目录中所包括的新NCS行的百分比。这样,显示空间603指明了子系统和目录中在所显示的发行版本之前为补救已知的软件错误而进行的开发所在。也将显示为增加功能而非修正错误而进行新开发处的面积,因为那些几何形状607尺寸太大而阴影少。如图4和5所示,如果采用彩色显示,则这些细节最好以对比色显示,而不用图6所用的各种灰色阴影。
图7更具体地显示了为修正软件错误而改变NCS行。图7中,每个几何形状707的尺寸代表在最新软件系统版本的相应子系统中发现并修正的的软件错误数量。根据由最新发行版本发现和修正的软件错误的数量,确定目录的尺寸。图7的阴影代表所做的软件错误修正与先前软件错误修正的百分比。许多修正又修正的几何形状707,例如,子系统730,指明有故障的目录或子系统,可能最好进行重写指令并重写。
现在参照图8、9和10,解释对两个更多发行版本的软件系统的演化直观化的方法。处理机113读取所有版本的所有子系统名字和统计量,作为显示的部分。在读过程中,处理机113在存储器系统115中,建立所考虑的软件系统版本的任何一个中的存在的每个子系统的列表,以及每个子系统的最大尺寸。一旦积累起该数据,则显示空间803、903和1003(这是在显示屏301上的时间顺序)显示矩形807、907和1007所填充的行,矩形代表软件系统中所存在的每个子系统,它们的尺寸根据每个子系统中存在的最大NCS行数而定。因为这些统计量实际上是不变的,所以显示空间803、903和1003具有相同的子系统和相同的子系统矩形尺寸。
软件系统的演化由代表子系统的最大尺寸的矩形807、907和1007内的阴影尺寸变化显示。对每个子系统,阴影代表软件发行版本之一中的子系统的相对于子系统最大尺寸的尺寸。
图8的显示空间803显示了软件系统的最早版本的矩形807的阴影。图10的显示空间1003显示了较后时间的软件系统较后版本的矩形1007的阴影。交互式速度滑动器832允许操作员在鼠标器控制下选择显示空间803中的显示与显示空间1003中的显示之间的时间量。可选择地,帧滑动器834允许操作员通过指示箭头107和鼠标器111的控制选择图8所示第一和图10所示第一百零五之间的任何显示。
图9显示了图8所表示的最早版本与图10所表示的当前版本之间的过渡。图9可以表示最早和当前发行版本之间的一种实际软件版本,或者它可以表示两种发行版本之间的代码的增加。这种增加的目的在于在那些例子中增加向操作员提供的动画的平滑性,实际发行数据不足以提供软件子系统演化的平滑动画的显示。
<pre listing-type="program-listing"><![CDATA[ bottom.c1 #include <assert.h>2 #include <iostream.h>3 #include <memory.h>4 #include <stdio.h>5 #include <stdlib.h>6 #include <string.h>78 #include <Xll/Intrinsic.h>9 #include <Xll/StringDefs.h>10 #include <Xm/MainW.h>11 #include <Xm/RowColumn.h>12 #include <Xm/PushB.h>13 #include <Xm/CascadeB.h>14 #include <Xm/Frame.h>15 #include <Xm/Scale.h>16 #include <Xm/Label.h>17 #include <Xm/Form.h>18 #include <Xll/Xirisw/GlxMDraw.h>1920 #include <gl/gl.h>2122 #include "bottom.h"23 #include "seesys.h"2425 #define char_h .022627 #ifndef ABS28 # define ABS(x) ((x)>0 ?(x) -(x))29 #endif303132 void33 Bottom::drawslider(int partitions)34 {35double percentfill;36double x1,x2,y1,y2;37x1=.2;x2=.8;y1=.3;y2=.7;3839//colored partitions40double width=(x2-x1)/partitions;41for(int i=0;i<partitions;i++) {42 color(cols[i]);43 FillRect(.x1+i*width,y1,width,y2-y1);44}4546//bounding rectangle47color(MY_WHITE);48FrameRect(x1,y1,x2-x1,y2-y1);4950//draw subsystem bars in slider51double offset;52if(!do_modules) {53linewidth(3);54color(MY_WHITE);55for(i=0;i<nss;i++)56if(nframes>1)57offset=x1+ssvar[i]/maxssframevar*(x2-x1);58 else59offset=x1+ssvar[i]/maxssvar*(x2-x1);60 DrawLine(offset,y1,offset,y1+.75*(y2-y1))61 barx[i]=offset;62 }6364 if(active_ss>=0) {65color(DK_RED);66double x=barx[active_ss],67y=y1+1.25*(y2-y1);68if(ssvar[active_ss]==0)69 percentfill=0;70else71 percentfill=ssfill[active_ss]72 ssvar[active_ss]*100;73DrawLine(x,y1,x,y);74char buf[MAX_STRING];75if(do_fill[active_ssvar]==1)76 sprintf(buf,"%s%.Of(%.Of%%)",ssnames[active_ss],77ssvar[active_ss],percentfill);78else79 sprintf(buf,"%s%.Of",ssnames[active_ss],80ssvar[active_ss]); 81DrawString(x,y,buf);82}83linewidth(1);84 }85 else } //for modules86linewidth(3);87for(i=0;i<nmod;i++) {88 if(nframes>1)89 offset=x1+modvar[i]/maxmodframevar*(x2-x1);90 else91 offset=x1+modvar[i]/maxmodvar*(x2-x1);92 barx[i]=offset;93}94if(active_module>=0) (95 color(DK_RED);96 double x=barx[active_module],97 y=y1+1.25*(y2-y1);98 if(modvar[active_module]==0)99 percentfill=0;100 else101 percentfill=modfill[active_module]/102 modvar[active_module]*100;103 DrawLine(x,y1,x,y);104 char buf[MAX_STRING];105 if(domod_fill[active_modvar]==1)106sprintf(buf,"%s%.Of(%.Of%%)",107 modnames[active_module],modvar[active_module],108 percentfill);109 else110 sprintf(buf,"%s%.Of",modnames[active_module],111 modvar[active_module]);112 Drawstring(x,y,buf);169170void171Bottom::DoMouse(VxMouseActions what,int/*button*/,172XEvent const*/*xevent*/)173{174 double wmx,dist;175 int closest,ss;176177 switch(what) (178 case VxDown179 case VxMotion180 case VxDrag {181 wmx=XStoU(MouseX());182 dist=ABS(barx
-wmx);183 closest=0;184 if(do_modules) {185 for(int i=0;i<nmod;i++)186 if(ABS(barx[i]-wmx)<dist) {187dist=ABS(barx[i]-wmx);188closest=i;189 }190 if(dist<.005) {191 ::active module=closest;192 int cummods=0;193 for(i=0;i<nss;i++) {194 if(::active_module>=cummods)195 ss=i;196 cummmods+=modulesPerSS[i];197 }198 ::active ss=ss;199 pub.Changed(ACTIVE_MODULE,::active_module);200 pub.Change(ACTIVE_SS,::active_ss);201}202}203else {204for(int i=0;i<nss;i++)205if(ABS(barx[i]-wmx)<dist) {206 dist=ABS(barx[i]-wmx);207 closest=i;208 }209if(dist<.005) {210 ::active ss=closest;211 pub.Changed(ACTIVE_SS,::active_ss);212 }213 }214 break;215 }216217 default218 cout<<_FILE_<<_LINE_<<"not reached"<<endl;219 }220 }221222 void 223 Bottom::Update(int article,int/*part*/,void*)224 (113 }114 }115116 //write slider partition labels117 char buf[MAX_STRING];118 color[MY_WHITE);119 for(i=0;;i<=PARTITIONS;i++) {120 if(do_modules)121 sprintf(buf,"%.f",maxmodvar/PARTITIONS*i);122 else if(nframes>1)123 sprintf(buf,"%.f",maxssframevar/PARTITIONS*i)124 else125 sprintf(buf,"%.f",maxssvar/PARTITIONS*i);126 DrawString(x1+i*((x2-x1)/PARTITIONS),y1-7*char_h,buf,127 VxDrawCenter);128 }129 }130113 //this is a kluge132 static GLXconfig glxConfig[]= {133 { GLX_NORMAL,GLX_DOUBLE, TRUE },134 { GLX_NORMAL,GLX_COLORMAP,TRUE },135 { GLX_NORMAL,GLX_ZSIZE, GLX_NOCONFIG },136 { 0,0,0 }137};138139140Bottom::Bottom(char const *name,Widget paren)141142 //default constructors143 VxGLDrawingArea(name,parent,glxConfig),144 VxMouseable(VxDown|VxDrag|vxMotion),145 VxFunctionality(this)146{147 pub.Subscribe(this,ACTIVE_SS);148 pub.Subscribe(this,ACTIVE_MODULE);149 pub.Subscribe(this,ACTIVE_MODULE);150 pub.Subscribe(this,ACTIVE_SSVAR);151 pub.Subscribe(this,FRAME_CHANGE);152 }153154 void155 Bottom::DoExpose(int,int,int,int)156 {157 GLXwinset(MyDisplay(),Mywindow());158 ortho2(0,1,0,1);159160 color(MY_BLACX);161 clear();162163 //draw slier164 drawslider(PARTITIONS);165166 swapbuffers();167}168225 switch (article) {226 case ACTIVE_SS227 case ACTIVE_SSVAR228 case ACTIVE_MODVAR229 case FRAME_CHANGE230 case ACTIVE_MODULE231 ExposeMe();232 break;233 default234 cout<<_FILE_<<""<<_LINE_<<"ERROR-not reached"235 <<endl;236 }237238 }left.c1 #include <assert.h>2 #include <iostream.h>3 #include <memory.h>4 #include <stdio.h>5 #include <stdlib.h>6 #include <string.h>7 #include <math.h>89 #include <Xll/Intrinsic.h>10#include <Xll/StringDefs.h>11#include <Xm/MainW.h>12#include <Xm/RowColumn.h>13#include <Xm/PushB.h>14#include <Xm/CascadeB.h>15#include <Xm/Frame.h>16#include <Xm/Scale.h>17#include <Xm/Label.h>18#include <Xm/Form.h>19#include <Xll/Xirisw/GlxMDraw.h>2021#include <gl/gl.h>2223#include "left.h"24#include "seesys.h"2526//*********** stats ***************27#define VARWIDTH .9528#define VARX .0529#define char_h .023031//stats32#define STATY.1533#define STATHEIGHT (nssvars*char_h)34#define MODSTATY .3035#define MODSTATHEIGHT(nmodvars*char_h)363738//what has been selected in identify39enum{40 TOGGLE=1,41 SLIDER=242};434445Toggle::Toggle(double x_a,double y_a,int*flag_a,46 char*offlabel,char*onlabel,int mypub_a)47{48 x=x_a;49 y=y_a;50 flag=flag_a;51 labels
=offlabel;52 labels[1]=onlabel;53 mypub=mypub_a;54 }555657 Slider::Slider(double x_a,double y_a,double h_a,double w_a,58 int min_a,int max_a,int*bar_a,int mypub_a,59 char*top_label_a,60 char*left_toplabel_a,char*left_bottomlabel_a,61 char**barlabels_a)62 {63 x=x_a64 y=y_a65 h=h_a66 w=w_a6768 min=min_a;69 max=max_a;70 bar=bar_a;7172 mypub=mypub_a;7374 top_label=top_label_a;75 left_toplabel=left_toplabel_a;76 left_bottomlabel=left_bottomlabel_a;7778 barlabels=barlabels_a;79 }80818283 void84 Left::drawslider(Slider*s)85 { 86 char buf[MAX_STRING];87 double extend=.15*s->w;8889 color(MY_CYAN);90 FillRect(s->x,s->y,s->w,s->h);91 LineWidth(3);9293 color(DK_YELLOW);94 double bag=s->y+s->h**s->bar/(s->max-s->min);9596 //slider bar97 DrawLine(s->x-extend,bary,s->x+s->w+extend,bary);98 if(s->barlabels)99 strcpy(buf,s->barlabels[*s->bar]);100 else101sprintf(buf,"%d",*s->bar);102 DrawString(s->x+s->w+2*extend,bary+.25*char_h,103 buf,VxDrawLeft);104105 color(MY_WHITE);106 DrawString(s->x+.5*s->w,s->y+s->h+.45*char_h,107 s->top_label,VxDrawCenter);108 LineWidth(1);109}110111int112Left::identifyslider(double wmx,double wmy,Slider*s)113 {114 if(s->x<=wmx &amp;&amp; wmx<=s->x+s->w115 &amp;&amp; s->y<=wmy &amp;&amp; wmy<=s->y+s->h)116 {117 *s->bar=(int)((wmy-s->y)/s->h*118 (s->max-s->min)+s->min+.5);119 return SLIDER;120 }121 return 0;122 }123124 //this stuff should go125 //*********** frame vats **********126 #define framex .55127 #define framew .65128 #define framey .65129 #define frameh .8130 #define extend (.15*(framew-framex))131 #define rowy .4132 #define rowh .55133134 /*right justified label*/135 double136 Left::windsor(double low,double x,double high)137 {138 if(x<low) return low;139 if(x>high) return high;140 return x;141 }142143144145 //drawssstats-shows subsystem statistics146 void147 Left::drawssstats()148 {149 int i;150 Colorindex c;151152 /*draw background rectangle*/153 color(MY_GRAY);154 rectf(VARX, STATY,155 VARX+VARWIDTH, STATY-STATHEIGHT);156157 color(MY_WHITE);158 DrawString(VARX+.5*VARWIDTH,STATY+.25*char_h,"SUBSYSTEM STATS",VxDrawCenter);159160161 /*print the statistic names*/162 for(i=0;i<nssvars;i++)163 {164 if(i==active_ssvar )165 color(DK_BLUE);166 else167 color(MY_GRAY);168169rectf(VARX, STATY-i*char_h,170 VARX+VARWIDTH,STATY-(i+1)*char_h);171172/*black line between variables*/173color(MY_BLACK);174move2(VARX, STATY-i*char_h);175draw2(VARX+VARWIDTH,STATY-i*char_h);176177c=i==active_ssvar ?DK_YELLOWMY_WHITE;178color(c);179DrawString(VARX+.5*VARWIDTH,STATY-(i+.75)*char_h,ssvarnames[i],VxDrawRigt180if(active_ss>=0) {181 char buf[MAX_STRING];182 sprintf(buf,"%.f",get_ssvar(i,active_ss));183 DrawString(VARX+.5*VARWIDTH,STATY-(i+.75)*char_h,buf,VxDrawLeft);184}185 }186 }187188189 //drawmodstats-shows module statistics190 void191 Left::drawmodstats()192 {193int i;194Colorindex c;195196/*draw background rectangle*/197color(MY_GRAY);198rectf(VARX, MODSTATY,199 VARX+VARWIDTH, MODSTATY-MODSTATHEIGHT);200201color(MY_WHITE);202DrawString(VARX+. 5*VARWIDTH,MODSTATY+. 25*char_h,"MODULE STATS",VxDrawCenter);203204/*print the statistic names*/205 for(i=0;i<nmodvars;i++)206 {207 if(i==active_modvar )208color(DK_BLUE);209 else210color(MY_GRAY);211212 rectf(VARX, MODSTATY - i*char_h,213 VARX+VARWIDTH, MODSTATY-(i+1)*char_h);214215 /*black line between variables*/216 color(MY_BLACK);217 move2(VARX, MODSTATY-i*char_h);218 draw2(VARX+VARWIDTH, MODSTATY-i*char_h);219220 c=i==active_modvar ?DK_YELLOWMY_WHITE;221 color(c);222 DrawString(VARX+.5*VARWIDTH,MODSTATY-(i+.75)*char_h,modvarnames[i],223VxDrawRight);224 if(actlve_module>=0) {225 char buf[MAX_STRING];226 sprintf(buf,"%.f",get_modvar(i,active_module));227 DrawString(VARX+.5*VARWIDTH,MODSTATY-(i+.75)*char_h,buf,VxDrawLeft)228}229 }230 }231232 //identifymodstat-see if a different module statistic was chosen233 void234 Left::identifymodstat(double wmx,double wmy,int*statbutton)235 {236 *statbutton=-1;237238 //identify button239 for(int i=0;i<nmodvars;i++)240 if((VARX<=wmx &amp;&amp; wmx<=VARX+VARWIDTH)241 &amp;&amp;242 (MODSTATY-(i+i)*char h<=wmy &amp;&amp; wmy<=MODSTATY-i*char_h))243 {244 *statbutton=i;245 break;246 }247 else248 *statbutton=active_modvar;249}250251252//set_ssstats-calculates subsystem stats from module stats253void254Left::set_ssstats()255{256 double sstor;257 int i,j,k,offset=0;258259 nssvars=nmodvars;260 for(i=0;i<nmodvars;i++) {261 ssvarnames[i]=modvarnames[i];262 offset=i*nframes*nmod;263 for(j=0;j<nss;j++) {264 sstot=0;265 for(k=0;k<modulesPerSS[j];k++,offset++)266 sstot+=modvar_all[offset];267 ssvar_all[i*nss+j]=sstot;268 }269 }270 }271272273 //identifyssstat-see if a different subsystem statistic was chosen274 void275 Left::identifyssstat(double wmx,double wmy,int *statbutton)276 {277//identify button278for(int i=0;i<nssvars;i++)279if((VARX<=wmx &amp;&amp; wmx<=VARX+VARWIDTH)280&amp;&amp;281 (STATY-(i+1)*char_h<=wmy &amp;&amp; wmy<=STATY-i*char_h))282 {283 *statbutton=i;284 return;285 }286287 //did not find288 *statbutton=active_ssvar;289}290291292//identifyframe-see if a different frame was chosen293void294Left::identifyframe(double wmx,double wmy,int *framepos)295{296 //identify frame297 for(int i=0;i<nframes;i++)298if((framex-extend<=wmx &amp;&amp; wmx<=framew+extend)299&amp;&amp;300 (frameh-((i+.5)*(frameh-framey)/(nframes-1))<=wmy &amp;&amp;301wmy<=frameh-((i-.5)*(frameh-framey)/(nframes=1))))302 {303*framepos=i;304return;305 }306 307 *framepos=active_frame;308}309310311//identifyrow-see if row number was changed312void313Left::identifyrow(double wmx,double wmy,int *rowgos)314{315 *rowpos=active_nrows;316 //identify row317 for(int i=0;i<nss;i++)318if((framex-extend<=wmx &amp;&amp; wmx<=framew+extend)319&amp;&amp;320 (rowh-((i+.5)*(rowh-rowy)/(nss-1))<=wmy &amp;&amp;321wmy<=rowh-((i-.5)*(rowh-rowy)/(nss-1))))322 {323*rowpos=i+1;324return;325 }326 }327328329 //identifytoggle-see if ′module lines′toggle has been changed330 int331 Left::identifytoggle(double wmx,double wmy,Toggle *t)332 (333 if(<t->x-.4<=wmx &amp;&amp; wmx<=t->x+.4)&amp;&amp;334(t->y-.015<=wmy &amp;&amp; wmy<=t->y+.015)) {335*t->flag=!*t->flag;336return TOGGLE;337 }338 return 0;339 }340341342 //drawframeslider-draw frame slider343 void344 Left::drawframeslider(int frame)345 {346color(MY_CYAN);347rectf(framex,framey,framew,frameh);348LineWidth(3);349active_frame=frame;350351color(DK_YELLOW);352DrawLine(framex-extend,frameh-(frame*(frameh-framey)/(nframes-1)),353 framew+extend,frameh-(frame*(frameh-framey)/(nframes-1)) );354DrawString(framew+2*extend,frameh-(frame*(frameh-framey)/(nframes-1))-355 .3*char_h,framengs[fre],VxDrawLeft);355color(MY_WHITE);357DrawString((framew-framex)/2+framex,frameh+.45*char_h,"FRAMES",VxDrawCenter);358DrawString((framew-framex)/2+framex,framey-char_h,"",VxDrawCenter);359LineWidth(1);360 } 361362363 //drawrowslider-draws the row slider364 void365 Left::drawrowslider(int nrows)366 {367 char titleside [MAX_STRING];368369 color(MY_CYAN);370 rectf(framex,rowy,framew,rowh);371 LineWidth(3);372 color(DK_YELLOW);373 double rowheight=rowh-((nrows-1)*(rowh-rowy)/(nss-1));374 DrawLine(framex-extend,rowheight,framew+extend,rowheight);375 sprintf(titleside,"%d",nrows);376 color(MY_WHITE);377 DrawString((framew-framex)/2+framex,rowh+1.3*char_h,"ROWS",VxDrawCenter);378 DrawString((framew-framex)/2+framex,rowh+.3*char_h,"min",VxDrawCenter);379 DrawString((framew-framex)/2+framex,rowy-.6*char_h,"max",VxDrawCenter);380 LineWidth(1);381}382383384//drawtoggle-draw all of the toggles385void386Left::drawtoggle(Toggle *t)387{388 color(t->flag ?DK_YELLOWDK_GREEN);389 DrawString(t->x,t->y,390(const char *)(t->labels[*(t->flag)]),VxDrawCenter);391}392393394void395Left::timeout(Widget w)396{397 Left *that=VxMotifCast(Left,w);398399 that->interval_id=XtAppAddTimeOut(400 app_context,401 ftame_delay* 10,402 (XtTimerCallbackProc)Left::timeout,403 (XtPointer)w);404405 //switch to double time if redrawing is too slow406 //if(redraw_time>frame_delay )407 //active_frame++;408409 active_frame=++active_frame % nframes;410 set_ssvar(active_ssvar,active_nrows);411412 pub.Changed(FRAME_CHANGE);413 }414415416 //this is a kluge417 static GLXconfig glxConfig[]= {418 { GLX_NORMAL,GLX_DOUBLE, TRUE },419 { GLX_NORMAL,GLX_COLORMAP,TRUE },420 { GLX_NORMAL,GLX_ZSIZE, GLX_NOCONFIG },421 { 0,0,0 }422 };423424425 Left::Left(char const *name,Widget parent)426427 //default constructors428 VxGLDrawingArea(name,parent,glxConfig),429 VxMouseable(VxDown|VxUp|VxDrag ),430 VxFunctiona1ity(this)431{432 int i=0;433 double where=1.01,delta=.03;434435 //set up my toggles436 if(do_modules)437 toggles[i++]=new Toggle(438 .5,(where-=delta),&amp;do_modline,439 "No Mod Lines","Mod Lines",MODLINES_CHANGE);440441 if(do_modules)442 toggles[i++]=new Toggle(443 .5,(where-=delta),&amp;do_modnames,444 "No Mod Names","Mod Names",MODNAMES_CHANGE);445446447 toggles[i++]=new Toggle(448 .5,(where-=delta),&amp;do_colors,"No Colors","Colors",COLCR_CHANG449450 toggles[i++]=new Toggle(451 .5,(where-=delta), &amp;do_showfill,452 "No Fill","Fill",SHOWFILL_CHANGE);453454 toggles[i++]=new Toggle(455 .5,(where-=delta),&amp;do_zoom,456 "Zoom","Zoom Pending",ZOOM_PENDING);457458 if(nframes>1)459toggles[i++]=new Toggle(460.5,(where-=delta),&amp;do_animate,461"play","stop",ANIMATE_CHANGE);462463 assert(i<MAX_TOGGLES);464 toggles[i]=NULL;//unnecessary!465466467 //make my sliders468 i=0;469 if(nframes>1)470 sliders[i++]=new Slider(471 .15,.65,.15,.1,472 0,100,&amp;frame_delay,473 SPEED_CHANGE,"SPEED","Fast","Slow");474475 assert(i<MAX_SLIDERS);476 sliders[i]=NULL; //unnecessary!477478 //events that I care about479 pub.Subscribe (this,ACTIVE_SSVAR);480 pub.Subscribe (this,ACTIVE MODVAR);481 pub.Subscribe (this,ACTIVE_SS);482 pub.Subscribe (this,ACTIVE_MODULE);483 pub.Subscribe (this,ACTIVE_FILE);484 pub.Subscribe (this,ANIMATE_CHANGE);485 pub.Subscribe (this,COLOR_CHANGE);486 pub.Subscribe (this,FRAME_CHANGE);487 pub.Subscribe (this,MODLIMES CHANGE);488 pub.Subscribe (this,MODNAMES_CHANGE);489 pub.Subscribe (this,NROW_CHANGE);490 pub.Subscribe (this,SHOWFILL_CHANGE) ;491 pub.Subscribe (this,SPEED_CHANGE);492 pub.Subacribe (this,ZOOM_PENDING);493}494495void 96Left::DoExpose(int,int,int,int)497{498 GLXwinset(MyDisplay(),MyWindow());499 ortho2(0,1,0,1);500501 color(MY_BLACK);502 clear();503504 //draw module statistics505if(do_modules) {506 drawmodstats();507 set_ssstats();508}509510//draw subsystem statistics511drawssstats();512513 //draw frame slider514 if(nframes>1)515drawframeslider(active_frame);516517 //draw row slider518 drawrowslider(active_nrows);519520 //draw toggles521 for(int i=0;toggles[i];i++)522 drawtoggle(toggles[i]);523524 //draw the sliders525 for(i=0;sliders[i];i++)526 drawslider(sliders[i]);527528 swapbuffers();529 }530531532 void533 Left::DoMouse(VxMouseActions what,int/*button*/,534 XEvent const */*xevent*/)535 {536double wmx,wmy;537int position,i;538539switch (what) {540541case VxDown542543//convert mouse position to world coordinates544wmx=XStoU(MouseX());545wmy=YStoU(Height()-1-MouseY());546547//check to see if active variable has been changed548if(do_modules) {549 identifymodstat(wmx,wmy,&amp;position);550 if(position !=::active_modvar)551{552 ::active_modvar=position;553 ::active_ssvar=position;554 set_modvar(::active_modvar,active_nrows);555 pub.Changed(ACTIVE_MODVAR);556 }557} 558else {959 identifyssstat(wmx,wmy,&amp;position);960 if(position !=::active_ssvar)561 {562 ::active_ssvar=position;563 set_ssvar(::active_ssvar,active_nrows);564 pub.Changed(ACTIVE_SSVAR};565 }566 }567568 //check to see if active frame has been changed569 if(nframes>1) {570identifyframe(wmx,wmy,&amp;position);571if(position !=::active_frame)572{573 ::active_frame=position;574 set_ssvar(active_ssvar,active_nrows);575 pub.Changed(FRAME_CHANGE);576}577}578579//check to see if number of rows has been changed580identifyrow(wmx,wmy,&amp;position);581if(position !=::active_nrows)582{583 ::active nrows=position;584 if(do_modules) {585 modulelayout(active_nrows);586 set_sslayout();587 }588 else589 set_ssvar(active_ssvar,active_nrows);590 pub.Changed(NROW_CHANGE);591 }592593 //check to see if module line toggle has been changed594 for(i=0;toggles[i];i++)595 if(identifytoggle(wmx,wmy,toggles[i]))596 {597 pub.Changed(toggles[i]->mypub);598 break;599 }600601//check the sliders602for(i=0;sliders[i];i++)603if(identifyslider(wmx,wmy,sliders[i])604{605pub.Changed(sliders[i]->mypub); 606break;607 }608609 break;610611 case VxDrag612613 //convert mouse position to world coordinates614 wmx=XStoU(MouseX());615 wmy=YStoU(Height()-l-MouseY());616617 //check to see if active frame has been changed618 if(nframes>1) {619identifyframe(wmx,wmy,&amp;position);620if(position !=::active frame)621{622::active_frame=position;623set_ssvar(active_ssvar,active_nrows);624pub.Changed(FRAME_CHANGE);625}626 }627628 //check to see if number of rows has been changed629 identifyrow(wmx,wmy,&amp;position);630 if(position !=::active_nrows)631 {632 ::active_nrows=position;633 if(do_modules) (634modulelayout(active_nrows);635set_sslayout();636 }637 else638set_ssvar(active_ssvar,active_nrows);639 pub.Changed(NROW_CHANGE);640 }641 642 //check the sliders643 for(i=0;sliders[i];i++)644 if(identifyslider(wmx,wmy,sliders[i]))645 {646 pub.Changed(sliders[i]->mypub);647 break;648 }649650}651}652653void654Left::Update(int article,int/* part */,void *)655{ 656657 switch(article) {658 case ANIMATE_CHANGE659 if(do_animate)660{661 //turn on the animation662 intervel_id=XtAppAddTimeOut(663 app_context,664 frame_delay,665 (XtTimerCallbackProc)Left::timeout,666 (XtPointer)widget);667668 }669 else670 //turn off the animation671 XtRemoveTimeOut(interval_id);672673ExposeMe();674break;675676 case ACTIVE_SS;677 case ACTIVE_MODULE;678 case ACTIVE_SSVAR;679 case ACTIVE_MODVAR;680 case COLOR_CHANGE;681 case FRAME_CHANGE;682 case MODLINES_CHANGE;683 case MODNAMES_CHANGE;684 case NROW_CHANGE;685 case SHOWFILL_CHANGE;686 case SPEED_CHANGE;687 case ZOOM_PENDING;688 ExposeMe();689 break;690691 default;692 cout<<_FILE_<<""<<_LINE_<<"ERROR-not reached"693 <<endl;694 }695 }main.c1/*2* driver for seesys3*/45#include<assert.h>6#if defined(SVR3)7# include <getopt .h>8#endif9#include <iostream.h>10 #include <search.h>11 #include <stdlib.h>12 #include <stdio.h>13 #include <string.h>1415 #include "seesys.h"1617 //some extra manofest constants18 #define MAX_SSVARS 15 /*max number of ss variables*/19 #define MAX_MODVARS15 /*max number of module variables*/20 #define MAX_FRAME 5002122 #ifndef TRUE23 # define TRUE124 # define FALSE 025 #endif2627 //default files28 static char *ssnames_file = "ssnames";29 static char *modnames_file = "modnmes";30 static char *framenames_file ="framenames";3132 //default variables33 static char *ssnames_main[MAX_SS];34 static char *modnames_main[MAX_MOD];353637 //real memory for varifles38 static char *ssvarnames_main[MAX_SSVARS];39 static char *ssfillnames_main[MAX_SSVARS];40 static double ssvar_main[MAX_SSVARS*MAX_FRAMES];41 static double ssfill_main[MAX_SSVARS*MAX_FRAMES];42 static char *modvarnames_main[MAX_MODVARS];43 static char *modfillnames_main[MAX_MODVARS];44 static double modvar_main[MAX_MODVARS*MAX_FRAMES];45 static double modfill_main[MAX_MODVARS*MAX_FRAMES];46 static char *framenames_main[MAX_FRAMES];47 static intflags_main[25];484950 static void51 usage(char *progname)52 {53 cout<<progname54 <<"[-f framenames_file]"55 <<"[-n](show module names)"56 <<"[-m modvar modvar modvar...]"57<<"[-s ssnames_file]"58<<"ssvar ssvar ssvar..."59<<endl;60 exit(1);61}6263void64read_ssvars(int argc,char **argv)65{66int i,j,k;67FILE *fh;68char *filename;69int inputnum[MAX_SSVARS];7071for(i=0;optind<argc;optind++,nssvars++,nssfills++)72{73filename=argv[optind];74ssvarnames_main[nssvars]=strdup(filename);7576if(!(fh=fopen(filename,"r")))77{78 cerr<<filename<<"\tcannot open-quitting\n";79 exit(1);80}8182int howm=0;83while(1==fscanf(fh,"%lf",&amp;ssvar_main[i]))84 i++, howm++;8586if(howm % nss )87{88cout<<"weird-odd number of subsystem variables"89 <<"quitting"<<endl;90exit(1);91}9293inputnum[nssvars]=howm;94nframes=howm/nss;95assert(nframes<MAX_FRAMES);9697 fclose(fh);98 }99100 //now read the corresponding fill statistics101 for(i=0,j=0;i<nssfills;i++) {102103 char filename[MAX_STRING];104 sprintf(filename,"%s.fil",ssvarnames_main[i]);105 ssfillnames_main[i]=ssvarnames_main[i];106 if(!(fh=fopen(filename,"r"))) {107 do_fill[i]=0;108 for(k=0;k<inputnum[i];k++,j++)109 ssfill_main[j]=0;110 }111112 else {113 do_fill[i]=1;114 int howm2=0;115 while(1==fscanf(fh,"%lf",&amp;ssfill_main[j]))116 j++,howm2++;117118 if(howm2!=inputnum[i])119 {120 cout<<"weird-number of subsystem and"121<<"fill variables do not match"122 <<"quitting"<<endl;123 exit(1);124 }125 }126127 fclose(fh);128}129}130131132void133read_modvars(int argc,char **argv)134{135int i,j,k;136FILE *fh;137char *filename;138int inputnum[MAX_MODVARS];139140for(i=0;optind<argc;optind++,nmodvars++,nmodfills++)141{142filename=argv[optind];143modvarnames_main[nmodvars]=strdup(filename);144145if(!(fh=fopen(filename,"r")))146{147 cerr<<filename<<"\tcannot open-quitting\n";148 exit(1);149}150151int howm=0;152while(1==fscanf(fh,"%1f",&amp;modver_main[i]))153 i++,howm++;154155if(howm%nmod)156{157 cout<<"weird-odd number of module variables"158 <<"quitting"<<endl;159 exit(1);160}161162inputnum[nmodvars]=howm;163nframes=howm/nmod;164assert(nframes<MAX_FRAMES];165166fclose(fh);167168169 //now read the corresponding fill statistics170 for(i=0,j=0;i<nmodfills;i++) {171172 char filename[MAX_STRING];173 sprintf(filename,"%s.fil",modvarnames_main[i]);174 modfillnames_main[i]=modvarnames_main[i];175 if(!(fh=fopen(filename,"r"))) {176 domod_fill[i]=0;177 for(k=0;k<inputnum[i];k++,j++)178modfill_main[j]=0;179 }180181 else {182 domod_fill[i]=1;183 int howm2=0;184 while(1==fscanf(fh,"%1f",&amp;modfill_main[j]))185 j++,howm2++;186187 if(howm2!=inputnum[i])188 {189 cout <<"weird-number of module and"190 <<"fill variables do not math"191<<"quitting"<<endl;192exit(1);193 }194 }195196 fclose(fh);197 }198}199200201void202main(int argc, char **argv)203{204 int c,i,n,errflg;205 FILE *fh;206 char buf[MAX_STRING];207 int sscount=0;208209 //kluge for now for debugging-core dump on abort210 atexit(abort);211212 //handle the command line arguments213 errflg=0;214 while((c=getopt(argc,argv,"af:mns:"))!=-1)215switch(c) {216case′a′217 //set ss animation flag218 do_animatelayout=1;219 break;220221case′f′222 framenames_file=optarg;223 break; 224225 case′n′226do_modnames=1;227break;228229 case′s′230ssnames_file=optarg;231break;232233 case′m′ {234char savess[MAX_STRING];235char *subsystem,*module;236237//set module flag238do_modules=1;239240//read in the modnames241if(!(fh=fopen(modnames_file,"r")))242 {243 cout<<modnames file<<"\tcannot open-quitting\n";244 exit(1);245 }246247 //read each line in file248 for(nmod=0;fgets(buf,sizeof(buf),fh);nmod++)249 {250 if(nmod>=MAX_MOD)251 {252cout <<"Too many modules (increase MAX_MOD)-quitting"<<endl;253exit(1);254}255256 if((n=strlen(buf))>=sizeof(buf))257{258 cerr<<"line"<<nmod+1<<"too. long in file"259<<ssnames file<<"quitting"<<endl;260 exit(1);261 }262 buf[n-1]=′\0′;//zap newline263264 subsystem=strtok(buf,"/ \t");265 module=strtok(NULL,"/ \t");266267 //first time in loop save the module count268 if(nmod=0)269 strcpy(savess,buf);270271 if(strcmp(buf,savess)!=0) {272 sscount++;273 strcpy(savess,buf);274 }275276 modulesPerSS[sscount]++;277 modnames_main[nmod]=strdup(module);278 }279 fclose(fh);280 break;281 }282283 case′?′284errflg++;285 }286287if(errflg||optind>=argc)288 usage(argv
);289290291//read in the ssnames292if(!(fh=fopen(ssnames_file,"r")))293 {294cerr<<ssnames_file<<"\tcannot open-quitting\n";295exit(1);296 }297for(nss=0;fgets(buf,sizeof(buf),fh);nss++)298 {299if(nss>=MAX_SS)300 {301 cout<<"Too many subsystems-quitting"<<endl;302 exit(1);303 }304n=strlen(buf);305 if(n>=sizeof(buf))306 {307 cerr<<"line"<<nss+1<<"too long in file"308<<ssnames_file<<" quitting"<<endl;309 exit(1);310}311 buf[n-1]=′\0′;//zap newline312 ssnames_main[nss]=strdup(buf);313 }314 fclose(fh);315316 if((do_modules) &amp;&amp; (nss!=++sscount))317 {318cout<<"Module data does not exist for all subsystems-quitting"<<endl;319exit(1);320 }321322323 if(do_modules)//read in the module variables324 read_modvars(argc,argv);325 else//read in the subsystem variables326 read_ssvars(argc,argv);327328329 if((nframes>1) &amp;&amp; (fh=fopen(framenames_file,"r"))) {330 i=0;331 while(fgets(buf,sizeof(buf),fh) }332 framenames_main[i++]=strdup(buf);333 fclose(fh);334 if(i!=nframes) {335cerr<<"error-wrong number of frames"<<endl;336exit(1);337 }338 }339 else340 //make some default frame names341 for(i=0;i<nframes;i++)342 {343 sprintf(buf,"%d",i+1);344 framenames_main[i]=strdup(buf);345 }346347 //default values of flags348 flags_main
=FALSE; //do_modline349 flags_main[1]=do_modules;//do_modules350 flags_main[2]=FALSE; //do_fork351 flags_main[3]=TRUE; //do_colors352 flags_main[4]=do_animatelayout; //ssanimate353 flags_main[5]=TRUE; //do_showfill354 flags_main[6]=FALSEE;//do zoom355 flags_main[7]=do_modnames; //print module names in zoom view356357358359 //do it!360 seesys(361 &amp;argc,362 argv,363 ssnames_main, // ss names364 &amp;nss, // number of subsystems365 modnames_main, // module names366 &amp;nmod, // number of modules367368 //subsystem variables369 ssvar_main,//ss variables370 &amp;nssvars, //number of ss variables371 ssvarnames_main, //ss variable names372 ssfill_main, //ss fill variables373 &amp;nssfills, //number of ss fill variables374 ssfillnames_main, //ss fill variable names375376 //module variables377 modvar_main, //module variables378 &amp;nmodvars, //number of module variables379 modvarnames_main, //module variable names380 moxdfill_main, //module fill variables381 &amp;nmodfills,//number of module fill variables382 modfillnams_main, //module fill variable names383384 //animation frames385 framenames_main, //frame names386 &amp;nframes, //number of frames387388 flags_main389 );390 )seesys.c1#include <assert.h>2#include <iostream.h>3#include <math.h>4#include <stdio.h>5#include <stdlib.h>6#include <strings.h>7#include <sys/types.h> /* for fork() */8#include <unistd.h> /* for fork() */910 #include <Xll/Intrinsic.h>11 #include <Xll/StringDefs.h>12 #include <Xm/MainW.h>13 #include <Xm/RowColumn.h>14 #include <Xm/PushB.h>15 #include <Xm/CascadeB.h>16 #include <Xm/Frame.h>17 #include <Xm/Scale.h>18 #include <Xm/Label.h>19 #include <Xm/Form.h>20 #include <Xll/Xirisw/GlxMDraw.h>2122 #include <gl/gl.h>2324 //my includes25 #include "bottom.h"26 #include "left.h"27 #include "sysview.h"28 #include "seesys.h"29 #include "zoomview.h"303132 //subsystem variables33 char **ssnames; // subsystem names34 intnss; // number of subsystems35 double minssvar; // smallest subsystem variable36 double maxssvar; // largest subayatam variable37 double maxssframevar; // largest subsystam variable across all frames38 double maxmodframevar;// largest module variable across all frames39 intmodulesPerSS[MAX_SS]; // number modules per subsystem40 intdo_fill[MAX_SS]; // do fill stats exist4142 //slider colors43 int cols[PARITIONS]=(44 DK_BLUE,45 DK_GREEN,46 DK_YELLOW,47 DK_RED,48 };4950 //module variables51 char **modnames; //module names52 intnmod; //number of modules53 double maxmodvar; //largest module variable54 intdomod_fill[MAX_MOD];//do fill stats exist555657//multiple variables58double *ssvar_all; //all subsystem statistics59char **ssvarnames; //subsystem variable names60intnssvars; //number of subsystem variables61double *ssfill_all; //all subsystem fill statistics62char **ssfillnames;//subsystem fill names63intnssfills; //number of fill variables64double *modvar_all; //all module statistics65char **modvarnames;//module variable names66intnmodvars; //number of module variables67double *modfill_all; //all module fill statistics68char **modfillnames; //module fill names69intnmodfills;//number of fill variables707172//animation variables73char **framenames; //frame names74int nframes; //how many frames75int frame_delay; //milliseconds to delay btw frames76int redraw_time; //redraw time in milliseconds7778//zoom variables79ZOOM zoom[MAX_ZOOM];8081//state variables82int do_animatelayout;//animate over frames83int do_animate; //animate over frames84int do_colors; //colors for ss or modules85int do_fork; //should we fork?86int do_modline; //lines between the modules87int do_modules; //show the modules88int do_modnames; //show module names in zoomview89int do_showfill; //show fill statistic90int do_zoom; //zoom pending919293//active variables94double *ssvar;//current subsystem variable95double *ssfill; //current ss fill variable96double *modvar; //current module variable97double *modfill; //current module fill variable98intactive_ssvar; //which ss var is active99intactive_modvar; //which module var is active100 intactive_frame; //which frame is active101 intactive_ss; //which subsystem is mouse on102 intactive_module; //which mosle is mouse on103 intactive_nrows; //how many rows in display104105 //subsystem layout variables106 double ssxpos[MAX_SS];107 double ssypos[MAX_SS];108 double sswidth[MAX_SS];109 double ssheight[MAX_SS];110 double ssmax[MAX_SS];111 double ssaverage[MAX_SS]; 112113//module layout variables114double modxpos[MAX_MOD];115double modypos[MAX_MOD];116double modwidth[MAX_MOD];117double modheight[MAX_MOD];118119120//publications121Publication pub;122123//X junk124XtAppContext app_context;125Widget toplevel;126127static String fallback_resources[]={128"seesys.mainw.width800",129"seesys.mainw.height800",130"seesys*left.height800",131"seesys*left.width150",132"seesys*sysview.height650",133"seesys*sysview.width 700",134"seesys*bottom.height100",135"seesys*bottom.width650",136"*frame*shadowTypeSHADOW_IN",137NULL138};139140141142143//static function prototypes144145static void set ssframe(int whichframe);146void set_ssvar(int which,int nrows);147void set_modvar(int which,int nrows);148void set_sslayout();149void layout(int nrows);150void modulelayout(int nrows);151void ssanimate_layout(int nrows);152void set_maxssvar();153void set_maxssframevar();154void set_maxmodvar();155void set_maxmodframevar();156int set_sscolor(int ss);157int set_modcolor(int mod);158159160161162extern"C"void // no name mangling163seesys(164int *argc_ptr,165char*argv[],166char**ssnames_a,// ss names167int *nss_a, // number of subsystems168char**modnames_a, // module names169 int *nmod_a, // number of modules170171 //subsystem variables172 double *ssvar_a, // as variables173 int *nssvars_a,// numbet of ss variables174 char**ssvarnames a,// ss variable names175 double *ssfill_a, // ss fill variables176 int *nssfills_a, // number of ss fill variables177 char**ssfillnames_a, // ss fill variable names178179 //module variables180 double *modvar_a, // module variables181 int *nmodvars_a, // number of module variables182 char**modvarnames_a, // module variable names183 double *modfill_a,// module fill variables184 int *nmodfills_a, // number of module fill variables185 char**modfillnames_a, // module fill variable names186187 //animation frames188 char**framenames_a,// freme names189 int *nframes_a,// number of frames190191 int *flags192) {193 /* save variables in statics */194 ssnames =ssnames_a;195 nss =*nss_a;196 modnames =modnames_a;197 nmod =*nmod_a;198199 //subsystem variables200 ssvar_all=ssvar_a;201 nssvars=*nssvars_a;202 ssvarnames=ssvarnames_a;203 ssfill_all=ssfill_a;204 nssfills=*nssfills_a;205 ssfillnames=ssflllnames_a;206207 //module variables208 modvar_all=modvar_a;209 nmodvars=*nmodvars_a;210 modvarnames=modvarnames_a;211 modfill_all=modfill_a;212 nmodfills=*nmeodfills_a;213 modffllnames==modfillnames_a;214215 //animation frames216 framenames=framenames_a;217 nframes=*nframes_a;218219 //flags220 do_modline =flags
;221 do_modules =flags[1];222 do_fork =flags[2];223 do_colors =flags[3];224 do_animatelayout=flags[4];225 do_showfill = flags[5];226 do_zoom = flags[6];227 do_modnames = flags[7];228229230 //initialization231 do_animate=FALSE;232 active_frame=0;233 active_nrows=(int)(ceil(sqrt((double)nss)));234 active_ss=-1;235 frame_delay=10; //milliseconds236237 if(do_modules)238 set_modvar(0,active_nrows);239 else240 set_ssvar(0,active_nrows);241242243 //should we fork?244 int pid=do_fork?fork()0;245246 if(pid<0)247 cerr<<"Could not fork\n";248 else if(pid>O)249 return; /* parent exits immediately */250251 deflinestyle(DASH_LINE,OxF0F0);252253254 //now make the windows255 Widget mainw,frame;256 int n;257 Arg args[20];258259260 toplevel=XtAppInitialize(&amp;app_context"seesys",261 (XrmOptionDescList)NULL,0,262#if defined(SVR3)||defined(sun)263/* kluge for different version of X */264(Cardinal *)265#endif266267 argc_ptr,268 (String*)argv,269 fallback_resources,270 (ArgList)NULL,0);271//set the window title272XtVaSetValues(toplevel,273XmNtitle,argv
,274NULL275 );276277278279 n=0;280 mainw=XtCreateManagedWidget("mainw",281kmMainWindowWidgetClass,toplevel,282args,n);283284 frame=XtVaCreateManagedWidget("frame",285 xmFormWidgetClass,mainw,286 NULL);287288289 //controls along the left290 Left left("left",frame);291 XtVaSetValues(left.widget,292 XmNleftAttachment, XmATTACH_FORM,293 XmNtopAttachment,XmATTACH_FORM,294 XmNbottomAttachment, XmATTACM_FORM,295 NULL296 );297298299 //bottomspace300 Bottom bottom("bottom",frame);301 XtVaSetValues(bottom.widget,302 XmNbottomAttachment, XmATTACH_FORN,303 XmNleftAttachment, XmATTACH_WIDGET,304 XmNleftWidget, left.widget,305 XmNrightAttachment, XmATTACH_FORM,306 NULL307 );308309310 //system view311 Sysview sysview("sysview",frame);312 XtVaSetValues(sysview.widget,313 XmNrightAttachment, XmATTACH_FORM,314 XmNtopAttachment, XmATTACH_FORM,315 XmNleftAttachment, XmATTACH_WIDGET,316 XmNleftWidget, left.widget,317 XmNbottomAttachment,XmATTACH_WIDGET,318 XmNbottomWidget,bottom.widget,319 NULL320 );321322 short red[100],green[100],blue[100];323 for(int i=0;i<16;i++)324 getmcolor(i,&amp;rod[i],&amp;green[i],&amp;blue[i]);325326 mapcolor(MY_BLACK,0,0,0);327 mapcolor(MY_WHITE,255,255,255);328 mapcolor(MY_CYAN,0,255,255);329 mapcolor(MY_GRAY,125,125,125);330 mapcolor(DK_GRAY,50,50,50);331 mapcolor(LT_GRAY,185,185,185);332 mapcolor(DK_BLUE,0,0,140);333 mapcolor(LT_BLUE,0,0,190);334 mapcolor(DK_GREEN,0,145,0);335 mapcolor(LT_GREEN,0,180,0);336 mapcolor(DK_YELLOW,255,215,0);337 mapcolor(LT_YELLOW,255,255,0);338 mapcolor(DK_RED,200,0,0);339 mapcolor(LT_RED,230,0,0);340341 //make the widgets342 XtRealizeWidget(toplevel);343344 //************** here we go *********************345 XtAppMainLoop(app_context);346347 //put back old colors348 for(i=0;i<16;i++)349 mapcolor(i,red[i],green[i],blue[i]);350351 //we′re done352 if(pid>0)353 exit(0); //child process exits354}355356357//update the active frame358static void359set_ssframe(int whichframe)360{361whichframe=whichframe % nframes;362363if(whichframe!=active_frame)364 {365 active_frame=whichframe;366 set_ssvar(active_ssvar,active_nrows );367 pub.Changed(FRAME_CHANGE);368 }369}370371372373//change subsystem variables374void375set_ssvar(int which,int nrows)376{377 active_ssvar=which;378 ssvar=&amp;ssvar_all[active_ssvar * nframes * nss379+active_frame * nss];380 ssfill=&amp;ssfill_all[active_ssvar * nframes *nss381+active_frame * nss];382383 set_maxssvar();384 set_maxssframevar();385 if(do_animatelayout)386 ssanimate_layout(nrows);387 else388 layout(nrows);389}390391392//change module variables393void394set_modvar(int which,int nrows)395{396 active_modvar=which;397 modvar=&amp;modvar_all[active_modvar * nframes * nmod398+active_frame * nmod];399 modfill=&amp;modfill_all[active_modvar * nframes * nmod400+active_frame * nmod];401402 set_maxmodvar();403 set_maxmodframevar();404 modulelayout(nrows);405 set_sslayout();406}407408409//get_ssvar-returns statistic index for subsystems410double411get_ssvar(int whichvar,int whichss)412{413 return ssvar_all[whichvar * nframes * nss414+active_frame * nss415+whichss];416}417418419//get_modvar-returns statistic index for modules420double421get_modvar(int whichvar,int whichmod)422{423 return modvar_all[whichvar * nframes * nmod424+active_frame * nmod425+whichmod];426 }427428429 //layout-calculate ssxpos and ssypos430 void431 layout(int nrows)432 {433 int i,j,frame;434 double sstot,maxsstot=0;435436 for(frame=0;frame<nframes;frame++)437 {438 for(i=0,sstor=0;i<nss;i++)439 sstot+=ssvar_all[active_ssvar*nframes*nss440+frame*nss+i];441maxsstot=MAX(sstot,maxsstot);442 }443444 double perrow=maxsstot/nrows;445446 //position each row447 int ss=0,howm;448 double cumx,cumy=0,449while(ss<nss)450 {451//how much goes on this row452double rowtot=0;453for(howm=0,j=ss;454rowtot<perrow &amp;&amp; j<nss;455j++,howm++)456 rowtot+=ssvar[j];457458cumy+=rowtot;459for(i=0,cumx=0,j=ss;i<howm;j++,i++)460{461ssxpos[j]=cumx/rowtot;462ssypos[j]=1-cumy/maxsstot;463sswidth[j]=ssvar[j]/rowtot;464ssheight[j]=rowtot/maxsstot;465466cumx+=ssvar[j];467}468 ss+=howm;469}470 }471472473474//modulelayout-calculate modxpos and modypos475void476modulelayout(int nrows)477{478int i,j,k,frame;479double modtot,maxmodtot=0;480481for(frame=0;frame<nframes;frame++)482 (483for(i=0,modtot=0;i<nmod;i++)484modtot+=modvar_all[active_modvar*nframes*nmod485 +frame*nmod+i];486maxmodtot=MAX(modtot,maxmodtot);487 }488489 double perrow=maxmodtot/nrows;490491 //position each row492 int mod=0,se=0,howm,offset=0;493 double cumx,cumy=0;494495 while(ss<nss)496 {497 //how much goss on this row498 double rowtot=0;499 for(howm=0,j=offset;500 rowtot<perrow &amp;&amp; j<nmod;501 j=offset,ss++) {502 for(k=0;k<modulesPerSS[ss];k++)503 rowtot+=modvar[j+k];504 howm+=modulesPerSS[ss];505offset+=modulesPerSS[ss];506 }507508 cumy+=rowtot;509 for(i=0,cumx=0,j=mod;i<howm;j++,i++)510 {511 modxpos[j]=cumx/rowtot;512 modypos[j]=1-cumy/maxmodtot;513 modwidth[j]=modvar[j]/rowtot;514 modheight[j]=rowtot/maxmodtot;515516 cumx+=modvar[j];517}518 mod+=howm;519 }520}521522523//ssanimate_layout-calculate ssxpos and ssypos524void525ssanimate_layout(int nrows)526{527 int i,j,frame;528 double maxsstot=0;529530 //do in initialization code?531 for(i=0;i<nss;i++)532 {533 double m=0;534 for(frame=0;frame<nframes;frame++)535 m=MAX(m,ssvar_all[active_ssvar*nframes*nss536+frame*nss+i]);537 ssmax[i]=m;538 }539540 for(i=0;i<nss;i++)541 maxsstot+=ssmax[i];542 double perrow=maxsstot/nrows;543544 //position each row545 int ss=0,howm;546 double cumx,cumy=0;547 while(ss<nss)548 {549 //how much goes on this row550 double rowtot=0;551 for(howm=0,j=ss;552 rowtot<perrow &amp;&amp; j<nss;553 j++,howm++)554 rowtot+=ssmax[j];555556 cumy+=rowtot;557 for(i=0,cumx=0,j=ss;i<howm;j++,i++)558 {559 ssxpos[j]=cumx/rowtot;560 ssypos[j]=1-cumy/maxsstot;561 sswidth[j]=ssmax[j]/rowtot;562 ssheight[j]=rowtot/maxsstot;563564 cumx+=ssmax[j];565 }566 ss+=howm;567 }568}569570571//set_sslayout-assigns ssxpos and ssypos values for module input572void573set_sslayout()574{575int offset=0;576577for(int i=0;i<nss;i++) {578 ssxpos[i]=modxpos[offset];579 ssypos[i]=modypos[offset];580 sswidth[i]=0;581 for(int j=offset;j<offset+modulesPerSS[i];j++)582 sswidth[i]+=modwidtb[j];583 //sswidth[i]=modxpos[offset+modulesPerSS[i]]-modxpos[offset];584 ssheight[i]=modheight[offset];585 offset+=modulesPerSS[i];586 }587}588589590//set_maxssvar-assigns largest subsystem variable to maxssvar591void592set_maxssvar()593{594595maxssvar=ssvar
;596for(int i=1;i<nss;i++) {597 if(ssvar[i]>maxssvar)598 maxssvar=ssvar[i];599 }600601 }602603604 //set_maxssframevar-assigns largest subsystem variable of605 //all frames to maxssframevar.606 void set_maxssframevar()607 {608int frame,i,j,offset;609610offset=active_ssvar * nframes *nss;611maxssframevar=ssvar_all[offset];612for(frame=0;frame<nframes;frame++)613 for(i=offset,j=0;j<nss;j++,i++,offset++)614 if(ssvar_all[offset]>maxssframevar)615 maxssframevar=ssvar_all[offset];616 }617618619//set_maxmodvar-assigns largest module variable to maxssvar620void621set_maxmodvar()622{623maxmodvar=modvar
;624for(int i=1;i<nmod;i++) {625 if(modvar[i]>maxmodvar)626 maxmodvar=modvar[i];627}628 }629638631 //set_maxmodframevar-assigns largest module variable of632 //all frames to maxmodframevar.633 void set_maxmodframevar()634 {635 int frame,i,j,offset;636637 offset=active_modvar * nframes * nmod;638 maxmodframevar=modvar_all[offset];639 for(frame=0;frame<nframes;frame++)640 for(i=offset,j=0;j<nmod;j++,i++,offset++)641 if(modvar_all[offset]>maxmodframevar)642 maxmodframevar=modvar_all[offset];643}644645646//set_sscolor_assigns a color to subsystem ss647int648set_sscolor(int ss)649{650int col;651double block;652if(nframes>1)653 block=maxssframevar/PARTITIONS;654else655 block=maxssvar/PARTITIONS;656for(int i=l;i<=PARTITIONS;i++)657if(ssvar[ss]<=i*block) {658 col=cols[i-1];659 break;660}661return col;662 }663664665 //set_modcolor-assigns a color to module mod666int667set_modcolor(int mod)668{669int col;670double block;671if(nframes>1)、672 block=maxmodframevar/PARTITIONS;673 else674 block=maxmodvar/PARTITIONS;675 for(iht i=1;i<=PARTITIONS;i++)676 if(modvar[mod]<=i*block) { 677col=cols[i-1];678break;679 }680 return col;681}682683//-warning-this should be somewhere eise684void685zoomview_quitCB(686Widget /*w*/,687caddr_t client_data,688caddr_t /*call_data*/689 ) {690691 Zoomview *zoomview=(Zoomview *)client_data;/*VxMotifCast(Zoomview,w);*/692693 int mybar=zoomview->mybar;694695 //mark these bars as unused696 zoom[mybar].used=0;697698 delete zoomview;699 }700701SYSVIEW.C1#include <assert.h>2#include <iostream.h>3#include <memory.h>4#include <stdio.h>5#include <stdlib.h>6#include <string.h>7#include <time.h>89#include <Xll/Intrinsic.h>10 #include <Xll/StringDefs.h>11 #include <Xm/MainW.h>12 #include <Xm/RowColumn.h>13 #include <Xm/PushB.h>14 #include <Xm/CascadeB.h>15 #include <Xm/Frame.h>16 #include <Xm/Scale.h>17 #include <Xm/Label.h>18 #include <Xm/Form.h>19 #include <Xll/Xirisw/GlxMDraw.h>2021 #include <gl/gl.h>2223 #include "sysview.h"24 #include "seesys.h"25 #include "zoomview.h"262728 void29 Sysview::identify(double wmx,double wmy,30 int *ss,int *module,int *file)31 {32 *ss=*module=*file=-1;3334 //identify the active subsystem35 for(int i=0;i<nss;i++)36 if(ssxpos[i]<=wmx &amp;&amp; wmx<=ssxpos[i]+sswidth[i]37 &amp;&amp;38 ssypos[i]<=wmy &amp;&amp; wmy<=ssypos[i]+ssheight[i])39 {40*ss=i;41break;42 }4344 //identify the active module45 for(i=0;i<nmod;i++)46if(modxpos[i]<=wmx &amp;&amp; wmx<=modxpos[i]+modwidth[i]47 &amp;&amp;48 modes[i]<=wmy &amp;&amp; wmy<=modypos[i]+modheight[i])49 {50*module=i;51break;52 }5354 //now get the file55 }565758void59Sysview::drawmod(60 int i,/* module to draw */61 int col/* it′s color */62} {63int j,k,ss;64double x1,x2,y1,y2,filly;65x1=modxpos[i];66x2=modxpos[i]+modwidth[i];6768y1=modypos[i];69y2=modypos[i]+modheight[i];70filly=modfill[i];7172//draw module73LineWidth(2);74color(do_colors ?col DK_GRAY);75FillRect(x1,y1,x2-x1,y2-y1);76FrameRect(x1,y1,x2-x1,y2-y1);7778//What subsystem is this module in?79for(ss=j=k=0;j<nss;j++)80 if((k+=modulesPerSS[j])<=i)81ss++;8283//ss is my subysystem!8485//draw subsystem fill average86color(LT_GRAY);87FillRect(modxpos[i],modypos[i],modwidth[i],88 ssaverage[ss]*ssheight[ss]);89FrameRect(modxpos[i],modypos[i],modwidth[i],90 ssaverage[ss]*ssheight[ss]);9192//draw fill93if(do_showfill) {94 color(do_colors ?MY_GRAY LT_BLUE);95 filly=modvar[i] ?modfill[i]/modvar[i] * modheight[i]0;96 FillRect(x1,y1,x2-x1,filly);97 FrameRect(x1,y1,x2-x1,filly);98}99100 //outline101 if(do_modline) {102 color(MY_WHITE);103 FrameRact(x1,y1,x2-x1,y2-y1);104 }105106 //outline active module107 if(::active_module=i) {108 color(DK_RED);109 FrameRect(x1,y1,x2-x1,y2-y1);110 } 111 LineWidth(1);112}113114115//drawssboundaries-draws ss outlines(when there is module input)116void117Sysview::drawssboundaries(int ss)118{119 double x1,x2,y1,y2;120121 x1=ssxpos[ss];122 x2=ssxpos[ss]+sswidth[ss];123 y1=ssypos[ss];124 y2=ssypos[ss]+ssheight[ss];125126 //outline127 LineWidth(4);128 if(::active_ss==ss)129 color(DK_RED);130 else131 color(MY_WHITE);132 FrameRect(x1,y1,x2-x1,y2-y1);133 LineWidth(1);134135 //ss name136 color(MY_WHITE);137 DrawString(.5*(x1+x2),.5*(y1+y2),ssnames[ss],138 VxDrawCenter);139}140141142void143Sysview::drawss(int i,int col)144{145 double x1,x2,y1,y2,filly,fillx;146 x1=ssxpos[i];147 x2=ssxpos[i]+sswidth[i];148149 y1=ssypos[i];150 y2=ssypos[i]+ssheight[i];151 filly=ssfill[i];152153 //draw subsystem154 color(do_colors ?col DK_GRAY);155 FillRect(x1,y1,x2-x1,y2-y1);156157 //black fill for animate158 if(do_animatelayout)159{160 color(MY_BLACK);161 fillx=(1-ssvar[i]/(ssmax[i]+!ssmax[i]))* sswidth[i];162 FillRect(x2-fillx,y1,fillx,y2-y1);163 }164 else165 {166 //draw fill167 if(do_showfill) {168color(MY_GRAY);169filly=ssfill[i]/(ssvar[i]+!ssvar[i])*ssheight[i];170FillRect(x1,y1,x2-x1,filly);171}172}173174 //outline175 LineWidth(4);176 color(::active_ss==i ?DK_REDMY_WHITE);177 FrameRect(x1,y1,x2-x1,y2-y1);178 LineWidth(1);179}180181182//drawssname-draws subsystem i′s name183void184Sysview::drawssname(int ss)185{186 double x1,x2,y1,y2;187 x1=ssxpos[ss];188 x2=ssxpos[ss]+sswidth[ss];189190 y1=ssypos[ss];191 y2=ssypos[ss]+ssheight[ss];192193 //ss name194 color(MY_WHITE);195 DrawString(.5*(x1+x2),5*(y1+y2),ssnames[ss],196 VxDrawCenter;197}198199200//calc_fillaverage-calculates the average ss fill201void202Sysview::calc_fillaverage()203{204 int i,j,k=0;205 double moduletot,sstot;206207 for(i=0;i<nss;i++) {208 for(moduletot=0,sstot=0,j=0;j<modulesPerSS[i];j++,k++){209 moduletot+=modfill[k];210 sstot+=modvar[k];211 }212 ssaverage[i]=sstot ?moduletot/sstot 0;213 }214 }215216217 //this is a kluge218 static GLXconfig glxConfig[]={219 { GLX_NORMAL,GLX_DOUBLE, TRUE },220 { GLX_NORMAL,GLX_COLORMAP,TRUE ],221 { GLX_NORMAL,GLX_ZSIZE, GLX_NOCONFIG },222 { 0,0,0 }223};224225Sysview::Sysview(char const *name,Widget parent)226227 //default constructors228 VxGLDrawingArea(name,parent,glxConfig),229 VxMouseable(VxAll),230 VxFunctionality(this)231{232 active_ss=-1;233 active_module=-1;234235 //events that I care about236 pub.Subscribe(this,ACTIVE_SS);237 pub.Subscribe(this,ACTIVE_MODULE);238 pub.Subscribe(this,ACTIVE_FILE);239 pub.Subscribe(this,ACTIVE_SSVAR);240 pub.Subscribe(this,ACTIVE_MODVAR);241 pub.Subscribe(this,COLOR_CHANGE);242 pub.Subscribe(this,FRAME_CHANGE);243 pub.Subscribe(this,MODLINES_CHANGE);244 pub.Subscribe(this,NROW_CHANGE);245 pub.Subscribe(this,SHOWFILL_CHANGE);246}247248void249Sysview::DoExpose(int,int,int,int)250{251 //struct timeval t1,t2;252 //gettimeofday(&amp;t1,NULL);253254 GLXwinset(MyDisplay(),MyWindow());255 UserCoord(-0.01,1.01,-0.01,1.01);256257 //clear window258 color(MY_BLACK);259 Clear();260261 //draw animation outline262 if(nframes>1) {263 LineWidth(3);264 color(MY_WHITE);265 FrameRect(0,0,1,1);266 LineWidth(1);267 }268269 if(do_modules) {270 calc_fillaverage();271 for(int i=0;i<nmod;i++)272 drawmod(i,set_modcolor(i)+i%2);273 for(int j=0;j<nss;j++)274 drawssboundaries(j);275 }276 else //draw the subsystems277 for(int i=0;i<nss;i++)278 drawss(i,set_sscolor(i));279280 //draw subsystem names281 color(MY_WHITE);282 for(int i=0;i<nss;i++)283 drawssname(i);284285 swapbuffers();286287 //gettimeofday(&amp;t2,NULL);288 //redraw_time=(int)((t2.tv_sec-t1.tv_sec)*1000+289 // (t2.tv_usec-t1.tv_usec)/1000.);290291}292293294void295Sysview::DoMouse(VxMouseActions what,int button,296 XEvent const * /*xevent*/)297{298 double wmx,wmy;299 int ss,module,file;300301 //convert mouse position to world coordinates302 wmx=XStoU(MouseX());303 wmy=YStoU(Height()-1-MouseY());304305 identify(wmx,wmy,&amp;ss,&amp;module,&amp;file);306307 if(ss!=::active_ss)308 {309::active_ss=ss;310pub.Changed(ACTIVE_SS,::active_ss);311 }312 if(module!=::active_module)313 {314::active_module=module;315 pub.Changed(ACTIVE_MODULE,::active_module);316}317318 switch(what) {319 case VxMotion;320 break;321322 case VxDown;323 if(button !=1)324break;325326 //get here if button 1327 if(do_zoom)328{329 widget optd,frame;330331 //The shell for it to be in332 optd=XtVaCreatePopupShell("Zoom",333topLevelShellWidgetClass,334toplevel,335XmNdeleteResponse,XmDESTROY,336XmNx,200,337 XmNy,500,338 XmNheight,500,339 XmNwidth,500,340 NULL);341342frame=XtVaCreateManagedWidget("frame",343xmFormWidgetClass,optd,344NULL);345346//find a free slot(start at ll)347for(int i=1;i<MAX_ZOOM;i++)348 if(!zoom[i].used )349break;350351 if(i==MAX_ZOOM)352 {353 //no free slots found354 cout<<"Error-No more zoom windows"<<endl;355 return;356 }357358//window title is active subsystem359XtVaSetValues(optd,360 XmNtitle,ssnames[::active_ss],361 NULL362 );363364365zoom[i].ss=::active_ss;366zoom[i].used=TRUE;367368//create the zoom window369Zoomview *zoomview=new Zoomview("subsys",370 frame,i);371372//attach widget to the frame373XtVaSetValues(zoomview->widget,374XmNleftAttachment, XmATTACH_FORM,375XmNrightAttachment, XmATTACH_FORM,376XmNbottomAttachment,XmATTACH_FORM,377XmNtopAttachment, XmATTACH_FORM,378NULL379);380381 //what to do when it′s killed382 XtAddCallback(zoomview->widget,XtNdestroyCallback,383(XtCallbackProc)zoomview_quitCB,(XtPointer)zoomview334 );385386 //pop.it up,don′t grab any focus387 XtPopup(optd,XtGrabNone);388389 //redraw overview window390 pub.Changed(ZOOMSS_CHANGE,i);391392 do zoom=0;393pub.Changed(ZOOM_PENDING);394 }395 break;396397case VxDrag398 break;399 }400 }401402void403Sysview::Update(int article,int/*part*/,void*)404{405 switch(article) {406407 case ACTIVE_SS408409 GLXwinset(MyDisplay(),MyWindow());410 frontbuffer(TRUE);411412 if(do_modules) {413 //clear last one(unless it is the lst active ss)414 if(active_ss>=0) {415 drawssboundaries(active_ss);416 last_ss=active_ss;417 }418419 //reset variable420 active_ss=::active_ss;421422 //redraw new one423 if(active_ss>=0) {424 color(DK_RED);425 drawssboundaries(active_ss);426 }427 }428 else {429 //cleer last one430 if(active_ss>=0) {431drawss(active_ss,set_sscolor(active_ss));432drawssname(active_ss);433 }434435 //reset variable436 active_ss=::active_ss;437438 //redraw new one439 if(active_ss>=0) {440 drawss(active_ss,set_sscolor(active_ss));441 drawssname(active_ss);442 }443 }444445 frontbuffer(FALSE);446 break;447448 case ACTIVE_MODULE449450 GLXwinset(MyDisplay(),MyWindow());451 frontbuffer(TRUE);452453 if(do_modules) {454 //clear last one(unless it is the lst active module)455 if(active_module>=0) {456 drawmod(active_module,set_modcolor(active_module)+active_module%2);457458 //redraw ss boundaries and name459 if(active_ss>=0)460 drawssboundaries(active_ss);461462 //redraw last ss463 if(last_ss>=0)464 drawssboundaries(last_ss);465}466467//reset variable468active_module=::active_module;469470//redraw new one471if(active_module>=0) {472 drawmod(active_module,set_modcolor(active_module)+active_module%2);473474 //redraw ss boundaries and name475 if(active_ss>=0)476drawssboundaries(active_ss);477 }478 }479480 frontbuffer(FALSE);481 break;482483 case ACTIVE_SSVAR484 case ACTIVE_MODVAR485 case COLOR_CHANGE486 case FRAME_CHANGE487 case MODLINES_CHANGE488 case NROW_CHANGE489 case SHOWFILL_CHANGE490 ExposeMe();491 break;492493 default494 cout<<_FILE_<<_LINE_<<"Error-not reached"<<endl;495 }496 gflush();497 }Zoomview.c1 #include <assert.h>2 #include <iostream.h>3 #include <math.h>4 #include <memory.h>5 #include <stdio.h>67 #include <Xm/DialogS.h>8 #include <Xm/Form.h>9 #include <Xll/Xirisw/GlxMDraw.h>1011#include "zoomview.h"12#include "seesys.h"131415void16Zoomview::identify(double wmx,double wmy,17 int *sschange,int *module,int *file)18 {19 int i,mod;20 *sschange=*module=*file=-1;21 int ss=zoom[mybar].ss;2223 //identify the active subsystem (always the zoom subsystem)24 *sschange=ss;2526 //identify the active module27 for(i=0,mod=min_mod;i<modulesPerSS[ss];i++,mod++)28 if(modx[i]<=wmx &amp;&amp; wmx<=modx[i]+modw[i]29 &amp;&amp;300<=wmy &amp;&amp; wmy<=1)31 {32 *module=mod;33 break;34 }3536 //now get the file37}383940void41Zoomview::drawss(int i,int col)42{43 double x1,x2,y1,y2,filly,fillx;44 x1=0;45 x2=1;4647 y1=0;48 y2=1;4950 //draw.subsystem51 color(do_colors?colDK_GRAY);52 FillRect(x1,y1,x2-x1,y2-y1);5354 //black fill for animate55 if(do_animatelayout)56 {57color(MY_BLACK);58fillx=(1-ssvar[i/(ssmax[i]+!ssmax[i]))*x2;59FillRect(x2-fillx,y1,fillx,y2);60 }61 else62 {63//draw fill64if(do_showfill) {65 color(MY_GRAY);66 filly=ssfill[i]/(ssvar[i]+!ssvar[i]) * y2;67 FillRect(x1,y1,x2,filly);68}69}7071 //outline72 LineWidth(4);73 color(::active_ss==i ?DK_REDMY_WHITE);74 FrameRect(x1,y1, x2,y2); 75 LineWidth(1);76 }777879 void80 Zoomview::calc_layout(int ss,int mod)81 {82 int i,j;83 double modtot=0;84 double cumx=0;8586 for(i=0,j=mod;i<modulesperSS[ss];i++,j++)87 modtot+=modvar[j];8889 for (i=0,j=mod;i<modulesPerSS[ss];i++,j++) {90 modx[i]=cumx/modtot;91 modw[i]=modvar[j]/modtot;9293 cumx+=modvar[j];94 }95 }969798 void99 Zoomview::drawmodules(int ss,int mod)100{101 int i,am,modstart;102 double y1,y2,filly;103104 y1=0;105 y2=1;106107 modstart=mod;108109 LineWidth(2);110 for(i=0;i<modulesPerSS[ss];i++,mod++) {111 //draw module112 color(do_colors?set_modcolor(mod)+mod%2DK_GRAY);113 FillRect(modx[i],y1,modw[i],y2);114 FrameRect(mocdx[i],y1,modw[i],y2);115116 //draw subsystem fill average117 color(LT_GRAY);118 FillRect(modx[i],y1,modw[i],ssaverage[ss]);119 FrameRect(modx[i],y1,modw[i],ssaverage[ss]);120121 //draw fill122 if(do_showfill) {123color(do_colors?MY_GRAYLT_BLUE);124filly=modvar[mod]?modfill[mod]/modvar[mod]*y20;125FillRect(modx[i],y1,modw[i],filly);126FrameRect(modx[i],y1,modw[i],filly);127128 }129 //outline {130 if(do_modline) {131color(MY_WHITE);132FrameRect(modx[i],y1,modw[i],y2);133 }134135//set am to active module136if(::active_module==mod)137 am=i;138 }139140 //draw module names141 if(do_modnames) }142double char_h=YStoU(getheight()),143 ypos=25;144for(i=0,mod=modstart;i<modulesPerSS[ss];i++,mod++>145 {146color(active_module==mod?DK_REDMY_WHITE);147DrawString(modx[i]+.5*modw[i],ypos,modnames[mod],148 VxDrawCenter);149ypos+=2*char_h;150if(ypos>.75)151 ypos=.25;152 }153 }154155 // draw active module156 color(DK_RED);157 FrameRect(modx[am],y1,modw[am],y2);158LineWidth(1);159}160161//this is a kluge162static GLXconfig glxConfig[]={163{ GLX_NORMAL,GLX_DOUBLE, TRUE },164{ GLX_NORMAL,GLX_COLORMAP,TRUE },165{ GLX_NORMAL,GLX_ZSIZE, GLX_NOCONFIG },166{ 0,0,0 }167};168169Zoomview::Zoomview(char const *name,Widget parent,170 int mybar_a)171172//default constructors173VxGLDrawingArea(name,parent,glxConfig),174VxMouseable(VxMotion),175VxFunctionality(this)176{177 mybar=mybar_a;178 int ss=zoom[mybar].ss;179180int i;181for(min_mod=i=0;i<ss;i++)182 min_mod+=modulesPerSS[i];183max_mod=min_mod+modulesPerSS[ss]; 184185186 pub.Subscribe(this,ACTIVE_SS,ss);187 pub.Subscribe(this,ACTIVE_MODULE);188 pub.Subscribe(this,ACTIVE_SSVAR);189 pub.Subscribe(this,ACTIVE_MODVAR);190 pub.Subscribe(this,COLOR_CHANGE);191 pub.Subscribe(this,FRAME_CHANGE);192 pub.Subscribe(this,MODLINES_CHANGE);193 pub.Subscribe(this,MODNAMES_CHANGE);194 pub.Subscribe(this,SHOWFILL_CHANGE);195 pub.Subscribe(this,ZOOMSS_CHANGE);196}197198void199Zoomview::DoExpose(int,int,int,int)200{201 int mod=0;202203 color(BLACK);204 clear();205206 int ss=zoom[mybar].ss;207208 UserCoord(-0.01,1.01,-0.01,1.01);209210 //draw subsystem211 if(do_modules) {212 calc_layout(ss,min_mod);213 drawmodules(ss,min_mod);214 }215 else216 drawss(ss,set_sscolor(ss));217218 //outline.219 LineWidth(4);220 if(::active_ss==ss)221 color(DK_RED);222 else223 color(MY_WHITE);224225 FrameRect(0.,0.,1.,1.);226 LineWidth(1);227228 //ss name229 //color(MY_WHITE ;230 //DrawString(.5,.5,ssnames[ss],VxDrawCenter);231232 swapbuffers();233 }234235 void236 Zoomview::DoMouse(VxMouseActions /*what*/,int /*button*/237 XEvent const * /*xevent*/)238 {239 double wmx,wmy;240 int sschange,module,file;241242 //convert mouse position to world coordinates243 wmx=XStoU(MouseX());244 wmy=YStoU(Height()-1-MouseY());245246 identify(wmx,wmy,&amp;sschange,&amp;module,&amp;file);247248 if(sschange!=::active_ss )249 {250::active_ss=sschange;251pub.Changed(ACTIVE_SS,::active_ss);252 }253 if(module!=::active_module )254 {255::active_module=module;256pub.Changed(ACTIVE_MODULE,::active_module);257 }258259}260261262//user moved mouse in zoom window263void264Zoomview::Update(int article,int part,void */*data*/)265{266 switch(article) {267268 case ACTIVE_MODULE269 if(min_mod<=part &amp;&amp; part<max_mod)270ExposeMe();271 break;272273 case ACTIVE_SS274 case ACTIVE_SSVAR275 case ACTIVE_MODVAR276 case COLOR_CHANGE277 case FRAME_CHANGE278 case MODLINES_CHANGE279 case MODNAMES_CHANGE280 case SHOWFILL_CHANGE281 case ZOOMSS_CHANGE282 ExposeMe();283 preak;284 }285}286bottom.h1#ifndef_BOTTOM_H2#define_BOTTOM_H34#include <Publication.h>5//#include <VxColor.h>6//#include <VxGC.h>7#include "VxDrawer.h"8#include <VxGLDrawingA.h>9#include <VxMouseable.h>10 #include "seesys.h"111213 class Bottom 14 public VxGLDrawingArea,15 public VxDrawer,16 private VxMouseable,17 //private VxColorManager,18 //private VxGC,19 private Subscriber20 {2122 void drawslider(int partitions);232425//slider layout variables26 double barx[MAX MOD]; //x offset for subsystem bar in slider272829public303132 Bottom(char const *name,Widget parent);3334 voidDoExpose(int left,int top,int right,int bottom);35 void DoMouse(VxMouseActions,int button,XEvent const *);36 void Update(int article,int /* part */,void *);3738 };3940 #endif/* _BOTTOM_H */left.h1#ifndef_LEFT_H2#define_LEFT_H34#include <Publication.h>5#include "VxDrawer.h"6#include <VxGLDrawingA.h>7#include <VxMouseable.h>8910 #define MAX_TOGGLES 1011 #define MAX_SLIDERS 101213 //*********** toggle vars *********14 struct Toggle {15 double x,y;16 int *flag;17 char *labels[2];18 int mypub;19 Toggle(double x_a,double y_a,int *flag_s,20 char *offlabel,char *onlabel,int mypub_a);21};2223struct Slider {24 double x, y, h, w;2526 char *top_label;27 char *left_toplabel;28 char *left_bottomlabel;29 char **barlabels;3031 //logical positions32 int min,max;33 int *bar;3435 int mypub;3637 Slider(double x_a,double y_a,double h_a,double w_a,38 int min_a,int max_a,int *bar_a,39 int mypub,40 char *top_label_a,41 char *left_toplabel_a=NULL,42 char *bottom_toplabel_a=NULL,43 char **barlabels_a=NULL);44};4546class Left 47 public VxGLDrawingArea,48 public VxDrawer,49 private VxMouseable,50 private Subscriber51 {5253 //this is for the animation!54 XtIntervalId interval_id;55 static void timeout(Widget w);5657 //my toggles58 Toggle *toggles[MAX_TOGGLES)5960 //my sliders61 Slider *sliders[MAX_SLIDERS];6263 void drawssstats();64 void drawmodstats();65 void set_ssstats();66 double windsor(double low,double x,double high);67 void identifyssstat(double wmx,double wmy,int *statbutton);68 void identifymodstat(double wmx,double wmy,int *statbuttcn);69 void drawframeslider(int frame);70 void identifyframe(double wmx,double wmy,int *framepos);71 void drawrowslider(int nrows);72 void identifyrow(double wmx,double wmy,int *rowpos);7374 void drawslider(Slider *s);75 int identifyslider(double wmx,double wmy,Slider *s);7677 void drawtoggle(Toggle *t);78 int identifytoggle(double wmx,double wmy,Toggle *t);7980public818283 Left(char const *name,Widget parent);8485 void DoExpose(int left,int top,int right,int bottom);86 void DoMouse(VxMouseActions,int button,XEvent const *);87 void Update(int article,int /* part */,void *);8889};9091#endif /* _LEFT_H */ seesys.h1#ifndef_SEESYS_H2#define_SEESYS_H34#include<Publication.h>567#define MAX_ZOOM 10/* max number of zoomed subsystems */8#define MAX_SS50/* max numbet of subsystems */9#define MAX_MOD 5000 /* max number of modules */10 #define MAX_STRING(8*1024)11 #define PARTITIONS4 /* number of slider partitions */1213 #define DASH_LINE 1 /* dash lines */ 1415 /* color definitions */16 enum {17MY_BLACK=0, 18MY_WHITE=1,19MY_CYAN=4,20MY_GRAY,21DK_GRAY,22LT_GRAY,23DK_BLUE,24LT_BLUE,25DK_GREEN,26LT_GREEN,27DK_YELLOW,28LT_YELLOW,29DK_RED,30LT_RED31 };32333435 #ifndef MAX36 # define MAX(x,y) ( (x)>(y) ? (x) (y))37 #endif383940 //subsystem variables41 extern char **ssnames; //subsystem names42 extern intnss;//number of subsystems43 extern double minssvar; //largest subsystem variable44 extern double maxssvar; //largest subsystem variable45 extern double maxssframevar; //largest subsystem variable across all frames46 extern intmodulesPerSS[MAX_SS];//number modules per subsystem47 extern intdo_fill[MAX_SS];//do fill stats exist484950 //module variables51 extern char **modnames; //module names52 extern intnmod;//number of modules53 extern double maxmodvar; //largest module variable54 extern double maxmodframevar; //largest module variable across all frames55 extern intdomod_fill[MAX_MOD]; //do fill stats exist5657//slider variaoles58extern int cols[PARTITIONS]; //slider colors596061//multiple variables62extern double *ssvar_all; //all subsystem statistics63extern char**ssvarnames; //subsystem variable names64extern intnssvars; //number of subsystem variables65extern double *ssfill_all; //all subsystem fill statistics66extern char **ssfillnames;//subsystem fill names67extern intnssfills; //number of fill variables68extern double *modvar_all; //all module statistics69extern char **modvarnames;//module variable names70extern intnmodvars; //number of module variables71extern double *modfill_all; //all module fill statistics72extern char **modfillnames; //subsystem fill names73extern intnmodfills;//number of fill variables74extern intredraw_time; //redraw time in milliseconds757677//animation variables78extern char **framenames; // frame names79extern intnframes; // how many frames80extern intframe_delay; // milliseconds to delay btw frames8182//zoom variables83struct ZOOM {84 int ss;85 int used;86};87extern ZOOM zoom[MAX_ZOOM];8889//state variables90extern int do_animate; //animate over frames91extern int do_animatelayout; //zoom pending92extern int do_colors; //colors for ss or modules93extern int do_fork;//should we fork?94extern int do_modline; //lines between the modules95extern int do_modules; //show the modules96extern int do_modnames;//show module names in zoomview97extern int do_showfill;//show fill variable98extern int do_zoom;//zoom pending99100101 //active variables102 extern double *ssvar;// current subsystem variable103 extern double *ssfill; // current fill variable104 extern double *modvar; // current module variable105 extern double *modfill; // current fill variable106 extern intactive_ssvar; // which ss var is active107 extern intactive_modvar; // which module var is active108 extern intactive_frame; // which frame is active109 extern intactive_ss; // which subsystem is mouse on110 extern intactive_module; // which module is mouse on111 extern intactive_nrows; // how many rows in display112113//subsystem layout variables114extern double ssxpos[MAX_SS];//subsystems lower corners115extern double ssypos[MAX_SS];116extern double sswidth[MAX_SS]; //height and width117extern double ssheight[MAX_SS];118extern double ssmax[MAX_SS]; //max for each subsystem (ss animation)119extern double ssaverage[MAX_SS]; //average fill accross ss120121//module layout variables122extern double modxpos[MAX_MOD]; //module lower corners123extern double modypos[MAX_MOD];124extern double modwidth[MAX_MOD];//height and width125extern double modheight[MAX_MOD];126127//publications128extern Publication pub;129130//events for pub131enum {132ACTIVE_SS=1, //active publications133ACTIVE_SSVAR, //active subsystem variable134ACTIVE_MODVAR, //active module variable135ACTIVE_MODULE, //active module136ACTIVE_FILE,//active file137ANIMATE_CHANGE, //animate button pushed138COLOR_CHANGE, //color toggle changed139FRAME_CHANGE, //new frame var140MODLINES_CHANGE,//modline toggle changed141MODNAMES_CHANGE,//modline toggle changed142NROW_CHANGE,//change in number of rows143REDRAWTIME_CMANGE, //redraw time144SHOWFILL_CHANGE,//do_showfill has changed145SPEED_CHANGE, //user changed the speed146VAR_CHANGE, //new active var147ZOOMSS_CHANGE, //A zoomed window has moved148ZOOM_PENDING //zoom pending149 };150151 //X junk152 #include<Xll/Intrinsic.h>153 extern XtAppContext app_context;154 extern Widget toplevel;155156157 //function prototypee158 extern"C"void// no name mangling159 seesys(160 int*argc_ptr,161 char *argv[],162 char **ssnames_a, //ss names163 int *nss_a, //number of subsystems164 char**modnames_a,//module names165 int *nmod_a, //number of modules166167 //subsystem variables168 double *ssvar_a, //ss variables169 int *nssvars_a, //number of ss variables170 char**ssvarnames_a, //ss variable names171 double *ssfill_a,//all subsystem fill statistics172 int *nssfills_a, //number of fill variables173 char**ssfillnames_a, //subsystem fill names174175 //module variables176 double *modvar_a, //module variables177 int*nmodvars_a, //number of module variables178 char **modvarnames_a, //module variable names179 double *modfill_a,//all module fill statistics180 int*nmodfills_a, //number of fill variables181 char **modfillnames_a, //module fill names182183 //animation frames184 char **framenames_a,//frame names185 int*nframes_a, //number of frames186187 int*flags188);189190191double get_ssvar(int whichvar,int whichss);192double get_modvar(int whichvar,int whichmod);193void set_ssvar(int which,int nrows); 194void set_modvar(int which,int nrows);195int set_sscolor(int ss);196int set_modcolor(int mod);197void layout(int nrows);198void module_layout(int nrows);199void ssanimate_layout(int nrows);200void set_sslayout();201void set_maxssvar();202void set_maxmodvar();203void set_maxssframevar();204void set_maxmodframevar();205void zoomview_quitCB(Widget w,206caddr_t /*client_data*/,caddr_t /*call_data*/);207208209#endif/* _SEESYS_H */sysview.h1#ifndef_SYSVIEW_H2#define_SYSVIEW_H34#include <Publication.h>5//#include <VxColor.h>6//#include <VxGC.h>7#include <VxGLDrawingA.h>8#include "VxDrawer.h"9#include "seesys.h"10 #include <VxMouseable.h>111213 class Sysview 14 public VxGLDrawingArea,15 public VxDrawer,16 private VxMouseable,17 //private VxColorManager,18 //private VxGC,19 private Subscriber20 {2122 void identify(double wmx, double wmy,23int *ss,int *module,int *file);2425 void drawss(int which,int col);2627 void drawssname(int ss);2829 void drawmod(int which,int col);3031 void drawssboundaries(int ss);3233 void calc_fillaverage();3435 int active_ss;3637 int active_module;3839 int last_ss;4041 public424344 Sysview(char const *name,Widget parent);4546 voidDoExpose(int left,int top,int right,int bottom);47 void DoMouse(VxMouseActions,int button,XEvent const *);48 void Update(int article,int/* part */,void *);4950};5152#endif/* _SYSVIEW_H */Zoomview.h1#ifndef_ZOOMVIEW_H2#define_ZOOMVIEW_H34#include <Publication.h>5#include "VxDrawer.h"6#include <VxGLDrawingA.h>7#include <VxMouseable.h>8#include "seesys.h"910 class Zoomview11 public VxGLDrawingArea,12 public VxDrawer,13 private VxMouseable,14 private Subscriber15 {1617 void draw_stand_rel(18 double x, double y,int which_tel,double size,19 int toplabel,20 Colorindex boundary,int boundary_thickness);21 void drawss(int i,int col);22 void drawmodules(int ss,int mod);23 void calc_layout(int ss,int mod);24 void identify(double wmx,double wmy,int *ss,int *module,int *file);2526 double modx[MAX_MOD]; // module x positions for zoom window27 double modw[MAX_MOD];28293031public3233 int mybar;34 int min_mod;// first module in my subsystem35 int max_mod;// one past last module in my subsystem363738 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -3940 Zoomview(char const *name,Widget parent,int mybar_a);4142 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -4344 void DoExpose(int left,int top,int right,int bottom);4546 void DoMouse(VxMouseActions what,int /*button*/,47 XEvent const * /*xevent*/);4849 void Update(int article,int /* part */,50 void */* data*/);5152};5354#endif/* _ZOOMVIEW_H */]]></pre>
权利要求
1.在计算机系统的显示中显示与适用统计信息的实体的分级结构有关的至少一个统计量的装置,包括显示中的第一区,与分级结构中最高级的一个实体相应;以及包含在第一区中的多个被包含的区,排列成至少一行,每行高度基本上相同,每个被包含的区与最高级的一个实体之外的实体相应,每个被包含的区的面积代表相应实体的统计量,每个被包含的区被包含在与分级结构中下一最高级中的一个实体相应的区中,且直接包含在包含区中的被包含的区具有形状,以便直接被包含的区的相对尺寸易于从显示中看出。
2.根据权利要求1的装置,其中该装置显示适用于实体的另一统计量;以及与分级结构的给定级中的实体相应的被包含的每个区,根据该区相应的实体的另一统计量的值,被直观地分成子区。
3.根据权利要求2的装置,其中所有的区属于同类别的多边形。
4.根据权利要求3的装置,其中多边形的类别是矩形。
5.根据权利要求4的装置,其中每个被包含的区分别具有一个标识;以及每个标识至少部分上位于与其实体相应的区内。
6.根据权利要求1的装置,还包括显示中的第二区,含有一个交互控制区,用于调节所述第一区被分成的行数。
7.根据权利要求1的装置,还包括用于调节每行高度的装置,以便每行高度基本相同,且每行以整数个几何形状充满。
8.在计算机系统的显示中显示与适用统计信息的实体的分级结构有关的至少一个统计量的方法,包括步骤在显示中分配一个第一区,它与分级结构中最高级的一个实体相应;以及将第一区分成多个含在第一区中的被包含的区,它们排列成至少一行,每行高度基本上相同,每个被包含的区与最高级的一个实体之外的实体相应,每个被包含的区的面积代表相应实体的统计量,每个被包含的区被包含在与分级结构中下一最高级中的一个实体相应的区中,且直接包含在包含区中的被包含的区具有形状,以便直接被包含的区的相对尺寸易于从显示中看出。
9.根据权利要求8的方法,还包括步骤分别确定每个被包含的实体的一个标识;以及显示每个标识,使每个标识的中心分别位于与其被包含的实体相应的区内。
10.显示具有多个子系统的软件系统的信息的方法,包括步骤确定软件系统的源代码总量;确定多个子系统中每个子系统各自的源代码量;将一个显示分成多个矩形区,每个矩形区代表多个子系统中各个子系统;确定每个矩形区的尺寸,使得代表子系统的每个矩形区具有第一尺寸和一面积,该第一尺寸与代表子系统的所有其他矩形区的尺寸相同,该面积相对于显示的比例与各子系统中源代码量相对于软件系统的源代码总量的比例相同。
11.根据权利要求10的方法,还包括步骤分别为每个子系统确定一个名字;以及在代表每子系统的矩形区内至少部分地显示其名字。
12.根据权利要求11的方法,还包括步骤为每个子系统确定一个已修改的源代码量对源代码总量的比率,和一个未修改的源代码量对源代码总量的比率;以及在每个矩形区中显示第一颜色的区,与其相应区的尺寸的比例与已修改的源代码量对源代码总量的比率相同,显示第二颜色的区,与其相应区的尺寸的比例与未修改的源代码量对源代码总量的比率相同。
13.根据权利要求11的方法,还包括步骤为每个子系统确定一个已修改的源代码量对源代码总量的比率,和一个未修改的源代码量对源代码总量的比率;以及在每个矩形区中显示第一阴影区,与其相应区的尺寸的比例与已修改的源代码量对源代码总量的比率相同,显示第二阴影区,与其相应区的尺寸的比例与未修改的源代码量对源代码总量的比率相同。
14.显示具有多个发行版本并具有多个子系统的软件系统的信息的方法,包括步骤为多个子系统中的每个子系统确定所述多个发行版本中任何版本的各最大源代码量;通过将所述子系统最大源代码量相加,确定软件系统的最大源代码总量;将显示分成多个矩形区,每个矩形区代表各子系统最大源代码量;确定每个矩形区的尺寸,使得代表子系统的每个矩形区具有第一尺寸和一面积,该第一尺寸与代表子系统的所有其他矩形区的尺寸相同,该面积相对于显示的比例与各子系统中最大源代码量相对于软件系统的最大源代码总量的比例相同。
15.根据权利要求14的方法,还包括步骤对于各子系统,在每个矩形中为软件系统的每个发行版本显示一个阴影,它代表所显示版本的源代码量对最大源代码量的比率;以及为软件系统的每个发行版本,顺序显示所述矩形和所述阴影,所用比率使得阴影的相对尺寸的变化易于从显示中看出。
16.根据权利要求14的方法,还包括步骤对于各子系统,在每个矩形中为软件系统的每个发行版本显示一个有颜色的区,它代表所显示版本的源代码量对最大源代码量的比率;以及为软件系统的每个发行版本,顺序显示所述矩形和所述有颜色的区,所用比率使得阴影的相对尺寸的变化易于从显示中看出。
17.根据权利要求16的方法,还包括步骤显示每个有颜色的区的中间尺寸,它从一个发行版本到另一个发行版本改变尺寸,以动画显示有颜色的区的相对尺寸的变化,有助于感受软件系统的演化。
18.根据权利要求17的方法,还包括步骤根据用户选择,调节动画比率。
全文摘要
对大型软件系统的结构、统计量和特性进行显示的交互的方法和装置。整个软件系统被看成为一个实体。以相似的几何形状给出代码的相似的子划分,该形状具有基本相等的参照框,如基本一致的行高度,所以子划分的相对尺寸能被理解。除尺寸之外,可能使用不同的阴影和着色方式显示改变、软件错误和软件修复。再者,如果软件系统的各种发行版本的数据可用,则可动画显示系统各发行版本的演化,使大型软件系统的历史更易理解。
文档编号G06F11/36GK1113582SQ94117568
公开日1995年12月20日 申请日期1994年10月20日 优先权日1993年10月22日
发明者马拉·J·贝克, 斯蒂芬·G·艾克 申请人:美国电报电话公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1