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

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

ITPUB个人空间O,{4ct?v0W*C-c@
视图是工作台页面内的可视组件,通常用来浏览信息的层次结构(如工作空间)、打开编辑器或显示活动编辑器的属性。用户可以通过“Window”→“Show view”菜单显示视图,也可以从视图局部标题栏关闭视图。

ITPUB个人空间bh$t#}z)]
视图分类

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

ITPUB个人空间)f4j b1ONK U
图1 Eclipse视图

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

ITPUB个人空间5NPJs!R
图2 选择视图

ITPUB个人空间,FQ:u v"Q)gE+f?yn
常用视图可实现的功能

ITPUB个人空间 eA^xD*RgA
Eclipse的视图就功能来说一般有两种形式,一种是功能性视图,例如Java的Default视图,default负责用树形目录组织Java的项目结构,并且能通过双击节点在编辑器中打开相应的资源。另一种视图是辅助型的视图,例如Console负责控制台信息的显示。
t8|*@3]"K"r0不管是哪种类型的视图,它们的实现原理是一样的。在Eclipse中视图可以实现的功能有如下一些。ITPUB个人空间9gSL/LS Py#r'C
 右键菜单:可以通过视图中的树、表弹出的菜单完成相应的功能。ITPUB个人空间9`9QbEw'El{ BSf%T
 工具栏:可以定制视图的工具栏,完成当前视图的功能。ITPUB个人空间7m9D.~|D*N{j-Mv
 表格:视图中可以加入表格以显示相应的表结构信息。ITPUB个人空间{\7u%U2E&M"e7} Q
 树:视图中可以加入树结构以显示相应的树结构信息。ITPUB个人空间/~Cj5x8gH8{
 Log 输出:视图中可以直接输出信息。
E(vOb@0这些只是一般在Eclipse中可以看到的实现,用户可以把视图当做操作Eclipse接口。
g?7]4X$WEP0提示:任何SWT的组件都可以作为视图的一部分,用户可以按自己的需求定制自己的视图。


T-M3N't$Os1B;U0创建“Tree viewer”视图

ITPUB个人空间8BEEu"aY'V
创建“Tree viewer”视图插件项目,步骤如下:ITPUB个人空间f^ w3gXA5ag
1. 打开新建向导。
5Q$RAPO,b/p,`k0单击Eclipse的“File”→“New”→“Other”菜单项,在弹出的对话框中选择Select对话框左边的 Plug-in Development 向导。ITPUB个人空间'?#C SB9h}.q
2. 建立一个空的插件项目。
4Xo$h4?`0 输入插件工程的名字为“com.free.view. treeview”。
$T\3k2~0^0BI0 输入插件的ID为“com.free.view.treeview”。
F `e6ya0 输入插件的Name为“helloworld Plug-in”。
-uN?K2E!T0t^t0 选择使用模板建立插件项目,如图3所示。ITPUB个人空间 c6s#J)oF j0nJ
 单击“Next”按钮,选择“Tree viewer”选项。
