/*
This file belongs to the Servoy development and deployment environment, Copyright (C) 1997-2010 Servoy BV
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU Affero General Public License as published by the Free
Software Foundation; either version 3 of the License, or (at your option) any
later version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License along
with this program; if not, see http://www.gnu.org/licenses or write to the Free
Software Foundation,Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
*/
package com.servoy.j2db.server.headlessclient.dataui;
import java.util.ArrayList;
import java.util.Iterator;
import org.apache.wicket.Component;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.markup.html.list.ListItem;
import com.servoy.j2db.dataprocessing.IDataAdapter;
import com.servoy.j2db.dataprocessing.IDisplayData;
import com.servoy.j2db.dataprocessing.IRecord;
import com.servoy.j2db.dataprocessing.IRecordInternal;
import com.servoy.j2db.dataprocessing.ModificationEvent;
import com.servoy.j2db.scripting.IScriptable;
import com.servoy.j2db.scripting.IScriptableProvider;
import com.servoy.j2db.server.headlessclient.MainPage;
import com.servoy.j2db.server.headlessclient.dataui.WebCellBasedView.CellContainer;
import com.servoy.j2db.ui.IProviderStylePropertyChanges;
import com.servoy.j2db.ui.ISupportOnRender;
import com.servoy.j2db.ui.ISupportOnRenderCallback;
import com.servoy.j2db.ui.scripting.AbstractRuntimeRendersupportComponent;
/**
* A {@link IDataAdapter} used in {@link WebCellBasedView} for there columns to handle valuechanged events to make sure that the right cells are set to changed.
*
* @author jcompagner
*/
public class WebCellAdapter implements IDataAdapter
{
private final ArrayList listners = new ArrayList();
private final String dataprovider;
private final WebCellBasedView view;
public WebCellAdapter(String dataprovider, WebCellBasedView view)
{
this.dataprovider = dataprovider;
this.view = view;
}
public void addDataListener(IDataAdapter l)
{
if (!listners.contains(l) && l != this) listners.add(l);
}
public void removeDataListener(IDataAdapter listner)
{
listners.remove(listner);
}
public void displayValueChanged(ModificationEvent event)
{
}
public String getDataProviderID()
{
return dataprovider;
}
public void setFindMode(boolean b)
{
}
public void setRecord(IRecordInternal state)
{
}
public void valueChanged(ModificationEvent e)
{
MainPage mp = view.findParent(MainPage.class);
if (mp != null) mp.touch();
IRecord record = e.getRecord();
Iterator iterator = ((MarkupContainer)view.getTable()).iterator();
while (iterator.hasNext())
{
Object next = iterator.next();
if (next instanceof ListItem)
{
ListItem li = (ListItem)next;
Object modelObject = li.getModelObject();
if (record == null || modelObject == record)
{
Iterator iterator2 = li.iterator();
while (iterator2.hasNext())
{
Object cell = iterator2.next();
cell = CellContainer.getContentsForCell((Component)cell);
if (cell instanceof IProviderStylePropertyChanges && cell instanceof IDisplayData)
{
// only test if it is not already changed
view.checkForValueChanges(cell);
// do fire on render on all components for record change
if (cell instanceof ISupportOnRender && cell instanceof IScriptableProvider)
{
IScriptable so = ((IScriptableProvider)cell).getScriptObject();
if (so instanceof AbstractRuntimeRendersupportComponent &&
((ISupportOnRenderCallback)so).getRenderEventExecutor().hasRenderCallback())
{
String componentDataproviderID = ((AbstractRuntimeRendersupportComponent)so).getDataProviderID();
if (record != null || (e.getName() != null && e.getName().equals(componentDataproviderID)))
{
((ISupportOnRender)cell).fireOnRender(true);
}
}
}
}
}
if (record != null) break;
}
}
}
}
}