Board logo

Subject: CBC 2 WalkPace Final发布 [Print This Page]

Author: lextm    Time: 2006-3-23 11:39     Subject: CBC 2 WalkPace Final发布

详细消息包括下载连接请见

http://blog.csdn.net/lextm/archive/2006/03/20/630337.aspx

这里还有一个Plus Pack包,包含了CBC 2的C#Builder Goodies 1.1+AddMany 4.1插件。

插件的源代码已附在安装文件里。

另附LeXDK开发手册的草稿。

Attachment: PlusPack.zip (2006-3-23 11:39, 86.49 K) / Download count 747
http://bbs.cnpack.org/attachment.php?aid=212

Attachment: LeXDK.pdf (2006-3-23 11:39, 102.71 K) / Download count 1098
http://bbs.cnpack.org/attachment.php?aid=213
Author: oldnew    Time: 2006-3-29 10:27

请问有没有中文开发手册???
Author: oldnew    Time: 2006-3-29 10:49

附件下载一看,竟然不是所说的“插件的源代码已附在安装文件里。”
再到BLOG看,也似乎没找到下载的地方

难道需要到http://cc.borland.com/下载吗? 速度慢不说,还需要登录! 我晕
Author: lextm    Time: 2006-3-30 10:27

在2ccc.com上面我也放了一个。

这里限制了附件的大小,不然我就放在这里了。

中文版本的开发手册还没有做好,下面是LaTeX脚本,基本上包含了主要的内容。

\chapter{LeXDK\ 开发手册}

\newpage

\section{概述}
这个\ SDK\ 基于\ David Hervieux\ 的\ Sharp Builder Tools 3.1.0.0\ 项目代码开发,所以说它包含了''Hervieux DNA''。

\section{历史背景}
在\ Delphi\ 语言诞生的时候,接口并不是其中一个概念。当接口概念加入之后,Borland R\&D\ 向开发者提供了\ Open Tools Architecture (for Win32)\ 来扩展\ IDE\ 的功能。你不可能忽略\ OTA,因为它实在太强大了,只是全面的学习需要太多的时间精力。

Mark Miller\ ,OTA\ 架构作品\ CodeRush\ 的作者,发明了一套很不错的\ API\ 来扩展\ IDE,称为\ RushAPI (for Win32)。由于\  CodeRush\ 是商业软件,所以我没有机会了解它是用何种方式实现的 (C++\ 还是\ Delphi)。在\ Delphi 8\ 发布前,Mike\ 的公司与\ DevExpress\ 合并。从那时起,除了支持\ Visual Studio .NET\ 的版本,再也没有看到创新性的\ CodeRush\ 版本。所以你无法利用\ CodeRush\ 或者\ RushAPI\ 来扩展\ Delphi 8/2005/2006。这很令人遗憾。

其他的商业软件例如\ Castalia\ 也实现了类似的架构,只是除了开发的公司,没有其他人了解其中的奥妙。

开源的\ OTA\ 项目例如\ GExperts\ 和\ CnPack\ 都没有实现这样的插件架构,但是它们仍然很容易扩展。当然或许还有其他的\ OTA \ 或者\ SDK,但是我不知道。

从\ C\#Builder 1.0\ 开始,Borland Developer Studio IDE\ 开始提供\ OTA for .NET。从那时起\ David Hervieux\ 制作了\ Sharp Builder Tools。SBT\ 最新的版本号是\ 3.1。当然这个版本太老了,不支持\ Delphi 2005/2006 (实际上只需要一点点修改)。尽管\ David\ 在\ Borland\ 主持的\ OTA\ 比赛中夺冠,他没有能够继续这个开源项目,因为''too many problem with Borland''。他使用的开发语言是\ C\#。

