<!--這是我工程的配置文件,用的是動態菜單形式完成查詢功能。>
<plugin>
<extension point="org.eclipse.ui.menus">
<menuContribution
locationURI="menu:org.eclipse.ui.main.menu?after=additions">
<menu label = "企業電子數據庫">
<menu label = "法規標準庫">
<dynamic
class = "com.uds.inoherb.MyDynamicMenu"
id = "com.uds.inoherb.MyDynamicMenu">
</dynamic>
</menu>
<menu label = "原料標準庫">
<dynamic
class = "com.uds.inoherb.MyDynamicMenu2"
id = "com.uds.inoherb.MyDynamicMenu2">
</dynamic>
</menu>
</menu>
</menuContribution>
</extension>
</plugin>
讀取本地xml配置文件,獲取節點屬性,動態的生成菜單和建立查詢。
/**
* 封裝在一起的操作類和其方法
* @author zhaoyao
*
*/
public class MenuOptionManager{
//初始化 parseXmlPojo()
private List<MenuObjManage> m_parseXmlPojo;
public MenuOptionManager(){
m_parseXmlPojo = parseXmlPojo();
}
public final TCSession getSession(){
AbstractAIFUIApplication app = AIFUtility.getCurrentApplication();
TCSession session = (TCSession) app.getSession();
return session;
}
public final TcSearchUI getTcSearchUI(){
TcSearchUI UI = new TcSearchUI();
return UI;
}
public String getItemName(int i,int j){
return this.m_parseXmlPojo.get(0).getGroupObjList().get(i)
.getItemObjList().get(j).getItemName();
}
public String getSearchName(int i,int j){
return this.m_parseXmlPojo.get(0).getGroupObjList().get(i)
.getItemObjList().get(j).getConditionObj().get(0).getSearchName();
}
public Map<String,String> getSearchInfo(int i,int j){
return this.m_parseXmlPojo.get(0).getGroupObjList().get(i)
.getItemObjList().get(j).getConditionObj().get(0).getSearchInfoMap();
}
//返回第i個group節點下的Item對象集合
public List<Item> getItemList(int i){
return m_parseXmlPojo.get(0).getGroupObjList().get(i).getItemObjList();
}
/**
* @param 查詢,用於TcSearchUI的performSearch()方法,顯示一個searchResultView
* @param searcherName :查詢的組件名稱
* @param Map :對應零組件下的屬性map
*/
public TCComponentSearch SearchComponents(TCSession session, String searcherName,
java.util.Map<String,String> searchInfo) throws TCException {
//查詢數據
String QUERY_CLASS = searcherName;
//獲取查詢 type
TCComponentQueryType typeComponent = (TCComponentQueryType) session.getTypeComponent("ImanQuery");
TCComponentQuery query = null;
// 根據查詢名稱獲取到相關查詢
TCComponent queryComponent = typeComponent.find(QUERY_CLASS);
if (queryComponent == null) {
throw new TCException("未找到查詢"+QUERY_CLASS+",請聯繫管理員配置!");
}
query = (TCComponentQuery) queryComponent;
//查詢條件
Set<String> keySet = searchInfo.keySet();
String[] proNames = keySet.toArray(new String[keySet.size()]);
Collection<String> valSet = searchInfo.values();
String[] values = valSet.toArray(new String[valSet.size()]);
// 獲取查詢結果
//TCComponent[] results = query.execute(proNames, values);
//初始化TCComponentSearch構造方法
TCComponentSearch searchQuery = new TCComponentSearch(searcherName, query, proNames, values, false, 0);
return searchQuery;
}
/**
* 遍歷解析XML文件,並把結果封裝到MyMenu的集合中返回
*/
public List<MenuObjManage> parseXmlPojo(){
List<MenuObjManage> myMenuList = null;
try{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
//獲取Preference信息
TCPreferenceService service = this.getSession().getPreferenceService();
String TemplatePath = service.getStringValue("UDS_enterprise_database_config_path");
InputStream inStream = new FileInputStream(TemplatePath);
Document document = builder.parse(inStream);
//得到要獲取的所有Menu節點,通過每個節點,獲取Menu內容數據
NodeList list = document.getElementsByTagName("Menu");
//定義返回的MyMenu集合
myMenuList = new ArrayList<MenuObjManage>();
for (int i = 0;i<list.getLength(); i++) {
MenuObjManage myMenu = new MenuObjManage();
//得到節點Menu
Element e = (Element)list.item(i);//Menu爲根節點,只有一個,爲item(0)
//得到當前節點的所有孩子節點 :menuName,Group,Group
NodeList childList = e.getChildNodes();
//遍歷Menu節點,並將數據封裝到Menu對象中
for (int j = 0; j < childList.getLength(); j++) {
Node node = childList.item(j);
switch(node.getNodeName()){
case "menuName":
String menuName = node.getTextContent().trim();
myMenu.setMenuName(menuName);
break;
case "Group":
Group group = myMenu.new Group();
//得到Group節點的所有孩子節點:groupName,Item,Item...
NodeList nodeList1 = node.getChildNodes();
//遍歷Group節點,並將數據封裝到Group對象中
for (int k = 0; k < nodeList1.getLength(); k++) {
Node node2 = nodeList1.item(k);
switch(node2.getNodeName()){
case "groupName":
String groupName = node2.getTextContent().trim();
group.setGroupName(groupName);
break;
case"Item":
Item item = group.new Item();
//得到Item節點下的所有孩子節點,itemName,Condition
NodeList nodeList2 = node2.getChildNodes();
//遍歷Item節點,並將數據封裝到Item對象中
for (int l = 0; l < nodeList2.getLength(); l++) {
Node node3 = nodeList2.item(l);
switch(node3.getNodeName()){
case "itemName":
String itemName = node3.getTextContent().trim();
item.setItemName(itemName);
break;
case"Condition":
Condition condition = item.new Condition();
//得到Condition節點下的所有孩子節點:searchName,searchInfo
NodeList nodeList3 = node3.getChildNodes();
//遍歷Condition節點,獲取searchName值
for (int m = 0; m < nodeList3.getLength(); m++) {
Node node4 = nodeList3.item(m);
switch(node4.getNodeName()){
case "searchName":
String searchName = node4.getTextContent().trim();
condition.setSearchName(searchName);
break;
case "searchInfo":
//遍歷searchInfo節點下的所有孩子節點:put
NodeList nodeList4 = node4.getChildNodes();
Map<String,String> putInfo = new HashMap<>();
//遍歷searchInfo節點下的put子節點
for (int n = 0; n < nodeList4.getLength(); n++) {
//得到每個put子節點
Node node5 = nodeList4.item(n);
switch(node5.getNodeName()){
case "put":
//獲得put節點下的所有孩子節點
NodeList nodeList5 = node5.getChildNodes();
List<String> arr = new ArrayList<>();
List<String> arr2 = new ArrayList<>();
//遍歷 put節點下的子節點
for (int o = 0; o < nodeList5.getLength(); o++) {
Node node6 = nodeList5.item(o);
switch(node6.getNodeName()){
case "putName":
String name = node6.getTextContent().trim();
arr.add(name);
break;
case "putValue":
String value =node6.getTextContent().trim();
arr2.add(value);
break;
}
}
for (int p = 0; p < arr.size(); p++) {
putInfo.put(arr.get(p).toString(),arr2.get(p).toString());
}
}
}
//將Put節點下的鍵值隊集合封裝到Condition中
condition.setSearchInfoMap(putInfo);
}
}
//將Condition對象集合封裝到Item中
item.addCondition(condition);
}
}
//將Item對象集合封裝到Group中
group.addItem(item);
}
}
//將Group對象集合封裝到Menu中
myMenu.addGroup(group);
}
}
//將Menu對象添加到List集合中
myMenuList.add(myMenu);
myMenu = null;
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
<span style="background-color: rgb(255, 0, 0);"><span style="color:#FFFF66;"> } catch (IOException e) {
e.printStackTrace()
}</span></span>
//返回Menu對象集合:Menu中封裝了其下的所有孩子節點對象的數據,可調用獲取任何節點下的數據
return myMenuList;
}
}
這是配置文件對應的執行函數,我查看的源代碼,發現這個ContributionItem抽象接口是用SWT的形式搭起來的。
<pre name="code" class="java">public class MyDynamicMenu extends ContributionItem {
public MyDynamicMenu(){
}
public MyDynamicMenu(String id){
super(id);
}
public void fill(final Menu menu,final int index){
final MenuOptionManager temp = new MenuOptionManager();
//獲得第一組Group節點下的所有Item
MenuItem[] menuItemList = new MenuItem[temp.getItemList(0).size()];
for (int i = 0; i < menuItemList.length; i++)
{
final int j;
j = i;
//判斷itemName是否存在
if (temp.getItemName(0, i) == null || temp.getItemName(0, i) == ""){
temp.itemNameExcpInfo();
}else{
//新建動態菜單
MenuItem item = new MenuItem(menu, index);
//設置菜單名稱
item.setText(temp.getItemName(0, i));
//菜單的響應
item.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
//獲得搜索名稱
String searchName = temp.getSearchName(0, j);
//獲得搜索下的屬性和屬性值
Map<String, String> searchInfo = temp.getSearchInfo(0, j);
try {
//得到session
TCSession session = temp.getSession() ;
//將從XML文件讀到的數據初始化到TCComponentSearc中
TCComponentSearch tmpResults = temp.SearchComponents(session, searchName, searchInfo);
//初始化SearchConfig
SearchConfig searchConfig = new SearchConfig(session);
//初始化TcSearchUI
TcSearchUI searchUI = temp.getTcSearchUI();
//執行搜索
searchUI.performSearch(tmpResults, searchConfig);
//顯示搜索結果視圖
searchUI.activateSearchResultView();
} catch (TCException e1) {
e1.printStackTrace();
}
}
});
}
}
}
}
我如果在這裏用Swing的方法彈出消息對話框,則系統會直接卡死,這一塊糾結很久,我一度以爲我這第一個動態菜單版本寫的很爛,是不是用fill()主程序的方法就是錯的。。。
catch (IOException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "文件路徑不正確!請檢查", "alert", JOptionPane.ERROR_MESSAGE);
}
直到我查看ContributiinItem的源代碼,發現居然是jface,居然是SWT來構建界面的,這時候我在想是不是不能在SWT的監聽事件下直接使用AWT和Swing的控件。
<span style="background-color: rgb(255, 0, 0);">package org.eclipse.jface.action;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.CoolBar;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.ToolBar;</span>
public abstract class ContributionItem implements IContributionItem {
private String id;
private boolean visible;
private IContributionManager parent;
protected ContributionItem() {
this(null);
}
protected ContributionItem(String id) {
this.id = null;
this.visible = true;
this.id = id;
}
public void dispose() {
}
public void fill(Composite parent) {
}
public void fill(Menu menu, int index) {
}
public void fill(ToolBar parent, int index) {
}
public void fill(CoolBar parent, int index) {
}
public void saveWidgetState() {
}
public String getId() {
return this.id;
}
public IContributionManager getParent() {
return this.parent;
}
public boolean isDirty() {
return isDynamic();
}
public boolean isEnabled() {
return true;
}
public boolean isDynamic() {
return false;
}
public boolean isGroupMarker() {
return false;
}
public boolean isSeparator() {
return false;
}
public boolean isVisible() {
return this.visible;
}
public void setVisible(boolean visible) {
this.visible = visible;
}
public String toString() {
return super.getClass().getName() + "(id=" + getId() + ")";
}
public void update() {
}
public void setParent(IContributionManager parent) {
this.parent = parent;
}
public void update(String id) {
}
public void setId(String itemId) {
this.id = itemId;
}
}
想到這個,我就加了一段SWT的消息對話框。
public void filePathExcpInfo(){
Display display = Display.getDefault();
Shell shell = new Shell(display,SWT.NONE);
MessageBox message = new MessageBox(shell);
message.setMessage("路徑不正確,請檢查路徑!");
message.open();
}
catch (IOException e) {
e.printStackTrace();
this.filePathExcpInfo();
}
結果,成功了
那麼問題來了,這是爲什麼???