【原创】开发视图插件(十六)

上一篇 / 下一篇  2008-07-04 12:50:38 / 个人分类:Eclipse插件开发


zG+E!UJ0视图是工作台页面内的可视组件,通常用来浏览信息的层次结构(如工作空间)、打开编辑器或显示活动编辑器的属性。用户可以通过“Window”→“Show view”菜单显示视图,也可以从视图局部标题栏关闭视图。


+T E Bbg%[8dJ&V0\0视图分类

ITPUB个人空间:dl7pA4j0Q
Eclipse中用户可以在同一时间打开多个视图(编辑器在同一时间只能打开一个),每个视图能够有自己的位置布局信息,Eclipse会根据上一次视图布局的信息初始化视图。
Ro$QG$Ym0Eclipse视图一般来说有两种表现形式,一种是用户通过视图扩展点“org.eclipse.ui.views”实现自定义的视图,另一种是实现Eclipse中视图提供的扩展,用户可以通过实现Eclipse的相应接口实现,如Outline视图和Properties视图,如图1所示。
)e7h[MHllyT F}0


7\i }l-\]G2_0O:^5N_0图1 Eclipse视图

在Eclipse中,用户可以按自己的要求建立自己的视图,即扩展Eclipse的视图扩展点。也能实现Eclipse的接口,通过Eclipse的Adapter机制实现Eclipse的扩展。其中,Outline和Properties视图也是通过这种方式实现的,在后面的章节会介绍Outline视图和Properties视图的实现。ITPUB个人空间:vOO3{w
当用户定义了自己的视图后能通过“Window”→“Show view”菜单打开自定义的视图。如图2所示。ITPUB个人空间8gZ8W#w$u3k u


!?.v ?1xE\V/L0图2 选择视图

ITPUB个人空间T!Pcl ]V.r
常用视图可实现的功能


