/* 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.ui; import com.servoy.j2db.IScriptExecuter; import com.servoy.j2db.dataprocessing.IRecordInternal; import com.servoy.j2db.persistence.StaticContentSpecLoader; import com.servoy.j2db.scripting.JSRenderEvent; import com.servoy.j2db.util.Utils; /** * On render event executor. * * @author gboros * */ public class RenderEventExecutor { private final ISupportOnRenderCallback onRenderComponent; private String renderCallback; private Object[] renderCallbackArgs; private IScriptExecuter renderScriptExecuter; private IRecordInternal renderRecord; private int renderIndex; private boolean renderIsSelected; private boolean isRenderStateChanged; private boolean isOnRenderExecuting; public RenderEventExecutor(ISupportOnRenderCallback onRenderComponent) { this.onRenderComponent = onRenderComponent; } public void setRenderCallback(String id, Object[] args) { renderCallback = id; renderCallbackArgs = args; } public void setRenderScriptExecuter(IScriptExecuter scriptExecuter) { renderScriptExecuter = scriptExecuter; } public boolean hasRenderCallback() { return renderCallback != null; } public boolean isDifferentRenderState(IRecordInternal record, int index, boolean isSelected) { return !Utils.equalObjects(renderRecord, record) || renderIndex != index || renderIsSelected != isSelected; } public void setRenderState(IRecordInternal record, int index, boolean isSelected, boolean optimizeChangedState) { if (!optimizeChangedState || isDifferentRenderState(record, index, isSelected)) { renderRecord = record; renderIndex = index; renderIsSelected = isSelected; setRenderStateChanged(); } } public void setRenderStateChanged() { isRenderStateChanged = true; onRenderComponent.setRenderableStateChanged(); } public boolean isRenderStateChanged() { return isRenderStateChanged; } public boolean isOnRenderExecuting() { return isOnRenderExecuting; } public void fireOnRender(boolean hasFocus) { if (!isOnRenderExecuting && isRenderStateChanged && renderScriptExecuter != null && renderCallback != null) { isOnRenderExecuting = true; try { IScriptRenderMethods renderable = onRenderComponent.getRenderable(); if (renderable instanceof RenderableWrapper) ((RenderableWrapper)renderable).resetProperties(); JSRenderEvent event = new JSRenderEvent(); event.setElement(onRenderComponent); event.setHasFocus(hasFocus); event.setRecord(renderRecord); event.setIndex(renderIndex); event.setSelected(renderIsSelected); renderScriptExecuter.executeFunction(renderCallback, Utils.arrayMerge(new Object[] { event }, renderCallbackArgs), false, onRenderComponent.getComponent(), false, StaticContentSpecLoader.PROPERTY_ONRENDERMETHODID.getPropertyName(), true); isRenderStateChanged = false; } finally { isOnRenderExecuting = false; } } } }