List of usage examples for org.apache.wicket Component findParent
public final <Z> Z findParent(final Class<Z> c)
From source file:com.servoy.j2db.server.headlessclient.dataui.WebEventExecutor.java
License:Open Source License
/** * @param type//from ww w . j av a 2s . c om * @param target * @param comp * @param webModifiers * @param mouseLocation * @param page */ private void handleEvent(EventType type, AjaxRequestTarget target, Component comp, int webModifiers, Point mouseLocation, Point absoluteMouseLocation, Page page) { WebClientSession.get().getWebClient().executeEvents(); // process model changes from web components Component renderScriptProvider = comp; ISupplyFocusChildren<?> componentWithChildren = renderScriptProvider.findParent(ISupplyFocusChildren.class); if (componentWithChildren != null) renderScriptProvider = (Component) componentWithChildren; RenderEventExecutor renderEventExecutor = null; if (renderScriptProvider instanceof IScriptableProvider) { IScriptable s = ((IScriptableProvider) renderScriptProvider).getScriptObject(); if (s instanceof ISupportOnRenderCallback) { renderEventExecutor = ((ISupportOnRenderCallback) s).getRenderEventExecutor(); if (!renderEventExecutor.hasRenderCallback()) renderEventExecutor = null; } } if (type == EventType.focusGained || type == EventType.action || type == EventType.focusLost) { if (type == EventType.focusGained || type == EventType.action) { ((MainPage) page).setFocusedComponent(comp); } else { ((MainPage) page).setFocusedComponent(null); } if (renderEventExecutor != null) { renderEventExecutor.setRenderStateChanged(); // if component's onRender did not change any properties, don't add it to the target if (comp instanceof ISupportOnRender && WebOnRenderHelper.doRender((ISupportOnRender) comp)) { target.addComponent(comp); } } } if (type == EventType.focusLost || setSelectedIndex(comp, target, convertModifiers(webModifiers), type == EventType.focusGained || type == EventType.action)) { if (skipFireFocusGainedCommand && type.equals(JSEvent.EventType.focusGained)) { skipFireFocusGainedCommand = false; } else { switch (type) { case action: fireActionCommand(false, comp, convertModifiers(webModifiers), mouseLocation); break; case focusGained: fireEnterCommands(false, comp, convertModifiers(webModifiers)); break; case focusLost: fireLeaveCommands(comp, false, convertModifiers(webModifiers)); break; case doubleClick: fireDoubleclickCommand(false, comp, convertModifiers(webModifiers), mouseLocation); break; case rightClick: // if right click, mark the meta flag as it is on the smart client fireRightclickCommand(false, comp, convertModifiers(webModifiers | 8), null, mouseLocation, absoluteMouseLocation); break; case none: case dataChange: case form: case onDrag: case onDragOver: case onDrop: } } } }
From source file:com.servoy.j2db.server.headlessclient.dataui.WebEventExecutor.java
License:Open Source License
public void onError(AjaxRequestTarget target, Component comp) { if (target == null) { return;//from ww w . j a v a 2 s .co m } ServoyForm form = comp.findParent(ServoyForm.class); if (form == null) { return; } generateResponse(target, form.getPage()); }
From source file:com.servoy.j2db.server.headlessclient.dataui.WebEventExecutor.java
License:Open Source License
/** * @param component/*from w ww. j ava 2 s . c om*/ */ @SuppressWarnings("nls") public static boolean setSelectedIndex(Component component, AjaxRequestTarget target, int modifiers, boolean bHandleMultiselect) { WebForm parentForm = component.findParent(WebForm.class); WebCellBasedView tableView = null; if (parentForm != null) { int parentFormViewType = parentForm.getController().getForm().getView(); if (parentFormViewType == FormController.TABLE_VIEW || parentFormViewType == FormController.LOCKED_TABLE_VIEW || parentFormViewType == IForm.LIST_VIEW || parentFormViewType == FormController.LOCKED_LIST_VIEW) { tableView = component.findParent(WebCellBasedView.class); if (tableView == null) { // the component is not part of the table view (it is on other form part), so ignore selection change return true; } else tableView.setSelectionMadeByCellAction(); if (parentFormViewType == IForm.LIST_VIEW || parentFormViewType == FormController.LOCKED_LIST_VIEW) { if (component instanceof WebCellBasedViewListViewItem) { ((WebCellBasedViewListViewItem) component).markSelected(target); } else { WebCellBasedViewListViewItem listViewItem = component .findParent(WebCellBasedView.WebCellBasedViewListViewItem.class); if (listViewItem != null) { listViewItem.markSelected(target); } } } } } //search for recordItem model Component recordItemModelComponent = component; IModel<?> someModel = recordItemModelComponent.getDefaultModel(); while (!(someModel instanceof RecordItemModel)) { recordItemModelComponent = recordItemModelComponent.getParent(); if (recordItemModelComponent == null) break; someModel = recordItemModelComponent.getDefaultModel(); } if (someModel instanceof RecordItemModel) { if (!(component instanceof WebCellBasedViewListViewItem)) { // update the last rendered value for the events component (if updated) ((RecordItemModel) someModel).updateRenderedValue(component); } IRecordInternal rec = (IRecordInternal) someModel.getObject(); if (rec != null) { int index; IFoundSetInternal fs = rec.getParentFoundSet(); if (someModel instanceof FoundsetRecordItemModel) { index = ((FoundsetRecordItemModel) someModel).getRowIndex(); } else { index = fs.getRecordIndex(rec); // this is used only on "else", because a "plugins.rawSQL.flushAllClientsCache" could result in index = -1 although the record has not changed (but record & underlying row instances changed) } if (fs instanceof FoundSet && ((FoundSet) fs).isMultiSelect()) { //set the selected record ClientProperties clp = ((WebClientInfo) Session.get().getClientInfo()).getProperties(); String navPlatform = clp.getNavigatorPlatform(); int controlMask = (navPlatform != null && navPlatform.toLowerCase().indexOf("mac") != -1) ? Event.META_MASK : Event.CTRL_MASK; boolean toggle = (modifiers != MODIFIERS_UNSPECIFIED) && ((modifiers & controlMask) != 0); boolean extend = (modifiers != MODIFIERS_UNSPECIFIED) && ((modifiers & Event.SHIFT_MASK) != 0); boolean isRightClick = (modifiers != MODIFIERS_UNSPECIFIED) && ((modifiers & Event.ALT_MASK) != 0); if (!isRightClick) { if (!toggle && !extend && tableView != null && tableView.getDragNDropController() != null && Arrays.binarySearch(((FoundSet) fs).getSelectedIndexes(), index) > -1) { return true; } if (toggle || extend) { if (bHandleMultiselect) { if (toggle) { int[] selectedIndexes = ((FoundSet) fs).getSelectedIndexes(); ArrayList<Integer> selectedIndexesA = new ArrayList<Integer>(); Integer selectedIndex = new Integer(index); for (int selected : selectedIndexes) selectedIndexesA.add(new Integer(selected)); if (selectedIndexesA.indexOf(selectedIndex) != -1) { if (selectedIndexesA.size() > 1) selectedIndexesA.remove(selectedIndex); } else selectedIndexesA.add(selectedIndex); selectedIndexes = new int[selectedIndexesA.size()]; for (int i = 0; i < selectedIndexesA.size(); i++) selectedIndexes[i] = selectedIndexesA.get(i).intValue(); ((FoundSet) fs).setSelectedIndexes(selectedIndexes); } else if (extend) { int anchor = ((FoundSet) fs).getSelectedIndex(); int min = Math.min(anchor, index); int max = Math.max(anchor, index); int[] newSelectedIndexes = new int[max - min + 1]; for (int i = min; i <= max; i++) newSelectedIndexes[i - min] = i; ((FoundSet) fs).setSelectedIndexes(newSelectedIndexes); } } } else if (index != -1 || fs.getSize() == 0) { fs.setSelectedIndex(index); } } } else if (!isIndexSelected(fs, index)) fs.setSelectedIndex(index); if (!isIndexSelected(fs, index) && !(fs instanceof FoundSet && ((FoundSet) fs).isMultiSelect())) { // setSelectedIndex failed, probably due to validation failed, do a blur() if (target != null) target.appendJavascript("var toBlur = document.getElementById(\"" + component.getMarkupId() + "\");if (toBlur) toBlur.blur();"); return false; } } } return true; }
From source file:com.servoy.j2db.server.headlessclient.dataui.WebEventExecutor.java
License:Open Source License
/** * @param component2/*w w w .j av a 2 s . c o m*/ * @param response */ @SuppressWarnings("nls") public static void generateDragAttach(Component component, IHeaderResponse response) { DraggableBehavior draggableBehavior = null; Component behaviorComponent = component; if ((behaviorComponent instanceof IComponent) && !(behaviorComponent instanceof IFormDataDragNDrop)) { behaviorComponent = (Component) component.findParent(IFormDataDragNDrop.class); } if (behaviorComponent != null) { Iterator<IBehavior> behaviors = behaviorComponent.getBehaviors().iterator(); Object behavior; while (behaviors.hasNext()) { behavior = behaviors.next(); if (behavior instanceof DraggableBehavior) { draggableBehavior = (DraggableBehavior) behavior; break; } } } if (draggableBehavior == null) return; boolean bUseProxy = draggableBehavior.isUseProxy(); boolean bResizeProxyFrame = draggableBehavior.isResizeProxyFrame(); boolean bXConstraint = draggableBehavior.isXConstraint(); boolean bYConstraint = draggableBehavior.isYConstraint(); CharSequence dragUrl = draggableBehavior.getCallbackUrl(); String jsCode = null; if (behaviorComponent instanceof IFormDataDragNDrop) { final StringBuilder sbAttachDrag = new StringBuilder(100); sbAttachDrag.append("Servoy.DD.attachDrag(["); final StringBuilder sbAttachDrop = new StringBuilder(100); sbAttachDrop.append("Servoy.DD.attachDrop(["); final boolean hasDragEvent = ((IFormDataDragNDrop) behaviorComponent).getDragNDropController().getForm() .getOnDragMethodID() > 0 || ((IFormDataDragNDrop) behaviorComponent).getDragNDropController().getForm() .getOnDragOverMethodID() > 0; final boolean hasDropEvent = ((IFormDataDragNDrop) behaviorComponent).getDragNDropController().getForm() .getOnDropMethodID() > 0; if (component instanceof WebDataRenderer || component instanceof WebCellBasedView) { if (hasDragEvent) sbAttachDrag.append('\'').append(component.getMarkupId()).append("',"); if (hasDropEvent) sbAttachDrop.append('\'').append(component.getMarkupId()).append("',"); if (component instanceof WebDataRenderer) { Iterator<? extends Component> dataRendererIte = ((WebDataRenderer) component).iterator(); Object dataRendererChild; while (dataRendererIte.hasNext()) { dataRendererChild = dataRendererIte.next(); if (dataRendererChild instanceof IWebFormContainer) continue; if (dataRendererChild instanceof WrapperContainer) dataRendererChild = ((WrapperContainer) dataRendererChild).getDelegate(); if (dataRendererChild instanceof IComponent && ((IComponent) dataRendererChild).isEnabled()) { updateDragAttachOutput(dataRendererChild, sbAttachDrag, sbAttachDrop, hasDragEvent, hasDropEvent); } } } else if (component instanceof WebCellBasedView) { ListView<IRecordInternal> table = ((WebCellBasedView) component).getTable(); table.visitChildren(new IVisitor<Component>() { public Object component(Component comp) { if (comp instanceof IComponent && comp.isEnabled()) { updateDragAttachOutput(comp, sbAttachDrag, sbAttachDrop, hasDragEvent, hasDropEvent); } return null; } }); } } else if (component != null && component.isEnabled()) { updateDragAttachOutput(component, sbAttachDrag, sbAttachDrop, hasDragEvent, hasDropEvent); } if (sbAttachDrag.length() > 25) { sbAttachDrag.setLength(sbAttachDrag.length() - 1); sbAttachDrag.append("],'"); sbAttachDrag.append(dragUrl); sbAttachDrag.append("', "); sbAttachDrag.append(bUseProxy); sbAttachDrag.append(", "); sbAttachDrag.append(bResizeProxyFrame); sbAttachDrag.append(", "); sbAttachDrag.append(bXConstraint); sbAttachDrag.append(", "); sbAttachDrag.append(bYConstraint); sbAttachDrag.append(");"); jsCode = sbAttachDrag.toString(); } if (sbAttachDrop.length() > 25) { sbAttachDrop.setLength(sbAttachDrop.length() - 1); sbAttachDrop.append("],'"); sbAttachDrop.append(dragUrl); sbAttachDrop.append("');"); if (jsCode != null) jsCode += '\n' + sbAttachDrop.toString(); else jsCode = sbAttachDrop.toString(); } if (jsCode != null) { if (response == null) { jsCode = (new StringBuilder().append("\n<script type=\"text/javascript\">\n").append(jsCode) .append("</script>\n")).toString(); Response cyleResponse = RequestCycle.get().getResponse(); cyleResponse.write(jsCode); } else response.renderOnDomReadyJavascript(jsCode); } } else //default handling { jsCode = "Servoy.DD.attachDrag(['" + component.getMarkupId() + "'],'" + dragUrl + "', " + bUseProxy + ", " + bResizeProxyFrame + ", " + bXConstraint + ", " + bYConstraint + ")"; if (response == null) { jsCode = (new StringBuilder().append("\n<script type=\"text/javascript\">\n").append(jsCode) .append("</script>\n")).toString(); Response cyleResponse = RequestCycle.get().getResponse(); cyleResponse.write(jsCode); } else response.renderOnDomReadyJavascript(jsCode); } }
From source file:com.servoy.j2db.server.headlessclient.dataui.WebTabFormLookup.java
License:Open Source License
public boolean isFormReady() { boolean isFormReady = true; WebForm wf = getWebForm(false);/* w w w. j av a 2s. com*/ 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; }
From source file:com.servoy.j2db.server.headlessclient.DesignModeBehavior.java
License:Open Source License
private IComponent getWicketComponentForName(final String componentName) { if (componentName != null) { Component bindedComponent = getComponent(); if (bindedComponent != null) { WebForm parentWebForm = bindedComponent.findParent(WebForm.class); if (parentWebForm != null) { return (IComponent) parentWebForm.visitChildren(IComponent.class, new IVisitor<Component>() { public Object component(Component component) { if (componentName.equals(((IComponent) component).getName())) { return component; }/*from ww w .j a v a 2s. c o m*/ return IVisitor.CONTINUE_TRAVERSAL; } }); } } } return null; }
From source file:com.servoy.j2db.server.headlessclient.MainPage.java
License:Open Source License
@SuppressWarnings("nls") private void init(WebClient sc) { setStatelessHint(false);/*from w w w . j a v a2 s.c o m*/ client = sc; webForms = new ArrayList<IFormUIInternal<?>>(); title = new Label("title", new Model<String>("Servoy Web Client")); //$NON-NLS-1$ //$NON-NLS-2$ title.setOutputMarkupId(true); add(title); useAJAX = Utils.getAsBoolean(client.getRuntimeProperties().get("useAJAX")); //$NON-NLS-1$ int dataNotifyFrequency = Utils .getAsInteger(sc.getSettings().getProperty("servoy.webclient.datanotify.frequency", "5")); //$NON-NLS-1$ //$NON-NLS-2$ if (dataNotifyFrequency > 0 && useAJAX) { add(new AbstractAjaxTimerBehavior(Duration.seconds(dataNotifyFrequency)) { private static final long serialVersionUID = 1L; @Override protected void onTimer(AjaxRequestTarget target) { if (isServoyEnabled() && !client.getFlattenedSolution().isInDesign(null) && String.valueOf(MainPage.this.getCurrentVersionNumber()) .equals(RequestCycle.get().getRequest().getParameter("pvs"))) { WebEventExecutor.generateResponse(target, MainPage.this); } } @Override public void renderHead(IHeaderResponse response) { if (isServoyEnabled()) { super.renderHead(response); String jsTimerScript = getJsTimeoutCall(getUpdateInterval()); response.renderJavascript("function restartTimer() {" + jsTimerScript + "}", //$NON-NLS-1$//$NON-NLS-2$ "restartTimer"); //$NON-NLS-1$ } } @Override protected CharSequence getPreconditionScript() { return "onAjaxCall(); if(Servoy.DD.isDragging) Servoy.DD.isRestartTimerNeeded=true; return !Servoy.DD.isDragging && !Servoy.redirectingOnSolutionClose;"; //$NON-NLS-1$ } @Override protected CharSequence getFailureScript() { return "onAjaxError();restartTimer();"; //$NON-NLS-1$ } @Override protected CharSequence getCallbackScript() { // if it is not enabled then just return an empty function. so that the timer stops. if (isServoyEnabled()) { return generateCallbackScript("wicketAjaxGet('" + //$NON-NLS-1$ getCallbackUrl(onlyTargetActivePage()) + "&ignoremp=true&pvs=" //$NON-NLS-1$ + MainPage.this.getCurrentVersionNumber() + "'"); } return "Servoy.Utils.nop()"; } @Override public CharSequence getCallbackUrl(boolean onlyTargetActivePage) { if (getComponent() == null) { throw new IllegalArgumentException( "Behavior must be bound to a component to create the URL"); //$NON-NLS-1$ } return getComponent().urlFor(this, AlwaysLastPageVersionRequestListenerInterface.INTERFACE); } @Override protected String findIndicatorId() { return null; // main page defines it and the timer shouldnt show it } /* * this can't be isEnabled(component) of the behavior itself because IE8 will constant call this on closed (modal)windows. So then this is * marked as disabled and an AbortException is thrown what our code sees as a server error and will constantly restart the timer. */ private boolean isServoyEnabled() { return ((getController() != null && getController().isFormVisible()) || closingAsWindow); } }); } add(new TriggerOrientationChangeAjaxBehavior()); add(new TriggerResizeAjaxBehavior()); add(new AbstractServoyLastVersionAjaxBehavior() { @Override protected void execute(AjaxRequestTarget target) { for (ServoyDivDialog divDialog : divDialogs.getOrderedByOpenSequence()) { if (!divDialog.isShown()) { // this means a refresh was probably triggered and we must re-show these... because we do not keep closed dialogs in divDialogs int x = divDialog.getX(); int y = divDialog.getY(); int w = divDialog.getWidth(); int h = divDialog.getHeight(); divDialog.show(target, null); divDialog.setBounds(target, x, y, w, h, null); } } WebEventExecutor.generateResponse(target, MainPage.this); } @Override public void renderHead(IHeaderResponse response) { super.renderHead(response); response.renderOnDomReadyJavascript(getCallbackScript(true).toString()); } @Override public boolean isEnabled(Component component) { return divDialogs.size() > 0 && super.isEnabled(component); } }); body = new WebMarkupContainer("servoy_page") //$NON-NLS-1$ { private static final long serialVersionUID = 1L; /** * @see org.apache.wicket.Component#onComponentTag(org.apache.wicket.markup.ComponentTag) */ @Override protected void onComponentTag(ComponentTag tag) { super.onComponentTag(tag); tag.putAll(bodyAttributes); } }; body.add(new AttributeModifier("dir", true, new AbstractReadOnlyModel<String>() //$NON-NLS-1$ { @Override public String getObject() { String value = AttributeModifier.VALUELESS_ATTRIBUTE_REMOVE; Locale l = client.getLocale(); Solution solution = client.getSolution(); if (solution != null && l != null) { value = OrientationApplier.getHTMLContainerOrientation(l, solution.getTextOrientation()); } return value; } })); add(body); pageContributor = new PageContributor(client, "contribution"); body.add(pageContributor); Label loadingIndicator = new Label("loading_indicator", sc.getI18NMessage("servoy.general.loading")); loadingIndicator.add(new SimpleAttributeModifier("style", "display:none;")); body.add(loadingIndicator); divDialogsParent = new WebMarkupContainer(DIV_DIALOGS_REPEATER_PARENT_ID); divDialogsParent.setOutputMarkupPlaceholderTag(true); divDialogsParent.setVisible(false); body.add(divDialogsParent); if (useAJAX) { add(new TriggerUpdateAjaxBehavior()); // for when another page needs to trigger an ajax update on this page using js (see media upload) divDialogRepeater = new RepeatingView(DIV_DIALOG_REPEATER_ID); divDialogsParent.add(divDialogRepeater); fileUploadWindow = new ServoyDivDialog(FILE_UPLOAD_DIALOG_ID); body.add(fileUploadWindow); fileUploadWindow.setModal(true); fileUploadWindow.setPageMapName(null); fileUploadWindow.setCookieName("dialog_fileupload"); fileUploadWindow.setResizable(true); fileUploadWindow.setInitialHeight(150); fileUploadWindow.setInitialWidth(400); fileUploadWindow.setMinimalHeight(130); fileUploadWindow.setMinimalWidth(400); fileUploadWindow.setUseInitialHeight(true); // no effect, can be removed fileUploadWindow.setPageCreator(new ModalWindow.PageCreator() { private static final long serialVersionUID = 1L; public Page createPage() { return new MediaUploadPage(PageMap.forName(FILE_UPLOAD_PAGEMAP), mediaUploadCallback, mediaUploadMultiSelect, getController().getApplication()); } }); fileUploadWindow.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() { private static final long serialVersionUID = 1L; public void onClose(AjaxRequestTarget target) { divDialogs.remove(FILE_UPLOAD_PAGEMAP); fileUploadWindow.setPageMapName(null); fileUploadWindow.remove(fileUploadWindow.getContentId()); restoreFocusedComponentInParentIfNeeded(); WebEventExecutor.generateResponse(target, findPage()); } }); } else { divDialogsParent.add(new Label("divdialogs")); body.add(new Label("fileuploaddialog")); //$NON-NLS-1$ } IModel<String> styleHrefModel = new AbstractReadOnlyModel<String>() { private static final long serialVersionUID = 1L; @Override public String getObject() { if (main != null) { return getRequest().getRelativePathPrefixToContextRoot() + "servoy-webclient/templates/" + //$NON-NLS-1$ client.getClientProperty(WEBCONSTANTS.WEBCLIENT_TEMPLATES_DIR) + "/servoy_web_client_default.css"; //$NON-NLS-1$ } return null; } }; Label main_form_style = new Label("main_form_style"); //$NON-NLS-1$ main_form_style.add(new AttributeModifier("href", true, styleHrefModel)); //$NON-NLS-1$ add(main_form_style); IModel<List<IFormUIInternal<?>>> loopModel = new AbstractReadOnlyModel<List<IFormUIInternal<?>>>() { private static final long serialVersionUID = 1L; @Override public List<IFormUIInternal<?>> getObject() { return webForms; } }; listview = new ListView<IFormUIInternal<?>>("forms", loopModel) //$NON-NLS-1$ { private static final long serialVersionUID = 1L; @Override protected void populateItem(ListItem<IFormUIInternal<?>> item) { final WebForm form = (WebForm) item.getModelObject(); tempRemoveMainForm = true; try { if (form.getParent() != null) { form.remove(); // TODO isn't this already done by item.add(form) below in wicket's impl? } item.add(form); } finally { tempRemoveMainForm = false; } IFormLayoutProvider layoutProvider = FormLayoutProviderFactory.getFormLayoutProvider(client, client.getSolution(), form.getController().getForm(), form.getController().getName()); TextualStyle styleToReturn = null; if ((navigator != null) && (form == navigator.getFormUI())) { styleToReturn = layoutProvider.getLayoutForForm(navigator.getForm().getSize().width, true, false); } else if (form == main) { int customNavWidth = 0; if (navigator != null) customNavWidth = navigator.getForm().getSize().width; styleToReturn = layoutProvider.getLayoutForForm(customNavWidth, false, false); } if (styleToReturn != null) { form.add(new StyleAppendingModifier(styleToReturn) { @Override public boolean isEnabled(Component component) { // Laurian: looks like bogus condition, shouldn't this be || as in WebForm ? return (component.findParent(WebTabPanel.class) == null) && (component.findParent(WebSplitPane.class) == null); } }); } TabIndexHelper.setUpTabIndexAttributeModifier(item, ISupportWebTabSeq.SKIP); } @Override protected ListItem<IFormUIInternal<?>> newItem(final int index) { return new ListItem<IFormUIInternal<?>>(index, getListItemModel(getModel(), index)) { @Override public void remove(Component component) { super.remove(component); // for example when a form is shown in a popup form (window plugin) it must know that it's main page changed if (!tempRemoveMainForm && component instanceof WebForm) { WebForm formUI = ((WebForm) component); if (MainPage.this == formUI.getMainPage()) { // if the form is visible and it will be now removed from the mainpage // then call notifyVisble false on it to let the form know it will hide // we can't do much if that is blocked by an onhide here. // (could be triggered by a browser back button) if (formUI.getController().isFormVisible()) { List<Runnable> invokeLaterRunnables = new ArrayList<Runnable>(); formUI.getController().notifyVisible(false, invokeLaterRunnables); Utils.invokeLater(client, invokeLaterRunnables); } formUI.setMainPage(null); } } } }; } /** * @see org.apache.wicket.markup.html.list.ListView#onBeforeRender() */ @Override protected void onBeforeRender() { super.onBeforeRender(); // now first initialize all the tabs so that data from // tab x doesn't change anymore (so that it could alter data in tab y) // don't know if this still does anything because we need to do it // in the onBeforeRender of WebTabPanel itself, else tableviews don't have there models yet.. visitChildren(WebTabPanel.class, new IVisitor<WebTabPanel>() { public Object component(WebTabPanel wtp) { wtp.initalizeFirstTab(); return IVisitor.CONTINUE_TRAVERSAL; } }); addWebAnchoringInfoIfNeeded(); } }; listview.setReuseItems(true); // if versioning is disabled then table views can go wrong (don't rollback on a submit) //listview.setVersioned(false); Form form = new ServoyForm("servoy_dataform"); //$NON-NLS-1$ form.add(new SimpleAttributeModifier("autocomplete", "off")); //$NON-NLS-1$ //$NON-NLS-2$ if (useAJAX) form.add(new SimpleAttributeModifier("onsubmit", "return false;")); //$NON-NLS-1$ //$NON-NLS-2$ form.add(listview); WebMarkupContainer defaultButton = new WebMarkupContainer("defaultsubmitbutton", new Model()); //$NON-NLS-1$ defaultButton.setVisible(!useAJAX); form.add(defaultButton); StylePropertyChangeMarkupContainer container = new StylePropertyChangeMarkupContainer("externaldivsparent"); form.add(container); PageContributorRepeatingView repeatingView = new PageContributorRepeatingView("externaldivs", container); container.add(repeatingView); pageContributor.addRepeatingView(repeatingView); body.add(form); }
From source file:com.servoy.j2db.server.headlessclient.MainPage.java
License:Open Source License
/** * Respond to focus/blur events.//from w w w .ja v a2s. c o m */ @SuppressWarnings("nls") public void respond(AjaxRequestTarget target, final String event, final String markupId) { Component component = (Component) visitChildren(IComponent.class, new IVisitor<Component>() { public Object component(Component c) { Component targetComponent = c; if (c instanceof WebBaseSelectBox && ("blur".equals(event) || "focus".equals(event))) { Component[] cs = ((WebBaseSelectBox) c).getFocusChildren(); if (cs != null && cs.length == 1) targetComponent = cs[0]; } if (targetComponent.getMarkupId().equals(markupId)) { return c; } return IVisitor.CONTINUE_TRAVERSAL; } }); if (component == null) { Debug.log("Component not found markupId " + markupId); //$NON-NLS-1$ return; } IFormUIInternal<?> formui = component.findParent(IFormUIInternal.class); if (formui != null && formui.isDesignMode()) { Debug.log("Event ignored because of design mode"); //$NON-NLS-1$ return; } if (component instanceof IFieldComponent) { WebEventExecutor eventExecutor = (WebEventExecutor) ((IFieldComponent) component).getEventExecutor(); if (eventExecutor != null) { if ("focus".equals(event)) { int webModifier = Utils.getAsInteger( RequestCycle.get().getRequest().getParameter(IEventExecutor.MODIFIERS_PARAMETER)); StartEditOnFocusGainedEventBehavior.startEditing(component, WebEventExecutor.convertModifiers(webModifier), target); eventExecutor.onEvent(JSEvent.EventType.focusGained, target, component, webModifier); } else if ("blur".equals(event)) { // test if the data is really posted by looking up the key. if (component instanceof FormComponent<?> && RequestCycle.get().getRequest().getParameter("nopostdata") == null) { // changed data is posted ((FormComponent<?>) component).processInput(); } eventExecutor.onEvent(JSEvent.EventType.focusLost, target, component, IEventExecutor.MODIFIERS_UNSPECIFIED); } else { Debug.trace("Ignored event " + event); } } else { Debug.trace("Ignored event, no eventExecutor"); } } else { // other non-field components like WebLabel ServoyForm form = component.findParent(ServoyForm.class); if (form != null) { Page page = form.getPage(); // JS might change the page this form belongs to... so remember it now int webModifier = Utils.getAsInteger( RequestCycle.get().getRequest().getParameter(IEventExecutor.MODIFIERS_PARAMETER)); WebEventExecutor.setSelectedIndex(component, target, WebEventExecutor.convertModifiers(webModifier), true); WebEventExecutor.generateResponse(target, page); } } }
From source file:com.servoy.j2db.server.headlessclient.TabIndexHelper.java
License:Open Source License
private static void setUpTabIndexAttributeModifierInternal(Component comp, int newTabIndex) { TabIndexAttributeModifier modifier = null; final Component component = comp; for (Object obeh : component.getBehaviors()) { IBehavior beh = (IBehavior) obeh; if (beh instanceof TabIndexAttributeModifier) { modifier = (TabIndexAttributeModifier) beh; break; }//from ww w .j ava 2 s .c o m } boolean componentChanged = true; boolean changeForClientSide = false; if (modifier == null) { if (newTabIndex != ISupportWebTabSeq.DEFAULT && isTabIndexSupported(component)) component.add(new TabIndexAttributeModifier(newTabIndex)); } else if (newTabIndex != ISupportWebTabSeq.DEFAULT) { if (newTabIndex != modifier.getTabIndex()) { modifier.setTabIndex(newTabIndex); if (!(component instanceof IProviderStylePropertyChanges) || !((IProviderStylePropertyChanges) component).getStylePropertyChanges().isChanged()) { // if is already changed leave it to server side changeForClientSide = true; } } else { componentChanged = false; } } else { component.remove(modifier); } if (componentChanged) { MainPage page = component.findParent(MainPage.class); if (changeForClientSide) { if (page != null) { page.getPageContributor().addTabIndexChange(component.getMarkupId(), newTabIndex); } else { changeForClientSide = false; } } if (!changeForClientSide && component instanceof IProviderStylePropertyChanges) { IProviderStylePropertyChanges changeable = (IProviderStylePropertyChanges) component; changeable.getStylePropertyChanges().setChanged(); if (page != null) { page.getPageContributor().addTabIndexChange(component.getMarkupId(), ISupportWebTabSeq.DEFAULT); } } } }
From source file:com.servoy.j2db.server.headlessclient.WebClientsApplication.java
License:Open Source License
/** * @see wicket.protocol.http.WebApplication#init() *//*from www . j av a 2 s. com*/ @Override protected void init() { if (ApplicationServerRegistry.get() == null) return; // TODO this is a workaround to allow mobile test client that only starts Tomcat not to give exceptions (please remove if mobile test client initialises a full app. server in the future) getResourceSettings().setResourceWatcher(new ServoyModificationWatcher(Duration.seconds(5))); // getResourceSettings().setResourcePollFrequency(Duration.seconds(5)); getResourceSettings().setAddLastModifiedTimeToResourceReferenceUrl(true); getResourceSettings().setDefaultCacheDuration((int) Duration.days(365).seconds()); getMarkupSettings().setCompressWhitespace(true); getMarkupSettings().setMarkupCache(new ServoyMarkupCache(this)); // getMarkupSettings().setStripWicketTags(true); getResourceSettings().setResourceStreamLocator(new ServoyResourceStreamLocator(this)); getResourceSettings().setPackageResourceGuard(new ServoyPackageResourceGuard()); // getResourceSettings().setResourceFinder(createResourceFinder()); getResourceSettings().setThrowExceptionOnMissingResource(false); getApplicationSettings().setPageExpiredErrorPage(ServoyExpiredPage.class); getApplicationSettings().setClassResolver(new ServoyClassResolver()); getSessionSettings().setMaxPageMaps(15); // getRequestCycleSettings().setGatherExtendedBrowserInfo(true); getSecuritySettings().setCryptFactory(new CachingKeyInSessionSunJceCryptFactory()); Settings settings = Settings.getInstance(); getDebugSettings().setOutputComponentPath( Utils.getAsBoolean(settings.getProperty("servoy.webclient.debug.wicketpath", "false"))); //$NON-NLS-1$ //$NON-NLS-2$ if (Utils.getAsBoolean(settings.getProperty("servoy.webclient.nice.urls", "false"))) //$NON-NLS-1$ //$NON-NLS-2$ { mount(new HybridUrlCodingStrategy("/solutions", SolutionLoader.class)); //$NON-NLS-1$ mount(new HybridUrlCodingStrategy("/application", MainPage.class)); //$NON-NLS-1$ mount(new HybridUrlCodingStrategy("/ss", SolutionLoader.class) //$NON-NLS-1$ { /** * @see wicket.request.target.coding.BookmarkablePageRequestTargetUrlCodingStrategy#matches(wicket.IRequestTarget) */ @Override public boolean matches(IRequestTarget requestTarget) { return false; } }); } else { mountBookmarkablePage("/solutions", SolutionLoader.class); //$NON-NLS-1$ mount(new BookmarkablePageRequestTargetUrlCodingStrategy("/ss", SolutionLoader.class, null) //$NON-NLS-1$ { /** * @see wicket.request.target.coding.BookmarkablePageRequestTargetUrlCodingStrategy#matches(wicket.IRequestTarget) */ @Override public boolean matches(IRequestTarget requestTarget) { return false; } }); } long maxSize = Utils.getAsLong(settings.getProperty("servoy.webclient.maxuploadsize", "0"), false); //$NON-NLS-1$ //$NON-NLS-2$ if (maxSize > 0) { getApplicationSettings().setDefaultMaximumUploadSize(Bytes.kilobytes(maxSize)); } getSharedResources().putClassAlias(IApplication.class, "application"); //$NON-NLS-1$ getSharedResources().putClassAlias(PageContributor.class, "pc"); //$NON-NLS-1$ getSharedResources().putClassAlias(MaskBehavior.class, "mask"); //$NON-NLS-1$ getSharedResources().putClassAlias(Application.class, "servoy"); //$NON-NLS-1$ getSharedResources().putClassAlias(org.wicketstuff.calendar.markup.html.form.DatePicker.class, "datepicker"); //$NON-NLS-1$ getSharedResources().putClassAlias(YUILoader.class, "yui"); //$NON-NLS-1$ getSharedResources().putClassAlias(JQueryLoader.class, "jquery"); //$NON-NLS-1$ getSharedResources().putClassAlias(TinyMCELoader.class, "tinymce"); //$NON-NLS-1$ getSharedResources().putClassAlias(org.apache.wicket.markup.html.WicketEventReference.class, "wicketevent"); //$NON-NLS-1$ getSharedResources().putClassAlias(org.apache.wicket.ajax.WicketAjaxReference.class, "wicketajax"); //$NON-NLS-1$ getSharedResources().putClassAlias(MainPage.class, "servoyjs"); //$NON-NLS-1$ getSharedResources().putClassAlias(org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow.class, "modalwindow"); //$NON-NLS-1$ PackageResource.bind(this, IApplication.class, "images/open_project.gif"); //$NON-NLS-1$ PackageResource.bind(this, IApplication.class, "images/save.gif"); //$NON-NLS-1$ mountSharedResource("/formcss", "servoy/formcss"); //$NON-NLS-1$//$NON-NLS-2$ sharedMediaResource = new SharedMediaResource(); getSharedResources().add("media", sharedMediaResource); //$NON-NLS-1$ mount(new SharedResourceRequestTargetUrlCodingStrategy("mediafolder", "servoy/media") //$NON-NLS-1$ //$NON-NLS-2$ { @Override protected void appendParameters(AppendingStringBuffer url, Map<String, ?> parameters) { if (parameters != null && parameters.size() > 0) { Object solutionName = parameters.get("s"); //$NON-NLS-1$ if (solutionName != null) appendPathParameter(url, null, solutionName.toString()); Object resourceId = parameters.get("id"); //$NON-NLS-1$ if (resourceId != null) appendPathParameter(url, null, resourceId.toString()); StringBuilder queryParams = new StringBuilder(); for (Entry<?, ?> entry1 : parameters.entrySet()) { Object value = ((Entry<?, ?>) entry1).getValue(); if (value != null) { Object key = ((Entry<?, ?>) entry1).getKey(); if (!"s".equals(key) && !"id".equals(key)) //$NON-NLS-1$ //$NON-NLS-2$ { if (value instanceof String[]) { String[] values = (String[]) value; for (String value1 : values) { if (queryParams.length() > 0) queryParams.append("&"); //$NON-NLS-1$ queryParams.append(key).append("=").append(value1);//$NON-NLS-1$ } } else { if (queryParams.length() > 0) queryParams.append("&"); //$NON-NLS-1$ queryParams.append(key).append("=").append(value);//$NON-NLS-1$ } } } } if (queryParams.length() > 0) { url.append("?").append(queryParams);//$NON-NLS-1$ } } } @Override protected void appendPathParameter(AppendingStringBuffer url, String key, String value) { String escapedValue = value; String[] values = escapedValue.split("/");//$NON-NLS-1$ if (values.length > 1) { StringBuilder sb = new StringBuilder(escapedValue.length()); for (String str : values) { sb.append(urlEncodePathComponent(str)); sb.append('/'); } sb.setLength(sb.length() - 1); escapedValue = sb.toString(); } else { escapedValue = urlEncodePathComponent(escapedValue); } if (!Strings.isEmpty(escapedValue)) { if (!url.endsWith("/"))//$NON-NLS-1$ { url.append("/");//$NON-NLS-1$ } if (key != null) url.append(urlEncodePathComponent(key)).append("/");//$NON-NLS-1$ url.append(escapedValue); } } /* * (non-Javadoc) * * @see org.apache.wicket.request.target.coding.AbstractRequestTargetUrlCodingStrategy#decodeParameters(java.lang.String, java.util.Map) */ @Override protected ValueMap decodeParameters(String urlFragment, Map<String, ?> urlParameters) { ValueMap map = new ValueMap(); final String[] pairs = urlFragment.split("/"); //$NON-NLS-1$ if (pairs.length > 1) { map.add("s", pairs[1]); //$NON-NLS-1$ StringBuffer sb = new StringBuffer(); for (int i = 2; i < pairs.length; i++) { sb.append(pairs[i]); sb.append("/"); //$NON-NLS-1$ } sb.setLength(sb.length() - 1); map.add("id", sb.toString()); //$NON-NLS-1$ } if (urlParameters != null) { map.putAll(urlParameters); } return map; } }); getSharedResources().add("resources", new ServeResources()); //$NON-NLS-1$ getSharedResources().add("formcss", new FormCssResource(this)); //$NON-NLS-1$ if (settings.getProperty("servoy.webclient.error.page", null) != null) //$NON-NLS-1$ { getApplicationSettings().setInternalErrorPage(ServoyErrorPage.class); } if (settings.getProperty("servoy.webclient.pageexpired.page", null) != null) //$NON-NLS-1$ { getApplicationSettings().setPageExpiredErrorPage(ServoyPageExpiredPage.class); } addPreComponentOnBeforeRenderListener(new IComponentOnBeforeRenderListener() { public void onBeforeRender(Component component) { if (component instanceof IServoyAwareBean) { IModel model = component.getInnermostModel(); WebForm webForm = component.findParent(WebForm.class); if (model instanceof RecordItemModel && webForm != null) { IRecord record = (IRecord) ((RecordItemModel) model).getObject(); FormScope fs = webForm.getController().getFormScope(); if (record != null && fs != null) { ((IServoyAwareBean) component).setSelectedRecord(new ServoyBeanState(record, fs)); } } } else { if (!component.isEnabled()) { boolean hasOnRender = (component instanceof IFieldComponent && ((IFieldComponent) component) .getScriptObject() instanceof ISupportOnRenderCallback && ((ISupportOnRenderCallback) ((IFieldComponent) component).getScriptObject()) .getRenderEventExecutor().hasRenderCallback()); if (!hasOnRender) { // onrender may change the enable state return; } } Component targetComponent = null; boolean hasFocus = false, hasBlur = false; if (component instanceof IFieldComponent && ((IFieldComponent) component).getEventExecutor() != null) { targetComponent = component; if (component instanceof WebBaseSelectBox) { Component[] cs = ((WebBaseSelectBox) component).getFocusChildren(); if (cs != null && cs.length == 1) targetComponent = cs[0]; } if (component instanceof WebDataHtmlArea) hasFocus = true; // always install a focus handler when in a table view to detect change of selectedIndex and test for record validation if (((IFieldComponent) component).getEventExecutor().hasEnterCmds() || component.findParent(WebCellBasedView.class) != null || (((IFieldComponent) component) .getScriptObject() instanceof ISupportOnRenderCallback && ((ISupportOnRenderCallback) ((IFieldComponent) component) .getScriptObject()).getRenderEventExecutor().hasRenderCallback())) { hasFocus = true; } // Always trigger event on focus lost: // 1) check for new selected index, record validation may have failed preventing a index changed // 2) prevent focus gained to be called when field validation failed // 3) general ondata change hasBlur = true; } else if (component instanceof WebBaseLabel) { targetComponent = component; hasFocus = true; } if (targetComponent != null) { MainPage mainPage = targetComponent.findParent(MainPage.class); if (mainPage.isUsingAjax()) { AbstractAjaxBehavior eventCallback = mainPage.getPageContributor().getEventCallback(); if (eventCallback != null) { String callback = eventCallback.getCallbackUrl().toString(); if (component instanceof WebDataRadioChoice || component instanceof WebDataCheckBoxChoice || component instanceof WebDataLookupField || component instanceof WebDataComboBox || component instanceof WebDataListBox || component instanceof WebDataHtmlArea) { // is updated via ServoyChoiceComponentUpdatingBehavior or ServoyFormComponentUpdatingBehavior, this is just for events callback += "&nopostdata=true"; } for (IBehavior behavior : targetComponent.getBehaviors()) { if (behavior instanceof EventCallbackModifier) { targetComponent.remove(behavior); } } if (hasFocus) { StringBuilder js = new StringBuilder(); js.append("eventCallback(this,'focus','").append(callback).append("',event)"); //$NON-NLS-1$ //$NON-NLS-2$ targetComponent.add(new EventCallbackModifier("onfocus", true, //$NON-NLS-1$ new Model<String>(js.toString()))); targetComponent.add(new EventCallbackModifier("onmousedown", true, //$NON-NLS-1$ new Model<String>("focusMousedownCallback(event)"))); //$NON-NLS-1$ } if (hasBlur) { boolean blockRequest = false; // if component has ondatachange, check for blockrequest if (component instanceof ISupportEventExecutor && ((ISupportEventExecutor) component).getEventExecutor() .hasChangeCmd()) { WebClientSession webClientSession = WebClientSession.get(); blockRequest = webClientSession != null && webClientSession.blockRequest(); } StringBuilder js = new StringBuilder(); js.append("postEventCallback(this,'blur','").append(callback) //$NON-NLS-1$ .append("',event," + blockRequest + ")"); //$NON-NLS-1$ targetComponent.add(new EventCallbackModifier("onblur", true, //$NON-NLS-1$ new Model<String>(js.toString()))); } } } } } } }); }