Search in sources :

Example 11 with ComponentFormat

use of com.servoy.j2db.component.ComponentFormat in project servoy-client by Servoy.

the class WebDataSubmitLink method onBeforeRender.

/**
 * @see org.apache.wicket.markup.html.link.AbstractLink#onBeforeRender()
 */
@Override
protected void onBeforeRender() {
    super.onBeforeRender();
    strippedText = new StripHTMLTagsConverter.StrippedText();
    IModel<?> model = getInnermostModel();
    hasHTML = false;
    bodyText = null;
    if (needEntireState && model instanceof RecordItemModel) {
        if (dataProviderID != null) {
            Object value = getDefaultModelObject();
            if (value instanceof byte[]) {
                setIcon((byte[]) value);
                if (model instanceof RecordItemModel) {
                    ((RecordItemModel) model).updateRenderedValue(this);
                }
                return;
            }
            if (icon != null)
                setIcon(null);
            if (value instanceof String) {
                ComponentFormat cf = getComponentFormat();
                if (cf == null) {
                    bodyText = Text.processTags((String) value, resolver);
                } else {
                    try {
                        bodyText = Text.processTags(TagResolver.formatObject(value, application.getLocale(), cf.parsedFormat, (cf.parsedFormat.getDisplayFormat() != null ? new ServoyMaskFormatter(cf.parsedFormat.getDisplayFormat(), true) : null)), resolver);
                    } catch (ParseException e) {
                        Debug.error(e);
                    }
                }
            } else {
                bodyText = getDefaultModelObjectAsString();
            }
        } else {
            bodyText = Text.processTags(tagText, resolver);
        }
    } else {
        Object modelObject = getDefaultModelObject();
        if (modelObject instanceof byte[]) {
            setIcon((byte[]) modelObject);
        } else if (icon != null) {
            setIcon(null);
        } else {
            ComponentFormat cf = getComponentFormat();
            if (cf == null) {
                bodyText = Text.processTags(getDefaultModelObjectAsString(), resolver);
            } else {
                try {
                    bodyText = TagResolver.formatObject(modelObject, application.getLocale(), cf.parsedFormat, (cf.parsedFormat.getDisplayFormat() != null ? new ServoyMaskFormatter(cf.parsedFormat.getDisplayFormat(), true) : null));
                } catch (ParseException e) {
                    Debug.error(e);
                }
            }
        }
    }
    if (HtmlUtils.startsWithHtml(bodyText)) {
        strippedText = StripHTMLTagsConverter.convertBodyText(this, bodyText, getScriptObject().trustDataAsHtml(), application.getFlattenedSolution());
        hasHTML = true;
    } else {
        strippedText.setBodyTxt(bodyText);
    }
    if (model instanceof RecordItemModel) {
        ((RecordItemModel) model).updateRenderedValue(this);
    }
}
Also used : StrippedText(com.servoy.j2db.server.headlessclient.dataui.StripHTMLTagsConverter.StrippedText) ServoyMaskFormatter(com.servoy.j2db.util.text.ServoyMaskFormatter) ParseException(java.text.ParseException) ComponentFormat(com.servoy.j2db.component.ComponentFormat)

Example 12 with ComponentFormat

use of com.servoy.j2db.component.ComponentFormat in project servoy-client by Servoy.

the class ValueListTypeSabloValue method initializeIfPossibleAndNeeded.

