欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

顯示大型軟件系統(tǒng)分層信息的方法及裝置的制作方法

文檔序號:6408143閱讀:521來源:國知局
專利名稱:顯示大型軟件系統(tǒng)分層信息的方法及裝置的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及計算機(jī)系統(tǒng),更具體地涉及圖形顯示大型軟件系統(tǒng)的關(guān)鍵特性的方法及裝置。
開發(fā)一百萬行以上源代碼的大型軟件系統(tǒng),需要許多訓(xùn)練有素的專業(yè)人員付出長時間的艱苦努力。軟件系統(tǒng)具有一個總體結(jié)構(gòu),正如一座大型建筑物具有一個總體結(jié)構(gòu)一樣。在大型軟件系統(tǒng)的總體結(jié)構(gòu)內(nèi),有子系統(tǒng),目錄和文件,它們提供系統(tǒng)的特定功能,正如大型建筑物的層樓、邊房和房間提供建筑物的功能一樣。如果功能需要演化,則系統(tǒng)的子系統(tǒng)、目錄和文件也可另外演化,正如當(dāng)建筑物需求改變時,可以增加、去除或修復(fù)一個建筑物的邊房和房間。大型建筑物具有其原始結(jié)構(gòu),顯示于一系列稱為籃圖的易于形象化的技術(shù)說明中。為助于以后對建筑物的建造和修復(fù),對籃圖進(jìn)行修改,使得原始結(jié)構(gòu)和構(gòu)造以及以后對原始結(jié)構(gòu)和構(gòu)造所做的任何改變都以視覺上可辨認(rèn)并易于理解的方式顯示出來。不幸的是,對于含有子系統(tǒng)、目錄和文件的大型軟件系統(tǒng)的原始結(jié)構(gòu)和構(gòu)造,以及以后的改變,以視覺可識別并易于理解的方式進(jìn)行顯示的方法,當(dāng)前并不存在。
所知的小型軟件系統(tǒng)的顯示和顯象技術(shù)不能成攻地擴(kuò)大到用于大型軟件系統(tǒng)。大型軟件系統(tǒng)的源代碼列表具有太多的細(xì)節(jié),而難于理解。流程圖和結(jié)構(gòu)框圖不僅變得具有過多細(xì)節(jié),而且后來對軟件系統(tǒng)的改變也可能放棄了與系統(tǒng)的當(dāng)前版本毫不相關(guān)的原始流程、結(jié)構(gòu)和抽象用語。另外,目前出現(xiàn)的大型系統(tǒng)的顯示和顯象技術(shù),如91年《顯象學(xué)報》(Proceedings Visualization)中,Johnson和Shneiderman在文章“三圖顯象分層信息結(jié)構(gòu)的一種空間填充方法”中所提出的三圖(three-map)技術(shù),產(chǎn)生難于理解的顯示。該三圖技術(shù)用矩形填充顯示區(qū)域,矩形的受控量是其面積。僅控制矩形面積造成某些矩形長且窄,某些短且寬,還有接近正方形的,但具有相同的面積。這使得結(jié)構(gòu)細(xì)節(jié)難于顯象,因為觀者必須比較許多具有不同長度和寬度的矩形的面積,以做相應(yīng)的判斷。這樣,在技術(shù)中,有必要以可理解的方式,對與大型軟件系統(tǒng)的子系統(tǒng)、目錄和文件有關(guān)的信息和統(tǒng)計量進(jìn)行圖形顯示,為以后的軟件維護(hù)和開發(fā)人員所用。
本發(fā)明的一個目的,是提供一種顯示大型軟件系統(tǒng)的結(jié)構(gòu)和構(gòu)造的裝置,使得技術(shù)人員能夠理解其子系統(tǒng)、目錄和文件之間的關(guān)系。
本發(fā)明的另一個目的,是提供一種顯示與大型軟件系統(tǒng)的代碼變化有關(guān)的信息和統(tǒng)計量的裝置,使得技術(shù)人員能夠理解該系統(tǒng)、其子系統(tǒng)、目錄和文件的功能演化。
本發(fā)明的再一個目的,是提供一種顯示大型軟件系統(tǒng)的結(jié)構(gòu)和構(gòu)造的方法,使得技術(shù)人員能夠理解其子系統(tǒng)、目錄和文件之間的關(guān)系。
本發(fā)明還有一個目的,是提供一種顯示與大型軟件系統(tǒng)的代碼變化有關(guān)的信息和統(tǒng)計量的方法,以幫助技術(shù)人員看到并理解該系統(tǒng)、其子系統(tǒng)、目錄和文件的功能的演化。
根據(jù)本發(fā)明一方面的簡述,前述目的通過提供一種對實(shí)體分級結(jié)構(gòu)的至少一種統(tǒng)計量進(jìn)行顯示的裝置實(shí)現(xiàn),在計算機(jī)系統(tǒng)的顯示中統(tǒng)計信息適用于該實(shí)體。該裝置包括顯示中的第一區(qū),它與分級結(jié)構(gòu)的最高級的一個實(shí)體相應(yīng)。第一區(qū)中所含的是多個被包含的區(qū),排列成至少一行,各行高度基本相同。每個被包含的區(qū)與最高級的一個實(shí)體之外的實(shí)體相應(yīng)。每個被包含的區(qū)的面積代表相應(yīng)實(shí)體的統(tǒng)計量。一個區(qū)中所含的每個被包含的區(qū)與分級結(jié)構(gòu)的下一最高級中的一個實(shí)體相應(yīng)。直接含在包含區(qū)中的被包含的區(qū)具有形狀,使得直接被包含的區(qū)的相對尺寸易于從顯示中看出。
根據(jù)本發(fā)明另一方面,發(fā)明目的通過提供一種對實(shí)體分級結(jié)構(gòu)的至少一種統(tǒng)計量進(jìn)行顯示的方法實(shí)現(xiàn),在計算機(jī)系統(tǒng)的顯示中統(tǒng)計信息適用于該實(shí)體。該方法在顯示中分配第一區(qū),與分級結(jié)構(gòu)中最高級一個實(shí)體相應(yīng);并且將第一區(qū)分為多個含在第一區(qū)中的被包含的區(qū),排列為至少一行,每行高度基本相同,每個被包含的區(qū)與除最高級的一個實(shí)體之外的實(shí)體相應(yīng),每個被包含的區(qū)的面積代表相應(yīng)實(shí)體的統(tǒng)計量,一個區(qū)中所含的每個被包含的區(qū)與分級結(jié)構(gòu)的下一最高級中的一個實(shí)體相應(yīng),并且直接含在包含區(qū)中的被包含的區(qū)具有形狀,使得直接被包含的區(qū)的相對尺寸易于從顯示中看出。
盡管說明書得出所附的對本發(fā)明主題進(jìn)行了具體明確說明的權(quán)利要求書,但通過以下描述并結(jié)合附圖,本發(fā)明將更好理解。