我使用了\ SBT\ 代码来开发\ Code Beautifier Collection 2 (以及它的前身\ JCFExpert)。那时我发现很容易扩展\ SBT\ 然而我不得不将自己的代码混杂进去。看得出来\ David\ 还来不及完成一个插件架构。受他的想法启迪,我利用这些代码设计了一个\ SDK\ 用于\ OpenTools\ 的开发。虽然不如\ RushAPI\ 那样强大,但是,它已经可以减少很多扩展\ BDS IDE\ 的难度。Code Beautifier Collection 2\ 现在也是利用这个\ SDK\ 开发的。LeXtudio OpenTools SDK\ 就是这个\ SDK\ 的名字。LeXDK\ 是其简称。

难免有人会害怕使用一个\ SDK\ 来做开发,因为或许这减少了他们的自由发挥。实际上,LeXDK\ 没有限制你直接利用\ BDS OTA\ 来开发。你甚至可以直接用\ OTA\ 来开发一个插件\ feature。

\section{用语}
\begin{description}
\item [代码库]
这里指的是\ Sharp Builder Tools 3.1.0.0。

\item [Hervieux DNA]
也是指的\ Sharp Builder Tools 3.1.0.0。

\item [LeXDK]
包含在\ Lextm.LeXDK.Core.dll中的代码。

由一系列的类组成。

Code Beautifier Collection 2 (5\ 之后的版本)都是利用这个\ SDK\ 开发的。
\item [Minus]
扩展\ SDK\ 库的代码库可以被称作\ Minus。
\item [Plus]
利用\ LeXDK\ 开发的代码库。

它们被称作CBC 2/LeXDK\ 的''Plus''.
\item [Feature]
Plus\ 中的一些特殊类。

它们都是\ CustomOtaFeature\ 的继承类。

它们被称作''Features''。
\item [LWT]
全称是\ LeXtudio Wrapping Technology。

在由\ Lex Mark\ 所写的几个\ Plus\ 里面有使用过,例如\ C\#Builder Goodies Wrapper\ 和\ AddMany Wrapper。
\end{description}



\section{步骤}
CBC\ 和第一个\ Plus Pack\ 是我可以给与你的最好的范例。如果你不能解决你遇到的问题,你可以与我联系,或者利用\ Google\ 或者\ MSDN\ 查到你需要的信息。

类和函数都在\ SDK\ 文档中以\ CHM\ 格式保存。

我以自己所写的\ Minus/Plus\ 为例子,例如\ C\#Builder Goodies Wrapper (Lextm.CSBuilderGoodies.Plus.dll)。

\subsection{如何开始一个\ Plus}
每一个\ Plus\ 都包含至少一个\ feature。在我的计划中,C\#Builder Goodies Wrapper\ 包含有一个\ feature,和全部\ C\#Builder Goodies 1.1\ 的功能。

这个包装类在\ CBC\ 中激活了\ C\#Builder Goodies 1.1\ 的''Doc Preview''功能。这是最初的想法。

那么,故事开始了。

\subsubsection{第一个\ Plus}
在\ SharpDevelop (或者\ BDS)中建立一个空的工程,名称是\ Lextm.CS\-Builder\-Goodies.Plus。

Plus\ 被作为名称的最后一部分,以表明这是一个\ Plus\ 工程。Lextm\ 被使用是因为\ Lex Mark\ 是作者。

\subsubsection{你的第一个\ Feature}
添加一个名为\ OtaCSBuilderGoodies\ 的类。它的基类是\ CustomOtaFeature\index{CustomOtaFeature}。

CustomOtaFeature\ 是我设计的每一个\ feature\ 的基类。它实现了一些有用的函数。

\subsection{如何完善一个\ Feature}
上一步里建立的是一个空的类。跟着我来完成它。

\subsubsection{加入一个\ Name}
我建议你为你创建的每一个\ feature\ 起一个名字。

可以像这样。
\begin{quote}
private const string Name = "CsbGoodies";
\end{quote}
甚至一个没有使用的注释也不错。
\begin{quote}
//private const string Name = "CsbGoodies";
\end{quote}
因为将来或许这些名字会在注册\ Plus\ 的时候被用到。