private void initializeIfPossibleAndNeeded() {
    // some dependent property has changed
    // get the new values
    String newDataproviderID = null;
    String newFormatString = null;
    FoundsetTypeSabloValue newFoundsetPropertySabloValue = null;
    ITable newFoundsetPropertyTable = null;
    if (propertyDependencies.foundsetPropertyName != null) {
        newFoundsetPropertySabloValue = (FoundsetTypeSabloValue) webObjectContext.getProperty(propertyDependencies.foundsetPropertyName);
        if (newFoundsetPropertySabloValue != null) {
            // this won't add it twice if it's already added (see javadoc of this call)
            newFoundsetPropertySabloValue.addStateChangeListener(this);
            if (newFoundsetPropertySabloValue.getFoundset() != null) {
                newFoundsetPropertyTable = newFoundsetPropertySabloValue.getFoundset().getTable();
            } else {
                newFoundsetPropertyTable = FoundsetTypeSabloValue.getTableBasedOfFoundsetPropertyFromFoundsetIdentifier(newFoundsetPropertySabloValue.getFoundsetSelector(), dataAdapterListToUse.getApplication(), ((IContextProvider) webObjectContext.getUnderlyingWebObject()).getDataConverterContext().getForm().getForm());
            }
        }
    }
    if (propertyDependencies.formatPropertyName != null) {
        FormatTypeSabloValue formatSabloValue = ((FormatTypeSabloValue) webObjectContext.getProperty(propertyDependencies.formatPropertyName));
        ComponentFormat componentFormat = (formatSabloValue != null ? formatSabloValue.getComponentFormat() : null);
        newFormatString = ((componentFormat != null && componentFormat.parsedFormat != null) ? componentFormat.parsedFormat.getFormatString() : null);
        // this won't add it twice if it's already added (see javadoc of this call)
        if (formatSabloValue != null)
            formatSabloValue.addStateChangeListener(this);
    }
    if (propertyDependencies.dataproviderPropertyName != null) {
        Object dataproviderValue = webObjectContext.getProperty(propertyDependencies.dataproviderPropertyName);
        if (// if it's foundset linked; otherwise this will be false
        dataproviderValue instanceof IHasUnderlyingState) {
            // this won't add it twice if it's already added (see javadoc of this call)
            ((IHasUnderlyingState) dataproviderValue).addStateChangeListener(this);
        }
        // this will only return non-null if dataproviderValue != null && it is initialized (so foundset is already operational)
        newDataproviderID = DataAdapterList.getDataProviderID(dataproviderValue);
    }
    // see if anything we are interested in changed, of if it's not yet initialized (a detach + attach could happen where everything is still equal, but the detach did clear the vl/format and set initialized to false; for example a table column remove and then add back)
    if (!Utils.stringSafeEquals(newDataproviderID, dataproviderID) || !Utils.stringSafeEquals(newFormatString, formatParsedString) || newFoundsetPropertySabloValue != foundsetPropertySabloValue || !Utils.safeEquals(foundsetPropertyTable, newFoundsetPropertyTable) || !initialized) {
        // so something did change
        dataproviderID = newDataproviderID;
        foundsetPropertySabloValue = newFoundsetPropertySabloValue;
        foundsetPropertyTable = newFoundsetPropertyTable;
        formatParsedString = newFormatString;
        if ((!waitForDataproviderIfNull || dataproviderID != null) && (!waitForFormatIfNull || newFormatString != null) && (propertyDependencies.foundsetPropertyName == null || (newFoundsetPropertySabloValue != null && newFoundsetPropertyTable != null))) {
            // see if all we need is here
            // we don't have a "waitForFoundsetIfNull" because if we really have a foundset-linked-dataprovider, then that one is not initialized until the foundset != null anyway; so we won't get to this place becauuse the dataprovider property would not be ready
            // in case we previously already had an operational valuelist, clear it up as we have new dependency values
            clearUpRuntimeValuelistAndFormat();
            // initialize now
            initializeValuelistAndFormat();
            if (valueList != null) {
                valueList.addListDataListener(this);
                // register data link and find mode listeners as needed
                TargetDataLinks dataLinks = getDataLinks();
                dataAdapterListToUse.addDataLinkedProperty(this, dataLinks);
                // reset the initial wait for flags as we have the initial value; any other change in dependent properties has to be treated right away without additional waiting (even if they change to null)
                waitForDataproviderIfNull = false;
                waitForFormatIfNull = false;
                initialized = true;
            } else {
                Debug.error("Cannot instantiate valuelist (does it exist in the solution?) '" + valuelistIdentifier + "' for property " + vlPD + " of " + webObjectContext, new RuntimeException());
                clearUpRuntimeValuelistAndFormat();
            }
            changeMonitor.markFullyChanged(true);
        } else if (initialized) {
            // so we don't have yet all we need
            // make sure value is cleared/uninitialized (just in case something became unavailable that was available before)
            clearUpRuntimeValuelistAndFormat();
            changeMonitor.markFullyChanged(true);
        }
    }
}
Also used : FoundsetTypeSabloValue(com.servoy.j2db.server.ngclient.property.FoundsetTypeSabloValue) IContextProvider(com.servoy.j2db.server.ngclient.IContextProvider) ITable(com.servoy.j2db.persistence.ITable) JSONObject(org.json.JSONObject) TargetDataLinks(com.servoy.j2db.server.ngclient.property.types.IDataLinkedType.TargetDataLinks) ComponentFormat(com.servoy.j2db.component.ComponentFormat) IHasUnderlyingState(com.servoy.j2db.server.ngclient.property.IHasUnderlyingState)

