1
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
|
package com.intellij.promoter;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.ex.AnActionListener;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.components.*;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.HashMap;
import java.util.LinkedHashMap;
/**
* @author Konstantin Bulenkov
*/
@State(
name = "ShortcutPromoterManager",
roamingType = RoamingType.PER_PLATFORM,
storages = {
@Storage(
file = StoragePathMacros.APP_CONFIG + "/promoter.xml"
)}
)
public class ShortcutPromoterManager implements ApplicationComponent, AnActionListener, ExportableApplicationComponent,
PersistentStateComponent<Element> {
private final HashMap<String, PromoterState> myState = new LinkedHashMap<String, PromoterState>();
private final HashMap<String, ShortcutPromoterEP> myExtensions = new HashMap<String, ShortcutPromoterEP>();
@Override
public void initComponent() {
myExtensions.clear();
myState.clear();
for (ShortcutPromoterEP ep : ShortcutPromoterEP.EP_NAME.getExtensions()) {
myExtensions.put(ep.actionId, ep);
}
ActionManager.getInstance().addAnActionListener(this);
}
@Override
public void disposeComponent() {
ActionManager.getInstance().removeAnActionListener(this);
}
@NotNull
@Override
public String getComponentName() {
return getClass().getName();
}
@Override
public void beforeActionPerformed(AnAction action, DataContext dataContext, AnActionEvent event) {
final InputEvent input = event.getInputEvent();
if (input instanceof MouseEvent) {
final String id = ActionManager.getInstance().getId(action);
final ShortcutPromoterEP ep = myExtensions.get(id);
if (ep != null) {
PromoterState state = myState.get(id);
if (state == null) {
state = new PromoterState();
myState.put(id, state);
}
state.incClicks();
}
}
}
@Override
public void afterActionPerformed(AnAction action, DataContext dataContext, AnActionEvent event) {
}
@Override
public void beforeEditorTyping(char c, DataContext dataContext) {
}
@NotNull
@Override
public File[] getExportFiles() {
return new File[]{PathManager.getOptionsFile("shortcutPromoter")};
}
@NotNull
@Override
public String getPresentableName() {
return "Shortcut Promoter";
}
@Nullable
@Override
public Element getState() {
if (myState.isEmpty()) {
return null;
}
final Element actions = new Element("actions");
for (String id : myState.keySet()) {
final Element action = new Element("action");
action.setAttribute("actionId", id);
action.setAttribute("clicks", String.valueOf(myState.get(id).getClicks()));
actions.addContent(action);
}
return actions;
}
@Override
public void loadState(Element state) {
myState.clear();
for (Element action : state.getChildren("action")) {
final String id = action.getAttributeValue("actionId");
final String clicks = action.getAttributeValue("clicks");
try {
final PromoterState info = new PromoterState();
info.setClicks(Integer.parseInt(clicks));
myState.put(id, info);
} catch (Exception ignore) {}
}
}
}
|