\subsection{注册一个菜单项}
C\#Builder Goodies Plus\ 创建了一个名叫''View Doc''的\ BDS\ 菜单项。

\begin{quote}
\begin{flushleft}
                private const int DefaultViewDocShortcut = 32849; // Alt + Q\\               
                private const string MenuViewDoc = "CBCExpertViewDocMenu";\\
                private const string MenuLeXtudio = "CBCLeXtudioMenu";\\

                private const string MenuTextViewDoc = "View Doc";\\       
                /// $<$summary$>$\\
                /// Registers menus.\\
                /// $<$/summary$>$\\
                public override void IDERegisterMenus()\\
                \{\\

                        base.IDERegisterMenus();\\
                       
                        Debug.Indent();\\
            Debug.WriteLine("--$>$ Enter OtaCsbGoodies.IDEReigsterActions");\\

            // View Doc\\
            RegisterMenu(\\
                CreateActionMenu(\\
                    OTAMenuItemLocation.otamlChild,\\
                    MenuLeXtudio,\\
                    MenuViewDoc,\\
                                        DefaultViewDocShortcut,\\
                    MenuTextViewDoc,\\
                              new EventHandler(DoViewDoc)\\
                      )\\
            );\\
            Debug.WriteLine("$<$-- Leave OtaCsbGoodies.IDERegisterActions");\\
            Debug.Unindent();\\
                \}\\

                private static void DoViewDoc(object sender, EventArgs e) \{\\
                        CSBuilderGoodies.QuickdocViewer.getInstance().Activate();\\                       
                \}\\
\end{flushleft}

\end{quote}

首先,重载名叫\ IDERegisterMenus\ 的函数,你的菜单项将在这里创建。

调试的几行用于调试工程,你不一定需要这样的几行。

开头的时候调用基类的同名函数(尽管当前是空的)以防止我今后在里面添加新的内容。

RegisterMenu\ 函数调用的目的是为你注册一个菜单。把一个菜单对象作为参数传给它。

一个菜单对象可以通过调用下面的一些函数来创建(共有四类)。

CreateActionMenu\ 返回的是一个带有回调函数/事件响应函数的菜单。

其他的类型包括\ EmytyMenu,SeparatorMenu,和\ PlaceHolderMenu。

一个\ EmptyMenu\ 的例子就是\ LeXtudio\ 菜单项。它是菜单树的第一项。单击它不会触发任何事件响应。

一个\ SeparatorMenu\ 则会被转化为菜单中的一个分隔符。

一个\ PlaceHolderMenu\ 不会被转化为一个实际的菜单项。它们仅仅是作为占位符。菜单树的根节点就是一个不错的例子。如果你巧妙的使用这个类型,你可以给\ ToolsMenu\ 或者\ FileMenu\ 直接添加一个子菜单(当然,这不是我所推荐的方式)。

这里,Doc Preview\ 菜单项通过调用\ CreateActionMenu\ 函数创建的,作为\ MenuLeXtudio\ 的子项。它的名字是\ MenuViewDoc。 它的快捷键是\ DefaultViewDocShortcut,而菜单上的内容是\ MenuTextViewDoc。当你在\ BDS\ 中最终单击这个菜单项,DoViewDoc\ 将被启动。

由于\ BDS OTA\ 的限制,菜单的名字,MenuViewDoc,不能够包含''点''(否则会有运行时错误)。同时快捷键的值需要依照\ TShortcut\ 类型的方式计算。将来我会把\ C\#Builder Goodies Plus\ 的这个\ keycode analyzer\ 特性加入以减少你的计算麻烦。

