一、同時(shí)關(guān)閉所有打開的view
在view中,只有一個(gè)close,每次只能關(guān)閉當(dāng)前窗口
在eclipse的編輯窗口的標(biāo)題上點(diǎn)右鍵,里面有 close All
可以使用遍歷的方法,遍歷所有打開的View,然后將其隱藏:
AsyncUtil.asyncExec(new Runnable()
{
public void run()
{
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IViewReference[] iViewReferences = page.getViewReferences();
for (IViewReference iViewReference: iViewReferences)
if (!ID.equals(iViewReference.getId()))
page.hideView(iViewReference);
}
});
二、RCP中產(chǎn)生目標(biāo)區(qū)的Bar
產(chǎn)生紅線區(qū)域的Bar,實(shí)現(xiàn)方法如下:
1、這個(gè)是perspective,要?jiǎng)?chuàng)建多個(gè)perspective,然后設(shè)置某個(gè)為active
2、在WorkbenchWindowAdvisor中preWindowOpen內(nèi),加下面這段代碼
public void preWindowOpen() {
IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore();
apiStore.setValue(IWorkbenchPreferenceConstants.DOCK_PERSPECTIVE_BAR,
IWorkbenchPreferenceConstants.TOP_RIGHT);
apiStore.setValue(
IWorkbenchPreferenceConstants.SHOW_TRADITIONAL_STYLE_TABS,
false);
}
3、需要加 config.setShowPespectivebar(true);
三、RCP項(xiàng)目--窗口關(guān)閉事件
在ApplicationWorkbenchWindowAdvisor中override
public boolean preWindowShellClose() {
// do nothing, but allow the close() to proceed
MessageBox msgBox = new MessageBox(new Shell(), SWT.YES|SWT.NO|SWT.ICON_QUESTION);
msgBox.setText("退出系統(tǒng)");
msgBox.setMessage("確定退出系統(tǒng)?");
if(msgBox.open()==SWT.YES){
return true;
}
return false;
}
以后使用IWorkbenchWindow的getShell().close();都會(huì)調(diào)用該處代碼.
四、在RCP中設(shè)計(jì)界面適合桌面大小
final int screenWidth = Display.getCurrent().getBounds().width;
final int screenHeight = Display.getCurrent().getBounds().height;
五、Treeviewer中通過代碼,選中樹上的某個(gè)node節(jié)點(diǎn)
StructuredSelection sel=new StructuredSelection(node);
tree.setSelected(sel);
六、TreeViewer實(shí)現(xiàn)雙擊展開、關(guān)閉
private class DoubleEventPro implements MouseListener {
public void mouseDoubleClick(MouseEvent e) {
TreeItem item = viewer.getTree().getItem(new Point(e.x, e.y));
if (item != null && item.getItem(0).getText().trim().length() == 0) {
viewer.expandToLevel(item.getData(), 1);
return;
}
if (item != null && item.getItemCount() > 0
&& item.getItem(0).getText().trim().length() > 0) {
item.setExpanded(!item.getExpanded());
}
}
public void mouseDown(MouseEvent e) {
}
public void mouseUp(MouseEvent e) {
}
}
七、 如何屏蔽掉視圖窗口上的右鍵彈出菜單?
方法一:在 postWindowOpen() 中執(zhí)行下面語句:
PlatformUI.getWorkbench().getDisplay().addFilter(SWT.MouseUp, new Listener() {
public void handleEvent(final Event event) {
if(event.widget == your editor && event.button == 3) {
int hwndCursor = OS.GetCapture ();
OS.PostMessage(hwndCursor, OS.WM_LBUTTONDOWN, hwndCursor, OS.HTCLIENT | (OS.WM_MOUSEMOVE << 16));
}
}
});
其它:org.eclipse.ui.internal.presentations.util包中的StandardViewSystemMenu類控制著這些菜單,還沒來得急仔細(xì)研究,研究過后再補(bǔ)充
八、在使用tableviewer的時(shí)候?qū)氪罅繑?shù)據(jù)的問題
創(chuàng)建了一個(gè)tableviewer,然后使用setInput方法導(dǎo)入數(shù)據(jù),如果數(shù)據(jù)量很大的話根本就無效率可言了,以下是幾種解決的方法:
方法一:通過移動(dòng)滾動(dòng)條來達(dá)到自動(dòng)加載的目的,在滾動(dòng)條的事件中加入翻頁的代碼,可以參考《Eclipse從入門到精通》第二版的P383
方法二:分頁顯示(http://www.eclipseworld.org/bbs/read-cec-tid-11678-keyword-table.html)
方法三:使用 Virtual Tables,JFace3.2的Viewer已經(jīng)支持SWT.VIRTUAL樣式
http://www.eclipse.org/articles/Article-SWT-Virtual/Virtual-in-SWT.html
1 int COUNT = 10000;
2 final String [] itemStrings = new String [COUNT];
3 for (int i = 0; i < COUNT; i++) {
4 itemStrings = "item " + i;
5 }
6 final Table table = new Table(parent, SWT.BORDER | SWT.VIRTUAL);
7 table.addListener(SWT.SetData, new Listener() {
8 public void handleEvent(Event event) {
9 TableItem item = (TableItem)event.item;
10 int index = event.index;
11 item.setText(itemStrings [index]);
12 }
13 });
14 table.setItemCount(COUNT);
九、在透視圖快捷方式欄中同時(shí)顯示多個(gè)透視圖快捷方式
如果在程序中做了多個(gè)個(gè)透視圖,默認(rèn)只顯示初始透視圖快捷方式,每次都要 打開透視圖——other,特麻煩,所以,一下提供兩種方法:
1、在切換欄中顯示
public class PIMWorkbenchAdvisor extends WorkbenchAdvisor {
@Override
public void postStartup() {
super.postStartup();
IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
//2007.01.11 設(shè)置同時(shí)顯示多個(gè)透視圖標(biāo)
PerspectiveBarManager barManager=((WorkbenchWindow)activeWorkbenchWindow).getPerspectiveBar();
if(barManager != null){
IPerspectiveDescriptor mailPerspective =
WorkbenchPlugin.getDefault().getPerspectiveRegistry
().findPerspectiveWithId("MyWork_mail.perspective");
PerspectiveBarContributionItem item=new
PerspectiveBarContributionItem(mailPerspective,activeWorkbenchWindow.getActivePage());
barManager.addItem(item);
}
}
2、在下拉框中(shortcut)顯示
public class UiPerspective implements IPerspectiveFactory
{
public void createInitialLayout(IPageLayout layout){
....
//增加透視圖
layout.addPerspectiveShortcut("net.sf.pim.plugin.UiPerspective");
layout.addPerspectiveShortcut("MyWork_mail.perspective");
}
}
十、控制“最近打開文檔”的個(gè)數(shù)
RCP中在繼承ActionBarAdvisor的類中定義:
private IContributionItem reOpenAction = ContributionItemFactory.REOPEN_EDITORS.create(window);
然后在fillMenuBar(IMenuManager menuBar)方法中添加上面的aciton
運(yùn)行時(shí)“最近打開的文檔”只有4個(gè),如果想自己控制“最近打開的文檔”的數(shù)量,則設(shè)置一下Workbench中的初始化首選項(xiàng)時(shí)RECENT_FILES的默認(rèn)參數(shù)值如:
WorkbenchPlugin.getDefault().getPreferenceStore().setDefault(IPreferenceConstants.RECENT_FILES,10);
十一、設(shè)置Eclipse RCP程序的外觀和首選項(xiàng)
RCP應(yīng)用程序的缺省外觀是一個(gè)空白窗口,一般我們要通過一個(gè)WorkbenchAdvisor類對(duì)界面進(jìn)行定制。
WorkbenchAdvisor有很多回調(diào)方法,可以在preWindowOpen()方法里設(shè)置菜單、工具條、狀態(tài)欄、進(jìn)度欄、透視圖切換工具是否可
見,在fillActionBars()方法里添加菜單和工具條項(xiàng),在getInitialWindowPerspectiveId()方法里指定首選的
透視圖。
缺省情況下,透視圖切換工具位于窗口左上角,在Eclipse里可以通過Window->Preferences->
Workbench->Appearance改變它的位置,那么怎樣用程序控制它呢?有兩個(gè)方法,第一個(gè)是使用如下代碼設(shè)置
IPreferenceStore中的變量:
IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore();
apiStore.setValue(IWorkbenchPreferenceConstants.DOCK_PERSPECTIVE_BAR, IWorkbenchPreferenceConstants.TOP_RIGHT);
另一個(gè)方法是在plugin所在目錄建一個(gè)名為plugin_customization.ini的文件,里面寫如下內(nèi)容:
your.plugin.id/DOCK_PERSPECTIVE_BAR=topRight
其他與plugin相關(guān)的Preference值可以用同樣方法設(shè)置。
Update:在最新的Eclipse 3.1M5a版本中,對(duì)RCP應(yīng)用程序菜單和工具條的定制方法有所改變,應(yīng)該使用新加入的ActionBarAdvisor類來完成此項(xiàng)工作。
十二、獲得自己開發(fā)的plugin被安裝的目錄
/** *//**
* @return 本插件的安裝路徑
*/
public String getInstallDir() ...{
if (installPath == null) ...{
URL localUrl = null;
try ...{
localUrl = FileLocator.toFileURL(getDefault().getBundle()
.getEntry("/"));
installPath = localUrl.getFile().substring(1);
} catch (Exception e) ...{
log(e);
}
}
return installPath;
}
轉(zhuǎn)自http://duguanglong002.blog.163.com/blog/static/26955626200955415545/