圖1是顯示分層軟件系統(tǒng)的計算機(jī)系統(tǒng)例的框圖。
圖2是顯示裝置和方法的讀關(guān)鍵特性部分的流程圖。
圖3是以多行顯示子系統(tǒng)相對尺寸和新開發(fā)代碼比例的顯示畫面。
圖3A是單行顯示與圖3所示相同信息的顯示畫面。
圖4是最佳實(shí)施方式中顯示每個子系統(tǒng)的相對尺寸、新開發(fā)代碼比例以及目錄細(xì)節(jié)的顯示畫面。
圖5是圖4中一個子系統(tǒng)的經(jīng)放大至充滿顯示屏的畫面。
圖6是最佳實(shí)施方式中顯示每個子系統(tǒng)中與新的、非注釋源代碼行和軟件錯誤修復(fù)有關(guān)的子系統(tǒng)尺寸的顯示畫面。
圖7是顯示與用于軟件錯誤修復(fù)的新的、非注釋源代碼行以用為修復(fù)先前軟件錯誤中的錯誤而需的軟件錯誤修復(fù)數(shù)目有關(guān)的子系統(tǒng)尺寸的顯示畫面。
圖8、9和10是最佳實(shí)施方式中顯示子系統(tǒng)尺寸關(guān)于時間(即發(fā)行版本)而變化的顯示屏幕的畫面。
參照圖1,計算機(jī)系統(tǒng)101示于框圖中。計算機(jī)系統(tǒng)101含有終端103,它向操作計算機(jī)系統(tǒng)101的技術(shù)人員提供輸出并從之接收輸入,處理機(jī)113,它執(zhí)行實(shí)際操作,存儲器115,它含有處理機(jī)113所執(zhí)行的程序117,以及數(shù)據(jù)區(qū)119,它含有與分層軟件系統(tǒng)有關(guān)的數(shù)據(jù),也可含有分層軟件系統(tǒng)本身。計算機(jī)系統(tǒng)101還具有一個海量存儲部件120,用于存儲大型程序和大量數(shù)據(jù)。
更具體些,終端103含有一個顯示屏105,處理機(jī)113在顯示屏上向操作員顯示信息。顯示屏105還含有一個指示箭頭107,它確定顯示屏105上的一個位置,并可在鍵盤109或鼠標(biāo)器111的控制下移動。操作員通過從鍵盤109和/或鼠標(biāo)器111輸入對計算機(jī)系統(tǒng)101的運(yùn)行進(jìn)行控制。處理機(jī)113可以是任何種類的處理機(jī),從個人計算機(jī)到巨型計算機(jī)。存儲器115可以含有程序和數(shù)據(jù)存儲用的隨機(jī)存取存儲器和只讀存儲器。海量存儲部件120可以含有一個磁盤、一個光盤,或者甚至一個遠(yuǎn)程數(shù)據(jù)庫。
當(dāng)使用計算機(jī)系統(tǒng)101處理并顯示大型分層軟件系統(tǒng)的信息,即統(tǒng)計量時,操作員利用鍵盤109或鼠標(biāo)器111輸入一條或多條命令;處理機(jī)113如所需執(zhí)行程序117,以執(zhí)行命令,并在顯示屏105上顯示結(jié)果。然后操作員能夠利用鍵盤109和/或鼠標(biāo)器111發(fā)布一條或多條命令,以便更詳細(xì)地檢查或處理該結(jié)果。
現(xiàn)在參照圖1和2,一個軟件系統(tǒng)的名稱已經(jīng)在鍵盤109上鍵入或通過鼠標(biāo)器111選擇,以便開始對所選的軟件系統(tǒng)的特性和結(jié)構(gòu)進(jìn)行顯示。與關(guān)鍵特性有關(guān)的統(tǒng)計量關(guān)聯(lián)于所選的軟件系統(tǒng),并且將這些統(tǒng)計量讀入存儲器115,若不在其中,則加以存儲以備本發(fā)明的顯示程序122使用。然后,處理機(jī)113處理軟件系統(tǒng)顯示程序122,以提供顯示,有助于操作員更容易地理解軟件系統(tǒng)的特性和結(jié)構(gòu)。附錄A中給出C語言編程的顯示程序122的列表。
處理機(jī)113讀入軟件系統(tǒng)的一種發(fā)行版本(如最新版本)的非注釋源代碼行(NCS行)的數(shù)目,以及一個或多個先前版本的NC5行數(shù)目。NCS行數(shù)作為許多顯示的基線,如下所述。技術(shù)人員將認(rèn)識到能夠使用其他基線單位,如源代碼量,而不是NCS行數(shù)量。這樣小的修改是在本發(fā)明的范圍之內(nèi)的。
參照圖2,顯示出由處理機(jī)113讀入的子系統(tǒng)特性和統(tǒng)計量。每個子系統(tǒng)的名字與其發(fā)行標(biāo)志和NCS數(shù)一起讀入。另外,對于一個發(fā)行標(biāo)志的每個子系統(tǒng),讀入新NCS行數(shù),各子系統(tǒng)內(nèi)的每個目錄的名字,各目錄內(nèi)的每個文件的名字,每個目錄內(nèi)NCS行數(shù),以及每個目錄文件的新NCS行數(shù)。再者,也讀入每個目錄的軟件錯誤修正的數(shù)目和對先前軟件修正的軟件錯誤修正數(shù)目。將統(tǒng)計量讀入存儲器115,可以對這些統(tǒng)計量進(jìn)行快速訪問,所以操作員能夠使用本發(fā)明的交互和/或動畫特性,而沒有因經(jīng)常從諸如磁盤驅(qū)動器那樣的慢速設(shè)備訪問數(shù)據(jù)而造成延遲。
現(xiàn)在參照圖3,將解釋對大型分層軟件系統(tǒng)的統(tǒng)計量和特性的顯示。首先,在顯示屏301上定義一個系統(tǒng)顯示空間303,在其中顯示子系統(tǒng)統(tǒng)計量和特性。顯示屏301也具有一個控制和指示空間305,位于顯示空間303的左下方。顯示空間303是一個交互窗口,在指示箭頭和鼠標(biāo)器控制下,可以在x和y方向變化尺寸。顯示空間303是矩形的,這是最佳的,因為矩形表示是易于直觀地理解的形式,盡管可以使用其他幾何形狀,如橢圓或圓,它們在本發(fā)明的范圍內(nèi)。
顯示空間303被分為數(shù)個幾何形狀307,每個幾何形狀的尺寸,即面積代表各子系統(tǒng)的NCS行數(shù)。幾何形狀307是矩形的,但是可以使用其他幾何形狀,如三角形、梯形等。尤其如果使用圓形顯示空間,則使用同心相臨環(huán),而不是這些環(huán)的弧和段作為幾何形狀代表每個子系統(tǒng)。
將顯示空間303分為一行或多行幾何形狀307。每行在y方向上的延伸(即高度)基本上相同。如只有一行,如圖3A所示,則所有形狀在y方向上具有相同的延伸。這造成很高很窄的幾何形狀,難于直觀地解釋各空間之間的尺寸關(guān)系,僅具有統(tǒng)一的高度。因為很高很窄的幾何形狀難于直觀地解釋,則所以設(shè)置一個交互式行控制滑動區(qū)309。利用指示箭頭107和鼠標(biāo)器111將指示條從MIN拖到MAX,使顯示區(qū)303中的行數(shù)從1增加到軟件系統(tǒng)中子系統(tǒng)的數(shù)目作為最大數(shù)目。操作員可以選擇其易于解釋的行數(shù)。圖3所示為6行。
子系統(tǒng)在每行中從左到右以降字母序排列。由于次序是由名字而不是尺寸確定的,所以顯示每個幾何形狀307的方法也含有對不便的子系統(tǒng)尺寸的解決方案,如可能產(chǎn)生的在行尾出現(xiàn)非常大的文件。該方法取子系統(tǒng)數(shù)Subs,并除以行數(shù)Rows,取子系統(tǒng)的NCS數(shù)NCSL,并除以行數(shù)。顯示程序122在第一行中以字母序分配待顯示的子系統(tǒng)。顯示程序122試探性地將(Subs/Rows)的商作為第一行中的子系統(tǒng)數(shù)。然后,顯示程序122將第一行中所分配的子系統(tǒng)的NCS行數(shù)相加,并與(NCSL)/(Rows)的商相比。如果試探性分配的子系統(tǒng)的NCS行數(shù)小,則顯示系統(tǒng)可以在該行中分配一個附加的子系統(tǒng)。一旦第一行分配完畢,則調(diào)節(jié)該行的高度,使得其面積與顯示空間303的總面積的比值,與第一行中的子系統(tǒng)的NCS行數(shù)與所有子系統(tǒng)的NCS行總數(shù)的比值相同。該方法以同樣方式處理后續(xù)行。因為每行的面積被調(diào)節(jié)為顯示空間303的相應(yīng)部分,則始終有用于剩余子系統(tǒng)的空間。這樣,本發(fā)明的方案在于對高度進(jìn)行稍許改變,或者在一行為所有子系統(tǒng)提供較多的面積,以便得到該行中的最后一個文件,或者提供較少的面積,并將行尾的最后一個文件強(qiáng)制到下一行首。這種行高自調(diào)節(jié)使得可以不必使用不規(guī)則的行長,或者不必在幾何形狀中間斷開,以使填充顯示空間303中不需要的行。該方案提供了顯示空間303的百分之百的利用。
如上所述,每個幾何形狀307的面積對整個顯示空間303的比例,與其相應(yīng)子系統(tǒng)的NCS行數(shù)對整個軟件系統(tǒng)的NCS行總數(shù)的比例相同。某些幾何形狀307被輕微地遮蓋了。圖3中,陰影的這種對比代表子系統(tǒng)中新編寫的NCS行的比例。這樣,圖3顯示了兩種統(tǒng)計量,每個子系統(tǒng)的相對尺寸和相對于每個子系統(tǒng)尺寸的新代碼量。如圖3A所示,單行顯示303A,對于顯示每個子系統(tǒng)中新代碼量是有用的,盡管難于對各子系統(tǒng)的相對尺寸進(jìn)行解釋。子系統(tǒng)中缺少新代碼可能指示著增加新功能的地方。
圖3A中,幾何形狀307A具有代表非新NCS行量的具有灰度的陰影。將該陰影改變到不同的灰度,指示各子系統(tǒng)的尺寸。在具有256或更多灰度級的灰度級計算機(jī)顯示器上,這是容易提供的??蛇x擇地,對于具有彩色顯示的系統(tǒng),可以使用色彩。對比色可以有助于操作員看到正被分折的系統(tǒng)。例如,對于彩色顯示,形狀307A中的非新NCS行可以用一個色彩表示,如深籃色,而形狀307A中的新NCS行可以用灰色、較淺的籃色或其他對比色表示。因為色彩區(qū)分對于眼睛易于鑒別,本發(fā)明的最佳實(shí)施方式采用彩色顯示,對于具有彩色顯示的系統(tǒng),附錄A是一致的。
現(xiàn)在參照圖4,可以顯示軟件系統(tǒng)的進(jìn)一步的細(xì)節(jié)。顯示空間403基本上與顯示空間303相同,除代表一個子系統(tǒng)的每個幾何形狀407還具有顯示于其內(nèi)的相應(yīng)子系統(tǒng)的目錄。每個目錄用一個幾何形狀表示,其尺寸,即面積,對其子系統(tǒng)幾何形狀407的面積的比率,與目錄的NCS行數(shù)對其相應(yīng)子系統(tǒng)的NCS行數(shù)的比率相同。以字母序在各子系統(tǒng)中排列目錄。每個目錄的統(tǒng)計量和特性也得以顯示。通常統(tǒng)計量和特性以及目錄名字在顯示403中的不可讀的。鑒于此,控制空間405具有交互式信息區(qū)410,邏輯上鏈接于指示箭頭107的位置。信息區(qū)410給出指示箭頭107所在處的子系統(tǒng)的NCS行數(shù)。該信息由滑塊上的指示器的位置以圖形方式給出,并由信息區(qū)410中的數(shù)字表示給出。同樣,信息區(qū)410在一字母數(shù)字表示中指明指示箭頭107所在處的子系統(tǒng)的名字??刂瓶臻g405具有變焦交互區(qū)412,并且如果指示箭頭107點(diǎn)亮一個如子系統(tǒng)w1的子系統(tǒng)時,指示箭頭位于變焦區(qū)412上,且由鼠標(biāo)器111選擇變焦特性,顯示程序在前景中從顯示空間403打開一個窗口??刂瓶臻g405的最佳實(shí)施方式也是具有多種可用色彩的顯示空間。
現(xiàn)在參照圖5,顯示了一個所選子系統(tǒng)w1的窗口501。該實(shí)施方式中,代表子系統(tǒng)w1的幾何形狀507是矩形的,幾何形狀507被分成矩形509,所有矩形509在y方向上具有相同的延伸。所以,每個目錄矩形509的相對尺寸,取決于其在x方向上的延伸。每個目錄的名字大致位于各矩形的x方向的中心,但如果在相鄰目錄矩形中有可用空間,則可以伸到邊界外。為避免沖突,目錄的對中的名字在正x和y方向以斜線序排列。
窗口501中顯示了三種陰影。淺灰520和黑522提供一個背景,它代表幾何形狀507所代表的整個子系統(tǒng)w1的代碼的新NCS行的百分比(淺灰)和代碼的先有NCS行的百分比(深灰或黑)。在窗口501的前景中的中灰524,代表每個目錄509中新NCS行的百分比。這樣,在窗口501中,所選子系統(tǒng)中的新NCS行的百分比,組成子系統(tǒng)的目錄的相對尺寸,以及子系統(tǒng)中的每個目錄的修改的NCS行量,所有這些都易于視覺比較。
在顯示301的前景中可變焦打開多于一個的窗口。利用多窗口幫助操作員,每個窗口由指示箭頭107的位置邏輯上鍵接到信息區(qū)410,以使數(shù)字和字母區(qū)顯示指示箭頭107所在處的子系統(tǒng),甚至在子系統(tǒng)的變焦窗口中。當(dāng)操作員完成一個窗口時,如窗口501,可以在鍵盤109上鍵入適當(dāng)命令,或用鼠標(biāo)器111激活相同命令,關(guān)閉窗口。
現(xiàn)在參照圖6,描述另一重要統(tǒng)計量的顯示。顯示空間603與圖4中的顯示403相同,都具有代表當(dāng)前發(fā)行版本的子系統(tǒng)及其當(dāng)前目目錄的相對尺寸的幾何形狀。然而,在顯示空間603中,每個幾何形狀607的尺寸代表子系統(tǒng)中新NCS行數(shù)對軟件系統(tǒng)中新NCS行數(shù)的比率,每個目錄的尺寸代表其相應(yīng)子系統(tǒng)的新NCS行數(shù)。再者,每個幾何形狀607中的對比陰影,用一個灰色陰影代表為修正軟件錯誤而在每個子系統(tǒng)中包括的新NCS行的百分比,用不同的灰色陰影代表為修正一個軟件錯誤或多個軟件錯誤而在每個目錄中所包括的新NCS行的百分比。這樣,顯示空間603指明了子系統(tǒng)和目錄中在所顯示的發(fā)行版本之前為補(bǔ)救已知的軟件錯誤而進(jìn)行的開發(fā)所在。也將顯示為增加功能而非修正錯誤而進(jìn)行新開發(fā)處的面積,因為那些幾何形狀607尺寸太大而陰影少。如圖4和5所示,如果采用彩色顯示,則這些細(xì)節(jié)最好以對比色顯示,而不用圖6所用的各種灰色陰影。
圖7更具體地顯示了為修正軟件錯誤而改變NCS行。圖7中,每個幾何形狀707的尺寸代表在最新軟件系統(tǒng)版本的相應(yīng)子系統(tǒng)中發(fā)現(xiàn)并修正的的軟件錯誤數(shù)量。根據(jù)由最新發(fā)行版本發(fā)現(xiàn)和修正的軟件錯誤的數(shù)量,確定目錄的尺寸。圖7的陰影代表所做的軟件錯誤修正與先前軟件錯誤修正的百分比。許多修正又修正的幾何形狀707,例如,子系統(tǒng)730,指明有故障的目錄或子系統(tǒng),可能最好進(jìn)行重寫指令并重寫。
現(xiàn)在參照圖8、9和10,解釋對兩個更多發(fā)行版本的軟件系統(tǒng)的演化直觀化的方法。處理機(jī)113讀取所有版本的所有子系統(tǒng)名字和統(tǒng)計量,作為顯示的部分。在讀過程中,處理機(jī)113在存儲器系統(tǒng)115中,建立所考慮的軟件系統(tǒng)版本的任何一個中的存在的每個子系統(tǒng)的列表,以及每個子系統(tǒng)的最大尺寸。一旦積累起該數(shù)據(jù),則顯示空間803、903和1003(這是在顯示屏301上的時間順序)顯示矩形807、907和1007所填充的行,矩形代表軟件系統(tǒng)中所存在的每個子系統(tǒng),它們的尺寸根據(jù)每個子系統(tǒng)中存在的最大NCS行數(shù)而定。因為這些統(tǒng)計量實(shí)際上是不變的,所以顯示空間803、903和1003具有相同的子系統(tǒng)和相同的子系統(tǒng)矩形尺寸。
軟件系統(tǒng)的演化由代表子系統(tǒng)的最大尺寸的矩形807、907和1007內(nèi)的陰影尺寸變化顯示。對每個子系統(tǒng),陰影代表軟件發(fā)行版本之一中的子系統(tǒng)的相對于子系統(tǒng)最大尺寸的尺寸。
圖8的顯示空間803顯示了軟件系統(tǒng)的最早版本的矩形807的陰影。圖10的顯示空間1003顯示了較后時間的軟件系統(tǒng)較后版本的矩形1007的陰影。交互式速度滑動器832允許操作員在鼠標(biāo)器控制下選擇顯示空間803中的顯示與顯示空間1003中的顯示之間的時間量??蛇x擇地,幀滑動器834允許操作員通過指示箭頭107和鼠標(biāo)器111的控制選擇圖8所示第一和圖10所示第一百零五之間的任何顯示。
圖9顯示了圖8所表示的最早版本與圖10所表示的當(dāng)前版本之間的過渡。圖9可以表示最早和當(dāng)前發(fā)行版本之間的一種實(shí)際軟件版本,或者它可以表示兩種發(fā)行版本之間的代碼的增加。這種增加的目的在于在那些例子中增加向操作員提供的動畫的平滑性,實(shí)際發(fā)行數(shù)據(jù)不足以提供軟件子系統(tǒng)演化的平滑動畫的顯示。
<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=y(tǒng)1+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=y(tǒng)1+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,F(xiàn)RAME_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(tǒng)_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(tǒng)_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,F(xiàn)RAME_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=Y(jié)StoU(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=Y(jié)StoU(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?。絠nputnum[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?。絠nputnum[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)?。?) {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?。絥frames) {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?。絘ctive_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<o(jì)ffset+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(luò)=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,F(xiàn)RAME_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=Y(jié)StoU(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 ?。?)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=Y(jié)StoU(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,F(xiàn)RAME_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=Y(jié)StoU(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>
權(quán)利要求
1.在計算機(jī)系統(tǒng)的顯示中顯示與適用統(tǒng)計信息的實(shí)體的分級結(jié)構(gòu)有關(guān)的至少一個統(tǒng)計量的裝置,包括顯示中的第一區(qū),與分級結(jié)構(gòu)中最高級的一個實(shí)體相應(yīng);以及包含在第一區(qū)中的多個被包含的區(qū),排列成至少一行,每行高度基本上相同,每個被包含的區(qū)與最高級的一個實(shí)體之外的實(shí)體相應(yīng),每個被包含的區(qū)的面積代表相應(yīng)實(shí)體的統(tǒng)計量,每個被包含的區(qū)被包含在與分級結(jié)構(gòu)中下一最高級中的一個實(shí)體相應(yīng)的區(qū)中,且直接包含在包含區(qū)中的被包含的區(qū)具有形狀,以便直接被包含的區(qū)的相對尺寸易于從顯示中看出。
2.根據(jù)權(quán)利要求1的裝置,其中該裝置顯示適用于實(shí)體的另一統(tǒng)計量;以及與分級結(jié)構(gòu)的給定級中的實(shí)體相應(yīng)的被包含的每個區(qū),根據(jù)該區(qū)相應(yīng)的實(shí)體的另一統(tǒng)計量的值,被直觀地分成子區(qū)。
3.根據(jù)權(quán)利要求2的裝置,其中所有的區(qū)屬于同類別的多邊形。
4.根據(jù)權(quán)利要求3的裝置,其中多邊形的類別是矩形。
5.根據(jù)權(quán)利要求4的裝置,其中每個被包含的區(qū)分別具有一個標(biāo)識;以及每個標(biāo)識至少部分上位于與其實(shí)體相應(yīng)的區(qū)內(nèi)。
6.根據(jù)權(quán)利要求1的裝置,還包括顯示中的第二區(qū),含有一個交互控制區(qū),用于調(diào)節(jié)所述第一區(qū)被分成的行數(shù)。
7.根據(jù)權(quán)利要求1的裝置,還包括用于調(diào)節(jié)每行高度的裝置,以便每行高度基本相同,且每行以整數(shù)個幾何形狀充滿。
8.在計算機(jī)系統(tǒng)的顯示中顯示與適用統(tǒng)計信息的實(shí)體的分級結(jié)構(gòu)有關(guān)的至少一個統(tǒng)計量的方法,包括步驟在顯示中分配一個第一區(qū),它與分級結(jié)構(gòu)中最高級的一個實(shí)體相應(yīng);以及將第一區(qū)分成多個含在第一區(qū)中的被包含的區(qū),它們排列成至少一行,每行高度基本上相同,每個被包含的區(qū)與最高級的一個實(shí)體之外的實(shí)體相應(yīng),每個被包含的區(qū)的面積代表相應(yīng)實(shí)體的統(tǒng)計量,每個被包含的區(qū)被包含在與分級結(jié)構(gòu)中下一最高級中的一個實(shí)體相應(yīng)的區(qū)中,且直接包含在包含區(qū)中的被包含的區(qū)具有形狀,以便直接被包含的區(qū)的相對尺寸易于從顯示中看出。
9.根據(jù)權(quán)利要求8的方法,還包括步驟分別確定每個被包含的實(shí)體的一個標(biāo)識;以及顯示每個標(biāo)識,使每個標(biāo)識的中心分別位于與其被包含的實(shí)體相應(yīng)的區(qū)內(nèi)。
10.顯示具有多個子系統(tǒng)的軟件系統(tǒng)的信息的方法,包括步驟確定軟件系統(tǒng)的源代碼總量;確定多個子系統(tǒng)中每個子系統(tǒng)各自的源代碼量;將一個顯示分成多個矩形區(qū),每個矩形區(qū)代表多個子系統(tǒng)中各個子系統(tǒng);確定每個矩形區(qū)的尺寸,使得代表子系統(tǒng)的每個矩形區(qū)具有第一尺寸和一面積,該第一尺寸與代表子系統(tǒng)的所有其他矩形區(qū)的尺寸相同,該面積相對于顯示的比例與各子系統(tǒng)中源代碼量相對于軟件系統(tǒng)的源代碼總量的比例相同。
11.根據(jù)權(quán)利要求10的方法,還包括步驟分別為每個子系統(tǒng)確定一個名字;以及在代表每子系統(tǒng)的矩形區(qū)內(nèi)至少部分地顯示其名字。
12.根據(jù)權(quán)利要求11的方法,還包括步驟為每個子系統(tǒng)確定一個已修改的源代碼量對源代碼總量的比率,和一個未修改的源代碼量對源代碼總量的比率;以及在每個矩形區(qū)中顯示第一顏色的區(qū),與其相應(yīng)區(qū)的尺寸的比例與已修改的源代碼量對源代碼總量的比率相同,顯示第二顏色的區(qū),與其相應(yīng)區(qū)的尺寸的比例與未修改的源代碼量對源代碼總量的比率相同。
13.根據(jù)權(quán)利要求11的方法,還包括步驟為每個子系統(tǒng)確定一個已修改的源代碼量對源代碼總量的比率,和一個未修改的源代碼量對源代碼總量的比率;以及在每個矩形區(qū)中顯示第一陰影區(qū),與其相應(yīng)區(qū)的尺寸的比例與已修改的源代碼量對源代碼總量的比率相同,顯示第二陰影區(qū),與其相應(yīng)區(qū)的尺寸的比例與未修改的源代碼量對源代碼總量的比率相同。
14.顯示具有多個發(fā)行版本并具有多個子系統(tǒng)的軟件系統(tǒng)的信息的方法,包括步驟為多個子系統(tǒng)中的每個子系統(tǒng)確定所述多個發(fā)行版本中任何版本的各最大源代碼量;通過將所述子系統(tǒng)最大源代碼量相加,確定軟件系統(tǒng)的最大源代碼總量;將顯示分成多個矩形區(qū),每個矩形區(qū)代表各子系統(tǒng)最大源代碼量;確定每個矩形區(qū)的尺寸,使得代表子系統(tǒng)的每個矩形區(qū)具有第一尺寸和一面積,該第一尺寸與代表子系統(tǒng)的所有其他矩形區(qū)的尺寸相同,該面積相對于顯示的比例與各子系統(tǒng)中最大源代碼量相對于軟件系統(tǒng)的最大源代碼總量的比例相同。
15.根據(jù)權(quán)利要求14的方法,還包括步驟對于各子系統(tǒng),在每個矩形中為軟件系統(tǒng)的每個發(fā)行版本顯示一個陰影,它代表所顯示版本的源代碼量對最大源代碼量的比率;以及為軟件系統(tǒng)的每個發(fā)行版本,順序顯示所述矩形和所述陰影,所用比率使得陰影的相對尺寸的變化易于從顯示中看出。
16.根據(jù)權(quán)利要求14的方法,還包括步驟對于各子系統(tǒng),在每個矩形中為軟件系統(tǒng)的每個發(fā)行版本顯示一個有顏色的區(qū),它代表所顯示版本的源代碼量對最大源代碼量的比率;以及為軟件系統(tǒng)的每個發(fā)行版本,順序顯示所述矩形和所述有顏色的區(qū),所用比率使得陰影的相對尺寸的變化易于從顯示中看出。
17.根據(jù)權(quán)利要求16的方法,還包括步驟顯示每個有顏色的區(qū)的中間尺寸,它從一個發(fā)行版本到另一個發(fā)行版本改變尺寸,以動畫顯示有顏色的區(qū)的相對尺寸的變化,有助于感受軟件系統(tǒng)的演化。
18.根據(jù)權(quán)利要求17的方法,還包括步驟根據(jù)用戶選擇,調(diào)節(jié)動畫比率。
全文摘要
對大型軟件系統(tǒng)的結(jié)構(gòu)、統(tǒng)計量和特性進(jìn)行顯示的交互的方法和裝置。整個軟件系統(tǒng)被看成為一個實(shí)體。以相似的幾何形狀給出代碼的相似的子劃分,該形狀具有基本相等的參照框,如基本一致的行高度,所以子劃分的相對尺寸能被理解。除尺寸之外,可能使用不同的陰影和著色方式顯示改變、軟件錯誤和軟件修復(fù)。再者,如果軟件系統(tǒng)的各種發(fā)行版本的數(shù)據(jù)可用,則可動畫顯示系統(tǒng)各發(fā)行版本的演化,使大型軟件系統(tǒng)的歷史更易理解。
文檔編號G06F11/36GK1113582SQ94117568
公開日1995年12月20日 申請日期1994年10月20日 優(yōu)先權(quán)日1993年10月22日
發(fā)明者馬拉·J·貝克, 斯蒂芬·G·艾克 申請人:美國電報電話公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
城口县| 手游| 山阳县| 信丰县| 北流市| 隆回县| 五常市| 濮阳市| 海林市| 类乌齐县| 汨罗市| 万盛区| 兴山县| 孟村| 布拖县| 武平县| 沁水县| 会理县| 新绛县| 教育| 连城县| 兴安县| 南郑县| 盐池县| 阿克陶县| 涟水县| 开化县| 黄浦区| 仲巴县| 甘谷县| 咸丰县| 昌黎县| 大方县| 磐安县| 翁源县| 陆良县| 武隆县| 德兴市| 台湾省| 历史| 哈巴河县|