blob: 3baafb1fe51088780e4b71140957af04471f7b8f [file] [log] [blame]
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) {}
}
}
}