專利名稱:面向目標的光標工具的制作方法
技術領域:
本發明涉及計算機系統的改進,具體而言,涉及一種在面向目標的操作系統中使用工具目標和工具目標菜單的系統和方法。版權通告本專利申請的某些部分中含有受版權保護的內容。版權所有者對出現在專利商標局的專利文件或者記錄中的復制專利文檔或者專利公開文件不予反對,但在其它情況下保留所有的版權。
與本發明相關的背景技術光標工具通過改變用戶控制的“光標”的行為,來指定用戶與文檔或者方框(frame)的特定交互模式。例如,用戶可以選擇“矩形”光標工具,以指示操作環境,在點按鼠標按鈕并且拖拽鼠標時,在文檔的畫布上產生一個矩形。光標工具可以為數據選擇、數據操作與數據創建指定模式。在MacPaint_或MacDraw_等類似的應用程序中可以找到以前的光標工具的例子。但是,這些應用程序不能給用戶提供同時對多個光標的管理。更進一步說,這些應用程序沒有提供集成到操作系統中的光標工具,使得在一個應用程序中有效的工具在另一個應用程序中也能使用。在先有技術的例子中,光標工具與應用程序之間的協同能力是未知的。
本發明的目的本發明涉及一種具有創新性的系統和方法,通過使用面向目標的技術,把光標工具集成到面向目標的操作系統中。這種集成包括在多任務下同時管理多個光標工具。本發明的技術方案用于實現本發明的方法涉及在具有內存,圖形,視窗目標,以及顯示器的計算機上進行的操作,其步驟包括檢測選擇信號;檢測到了選擇信號后,根據光標的位置辨識出圖形目標;根據位置確定窗口;在圖形目標上根據位置判斷是哪一個目標;檢測到了選擇信號后,根據光標的位置執行與特定觀察目標相聯系的命令目標;把與命令目標相聯系的工具目標傳送到工具服務器目標;把工具服務器目標中的光標的當前工具設置成工具目標;以及經由工具服務器目標,把工具目標和應用程序連接起來。
根據本發明的光標工具處理裝置則包括一個處理器;與處理器相連并受處理器控制的存儲器;與處理器相連并受處理器控制的顯示器;檢測選擇信號的裝置;檢測到了選擇信號后,根據光標的位置辨識出圖形目標的裝置;根據位置判斷窗口的裝置;在圖形目標上根據位置判斷是哪一個觀察目標的裝置;檢測到了選擇信號后,根據光標的位置,執行與特定視窗目標相聯系的命令目標的裝置;把與命令目標相聯系的工具目標傳送到工具服務器目標的裝置;把工具服務器目標中的光標的當前工具設置成工具目標的裝置;以及經由工具服務器目標,把工具目標和應用程序連接起來的裝置。本發明的有益效果本發明提供了協同能力,從而允許任何光標工具和任何應用程序同時工作。這種獨特能力使用交叉分區式的內存管理,從而允許光標工具跨應用程序使用及跨區使用。面向目標的體制提供了光標工具與應用程序間交叉分配的結構,使得除非需要光標工具功能,否則應用程序不會覺察到光標工具的存在。按技術術語說,這意味著任何應用程序,只要可以確定光標工具能夠成功地修改其信息,就可以不必在光標工具共享庫中進行變換,就使用光標工具。
附圖的簡要說明
圖1是適用于最佳實施例的個人計算機的方塊圖;圖2是在MacDraw_中所使用的以前的光標工具的例子;圖3是根據最佳實施例的命令面板;圖4示出了根據最佳實施例的命令面板條的例子;圖5示出了根據最佳實施例的命令面板的例子;
圖6是根據最佳實施例的工具組的示意圖;圖7示出了根據最佳實施例的各種類型的方框的一些例子;圖8示出了根據最佳實施例的帶有各種方框的桌面;圖9表示用戶選擇了矩形光標工具,該工具是根據最佳實施例的一個創建器;以及圖10示出了選擇箭頭;圖11示出了光標矩形工具變成了有效工具;圖12示出了選擇箭頭穿過非活動文檔,因此選擇箭頭變成了有效工具;圖13示出了選擇指點工具的過程,它是一個選擇/影響器;圖14示出了只有當光標穿過特定的方框時,才能使用指點工具;圖15和16示出了工具光標穿過內容區的動態過程;圖17總結了根據最佳實施例的窗口和方框的處理過程;圖18示出了根據最佳實施例的工具處理邏輯的流程圖;圖19示出了根據最佳實施例的類層級的方塊圖;圖20是根據最佳實施例的TToolServer類圖;圖21示出了根據最佳實施例的命令類;圖22示出了根據最佳實施例的一些事先構筑好的幾何圖形;以及圖23示出了根據最佳實施例的實用程序類。
本發明的最佳實施例本發明最好用于位于個人電腦(例如IBM_PS/2_或者Apple_Macintosh_等)里的操作系統的正文中。圖1描繪了一種具有代表性的硬件環境,它示出了參照本發明的帶有一個中央處理單元10的典型硬件結構,例如一個帶內置不易失存儲器11的通用微處理器,以及經由系統總線12連接的許多其它單元。圖1中所顯示的工作站包括一個隨機訪問存儲器(RAM)14,只讀存儲器(ROM)16,用于把類似硬盤單元20、軟盤單元21等之類的外部設備連接到總線上的I/O適配器18,用于把鍵盤24、鼠標26、揚聲器28、話筒32以及其它用戶接口設備(例如觸摸屏等,沒有示出來)連接到總線上的用戶接口適配器22,用于連接工作站到數據處理網絡23的通訊適配器34,用于連接總線和顯示設備38的顯示適配器36。計算機上還必須有一個操作系統,例如Apple System/7_操作系統等。
在最佳實施例中,本發明用C++編程語言并通過面向目標的編程技術實現。就象精通本領域的人所能夠理解到的那樣,面向目標的編程(OOP)對象是包含數據結構和數據操作的軟件實體。這些元素放在一起,可以使現實世界中的任何實體都虛擬地模型化,其方法是借助于它們的特征(由數據元素代表),以及它們的行為(由數據操作功能代表)。通過這種方式,目標能使得象人和計算機等具體事物模型化,并且它們還能使抽象的概念,如數字或幾何概念等模型化。目標技術的好處來自三個基本原理封裝,多形,和繼承。
目標隱藏或封裝數據和使得功能能夠運行的算法的內部結構。目標存在界面,這些界面沒有外部信息,是純粹的抽象,而不是把所有的實現細節都暴露出來。多形進一步地進行封裝,其想法是許多形狀,一個界面。軟件的一個組成部分可能需要請求另一個組成部分,但不必知道它到底是什么。接受了請求的軟件組成部分根據它的變量和數據,解釋并且判斷如何執行請求。第三個原理是繼承,它允許開發人員再利用先前存在的設計和代碼,這個能力允許開發人員避免從起始創建軟件。而且,通過繼承,開發人員可以得到繼承了行為的子類,這樣開發人員就可以進行再定制以適應他們特殊的需要。
以前的工作方法是把目標和類庫放在過程環境中。市場上的許多應用程序系統采用這種設計方法。在這種設計中,在一個獨立的操作系統之上,有一個或多個目標層。盡管這種方法在目標層中利用了所有原理封裝,多形和繼承,而且對過程編程是一個潛在的改進,但它仍有許多限制。由于對開發人員來說,再利用他們自己的目標很容易,而從其它系統中再使用目標則很困難,而且開發人員仍然需要通過過程操作系統的調用來進入內部的非目標層,因此產生了許多困難。
面向目標的編程的另一種方面是應用程序開發的體系解決方案。體系(framework)的一個最合理的定義來自于Illinois大學的Ralph E.Johnson和Purdue大學的Vincent F.Russo。他們于1991年發表了一篇論文,該論文的名稱是“Reusing Object-Oriented Designs”,即再利用面向目標的設計,該論文發表于Illinois技術報告UIUCDCS91-1696,在這篇論文中,他們提出了下面的定義“一個抽象類是一系列目標設計,它們協作實現一系列的響應。因此,一個體系就是一系列的目標類,它們協作實現已定義的一系列的計算響應”。從編程角度來說,體系本質上是互相連接的目標類組,目標類提供預先構造好的工作應用程序的結構。例如,一個用戶界面體系可能提供對繪畫窗口、滾動條、菜單等的支持和其缺省行為。由于體系以目標技術為基礎,因此這種行為可以得到繼承和置換,從而允許開發人員在特殊的專業知識領域中擴展體系和創建定制的解決方案。由于編程人員不是在改變最初的代碼,而是在擴展軟件,因此這是它超過傳統編程方法的一個主要優勢。另外,開發人員可以清楚地操作代碼層,因為體系提供了結構指導和模型,但同時他們能夠自由地根據特定的問題區域來支持特定的操作。
從商業角度來說,體系可以被看作是一種封裝或實現特殊領域的專業知識的方法。合作開發組織、獨立軟件銷售商和系統集成人員已經獲得了特殊領域的專業知識,例如生產、結帳或者貨幣交易。這些專業知識通過它們的代碼得以實現。體系使得各個組織能夠收集和封裝專業知識的常規屬性,方法是通過在該組織的代碼中實現它們。首先,這允許開發人員利用專業知識創建或擴展一個應用程序,這樣問題就得到了一次性的解決,而且前后一致地實施了商業原則和設計。體系和其所實現的專業知識對于那些已經獲得了生產、結帳或者生物技術等市場的專業知識的組織來說,同樣具有至關重要的意義,在這些市場中,存在有包裝、銷售和使用專業知識乃至進一步的技術開發和推廣等的分配機制。
歷史上,體系只是在最近才在計算平臺上作為主流的概念出現。面向目標的語言,如C++的易用性幫助了這種觀念的轉變。以前C++主要是在UNIX系統和研究人員的工作站上使用,而不是在商用的計算機上使用。編程語言,例如C++和其它面向目標的語言(如SmallTalk和其它語言)使許多大學和研究工程能夠為今天的商用體系及其類庫提供先驅產品。這樣的例子有Standford大學的InterViews,Carnegie-Mellon大學的Andrew工具,以及Zurich大學的ET++體系等。
根據系統級別和問題特點,有許多種體系。體系的類型范圍從用來幫助開發用戶界面的應用程序體系,到更低級的提供基本系統軟件服務的體系,例如通訊、打印、文件系統支持、圖形等。應用程序體系的產品實例有MacApp(Apple),Bedrock(Symantec),OWL(Borland),NeXTStepApp Kit(NeXT)以及Smalltalk-80(ParcPlace)。
使用體系編程需要為那些習慣于在其它種類系統下編程的開發人員提供一種新的方法。事實上,從傳統意義上來說,它根本不象是在編程。在老式的操作系統中,如DOS和UNIX,開發人員為自己的程序提供了所有的結構,操作系統通過系統調用提供服務----開發人員的程序在需要服務時產生調用,在服務完成時控制返回。程序結構基于控制流,通過用戶編寫的代碼實現。
使用體系編程時,這個順序被顛倒過來。開發人員不再對控制流負責。他們必須向前認識趨勢,借助于執行流理解編程任務。而且,想法必須借助于目標的可用性,必須依據體系來決定什么時候應該執行任務。開發人員所編寫的例程,被不是開發人員所編寫的代碼激活,開發人員甚至永遠都不會看見這些代碼。控制流中的這種轉換對于那些僅僅對過程編程比較熟悉的開發人員來說,可能會有較大的心理障礙。然而,一旦理解了這些,體系編程所要做的工作要比其它種類編程所要做的工作少得多。
同樣,一個應用程序體系提供給開發人員預制的功能函數和系統體系,例如在最佳實施例中包括的那樣。同樣重要的是,通過提供系統級服務,開發人員例如系統編程員使用這些服務來置換子類,以創建定制的解決方案。例如,考慮一個多媒體體系,它能提供多種支持,如新的、多種多樣的設備,例如聲音、視頻、MIDI動畫等。需要支持新設備的開發人員將需要編寫設備驅動程序。為完成這個任務,使用體系編程時開發人員僅僅需要支持新設備特有的特征和行為即可。
在這種情況下,開發人員僅需要實現一定的成員功能。這些功能被多媒體體系調用。對開發人員來說,一個馬上可以得到的好處是多媒體體系已經提供了每一種裝置都需要的從屬性代碼。這意味著設備驅動程序開發人員編寫、測試、排錯的代碼量減少。利用系統體系的另一個例子是為SCSI設備、NuBus卡和圖形設備等實現I/O體系。由于有繼承功能,因此每個體系為它所能支持的設備提供常規支持。其它開發人員依靠這些一致的界面可以構造出許多其它的設備。
最佳實施例中采用體系的概念并把它應用到整個系統中。對于商業或者合作開發人員、系統集成人員,或者OEM等來說,這意味著前面所示的體系的所有優點,例如MacApp等,都可以不僅應用于應用程序級,例如文本或者用戶界面,而且可以應用于系統級,例如圖形服務、多媒體服務、文件系統、I/O、測試等等。
在最佳實施例的結構中創建應用程序基本上可以看做編寫附加到體系協議上的與區域相關的特定程序。在這種情況下,整個編程的概念都改變了。與叫做多API層級的一行接著一行地編寫代碼相反的是,軟件開發將從現有的體系環境中獲取類,并且加入新的行為,以及(或者)根據需要置換繼承的行為。
這樣,開發人員的應用程序變成由其自己編寫的代碼加上與其它應用程序共享的代碼的集合。這是一個強有力的概念,因為開發人員將能夠在其它人的工作基礎上工作。它還同樣提供給開發人員選擇余地,即根據需要或多或少地定制自己的程序。一些體系將以它們自己的方式使用。在有些情況中,很少需要定制自己的程序,因此開發者插入的特定程序段很小。在其它一些情況下,開發者可能需要做很多的修改,乃至創建全新的類或目標。在最佳實施例中,如圖1所示,程序位于RAM14中,受CPU10的控制,用面向目標的圖形體系管理多任務。程序使用新的結構以實現光標工具。“工具”與圖符相聯系,可以單擊這些圖符以選擇它們。一旦選擇了某工具,它就改變光標形狀,并且讓用戶在文檔的內容區中畫圖。MacPaint的畫筆工具是光標工具的典型例子。這些工具被稱做光標工具,是因為它們改變了光標,并且直接在光標下影響數據。與光標工具有關的特征包括通過單擊工具圖符來選擇它;改變當前光標形狀以指示用戶正在“使用”所選定的工具。光標工具有多種類型,包括創建器,選擇器,以及選擇/影響器。創建器可以在有效文檔的內容區域中使用。選擇器和選擇/影響器只有在有效文檔里的已知類型的方框中才能使用。
共存性在Apple_Macintosh_計算機中,選定的光標工具與應用程序同時存在。例如,如果你在MacPaint中選擇畫筆工具,然后切換到MacDraw_并選擇矩形工具,然后再切換回MacPaint_,選定工具將是畫筆----你在MacPaint_中最近選擇的工具。在最佳實施例中工具將與位置共存,而不會交叉共存。例如,如果在一個應用程序中選擇了矩形光標工具,則不論哪一個方框或者文檔激活,它都將是所選的光標工具。
光標工具示例多邊形光標工具 箭頭選擇光標工具 著色器光標工具 光標工具組工具組是一種邏輯地,并可視地把有聯系的光標工具分組的方法。可以把它們看做是放有多種光標工具的視窗。工具組本身不是面板----開發人員可在面板中使用它們。圖2是MacDraw_中所用的以前的光標工具組的例子。
命令面板命令面板分組并組織所有的不直接出現在方框內容或者方框菜單中的方框命令。命令面板為這些命令提供界面,以代表光標工具(分組的或者沒有分組的)、按鈕、幻燈片、下拉菜單、滾動列表、文本域、附加面板或者任何開發人員可能創建的定制控制。所有的命令面板都必須具有方框創建工具----一種可用于畫出由面板代表的類型的方框的工具。
命令面板和方框的關系類似于應用程序和文檔的關系。命令面板可以用做創建方框,它為操作方框和其中的內容提供了大量的界面。但是有一個明顯的不同。在以前的光標工具系統中,應用程序有它自己的文檔,差不多圍繞著它們。而在最佳實施例中,文檔是最主要的。文檔擁有并且圍繞著方框,命令面板僅僅是一個用戶可以使用的工具,用它在文檔中創建或者操作方框。
在這種模型中,應用程序僅僅是一個命令面板和一個文具盒,用來給特定類型的方框所使用的命令提供界面,并且為該類方框提供方框創建光標。命令面板把工作在單方框類型中的各種控制組織到一起,銷售商一般為它們的每一種方框類型都創建一個命令面板,因此銷售商可能會讓命令面板組織控制。例如,WordPerfect_將為WordPerfect_方框類型開發一個WordPerfect_命令面板。對于通用的方框類型來說,例如圖形編輯應用程序,可能有幾種不同的命令面板。命令面板可以最終由用戶來構造,使得用戶可以不管選擇了什么銷售商,都能在單個的命令面板中組織所有的圖象操作控制。
通過整體命令面板盒或者命令面板條可以訪問命令。通過多個鍵順序組合,可把有效方框的命令面板帶到前臺,例如Ctrl+某鍵。圖3是最佳實施例中的一個命令面板。
命令面板條中有許多圖符,這些圖符用來表示用戶可安裝的多種命令面板。另外,面板條的最上面兩個圖符是特殊的最上面的圖符代表有效方框的命令面板,上面第二個圖符則包含可用于任何方框類型中的具有工具組的命令面板。圖符中含有一個選擇箭頭,一個可選的放大鏡和著色器。早期設計要求命令面板條填滿文檔或者桌面中的所有命令面板,而本設計與早期設計不同,由用戶來決定可以使用哪一個面板。
用戶在命令面板間可以采取的操作中包括單擊--拖拽圖符把它從相應的命令面板中拖出來。也可以從命令面板條中把命令面板刪除并把它放到桌面上。單擊命令面板圖符通常會選擇方框創建工具,該工具是缺省工具。在選擇工具命令面板的情況下,缺省工具是箭頭選擇工具。圖4示出了最佳實施例中的命令面板條的例子。
命令面板盒當用戶安裝命令面板時,它們被集中到工作區的整體命令面板盒中。用戶可以在這個盒中訪問面板,或者把它們放入不同的命令面板條中。圖5示出了最佳實施例中的一個命令面板的例子。
當前工具與有效工具用戶通過從工具組中選擇工具來設置當前工具。圖6是最佳實施例中的工具組的示意圖。只有當用戶把光標移動到工具可以起作用的區域時,當前工具才變成有效工具。不論任何時候光標位于當前工具不起作用的區域時,有效工具都將轉變成選擇工具,而光標形狀為箭頭。
有效區域只有在有效文檔中才有有效區域。在有效文檔之外的任何位置,包括有效文檔的外部裝飾等,有效工具都將變成選擇箭頭。在有效文檔里面時,有效區域取決于當前工具以及光標所處方框的類型。由于擊穿效應,方框是否有效并不重要。象上面所提到的那樣,光標工具有三種,創建器,選擇器,以及選擇/影響器。
創建器創建新的數據,例如圓形畫圖工具。
選擇器選擇已經存在的數據,例如PhotoShop_的魔棍(MagicWand)。
選擇/影響器選擇并且改變數據,例如MacPaint_的擦除器工具。
創建器光標工具在所有可嵌入的方框中都能工作。如果用戶在沒有圓形數據類型的方框中畫圓,則工具體系(Tool Framework)將創建新的確實明白圓形的方框,把圓放在新方框中,并把新方框嵌入現有方框中。這種明確的創建方框的操作允許用戶在它們需要的位置以及需要的時候創建數據,而不用事先創建一個適當方框。選擇器以及選擇/影響器光標工具只有在它們所理解的方框類型中才能工作。例如,MacPaint_的擦除器工具只有在MacPaint_方框中才能工作。在其它類型方框中時,活動工具變成選擇箭頭。
圖7示出了最佳實施例中的不同類型的方框的一些例子。有效方框700,無效方框720,圖形方框(PinkDraw)710以及文本方框740,每一個都有不同的特點。圖8示出了最佳實施例中帶有多種類型方框的桌面。圖中用戶打開了兩個文檔,其中一個是有效的(800),另一個是無效的(810)。兩個文檔都有兩個方框,一個圖形方框(PinkDraw)以及一個文本方框。用戶正從畫圖命令面板830中選擇工具。圖9示出用戶選擇了矩形光標工具,它是最佳實施例中的創建器。在有效文檔的內容區的外面(根方框),有效工具是選擇箭頭。圖10示出了最佳實施例中的選擇箭頭。圖11示出了最佳實施例中光標矩形工具變成了有效工具。圖12示出了最佳實施例中,選擇箭頭穿過無效文檔,因此選擇箭頭變成有效工具。
圖13示出了根據最佳實施例,指點工具(一種選擇/影響器)的選擇過程。圖14示出了在最佳實施例中,只有當光標穿過特定的方框時,指點工具才可以使用。圖15和16示出了最佳實施例中光標工具穿過內容區時的動態過程。光標穿過有效文檔的內容區和其它非圖形方框時,有效工具變成選擇工具。
訪問/檢索命令面板訪問命令面板有好幾種方法。用戶可以在整體命令面板盒或者其它任何工作區盒中雙擊命令面板的圖符來打開命令面板。對于任何放入面板條中的命令面板,用戶可以簡單地選擇命令面板的圖符并且進行檢索。當用戶選擇了一個方框后,可發出“顯示命令面板”命令,之后工作區將打開一個缺省的當前方框類型的命令面板。這樣,如果選擇了PinkDraw的方框,并使用“顯示命令面板”命令,工作區將打開PinkDraw命令面板。
每種方框類型的多個命令面板一些類型的文擋可以被多種應用程序打開。例如Painter、MacPaint、PhotoShop_、MacDraw_以及TeachText都可以打開PICT文件。根據最佳實施例,一定的方框類型,例如圖象和文本,將具有許多不同的命令面板。當操作這些特定的方框時,為了在所有可能的命令面板中進行選擇,一種方框特性表允許用戶選擇命令面板,甚至可以為特定的方框類型設置缺省的命令面板。“顯示命令面板”命令打開缺省的命令面板。
方框與窗口激活理解窗口是如何被激活的非常重要,因為與選擇箭頭不同,工具只有在有效窗口里才是可用的。討論激活時,需要考慮兩個方面。首先,什么時候窗口或者方框激活?其次,單擊無效方框或者窗口將如何影響數據?
方框方框只有在鼠標按下的時候才被激活,因為它們的激活反饋對于用戶正在開始進行的操作來說可能是重要的。例如,如果用戶在一個帶有矩形光標工具的方框中按下鼠標,則該方框應該被激活,從而顯示出它的邊界,使用戶知道將要在什么地方剪接矩形。在無效方框中第一次單擊鼠標不僅激活該方框,并且由于擊穿效應,方框里的內容看起來象是早已被激活的樣子。因此,如果選擇了擦除光標工具,并且拖拽它穿過無效方框,所檢測到的第一次單擊將擦除某些數據。
窗口在窗口的邊界內釋放鼠標按鍵時,將激活該窗口。釋放鼠標按鍵事件可以是在窗口邊界內單擊后產生,也可以是用戶拖拽一個目標進入窗口后釋放按鍵時產生。由于窗口在釋放鼠標按鍵前不會被激活,因此拖拽過程中有效工具始終是選擇箭頭。如果當前工具不是選擇箭頭,那么該工具只有在完成拖拽并且激活目標窗口后才能變為有效的。在無效窗口中第一次單擊不影響窗口的內容,而是選擇或者拖拽它們。第一次單擊并不破壞任何事情,這一點是很重要的,因為它可以使用戶不會因為穿過屏幕游移選擇/影響器而偶然破壞數據。但是,通過讓第一次單擊選擇和拖拽數據,可以加速進行拖—放操作。由于窗口在鼠標釋放前不會被激活,因此可以從無效窗口中選擇目標然后拖拽進入一個有效窗口中,這一操作不會使無效窗口變成有效窗口。圖17總結了最佳實施例的窗口和方框的處理過程。
工具構造概述工具系統提供了開發可在方框和文檔中交叉使用的光標工具的結構,并且提供了從工具選擇控制(例如工具面板)中向影響用戶數據的方框中傳送工具的必要的系統服務。TTool類提供了從工具選擇控制中傳送工具的系統服務。它是一個簡單類,含有TToolInteractor、光標圖形、面板圖形、文本名、類型協同信息。TToolInteractor是一個TInteractor的直接子類。它僅僅為傳遞視窗和展示到交互器中增加了協議。一旦用戶在適當的帶有工具的方框中按下鼠標,TToolInteractor就修改在方框中可以見到的數據。通過控制使用面板圖形和文本來設置當前工具,顯示和辯識圖形或文本串。光標圖形是光標穿過可以使用的方框中時將采取的形狀。類型協同信息是工具可用于其中的方框的選擇類型的列表。這個列表用來確定工具是否可以在給定的方框中工作。
設置與分配當前工具三種目標協同工作,用以設置并分配當前工具。它們是SetCurrentToolCmd(設置當前工具命令),ToolServer(工具服務器),ToolNegotiator(工具協同器)。SetCurrentToolCmd激活后,SetCurrentToolCmd采用給定的TTool,并且把它傳送到ToolServer。SetCurrentToolCmd被設計用于放在控制例如按鈕以及工具面板等中。開發人員將經常用一系列按鈕來構造工具面板,每一個都帶有一個SetCurrentToolCmd,每一個命令保持一個不同的TTool。Tool ServerToolServer的任務是聯系光標和工具。當SetCurrentToolCmd向ToolServer傳遞了一個光標和工具時,ToolServer目標把傳來的工具設置成為給定光標的當前工具。然后,當一個視窗詢問給定光標的當前工具時,ToolServer查找光標并且通過ToolNegotiator把工具傳回到發出請求的視窗中。ToolNegotiatorToolNegotiator的角色是試圖與視窗協同,如果協同成功,就把當前工具傳送到該視窗中。光標進入時,產生以下序列的命令。首先,光標傳給有效方框。然后,方框的內容視窗接收“光標輸入了”的通知并且從ToolServer中請求協同器。然后,ToolServer為當前工具構造一個協同器,并把它傳送回發出請求的視窗中,視窗然后向工具協同器(ToolNegotiator)給出選擇,并且執行命令以改變光標形狀。最后,工具協同器把它自己的選擇類型列表和視窗提供的選擇類型進行比較。如果該選擇是工具能夠理解的類型,協同器就把光標形狀改變成當前工具的光標圖形。
按下鼠標后的調用順序在多光標環境中,視窗無法確定按下鼠標時哪一個光標是它最近協同的光標,因此它必須再次從ToolServer中請求協同器。服務器返回一個協同器,視窗把選擇傳遞到協同器中。如果協同成功,協同器請求當前的ToolInteractor。也就是,如果工具理解所做的選擇,協同器就向視窗返回一個ToolInteractor。視窗在ToolInteractor中設置適當的值并啟動交互作用。在這點上,交互器接管并且繼續運行用戶交互作用。
流程18示出了根據最佳實施例的工具處理邏輯的流程圖。處理過程從1800開始,在那里,工具面板1840檢測到了對特定工具進行的選擇,當前工具被激活,與其相聯的信息被傳遞到工具服務器1810。工具服務器1810受工具協同器1830調用,經由對工具服務器1810的調用1820來激活工具的相應特征。工具服務器1810然后經由工具協同消息1820把返回的狀態信息傳送給應用程序,并更新顯示。TAbstractTool圖19是根據最佳實施例的類體系的原理圖。其中一些有特殊意義的是,TGlobalID GetID()const;它獲取工具的I.D.;以及virtual void SetID(TGlobalID),它設置工具的I.D.。光標工具體系使用工具的整體I.D.,以在工具服務器上唯一地標識這些工具,并且給工具設置命令提供適當的工具變化通知。TtoolTTool是定義工具的抽象的超類。它同樣具有幾個與工具服務器聯絡的靜態方法。TTool子類實際上很少執行任務。它們為菜單和工具面板提供圖形和文本名,當工具有效時為工具提供能夠代表它的光標圖形,提供工具在其中可以使用的選擇類型列表,以及創建當用戶在合法方框中用所選擇的工具按下鼠標時被激活的交互器子類。真正在方框中進行創建或者修改數據工作的目標是交互器(interactor)。
純虛擬方法virtual MGraphic* CreatePaletteGraphic()const=0;該子類必須返回新的MGraphic,以用于工具面板或者菜單中。
virtual void GetPaletteText(TText&)const=0;該子類必須設置TText的文本為適合做菜單條目的文本串,該菜單條目代表工具。
virtual MGraphic*CreateCursorGraphic()const=0;該子類必須返回新的MGraphic,以在工具有效時用作光標。
virtual TToolInteractor*CreateInteractor(TToken)const=0;該子類必須返回新的TToolsInteractor,當用戶在正確的方框中點按鼠標時啟動該子類。通過的標記是代表點按框的選擇類型,該TTool可根據該標記在接收框的類型生成不同的交互器。
virtual void CreateTypeInfoList(Tsequence&)const=0;該子類必須為在工具可以工作的所有模型中所選擇的每個類型,用記號填充序列(當TType可用時,每一個適當選擇的記號都將被替換成TType)。例如,如果工具使用GrafEdit模型以及TTextContainer模型,子類將在序列中放置TGrafEditSelection∷kType和TTexSelection∷kType。
另外,工具有兩種通過布爾方法設置的行為Boolean IsOneShot()const;其缺省值是FALSE。為單用途選取“單射(One-Shot)”工具。一旦使用了這個工具,工具服務器自動地把當前工具切換到缺省工具上(選擇箭頭)。缺省情況下,這種方法返回FALSE,以保持當前所用工具,直到用戶從面板或者菜單上選擇了一個新的工具為止。
void SetIsOneShot(Boolean isOne=TRUE);使用本方法可動態地設置工具為單射工具或者不是單射工具。例如,面板開發者可以把工具設置成當用戶單擊面板時,總是單射工具,而當雙擊鼠標時,是其它工具。
virtual Boolean IsCreationTool()const;其缺省值是FALSE。在任何嵌入的方框中,可以創建數據的工具都是可用的。如果工具對所用的方框沒有明確的認識,體系將創建并且嵌入一個新的工具所知道的方框。目前體系并不提供嵌入支持,因此只有在你的工具能夠明確地創建和嵌入方框時,才能置換本方法。
訪問工具服務器的靜態方法static void SetCurrentTool(const TTool& theTool);把“theTool”設置成為當前的工具。
static TTool* CopyCurrentTool();返回當前工具的拷貝。
static TToolNegotiator* CopyCurrentToolNegotiator();為當前工具返回新的TToolNegotiator。
static TTool* CopyDefaultTool();返回系統缺省工具的拷貝。現在缺省工具是TSelectionArrow。
static void SetToDefaultTool();把當前工具設置為缺省工具。
創建通知注意的靜態方法static TInterest* CreateCurrentToolChangedInterest();每次當前工具發生改變時返回用于接收通知的注意事項。
static TInterest*CreateCurrentToolTypeChangedInterest();每次當前工具改變成為不同類的工具時返回用于接收通知的注意事項。TToolSurrogate非常簡單的TAbstractTool的子類。它不增加數據成員。它唯一的方法是一個已經定義的操作器,使得TToolSurrogates可以被設置成任何TAbstractTool。TSelectionArrow非常簡單的TTools子類,具有以下屬性Palette Graphic(面板圖形)標準左傾箭頭。
Cursor Graphic(光標圖形)標準左傾箭頭。
PaletteText(面板文本)“Arrow(箭頭)”。
TypeInfo(類型信息)TModelSelection∷kType。箭頭在任何方框內都是合法的。
Tool Interactor(工具交互器)沒有。選擇箭頭為其交互器返回NIL。單擊的方框必須提供它自己的選擇交互器。TToolNegotiatorTToolNegotiator是在接收隊伍中代表當前工具的輕量級的單種目標。例如,當光標穿過活動文檔的方框時,方框被傳遞一個TToolNegotiator。方框與TToolNegotiator協同,并且告訴協同器是否改變光標形狀。鼠標按下時,方框同樣也得到一個TToolNegotiator,看當前光標工具在方框中是否正確。如果正確,方框從TToolNegotiator中得到TToolInteractor,并且啟動交互作用。
TToken Accepts(const TModelSelection&)const;如果當前工具對于給定選擇來說正確,并且具有明確的知識,則返回選擇類型。如果當前工具是創建工具并且對給定選擇來說正確的,則返回TTool∷kEmbeddingSelections,因為當前選擇是嵌入選擇。如果當前工具對給定選擇來說不正確,則返回TTool∷kSelectionRejected。
void AdjustCursorShapeFor(const TModelSelection&)const;如果工具可以應用到給定選擇中,則把光標形狀設置成當前工具的形狀。
TToolInteractor*CreateInteractor(const TModelSelection &)const;首先為選擇調用Accepts(接受)。如果當前工具接受了給定選擇,則返回工具的交互器。否則返回NIL。通常的用法是<pre listing-type="program-listing"><![CDATA[TToolInteractor* anInteractor=NIL;TToolNegotiator* negotiator=TTool∷CopyCurrentToolNegotiator();if(anInteractor=negotiator->CreateInteractor(aSelection))anInteractor->StartTracking();else{//start a selection interactor}TToken GetToolType()const;]]></pre>返回當前工具的類型。TToolInteractorTToolInteractor中含有設置和得到視窗和選擇的方法,在這些選擇中子類經常被傳遞到它們的交互狀態。TToolInteractor知道它們是否是用單射工具創建的。如果是,它們在TToolInteractor∷StopTracking中調用TTool∷SetToDefaultTool。
<pre listing-type="program-listing"><![CDATA[void SetView(TView*);void SetSelection(TModelSelection&);TView*GetView()const;TModelSelection*GetSelection()const;]]></pre>調用器/分配器類TToolServerTToolServer是一個分配器類,它實現工具服務器功能。圖20是根據最佳實施例的TToolServer類的原理圖。TToolServerCallerTToolServerCaller是一個由TTool使用,用于與工具服務器通訊的分配器類。應該不會示例這些類或與其直接談話。
命令類TSetCurrenToolCmd在工具服務器中把當前工具設置為它的邊界工具。圖21示出了根據最佳實施例的命令類。
TSetCurrentToolCmd(const TTool&the Tools);用theTool把命令構造成它的邊界工具。
void SetTool(const TTool& theTool);設置theTool為命令邊界工具。該命令如果已經有的話,就放棄舊的工具。
Boolean GetSelected();返回命令邊界工具是否是當前工具(例如,控制保持命令是否應該把它自己顯示成“selected”)。
void SetSelected(Boolean);可被用作CommandBooleanSetter控制,但是它不做任何事情。該命令基于從工具服務器得來的通知,設置它自己的選擇狀態。
TInterest* CreateSelectionStateChangedInterest()const;當特定命令的選定狀態改變時,使用這個注意事項接收通知。當一個控制調用TSetCurrentToolCmd∷connectData()時,該命令使用這個注意事項。
TSetToDefaultToolCmd設置當前工具為缺省工具。
光標圖形MGraphic子類帶預制好的幾何圖形。圖22示出了一些已經制作好的圖形。
TCrossHairGraphic繪畫程序風格的十字交叉線+。
TExGraphic大的×,用做排錯(debugging)×。
TArrowGraphic是一個箭頭
工具類TToolInstanceInterest本注意事項用TAbstractTool構造成。它用TAbstractTool變成當前工具的特定例子解釋注意事項。圖23示出了根據最佳實施例的工具類。
<pre listing-type="program-listing"><![CDATA[TToolInstanceInterest(const TAbstractTool&,MNotifier*,const TToken&);TToolChangedNotification]]></pre>每次當前工具變化時工具服務器都導出TToolChangedNotification。該通知為新的當前工具保持了TToolSurrogate。
從通知中釋放數據的方法<pre listing-type="program-listing"><![CDATA[TToolSurrogate GetToolSurrogate()const;TToken GetToolType()const;TCursorToolException]]></pre>由光標工具體系導出的exception子類。
TCursorToolException定義的錯誤kNoBoundCursor=0×lD02TSetCurrentToolCmd∷Do()與無邊界光標一起調用。目前不使用本錯誤。當光標服務器支持多光標時才可能導出本錯誤。那時,編程人員將需要在使用前把工具和光標連接到一起。
kNoBoundToolInCommand=0×1D02命令沒有邊界工具時,在TSetCurrentToolCmd中調用需要邊界工具的方法會導出該錯誤。
kNoBoundToolServer=0×1D03在設置好當前工具之前就在TToolServer中調用需要當前工具的方法時導出本錯誤。
盡管在特定的系統環境中,通過最佳實施例描述了本發明,但本專業一般技術人員應該認識到,根據本發明的精神和所附加的權利要求,對本發明加以修改后,也可將之用于不同的硬件和軟件環境中。
權利要求
1.一種在具有內存,圖形,視窗目標,以及顯示器的計算機上進行操作的方法,其特征在于包括以下步驟(a)檢測選擇信號;(b)檢測到了選擇信號后,根據光標的位置辨識出圖形目標;(c)根據位置確定窗口;(d)在圖形目標上根據位置判斷是哪一個目標;(e)檢測到了選擇信號后,根據光標的位置執行與特定觀察目標相聯系的命令目標;(f)把與命令目標相聯系的工具目標傳送到工具服務器目標;(g)把工具服務器目標中的光標的當前工具設置成工具目標;以及(h)經由工具服務器目標,把工具目標和應用程序連接起來。
2.根據權利要求1所述的方法,包括在交叉的地址空間中進行工具目標與應用程序之間進行連接的步驟。
3.根據權利要求1所述的方法,包括在工具目標菜單上可視地修改工具目標以指示有效光標工具的步驟。
4.根據權利要求1所述的方法,包括從工具目標菜單中選擇工具目標的步驟。
5.根據權利要求1所述的方法,包括在光標工具菜單上顯示工具目標的步驟。
6.根據權利要求1所述的方法,包括顯示一個方框以指示工具目標狀態的步驟。
7.根據權利要求1所述的方法,包括根據工具目標改變光標的步驟。
8.根據權利要求1所述的方法,包括根據工具目標狀態改變光標的步驟。
9.一種光標工具處理裝置,其特征在于包括(a)一個處理器;(b)與處理器相連并受處理器控制的存儲器;(c)與處理器相連并受處理器控制的顯示器;(d)檢測選擇信號的裝置;(e)檢測到了選擇信號后,根據光標的位置辨識出圖形目標的裝置;(f)根據位置判斷窗口的裝置;(g)在圖形目標上根據位置判斷是哪一個觀察目標的裝置;(h)檢測到了選擇信號后,根據光標的位置,執行與特定視窗目標相聯系的命令目標的裝置;(i)把與命令目標相聯系的工具目標傳送到工具服務器目標的裝置;(j)把工具服務器目標中的光標的當前工具設置成工具目標的裝置;以及(k)經由工具服務器目標,把工具目標和應用程序連接起來的裝置。
10.根據權利要求9所述的裝置,包括在交叉的地址空間中進行工具目標與應用程序之間的連接的方法。
11.根據權利要求9所述的裝置,包括在工具目標菜單上可視地修改工具目標以指示有效光標工具的裝置。
12.根據權利要求9所述的裝置,包括從工具目標菜單中選擇工具目標的裝置。
13.根據權利要求9所述的裝置,包括在光標工具菜單上顯示出工具目標的裝置。
14.根據權利要求9所述的裝置,包括顯示出一個方框以指示出工具目標狀態的裝置。
15.根據權利要求9所述的裝置,包括根據工具目標改變光標的裝置。
16.根據權利要求9所述的裝置,包括根據工具目標狀態改變光標的裝置。
17.一種在具有存儲器和目標以及至少一個光標和相連的顯示器的計算機上使用面向目標的操作系統中進行操作的方法,其特征在于包括以下步驟(a)檢測光標進人了某顯示區域;(b)根據檢測到的光標保持當前工具;(c)根據當前工具獲取工具協同器目標;(d)調用工具協同器目標以判斷當前工具是否在顯示區域中;(e)根據當前工具獲取圖形目標;以及(f)把光標改變成圖形目標。
18.根據權利要求17所述的方法,其中,工具協同器目標的協同操作包括以下步驟(a)獲取與工具相關的選擇類型的列表;以及(b)把選擇類型列表與相關顯示區域的數據所聯系的選擇類型列表相比較。
全文摘要
一種提供工具體系和工具服務器的系統和方法,用于在給定系統上支持多個光標并用一個光標支持光標工具的選擇,該體系和服務器簡化了光標工具與獨立空間處理中的光標的關聯,所以工具可用于交叉處理和交叉文檔。該體系還在光標工具及可用的畫布之中提供通訊和協同操作的缺省功能。協同操作允許任意光標工具和文檔一起工作,以致光標工具可以無需文檔開發者的知識而予完成。體系以一有效方式實現了交叉處理和文本的光標工具分配,從而文檔無需知道工具,直至工具與文檔已進行了協同操作以修改文檔數據。
文檔編號G06F3/0481GK1130431SQ94193272
公開日1996年9月4日 申請日期1994年1月3日 優先權日1993年11月9日
發明者杰佛瑞·韋氏尼 申請人:塔里根特公司