summaryrefslogtreecommitdiff
path: root/plugins/ShortcutPromoter/src/com/intellij/promoter/ShortcutPromoterManager.java
blob: 3baafb1fe51088780e4b71140957af04471f7b8f (plain)
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
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",
  storages = {@Storage(file = StoragePathMacros.APP_CONFIG + "/promoter.xml", roamingType = RoamingType.PER_PLATFORM)}
)
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() {
    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) {}
    }
  }
}