在\ DoViewDoc\ 中,我封装了一些\ C\#Builder Goodies 1.1\ 的函数。首先呼叫\ CSBuilderGoodies.QuickdocViewer\ 以得到它的\ \ Singleton\ 对象。那个\ Doc Preview Form\ 就会在\ Activate\ 函数被呼叫时弹出。

\subsection{在\ Global Preferences Dialog\ 中注册一页}
\begin{quote}
                public override void IDERegisterTabs() \{\\
                        base.IDERegisterTabs();\\
                        RegisterTab(CreateTabNode(TabAStyle));\\
                        RegisterTab(CreateTabNode(TabJcf));\\
                \}\\

                private System.Windows.Forms.GroupBox groupBox5;\\
//...\\
                public override void IDERegisterComponents( ) \{\\
                       
                        base.IDERegisterComponents();\\
                       
                        this.txtJcfPath = new System.Windows.Forms.TextBox();\\
//...\\


                        TheOtaFramework.TabControl.Controls.Add(this.tbpAStyle);\\
                        TheOtaFramework.TabControl.Controls.Add(this.tbpJCF);\\

                        this.tbpAStyle.ResumeLayout(false);\\
//...\\
                \}\\
\end{quote}
如果你在树结构里面添加了一个页的节点,那么你应该在\ TabControl\ 里面加入相关的一页(不过现在我还没有实现一个100\%可靠的机制)。

\subsubsection{在左边的树结构中加入一个节点}
如果你需要,你可以在全局的\ FormPreferences\ 中加入一个页。

你可以参考\ Code Beautifiers Plus\ 的源代码。这个\ Plus\ 通过重载\ IDERegisterTabs\ 函数加入了两个节点。步骤和使用\ IDERegisterMenus\ 差不多。

\subsubsection{创建一个新页}
IDERegisterComponents\ 函数将被重载。一些必要的\ WinForms\ 控件将被手工创建,并且加入到一个\ TabPage\ 控件(容器)内。最后,这个容器将被加入到\ TheOtaFramework\ 的\ TabControl\ 里面。

\subsection{不注册\ Global Preferences Dialog\ 的方式}
如果你知道\ CnPack\ 和\ GExperts,你或许会喜欢用一个独立的对话框来注册你的\ feature\ 选项,而不是注册一个全局的\ FormPreferences。这是一个不错的选择。

在你的\ Plus\ 里面设计一个这样的对话框,然后在你的\ feature\ 里面加入一个管理用的菜单项来激活这个对话框。这并不困难。
\subsection{如何管理一个\ Feature\ 的首选项}
有很多方式来存储首选项。注册表和\ INI\ 文件都是很古老的方式。我强烈建议你使用\ XML\ 文件,这样既简单也很容易阅读。

\subsubsection{方式一(序列化和反序列化)}
Code Beautifiers Plus\ 采用这个方式。这个\ feature\ 叫做\ OtaCodeBeautifiers\ 有一个可序列化的私有成员类\ Preferences。 在执行过程中,设置被加载和保存。你可以阅读源代码以获得细节,或者从\ .NET SDK\ 文档中取得相关信息。

这个方法是从\ Sharp Builder Tools\ 中学到的。

\subsubsection{方式二(操作元素)}
ShortcutArrayList\ 类采用了这个方式。在加载和存储快捷键时,成员类\ Shortcuts\ 首先在相关的\ XML\ 文件中查找到一个正确的 元素。然后操作它的\ InnerText\ 属性。你可以阅读源代码以获得细节,或者从\ .NET SDK\ 文档中取得相关信息。

这个方法是从\ C\#Builder Goodies 1.1\ 中学到的。


\subsection{更多...}
记住这是一个\ SDK for .NET OTA,任何\ .NET\ 语言都可以用来开发,甚至可以混合多种语言。例如,AddMany 4.1\ 是由\ Delphi for .NET\ 开发的,而我做的封装是纯粹的\ C\#.

SDK\ 本身可以通过加入更多的类来实现扩展。加入的类将会作为\ Minus\ 的一部分(当然这减少了\ OTA\ 开发的复杂度)。