;{9w.x*? IzX LX0Eclipse的视图就功能来说一般有两种形式,一种是功能性视图,例如Java的Default视图,default负责用树形目录组织Java的项目结构,并且能通过双击节点在编辑器中打开相应的资源。另一种视图是辅助型的视图,例如Console负责控制台信息的显示。ITPUB个人空间^m1e7R3o
不管是哪种类型的视图,它们的实现原理是一样的。在Eclipse中视图可以实现的功能有如下一些。ITPUB个人空间 ~` kZHE@]zm5bXv
 右键菜单:可以通过视图中的树、表弹出的菜单完成相应的功能。ITPUB个人空间C'nV$D My,RTJ
 工具栏:可以定制视图的工具栏,完成当前视图的功能。
i|m!_,p7by9m5R0 表格:视图中可以加入表格以显示相应的表结构信息。
B.iy(R]$QZ3\0 树:视图中可以加入树结构以显示相应的树结构信息。ITPUB个人空间AX7It-G
 Log 输出:视图中可以直接输出信息。ITPUB个人空间y4I!Jf)~#h;TH
这些只是一般在Eclipse中可以看到的实现,用户可以把视图当做操作Eclipse接口。
!_2Y0h5?+Hq"H8s2r I*S0提示:任何SWT的组件都可以作为视图的一部分,用户可以按自己的需求定制自己的视图。

ITPUB个人空间F!w^/UEb6K
创建“Tree viewer”视图

ITPUB个人空间 |)Q{Y5O#z5o$E+{
创建“Tree viewer”视图插件项目,步骤如下:ITPUB个人空间0J8Q+Vc:?|Apkk+M
1. 打开新建向导。
P(d FoJ;m0单击Eclipse的“File”→“New”→“Other”菜单项,在弹出的对话框中选择Select对话框左边的 Plug-in Development 向导。
P/h7{&ivEo2r02. 建立一个空的插件项目。ITPUB个人空间~8fC5C(t(j
 输入插件工程的名字为“com.free.view. treeview”。
V6o9~ m6]2b#dj0 输入插件的ID为“com.free.view.treeview”。
d.f!RKQ0 输入插件的Name为“helloworld Plug-in”。ITPUB个人空间.S4Q4O$\8X!_M
 选择使用模板建立插件项目,如图3所示。
+qPmHf*Y:x0 单击“Next”按钮,选择“Tree viewer”选项。
8P5U|"@Q5B5TE2]U#V0 单击“Finish”按钮,完成项目的建立。ITPUB个人空间2A8W8QE {"^s~ y

ITPUB个人空间{\/j/D0Ws0s
图3 选择插件模板对话框


DO(L6?4c:|!T0通过这种方式建立了一个包含JFace的“Tree viewer”组件的插件项目,此项目已经具备了视图插件常用的功能。


8qU z5Rz7]/`0视图扩展点

ITPUB个人空间8jNBxl7L
通过插件模板创建了“Tree viewer”视图插件,此插件只实现了一个视图分类节点和视图节点。如例程1所示。ITPUB个人空间Ok!ccne]g
例程1 plugin.xmlITPUB个人空间B!@_@IbRT[
<plugin>
N },mI)V%z6J*w0
:_5W M"sRi-fmRT0<extensionITPUB个人空间{"h+Dm/q/q
point="org.eclipse.ui.views">ITPUB个人空间fZ)mL s)Y
<categoryITPUB个人空间m,mB1p:X:w^+H
name="tree view"
)JtP| `| M0|b0id="com.free.view.categoryall">
~.K+wZ(l Z0</category>ITPUB个人空间sf Cc!q7_ky*x,WU
<view
o vZ~[#N'[.T0name="Tree View"ITPUB个人空间3_dL.@ p7rf
icon="icons/tree.GIF"
r+hVvV y:s0category="com.free.view.categoryall"ITPUB个人空间,h`z7S7K'Z^8C5k
class="com.free.view.treeview.views.TreeViewTest"ITPUB个人空间}jE Dv+ul+C
id="com.free.view.treeview.views.TreeViewTest">
+i7xSzs0</view>ITPUB个人空间x^Mw$H7h;`
</extension>
|P)gLN9Q6j_)IO~0
u#Op$WTei6v&[ \0</plugin>
-?3iFFX0“plugin.xml”实现了视图的扩展点“org.eclipse.ui.views”,Eclipse会根据扩展点的信息展现视图。


G6rp@1\-@0视图扩展点的实现类

ITPUB个人空间u"^Kn:kAIR X"q y,~
在“Tree viewer”视图中要完成的功能有:树、菜单、工具栏和事件响应事件。“Tree viewer”视图的实现类为“TreeViewTest”,通过实现类能实现这些功能。ITPUB个人空间 Sew)CJ \#_/Q
实现类中要完成如下的功能。
-D nMiF01. 初始化树。
0RZ `,s/v:M1P$b*_02. 完成菜单和工具栏响应的Action。
S!@ g(r&u$gKOF!\03. 完成上下文菜单。ITPUB个人空间9r(OE%D H#qu A
4. 完成工具栏。
x PeJta05. 完成双击树节点的响应方式。ITPUB个人空间uGNq `2U0V~E
在createPartControl方法中能对视图进行初始化,代码片段如下。
K7k5Y%~:e e0public void createPartControl(Composite parent) {
6pe J B0c2Hc3U ~ x0//初始化树
[7NGP:h0IG5{eG0viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);ITPUB个人空间,T ^T`g;{1r1T\
drillDownAdapter = new DrillDownAdapter(viewer);
+y)[N4a dN1G5M!_0viewer.setContentProvider(new ViewContentProvider());
P:jh B'B1`$k0viewer.setLabelProvider(new ViewLabelProvider());
*m I#x#?^a0viewer.setSorter(new NameSorter());
(r:]&da+B j/Z S:c4v0viewer.setInput(getViewSite());
`%f8t#V8^ en0//完成菜单和工具栏响应的Action
+c$F6T/W#e9s0makeActions();ITPUB个人空间c#F;ifEv
//完成上下文菜单ITPUB个人空间NN1q.AR ]jO{
hookContextMenu();
R;Z6w:d3cvt&p t6|0//完成双击树节点的响应方式
ZwE r2\DgQ0hookDoubleClickAction();ITPUB个人空间i[gn r#bfm Qf;?
//完成工具栏
.h1Yl5Z6?` z ]M;^:v0contributeToActionBars();
^ILK"B"X.v;y0}ITPUB个人空间$}6O-o3zK/X+bO K~
通过实现类,用户能加入自己感兴趣的功能。“Tree viewer”视图中实现类的完整代码如例程2所示。ITPUB个人空间 ew ^.c8z1?
例程2 TreeViewTest.java
:Mx@R"b@ {3`0public class TreeViewTest extends ViewPart {
i5qZO-\8Q/{ Y0private TreeViewer viewer;
9S\x+i(h8k} }0private DrillDownAdapter drillDownAdapter;ITPUB个人空间$?a1e7Xm&N
private Action action1;ITPUB个人空间 F SIuO g cq
private Action action2;
Qe|~*W)X.N"u0private Action doubleClickAction;ITPUB个人空间/~ D8P/a JQ
//创建树节点ITPUB个人空间?qJ([9w
class TreeObject implements IAdaptable {ITPUB个人空间qM8e;i!o4f9l)O
private String name;
X0?;X/k!J"Z {,AtF h0private TreeParent parent;
(\5y@DF2L?Q0
g$rCl o2Y7v0public TreeObject(String name) {ITPUB个人空间 {r.ou$\/i5b$g
this.name = name;ITPUB个人空间LR"`{.^6`
}
{;N[;f9JA|!L#^&l0public String getName() {ITPUB个人空间 }9Jx-pQ\N.U&l
return name;ITPUB个人空间"CW8d2} K
}ITPUB个人空间T;O bU'{K
public void setParent(TreeParent parent) {
NZ zwU%FV0this.parent = parent;
ZD"ZyG0}
$E a.a6I oN3g ?0public TreeParent getParent() {
?+V,Gd"J.x0return parent;ITPUB个人空间w2Y St5T3h&qpA
}ITPUB个人空间V Gh J!T L%}#h"K
public String toString() {ITPUB个人空间y R)`T7[ [;o II
return getName();
[R`"F H.l!Zs }0}ITPUB个人空间&Kyc5v2n+V5W j
public Object getAdapter(Class key) {ITPUB个人空间 cl/Ku:I+x;t*Gf
return null;ITPUB个人空间pH(N`5vK,FRM
}ITPUB个人空间9Y#wz&Z|0g[/m
}
M}7TP.h1C Y4C ~;c0ITPUB个人空间 j,H,Mg0IF/I L/h
class TreeParent extends TreeObject {
#dl#j,d7QEHN1E0private ArrayList children;
V#Di Rn7R0public TreeParent(String name) {
|:S/yQ8y h0super(name);
e|^0t9}'A.zy$M0children = new ArrayList();
bUAN;@5Eo[9i`0}ITPUB个人空间t.X'kzBch3j
public void addChild(TreeObject child) {
}sZaEq,[0children.add(child);
3C ?T}i%Z/Qj6y0child.setParent(this);ITPUB个人空间;rnV r Y;JB5N{
}ITPUB个人空间"Je6NIffWLP[
public void removeChild(TreeObject child) {ITPUB个人空间Rx a/W pXP*y R t
children.remove(child);ITPUB个人空间3o`*p`x
child.setParent(null);
mt(@ X3l4}#T]'j0}
4E5| Y{ nx J(Y,W0public TreeObject [] getChildren() {
1@/M2u Q,t/p0return (TreeObject [])children.toArray(new TreeObject[children.size()]);ITPUB个人空间3?,}J;E]8F
}ITPUB个人空间D:PJvrUnE
public boolean hasChildren() {ITPUB个人空间CD@9AW5J
return children.size()>0;
-}6h|D7M]*Fm2i0}ITPUB个人空间'yZ}0r v*TjA g
}ITPUB个人空间r V6?#~t w1q bMi+G
//实现内容提供器ITPUB个人空间 fa;s(s/W.ik
class ViewContentProvider implements IStructuredContentProvider,
ynE&@:~h/E\(EJ0ITreeContentProvider {ITPUB个人空间7]6{`^N b
private TreeParent invisibleRoot;
:p,hq2b!Q9r6?z OX#|0
hhu}AB)K8h0T0public void inputChanged(Viewer v, Object oldInput, Object newInput) {
ALoMC0}ITPUB个人空间 ?E5RY+aS$xB"qfeC
public void dispose() {ITPUB个人空间 W-X/j+w@)_6A
}ITPUB个人空间8iSr2@X Y2[2c9o
public Object[] getElements(Object parent) {
md7|.}sUq[8XL0if (parent.equals(getViewSite())) {ITPUB个人空间,s tKMEd Go%UC
if (invisibleRoot==null) initialize();ITPUB个人空间k8~MXrOhwd
return getChildren(invisibleRoot);
+s7kK9@Y+Q0}ITPUB个人空间1o:j"d9f?*K u n
return getChildren(parent);
8q;[.P p7HL0lF0}
q4nM7|6^q%^GC0public Object getParent(Object child) {ITPUB个人空间;mYv k[8B
if (child instanceof TreeObject) {ITPUB个人空间*k)O)x"s,Mm6{
return ((TreeObject)child).getParent();
xW@S*u1g0}ITPUB个人空间 G_4^[,h
return null;ITPUB个人空间D C4q{6W
}
q+{*uu F0public Object [] getChildren(Object parent) {ITPUB个人空间e6}^)rs7gt
if (parent instanceof TreeParent) {
7?S/\W`0a$V9Rd0return ((TreeParent)parent).getChildren();
B6hkj^Ru"]0}
$]w9`d1O6g0return new Object[0];ITPUB个人空间(u o/i-yJZ*{
}
,V7v @9J#^ j OMa0~0public boolean hasChildren(Object parent) {ITPUB个人空间'aY"c&G\ j*uu
if (parent instanceof TreeParent)
oQ7SH m w6R-C0return ((TreeParent)parent).hasChildren();ITPUB个人空间*U1] R Z){_/yv
return false;ITPUB个人空间j3_wvJ Q7[%U
}ITPUB个人空间(A%Q-{{&O#p4t
//初始化树节点
xa.}I%R0private void initialize() {
+B$R'\#F}&f7o0TreeObject to1 = new TreeObject("Leaf 1");ITPUB个人空间9Kg,]8^u(M
TreeObject to2 = new TreeObject("Leaf 2");
]sn"Ge1B3q,L { }0TreeObject to3 = new TreeObject("Leaf 3");ITPUB个人空间R0YSr\-YH S%OS
TreeParent p1 = new TreeParent("Parent 1");
[-l({?$l@? y&@0p1.addChild(to1);ITPUB个人空间9U-fs y1H&x3LN~y
p1.addChild(to2);ITPUB个人空间Kb5YM4O j!H
p1.addChild(to3);ITPUB个人空间"cp}K&hX)Q

5Dy CC7ED0TreeObject to4 = new TreeObject("Leaf 4");
.vt1Gb-B.}A0TreeParent p2 = new TreeParent("Parent 2");ITPUB个人空间HS,{? B&[Sa&|N
p2.addChild(to4);ITPUB个人空间^^Il/nX c@,N
ITPUB个人空间2DQ:LY-y%p
TreeParent root = new TreeParent("Root");ITPUB个人空间`#CFP8m0rg
root.addChild(p1);
IZ!Q\k$_i Nj$j0root.addChild(p2);ITPUB个人空间-U"_za[(_/V d

&h^&x U AgYGmi7f0invisibleRoot = new TreeParent("");ITPUB个人空间C7l0N0_C!E'V#T
invisibleRoot.addChild(root);
T{"Cn)U9C&RC)[!]0}ITPUB个人空间@FJ"f3_R$I
}
q#Q+N*b|[ g!~0//实现标签提供器
N`/J\Q9Y0class ViewLabelProvider extends LabelProvider {
d wv Y^ie?6K*^0
nfgU.\m W*r7s.q0public String getText(Object obj) {
C8QZ9m+N9^_0return obj.toString();
YOA}IZZ0}ITPUB个人空间3u5? [)_)co
public Image getImage(Object obj) {
w&yIGGFC/ez&G5E0String imageKey = ISharedImages.IMG_OBJ_ELEMENT;ITPUB个人空间a!{ ckO'xpo5@:|
if (obj instanceof TreeParent)ITPUB个人空间^a7cqzc#a8m
imageKey = ISharedImages.IMG_OBJ_FOLDER;ITPUB个人空间p8hf,a FY
return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
.mr7w wibU)b t0}ITPUB个人空间OqB;KS4A}"N l*Hq
}
7|d_w7o.jy^8z0class NameSorter extends ViewerSorter {
O8sR"y$N+s T0}
c,UO1O)h2M0W%_0
/D)I u&lN-]])O*PV0public TreeViewTest() {ITPUB个人空间%}[7N5i4K [.N
}
y$tJY ` m\D0
d2C p8PH m-B;t0N0public void createPartControl(Composite parent) {
PB t@)e6g*S[$^0viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
9Y6a:Si \0drillDownAdapter = new DrillDownAdapter(viewer);
cR8tR\0viewer.setContentProvider(new ViewContentProvider());ITPUB个人空间5g/A jnYgtQ
viewer.setLabelProvider(new ViewLabelProvider());
NTg `%a0viewer.setSorter(new NameSorter());ITPUB个人空间7P3sg9U7{!}/v#r
viewer.setInput(getViewSite());ITPUB个人空间.k Q7xK${CE:k
makeActions();
(i6[j$J*W+Cdv k0hookContextMenu();ITPUB个人空间 TI0z8G*cM3NU
hookDoubleClickAction();
{(V [hF!Nz0contributeToActionBars();ITPUB个人空间 @K[-B{BY
}
H{}$EK DdV0//提供右键菜单ITPUB个人空间$y1hGeH@y2r;E0mG
private void hookContextMenu() {ITPUB个人空间.H'^d6U^&m\
MenuManager menuMgr = new MenuManager("#PopupMenu");
:@,TM4\fQ8Yg0menuMgr.setRemoveAllWhenShown(true);ITPUB个人空间8v7b'].v-?.P
menuMgr.addMenuListener(new IMenuListener() {ITPUB个人空间y5P:d`9Q p `4Xc
public void menuAboutToShow(IMenuManager manager) {ITPUB个人空间\ Zo-].Ju;i
TreeViewTest.this.fillContextMenu(manager);ITPUB个人空间m[!u/R@J
}ITPUB个人空间*k$OidaR
});
Q/Yg#j,wq$B}0Menu menu = menuMgr.createContextMenu(viewer.getControl());
(R2u&F|K;L"u0viewer.getControl().setMenu(menu);
"@wl#y.k0X)D-[0getSite().registerContextMenu(menuMgr, viewer);ITPUB个人空间v9s8]:nY1n
}ITPUB个人空间u;c#Hq5smt
//提供视图工具栏
~4kz5xH$uP G xB0private void contributeToActionBars() {
`(m$A3S |9M0IActionBars bars = getViewSite().getActionBars();ITPUB个人空间3]c:mh xts
fillLocalPullDown(bars.getMenuManager());
bl9g{G0fillLocalToolBar(bars.getToolBarManager());
F-`:be"S p ?0}
Qr2j,b:H$~X0ITPUB个人空间1FOuv.e-_*W ^iD
private void fillLocalPullDown(IMenuManager manager) {ITPUB个人空间Rofb.cn
manager.add(action1);ITPUB个人空间F H,dP1XT'sF
manager.add(new Separator());ITPUB个人空间nAr-P-mf8t,~
manager.add(action2);
vw#r,~[7x:V:d V0}
,PzF{P0//填充菜单
'K ll Z'X/GF)VR*Z7Z0private void fillContextMenu(IMenuManager manager) {ITPUB个人空间|-L)xE9w/D
manager.add(action1);ITPUB个人空间$m*[/U?k*m n1Bc
manager.add(action2);
Q)CM!v.F%Z!tbA4d8f L0manager.add(new Separator());
l M4j4u,m$q2q0drillDownAdapter.addNavigationActions(manager);
&O`;q5N L0// Other plug-ins can contribute there actions here
\YzYauq@ q:G0manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));ITPUB个人空间UE2t.amG)dLJ n
}
ct|;j1z:?0
Zf n5xW!L0private void fillLocalToolBar(IToolBarManager manager) {
'c9hW t V0manager.add(action1);ITPUB个人空间6~4Qh+Zz JO4s
manager.add(action2);
dPd@:np0manager.add(new Separator());ITPUB个人空间z3oy9Zq3{ d$k_
drillDownAdapter.addNavigationActions(manager);ITPUB个人空间xt$bNPxu0e
}
TGs3M![/M ETt0//创建菜单和工具栏对应的Action
5dukwn0private void makeActions() {ITPUB个人空间$f r#^9G9k/l
action1 = new Action() {ITPUB个人空间a;Eh5i~t
public void run() {ITPUB个人空间P@DSAE d7s%\7YX
showMessage("Action 1 executed");
a2V;@.P,Q$[%a0}ITPUB个人空间5s u0C1r*g H
};
B3{&z/c a0action1.setText("Action 1");
A]Z T6kr(_0action1.setToolTipText("Action 1 tooltip");ITPUB个人空间"K'L$^N4Jj%[
action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
7r)Iax u$\0getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
"p:`IT _7r!s0
WW4Jt,k"X j/r0G0n-mT0action2 = new Action() {
G:Ip"[q$XK7[+R0public void run() {ITPUB个人空间e7_.X-{&b@.k,TK
showMessage("Action 2 executed");ITPUB个人空间4|I_yM
}
gv[ vz8D0};
F'\&P0tg*\0action2.setText("Action 2");
'M-`o\e+O7n"k b'A0action2.setToolTipText("Action 2 tooltip");ITPUB个人空间 IxC$KObyo4}y
action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().ITPUB个人空间!?6xQp~3Bk*B
getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
1MW2m lP'@0doubleClickAction = new Action() {
1|VjbG1a3]*y1J^_0public void run() {ITPUB个人空间!C!T4\.YV9H%e0x/b
ISelection selection = viewer.getSelection();ITPUB个人空间e {:yW L8F6m zh
Object bj = ((IStructuredSelection)selection).getFirstElement();
z8U(^8?/bo0showMessage("Double-click detected on "+obj.toString());ITPUB个人空间:gH2cLO/N]*N
}ITPUB个人空间5}i;Y:d)A)K
};ITPUB个人空间S'?K.@L4]K
}ITPUB个人空间*qmwmo)XV