Example 13 with ComponentFormat

use of com.servoy.j2db.component.ComponentFormat in project servoy-client by Servoy.

the class FormatTypeSabloValue method getSabloValue.

protected ComponentFormat getSabloValue(String formatValue, String dataproviderId, Object valuelistId, String foundsetId, IWebObjectContext webObjectCntxt) {
    INGApplication application = ((WebFormComponent) webObjectCntxt.getUnderlyingWebObject()).getDataConverterContext().getApplication();
    IDataProviderLookup dataProviderLookup = null;
    // IMPORTANT: here we use the for: configs in .spec file
    // 
    // if you have for: [valuelist, dataprovider] then 2 things can happen:
    // - valuelist if it has both real and display values - forces the type; it is either TEXT (custom vl., global method vl.) or the 'display' column type in case it's a DB valuelist
    // - valuelist if not real/display but only one kind of values: here it is required in docs in the spec file that the valuelist property also defines "for": dataprovider if format
    // defines both "for" valuelist and dataprovider => valuelist doesn't force the type and then the dataprovider will decide the type
    // 
    // if you have just for: dataprovider the the dataprovider property determines the type
    // if you have just for: valuelist (TODO) - this is currently not properly supported - as here we should get the type always from the VL (for both display and real values) - as we don't have a dataprovider to fall back on
    isValuelistFormatSet = false;
    if (valuelistId != null) {
        // if we have a "for" valuelist, see if this valuelist forces the format type due to display values (when they are separate from real values)
        // otherwise it will do nothing and loop/fallback to the other if clause below which checks the "for" dataprovider
        ValueList valuelistPersist = ValueListTypeSabloValue.getValuelistPersist(valuelistId, application);
        if (valuelistPersist != null) {
            IDataProvider dataProvider = null;
            ITable table;
            try {
                if (valuelistPersist.getRelationName() != null) {
                    Relation[] relations = application.getFlattenedSolution().getRelationSequence(valuelistPersist.getRelationName());
                    table = application.getFlattenedSolution().getTable(relations[relations.length - 1].getForeignDataSource());
                } else {
                    table = application.getFlattenedSolution().getTable(valuelistPersist.getDataSource());
                }
                if (table != null) {
                    // if the format is for a table valuelist - the type to be used is the one of the dp chosen as 'display' in the valuelist
                    String dp = null;
                    // if show == real then we can use show anyway cause there is only one value for both real and display; if show != real we care about show
                    int showDataProviders = valuelistPersist.getShowDataProviders();
                    if ((showDataProviders & 1) != 0) {
                        dp = valuelistPersist.getDataProviderID1();
                    }
                    if ((showDataProviders & 2) != 0) {
                        // display value is a concat of multiple columns, so a string; not even sure if format property makes sense, but it is for a String then
                        if (dp != null)
                            return ComponentFormat.getComponentFormat(formatValue, IColumnTypes.TEXT, application);
                        dp = valuelistPersist.getDataProviderID2();
                    }
                    if ((showDataProviders & 4) != 0) {
                        // display value is a concat of multiple columns, so a string; not even sure if format property makes sense, but it is for a String then
                        if (dp != null)
                            return ComponentFormat.getComponentFormat(formatValue, IColumnTypes.TEXT, application);
                        dp = valuelistPersist.getDataProviderID3();
                    }
                    if (dp != null) {
                        dataProvider = application.getFlattenedSolution().getDataProviderForTable(table, dp);
                    }
                    isValuelistFormatSet = true;
                    return ComponentFormat.getComponentFormat(formatValue, dataProvider, application, true);
                } else if (valuelistPersist.getValueListType() == IValueListConstants.CUSTOM_VALUES) {
                    IValueList realValuelist = null;
                    ValueListTypeSabloValue valuelistSabloValue = (ValueListTypeSabloValue) FoundsetLinkedTypeSabloValue.unwrapIfNeeded(webObjectContext.getProperty(propertyDependencies.valueListPropertyName));
                    if (valuelistSabloValue != null) {
                        // take it from property, may not be the shared instance in case setvaluelistitems on component was used
                        realValuelist = valuelistSabloValue.getValueList();
                    }
                    if (realValuelist == null) {
                        realValuelist = com.servoy.j2db.component.ComponentFactory.getRealValueList(application, valuelistPersist, true, Types.OTHER, ComponentFormat.getComponentFormat(formatValue, dataproviderId, null, application, true).parsedFormat, null, true);
                    }
                    if (realValuelist.hasRealValues()) {
                        // if custom vl has both real and display values, the display values are TEXT (format is for those)
                        // of if it has displayValueType set, use that
                        isValuelistFormatSet = true;
                        int realValueDisplayType = realValuelist.getValueList().getDisplayValueType();
                        return ComponentFormat.getComponentFormat(formatValue, realValueDisplayType != 0 ? realValueDisplayType : IColumnTypes.TEXT, application);
                    }
                } else if (valuelistPersist.getValueListType() == IValueListConstants.GLOBAL_METHOD_VALUES) {
                    PropertyDescription vlPD = webObjectCntxt.getPropertyDescription(propertyDependencies.valueListPropertyName);
                    Object vlPDConfig = null;
                    if (vlPD != null) {
                        vlPDConfig = vlPD.getConfig();
                        if (vlPDConfig instanceof FoundsetLinkedConfig)
                            vlPDConfig = ((FoundsetLinkedConfig) vlPDConfig).getWrappedConfig();
                    }
                    boolean lazyLoad = valuelistPersist.getLazyLoading() && vlPDConfig instanceof ValueListConfig && ((ValueListConfig) vlPDConfig).getLazyLoading();
                    if (!lazyLoad) {
                        IValueList realValuelist = com.servoy.j2db.component.ComponentFactory.getRealValueList(application, valuelistPersist, true, Types.OTHER, null, null, true);
                        if (realValuelist instanceof GlobalMethodValueList) {
                            ((GlobalMethodValueList) realValuelist).fill(null, "", null);
                            if (realValuelist.hasRealValues() || realValuelist.getSize() == 0 || (realValuelist.getSize() == 1 && valuelistPersist.getAddEmptyValue() == IValueListConstants.EMPTY_VALUE_ALWAYS)) {
                                // if global method vl has both real and display values, the display values are TEXT (format is for those)
                                // of if it has displayValueType set, use that
                                isValuelistFormatSet = true;
                                int realValueDisplayType = realValuelist.getValueList().getDisplayValueType();
                                return ComponentFormat.getComponentFormat(formatValue, realValueDisplayType != 0 ? realValueDisplayType : IColumnTypes.TEXT, application);
                            }
                        }
                    }
                }
            } catch (Exception ex) {
                Debug.error(ex);
            }
        }
    // here - we want to fall back to the dataprovider if available in for: [ ..., dataprovider] if valuelist didn't force a certain display type on the format
    }
    if (dataproviderId != null && foundsetId != null) {
        ITable table = null;
        Form form = ((IContextProvider) webObjectCntxt.getUnderlyingWebObject()).getDataConverterContext().getForm().getForm();
        // always assume now that the the properties has the foundset property name.
        FoundsetTypeSabloValue runtimeValOfFoundset = (FoundsetTypeSabloValue) webObjectCntxt.getUnderlyingWebObject().getProperty(this.propertyDependencies.foundsetPropertyName);
        if (runtimeValOfFoundset != null && runtimeValOfFoundset.getFoundset() != null && runtimeValOfFoundset.getFoundset().getDataSource().equals(foundsetId)) {
            table = runtimeValOfFoundset.getFoundset().getTable();
        }
        if (table == null)
            table = FoundsetTypeSabloValue.getTableBasedOfFoundsetPropertyFromFoundsetIdentifier(foundsetId, application, form);
        if (table != null) {
            dataProviderLookup = new FormAndTableDataProviderLookup(application.getFlattenedSolution(), form, table);
        }
    // else it will be searched for in form's context and table as below
    }
    if (dataProviderLookup == null) {
        WebObjectSpecification spec = ((WebFormComponent) webObjectCntxt.getUnderlyingWebObject()).getParent().getSpecification();
        if (spec != null) {
            Collection<PropertyDescription> formComponentProperties = spec.getProperties(FormComponentPropertyType.INSTANCE);
            if (formComponentProperties != null) {
                for (PropertyDescription property : formComponentProperties) {
                    if (property.getConfig() instanceof ComponentTypeConfig && ((ComponentTypeConfig) property.getConfig()).forFoundset != null) {
                        FoundsetTypeSabloValue runtimeValOfFoundset = (FoundsetTypeSabloValue) ((WebFormComponent) webObjectCntxt.getUnderlyingWebObject()).getParent().getProperty(((ComponentTypeConfig) property.getConfig()).forFoundset);
                        ITable table = null;
                        Form form = ((IContextProvider) webObjectCntxt.getUnderlyingWebObject()).getDataConverterContext().getForm().getForm();
                        if (runtimeValOfFoundset.getFoundset() != null)
                            table = runtimeValOfFoundset.getFoundset().getTable();
                        if (table == null)
                            table = FoundsetTypeSabloValue.getTableBasedOfFoundsetPropertyFromFoundsetIdentifier(runtimeValOfFoundset.getFoundsetSelector(), application, form);
                        if (table != null) {
                            dataProviderLookup = new FormAndTableDataProviderLookup(application.getFlattenedSolution(), form, table);
                        }
                        break;
                    }
                }
            }
        }
    }
    if (dataProviderLookup == null && application != null)
        dataProviderLookup = application.getFlattenedSolution().getDataproviderLookup(application.getFoundSetManager(), ((IContextProvider) webObjectCntxt.getUnderlyingWebObject()).getDataConverterContext().getForm().getForm());
    ComponentFormat format = ComponentFormat.getComponentFormat(formatValue, dataproviderId, dataProviderLookup, application, true);
    return format;
}
Also used : WebObjectSpecification(org.sablo.specification.WebObjectSpecification) ValueList(com.servoy.j2db.persistence.ValueList) GlobalMethodValueList(com.servoy.j2db.dataprocessing.GlobalMethodValueList) IValueList(com.servoy.j2db.dataprocessing.IValueList) Form(com.servoy.j2db.persistence.Form) WebFormComponent(com.servoy.j2db.server.ngclient.WebFormComponent) FoundsetLinkedConfig(com.servoy.j2db.server.ngclient.property.FoundsetLinkedConfig) GlobalMethodValueList(com.servoy.j2db.dataprocessing.GlobalMethodValueList) IDataProvider(com.servoy.j2db.persistence.IDataProvider) Relation(com.servoy.j2db.persistence.Relation) INGApplication(com.servoy.j2db.server.ngclient.INGApplication) IContextProvider(com.servoy.j2db.server.ngclient.IContextProvider) FormAndTableDataProviderLookup(com.servoy.j2db.FormAndTableDataProviderLookup) ITable(com.servoy.j2db.persistence.ITable) ComponentTypeConfig(com.servoy.j2db.server.ngclient.property.ComponentTypeConfig) IValueList(com.servoy.j2db.dataprocessing.IValueList) ComponentFormat(com.servoy.j2db.component.ComponentFormat) ValueListConfig(com.servoy.j2db.server.ngclient.property.ValueListConfig) PropertyDescription(org.sablo.specification.PropertyDescription) FoundsetTypeSabloValue(com.servoy.j2db.server.ngclient.property.FoundsetTypeSabloValue) IDataProviderLookup(com.servoy.j2db.persistence.IDataProviderLookup)