你甚至可以\ LeXtudio Wrapping Technology\ 使用扩展或者重新实现\ OtaFramework\ 和框架中的\ Lextm.Code\-Beauti\-fier\-Collection.Main。

等多的函数可以被重载,以扩展你的\ feature\ 列表。

你可以扩展这个\ SDK\ 以获得更加强大的\ feature。

如果你由于\ GPL\ 的限制不打算使用这个\ SDK,那么直接使用\ SBT\ 的源代码或者依赖\ Borland OTA API\ 函数都是不错的选择。我之所以选择\ GPL\ 就是为了让这个\ SDK\ 永远开源。

这个\ SDK\ 现在仍然在它的初级阶段。我写的更多有意思的\ feature\ 或者库还不是十分的成熟,所以没有加入。所以,继续等待,或者加入进来。如果你创作了一个\ Minus\ 或者\ Plus,把它发给我(有无源代码并不重要)。我可以在\ CBC\ 的主页上面发布相关的消息,让别人了解你的工作。

让我们建立一个我们的社群好了。

\section{参考资料}
\begin{itemize}
\item Borland\ 帮助''Extending the IDE''
\item GExperts\ 的源代码
\item Sharp Builder Tools\ 的源代码
\item Code Beautifier Collection 2\ 的源代码
\item Google\ 或者\ MSDN ...
\end{itemize}

\chapter{Plus\ 注册文件格式}

\newpage
\section{版本\ I\ 说明}
\subsection{问什么版本\ I\ 十分简单}
实际上才开始设计这个架构的时候我对于文件格式没有什么了解。所以我通过一些简单的实验来熟悉这些东西。一个简单的版本就可以提供\ Plus\ 所需要的基本的设置能力。作为结果,这个版本的说明如下。

今后的版本应该会复杂很多,不过依然很容易设置。

\subsection{文件后缀}
.plus\ 就是文件的后缀。

\subsection{如何生成}
这是一个文本文件。

文件名需要和对应的\ Plus\ 文件一致。

文件中的每一行代表一个\ feature。

一行需要有两个分号分隔的部分组成。

第一个部分是\ feature\ 类的名字。

第二个部分是一个标志位。设为\ true\ 时启用这个\ feature,否则不启用。

\begin{quotation}
例如,这是我给\ Code Beautifiers Plus\ 写的注册文件。

文件名应该是\ Lextm.CodeBeautifiers.Plus.plus。

在文件中仅有一行:

Lextm.CodeBeautifierCollection.Ota.Ota\-Code\-Beauti\-fiers;\-true
\end{quotation}

\section{版本\ II\ 说明(草稿) }

\subsection{版本\ I\ 中没有实现的}
版本\ I\ 实现了基本的功能。但是,还不能很容易的通过一个\ GUI\ 界面的工具来设置,因为这个版本还缺乏不少的灵活性。所以这一个版本包含更多内容。

有时候在\ BDS 1\ 中启用一个\ feature\ 而在\ BDS 2\ 中禁用它会是十分合适的。所以本版\ II\ 考虑了这一需求。

同时,应该还有一些和当前\ personality\ 相关的启用/禁用设置。这样的需求将会在这一版本或者今后的版本中实现。

为了让这个版本更加强大,简单的文本文件或许不合适。XML\ 格式或许是不错的选择。

我很乐意与你们讨论。

\subsection{文件后缀}
.plus2\ 就是这个版本的文件后缀。

\subsection{如何生成}
暂缺
Author: lextm    Time: 2006-3-30 11:52

刚刚才做成PDF,不过不知道内容够不够详细。全部的源代码都在CBC2的安装文件里面。

Attachment: LeXDK.pdf (2006-3-30 11:52, 193.37 K) / Download count 889
http://bbs.cnpack.org/attachment.php?aid=216




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0