/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* 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.components.columns;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.enterprise.context.Dependent;
import javax.enterprise.event.Event;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import org.uberfire.client.mvp.UberElement;
import org.uberfire.ext.layout.editor.api.editor.LayoutComponent;
import org.uberfire.ext.layout.editor.client.components.rows.Row;
import org.uberfire.ext.layout.editor.client.components.rows.RowDrop;
import org.uberfire.ext.layout.editor.client.infra.BeanHelper;
import org.uberfire.ext.layout.editor.client.infra.ColumnDrop;
import org.uberfire.ext.layout.editor.client.infra.ColumnResizeEvent;
import org.uberfire.ext.layout.editor.client.infra.DnDManager;
import org.uberfire.ext.layout.editor.client.infra.LayoutDragComponentHelper;
import org.uberfire.ext.layout.editor.client.infra.UniqueIDGenerator;
import org.uberfire.mvp.ParameterizedCommand;
@Dependent
public class ColumnWithComponents implements Column {
private final View view;
private UniqueIDGenerator idGenerator = new UniqueIDGenerator();
private String id;
private String parentId;
private Integer size;
private ParameterizedCommand<ColumnDrop> dropCommand;
private ParameterizedCommand<ColumnDrop> removeComponentCommand;
private ParameterizedCommand<Column> removeColumnCommand;
private Row row;
private Instance<Row> rowInstance;
private DnDManager dndManager;
private LayoutDragComponentHelper layoutDragComponentHelper;
private boolean canResizeLeft;
private boolean canResizeRight;
private Event<ColumnResizeEvent> columnResizeEvent;
@Inject
public ColumnWithComponents(final View view,
Instance<Row> rowInstance,
DnDManager dndManager,
LayoutDragComponentHelper layoutDragComponentHelper,
Event<ColumnResizeEvent> columnResizeEvent) {
this.view = view;
this.rowInstance = rowInstance;
this.dndManager = dndManager;
this.layoutDragComponentHelper = layoutDragComponentHelper;
this.columnResizeEvent = columnResizeEvent;
}
@PostConstruct
public void post() {
view.init(this);
}
@PreDestroy
public void preDestroy() {
destroy(row);
}
public void init(String parentId,
Integer size,
ParameterizedCommand<ColumnDrop> dropCommand,
ParameterizedCommand<ColumnDrop> removeComponentCommand,
ParameterizedCommand<Column> removeCommand) {
this.size = size;
this.parentId = parentId;
this.dropCommand = dropCommand;
this.removeComponentCommand = removeComponentCommand;
this.removeColumnCommand = removeCommand;
view.setSize(size.toString());
row = createInstanceRow();
row.disableDrop();
row.init(createDropCommand(),
createRowRemoveCommand(),
createComponentRemoveCommand(),
this);
}
public void onDrop(ColumnDrop.Orientation orientation,
String dndData) {
if (dndManager.isOnComponentMove()) {
dndManager.endComponentMove();
dropCommand.execute(new ColumnDrop(dndManager.getLayoutComponentMove(),
id,
orientation)
.fromMove(dndManager.getDraggedColumn()));
} else {
dropCommand.execute(
new ColumnDrop(layoutDragComponentHelper.getLayoutComponentFromDrop(dndData),
id,
orientation));
}
}
public boolean hasComponent(Column targetColumn) {
return row.hasComponent(targetColumn) != null;
}
public void remove(Column targetColumn) {
row.removeColumn(targetColumn);
}
public boolean canResizeLeft() {
return canResizeLeft;
}
public void resizeLeft() {
columnResizeEvent.fire(new ColumnResizeEvent(id,
parentId).left());
}
public boolean canResizeRight() {
return canResizeRight;
}
public void resizeRight() {
columnResizeEvent.fire(new ColumnResizeEvent(id,
parentId).right());
}
protected Row createInstanceRow() {
Row row = rowInstance.get();
row.setId(idGenerator.createRowID(id));
return row;
}
private ParameterizedCommand<ColumnDrop> createComponentRemoveCommand() {
return drop -> removeComponentCommand.execute(drop);
}
private ParameterizedCommand<Row> createRowRemoveCommand() {
return row -> removeColumnCommand.execute(this);
}
public void withComponents(ComponentColumn... _columns) {
row.addColumns(_columns);
}
ParameterizedCommand<RowDrop> createDropCommand() {
return rowDrop -> {
};
}
@Override
public UberElement<ColumnWithComponents> getView() {
view.clear();
if (hasInnerRows()) {
view.addRow(row.getView());
}
view.calculateSize();
return view;
}
@Override
public Integer getSize() {
return size;
}
@Override
public void setSize(Integer size) {
this.size = size;
view.setSize(size.toString());
}
@Override
public void reduzeSize() {
final int newSize = this.size - 1;
setSize(newSize);
}
@Override
public void incrementSize() {
final int newSize = this.size + 1;
setSize(newSize);
}
@Override
public LayoutComponent getLayoutComponent() {
return null;
}
@Override
public boolean hasInnerRows() {
return row != null;
}
@Override
public void calculateSize() {
view.calculateSize();
}
public Row getRow() {
return row;
}
@Override
public String getParentId() {
return parentId;
}
protected void destroy(Object o) {
BeanHelper.destroy(o);
}
public void calculateSizeChilds() {
row.calculateSizeChilds();
}
@Override
public void setupResize(boolean canResizeLeft,
boolean canResizeRight) {
this.canResizeLeft = canResizeLeft;
this.canResizeRight = canResizeRight;
view.setupResize();
}
@Override
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public boolean shouldPreviewDrop() {
return !dndManager.isOnRowMove();
}
public interface View extends UberElement<ColumnWithComponents> {
void setSize(String size);
void addRow(UberElement<Row> view);
void calculateSize();
void clear();
void setupResize();
}
}