S!ati2pl N0 单击“Finish”按钮,完成项目的建立。
D[i#en~L ^ RD0

ITPUB个人空间2HZ [-^}E|%h{N
图3 选择插件模板对话框


4T,}i+Y*I'lN v:N0通过这种方式建立了一个包含JFace的“Tree viewer”组件的插件项目,此项目已经具备了视图插件常用的功能。

ITPUB个人空间PPK#A5D
视图扩展点


[%nY&b/\hE0通过插件模板创建了“Tree viewer”视图插件,此插件只实现了一个视图分类节点和视图节点。如例程1所示。ITPUB个人空间`$l?%f zb@+w3f4r
例程1 plugin.xml
s$B1\X$Tx0<plugin>
B$R'la TI1CN0
PAO.t(x!S1k0<extensionITPUB个人空间SGg2sN1oKY7GHR
point="org.eclipse.ui.views">
6\ jgmY6g0<categoryITPUB个人空间$p1O]{H4bK[
name="tree view"ITPUB个人空间ico"xaS
id="com.free.view.categoryall">ITPUB个人空间#P:_6a!?1ki6d
</category>ITPUB个人空间6Gx hCZ3B5{y1S4b
<viewITPUB个人空间V3G5ft@ ?(EA-h7Q;e
name="Tree View"
PB&@"B,k:~(G d6]0icon="icons/tree.GIF"ITPUB个人空间1c \:lvHR1z\
category="com.free.view.categoryall"
]F3KIF0class="com.free.view.treeview.views.TreeViewTest"
R(}3@ J1h!_,S1Z1H"dg0id="com.free.view.treeview.views.TreeViewTest">ITPUB个人空间*R7DLx X@!T!{Y4w
</view>ITPUB个人空间7gxf]lr.W_7T
</extension>
X-muITu;}6Z0ITPUB个人空间 _&B,Yjc"Q)g}
</plugin>
bCM ^ t0“plugin.xml”实现了视图的扩展点“org.eclipse.ui.views”,Eclipse会根据扩展点的信息展现视图。

ITPUB个人空间U+v^-v(a V{
视图扩展点的实现类

ITPUB个人空间}h3Dpyw~"F
在“Tree viewer”视图中要完成的功能有:树、菜单、工具栏和事件响应事件。“Tree viewer”视图的实现类为“TreeViewTest”,通过实现类能实现这些功能。ITPUB个人空间7g%^$q|!n
实现类中要完成如下的功能。ITPUB个人空间7G*CRZ i
1. 初始化树。
/Ro`]J q(MX02. 完成菜单和工具栏响应的Action。ITPUB个人空间n-h-sf?VK9A
3. 完成上下文菜单。
-y:ClF&? z&G.` v_04. 完成工具栏。ITPUB个人空间0xWb/OtGA#x qm6C%w
5. 完成双击树节点的响应方式。ITPUB个人空间k A!I\U.a
在createPartControl方法中能对视图进行初始化,代码片段如下。
SiU!c,A0public void createPartControl(Composite parent) {
5JHT,l@vO0//初始化树
j\1ISKS(x:r0viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
v6`"Ud&I(H0rn3a0drillDownAdapter = new DrillDownAdapter(viewer);
^C:J B&m t0viewer.setContentProvider(new ViewContentProvider());
\(k i/LE?E}0viewer.setLabelProvider(new ViewLabelProvider());
D*G(}V3Aw2b0viewer.setSorter(new NameSorter());
e,g+K5jo L0viewer.setInput(getViewSite());
pwua DOj~0//完成菜单和工具栏响应的ActionITPUB个人空间9J^x*]9G p.L/Dlh
makeActions();ITPUB个人空间r0d1_(G {5s7g#E
//完成上下文菜单ITPUB个人空间1{%ep;cF(F
hookContextMenu();ITPUB个人空间%F#[ k Qk0S&q
//完成双击树节点的响应方式ITPUB个人空间$TW J0@t5F m
hookDoubleClickAction();
zs&R9T J2h0//完成工具栏ITPUB个人空间d h%aN/@,z amQ-c ^
contributeToActionBars();
I fS@;@ T1q0}ITPUB个人空间.ri:ucYp
通过实现类,用户能加入自己感兴趣的功能。“Tree viewer”视图中实现类的完整代码如例程2所示。ITPUB个人空间$n5G![$b5o
例程2 TreeViewTest.java
%KG&U Ml(Q/Vg0public class TreeViewTest extends ViewPart {
j$j5c h]8{&@0private TreeViewer viewer;
7[Q3Ku#t_-su0private DrillDownAdapter drillDownAdapter;ITPUB个人空间 Q\?5s7Xj9^ n^
private Action action1;ITPUB个人空间H/_0v.@ ZS~
private Action action2;ITPUB个人空间L"^2cVt`_Ue
private Action doubleClickAction;ITPUB个人空间] x y7M3g&\ L
//创建树节点ITPUB个人空间 EQ9h?8tB:K}nj
class TreeObject implements IAdaptable {
0I#f4Oh A4R%}+Rbr0private String name;ITPUB个人空间C vYm sfHb
private TreeParent parent;ITPUB个人空间9l#|7E"mi1_MNoioG
ITPUB个人空间I A~ ~&~,|
public TreeObject(String name) {
1FN`E7PCy)Zj0this.name = name;ITPUB个人空间 s{x9q$tU:P
}ITPUB个人空间7c"MM"k:Js#w6C
public String getName() {
M1I!u%Kfl1t P cqn0return name;ITPUB个人空间 rYCVL6d
}
(o[}0@`eE z0public void setParent(TreeParent parent) {
LbVG2zc!}/?;r$oM0this.parent = parent;ITPUB个人空间Yc;m `Z;W%rK t
}ITPUB个人空间D,U.Q.cXq.{,} z
public TreeParent getParent() {ITPUB个人空间^%i4I#p+V)|
return parent;ITPUB个人空间{*tD&A*x9F$Ew)J
}
O$l-B)HKC|i+d0public String toString() {
5okW;f.s8Gd }LS0return getName();ITPUB个人空间H-D%_*J4K+}}~]6^&~
}ITPUB个人空间mL:c"vM*S ^ y {
public Object getAdapter(Class key) {ITPUB个人空间%[*gIL U0A/N!E
return null;ITPUB个人空间l3pPH nJ*M
}ITPUB个人空间LJ:e:d l,wD
}
zY1RKB z+e0
d\*wq#y6kRW0class TreeParent extends TreeObject {ITPUB个人空间 k2Rv,@{%f
private ArrayList children;
jgi `m8}-[/g-J0public TreeParent(String name) {ITPUB个人空间[0]-vppR"u
super(name);
m7h;j8@M*r3e0children = new ArrayList();
~v {0U7o'pk0}
8@;B;m'Z-Lx7L"z7nr0public void addChild(TreeObject child) {ITPUB个人空间:l-NOi.?+^"A
children.add(child);ITPUB个人空间@ I1H;@yW~
child.setParent(this);ITPUB个人空间 M;BuUB4Z+x(Aq3T
}ITPUB个人空间@2E?8Q.A:[&eKCIP
public void removeChild(TreeObject child) {ITPUB个人空间%_7^` q-p Jj
children.remove(child);ITPUB个人空间!k7{"F w%@7n'R#pBs
child.setParent(null);ITPUB个人空间+c v%oG c
}
eGK*M jkv4l0public TreeObject [] getChildren() {
9xg9^ bP`o'{6S0return (TreeObject [])children.toArray(new TreeObject[children.size()]);ITPUB个人空间?l*lv%V
}ITPUB个人空间6H h0B.WIk,k d
public boolean hasChildren() {ITPUB个人空间!O4N+u|w nuq
return children.size()>0;ITPUB个人空间u Y6l#n7qd6NpD
}
1pBw S7Q/K0}
ZU0Jn^X o^Q0//实现内容提供器
K&?"y,IXN6AO8u0class ViewContentProvider implements IStructuredContentProvider,
dP;[ b!O+Y$nrw0ITreeContentProvider {ITPUB个人空间3r%cdO ]&l
private TreeParent invisibleRoot;ITPUB个人空间aGZ)?5F,p8jl

sj:R$ZX$nHw SH0public void inputChanged(Viewer v, Object oldInput, Object newInput) {ITPUB个人空间P F}@Wf
}ITPUB个人空间Y's0f&oV1c&X
public void dispose() {ITPUB个人空间LU(g;RniJ8sX8s
}ITPUB个人空间X$_9hk*o9f'D?]6S
public Object[] getElements(Object parent) {ITPUB个人空间 cPh$J~NE#B"Q8f Z&M
if (parent.equals(getViewSite())) {
RqhOxy'~r[*i0if (invisibleRoot==null) initialize();ITPUB个人空间*n [p$b:Z-k~
return getChildren(invisibleRoot);
"a#H1E`C#G0}ITPUB个人空间2e'Q)[6M!h6[
return getChildren(parent);ITPUB个人空间%x-pc"CC/j,c-B
}ITPUB个人空间K)w7C;|)@'bu&N
public Object getParent(Object child) {ITPUB个人空间z)|'p:j2V A\
if (child instanceof TreeObject) {
8P:Ge3e,G/\od2]-{0return ((TreeObject)child).getParent();ITPUB个人空间(^.Y9oWBL
}
|E+w$N4U{r^ {!d0return null;
)^3H/C*kk+Wn:U+rc0}ITPUB个人空间GjBCQ1s
public Object [] getChildren(Object parent) {ITPUB个人空间'N#[ox4F0h*[
if (parent instanceof TreeParent) {
#a K9}hy7m5C0return ((TreeParent)parent).getChildren();
d4pcdp@k0}ITPUB个人空间~i.x?n@U*B4F
return new Object[0];ITPUB个人空间'x(i6n([_Bl:x
}
s Jgt h2xv h Oz0public boolean hasChildren(Object parent) {ITPUB个人空间0thPO7`u9C
if (parent instanceof TreeParent)
[4A5F|"Z?7\~0return ((TreeParent)parent).hasChildren();ITPUB个人空间%R9^*A1dr['Q
return false;
_S^m(L1i0}ITPUB个人空间.r!t W`?;t`o;H^
//初始化树节点ITPUB个人空间^/aM1[6dA8v~,ZwV%Z0Sk
private void initialize() {ITPUB个人空间8_ yJ?.u)k"x"\
TreeObject to1 = new TreeObject("Leaf 1");
bRb7o/PJ0TreeObject to2 = new TreeObject("Leaf 2");
Mlx;GLzB*rS0TreeObject to3 = new TreeObject("Leaf 3");ITPUB个人空间;EP]Dp/b
TreeParent p1 = new TreeParent("Parent 1");ITPUB个人空间U N_-D.sz]u
p1.addChild(to1);
(c#t.Na+M2Z}5F0p1.addChild(to2);ITPUB个人空间G Mq&@#X`
p1.addChild(to3);
LrJ2`;s0ITPUB个人空间;@VK1@&pp$k
TreeObject to4 = new TreeObject("Leaf 4");
o"sR.{ZG7Y0TreeParent p2 = new TreeParent("Parent 2");
1x8j^nP3g^l2T0p2.addChild(to4);
4e-Q/O/Y[0ITPUB个人空间G iBq\0?O
TreeParent root = new TreeParent("Root");
_,e J K'Hh'W0root.addChild(p1);
C/A*hYS~0root.addChild(p2);
Aw?6c*SN)\p0ITPUB个人空间 u+Jhp+T#v
invisibleRoot = new TreeParent("");ITPUB个人空间3_y7D)w W.sh0E
invisibleRoot.addChild(root);
KL8J(oS.x0}ITPUB个人空间)`x&_+DG8e
}ITPUB个人空间+D:^9O H m/AK
//实现标签提供器ITPUB个人空间6HrC7Mt7O9Lv
class ViewLabelProvider extends LabelProvider {ITPUB个人空间)IaQ(k'E ^4wVXV

%aC6h,s`mB}+F0public String getText(Object obj) {ITPUB个人空间GT nnf
return obj.toString();ITPUB个人空间,\N w;VuY(ef.CY7N
}
Dyxn`|0public Image getImage(Object obj) {
#[Z;n1bnf@*K0String imageKey = ISharedImages.IMG_OBJ_ELEMENT;ITPUB个人空间O X$R D2e6nt
if (obj instanceof TreeParent)
8{Z_3~e'[0imageKey = ISharedImages.IMG_OBJ_FOLDER;
"Dm a1DM{_%d0return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);ITPUB个人空间n,Gd$aRP.YF\:II4_
}ITPUB个人空间[ E1V#]%Pz p
}
sZ Vl:h8mq0class NameSorter extends ViewerSorter {
;v2k@-vJA K*C3{`0}ITPUB个人空间;H'sk6E3Qn Vl
ITPUB个人空间{g5C7n%]]I!q
public TreeViewTest() {
D*t*s^'nixS*w0}ITPUB个人空间#|6lY({1g'`)K

;h r\f+K k?jR q0public void createPartControl(Composite parent) {ITPUB个人空间I2WGGCqO
viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);ITPUB个人空间c.T kg%k
drillDownAdapter = new DrillDownAdapter(viewer);ITPUB个人空间!pBd K R%a
viewer.setContentProvider(new ViewContentProvider());ITPUB个人空间'e"I Y9P)\ezc$[@
viewer.setLabelProvider(new ViewLabelProvider());ITPUB个人空间i#{/PQ*@@ A;O
viewer.setSorter(new NameSorter());ITPUB个人空间(z)u3v&Q(Ra5vs
viewer.setInput(getViewSite());ITPUB个人空间!e:u%uC3ySA {"p
makeActions();
?almy(U3[0hookContextMenu();ITPUB个人空间Q ~epa&]P]3R m
hookDoubleClickAction();
o6fFmvZ0contributeToActionBars();ITPUB个人空间I/BIL\;~;Xo
}
t;qHOe&m+J8wF0//提供右键菜单ITPUB个人空间}]3Z+u-J
private void hookContextMenu() {
1}5y ] {7j n|l0MenuManager menuMgr = new MenuManager("#PopupMenu");ITPUB个人空间3R G}9X!X#r
menuMgr.setRemoveAllWhenShown(true);ITPUB个人空间'~%k:Ay%}3|%jO
menuMgr.addMenuListener(new IMenuListener() {ITPUB个人空间o o,J@?
public void menuAboutToShow(IMenuManager manager) {
~'QAq0V A y0TreeViewTest.this.fillContextMenu(manager);
k;t;uB+y7w0}ITPUB个人空间;`,NZjuc [M
});ITPUB个人空间Ok3bX(^6l3hHA3}
Menu menu = menuMgr.createContextMenu(viewer.getControl());
lJol }a0viewer.getControl().setMenu(menu);
[0g:}0`#I*cI0A0getSite().registerContextMenu(menuMgr, viewer);
.C zKj)y?0}
wP2A]f2w u7|0//提供视图工具栏
,y7H6v p+{c#S0private void contributeToActionBars() {ITPUB个人空间0l GY`9C3v
IActionBars bars = getViewSite().getActionBars();
-l @K,TZ@0fillLocalPullDown(bars.getMenuManager());ITPUB个人空间 w3Tu/N6IwU[f
fillLocalToolBar(bars.getToolBarManager());ITPUB个人空间uf0y9LQn@
}ITPUB个人空间 s%\6WxP u3RN u#q Z

~i IBz&f*p0private void fillLocalPullDown(IMenuManager manager) {ITPUB个人空间} MGN9h
manager.add(action1);
W ?&Aj0n|0manager.add(new Separator());
_$I;[k2B-p0aS0manager.add(action2);ITPUB个人空间8h!v:x:}0Xw ?3|9rCR
}ITPUB个人空间+`_2q$hr&t/V5v'j
//填充菜单
"Y Wb+P5|1\0C0private void fillContextMenu(IMenuManager manager) {
D/~ }\*tr)A s0manager.add(action1);ITPUB个人空间+f(|? Z q~(W
manager.add(action2);
9X#PWR!|#A/F0manager.add(new Separator());
)e2@$]/e uw0drillDownAdapter.addNavigationActions(manager);ITPUB个人空间.G#k.f.`/]5W
// Other plug-ins can contribute there actions here
z)NR8YS+Q,O)a]0manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));ITPUB个人空间?k)ly']@H
}ITPUB个人空间+s#H{U*]tVG
ITPUB个人空间"U+k ?Hns
private void fillLocalToolBar(IToolBarManager manager) {
|Lq,VT7CK0manager.add(action1);ITPUB个人空间L.gc#Z5V f8~}+U
manager.add(action2);ITPUB个人空间+^/OP U o3~)hyt
manager.add(new Separator());
]5J.\T1I `3v0drillDownAdapter.addNavigationActions(manager);
,Bj{n"L0}ITPUB个人空间 b3?6y:[ A
//创建菜单和工具栏对应的Action
3R6lJ M-@5xF s4y0private void makeActions() {ITPUB个人空间m'LxJ)N%k^
action1 = new Action() {
-TL6j*DP(}@0public void run() {
m ]1f+LWx5^9Z |A.T0showMessage("Action 1 executed");ITPUB个人空间 I1S,O'{i!Q!V
}
$XH l}r0};
6p)Q x%e,q!Z:eB0action1.setText("Action 1");ITPUB个人空间E_)XFk}
action1.setToolTipText("Action 1 tooltip");
Q&K&Y5?'{B\'u7B0action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().ITPUB个人空间k+GM4e},OX w }
getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));ITPUB个人空间7m8C Z2I_qY-]0H d

N1w)u@:^+I WL!@0action2 = new Action() {ITPUB个人空间.^*c|.KP X)x-Bw;\
public void run() {
X}Pp8X`7ZY)}0showMessage("Action 2 executed");ITPUB个人空间KjQ zX` B9?.J
}
A/p8WID^8U@0};
kPan3a*w0action2.setText("Action 2");
[BOT1u tj |*R0action2.setToolTipText("Action 2 tooltip");ITPUB个人空间 V9}3sq u_
action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
VrY|e8D_*H!Sn0getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
v)IWZ,o5o^0doubleClickAction = new Action() {ITPUB个人空间;O m{M?2N/|
public void run() {ITPUB个人空间Q S2Oo&p"M
ISelection selection = viewer.getSelection();
"q;m*[hP[}+|2vRXZ0Object bj = ((IStructuredSelection)selection).getFirstElement();ITPUB个人空间 }R u'aA5H*[S(BL
showMessage("Double-click detected on "+obj.toString());
`~g6`%L9~ n[7wu0}ITPUB个人空间*K2{^8U4zQ
};ITPUB个人空间w |6_ o} e/j
}ITPUB个人空间tu[i{P|%b

yh @ Nw0private void hookDoubleClickAction() {ITPUB个人空间x-x(mg+C
viewer.addDoubleClickListener(new IDoubleClickListener() {ITPUB个人空间 \|6]+^Xw!OC
public void doubleClick(DoubleClickEvent event) {ITPUB个人空间0dI3@%m2a,g6N^
doubleClickAction.run();
WmYg9Eq0}ITPUB个人空间7V7fC:y&YVG8|%B!l
});
:m&{3W"Ap r } ]l0}
#k n!o(^%s,_8g0private void showMessage(String message) {ITPUB个人空间%[Y A4a7C-N'a8z
MessageDialog.openInformation(ITPUB个人空间-HvMVhFQC7IY%J
viewer.getControl().getShell(),
;Hl M pqdM z,m T$h0"Tree View",ITPUB个人空间'{:H,og/c A7f
message);
3v+F/r ~U0}ITPUB个人空间ev8a(jOl ^
//响应获得焦点
8SEI-{j7A0public void setFocus() {ITPUB个人空间/X8{oJ F;hd
viewer.getControl().setFocus();ITPUB个人空间9G-ECt_5|
}ITPUB个人空间!VYJA ?%]iQ
}ITPUB个人空间b)Suc1xdI6q
上例中通过内容提供器(ViewContentProvider)、标签提供器(ViewLabelProvider)及树节点(TreeObject)的定义提供了树的实现,另外通过createPartControl方法实现了相应的菜单和工具栏。ITPUB个人空间7Le8l2i:YAP6j
提示:本例中右键菜单和工具栏的实现方式非常值得效仿,而且非常直观,读者可以比较一下在SWT中的实现方式,找到它们之间的异同点。


j h/k|5P^0运行“Tree viewer”视图

ITPUB个人空间cQ0{ ]m J Z \h
“Tree viewer”插件到此就已经完成,现在可以调试插件了。ITPUB个人空间 g1f T3Nt3@8M
1. 运行插件。ITPUB个人空间lf5s k }X$Oj[hE
2. 打开运行时工作台的“Show View”。
By5})XvSv`^S0在“Show View”窗口中可以看到前面建立的分类和视图节点。
6@T-j%q1HI.yC03. 运行“Tree viewer”视图
@&Cw%q*r7c9PP0双击“Tree View”节点,打开视图窗口,如图4所示。ITPUB个人空间,Q u7p `4s;w

ITPUB个人空间8I2DU,D!u$^X0K d-{
图4 “Tree viewer”视图


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

ITPUB个人空间y$Y*YeRh.[rs
下载(com.free.view.treeview.rar)


~}[\w o}s%A0 


TAG:

引用 删除 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 :( :)

日历

« 2009-07-03  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

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

RSS订阅

Open Toolbar