KeyAssist 整理
終于keyAssist 交上去了。整理下。
這里類就是核心部分了,用來操作keyassit,keyassit包括兩部分的,一是在plugin.xml里定義的,和在runtime時動態加入的。
eclipse 已經提供了取得plugin.xml里keyassist item,的功能。需要實現的是runtime的功能。
典型的應用是在當前畫面中搜索帶快捷鍵的button,哇這個功能看上去有點bt,實際上也是很簡單的。
這個類就是為了parser 介面而寫的。利用遞歸可以很簡單的遍歷所以界面中的控件
最后的這個就是parser后返回的結果的類型。
??1
package?com.hactl.eaf.ui.rich.composite.widget.keyassist;
??2
??3
import?java.io.IOException;
??4
import?java.util.HashMap;
??5
import?java.util.Iterator;
??6
import?java.util.Set;
??7
??8
import?org.eclipse.core.commands.Command;
??9
import?org.eclipse.core.commands.ParameterizedCommand;
?10
import?org.eclipse.jface.bindings.Binding;
?11
import?org.eclipse.jface.bindings.keys.KeyBinding;
?12
import?org.eclipse.jface.bindings.keys.KeySequence;
?13
import?org.eclipse.jface.bindings.keys.ParseException;
?14
import?org.eclipse.ui.IWorkbench;
?15
import?org.eclipse.ui.commands.ICommandService;
?16
import?org.eclipse.ui.internal.Workbench;
?17
import?org.eclipse.ui.internal.keys.WorkbenchKeyboard;
?18
import?org.eclipse.ui.keys.IBindingService;
?19
?20
/**?*//**
?21
?*?ShortCutKeyAssist?Util
?22
?*?<p>
?23
?*?this?class?can?modify?KeyAssist?in?runtime
?24
?*/
?25
?26
public?class?ShortCutKeyAssist?
{
?27
????private?final?static?String?SCHEME_NAME?=?"com.hactl.eaf.ui.rich.application.defaultAcceleratorConfiguration";
?28
?29
????private?final?static?String?CONTEXT_NAME?=?"org.eclipse.ui.contexts.dialogAndWindow";
?30
?31
????private?final?static?String?CATEGORY_NAME?=?"RichClient.category";
?32
?33
????private?Workbench?workbench;
?34
?35
????private?ICommandService?commandService;
?36
?37
????private?IBindingService?bindingService;
?38
?39
????private?Binding[]?oldbindings;
?40
?41
????private?HashMap?newbindings;
?42
?43
????public?ShortCutKeyAssist(IWorkbench?workbench)?
{
?44
?45
????????this.workbench?=?(Workbench)?workbench;
?46
?47
????????bindingService?=?(IBindingService)?workbench
?48
????????????????.getAdapter(IBindingService.class);
?49
????????commandService?=?(ICommandService)?workbench
?50
????????????????.getAdapter(ICommandService.class);
?51
?52
????????oldbindings?=?bindingService.getBindings();
?53
?54
????????newbindings?=?new?HashMap();
?55
?56
????}
?57
?58
????/**?*//**
?59
?????*?
?60
?????*?@param?commandId
?61
?????*?????????The?map?of?command?identifiers?to?commands?must?not?be?null
?62
?????*?@param?commandName
?63
?????*?????????Show?name?in?the?KeyAssist?list?must?not?be?null
?64
?????*?@param?keySequence
?65
?????*?????????Short?key?String?must?not?be?null
?66
?????*?@param?description
?67
?????*?@return
?68
?????*/
?69
????public?KeyBinding?addShortKey(String?commandId,?String?commandName,
?70
????????????String?keySequence,?String?description)?
{
?71
????????KeySequence?seq?=?null;
?72
????????KeyBinding?binding;
?73
????????final?Command?command?=?commandService.getCommand(commandId);
?74
?75
????????if?(!command.isDefined())
?76
????????????command.define(commandName,?description,?commandService
?77
????????????????????.getCategory(CATEGORY_NAME),?null);
?78
?79
????????try?
{
?80
????????????seq?=?KeySequence.getInstance(keySequence);
?81
????????}?catch?(ParseException?e1)?
{
?82
????????????//?TODO?Auto-generated?catch?block
?83
????????????e1.printStackTrace();
?84
????????}
?85
?86
????????binding?=?new?KeyBinding(seq,?new?ParameterizedCommand(command,?null),
?87
????????????????SCHEME_NAME,?CONTEXT_NAME,?"",?"",?null,?Binding.USER);
?88
?89
????????newbindings.put(keySequence,?binding);
?90
????????
?91
????????return?binding;
?92
????}
?93
?94
????public?void?removeAllShortKey()?
{
?95
????????newbindings.clear();
?96
????}
?97
?98
????public?void?removeShortKey(String?keySequence)?
{
?99
????????newbindings.remove(keySequence);
100
????}
101
102
????public?void?OpenKeyAssist()?
{
103
????????recomputeBindings();
104
????????WorkbenchKeyboard?workbenchkeyboard?=?new?WorkbenchKeyboard(
105
????????????????this.workbench);
106
????????workbenchkeyboard.openMultiKeyAssistShell();
107
????}
108
109
????private?void?recomputeBindings()?
{
110
111
????????Binding[]?bindings?=?new?Binding[oldbindings.length
112
????????????????+?newbindings.size()];
113
????????System.arraycopy(oldbindings,?0,?bindings,?0,?oldbindings.length);
114
115
????????Set?set?=?newbindings.keySet();
116
????????Iterator?iter?=?set.iterator();
117
118
????????for?(int?i?=?oldbindings.length;?i?<?bindings.length;?i++)?
{
119
????????????if?(iter.hasNext())
120
????????????????bindings[i]?=?(Binding)?newbindings.get(iter.next());
121
????????}
122
123
????????try?
{
124
????????????bindingService.savePreferences(bindingService
125
????????????????????.getScheme(SCHEME_NAME),?bindings);
126
127
????????}?catch?(IOException?e)?
{
128
????????????//?TODO?Auto-generated?catch?block
129
????????????e.printStackTrace();
130
????????}
131
????}
132
}
133

