终于keyAssist 交上去了。整理下。
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
这里类就是核心部分了,用来操作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
这个类就是为了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
最后的这个就是parser后返回的结果的类型。