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 package info.magnolia.ui.mediaeditor;
35
36 import info.magnolia.event.EventBus;
37 import info.magnolia.event.ResettableEventBus;
38 import info.magnolia.event.SimpleEventBus;
39 import info.magnolia.i18nsystem.I18nizer;
40 import info.magnolia.i18nsystem.SimpleTranslator;
41 import info.magnolia.module.ModuleRegistry;
42 import info.magnolia.objectfactory.ComponentProvider;
43 import info.magnolia.registry.RegistrationException;
44 import info.magnolia.ui.api.action.ActionExecutor;
45 import info.magnolia.ui.api.app.AppContext;
46 import info.magnolia.ui.api.availability.AvailabilityChecker;
47 import info.magnolia.ui.api.ioc.UiContextScoped;
48 import info.magnolia.ui.framework.ioc.SessionStore;
49 import info.magnolia.ui.framework.ioc.UiContextBoundComponentProvider;
50 import info.magnolia.ui.framework.ioc.UiContextReference;
51 import info.magnolia.ui.mediaeditor.action.MediaEditorActionExecutor;
52 import info.magnolia.ui.mediaeditor.definition.MediaEditorDefinition;
53 import info.magnolia.ui.mediaeditor.event.MediaEditorCompletedEvent;
54 import info.magnolia.ui.mediaeditor.registry.MediaEditorRegistry;
55
56 import javax.inject.Inject;
57
58 import com.google.inject.Key;
59 import com.google.inject.name.Names;
60
61
62
63
64 @UiContextScoped
65 public class MediaEditorPresenterFactoryImpl implements MediaEditorPresenterFactory {
66
67 private ComponentProvider subAppComponentProvider;
68
69 private MediaEditorRegistry registry;
70
71 private I18nizer i18nizer;
72
73 private final SimpleTranslator i18n;
74
75 @Inject
76 public MediaEditorPresenterFactoryImpl(ComponentProvider subAppComponentProvider, MediaEditorRegistry registry, I18nizer i18nizer, SimpleTranslator i18n) {
77 this.subAppComponentProvider = subAppComponentProvider;
78 this.registry = registry;
79 this.i18nizer = i18nizer;
80 this.i18n = i18n;
81 }
82
83
84
85
86 @Deprecated
87 public MediaEditorPresenterFactoryImpl(ComponentProvider subAppComponentProvider, ModuleRegistry moduleRegistry, MediaEditorRegistry registry, I18nizer i18nizer, SimpleTranslator i18n) {
88 this(subAppComponentProvider, registry, i18nizer, i18n);
89 }
90
91 @Override
92 public MediaEditorPresenter getPresenterById(String id) {
93 return getPresenterByDefinition(createDefinition(id));
94 }
95
96 private MediaEditorDefinition createDefinition(String id) {
97 MediaEditorDefinition mediaEditorDefinition;
98 try {
99 mediaEditorDefinition = registry.get(id);
100 } catch (RegistrationException e1) {
101 throw new RuntimeException(e1);
102 }
103
104 if (mediaEditorDefinition == null) {
105 throw new IllegalArgumentException("No media editor definition registered for name [" + id + "]");
106 }
107 return i18nizer.decorate(mediaEditorDefinition);
108 }
109
110 private ComponentProvider createMediaEditorComponentProvider() {
111 return new UiContextBoundComponentProvider(getMediaEditorScopeKey());
112 }
113
114 private UiContextReference getMediaEditorScopeKey() {
115 return UiContextReference.ofView("mediaeditor", ((UiContextBoundComponentProvider) subAppComponentProvider).getUiContextReference());
116 }
117
118 @Override
119 public MediaEditorPresenter getPresenterByDefinition(MediaEditorDefinition definition) {
120 final EventBus eventBus = new ResettableEventBus(new SimpleEventBus());
121 final UiContextReference mediaEditorContextKey = getMediaEditorScopeKey();
122 SessionStore.access().createBeanStore(mediaEditorContextKey).put(Key.get(EventBus.class, Names.named(MediaEditorEventBus.NAME)), eventBus);
123
124 ComponentProvider mediaEditorComponentProvider = createMediaEditorComponentProvider();
125 AppContext appContext = mediaEditorComponentProvider.getComponent(AppContext.class);
126 MediaEditorView view = mediaEditorComponentProvider.getComponent(MediaEditorView.class);
127 AvailabilityChecker availabilityChecker = mediaEditorComponentProvider.getComponent(AvailabilityChecker.class);
128 ActionExecutor mediaActionExecutor = mediaEditorComponentProvider.getComponent(ActionExecutor.class);
129 ((MediaEditorActionExecutor) mediaActionExecutor).setDef(definition);
130
131 final MediaEditorPresenter mediaEditorPresenter = new MediaEditorPresenterImpl(definition, eventBus, view,
132 appContext, i18n, availabilityChecker);
133
134 mediaEditorPresenter.addCompletionHandler(new MediaEditorCompletedEvent.Handler() {
135 @Override
136 public void onSubmit(MediaEditorCompletedEvent event) {
137 SessionStore.access().releaseBeanStore(mediaEditorContextKey);
138 }
139
140 @Override
141 public void onCancel(MediaEditorCompletedEvent event) {
142 SessionStore.access().releaseBeanStore(mediaEditorContextKey);
143 }
144 });
145
146 mediaEditorPresenter.setActionExecutor(mediaActionExecutor);
147 return mediaEditorPresenter;
148 }
149
150 }