Example 14 with ComponentFormat

use of com.servoy.j2db.component.ComponentFormat in project servoy-client by Servoy.

the class FoundsetTypeSabloValue method writeColumnFormatsIfNeededAndAvailable.

protected void writeColumnFormatsIfNeededAndAvailable(JSONWriter destinationJSON, IBrowserConverterContext dataConverterContext, boolean update) throws JSONException {
    if (specConfig.sendDefaultFormats) {
        destinationJSON.key((update ? UPDATE_PREFIX : "") + COLUMN_FORMATS).object();
        if (columnFormats != null) {
            // just get it nicely in case it's overridden in designer for example
            FormatPropertyType formatPropertyType = (FormatPropertyType) TypesRegistry.getType(FormatPropertyType.TYPE_NAME);
            for (Entry<String, ComponentFormat> columnFormat : columnFormats.entrySet()) {
                formatPropertyType.writeComponentFormatToJSON(destinationJSON, columnFormat.getKey(), columnFormat.getValue(), null, dataConverterContext);
            }
        }
        // else just an empty object if fine (but we do write it because when changing dataproviders from scripting it could change from something to null and the client should know about it)
        destinationJSON.endObject();
    }
}
Also used : FormatPropertyType(com.servoy.j2db.server.ngclient.property.types.FormatPropertyType) ComponentFormat(com.servoy.j2db.component.ComponentFormat)

