/*
* Copyright 2015 JBoss, by Red Hat, Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.uberfire.ext.layout.editor.client;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import com.google.gwt.user.client.ui.Widget;
import org.jboss.errai.common.client.api.Caller;
import org.jboss.errai.common.client.api.RemoteCallback;
import org.jboss.errai.common.client.ui.ElementWrapperWidget;
import org.uberfire.backend.vfs.Path;
import org.uberfire.client.mvp.UberElement;
import org.uberfire.ext.editor.commons.client.file.popups.SavePopUpPresenter;
import org.uberfire.ext.layout.editor.api.LayoutServices;
import org.uberfire.ext.layout.editor.api.editor.LayoutTemplate;
import org.uberfire.ext.layout.editor.client.api.LayoutDragComponent;
import org.uberfire.ext.layout.editor.client.api.LayoutDragComponentGroup;
import org.uberfire.ext.layout.editor.client.api.LayoutEditorPlugin;
import org.uberfire.ext.plugin.model.LayoutEditorModel;
import org.uberfire.ext.plugin.model.PluginType;
import org.uberfire.ext.plugin.service.PluginServices;
import org.uberfire.mvp.ParameterizedCommand;
@Dependent
public class LayoutEditorPluginImpl implements LayoutEditorPlugin {
@Inject
private LayoutEditorPresenter layoutEditorPresenter;
@Inject
private Caller<PluginServices> pluginServices;
@Inject
private Caller<LayoutServices> layoutServices;
@Inject
private SavePopUpPresenter savePopUpPresenter;
private String pluginName;
private String emptyTitleText;
private String emptySubTitleText;
private PluginType pluginType;
private Path currentPath;
private ParameterizedCommand<LayoutEditorModel> loadCallBack;
@Override
public void init(String layoutName,
LayoutDragComponentGroup layoutDragComponentGroup,
String emptyTitleText,
String emptySubTitleText) {
this.pluginName = layoutName;
this.emptyTitleText = emptyTitleText;
this.emptySubTitleText = emptySubTitleText;
layoutEditorPresenter.addDraggableComponentGroup(layoutDragComponentGroup);
}
@Override
public void clear() {
layoutEditorPresenter.clear();
}
@Override
public Widget asWidget() {
final UberElement<LayoutEditorPresenter> view = layoutEditorPresenter.getView();
return ElementWrapperWidget.getWidget(view.getElement());
}
@Override
public void loadLayout(LayoutTemplate layoutTemplate) {
layoutEditorPresenter.loadLayout(layoutTemplate,
emptyTitleText,
emptySubTitleText);
}
@Override
public void loadDefaultLayout(String layoutName) {
layoutEditorPresenter.loadEmptyLayout(layoutName,
emptyTitleText,
emptySubTitleText);
}
@Override
public LayoutTemplate getLayout() {
return getLayoutEditor();
}
private LayoutTemplate getLayoutEditor() {
LayoutTemplate layout = layoutEditorPresenter.getLayout();
layout.setName(pluginName);
return layout;
}
@Override
public void addLayoutProperty(String key,
String value) {
layoutEditorPresenter.addLayoutProperty(key,
value);
}
@Override
public String getLayoutProperty(String key) {
return layoutEditorPresenter.getLayoutProperty(key);
}
@Override
public void load(final PluginType pluginType,
final Path currentPath,
final ParameterizedCommand<LayoutEditorModel> loadCallBack) {
this.pluginType = pluginType;
this.currentPath = currentPath;
this.loadCallBack = loadCallBack;
pluginServices.call(new RemoteCallback<LayoutEditorModel>() {
@Override
public void callback(final LayoutEditorModel model) {
layoutServices.call(new RemoteCallback<LayoutTemplate>() {
@Override
public void callback(final LayoutTemplate layoutTemplate) {
if (layoutTemplate != null) {
layoutEditorPresenter.loadLayout(layoutTemplate,
emptyTitleText,
emptySubTitleText);
loadCallBack.execute(getLayoutContent(currentPath,
model.getLayoutEditorModel()));
} else {
layoutEditorPresenter
.loadEmptyLayout(pluginName,
emptyTitleText,
emptySubTitleText);
;
}
}
}).convertLayoutFromString(model.getLayoutEditorModel());
}
}).getLayoutEditor(currentPath,
pluginType);
}
@Override
public void save(final Path path,
final RemoteCallback<Path> saveSuccessCallback) {
layoutServices.call(new RemoteCallback<String>() {
@Override
public void callback(final String model) {
savePlugin(model,
path,
saveSuccessCallback);
}
}).convertLayoutToString(getLayoutEditor());
}
private void savePlugin(final String model,
final Path path,
final RemoteCallback<Path> saveSuccessCallback) {
savePopUpPresenter.show(path,
new ParameterizedCommand<String>() {
@Override
public void execute(final String commitMessage) {
pluginServices.call(saveSuccessCallback).saveLayout(
getLayoutContent(path,
model),
commitMessage);
}
});
}
private LayoutEditorModel getLayoutContent(Path currentPath,
String model) {
return new LayoutEditorModel(pluginName,
pluginType,
currentPath,
model);
}
@Override
public void addDraggableComponentGroup(LayoutDragComponentGroup group) {
layoutEditorPresenter.addDraggableComponentGroup(group);
}
@Override
public void addDraggableComponentToGroup(String groupId,
String componentId,
LayoutDragComponent component) {
layoutEditorPresenter.addDraggableComponentToGroup(groupId,
componentId,
component);
}
@Override
public void removeDraggableComponentGroup(String groupId) {
layoutEditorPresenter.removeDraggableGroup(groupId);
}
@Override
public void removeDraggableGroupComponent(String groupId,
String componentId) {
layoutEditorPresenter.removeDraggableComponentFromGroup(groupId,
componentId);
}
}