/**
* Copyright 2008-2016 Qualogy Solutions B.V.
*
* 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 com.qualogy.qafe.gwt.client.ui.renderer;
import java.util.List;
import java.util.Vector;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.HasChangeHandlers;
import com.google.gwt.event.logical.shared.HasValueChangeHandlers;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.gen2.table.override.client.FlexTable;
import com.google.gwt.user.client.ui.ChangeListener;
import com.google.gwt.user.client.ui.SourcesChangeEvents;
import com.google.gwt.user.client.ui.UIObject;
import com.google.gwt.user.client.ui.Widget;
import com.qualogy.qafe.gwt.client.component.DataChangeHandler;
import com.qualogy.qafe.gwt.client.component.HasDataChangeHandlers;
import com.qualogy.qafe.gwt.client.component.HasDataGridMethods;
import com.qualogy.qafe.gwt.client.component.HasRowSelectionChangeHandlers;
import com.qualogy.qafe.gwt.client.component.RowSelectionChangeEvent;
import com.qualogy.qafe.gwt.client.component.RowSelectionChangeHandler;
import com.qualogy.qafe.gwt.client.ui.renderer.events.CallbackHandler;
import com.qualogy.qafe.gwt.client.vo.functions.BuiltInComponentGVO;
import com.qualogy.qafe.gwt.client.vo.functions.DataContainerGVO;
import com.qualogy.qafe.gwt.client.vo.functions.SetValueGVO;
import com.qualogy.qafe.gwt.client.vo.functions.execute.FunctionsExecutor;
import com.qualogy.qafe.gwt.client.vo.ui.ComponentGVO;
import com.qualogy.qafe.gwt.client.vo.ui.DataGridColumnGVO;
import com.qualogy.qafe.gwt.client.vo.ui.DataGridGVO;
public class PagingDataGridRenderer extends AbstractComponentRenderer {
private Vector<DataGridGVO> registeryOfOverflowItem4DataChange = new Vector<DataGridGVO>();
private Vector<DataGridGVO> changedByRowSelection = new Vector<DataGridGVO>();
public PagingDataGridRenderer() {
}
@Override
public UIObject render(ComponentGVO component, String uuid,String parent, String context) {
UIObject uiObject = null;
if (component != null) {
if (component instanceof DataGridGVO) {
DataGridGVO gvo = ((DataGridGVO)component).clone();
DataGridColumnGVO[] columns = gvo.getColumns();
if (columns!=null) {
for(int i=0; i<columns.length; i++){
columns[i].setUuid(uuid);
}
}
uiObject = DataGridFactory.createPagingDataGrid(gvo,uuid,parent);
if(gvo.getOverflowGroup() != null) {
UIObject datagrid = ((FlexTable)uiObject).getWidget(0, 0);
registerRowSelectionChange(gvo, datagrid);
}
}
}
return uiObject;
}
private void registerRowSelectionChange(final DataGridGVO datagridGVO, UIObject datagrid) {
if (datagrid instanceof HasRowSelectionChangeHandlers) {
((HasRowSelectionChangeHandlers)datagrid).addRowSelectionChangeHandler(new RowSelectionChangeHandler() {
@Override
public void onRowSelectionChange(RowSelectionChangeEvent event) {
UIObject source = event.getSource();
int rowIndex = event.getRowIndex();
Object rowValue = event.getRowValue();
try {
changedByRowSelection.add(datagridGVO);
handleRowSelectionChange(datagridGVO, source, rowIndex, rowValue);
if (!registeryOfOverflowItem4DataChange.contains(datagridGVO)) {
registerOverflowItemDataChange(datagridGVO, source);
registeryOfOverflowItem4DataChange.add(datagridGVO);
}
} finally {
changedByRowSelection.remove(datagridGVO);
}
}
});
}
}
private void handleRowSelectionChange(DataGridGVO datagridGVO, UIObject datagrid, int rowIndex, Object rowValue) {
String overflowGroup = datagridGVO.getOverflowGroup();
String key4OverflowGroup = generateId(overflowGroup, datagrid);
SetValueGVO setValueGVO = new SetValueGVO();
BuiltInComponentGVO dummyBuiltinGvo = new BuiltInComponentGVO();
setValueGVO.setBuiltInComponentGVO(dummyBuiltinGvo);
if(rowValue instanceof DataContainerGVO) {
setValueGVO.setDataContainer((DataContainerGVO) rowValue);
}
setValueGVO.setGroup(key4OverflowGroup);
FunctionsExecutor.getInstance().execute(setValueGVO);
}
private void registerOverflowItemDataChange(final DataGridGVO datagridGVO, final UIObject datagrid) {
String overflowGroup = datagridGVO.getOverflowGroup();
String key4OverflowGroup = generateId(overflowGroup, datagrid);
List<UIObject> overflowItems = RendererHelper.getGroupedComponent(key4OverflowGroup);
if (overflowItems == null) {
return;
}
for (UIObject overflowItem : overflowItems) {
if (overflowItem instanceof HasDataChangeHandlers) {
HasDataChangeHandlers hasDataChangeHandlers = (HasDataChangeHandlers)overflowItem;
hasDataChangeHandlers.addDataChangeHandler(new DataChangeHandler() {
@Override
public void onDataChange(UIObject uiObject, Object oldValue, Object newValue) {
handleOverflowItemDataChange(datagridGVO, datagrid, uiObject, newValue);
}
});
} else if (overflowItem instanceof HasValueChangeHandlers) {
HasValueChangeHandlers hasValueChangeHandlers = (HasValueChangeHandlers)overflowItem;
hasValueChangeHandlers.addValueChangeHandler(new ValueChangeHandler<Object>() {
@Override
public void onValueChange(ValueChangeEvent<Object> event) {
UIObject source = (UIObject)event.getSource();
handleOverflowItemDataChange(datagridGVO, datagrid, source);
}
});
} else if (overflowItem instanceof HasChangeHandlers) {
HasChangeHandlers hasChangeHandlers = (HasChangeHandlers)overflowItem;
hasChangeHandlers.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
UIObject source = (UIObject)event.getSource();
handleOverflowItemDataChange(datagridGVO, datagrid, source);
}
});
} else if (overflowItem instanceof SourcesChangeEvents) {
// LEGACY CODE
SourcesChangeEvents sourcesChangeEvents = (SourcesChangeEvents)overflowItem;
sourcesChangeEvents.addChangeListener(new ChangeListener() {
@Override
public void onChange(Widget sender) {
handleOverflowItemDataChange(datagridGVO, datagrid, sender);
}
});
}
}
}
private void handleOverflowItemDataChange(DataGridGVO datagridGVO, UIObject datagrid, UIObject overflowItem) {
Object value = null;
try {
value = CallbackHandler.getValue(overflowItem, overflowItem, true, null);
} catch (Exception e) {
return;
}
handleOverflowItemDataChange(datagridGVO, datagrid, overflowItem, value);
}
private void handleOverflowItemDataChange(DataGridGVO datagridGVO, UIObject datagrid, UIObject overflowItem, Object value) {
DataContainerGVO valueGVO = DataContainerGVO.create(value);
handleOverflowItemDataChange(datagridGVO, datagrid, overflowItem, valueGVO);
}
private void handleOverflowItemDataChange(DataGridGVO datagridGVO, UIObject datagrid, UIObject overflowItem, DataContainerGVO value) {
if (changedByRowSelection.contains(datagridGVO)) {
return;
}
if (!(datagrid instanceof HasDataGridMethods)) {
return;
}
String columnName = RendererHelper.getNamedComponentName(overflowItem);
HasDataGridMethods hasDataGridMethods = (HasDataGridMethods)datagrid;
hasDataGridMethods.setColumnValue(columnName, value);
}
private String generateId(String value, UIObject component) {
String parent = RendererHelper.getParentComponent(component);
String context = RendererHelper.getComponentContext(component);
return RendererHelper.generateId(value, parent, context);
}
}