Aggregations

ComponentFormat (com.servoy.j2db.component.ComponentFormat)14 ServoyMaskFormatter (com.servoy.j2db.util.text.ServoyMaskFormatter)5 ParseException (java.text.ParseException)5 ITable (com.servoy.j2db.persistence.ITable)3 Form (com.servoy.j2db.persistence.Form)2 IDataProvider (com.servoy.j2db.persistence.IDataProvider)2 Relation (com.servoy.j2db.persistence.Relation)2 IContextProvider (com.servoy.j2db.server.ngclient.IContextProvider)2 FoundsetTypeSabloValue (com.servoy.j2db.server.ngclient.property.FoundsetTypeSabloValue)2 IConverter (org.apache.wicket.util.convert.IConverter)2 IBaseColumn (com.servoy.base.persistence.IBaseColumn)1 FlattenedSolution (com.servoy.j2db.FlattenedSolution)1 FormAndTableDataProviderLookup (com.servoy.j2db.FormAndTableDataProviderLookup)1 FormController (com.servoy.j2db.FormController)1 FormManager (com.servoy.j2db.FormManager)1 GlobalMethodValueList (com.servoy.j2db.dataprocessing.GlobalMethodValueList)1 IValueList (com.servoy.j2db.dataprocessing.IValueList)1 Column (com.servoy.j2db.persistence.Column)1 ColumnInfo (com.servoy.j2db.persistence.ColumnInfo)1 IColumn (com.servoy.j2db.persistence.IColumn)1