6j&tx#Jg$w0private void hookDoubleClickAction() {
*U(V|2t[ k8E r0viewer.addDoubleClickListener(new IDoubleClickListener() {ITPUB个人空间6hZI&PK8Au
public void doubleClick(DoubleClickEvent event) {
HAYA(H$Q(~0doubleClickAction.run();
+a? U$A2O D4e0}ITPUB个人空间3d,mt"?.t^
});ITPUB个人空间(s(Lj+a8E6tP B~jb
}ITPUB个人空间#t:M yp/Awf;H
private void showMessage(String message) {
/Yg1yq:`%N$L0MessageDialog.openInformation(ITPUB个人空间'| rh/]m4Q"Hg,a
viewer.getControl().getShell(),
(mSz(y TOe-@ B0"Tree View",
0pcJ.E5n vM0L9Q0message);ITPUB个人空间+Dk"MwEk1|,l
}ITPUB个人空间c%R J8d/S I L a
//响应获得焦点
3U-z Lsf4]0public void setFocus() {ITPUB个人空间l4Oo)EhW
viewer.getControl().setFocus();ITPUB个人空间'cR_ A.s*Ng
}
8cp G7t2d9[0}ITPUB个人空间 j9]&i[3|5re3GW,S
上例中通过内容提供器(ViewContentProvider)、标签提供器(ViewLabelProvider)及树节点(TreeObject)的定义提供了树的实现,另外通过createPartControl方法实现了相应的菜单和工具栏。
d%a6U+d\{Z&E0提示:本例中右键菜单和工具栏的实现方式非常值得效仿,而且非常直观,读者可以比较一下在SWT中的实现方式,找到它们之间的异同点。


U3u7w7[ }:W)P$E9T0运行“Tree viewer”视图


mL:\+DST@tu k0“Tree viewer”插件到此就已经完成,现在可以调试插件了。
6G(] e O)y8\9d,?GP01. 运行插件。
y5_ ]qC c lE02. 打开运行时工作台的“Show View”。
F[M A0d9`jr0在“Show View”窗口中可以看到前面建立的分类和视图节点。
@2p0V:Rk f%I03. 运行“Tree viewer”视图ITPUB个人空间3@&fZ-QF4fk
双击“Tree View”节点,打开视图窗口,如图4所示。
V4`0xg.S+yVi0


A l(hkit\0图4 “Tree viewer”视图


G0Q(s&dRQ0在Eclipse插件的开发中,视图插件的开发是比较重要的一个部分。视图是工作台页面内的可视组件,用户可以通过视图,扩展Eclipse原有的功能。


h3o6b:ZD a#P3Y0下载(com.free.view.treeview.rar)


G8Ms8T-F/s$`a:r0 


TAG:

引用 删除 Guest   /   2011-08-02 12:27:35
-5
引用 删除 Guest   /   2011-07-13 15:00:14
引用 删除 Guest   /   2011-05-25 13:44:11
1
引用 删除 Guest   /   2011-02-18 14:58:31
5
引用 删除 Guest   /   2010-11-17 11:10:05
5
引用 删除 dfgher   /   2009-12-11 15:19:43
20.5万,金山软件Office插件开发大赛  任务悬赏金额:205000元  时间:79天 任务地址:http://www.违规广告.com/task/iv/170046
引用 删除 chang_q   /   2009-03-09 17:42:04
学习了
引用 删除 chang_q   /   2009-03-09 17:41:04
asdf
引用 删除 Stringle   /   2008-08-27 15:54:00
请楼主和各位有没有TreeViewer的详细使用说明?比如节点的展开和收缩等事件是如何处理的?
引用 删除 Guest   /   2008-07-25 09:41:12
5
引用 删除 阿甘   /   2008-07-07 08:45:03
improt放进来就太多了
你可以使用ctrl+shift+o快捷键自动引入所有的包
Wan Hong的个人空间 引用 删除 romatic   /   2008-07-05 20:41:10
5
引用 删除 yhs8983   /   2008-07-04 13:53:24
想给大师提个意见,希望以后代码的import以后也能一起给出来,也占不了几行,万一有些插件没有安装,也知道缺的是哪个插件。
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2012-02-10  
   1234
567891011
12131415161718
19202122232425
26272829   

数据统计

  • 访问量: 45770
  • 日志数: 43
  • 文件数: 11
  • 建立时间: 2008-02-14
  • 更新时间: 2008-09-05

RSS订阅

Open Toolbar