use of com.servoy.j2db.server.ngclient.component.RuntimeWebComponent in project servoy-client by Servoy.
the class ValueListTypeSabloValue method filterValuelist.
/**
* Filters the values of the valuelist for type-ahead-like usage.
*/
private void filterValuelist(JSONObject newJSONValue) {
if (!initialized) {
Debug.warn("Trying to send to client an uninitialized valuelist property: " + vlPD + " of " + webObjectContext);
return;
}
this.valuesRequested = true;
this.handledIDForResponse = Long.valueOf(newJSONValue.getLong(ID_KEY));
String filterString = newJSONValue.optString(FILTER);
if (filteredValuelist == null) {
filteredValuelist = createFilteredValueList();
if (filteredValuelist != null) {
filteredValuelist.addListDataListener(new ListDataListener() {
@Override
public void intervalRemoved(ListDataEvent e) {
changeMonitor.markFullyChanged(true);
}
@Override
public void intervalAdded(ListDataEvent e) {
changeMonitor.markFullyChanged(true);
}
@Override
public void contentsChanged(ListDataEvent e) {
changeMonitor.markFullyChanged(true);
}
});
}
}
if (filteredValuelist != null) {
try {
valueList.removeListDataListener(this);
Object realValue = dataAdapterListToUse.getValueObject(dataAdapterListToUse.getRecord(), dataproviderID);
// do mark it as changed but don't notify yet (false arg) because fill below will probably trigger listener above and notify anyway; that would mean that although
// we do call notify after fill that is likely to end up in a NO_OP changesToJSON in case of foundset-linked valuelist properties
changeMonitor.markFullyChanged(false);
boolean useContains = Utils.getAsBoolean(dataAdapterListToUse.getApplication().getClientProperty(IApplication.VALUELIST_CONTAINS_SEARCH));
if (!useContains && webObjectContext != null && webObjectContext.getUnderlyingWebObject() instanceof WebFormComponent) {
WebFormComponent webObject = (WebFormComponent) webObjectContext.getUnderlyingWebObject();
RuntimeWebComponent webComponentElement = dataAdapterListToUse.getForm().getWebComponentElement(webObject.getFormElement().getRawName());
if (webComponentElement != null && webComponentElement.getPrototype() instanceof RuntimeLegacyComponent) {
RuntimeLegacyComponent legacy = (RuntimeLegacyComponent) webComponentElement.getPrototype();
useContains = Utils.getAsBoolean(legacy.getClientProperty(IApplication.VALUELIST_CONTAINS_SEARCH, legacy));
}
}
if (useContains && filterString != null)
filterString = '%' + filterString;
filteredValuelist.fill(dataAdapterListToUse.getRecord(), dataproviderID, filterString, realValue, false);
// in case fill really somehow did not result in the filteredValuelist listener doing a notify
changeMonitor.notifyOfChange();
valueList.addListDataListener(this);
} catch (ServoyException e) {
Debug.error(e);
}
}
}
use of com.servoy.j2db.server.ngclient.component.RuntimeWebComponent in project servoy-client by Servoy.
the class FormComponentPropertyType method toRhinoValue.
@Override
public Object toRhinoValue(Object webComponentValue, PropertyDescription pd, IWebObjectContext componentOrService, Scriptable startScriptable) {
Scriptable newObject = DefaultScope.newObject(startScriptable);
WebFormComponent webFormComponent = (WebFormComponent) componentOrService;
FlattenedSolution fs = webFormComponent.getDataConverterContext().getSolution();
FormComponentCache cache = null;
if (webComponentValue instanceof FormComponentSabloValue) {
cache = ((FormComponentSabloValue) webComponentValue).getCache();
} else {
Form form = getForm(webComponentValue, fs);
if (form == null)
return null;
// TODO return here a NativeScriptable object that understand the full hiearchy?
cache = FormElementHelper.INSTANCE.getFormComponentCache(webFormComponent.getFormElement(), pd, (JSONObject) webComponentValue, form, fs);
}
IWebFormUI formUI = webFormComponent.findParent(IWebFormUI.class);
String prefix = FormElementHelper.getStartElementName(webFormComponent.getFormElement(), pd);
for (FormElement fe : cache.getFormComponentElements()) {
String name = fe.getName();
if (name != null && !name.startsWith(FormElement.SVY_NAME_PREFIX)) {
RuntimeWebComponent webComponent = formUI.getRuntimeWebComponent(fe.getRawName());
if (webComponent != null) {
newObject.put(name.substring(prefix.length()), newObject, webComponent);
}
}
}
return newObject;
}
use of com.servoy.j2db.server.ngclient.component.RuntimeWebComponent in project servoy-client by Servoy.
the class JSEventType method fillJSEvent.
/**
* @param event Event that needs to be filled
* @param jsonObject The json data for that has the event data.
* @param webObject The webObject element (WEbFormComponent or WebFormUI)
* @param controller Optional the controller object if the caller knows this already
* @return
*/
@SuppressWarnings("nls")
public static void fillJSEvent(JSBaseEvent event, JSONObject jsonObject, BaseWebObject webObject, IWebFormController controller) {
event.setType(jsonObject.optString("eventType"));
String formName = controller != null ? controller.getName() : "";
String elementName = "";
if (webObject instanceof WebFormComponent) {
elementName = ((WebFormComponent) webObject).getFormElement().getRawName();
if (elementName == null)
elementName = "";
if (formName.isEmpty()) {
BaseWebObject parentWebObject = ((WebFormComponent) webObject).getParent();
while (parentWebObject != null && !(parentWebObject instanceof WebFormUI)) {
parentWebObject = ((WebFormComponent) parentWebObject).getParent();
}
if (parentWebObject instanceof WebFormUI) {
formName = parentWebObject.getName();
}
}
}
if (formName.isEmpty()) {
formName = jsonObject.optString("formName");
}
if (formName.isEmpty() && webObject instanceof WebFormUI) {
// executeInlineScript with an event in params tells a DAL to execute it and it gives a formui as context to the fromJSON conversion
// for JSEventType problem is that it can give any formName from the client (the component/service can give anything there as an arg); or, if the function
// (sent to client before through "function" type) that will be used to execute the script is a global/scope function
// then formName can be null and in that case the WebFormUI will be the main form or the window (not the most nested one)
// so this is just a fallback and we do give priority to the form name determined on client through $window.createJSEvent(...) an put into
// "jsonObject" (see if above) - to target the correct form - closest one to event
formName = webObject.getName();
}
if (elementName.isEmpty()) {
elementName = jsonObject.optString("elementName");
}
if (!formName.isEmpty())
event.setFormName(formName);
if (!elementName.isEmpty())
event.setElementName(elementName);
if (!formName.isEmpty()) {
INGApplication application = ((IContextProvider) webObject).getDataConverterContext().getApplication();
IWebFormController formController = controller != null ? controller : application.getFormManager().getForm(formName);
if (formController != null) {
FormScope formScope = formController.getFormScope();
if (formScope != null) {
ElementScope elementsScope = (ElementScope) formScope.get("elements", null);
if (elementsScope != null) {
Object scriptableElement = !elementName.isEmpty() ? elementsScope.get(elementName, null) : null;
if (scriptableElement != null && scriptableElement != Scriptable.NOT_FOUND) {
event.setSource(scriptableElement);
} else if (webObject instanceof WebFormComponent) {
// quickly create a scriptable wrapper around the component so that the source can be set to a value that we expect.
FormElement fe = ((WebFormComponent) webObject).getFormElement();
RuntimeWebComponent runtimeComponent = new RuntimeWebComponent((WebFormComponent) webObject, webObject.getSpecification());
if (fe.isLegacy() || ((fe.getForm().getView() == IForm.LIST_VIEW || fe.getForm().getView() == FormController.LOCKED_LIST_VIEW || fe.getForm().getView() == FormController.TABLE_VIEW || fe.getForm().getView() == FormController.LOCKED_TABLE_VIEW) && fe.getTypeName().startsWith("svy-"))) {
// add legacy behavior
runtimeComponent.setPrototype(new RuntimeLegacyComponent((WebFormComponent) webObject));
}
event.setSource(runtimeComponent);
}
}
}
}
}
try {
if (jsonObject.has("x"))
event.setLocation(new Point(jsonObject.optInt("x"), jsonObject.optInt("y")));
if (jsonObject.has("modifiers"))
event.setModifiers(jsonObject.optInt("modifiers"));
if (jsonObject.has("data"))
event.setData(jsonObject.opt("data"));
if (jsonObject.has("timestamp"))
event.setTimestamp(new Timestamp(jsonObject.getLong("timestamp")));
else
event.setTimestamp(new Date());
} catch (Exception e) {
Debug.error("error setting event properties from " + jsonObject + ", for component: " + elementName + " on form " + formName, e);
}
}
use of com.servoy.j2db.server.ngclient.component.RuntimeWebComponent in project servoy-client by Servoy.
the class ClientDesignService method executeMethod.
@Override
public Object executeMethod(String methodName, JSONObject args) throws Exception {
Object retValue = null;
String formname = args.optString("formname");
IWebFormController form = application.getFormManager().getForm(formname);
if (form != null && form.getDesignModeCallbacks() != null) {
String layoutWrapperName = args.optString("element");
JSEvent event = new JSEvent();
event.setFormName(formname);
JSONObject jsevent = args.optJSONObject("event");
if (jsevent != null) {
if (jsevent.has("timestamp"))
event.setTimestamp(new Timestamp(jsevent.getLong("timestamp")));
else
event.setTimestamp(new Date());
if (jsevent.has("x"))
event.setLocation(new Point(jsevent.getInt("x"), jsevent.getInt("y")));
if (jsevent.has("modifiers"))
event.setModifiers(jsevent.getInt("modifiers"));
}
List<RuntimeWebComponent> selection = new ArrayList<>();
String name = layoutWrapperName;
if (layoutWrapperName != null && layoutWrapperName.startsWith("layout.")) {
name = name.substring(7);
}
if (name != null && !"".equals(name)) {
RuntimeWebComponent[] webComponentElements = form.getWebComponentElements();
for (RuntimeWebComponent component : webComponentElements) {
if (component.getComponent().getName().equals(name)) {
JSONObject location = args.optJSONObject("location");
if (location != null) {
component.getComponent().setProperty(StaticContentSpecLoader.PROPERTY_LOCATION.getPropertyName(), new Point(location.optInt("x"), location.optInt("y")));
}
JSONObject size = args.optJSONObject("size");
if (size != null) {
component.getComponent().setProperty(StaticContentSpecLoader.PROPERTY_SIZE.getPropertyName(), new Dimension(size.optInt("width"), size.optInt("height")));
}
selection.add(component);
break;
}
}
}
event.setData(selection.toArray());
event.setName(methodName);
switch(methodName) {
case // $NON-NLS-1$
"onselect":
event.setType(IJSEvent.ACTION);
retValue = form.getDesignModeCallbacks().executeOnSelect(event);
// selection is allowed, only disallow it when retValue is false directly
if (retValue == null || Undefined.isUndefined(retValue))
retValue = Boolean.TRUE;
break;
case // $NON-NLS-1$
"ondrag":
event.setType(IJSEvent.EventType.onDrag);
retValue = form.getDesignModeCallbacks().executeOnDrag(event);
break;
case // $NON-NLS-1$
"ondrop":
event.setType(IJSEvent.EventType.onDrop);
retValue = form.getDesignModeCallbacks().executeOnDrop(event);
break;
case // $NON-NLS-1$
"onresize":
event.setType(IJSEvent.EventType.onDrop);
retValue = form.getDesignModeCallbacks().executeOnResize(event);
break;
case // $NON-NLS-1$
"onrightclick":
event.setType(IJSEvent.EventType.rightClick);
retValue = form.getDesignModeCallbacks().executeOnRightClick(event);
break;
case // $NON-NLS-1$
"ondoubleclick":
event.setType(IJSEvent.EventType.doubleClick);
retValue = form.getDesignModeCallbacks().executeOnDblClick(event);
break;
default:
break;
}
}
return Undefined.isUndefined(retValue) ? null : retValue;
}
use of com.servoy.j2db.server.ngclient.component.RuntimeWebComponent in project servoy-client by Servoy.
the class WebFormUI method contributeComponentToElementsScope.
private void contributeComponentToElementsScope(ElementScope elementsScope, FormElement fe, WebObjectSpecification componentSpec, WebFormComponent component) {
Object lengthOfEl = elementsScope.get("length", elementsScope);
int lastElementByIndex = (lengthOfEl instanceof Integer ? ((Integer) lengthOfEl).intValue() : 0);
if (!FormElement.ERROR_BEAN.equals(componentSpec.getName()) && (!fe.getName().startsWith("svy_") || ((fe.getPersistIfAvailable() instanceof IFormElement) && ((IFormElement) fe.getPersistIfAvailable()).getGroupID() != null))) {
RuntimeWebComponent runtimeComponent = new RuntimeWebComponent(component, componentSpec);
if (fe.isLegacy() || ((fe.getForm().getView() == IForm.LIST_VIEW || fe.getForm().getView() == FormController.LOCKED_LIST_VIEW || fe.getForm().getView() == FormController.TABLE_VIEW || fe.getForm().getView() == FormController.LOCKED_TABLE_VIEW) && fe.getTypeName().startsWith("servoydefault-"))) {
// add legacy behavior
runtimeComponent.setPrototype(new RuntimeLegacyComponent(component));
}
if (!fe.getName().startsWith("svy_")) {
elementsScope.put(fe.getRawName(), formController.getFormScope(), runtimeComponent);
elementsScope.put(lastElementByIndex, formController.getFormScope(), runtimeComponent);
}
String groupID = fe.getPersistIfAvailable() instanceof IFormElement ? ((IFormElement) fe.getPersistIfAvailable()).getGroupID() : null;
if (groupID != null) {
if (groups == null)
groups = new HashMap<String, RuntimeWebGroup>(4);
RuntimeWebGroup group = groups.get(groupID);
if (group == null) {
String groupName = FormElementGroup.getName(groupID);
group = new RuntimeWebGroup(groupName);
group.setParentScope(component.getDataConverterContext().getApplication().getScriptEngine().getSolutionScope());
elementsScope.put(groupName, formController.getFormScope(), group);
groups.put(groupID, group);
}
group.add(runtimeComponent);
}
}
}
Aggregations