??2

??3

??4

??5

??6

??7

??8

??9

?10

?11

?12

?13

?14

?15

?16

?17

?18

?19

?20


?21

?22

?23

?24

?25

?26



?27

?28

?29

?30

?31

?32

?33

?34

?35

?36

?37

?38

?39

?40

?41

?42

?43



?44

?45

?46

?47

?48

?49

?50

?51

?52

?53

?54

?55

?56

?57

?58


?59

?60

?61

?62

?63

?64

?65

?66

?67

?68

?69

?70



?71

?72

?73

?74

?75

?76

?77

?78

?79



?80

?81



?82

?83

?84

?85

?86

?87

?88

?89

?90

?91

?92

?93

?94



?95

?96

?97

?98



?99

100

101

102



103

104

105

106

107

108

109



110

111

112

113

114

115

116

117

118



119

120

121

122

123



124

125

126

127



128

129

130

131

132

133

這里類就是核心部分了,用來操作keyassit,keyassit包括兩部分的,一是在plugin.xml里定義的,和在runtime時動態加入的。
eclipse 已經提供了取得plugin.xml里keyassist item,的功能。需要實現的是runtime的功能。
典型的應用是在當前畫面中搜索帶快捷鍵的button,哇這個功能看上去有點bt,實際上也是很簡單的。
??1
package?com.hactl.eaf.ui.rich.composite.widget.keyassist;
??2
??3
import?java.util.ArrayList;
??4
import?java.util.HashMap;
??5
import?java.util.Iterator;
??6
import?java.util.Set;
??7
??8
import?org.eclipse.swt.widgets.Button;
??9
import?org.eclipse.swt.widgets.Composite;
?10
import?org.eclipse.swt.widgets.Control;
?11
import?org.eclipse.swt.widgets.Group;
?12
import?org.eclipse.swt.widgets.TabFolder;
?13
import?org.eclipse.swt.widgets.TabItem;
?14
?15
import?com.hactl.eaf.ui.rich.composite.ReadOnlyListingS2Composite;
?16
import?com.hactl.eaf.ui.rich.composite.widget.HButton;
?17
?18
public?class?WidgetParser?
{
?19
????private?HashMap?widgets;
?20
?21
????public?WidgetParser()?
{
?22
????????widgets?=?new?HashMap();
?23
????}
?24
?25
????public?void?parseWidget(Control?control)?
{
?26
????????if?(control?==?null)?
{
?27
????????????return;
?28
????????}
?29
????????if?(control?instanceof?Composite)?
{
?30
????????????Composite?composite?=?(Composite)?control;
?31
????????????Control[]?controls?=?composite.getChildren();
?32
????????????for?(int?i?=?0;?i?<?controls.length;?i++)
?33
????????????????parseWidget(controls[i]);
?34
????????}
?35
????????if?(control?instanceof?ReadOnlyListingS2Composite)?
{
?36
????????????ReadOnlyListingS2Composite?s2composite?=?(ReadOnlyListingS2Composite)?control;
?37
????????????Control[]?controls?=?s2composite.getChildren();
?38
????????????for?(int?i?=?0;?i?<?controls.length;?i++)
?39
????????????????parseWidget(controls[i]);
?40
????????}
?41
????????if?(control?instanceof?Group)?
{
?42
????????????Group?group?=?(Group)?control;
?43
????????????Control[]?controls?=?group.getChildren();
?44
????????????for?(int?i?=?0;?i?<?controls.length;?i++)
?45
????????????????parseWidget(controls[i]);
?46
????????}
?47
????????if?(control?instanceof?TabFolder)?
{
?48
????????????TabFolder?tab?=?(TabFolder)?control;
?49
????????????TabItem[]?controls?=?tab.getItems();
?50
????????????for?(int?i?=?0;?i?<?controls.length;?i++)?
{
?51
????????????????widgets.put("folder."?+?controls[i].getText(),?controls[i]
?52
????????????????????????.getText());
?53
????????????}
?54
????????}
?55
????????if?(control?instanceof?HButton)?
{
?56
????????????HButton?button?=?(HButton)?control;
?57
????????????widgets.put("button."?+?button.getText(),?button.getText());
?58
????????}
?59
????????if?(control?instanceof?Button)?
{
?60
????????????Button?button?=?(Button)?control;
?61
????????????widgets.put("button."?+?button.getText(),?button.getText());
?62
????????}
?63
?64
????}
?65
?66
????/**?*//**
?67
?????*?
?68
?????*?@return?shortkey?in?all?of?widget?,maybe?has?null?value
?69
?????*/
?70
????public?ArrayList?getWidgetInfo()?
{
?71
????????if?(widgets.size()?==?0)
?72
????????????return?null;
?73
????????ArrayList?list?=?new?ArrayList();
?74
????????Set?keyset?=?widgets.keySet();
?75
????????Iterator?iter?=?keyset.iterator();
?76
????????String[]?strings?=?new?String[widgets.size()];
?77
????????while?(iter.hasNext())?
{
?78
????????????WidgetInfo?info?=?new?WidgetInfo();
?79
????????????String?widgetkey?=?(String)iter.next();
?80
????????????info.setCommandId(widgetkey);
?81
????????????
?82
????????????final?String?temp?=?(String)widgets.get(widgetkey);
?83
????????????
?84
????????????info.setText(getWidgetText(temp));
?85
????????????
?86
????????????int?index?=?temp.indexOf("&");
?87
????????????if?(index?>=?0)?
{
?88
????????????????info.setShortkey(?"M3+"
?89
????????????????????????+?temp.substring(index?+?1,?index?+?2)
?90
????????????????????????????????.toUpperCase());
?91
????????????}????????????
?92
????????????list.add(info);
?93
????????????
?94
????????}
?95
????????return?list;
?96
????}
?97
?98
????/**?*//**
?99
?????*?
100
?????*?@return?delete?'&'?in?the?String
101
?????*/
102
????public?String?getWidgetText(String?oldtext)?
{
103
????????if?(oldtext?==?null)
104
????????????return?null;
105
????????String?temp?=?oldtext;
106
????????int?index?=?temp.indexOf("&");
107
????????if?(index?>=?0)?
{
108
????????????final?String?temp1?=?temp.substring(0,?index);
109
????????????temp?=?temp1?+?temp.substring(index?+?1);
110
????????}
111
????????return?temp;
112
????}
113
114
????public?HashMap?getWidgets()?
{
115
????????return?widgets;
116
????}
117
}
118

