邋遢居

          我的Java天堂

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            61 Posts :: 2 Stories :: 90 Comments :: 0 Trackbacks

          #

          Jmerger 使用初步 ( )

          前面一篇提到了他基本的概念和能完成的功能。在這一篇里我們來看看他的使用條件和使用方法。

          使用條件:應為

          org.eclipse.jdt.core (提供基本的語法分析)

          org.eclipse.core.runtime (提供基本的 URI 等)

          org.eclipse.ui (提供進度條,我就看到了這個。其他可能還有)。

          看到他要使用這么多 Eclipse 的東西。我徹底的打消了在 Eclipse 外使用他的打算(如果誰有好的解決方案記得給我發一份。在下感激不盡)。


          我們下面就來看看如何定制他的合并規則是如何定義的吧。我先做法是找了一個例子。看看他是如何工作的。


          我的 Merge.xml 如下:

          清單 2

          <? xml version = "1.0" encoding = "UTF-8" ?>

          < merge:options xmlns:merge = "http://www.eclipse.org/org/eclipse/emf/codegen/jmerge/Options" >


          < merge:dictionaryPattern

          name = "generatedMember"

          select = "Member/getComment"

          match = "\s*@\s*(gen)erated\s*\n" />

          <!-- if target is generated, transfer -->

          <!-- change to sourceMarkup if the source is the standard -->

          < merge:pull

          targetMarkup = "^gen$"

          sourceGet = "Method/getBody"

          targetPut = "Method/setBody" />


          </ merge:options >


          運行前的 Source Java Source A 分源代碼為

          /**

          * Source javadoc 13

          * <!-- begin-user-doc -->

          * Source user javadoc 14

          * <!-- end-user-doc -->

          * Source javadoc 15

          * @return source

          * @generated

          */

          public boolean isID()

          {

          // begin-user-code

          System.out.println("Source user code 1");

          // end-user-code

          System.out.println("Source code 2");

          return id == "source";

          }








          運行前 Target(Java Source B) 部分的源代碼為:

          /**
          * Source javadoc 13
          * <!-- begin-user-doc -->
          * Target user javadoc 16
          * Target user javadoc 17
          * <!-- end-user-doc -->
          * Source javadoc 15
          * @return source
          * @generated
          */
          public boolean isID()
          {
          //This is my owner code
          System.out.print("Will be replace");
          // begin-user-code
          System.out.println("Target user code 2");
          // end-user-code
          System.out.println("Source code 2");
          return id == "source";
          }


          /**
          * Target javadoc 19
          * <!-- begin-user-doc -->
          * Target user javadoc 20
          * Target user javadoc 21
          * <!-- end-user-doc -->
          * Target javadoc 22
          * @param target
          * @generated NOT
          */
          public void setID(boolean value)
          {
          //This Jet Code
          System.out.println("Not be replaced!");
          id = value ? "target" : "source";
          System.out.println("Target code 4");
          }

          注意: isID 方法 注釋里有” @generated” 這一行。而 setID 方法的注釋中是 @generated NOT


          運行后的結果是( Result of merge )為

          /**
          * Source javadoc 13
          * <!-- begin-user-doc -->
          * Target user javadoc 16
          * Target user javadoc 17
          * <!-- end-user-doc -->
          * Source javadoc 15
          * @return source
          * @generated
          */
          public boolean isID()

          {

          // begin-user-code

          System.out.println("Source user code 1");

          // end-user-code

          System.out.println("Source code 2");

          return id == "source";

          }

          // 使用了 Source 部分的代碼。

          /**
          * Target javadoc 19
          * <!-- begin-user-doc -->
          * Target user javadoc 20
          * Target user javadoc 21
          * <!-- end-user-doc -->
          * Target javadoc 22
          * @param target
          * @generated NOT
          */
          public void setID(boolean value)
          {
          //This Jet Code
          System.out.println("Not be replaced!");
          id = value ? "target" : "source";
          System.out.println("Target code 4");
          }

          // 維持原來 Target 中的代碼沒有變化。

          這樣我們就不難看出

          < merge:dictionaryPattern ……/> 是定義了一個匹配模式。具體的這個匹配模式要做的動作就是在

          < merge:pull

          targetMarkup = "^gen$"

          sourceGet = "Method/getBody"

          targetPut = "Method/setBody" />

          段中定義了。猜想他只是把 Source 部分的內容直接輸出到 Target 那里去了。

          如果我們覺得需要做點什么過濾。比如說想保留 Target 中一個特定的內容。這一個我們可以通過 merge:pull sourceTransfer 屬性來設置。


          現在來看一個例子:

          merge:pull 節點修改成

          < merge:pull

          targetMarkup = "^gen$"

          sourceTransfer = "(\s*//\s*begin-user-code.*?//\s*end-user-code\s*)\n"

          sourceGet = "Method/getBody"

          targetPut = "Method/setBody" />

          注意:添加了一個 sourceTransfer, 他的值 值是一個正則表達式。匹配的是被

          // begin-user-code” 和“ // end-user-code” 包圍住的所有的字符。

          Target 的代碼為我們現在只是關注 isID 方法


          /**
          * Source javadoc 13
          * <!-- begin-user-doc -->
          * Target user javadoc 16
          * Target user javadoc 17
          * <!-- end-user-doc -->
          * Source javadoc 15
          * @return source
          * @generated
          */
          public boolean isID()

          {

          // begin-user-code

          System.out.println("Source user code 1");
          System.out.println("This will not be replaced!");

          // end-user-code
          System.out.print("this will be replaced!");

          System.out.println("Source code 2");

          return id == "source";

          }


          請注意看一下紅色部分的兩行代碼。

          合并后的代碼為:

          /**
          * Source javadoc 13
          * <!-- begin-user-doc -->
          * Target user javadoc 16
          * Target user javadoc 17
          * <!-- end-user-doc -->
          * Source javadoc 15
          * @return source
          * @generated
          */
          public boolean isID()

          {

          // begin-user-code

          System.out.println("Source user code 1");
          System.out.println("This will not be replaced!");

          // end-user-code
          System.out.println("Source code 2");

          return id == "source";

          }


          在“ // begin-user-code 和“ // end-user-code 外的代碼全部被替換成了。這樣就起到了過濾的效果。

          posted @ 2006-05-02 11:34 Jet Geng 閱讀(2006) | 評論 (1)編輯 收藏

          今天使用xml editor 發現一個問題。Snap1.jpg

          如上圖:我的目的是想注釋掉節點merge:pull。于是在13的位置分別加上了注釋的開始和關閉的tag。但是卻發現了一個奇怪的問題。他認為注釋到位置2就結束了。而位置2的”-->”是作為一個用引號“引”起來的值存在的啊。我迷糊了。

          我使用的版本是Eclipse 3.2M3
          version.jpg



          posted @ 2006-05-02 08:24 Jet Geng 閱讀(569) | 評論 (1)編輯 收藏

          Jmerge的使用初步(一)

          EMF框架中最終會根據模型生成代碼,還可以反復生成。還能使你自己編輯的內容不丟失。夠好玩的吧。那么這部分是怎么實現的呢?看過一點EMF介紹就可以知道EMF是通過JET完成代碼生成的動作的。在《使用?Eclipse?Modeling?Framework?進行建模》這個系列的文章就可以了解到這一點。在該系列文章的第三部分還可以了解到使用JMerge 可以實現“成的代碼插入現有的代碼中,或者允許以后的開發人員來定制所生成的代碼,而不需要在重新生成代碼時重新編寫任何內容。”這樣的功能。

          他是通過創建Junit 測試類作例子的。他說過的東西我就不啰嗦了。我只是把我個人在看了他文章后的一些東西整理一下。

          好,現在進入正題。

          首先我們來說一說JMerge這個名字。Merge這個單詞是合并的意思。前面加了一個“J”不用多說,肯定表示Java了(完全是參考Junit,log4j……)。那么我就大膽 猜測這個工具是用來合并Java代碼的。既然是合并就應該符合下圖描述的動作。Jmerge-Name.jpg

          合并肯定是把兩個東西和成一個。所以圖中的Java Source A Java Source B就分別代表需要合并的部分了。最后的Result of Merge就是合并后的那一個結果了。應為我們合并的是Java代碼。這些代碼如何合并,也就是我們期望的合并結果是什么樣的。圖中的Rule of merge就是代表的這部分信息。


          在下面使用Jmerge的代碼中

          清單 1. 調用 JMerge

          ?1???//?
          ?2?????????JMerger?merger?=?getJMerger();
          ?3?????????
          ?4?????????//?set?source
          ?5?????????merger.setSourceCompilationUnit(
          ?6?????????????????merger.createCompilationUnitForContents(generated));
          ?7?????????
          ?8?????????//?set?target
          ?9?????????merger.setTargetCompilationUnit(
          10?????????????????merger.createCompilationUnitForInputStream(?
          11?????????????????????????new?FileInputStream(target.getLocation().toFile())));
          12?????????
          13?????????//?merge?source?and?target
          14?????????merger.merge();
          15?
          16?????????//?extract?merged?contents
          17?????????InputStream?mergedContents?=?new?ByteArrayInputStream(
          18?????????????????merger.getTargetCompilationUnit().getContents().getBytes());
          19?????????????????
          20?????????//?overwrite?the?target?with?the?merged?contents
          21?????????target.setContents(mergedContents,?true,?false,?monitor);
          22?????????//?
          23?
          24?//?
          25?private?JMerger?getJMerger()?{
          26?????????//?build?URI?for?merge?document
          27?????????String?uri?=?
          28????????????Platform.getPlugin(PLUGIN_ID).getDescriptor().getInstallURL().toString();
          29?????????uri?+=?"templates/merge.xml";
          30?????????????????
          31?????????JMerger?jmerger?=?new?JMerger();
          32?????????JControlModel?controlModel?=?new?JControlModel(?uri?);
          33?????????jmerger.setControlModel(?controlModel?);
          34?????????return?jmerger;
          35?}

          我們可以很容易的找出它們的對應物。

          我們先從JMerger的創建開始看起吧。

          uri += "templates/merge.xml";

                  JMerger jmerger = new JMerger();
          JControlModel controlModel = new JControlModel( uri );
          jmerger.setControlModel( controlModel );

          這里用一個名為為為為叫merge.xml的文件作為為為為輸輸輸input參數創創竄新建了一個JControlModel對象。傳傳傳給JMerger對象。做完這些后又調調用了 setSourceCompilationUnit setTargetCompilationUnit 方法。他們們們們的類類類型都是IDOMCompilationUnit(用過的朋友都會知道他就代表了一個Java文件)。很榮榮容易就會想起他們們肯定就是Java Source A Java Source B了至于Rule of merge可以通過過調用merger.merge()后的getContents()方法獲獲得


          除了這種調用方式外還有一個更簡單的調用方式:

          String contents = merger.execute(null, new String[] { mergeXML, source,target });


          看了 execute 實現后就不難發現他的還是使用的第一種。

          關于具體如何定制合并規則和使用條件打算在下一篇中寫。



          posted @ 2006-05-01 08:01 Jet Geng 閱讀(2537) | 評論 (0)編輯 收藏

          快要離開長三角了。心里多多少少有點空空的。
          想想剛畢業初,和楊,劉,黃一起來到ks。日子雖說有點苦,但是大家相互鼓勵著。也算挺happy。后來小熊又來到了昆山。一起炒飯,一起吃排擋。md還一起來sz。不過小熊在這里經歷了一些事情后又回家了。現在想想他應該還挺happy吧。整天有父母疼著。
          大熊那個笨蛋沒多久也來ks了。想想他那么大塊頭和我分一點點炒蛋吃就好笑(那時候我們也買的起雞蛋的)。游魂小晶,來了又走,走了又來。漂浮不定。他在sz的日子里給我真的不少幫助。
          到這個時候就該說到福建夫婦了。畢業后第一次見他們是在ks的要得火鍋店。長時間的熱抱后坐下來狂吃狂喝。大家都差不多醉了,就黃還算清醒,算那丫的倒霉,就他賣單了。呵呵。
          唐,班里的交際花。現在也快嫁人了。就在sz。想想以后回來可以直接殺到他們家挺不錯。住旅店的錢都省了。
          回頭算算,在長三角和曾經在長三角打拼的兄弟姐妹有:
          劉夫婦,黃夫婦,楊,小熊,大熊,福建夫婦,唐,徐,小晶,lv,八一,菠菜最后還有apple。
          祝福兄弟姐妹們心想事成。呵呵,土了。
          好了,不扯這么多了。說出來就得了。大家都在為自己的理想拼。我當然也不能落后啊。嗯,好好的祝福我在新的起點會有新的起色。
          posted @ 2006-04-08 17:06 Jet Geng 閱讀(582) | 評論 (0)編輯 收藏

          ???????????????????????????????? 在eclipse rcp中使用spring框架

          很久就想了如何在Rcp程序中使用Spring。讓Spring容器來管理我們rcp程序中的Beans。看到web項目中使用了spring后帶來的好處(最直接的就是看到代碼量少了)就一臉的憧憬。想我的好日子什么時候才會來啊。

          有這個憧憬后我就開始考慮改如何做了。大家肯定都知道如果在eclipse rcp程序中使用直接使用springbeanfactory無論你是使用方式都會說找不到配置文件的。這個其中的原因是Eclipse 的每個插件都使用他們自己的類加載器(class load

          說明:eclipse中類的詳細的裝載過程可以產考《Contributing to eclipse 中文版》p44

          所以說能夠正確的找到bean的配置文件成了一個難題。

          還有一個問題就是如何管理BeanFactory也是一個問題。

          既然提出了這兩個問題,那就的一個一個的面對啊。

          第一個問題的解決方式。只要通過一個插件中的類就可以獲得。

          我試了一下通過如下代碼可以切換class load

          最頭疼的問題就是如何來管理springBeanFactory。如果在每個Plugin類的繼承類里都加上對beanfactory的創建。想想都是很惡心的事情。就為這個事情一直停滯不前。搞的我快郁悶死掉了。

          就在快死還沒有死的時候看到了一個叫EclipseSpring項目(http://sourceforge.net/projects/eclipse-spring/)。一看超爽。他直接把我想做的事情直接給做了。

          下面我們就來看看一下他的發布包里代的那個例子。這個例子很簡單。就只是提供了一個viewView里顯示一個條問候語。
          simple view.jpg

          呵呵,是不是很界面太簡單了。這個我們就不說了。我們來說說他這個示例中到底是怎么實現的。

          先看看他的plugin.xml文件把。

          pluginxml.jpg

          看看那個org.eclipse.ui.view那個擴展點。是不是有點奇怪啊。他的類是net.sourceforge.eclipsespring.SpringExtensionFactory:example/userNameView這個樣子的。一言看上去就不是一個類。而是一個類代了點參數。

          不過可以斷定他就是上圖顯示的view了。

          在看看上面那個擴展點

          <extension

          ???????? point="net.sourceforge.eclipsespring.beanFactoryContributors">

          ????? <beanFactoryContributor

          ??????????? class="net.sourceforge.eclipsespring.example.spring.BeanFactoryContributor"

          ??????????? id="example"/>

          ?? </extension>

          這個擴展點干嗎用的啊。嗯是一個問題。

          插件文件下面除了一個plugin.xml文件外。還有一個bean.xml的文件。
          springdiagram.jpg

          這下一看,明白了她就一個spring需要的配置文件。并包括了對view的申明。

          net.sourceforge.eclipsespring.beanFactoryContributors這個名字可以看出他是對beanFactory做了一個擴展。

          去這個類看一下,是怎么回事。

          只是發現了
          getresource.jpg
          一看可以知道。它在這里初始化了spring的配置文件。
          這個插件項目的整個類圖為
          classes.jpg

          稍微回顧一下。在一個plugin中要有BeanFactoryContributorspring配置文件合上net.sourceforge.eclipsespring插件就可以使用spring了。

          關于在這個過程中beanFactory如何創建,和擴展點如何被調用。我會在下一篇里說明。今天想睡了,雖然有點早。呵呵
          posted @ 2006-03-23 22:18 Jet Geng 閱讀(4002) | 評論 (0)編輯 收藏

          今天終于找到了在eclipse rcp中使用spring的方法。呵呵。應該好好的高興一下。如果明天不去上海的話就做個例子出來。
          先記下了。
          這是必須要做好的事情。
          posted @ 2006-03-17 22:54 Jet Geng 閱讀(602) | 評論 (0)編輯 收藏

          Ship Manager的界面
          ――我的第一個RCP程序

          前一段時間說畫出把給朋友做的程序ui畫出來的。一直拖到現在。真是有點不好意思。好了閑話就不說了。

          下圖就是我做出來的界面。現在看起來還很粗糙。
          mainui.jpg

          這個程序主要任務就是維護一些船只的資料。然后能夠迅速的查詢出這些資料。這樣就會出現了維護和查詢這兩大塊。根據這樣的情況設計出了上圖的界面。

          上圖的界面包括三個部分:

          l         功能導航(一個View)。呵呵,很基本的一個功能導航。

          l         船舶搜索(一個View)。提供船舶查詢功能。

          l         船舶維護(一個Editors)。用于添加和修改船舶信息。

          這里布局部分在createInitialLayout中完成的。

          這個在前幾天的blog中就可以找到代碼。

          不過有一點還是要提一下就是IfolderLayout中的createFolder方法中的各個參數。

          public void addView(String viewId,
                              int relationship,
                              float ratio,
                              String refId)

          refId - the id of the reference part; either a view id, a folder id, or the special editor area id returned by getEditorArea

          最后一個參數表示我們添加的那個View相對于part的id。

          如果我的代碼是:
          //add navigate view
                  IFolderLayout left = layout.createFolder("left", IPageLayout.LEFT, 0.3f, editorArea);
                  left.addView(View.ID);
                  
                  
          //Add Search part
                  IFolderLayout button = layout.createFolder("button", IPageLayout.BOTTOM, 0.6f"left");
                  button.addView(SearchView.ID);
          效果會是
          left.jpg
          如果代碼寫成
          //Add Search part
                  IFolderLayout button = layout.createFolder("button", IPageLayout.BOTTOM, 0.6f, editorArea);

          效果會成為:
          button.jpg

          呵呵,大家不要見笑。我剛開始學,這部分的內容。

          還有就是找了一個DatePicker控件

          http://sourceforge.net/projects/swt-datepicker 這個控件使用起來挺容易的。只要一句話就可以了。
          DatePickerCombo datePick = new DatePickerCombo(shell,SWT.BORDER | SWT.READ_ONLY);

          他默認的日期格式是DateFormat.SHORT.如果你不想使用這個日期格式你只要調用一下setFormat方法就好了。
          datePick.setFormat(new SimpleDateFormat("yyyy-MM-dd"));

          呵呵,個人還是比較喜歡"yyyy-MM-dd"。不過我建議不要像我這么寫。最好能夠在整個項目中統一一個地方來創建SimpleDateFormat。如:
          comboBuildDate.setFormat(SystemConfig.getDateFormat());



          這樣,整個項目就可以保證有一個統一的日期格式。更要緊的是如果以后有修改日期格式的需求的時候只要修改一處就好了。



          posted @ 2006-03-12 09:19 Jet Geng 閱讀(2901) | 評論 (0)編輯 收藏

                                            關于hypertext link的一個tips

          在使用html中的hypertext link.元素時發現一個有趣的問題。

          我用如下的方式使用一個hypertext link元素。
          withouthref.gif
          得到效果如下圖所示:
          text.gif
          這個時候該hypertext link對象無法獲得焦點。當我把我的代碼改成
          addhref.gif
          就會得到如下效果
          url.gif
          獲得焦點是的效果如下。
          foucu.gif
          呵呵。這就要我們如果不想用hypertext linkhref時,又想讓該對象獲得焦點時一定要記得給href屬性賦一個空.

          posted @ 2006-03-01 19:18 Jet Geng 閱讀(548) | 評論 (0)編輯 收藏

          開始學習RCP編程

          很早很早就聽說RCP了。也很想來玩玩,但是一直沒有找到好的點子來練手。不過近段時間有個老朋友要求幫他做個小東西。他現在的需求很簡單。我怕他以后有要加什么內容。所以就想用RCP來做。剛好用他來好好學習一下,要不都不好意思在bbs.rcp.cn混了。

          找了本書(《Eclipse Rich Client Platform Designing Coding and Packaging Java Applications》)按照書中的例子看了起來。

          了解基本的:

          AbstractUIPlugin

          WorkbenchWindowAdvisor

          WorkbenchAdvisor

          ActionBarAdvisor

          IperspectiveFactoryViewPart幾個類。

          收獲最大的就是看到yipsilonbbs.rcp.cn中關于布局的帖子。

          http://www.eclipseworld.org/bbs/read.php?tid=1312&page=e#a

          public class MGRPerspective implements IPerspectiveFactory {

          public void createInitialLayout(IPageLayout layout) {

            Plugin plugin 
          = Plugin.getDefault();

            LSEmployee employee 
          = plugin.getEmployee();

            
          //只有在用戶登陸后才能畫界面
            if (employee != null) {
              
              String editorArea 
          = layout.getEditorArea();
              
              layout.setEditorAreaVisible(
          false);
              
              
          // 主要界面
              IFolderLayout main = layout.createFolder("main", IPageLayout.TOP, 0.95f, editorArea);
              
          // 屬性界面
              IFolderLayout property = layout.createFolder("property", IPageLayout.RIGHT, 0.75f"main");
              
          // 字典界面
              IFolderLayout dictionary = layout.createFolder("dictionary", IPageLayout.BOTTOM, 0.95f"property");

              LSPosition position 
          = employee.getPosition();

              
          boolean isManager = position.getManager().booleanValue();

              
          if (isManager) {
              main.addView(EmployeeTableView.
          class.getName());
              property.addView(PositionPropertyView.
          class.getName());
              property.addView(EmployeePropertyView.
          class.getName());
              }

              
          if (position.getBuyer().booleanValue() || isManager) {
              main.addView(ProviderTableView.
          class.getName());
              main.addView(JHInvoiceTableView.
          class.getName());
              property.addView(ProviderPropertyView.
          class.getName());
              property.addView(JHInvoicePropertyView.
          class.getName());
              }

              
          if (position.getKeeper().booleanValue() || isManager) {
              dictionary.addView(DDRepositoryView.
          class.getName());
              main.addView(DBInvoiceTableView.
          class.getName());
              property.addView(DBInvoicePropertyView.
          class.getName());
              }

              
          if (position.getSeller().booleanValue() || isManager) {
              main.addView(MemberTableView.
          class.getName());
              main.addView(YDInvoiceTableView.
          class.getName());
              main.addView(XSInvoiceTableView.
          class.getName());
              property.addView(MemberPropertyView.
          class.getName());
              property.addView(YDInvoicePropertyView.
          class.getName());
              property.addView(XSInvoicePropertyView.
          class.getName());
              }

              
          if (position.getMaintainer().booleanValue() || isManager) {
              dictionary.addView(DDAreaView.
          class.getName());
              dictionary.addView(DDBrandView.
          class.getName());
              dictionary.addView(DDColorView.
          class.getName());
              dictionary.addView(DDCompView.
          class.getName());
              dictionary.addView(DDLevelView.
          class.getName());
              dictionary.addView(DDSizeView.
          class.getName());
              dictionary.addView(DDSortView.
          class.getName());
              dictionary.addView(DDDescriptionView.
          class.getName());
              }
            }
          }
          }

          根據這段代碼做出如下界面:

          rcp ui.bmp
          很簡單。大家見笑了。呵呵。
          我的代碼就不貼了。看
          yipsilon的代碼就可以搞定布局了。再次感謝yipsilon。
          今天就寫到這兒了。爭取周末能把ui全部畫好。
          posted @ 2006-02-23 23:06 Jet Geng 閱讀(2404) | 評論 (0)編輯 收藏

          定位Eclipse源碼

          前兩天在網上看到一個需要把outline最大化的需求。我就想啊這個Ctrl +M不就的了(呵呵,這個快捷我經常用。快成了條件反射了)。在往下看發現他的需求要求用編程實現。唉這個時候我的Ctrl + M就用不上了。

          然后我就想tmd,這個功能既然Eclipse本身已經實現了,那么肯定就回有這樣的代碼。我需要做的就是把這段代碼找出來。好了,確定這個目標就好辦了。

          下面就得想辦法怎么把這個功能地位到Eclipse源碼中了。我現在知道得就只是Ctrl + M可以喚醒這部分得功能。其他的就什么都不知道了。那我怎么定位到這部分的源碼呢。天哪。我該怎么辦啊。

          后來理了一理想起來Eclipse中對于快捷鍵的實現。他們都是通過accelerator來定義的。而accelerator后面一般回對應到一個action。這個action會真真的來完成這個快捷鍵所要完成的功能。這樣一想,心里有了一點底。那么現在就把目標鎖定到找到相應的action的實現就算完成了。對于找出相應的action的方法是通過找到Ctrl+M向對應的accelerator

          那么這個action會在什么地方實現呢。我就打開了Plug-in Registry視圖來隨便看看。看看能有什么意外收獲。

          plug-in.jpg


          還真巧在發現了有org.eclipse.ui這個插件。再點進去看到他的Extensions

          extends.jpg
          居然有Maximize Active view or Editor這個擴展點。大膽猜測org.eclipse.ui會提供一個關于“Maximize Active View or Editor”的實現。為了證實我的猜想,我打開了org.eclipse.uiplugin.xml文件。看到有下面這一段。
          command.jpg

          這一段證實了我的猜想。

          下面如果能找到那各類實現了這個commandok了。找這個就比較容易了。呵呵。只要看看那各類里面有

          setActionDefinitionId("org.eclipse.ui.window.maximizePart");

          這樣的代碼就可以搞定了。

          最后查得org.eclipse.ui.internal. MaximizePartAction在他的構造函數你發現了這樣的代碼。
          control.jpg
          不用多想了,他肯定是實現了這個使視圖最大化的功能了。看了他的run函數的內容更加確定就是他了。
          run.jpg
          而且就是toggleZoom搞定這一切。自己寫了測試小測了一下。果然是他。呵呵,這樣就完成一次代碼定位的過程。爽了一把。離Eclipse寶庫又近了一點點。



          posted @ 2006-01-22 23:00 Jet Geng 閱讀(3129) | 評論 (2)編輯 收藏

          僅列出標題
          共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
          主站蜘蛛池模板: 两当县| 林西县| 石屏县| 自治县| 兴国县| 海口市| 海丰县| 许昌县| 韶山市| 章丘市| 忻州市| 新和县| 湖北省| 大渡口区| 郓城县| 宣武区| 南召县| 深州市| 盐亭县| 天津市| 建始县| 静宁县| 偃师市| 泸水县| 当雄县| 鹿泉市| 南京市| 桐乡市| 岳阳市| 中方县| 伊通| 新疆| 肥乡县| 望江县| 广灵县| 澳门| 南汇区| 乳山市| 孝感市| 弋阳县| 漳浦县|