forked from fanruan/design
juhaoyu
8 years ago
2 changed files with 111 additions and 4 deletions
@ -0,0 +1,108 @@ |
|||||||
|
package com.fr.design.fun.impl; |
||||||
|
|
||||||
|
import com.fr.design.ExtraDesignClassManager; |
||||||
|
import com.fr.design.fun.GlobalListenerProvider; |
||||||
|
import com.fr.general.GeneralContext; |
||||||
|
import com.fr.plugin.context.PluginContext; |
||||||
|
import com.fr.plugin.context.PluginRuntime; |
||||||
|
import com.fr.plugin.injectable.PluginModule; |
||||||
|
import com.fr.plugin.manage.PluginFilter; |
||||||
|
import com.fr.plugin.observer.PluginEvent; |
||||||
|
import com.fr.plugin.observer.PluginEventListener; |
||||||
|
import com.fr.plugin.observer.PluginEventType; |
||||||
|
|
||||||
|
import java.awt.*; |
||||||
|
import java.awt.event.AWTEventListener; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.Set; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by juhaoyu on 2017/6/15. |
||||||
|
* 管理GlobalListenerProvider接口 |
||||||
|
*/ |
||||||
|
public class GlobalListenerProviderManager { |
||||||
|
|
||||||
|
private static final GlobalListenerProviderManager INSTANCE = new GlobalListenerProviderManager(); |
||||||
|
|
||||||
|
private Map<GlobalListenerProvider, AWTEventListener> map = new HashMap<>(); |
||||||
|
|
||||||
|
private GlobalListenerProviderManager() {} |
||||||
|
|
||||||
|
public static GlobalListenerProviderManager getInstance() { |
||||||
|
|
||||||
|
return INSTANCE; |
||||||
|
} |
||||||
|
|
||||||
|
public void init() { |
||||||
|
|
||||||
|
Set<GlobalListenerProvider> providers = ExtraDesignClassManager.getInstance().getArray(GlobalListenerProvider.XML_TAG); |
||||||
|
addAWTEventListeners(providers); |
||||||
|
listenPlugin(); |
||||||
|
} |
||||||
|
|
||||||
|
private void listenPlugin() { |
||||||
|
|
||||||
|
PluginFilter filter = new PluginFilter() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean accept(PluginContext context) { |
||||||
|
|
||||||
|
return context.contain(PluginModule.ExtraDesign, GlobalListenerProvider.XML_TAG); |
||||||
|
} |
||||||
|
}; |
||||||
|
PluginEventListener onRun = new PluginEventListener() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public void on(PluginEvent event) { |
||||||
|
|
||||||
|
PluginRuntime runtime = event.getContext().getRuntime(); |
||||||
|
Set<GlobalListenerProvider> providers = runtime.get(PluginModule.ExtraDesign, GlobalListenerProvider.XML_TAG); |
||||||
|
addAWTEventListeners(providers); |
||||||
|
} |
||||||
|
}; |
||||||
|
PluginEventListener onStop = new PluginEventListener() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public void on(PluginEvent event) { |
||||||
|
|
||||||
|
PluginRuntime runtime = event.getContext().getRuntime(); |
||||||
|
Set<GlobalListenerProvider> providers = runtime.get(PluginModule.ExtraDesign, GlobalListenerProvider.XML_TAG); |
||||||
|
removeAWTEventListeners(providers); |
||||||
|
} |
||||||
|
}; |
||||||
|
GeneralContext.listenPlugin(PluginEventType.AfterRun, onRun, filter); |
||||||
|
GeneralContext.listenPlugin(PluginEventType.BeforeStop, onStop, filter); |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
private void addAWTEventListeners(Set<GlobalListenerProvider> providers) { |
||||||
|
|
||||||
|
AWTEventListener listener; |
||||||
|
for (GlobalListenerProvider provider : providers) { |
||||||
|
listener = provider.listener(); |
||||||
|
Toolkit.getDefaultToolkit().addAWTEventListener(listener, AWTEvent.KEY_EVENT_MASK); |
||||||
|
add(provider, listener); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private void removeAWTEventListeners(Set<GlobalListenerProvider> providers) { |
||||||
|
|
||||||
|
AWTEventListener listener; |
||||||
|
for (GlobalListenerProvider provider : providers) { |
||||||
|
listener = get(provider); |
||||||
|
Toolkit.getDefaultToolkit().removeAWTEventListener(listener); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private synchronized void add(GlobalListenerProvider provider, AWTEventListener listener) { |
||||||
|
|
||||||
|
map.put(provider, listener); |
||||||
|
} |
||||||
|
|
||||||
|
private synchronized AWTEventListener get(GlobalListenerProvider provider) { |
||||||
|
|
||||||
|
return map.get(provider); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue