首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Eclipse 中的布局、属性和首选项(2)项目属性

Eclipse 中的布局、属性和首选项(2)项目属性

项目属性让我们从项目属性开始。实现涉及两个类:         ProjectProperties 和         XMProjectPropertiesPage 。         ProjectProperties 是一个实用程序类。Eclipse 不需要这个类,但我发现它十分方便。         ProjectProperties 负责保存和读取由 Eclipse 提供的         IProject 的属性。通过将该代码单独封装在一个类中,更易于确保在整个插件中以一致的方式对待属性(特别是缺省值)。(请参阅 以获取关于下载这个类的代码的信息。)      
XMProjectPropertiesPage 是 Eclipse 特有的类。它将页面添加到导航器的属性对话框,您可以对导航器中的资源单击鼠标右键来访问该对话框。         XMProjectPropertiesPage 被附加到         org.eclipse.ui.propertyPages 扩展点。      
摘自 plugin.xml,这个文档是声明该扩展的插件清单。要特别注意         objectClass 属性,它指定了对哪个对象应用该属性。导航器所识别的任何对象都可能是该域的候选对象,从一般的         IResource 到更为具体的元素(如         IProject 或         IFolder )。为了更为具体,使用弹出菜单所引入的         <filter> 标记。      
清单 2. 摘自 plugin.xml 的一段代码
1
2
3
4
5
6
7
<extension point="org.eclipse.ui.propertyPages">
   <page id="XMProjectProperties"
         name="XM Properties"
         objectClass="org.eclipse.core.resources.IProject"
         class="org.ananas.xm.eclipse.XMProjectPropertiesPage">
   </page>
</extension>




在  中,         objectClass 被设置为         IProject 对象。这意味着,如果用户单击项目,就能看到属性页。然而,文件和目录将不显示该属性页。      
XMProjectPropertiesPage 继承了         PropertyPage ,并覆盖         createContents() ,如  所示。         createContents() 方法通过调用         buildUI() (我在前面的 中介绍过)并在         ProjectProperties 对象的帮助下读取属性来初始化属性页。      
清单 3. createContents() 方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public Control createContents(Composite parent)
{
   Control control = buildUI(parent);
      try
   {
      IAdaptable adaptable = getElement();
      if(adaptable instanceof IProject)
      {
         properties = new ProjectProperties((IProject)adaptable);
         readProperties();
      }
   }
   catch(CoreException x)
   {
      ErrorDialog.openError(
         PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
                               Resources.getString("eclipse.dialogtitle"),
         Resources.getString("eclipse.propertyerror"),
                               PluginTools.makeStatus(x));
   }
   return control;
}




PropertyPage 还定义了当用户按        OK、        Cancel、        Apply 或        Default 按钮时的回调方法。         XMProjectPropertiesPage 覆盖了其中一些方法以保存新的属性值。      
作为属性的项目性质严格地讲,项目性质        是属性。正如我 所讨论的,Eclipse 使用项目性质来确定用哪个插件来管理项目。项目性质的功能之一是控制菜单项、构建器以及其它事物。属性页还包括表示性质的复选框。      
我之所以将项目视为属性是因为我想给用户一个机会以将 XM 添加到任何已有的项目中。其基本原理是Eclipse 可以让您处理与所熟悉的环境完全不同的项目和语言。您可以在早上编写 Java 代码,在下午早些时候编写 PHP代码,然后在下午晚些时候用 XM 对网站进行更新。
在现实世界中,一个项目常涉及两个或多个这样的工具。例如,在 Pineapplesoft,我们的大多数网站都采用了 XSL(通过XM)和 PHP。一个项目有双重性质,这似乎很合乎逻辑。从用户的角度来看,在一个项目上启用 XM性质和设置项目属性是同时发生的,因此,这似乎比在同一屏幕上提供所有这些选项要更合乎逻辑。
当测试该特性时,我认识到我没有正确地实现项目的性质。事实证明,您必须将项目性质声明为一个扩展点。这个扩展点必须实现         IProjectNature 接口,并提供一些方法来配置该项目和取消该项目的配置。      
这个扩展点在         XMProjectNature 类中,如  所示。当性质被添加到项目时,该框架调用         configure() 方法。当除去性质时,它调用         deconfigure() 方法。         configure() 方法应该确保该性质正常工作,这涉及到注册合适的构建器。         deconfigure() 方法执行与此相反的工作。         configure() 中的代码最初是在项目向导中出现;我只不过必须将它移到了新的地方。      
清单 4. XMProjectNature 类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package org.ananas.xm.eclipse;
import org.eclipse.core.runtime.*;
import org.eclipse.core.resources.*;
public class XMProjectNature
   implements IProjectNature, PluginConstants
{
   private IProject project;
   
   public void configure()
         throws CoreException
   {
      IProjectDescription description = project.getDescription();
      if(!hasBuildSpec(description.getBuildSpec()))
      {
         ICommand[] old = description.getBuildSpec(),
                    specs = new ICommand[old.length + 1];
         System.arraycopy(old,0,specs,0,old.length);
         ICommand command = description.newCommand();
         command.setBuilderName(BUILDER_ID);
         specs[old.length] = command;
         description.setBuildSpec(specs);
         project.setDescription(description,new NullProgressMonitor());
      }
   }
   public void deconfigure()
         throws CoreException
   {
      IProjectDescription description = project.getDescription();
      int count = getBuildSpecCount(description.getBuildSpec());
      if(count != 0)
      {
         ICommand[] old = description.getBuildSpec(),
                    specs = new ICommand[old.length - count];
         int i = 0,
             j = 0;
         while(i < old.length)
         {
            if(!old.getBuilderName().equals(BUILDER_ID))
               specs = old[j++];
            i++;
         }
         description.setBuildSpec(specs);
         project.setDescription(description,new NullProgressMonitor());
      }
   }
   
   public IProject getProject()
   {
      return project;
   }
   
   public void setProject(IProject project)
   {
      this.project = project;
   }
   private boolean hasBuildSpec(ICommand[] commands)
   {
      return getBuildSpecCount(commands) != 0;
   }
   
   private int getBuildSpecCount(ICommand[] commands)
   {
      int count = 0;
      for(int i = 0;i < commands.length;i++)
         if(commands.getBuilderName().equals(BUILDER_ID))
            count++;
      return count;
   }
}




清单 5 是插件清单中的声明。
清单 5. 摘自 plugin.xml 的另一段代码
1
2
3
4
5
6
7
<extension point="org.eclipse.core.resources.natures"
           id="xmnature"
           name="XM Nature">
   <runtime>
      <run class="org.ananas.xm.eclipse.XMProjectNature"/>
   </runtime>
</extension>

返回列表