use of com.servoy.j2db.server.headlessclient.WebForm 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.server.headlessclient.WebForm in project servoy-client by Servoy.
the class WebTabPanel method setCurrentForm.
/**
* @param fl
* @param previousIndex
*/
private void setCurrentForm(WebTabFormLookup fl, int previousIndex, List<Runnable> invokeLaterRunnables) {
if (fl != null && !fl.isFormReady())
return;
getStylePropertyChanges().setChanged();
currentForm = fl;
if (parentData != null) {
showFoundSet(currentForm, parentData, getDefaultSort());
}
// Test if current one is there
if (currentForm.isReady()) {
WebForm webForm = currentForm.getWebForm();
if (WebTabPanel.this.get(webForm.getId()) != null) {
// replace it
WebTabPanel.this.replace(webForm);
} else {
// else add it
WebTabPanel.this.add(webForm);
}
recomputeTabSequence();
boolean visible = true;
WebForm webform = findParent(WebForm.class);
if (webform != null) {
visible = webform.getController().isFormVisible();
}
currentForm.notifyVisible(visible, invokeLaterRunnables);
if (onTabChangeMethodCmd != null && previousIndex != -1) {
scriptExecutor.executeFunction(onTabChangeMethodCmd, Utils.arrayMerge((new Object[] { Integer.valueOf(previousIndex + 1) }), onTabChangeArgs), true, this, false, StaticContentSpecLoader.PROPERTY_ONCHANGEMETHODID.getPropertyName(), false);
}
}
}
use of com.servoy.j2db.server.headlessclient.WebForm in project servoy-client by Servoy.
the class WebSplitPane method notifyResized.
public void notifyResized() {
for (int i = 0; i < 2; i++) {
if (webTabs[i] != null && webTabs[i].getPanel().isReady()) {
WebForm webForm = webTabs[i].getPanel().getWebForm();
FormController controller = webForm.getController();
if (controller != null && webForm.isFormWidthHeightChanged()) {
controller.notifyResized();
webForm.clearFormWidthHeightChangedFlag();
}
}
}
}
use of com.servoy.j2db.server.headlessclient.WebForm in project servoy-client by Servoy.
the class WebTabFormLookup method isFormReady.
public boolean isFormReady() {
boolean isFormReady = true;
WebForm wf = getWebForm(false);
if (wf != null) {
MarkupContainer wfParent = wf.getParent();
if (wfParent instanceof WebTabPanel && ((WebTabPanel) wfParent).isVisible() && wfParent.getParent() != null) {
boolean isTabPanelVisible = true;
Component c = wfParent;
WebForm pwf;
while ((pwf = c.findParent(WebForm.class)) != null && (isTabPanelVisible = pwf.getController().isFormVisible()) == true) c = pwf;
// if the form is current in another visible tabpanel, then it is not ready for this tabpanel
isFormReady = !(isTabPanelVisible && wfParent != parent && ((WebTabPanel) wfParent).getCurrentForm() == wf);
}
}
return isFormReady;
}
use of com.servoy.j2db.server.headlessclient.WebForm in project servoy-client by Servoy.
the class WebAccordionPanel method addTab.
public boolean addTab(IForm formController, String formName, String tabname, String tabText, String tabtooltip, String iconURL, String fg, String bg, String relationName, RelatedFoundSet relatedFs, int idx) {
if (formController != null) {
// to make sure we don't have recursion on adding a tab, to a tabpanel, that is based
// on the form that the tabpanel is placed on
WebForm webForm = findParent(WebForm.class);
if (webForm != null) {
FormController parentFormController = webForm.getController();
if (parentFormController != null && parentFormController.equals(formController)) {
return false;
}
}
}
WebTabFormLookup flp = (WebTabFormLookup) createFormLookupPanel(tabname, relationName, formName);
if (formController != null)
flp.setReadOnly(formController.isReadOnly());
byte[] iconData = null;
// TODO handle icon
int count = allTabs.size();
int tabIndex = idx;
if (tabIndex == -1 || tabIndex >= count) {
tabIndex = count;
addTab(application.getI18NMessageIfPrefixed(tabText), iconData, flp, application.getI18NMessageIfPrefixed(tabtooltip));
} else {
insertTab(application.getI18NMessageIfPrefixed(tabText), iconData, flp, application.getI18NMessageIfPrefixed(tabtooltip), tabIndex);
}
if (fg != null)
setTabForegroundAt(tabIndex, PersistHelper.createColor(fg));
if (bg != null)
setTabBackgroundAt(tabIndex, PersistHelper.createColor(bg));
if (relatedFs != null && currentForm == flp) {
FormController fp = flp.getWebForm().getController();
if (fp != null && flp.getRelationName() != null && flp.getRelationName().equals(relationName)) {
fp.loadData(relatedFs, null);
}
}
return true;
}
Aggregations