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

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


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

ITPUB个人空间OQ u\r_#fZ
视图分类


I,V-DD;o$x @0Eclipse中用户可以在同一时间打开多个视图(编辑器在同一时间只能打开一个),每个视图能够有自己的位置布局信息,Eclipse会根据上一次视图布局的信息初始化视图。ITPUB个人空间nK8s[x(T
Eclipse视图一般来说有两种表现形式,一种是用户通过视图扩展点“org.eclipse.ui.views”实现自定义的视图,另一种是实现Eclipse中视图提供的扩展,用户可以通过实现Eclipse的相应接口实现,如Outline视图和Properties视图,如图1所示。
g0sF'_[ ?,p1JB0


5TbPTjE]l7Z0图1 Eclipse视图

在Eclipse中,用户可以按自己的要求建立自己的视图,即扩展Eclipse的视图扩展点。也能实现Eclipse的接口,通过Eclipse的Adapter机制实现Eclipse的扩展。其中,Outline和Properties视图也是通过这种方式实现的,在后面的章节会介绍Outline视图和Properties视图的实现。ITPUB个人空间+P7Z u{#W:C
当用户定义了自己的视图后能通过“Window”→“Show view”菜单打开自定义的视图。如图2所示。
b mzh1|1WG-N \&F0


4rW(B"U0Kg/G0图2 选择视图


/EVk+a h)Rg0常用视图可实现的功能


"E `RrWk]!Na9k0Eclipse的视图就功能来说一般有两种形式,一种是功能性视图,例如Java的Default视图,default负责用树形目录组织Java的项目结构,并且能通过双击节点在编辑器中打开相应的资源。另一种视图是辅助型的视图,例如Console负责控制台信息的显示。
;g8R0]'C;u:p4k0不管是哪种类型的视图,它们的实现原理是一样的。在Eclipse中视图可以实现的功能有如下一些。
d g_A'M0 右键菜单:可以通过视图中的树、表弹出的菜单完成相应的功能。
ee$fCg#I+{a0 工具栏:可以定制视图的工具栏,完成当前视图的功能。ITPUB个人空间^z.a%VCC
 表格:视图中可以加入表格以显示相应的表结构信息。
Wv+e)k.jEgf p0 树:视图中可以加入树结构以显示相应的树结构信息。ITPUB个人空间Jmb `O%o2F
 Log 输出:视图中可以直接输出信息。
:`-E1EIoW [i.ER0这些只是一般在Eclipse中可以看到的实现,用户可以把视图当做操作Eclipse接口。
6vb4UU ^i0提示:任何SWT的组件都可以作为视图的一部分,用户可以按自己的需求定制自己的视图。


;} |/k(O*|TU0创建“Tree viewer”视图

ITPUB个人空间 ^ k!cd4lk5[P"h
创建“Tree viewer”视图插件项目,步骤如下:
;SV;we:x@C/x01. 打开新建向导。
!G&a6E^6ep4Iz0单击Eclipse的“File”→“New”→“Other”菜单项,在弹出的对话框中选择Select对话框左边的 Plug-in Development 向导。
{zoG-_h TGp02. 建立一个空的插件项目。
CuK@S%d e[8f0 输入插件工程的名字为“com.free.view. treeview”。ITPUB个人空间o4n8Kde3pa
 输入插件的ID为“com.free.view.treeview”。
LGQS"\[L*Z)O \0 输入插件的Name为“helloworld Plug-in”。ITPUB个人空间;Ij2K]Hk UK{ p
 选择使用模板建立插件项目,如图3所示。ITPUB个人空间N)X%O@m&oZTjZ4H
 单击“Next”按钮,选择“Tree viewer”选项。ITPUB个人空间g1^/l&B6sLBt
 单击“Finish”按钮,完成项目的建立。
Z,w7EH/|0


5kV3i Y S$U L)A7x yQT0图3 选择插件模板对话框


&xV Fd ZQ#YY6a2Z0通过这种方式建立了一个包含JFace的“Tree viewer”组件的插件项目,此项目已经具备了视图插件常用的功能。


bip._N"Y;^2X0视图扩展点


j7p^B|#h8Vy0通过插件模板创建了“Tree viewer”视图插件,此插件只实现了一个视图分类节点和视图节点。如例程1所示。
s Cs6k l:S1g,zKn0例程1 plugin.xml
o7OC9V*h5_7o0<plugin>ITPUB个人空间Tz6U{C4mo

a|U7[oE\{Fp,c%M0<extension
7|9j `9A%v$Py0point="org.eclipse.ui.views">
X`im7efm0<categoryITPUB个人空间 D,^] J)P#eY9h"d:m
name="tree view"ITPUB个人空间)zd h PP ^iSo
id="com.free.view.categoryall">
&}Z6]?o WVs0</category>
y5F!q'j~x%z0<viewITPUB个人空间&wV s ~9?2y:lwE
name="Tree View"
^0{!i3t"s b5D0icon="icons/tree.GIF"ITPUB个人空间 k-J+B+pK;E E_3p
category="com.free.view.categoryall"
2Jae,LWW0class="com.free.view.treeview.views.TreeViewTest"
T*l r1gy.E q/j7X6K@0id="com.free.view.treeview.views.TreeViewTest">ITPUB个人空间6A4X6V|1Z
</view>ITPUB个人空间7wJB8eR}hh
</extension>
H-y q5M/[*w0
S sc,Z-Q0</plugin>ITPUB个人空间j/R7R(Y5Tf
“plugin.xml”实现了视图的扩展点“org.eclipse.ui.views”,Eclipse会根据扩展点的信息展现视图。

ITPUB个人空间C]P1Wf a:U
视图扩展点的实现类

ITPUB个人空间M,^7g1LX
在“Tree viewer”视图中要完成的功能有:树、菜单、工具栏和事件响应事件。“Tree viewer”视图的实现类为“TreeViewTest”,通过实现类能实现这些功能。
3C|;pM1x0^y0实现类中要完成如下的功能。
0d*s!QR7M01. 初始化树。ITPUB个人空间M?F%j}1Y:` ~A R!R
2. 完成菜单和工具栏响应的Action。
FV$@Q(Y*}p0K1n?7N03. 完成上下文菜单。
"\(Eo4CctJ]04. 完成工具栏。ITPUB个人空间8f\u2S5AT]
5. 完成双击树节点的响应方式。ITPUB个人空间m`K!H\q4W
在createPartControl方法中能对视图进行初始化,代码片段如下。ITPUB个人空间n$W&~hN7v
public void createPartControl(Composite parent) {ITPUB个人空间 q!{2V Gv&s^d d
//初始化树
MZ r E bd0viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);ITPUB个人空间0X-BGX,I*c!|jG:y*~
drillDownAdapter = new DrillDownAdapter(viewer);ITPUB个人空间.uf E)hC+kmJ$b Y+Z
viewer.setContentProvider(new ViewContentProvider());
-_ h~ZA H2F0viewer.setLabelProvider(new ViewLabelProvider());ITPUB个人空间0u Y [nou{
viewer.setSorter(new NameSorter());ITPUB个人空间 i0Q Q`DCI!\*V0O
viewer.setInput(getViewSite());
^${]U_1N0//完成菜单和工具栏响应的Action
0w v&{L K V"z0makeActions();
@TB puB `:t0//完成上下文菜单
&vnp.r\*BF0hookContextMenu();
YR.M,U-HuIKK0//完成双击树节点的响应方式
+?"K_,P-i-z0hookDoubleClickAction();ITPUB个人空间N)H3K u"m#B#SU
//完成工具栏ITPUB个人空间w|*d3FeG7a
contributeToActionBars();
l2F;[9q w/ldC0}ITPUB个人空间9L;J)P%Qb-FE
通过实现类,用户能加入自己感兴趣的功能。“Tree viewer”视图中实现类的完整代码如例程2所示。ITPUB个人空间'_s.?-X,{
例程2 TreeViewTest.javaITPUB个人空间3o&u"SfW`C'[
public class TreeViewTest extends ViewPart {ITPUB个人空间SluD @} Jf x Aw
private TreeViewer viewer;ITPUB个人空间B(k"?)tS+R8g
private DrillDownAdapter drillDownAdapter;
#s$Bdn&?(X _ ~d0private Action action1;
1let&l*yzG9H4rBS|!w0private Action action2;ITPUB个人空间1A2a?p~B8W
private Action doubleClickAction;ITPUB个人空间GZ&k6_'M&k$C
//创建树节点ITPUB个人空间$G|-I Y4^G
class TreeObject implements IAdaptable {ITPUB个人空间T qT]u2i"Y
private String name;
K@&q"FCsv]0private TreeParent parent;
4`g'v5L&hEQ1g0p'q0ITPUB个人空间#yL |~OpL;`
public TreeObject(String name) {
F)C2Dj4Z(T-F0this.name = name;ITPUB个人空间/L:~b1? s f9F;G7E7H|
}
E0?t6y\;V&w]0public String getName() {ITPUB个人空间"Z%gL j(@r$R[#w.I
return name;
7R#s:w%aS0}
,s{k3Y*YkP0public void setParent(TreeParent parent) {ITPUB个人空间9kby8xGw"u
this.parent = parent;
,L8u*Atea2u$q%i0}ITPUB个人空间q r9[!P {~+L
public TreeParent getParent() {ITPUB个人空间A$h]I5\Ju
return parent;ITPUB个人空间 D Mu ri_
}ITPUB个人空间#gW1M:I ij.B
public String toString() {
Rh v a-C0return getName();
[#L.^&WVh bH&}0}ITPUB个人空间kr {uX l
public Object getAdapter(Class key) {
"[0s }1]s#m`0return null;ITPUB个人空间P-i)kY/z |3T#j4P
}
!E BV1z*t3t9J3_,^ o0}ITPUB个人空间 H }[.TJgRQ1Q R*ix
ITPUB个人空间HH-z'Y%A#]
class TreeParent extends TreeObject {ITPUB个人空间'U{^ UI M4lP
private ArrayList children;ITPUB个人空间BC B5x!Fe"`S.{!a
public TreeParent(String name) {
!?t-BZzn0super(name);
f-hll"LN0children = new ArrayList();
u+?W8n*O$P!LN0}
2a6]B:N'EK0public void addChild(TreeObject child) {
},CY i}$R7HE/P V!Z0children.add(child);ITPUB个人空间ep9{T!W`D'M
child.setParent(this);ITPUB个人空间#Wu?"Y]9X T
}ITPUB个人空间B ] H2jU
public void removeChild(TreeObject child) {
b)S$D7utE5N e0children.remove(child);ITPUB个人空间Lk]r-p6CG
child.setParent(null);
9KI4X3pQ9DX*?0}ITPUB个人空间.~6c7oJ t
public TreeObject [] getChildren() {
'|2b!]fU N2Vp5z4]0return (TreeObject [])children.toArray(new TreeObject[children.size()]);
6ah,K\e2QF6w6E0}ITPUB个人空间~)t`u5j?
public boolean hasChildren() {ITPUB个人空间3ewb(\H h~
return children.size()>0;ITPUB个人空间"K M'SAh{
}
l4e;x Cu.k a(t `0}ITPUB个人空间 j0U1K J)ih8Ur5`
//实现内容提供器ITPUB个人空间,RN/t:m5c,`N
class ViewContentProvider implements IStructuredContentProvider,ITPUB个人空间uj\/l-M x#t0lrzL Kk
ITreeContentProvider {
'K)sf X&H0private TreeParent invisibleRoot;ITPUB个人空间n f5W{+W }L9G
ITPUB个人空间\rF;]1`p@-U5["Z
public void inputChanged(Viewer v, Object oldInput, Object newInput) {ITPUB个人空间2xF }\-}u7J)lf!Q
}
TQ\6``0public void dispose() {
3L2d{d4l;z3{{0}
4Pty%{ x'E7P0public Object[] getElements(Object parent) {ITPUB个人空间:XK)A.fK~!D$h9?!I
if (parent.equals(getViewSite())) {
__-odpMK0if (invisibleRoot==null) initialize();ITPUB个人空间u&L#H.n4XrQ
return getChildren(invisibleRoot);
Tr:u!E7nC|'k0}ITPUB个人空间j:K!hM qv0[9Dr
return getChildren(parent);ITPUB个人空间s(v4| G3|
}ITPUB个人空间'yz1P1y?A}
public Object getParent(Object child) {ITPUB个人空间c}SS.^E
if (child instanceof TreeObject) {
9T)g.l+Y'@r+J0return ((TreeObject)child).getParent();
rd6W7s5YY0}ITPUB个人空间SEH6{pQ N
return null;ITPUB个人空间 _X&HV`8vZ
}
.? v(DG4Ty0public Object [] getChildren(Object parent) {
Ul:zmr]?4jA0if (parent instanceof TreeParent) {ITPUB个人空间4h6a\9_Y o!N
return ((TreeParent)parent).getChildren();
.R*ly5F7OBg\0}ITPUB个人空间Y7Q$G'l%m]L
return new Object[0];ITPUB个人空间j:g;F(Ta v
}ITPUB个人空间F C?}k S{
public boolean hasChildren(Object parent) {
_cT| P'e0if (parent instanceof TreeParent)
1W9z'p"T@;U*v/tG,_w0return ((TreeParent)parent).hasChildren();
\u"[o3e0return false;ITPUB个人空间A^*v3d2lV%j5Q
}ITPUB个人空间#}6T'gV+~&D&jO8V,j
//初始化树节点
ltF$Zd] \:M0private void initialize() {ITPUB个人空间v9E![6\~9~"K3M
TreeObject to1 = new TreeObject("Leaf 1");
i9V3yi$O+ub1]7o0TreeObject to2 = new TreeObject("Leaf 2");ITPUB个人空间:cn4i&C;W,A
TreeObject to3 = new TreeObject("Leaf 3");
s.w]-Ybm M|6W0TreeParent p1 = new TreeParent("Parent 1");ITPUB个人空间(Apv9N J
p1.addChild(to1);
L0uD3Q#fB0p1.addChild(to2);ITPUB个人空间6e uTU$lbg1@ G
p1.addChild(to3);ITPUB个人空间:us4]C0q Y9K
ITPUB个人空间 }P wy&T g
TreeObject to4 = new TreeObject("Leaf 4");ITPUB个人空间V$dU j%etmF
TreeParent p2 = new TreeParent("Parent 2");
4hh;`3V-R'OciYT0p2.addChild(to4);
6X"o5xI~*`b w%le0
2z'd/pjv ])R0TreeParent root = new TreeParent("Root");ITPUB个人空间X f$rr8Xrf&iR-B5D
root.addChild(p1);ITPUB个人空间ow:a.Q8{ aP
root.addChild(p2);
0X_ e)P3?)p0ITPUB个人空间X2S3yfe0e
invisibleRoot = new TreeParent("");
[I%I`.?sW@0invisibleRoot.addChild(root);
xK(z bDL4_e,j&jg0}
&qYc|6T @FH$k0}ITPUB个人空间/{A["N"c'M j\9O
//实现标签提供器
U,V7Shu6[,yCD-l0class ViewLabelProvider extends LabelProvider {
8p!k-Q.L9BP+s0
7h`qwB/S'j4pi0public String getText(Object obj) {
S4YI,S u6E Q9^0return obj.toString();ITPUB个人空间(EV.p5J;d]XcJ9f;D
}ITPUB个人空间7k?3Vsh'V/`2?
public Image getImage(Object obj) {
l3X B!o p"l\9cH0String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
_0}R C/K5h0if (obj instanceof TreeParent)
q/D HI|v0imageKey = ISharedImages.IMG_OBJ_FOLDER;
Uq Ctu&Z N?9M,e0return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
6\~b9IbFR0}
&^'nO5NwQ/jti0}
TNE/F4f&|8Z2S&s0class NameSorter extends ViewerSorter {ITPUB个人空间1dXN5@x:N;L'^
}
h!D%J4_4z9]9NAE0
a)jX1V,F!@e"P.~2z0public TreeViewTest() {
v8[F \*t%E%A0}
\9x"{Ln!jL2j5yc-U;k0
8k(|!qFGK*G4W0public void createPartControl(Composite parent) {
*] _0a9g h/}gw PMT0viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);ITPUB个人空间F u;s1\ n
drillDownAdapter = new DrillDownAdapter(viewer);ITPUB个人空间` j r:t)i/D
viewer.setContentProvider(new ViewContentProvider());
C Aqc}(Y0viewer.setLabelProvider(new ViewLabelProvider());
xtx-lRc0viewer.setSorter(new NameSorter());
I jf8M0I w0viewer.setInput(getViewSite());
(N&^vj9M1l7g0makeActions();ITPUB个人空间#s[jk5n"qr
hookContextMenu();
&K/c7V2Y4]0hookDoubleClickAction();ITPUB个人空间+ts^C#y5A
contributeToActionBars();
8_2uN)M!~.X GJ0}ITPUB个人空间 d8\D/{s/t
//提供右键菜单ITPUB个人空间u B%C7h*L-P]E({3l
private void hookContextMenu() {ITPUB个人空间e\ B/Mi ~
MenuManager menuMgr = new MenuManager("#PopupMenu");ITPUB个人空间;O'Zh {'Kj.a
menuMgr.setRemoveAllWhenShown(true);ITPUB个人空间xo|"j3p%Z
menuMgr.addMenuListener(new IMenuListener() {ITPUB个人空间 F0Pb XI/Yu$w
public void menuAboutToShow(IMenuManager manager) {
$p:]ZD/l j0TreeViewTest.this.fillContextMenu(manager);ITPUB个人空间q Z{ ahm1U
}ITPUB个人空间"~5MU:B6Y aM1R
});ITPUB个人空间c ^T`5|O:Q-X5T&`H
Menu menu = menuMgr.createContextMenu(viewer.getControl());ITPUB个人空间XH({4L4d F V9FC'S
viewer.getControl().setMenu(menu);ITPUB个人空间\ UJ&q~D
getSite().registerContextMenu(menuMgr, viewer);
DP*c}+__0}ITPUB个人空间~9\:INaZ
//提供视图工具栏
m1m!mRJ_j2]{0private void contributeToActionBars() {ITPUB个人空间J/C0G0u4N0_I1BqRS6}
IActionBars bars = getViewSite().getActionBars();
(g$``;nD'tMK"P&w0fillLocalPullDown(bars.getMenuManager());
D4\X7qGr9{r0fillLocalToolBar(bars.getToolBarManager());ITPUB个人空间R} O3a] D
}
`1@i~M Rjw4]HM0ITPUB个人空间8af8T LLs"j
private void fillLocalPullDown(IMenuManager manager) {
6jzM,\I8PJ0manager.add(action1);ITPUB个人空间Q:b Y5Z,i [-p*X
manager.add(new Separator());ITPUB个人空间T1a3X`;H
manager.add(action2);ITPUB个人空间k[0U ac7Z/od
}
l_d%E4k0//填充菜单
Q9I,~/s+F!z0private void fillContextMenu(IMenuManager manager) {ITPUB个人空间@&p0GI+q;D F1@ ]
manager.add(action1);ITPUB个人空间7W+GchaZ W*K_v
manager.add(action2);ITPUB个人空间W:Us-ud)A
manager.add(new Separator());ITPUB个人空间?2@/R7fn `
drillDownAdapter.addNavigationActions(manager);ITPUB个人空间QX zs%Bx
// Other plug-ins can contribute there actions here
"tXof {@BEh0D0manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));ITPUB个人空间o({~:~.h
}
Z1NP$l#Ulo0ITPUB个人空间-J,x$AbL}!t
private void fillLocalToolBar(IToolBarManager manager) {
^B#A+X bO0manager.add(action1);ITPUB个人空间Lq)XB:cN8p"K4q I
manager.add(action2);
(Jn]7{in0manager.add(new Separator());ITPUB个人空间 C `n.DY%Ut8J$D}&F
drillDownAdapter.addNavigationActions(manager);ITPUB个人空间^n\WjVB
}
g"GL2X0GSALCJ$R0//创建菜单和工具栏对应的Action
:Q(M!p BLA0private void makeActions() {
0^&[U] ]Nu0action1 = new Action() {
7ePs L m0public void run() {
tK{i"X8LS4w6~9cS8H0showMessage("Action 1 executed");
] p0}{1?u4D0}
BA!AE-N#RA0};
s^7{Y%mwn9?1H0action1.setText("Action 1");
;j'f5b7\ \lV0action1.setToolTipText("Action 1 tooltip");ITPUB个人空间\TPN1N
action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().ITPUB个人空间O+M qsk8sD l
getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));ITPUB个人空间YBdM'u{7w
ITPUB个人空间CR`q4mn
action2 = new Action() {ITPUB个人空间ZT9r2mB$ea8d
public void run() {
j _8y"S/s0showMessage("Action 2 executed");
GB(RD7U8Kh(A0}
8K8C Jd0C*O8~0};ITPUB个人空间 Q5ao9GT
action2.setText("Action 2");
)s)_-v+Up1kGM R2Z0action2.setToolTipText("Action 2 tooltip");
P'M(H um3^,G0action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
X!V!d:j_e"n0getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
#j YE/n BAf0doubleClickAction = new Action() {ITPUB个人空间g-x*{ C+PUJ
public void run() {ITPUB个人空间*i;m%`J~wP7R
ISelection selection = viewer.getSelection();
;I*u4c/l r?0Object bj = ((IStructuredSelection)selection).getFirstElement();
te9Fz}{Psc0showMessage("Double-click detected on "+obj.toString());
eS(A*xu)x@Tw0}ITPUB个人空间&\`m)H5G;y6z;n
};ITPUB个人空间 j;UC/xc-A.C
}
7Tnf z![i%N%I0H0
\+n,I%}!Ehi)u0private void hookDoubleClickAction() {
a*j8@0osI [0viewer.addDoubleClickListener(new IDoubleClickListener() {
F(@O O"@0public void doubleClick(DoubleClickEvent event) {
T~ HDS$^2^(G8_0doubleClickAction.run();
eb*@M2^;z(]#o"A0}
W _)kB0A? a k0});
NXX%`t}0}
"rm5v wJndg0private void showMessage(String message) {ITPUB个人空间,Y&`J;o1c%z4sZ
MessageDialog.openInformation(
!x E nS2do.@W+s0viewer.getControl().getShell(),ITPUB个人空间hu'dF-A g;}
"Tree View",ITPUB个人空间])wCep`)U
message);ITPUB个人空间}4v6EQ^j
}
?2_pp-Sa%P0//响应获得焦点ITPUB个人空间4q;B+u}g!k_N@ H
public void setFocus() {
-l#W6K-eT/P C b0viewer.getControl().setFocus();ITPUB个人空间`VW0lp7s
}ITPUB个人空间}A {3o!ra
}ITPUB个人空间.n1ik$nOz
上例中通过内容提供器(ViewContentProvider)、标签提供器(ViewLabelProvider)及树节点(TreeObject)的定义提供了树的实现,另外通过createPartControl方法实现了相应的菜单和工具栏。
t.\e0j.M4p%b-A4Ws0提示:本例中右键菜单和工具栏的实现方式非常值得效仿,而且非常直观,读者可以比较一下在SWT中的实现方式,找到它们之间的异同点。


W&J*Jw_ b+U0运行“Tree viewer”视图

ITPUB个人空间8Fh _${ MhJ8B
“Tree viewer”插件到此就已经完成,现在可以调试插件了。ITPUB个人空间t*k8?-c4L5\-no
1. 运行插件。ITPUB个人空间,ld`QS4N,Y.Q1n
2. 打开运行时工作台的“Show View”。
-f!aWv*m?T0在“Show View”窗口中可以看到前面建立的分类和视图节点。
l?.Hdu2m _03. 运行“Tree viewer”视图ITPUB个人空间!t:^g2S6D(Z5W+M1ZS
双击“Tree View”节点,打开视图窗口,如图4所示。
9m2{I"`$o+F^0


}TV,d9aC-S0图4 “Tree viewer”视图

ITPUB个人空间*eaps6hI~;d4J%O
在Eclipse插件的开发中,视图插件的开发是比较重要的一个部分。视图是工作台页面内的可视组件,用户可以通过视图,扩展Eclipse原有的功能。


XUk7zkH-dk'd$o sEK%c0下载(com.free.view.treeview.rar)


.Z$c s$H/@{d"@Z0 


TAG:

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

日历

« 2008-09-06  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

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

RSS订阅

Open Toolbar