??2

??3

??4

??5

??6

??7

??8

??9

?10

?11

?12

?13

?14

?15

?16

?17

?18



?19

?20

?21



?22

?23

?24

?25



?26



?27

?28

?29



?30

?31

?32

?33

?34

?35



?36

?37

?38

?39

?40

?41



?42

?43

?44

?45

?46

?47



?48

?49

?50



?51

?52

?53

?54

?55



?56

?57

?58

?59



?60

?61

?62

?63

?64

?65

?66


?67

?68

?69

?70



?71

?72

?73

?74

?75

?76

?77



?78

?79

?80

?81

?82

?83

?84

?85

?86

?87



?88

?89

?90

?91

?92

?93

?94

?95

?96

?97

?98


?99

100

101

102



103

104

105

106

107



108

109

110

111

112

113

114



115

116

117

118

這個類就是為了parser 介面而寫的。利用遞歸可以很簡單的遍歷所以界面中的控件
?1
package?com.hactl.eaf.ui.rich.composite.widget.keyassist;
?2
?3
public?class?WidgetInfo?
{
?4
????private?String?commandId;
?5
?6
????private?String?text;
?7
?8
????private?String?shortkey;
?9
10
????public?String?getCommandId()?
{
11
????????return?commandId;
12
????}
13
14
????public?void?setCommandId(String?commandId)?
{
15
????????this.commandId?=?commandId;
16
????}
17
18
????public?String?getShortkey()?
{
19
????????return?shortkey;
20
????}
21
22
????public?void?setShortkey(String?shortkey)?
{
23
????????this.shortkey?=?shortkey;
24
????}
25
26
????public?String?getText()?
{
27
????????return?text;
28
????}
29
30
????public?void?setText(String?text)?
{
31
????????this.text?=?text;
32
????}
33
34
}
35

?2

?3



?4

?5

?6

?7

?8

?9

10



11

12

13

14



15

16

17

18



19

20

21

22



23

24

25

26



27

28

29

30



31

32

33

34

35

最后的這個就是parser后返回的結果的類型。
posted on 2006-05-19 14:24 馬甲丁 閱讀(411) 評論(0) 編輯 收藏 所屬分類: Eclipse JFace/SWT