use of com.servoy.j2db.ui.IProviderStylePropertyChanges in project servoy-client by Servoy.
the class ScrollResponseHeaderContainer method checkForValueChanges.
protected void checkForValueChanges(Object cell) {
IStylePropertyChanges spc = ((IProviderStylePropertyChanges) cell).getStylePropertyChanges();
if (!spc.isChanged() && !spc.isValueChanged()) {
IModel innermostModel = ((Component) cell).getInnermostModel();
if (innermostModel instanceof RecordItemModel) {
Object lastRenderedValue = ((RecordItemModel) innermostModel).getLastRenderedValue((Component) cell);
Object object = ((Component) cell).getDefaultModelObject();
if (!Utils.equalObjects(lastRenderedValue, object)) {
spc.setValueChanged();
}
} else {
spc.setChanged();
}
}
}
use of com.servoy.j2db.ui.IProviderStylePropertyChanges in project servoy-client by Servoy.
the class WebEventExecutor method generateResponse.
@SuppressWarnings("nls")
public static void generateResponse(final AjaxRequestTarget target, Page page) {
WebClientSession webClientSession = WebClientSession.get();
if (target != null && page instanceof MainPage && webClientSession != null && webClientSession.getWebClient() != null && webClientSession.getWebClient().getSolution() != null) {
if (target instanceof CloseableAjaxRequestTarget && ((CloseableAjaxRequestTarget) target).isClosed()) {
return;
}
// do executed the events for before generating the response.
webClientSession.getWebClient().executeEvents();
if (webClientSession.getWebClient() == null || webClientSession.getWebClient().getSolution() == null) {
// how can web client be null here ?
return;
}
final MainPage mainPage = ((MainPage) page);
if (mainPage.getPageMap() instanceof ModifiedAccessStackPageMap) {
// at every request mark the pagemap as dirty so lru eviction really works
((ModifiedAccessStackPageMap) mainPage.getPageMap()).flagDirty();
}
// If the main form is switched then do a normal redirect.
if (mainPage.isMainFormSwitched()) {
mainPage.versionPush();
RequestCycle.get().setResponsePage(page);
} else {
page.visitChildren(WebTabPanel.class, new Component.IVisitor<WebTabPanel>() {
public Object component(WebTabPanel component) {
component.initalizeFirstTab();
return IVisitor.CONTINUE_TRAVERSAL;
}
});
mainPage.addWebAnchoringInfoIfNeeded();
final Set<WebCellBasedView> tableViewsToRender = new HashSet<WebCellBasedView>();
final List<String> valueChangedIds = new ArrayList<String>();
final List<String> invalidValueIds = new ArrayList<String>();
final Map<WebCellBasedView, List<Integer>> tableViewsWithChangedRowIds = new HashMap<WebCellBasedView, List<Integer>>();
// first, get all invalidValue & valueChanged components
page.visitChildren(IProviderStylePropertyChanges.class, new Component.IVisitor<Component>() {
public Object component(Component component) {
if (component instanceof IDisplayData && !((IDisplayData) component).isValueValid()) {
invalidValueIds.add(component.getMarkupId());
}
if (((IProviderStylePropertyChanges) component).getStylePropertyChanges().isValueChanged()) {
if (component.getParent().isVisibleInHierarchy()) {
// the component will get added to the target & rendered only if it's parent is visible in hierarchy because changed flag is also set (see the visitor below)
// so we will only list these components if they are visible otherwise ajax timer could end up sending hundreds of id's that don't actually render every 5 seconds
// because the valueChanged flag is cleared only by onRender
valueChangedIds.add(component.getMarkupId());
if (component instanceof MarkupContainer) {
((MarkupContainer) component).visitChildren(IDisplayData.class, new IVisitor<Component>() {
public Object component(Component comp) {
// labels/buttons that don't display data are not changed
if (!(comp instanceof ILabel)) {
valueChangedIds.add(comp.getMarkupId());
}
return CONTINUE_TRAVERSAL;
}
});
}
}
}
return CONTINUE_TRAVERSAL;
}
});
// add changed components to target; if a component is changed, the change check won't go deeper in hierarchy
page.visitChildren(IProviderStylePropertyChanges.class, new Component.IVisitor<Component>() {
public Object component(Component component) {
if (((IProviderStylePropertyChanges) component).getStylePropertyChanges().isChanged()) {
if (component.getParent().isVisibleInHierarchy()) {
target.addComponent(component);
generateDragAttach(component, target.getHeaderResponse());
WebForm parentForm = component.findParent(WebForm.class);
boolean isDesignMode = parentForm != null && parentForm.isDesignMode();
if (!component.isVisible() || (component instanceof WrapperContainer && !((WrapperContainer) component).getDelegate().isVisible())) {
((IProviderStylePropertyChanges) component).getStylePropertyChanges().setRendered();
if (isDesignMode) {
target.appendJavascript("Servoy.ClientDesign.hideSelected('" + component.getMarkupId() + "')");
}
} else {
if (isDesignMode) {
target.appendJavascript("Servoy.ClientDesign.refreshSelected('" + component.getMarkupId() + "')");
}
// some components need to perform js layout tasks when their markup is replaced when using anchored layout
mainPage.getPageContributor().markComponentForAnchorLayoutIfNeeded(component);
}
ListItem<IRecordInternal> row = component.findParent(ListItem.class);
if (row != null) {
WebCellBasedView wcbv = row.findParent(WebCellBasedView.class);
if (wcbv != null) {
if (tableViewsWithChangedRowIds.get(wcbv) == null) {
tableViewsWithChangedRowIds.put(wcbv, new ArrayList<Integer>());
}
List<Integer> ids = tableViewsWithChangedRowIds.get(wcbv);
int changedRowIdx = wcbv.indexOf(row);
if (changedRowIdx >= 0 && !ids.contains(changedRowIdx)) {
ids.add(changedRowIdx);
}
}
}
}
return IVisitor.CONTINUE_TRAVERSAL_BUT_DONT_GO_DEEPER;
} else if (component instanceof WebCellBasedView)
tableViewsToRender.add((WebCellBasedView) component);
return component.isVisible() ? IVisitor.CONTINUE_TRAVERSAL : IVisitor.CONTINUE_TRAVERSAL_BUT_DONT_GO_DEEPER;
}
});
page.visitChildren(IComponentToRequestAttacher.class, new Component.IVisitor<Component>() {
public Object component(Component component) {
((IComponentToRequestAttacher) component).attachComponents(target);
return IVisitor.CONTINUE_TRAVERSAL;
}
});
final List<String> visibleEditors = new ArrayList<String>();
page.visitChildren(WebDataHtmlArea.class, new Component.IVisitor<Component>() {
public Object component(Component component) {
visibleEditors.add(((WebDataHtmlArea) component).getEditorID());
return IVisitor.CONTINUE_TRAVERSAL;
}
});
StringBuffer argument = new StringBuffer();
for (String id : visibleEditors) {
argument.append("\"");
argument.append(id);
argument.append("\"");
if (visibleEditors.indexOf(id) != visibleEditors.size() - 1) {
argument.append(",");
}
}
target.prependJavascript("Servoy.HTMLEdit.removeInvalidEditors(" + argument + ");");
String rowSelectionScript, columnResizeScript;
for (final WebCellBasedView wcbv : tableViewsToRender) {
if (wcbv.isScrollMode())
wcbv.scrollViewPort(target);
wcbv.updateRowSelection(target);
List<Integer> changedIds = tableViewsWithChangedRowIds.get(wcbv);
List<Integer> selectedIndexesChanged = wcbv.getIndexToUpdate(false);
List<Integer> mergedIds = selectedIndexesChanged != null ? selectedIndexesChanged : new ArrayList<Integer>();
if (changedIds != null) {
for (Integer id : changedIds) {
if (!mergedIds.contains(id)) {
mergedIds.add(id);
}
}
}
rowSelectionScript = wcbv.getRowSelectionScript(mergedIds);
wcbv.clearSelectionByCellActionFlag();
if (rowSelectionScript != null)
target.appendJavascript(rowSelectionScript);
columnResizeScript = wcbv.getColumnResizeScript();
if (columnResizeScript != null)
target.appendJavascript(columnResizeScript);
}
// double check if the page contributor is changed, because the above IStylePropertyChanges ischanged could have altered it.
if (mainPage.getPageContributor().getStylePropertyChanges().isChanged()) {
target.addComponent((Component) mainPage.getPageContributor());
}
if (invalidValueIds.size() == 0) {
// $NON-NLS-1$
target.appendJavascript("setValidationFailed(null);");
} else {
// $NON-NLS-1$
target.appendJavascript("setValidationFailed('" + invalidValueIds.get(0) + "');");
}
Component comp = mainPage.getAndResetToFocusComponent();
if (comp != null) {
if (comp instanceof WebDataHtmlArea) {
target.appendJavascript("tinyMCE.activeEditor.focus()");
} else {
target.focusComponent(comp);
}
} else if (mainPage.getAndResetMustFocusNull()) {
// This is needed for example when showing a non-modal dialog in IE7 (or otherwise
// the new window would be displayed in the background).
target.focusComponent(null);
}
if (valueChangedIds.size() > 0) {
argument = new StringBuffer();
for (String id : valueChangedIds) {
argument.append("\"");
argument.append(id);
argument.append("\"");
if (valueChangedIds.indexOf(id) != valueChangedIds.size() - 1) {
argument.append(",");
}
}
target.prependJavascript("storeValueAndCursorBeforeUpdate(" + argument + ");");
target.appendJavascript("restoreValueAndCursorAfterUpdate();");
}
// if we have admin info, show it
String adminInfo = mainPage.getAdminInfo();
if (adminInfo != null) {
adminInfo = Utils.stringReplace(adminInfo, "\r", "");
adminInfo = Utils.stringReplace(adminInfo, "\n", "\\n");
target.appendJavascript("alert('" + adminInfo + "');");
}
// If we have a status text, set it.
String statusText = mainPage.getStatusText();
if (statusText != null) {
target.appendJavascript("setStatusText('" + statusText + "');");
}
String show = mainPage.getShowUrlScript();
if (show != null) {
target.appendJavascript(show);
}
mainPage.renderJavascriptChanges(target);
if (((WebClientInfo) webClientSession.getClientInfo()).getProperties().isBrowserInternetExplorer() && ((WebClientInfo) webClientSession.getClientInfo()).getProperties().getBrowserVersionMajor() < 9) {
target.appendJavascript("Servoy.Utils.checkWebFormHeights();");
}
try {
if (isStyleSheetLimitForIE(page.getSession())) {
target.appendJavascript("testStyleSheets();");
}
} catch (Exception e) {
// cannot retrieve session/clientinfo/properties?
Debug.error(e);
target.appendJavascript("testStyleSheets();");
}
}
}
}
use of com.servoy.j2db.ui.IProviderStylePropertyChanges in project servoy-client by Servoy.
the class ScrollResponseHeaderContainer method applyStyleOnComponent.
private void applyStyleOnComponent(Component comp, Object bgColor, Object fgColor, Object compFont, Object listItemBorder) {
if (comp instanceof IScriptableProvider) {
IScriptable s = ((IScriptableProvider) comp).getScriptObject();
if (s instanceof IRuntimeComponent) {
IRuntimeComponent sbm = (IRuntimeComponent) s;
RenderableWrapper sbmRW = null;
if (s instanceof ISupportOnRenderCallback) {
IScriptRenderMethods sr = ((ISupportOnRenderCallback) s).getRenderable();
if (sr instanceof RenderableWrapper)
sbmRW = (RenderableWrapper) sr;
}
if (bgColor != null) {
if (sbmRW != null)
sbmRW.clearProperty(RenderableWrapper.PROPERTY_BGCOLOR);
String oldColor = sbm.getBgcolor();
sbm.setBgcolor(bgColor.toString());
if (sbm instanceof AbstractRuntimeBaseComponent && ((AbstractRuntimeBaseComponent) sbm).getComponent() instanceof WebDataLookupField) {
((WebDataLookupField) ((AbstractRuntimeBaseComponent) sbm).getComponent()).setListColor(PersistHelper.createColor(oldColor));
}
if (sbm.isTransparent()) {
// apply the bg color even if transparent by clearing the transparent flag in the property changes map
if (comp instanceof IProviderStylePropertyChanges && ((IProviderStylePropertyChanges) comp).getStylePropertyChanges() instanceof IStylePropertyChangesRecorder) {
((IStylePropertyChangesRecorder) (((IProviderStylePropertyChanges) comp).getStylePropertyChanges())).setTransparent(false);
}
}
} else {
if (sbmRW != null && !Utils.equalObjects(sbmRW.getOnRenderSetProperties().get(RenderableWrapper.PROPERTY_BGCOLOR), sbm.getBgcolor()))
sbmRW.clearProperty(RenderableWrapper.PROPERTY_BGCOLOR);
sbm.setBgcolor(sbm.getBgcolor());
setParentBGcolor(comp, "");
}
if (fgColor != null) {
if (sbmRW != null)
sbmRW.clearProperty(RenderableWrapper.PROPERTY_FGCOLOR);
sbm.setFgcolor(fgColor.toString());
} else {
if (sbmRW != null && !Utils.equalObjects(sbmRW.getOnRenderSetProperties().get(RenderableWrapper.PROPERTY_FGCOLOR), sbm.getFgcolor())) {
sbmRW.clearProperty(RenderableWrapper.PROPERTY_FGCOLOR);
}
sbm.setFgcolor(sbm.getFgcolor());
}
if (compFont != null) {
if (sbmRW != null && !Utils.equalObjects(sbmRW.getOnRenderSetProperties().get(RenderableWrapper.PROPERTY_FONT), sbm.getFont()))
sbmRW.clearProperty(RenderableWrapper.PROPERTY_FONT);
sbm.setFont(compFont.toString());
} else {
if (sbmRW != null)
sbmRW.clearProperty(RenderableWrapper.PROPERTY_FONT);
sbm.setFont(sbm.getFont());
}
if (listItemBorder != null) {
// TODO left / right part of this list item border should only be applied on first / last components in the row (for table view)
// like it is done in servoy.js when client side styling is used
String newBorder = listItemBorder.toString();
Border currentBorder = ComponentFactoryHelper.createBorder(sbm.getBorder());
Border marginBorder = null;
if (currentBorder instanceof EmptyBorder) {
marginBorder = currentBorder;
} else if (currentBorder instanceof CompoundBorder && ((CompoundBorder) currentBorder).getInsideBorder() instanceof EmptyBorder) {
marginBorder = ((CompoundBorder) currentBorder).getInsideBorder();
}
if (marginBorder != null) {
newBorder = ComponentFactoryHelper.createBorderString(BorderFactory.createCompoundBorder(ComponentFactoryHelper.createBorder(newBorder), marginBorder));
}
if (sbmRW != null)
sbmRW.clearProperty(RenderableWrapper.PROPERTY_BORDER);
sbm.setBorder(newBorder);
// reset size so the web size will be recalculated based on the new border
sbm.setSize(sbm.getWidth(), sbm.getHeight());
} else {
if (sbmRW != null && !Utils.equalObjects(sbmRW.getOnRenderSetProperties().get(RenderableWrapper.PROPERTY_BORDER), sbm.getBorder()))
sbmRW.clearProperty(RenderableWrapper.PROPERTY_BORDER);
sbm.setBorder(sbm.getBorder());
}
}
}
}
use of com.servoy.j2db.ui.IProviderStylePropertyChanges in project servoy-client by Servoy.
the class ScrollResponseHeaderContainer method getColumnResizeScript.
@SuppressWarnings("nls")
public String getColumnResizeScript() {
if (resizedComponent instanceof IProviderStylePropertyChanges) {
String tableId = getMarkupId();
String classId = resizedComponent.getId();
// $NON-NLS-1$
String sWidth = (String) ((IProviderStylePropertyChanges) resizedComponent).getStylePropertyChanges().getChanges().get("width");
if (sWidth != null) {
resizedComponent = null;
return new AppendingStringBuffer("Servoy.TableView.setTableColumnWidth('").append(tableId).append("', '").append(classId).append("', ").append(Integer.parseInt(sWidth.substring(0, sWidth.length() - 2))).append(")").toString();
}
}
return null;
}
use of com.servoy.j2db.ui.IProviderStylePropertyChanges in project servoy-client by Servoy.
the class WebOnRenderHelper method doRender.
/**
* Calls onRender for the renderComponent and clears its changed flag if
* the callback did not change any properties and the value did not change
*
* @param renderComponent
* @return true if properties were changed during onRender, otherwise returns false
*/
public static boolean doRender(ISupportOnRender renderComponent) {
if (renderComponent instanceof IProviderStylePropertyChanges) {
IStylePropertyChanges spc = ((IProviderStylePropertyChanges) renderComponent).getStylePropertyChanges();
Properties changesBeforeOnRender = (Properties) spc.getChanges().clone();
renderComponent.fireOnRender(false);
Properties changesAfterOnRender = spc.getChanges();
if (changesBeforeOnRender.equals(changesAfterOnRender)) {
if (!spc.isValueChanged())
spc.setRendered();
return false;
}
}
return true;
}
Aggregations