use of com.servoy.j2db.util.IStyleRule in project servoy-client by Servoy.
the class ComponentFactory method getStyleForBasicComponentInternal.
private static Pair<IStyleSheet, IStyleRule> getStyleForBasicComponentInternal(IServiceProvider sp, AbstractBase bc, Form form, Set<Integer> visited) {
if (bc == null || sp == null)
return null;
// Protection agains cycle in form inheritance hierarchy.
if (!visited.add(new Integer(form.getID())))
return null;
Style repos_style = getStyleForForm(sp, form);
Pair<IStyleSheet, IStyleRule> pair = null;
if (repos_style != null) {
IStyleSheet ss = getCSSStyle(sp, repos_style);
String lookupName = getLookupName(bc);
if (lookupName != null) {
String formLookup = "";
ISupportChilds parent = bc.getParent();
if (parent instanceof Form) {
String styleClass = ((Form) parent).getStyleClass();
if (styleClass != null && styleClass.length() != 0) {
formLookup = "form." + styleClass;
} else {
formLookup = "form";
}
} else if (parent instanceof Portal) {
String styleClass = ((Portal) parent).getStyleClass();
if (styleClass != null && styleClass.length() != 0) {
formLookup = "portal." + styleClass;
} else {
formLookup = "portal";
}
parent = ((Portal) parent).getParent();
if (parent instanceof Form) {
styleClass = ((Form) parent).getStyleClass();
if (styleClass != null && styleClass.length() != 0) {
formLookup = "form." + styleClass + ' ' + formLookup;
} else {
formLookup = "form " + formLookup;
}
}
}
IStyleRule s = null;
String styleClass = (bc instanceof BaseComponent) ? ((BaseComponent) bc).getStyleClass() : null;
if (bc instanceof Part) {
styleClass = ((Part) bc).getStyleClass();
}
if (lookupName.equals("check") || lookupName.equals("combobox") || "radio".equals(lookupName)) {
if (styleClass != null && styleClass.length() != 0) {
lookupName += '.' + styleClass;
}
lookupName = formLookup + ' ' + lookupName;
s = ss.getCSSRule(lookupName);
if (s.getAttributeCount() > 0)
return new Pair<IStyleSheet, IStyleRule>(ss, s);
else
lookupName = "field";
}
if (styleClass != null && styleClass.length() != 0) {
lookupName += '.' + styleClass;
}
lookupName = formLookup + ' ' + lookupName;
s = ss.getCSSRule(lookupName);
pair = new Pair<IStyleSheet, IStyleRule>(ss, s);
// see BoxPainter for getBorder/getInsets/getLength examples
}
}
if ((pair == null || pair.getRight() == null || (pair.getRight()).getAttributeCount() == 0)) {
if (sp.getFlattenedSolution() != null) {
List<Form> formHierarchy = sp.getFlattenedSolution().getFormHierarchy(form);
for (int i = 1; i < formHierarchy.size(); i++) {
pair = getStyleForBasicComponentInternal(sp, bc, formHierarchy.get(i), visited);
if (pair != null && pair.getRight() != null && (pair.getRight()).getAttributeCount() != 0) {
break;
}
}
}
}
return pair;
}
use of com.servoy.j2db.util.IStyleRule in project servoy-client by Servoy.
the class ComponentFactory method applyBasicComponentProperties.
public static void applyBasicComponentProperties(IApplication application, IComponent c, BaseComponent bc, Pair<IStyleSheet, IStyleRule> styleInfo) {
// flag for border set by style config
boolean isBorderStyle = false;
// by default it is not transparent
c.setOpaque(true);
// apply any style
if (styleInfo != null) {
IStyleSheet ss = styleInfo.getLeft();
IStyleRule s = styleInfo.getRight();
if (ss != null && s != null) {
if (s.hasAttribute(CSS.Attribute.COLOR.toString())) {
Color cfg = ss.getForeground(s);
if (cfg != null)
c.setForeground(cfg);
}
Object sbackground_color = s.getValue(CSS.Attribute.BACKGROUND_COLOR.toString());
if (sbackground_color != null) {
if (IStyleSheet.COLOR_TRANSPARENT.equals(sbackground_color.toString())) {
c.setOpaque(false);
} else {
Color cbg = ss.getBackground(s);
if (cbg != null)
c.setBackground(cbg);
}
}
// else c.setOpaque(false); // no background-color means transparent
if (ss.hasFont(s)) {
Font f = ss.getFont(s);
if (f != null)
c.setFont(f);
}
if (ss.hasBorder(s)) {
Border b = ss.getBorder(s);
if (b != null) {
c.setBorder(b);
isBorderStyle = true;
}
}
if (ss.hasMargin(s)) {
Insets i = ss.getMargin(s);
if (i != null && c instanceof IButton)
((IButton) c).setMargin(i);
}
}
}
// We intentionally leave the location setting to DataRenderers, since thats the context and might substract part heights from location!
java.awt.Dimension dim = bc.getSize();
if (dim != null)
c.setSize(bc.getSize());
javax.swing.border.Border border = ComponentFactoryHelper.createBorder(bc.getBorderType());
if ((c instanceof JCheckBox || /* DataCheckBox */
c instanceof JRadioButton) && (border != null || isBorderStyle)) {
((AbstractButton) c).setBorderPainted(true);
if (c instanceof JCheckBox) {
((JCheckBox) c).setBorderPaintedFlat(false);
}
}
if (border != null) {
if (border instanceof TitledBorder && Utils.isAppleMacOS()) {
// apple bug.. i have to set the font again (as new!!)
TitledBorder tb = (TitledBorder) border;
Font f = tb.getTitleFont();
if (f != null) {
tb.setTitleFont(new Font(f.getName(), f.getStyle(), f.getSize()));
}
c.setBorder(border);
} else {
c.setBorder(border);
}
}
// if (c instanceof IDelegate)
// {
// c = (JComponent)((IDelegate)c).getDelegate();
// }
String fontString = bc.getFontType();
if (fontString != null) {
Font f = PersistHelper.createFont(fontString);
if (f != null)
c.setFont(f);
}
java.awt.Color bg = bc.getBackground();
if (bg != null)
c.setBackground(bg);
java.awt.Color fg = bc.getForeground();
if (fg != null)
c.setForeground(fg);
String name = bc.getName();
if (name != null)
c.setName(name);
// only use component property value if it is "checked" to be transparent
if (bc.getTransparent())
c.setOpaque(false);
c.setComponentEnabled(bc.getEnabled());
c.setComponentVisible(bc.getVisible());
if (Utils.isSwingClient(application.getApplicationType())) {
// special code for smart client LAFs, like BizLaf
String delegateStyleClassNamePropertyKey = application.getSettings().getProperty("servoy.smartclient.componentStyleClassDelegatePropertyKey");
if (delegateStyleClassNamePropertyKey != null && c instanceof JComponent) {
if (c instanceof IScriptableProvider && ((IScriptableProvider) c).getScriptObject() instanceof IRuntimeComponent) {
// special case since putClientProperty can delegate properties but cannot be overridden we relay on the scripting equivalent
((IRuntimeComponent) ((IScriptableProvider) c).getScriptObject()).putClientProperty(delegateStyleClassNamePropertyKey, bc.getStyleClass());
} else {
((JComponent) c).putClientProperty(delegateStyleClassNamePropertyKey, bc.getStyleClass());
}
}
}
}
use of com.servoy.j2db.util.IStyleRule in project servoy-client by Servoy.
the class ComponentFactory method createField.
private static IComponent createField(IApplication application, Form form, Field field, IDataProviderLookup dataProviderLookup, IScriptExecuter el, boolean printing) {
ValueList valuelist = application.getFlattenedSolution().getValueList(field.getValuelistID());
ComponentFormat fieldFormat = ComponentFormat.getComponentFormat(field.getFormat(), field.getDataProviderID(), dataProviderLookup, application);
IDataProvider dp = null;
if (field.getDataProviderID() != null && dataProviderLookup != null) {
try {
dp = dataProviderLookup.getDataProvider(field.getDataProviderID());
} catch (RepositoryException e) {
Debug.error(e);
}
}
// apply any style
Insets style_margin = null;
int style_halign = -1;
boolean hasBorder = false;
Pair<IStyleSheet, IStyleRule> styleInfo = getStyleForBasicComponent(application, field, form);
if (styleInfo != null) {
IStyleSheet ss = styleInfo.getLeft();
IStyleRule s = styleInfo.getRight();
if (ss != null && s != null) {
style_margin = ss.getMargin(s);
style_halign = ss.getHAlign(s);
hasBorder = ss.hasBorder(s);
}
}
IStylePropertyChangesRecorder jsChangeRecorder = application.getItemFactory().createChangesRecorder();
IFieldComponent fl;
AbstractRuntimeField<? extends IFieldComponent> scriptable;
switch(field.getDisplayType()) {
case Field.PASSWORD:
{
RuntimeDataPassword so;
scriptable = so = new RuntimeDataPassword(jsChangeRecorder, application);
fl = application.getItemFactory().createDataPassword(so, getWebID(form, field));
so.setComponent(fl, field);
}
break;
case Field.RTF_AREA:
{
RuntimeRtfArea so;
scriptable = so = new RuntimeRtfArea(jsChangeRecorder, application);
fl = application.getItemFactory().createDataTextEditor(so, getWebID(form, field), RTF_AREA, field.getEditable());
so.setComponent(fl, field);
if (fl instanceof IScrollPane) {
applyScrollBarsProperty((IScrollPane) fl, field);
}
}
break;
case Field.HTML_AREA:
{
RuntimeHTMLArea so;
scriptable = so = new RuntimeHTMLArea(jsChangeRecorder, application);
fl = application.getItemFactory().createDataTextEditor(so, getWebID(form, field), HTML_AREA, field.getEditable());
so.setComponent(fl, field);
if (fl instanceof IScrollPane) {
applyScrollBarsProperty((IScrollPane) fl, field);
}
}
break;
case Field.TEXT_AREA:
{
RuntimeTextArea so;
scriptable = so = new RuntimeTextArea(jsChangeRecorder, application);
fl = application.getItemFactory().createDataTextArea(so, getWebID(form, field));
so.setComponent(fl, field);
if (fl instanceof IScrollPane) {
applyScrollBarsProperty((IScrollPane) fl, field);
}
}
break;
case Field.CHECKS:
{
AbstractRuntimeValuelistComponent<IFieldComponent> so;
if (valuelist != null) {
IValueList list = getRealValueList(application, valuelist, true, fieldFormat.dpType, fieldFormat.parsedFormat, field.getDataProviderID());
if (isSingleValue(valuelist)) {
scriptable = so = new RuntimeCheckbox(jsChangeRecorder, application);
fl = application.getItemFactory().createCheckBox((RuntimeCheckbox) so, getWebID(form, field), application.getI18NMessageIfPrefixed(field.getText()), list);
} else {
scriptable = so = new RuntimeCheckBoxChoice(jsChangeRecorder, application);
fl = application.getItemFactory().createDataChoice((RuntimeCheckBoxChoice) so, getWebID(form, field), list, false, fieldFormat == null || fieldFormat.dpType == IColumnTypes.TEXT);
if (fl instanceof IScrollPane) {
applyScrollBarsProperty((IScrollPane) fl, field);
}
}
} else {
scriptable = so = new RuntimeCheckbox(jsChangeRecorder, application);
fl = application.getItemFactory().createCheckBox((RuntimeCheckbox) so, getWebID(form, field), application.getI18NMessageIfPrefixed(field.getText()), null);
}
so.setComponent(fl, field);
}
break;
case Field.RADIOS:
{
AbstractRuntimeValuelistComponent<IFieldComponent> so;
IValueList list = getRealValueList(application, valuelist, true, fieldFormat.dpType, fieldFormat.parsedFormat, field.getDataProviderID());
if (isSingleValue(valuelist)) {
scriptable = so = new RuntimeRadioButton(jsChangeRecorder, application);
fl = application.getItemFactory().createRadioButton((RuntimeRadioButton) so, getWebID(form, field), application.getI18NMessageIfPrefixed(field.getText()), list);
} else {
scriptable = so = new RuntimeRadioChoice(jsChangeRecorder, application);
fl = application.getItemFactory().createDataChoice((RuntimeRadioChoice) so, getWebID(form, field), list, true, false);
if (fl instanceof IScrollPane) {
applyScrollBarsProperty((IScrollPane) fl, field);
}
}
so.setComponent(fl, field);
}
break;
case Field.COMBOBOX:
{
RuntimeDataCombobox so;
scriptable = so = new RuntimeDataCombobox(jsChangeRecorder, application);
IValueList list = getRealValueList(application, valuelist, true, fieldFormat.dpType, fieldFormat.parsedFormat, field.getDataProviderID());
fl = application.getItemFactory().createDataComboBox(so, getWebID(form, field), list);
so.setComponent(fl, field);
}
break;
case Field.CALENDAR:
{
RuntimeDataCalendar so;
scriptable = so = new RuntimeDataCalendar(jsChangeRecorder, application);
fl = application.getItemFactory().createDataCalendar(so, getWebID(form, field));
so.setComponent(fl, field);
}
break;
case Field.IMAGE_MEDIA:
{
RuntimeMediaField so;
scriptable = so = new RuntimeMediaField(jsChangeRecorder, application);
fl = application.getItemFactory().createDataImgMediaField(so, getWebID(form, field));
if (fl instanceof IScrollPane) {
applyScrollBarsProperty((IScrollPane) fl, field);
}
so.setComponent(fl, field);
}
break;
case Field.TYPE_AHEAD:
if (field.getValuelistID() > 0) {
fl = createTypeAheadWithValueList(application, form, field, dataProviderLookup, fieldFormat.uiType, fieldFormat.parsedFormat, jsChangeRecorder);
if (fl == null)
return null;
scriptable = (AbstractRuntimeField<? extends IFieldComponent>) fl.getScriptObject();
break;
}
if (// only allow plain columns
dp != null && dp.getColumnWrapper() != null && dp.getColumnWrapper().getRelations() == null) {
RuntimeDataLookupField so;
scriptable = so = new RuntimeDataLookupField(jsChangeRecorder, application);
fl = application.getItemFactory().createDataLookupField(so, getWebID(form, field), form.getServerName(), form.getTableName(), dp == null ? field.getDataProviderID() : dp.getDataProviderID());
so.setComponent(fl, field);
break;
} else {
RuntimeDataField so;
scriptable = so = new RuntimeDataField(jsChangeRecorder, application);
fl = application.getItemFactory().createDataField(so, getWebID(form, field));
so.setComponent(fl, field);
break;
}
// $FALL-THROUGH$
case Field.LIST_BOX:
case Field.MULTISELECT_LISTBOX:
{
boolean multiSelect = (field.getDisplayType() == Field.MULTISELECT_LISTBOX);
RuntimeListBox so;
scriptable = so = new RuntimeListBox(jsChangeRecorder, application, multiSelect);
IValueList list = getRealValueList(application, valuelist, true, fieldFormat.dpType, fieldFormat.parsedFormat, field.getDataProviderID());
fl = application.getItemFactory().createListBox(so, getWebID(form, field), list, multiSelect);
so.setComponent(fl, field);
}
break;
case Field.SPINNER:
{
RuntimeSpinner so;
scriptable = so = new RuntimeSpinner(jsChangeRecorder, application);
IValueList list = getRealValueList(application, valuelist, true, fieldFormat.dpType, fieldFormat.parsedFormat, field.getDataProviderID());
fl = application.getItemFactory().createSpinner(so, getWebID(form, field), list);
so.setComponent(fl, field);
break;
}
// else treat as the default case: TEXT_FIELD
default:
// Field.TEXT_FIELD
if (field.getValuelistID() > 0) {
fl = createTypeAheadWithValueList(application, form, field, dataProviderLookup, fieldFormat.uiType, fieldFormat.parsedFormat, jsChangeRecorder);
if (fl == null)
return null;
scriptable = (AbstractRuntimeField<? extends IFieldComponent>) fl.getScriptObject();
} else {
RuntimeDataField so;
scriptable = so = new RuntimeDataField(jsChangeRecorder, application);
fl = application.getItemFactory().createDataField(so, getWebID(form, field));
so.setComponent(fl, field);
}
}
if (fl instanceof ISupportAsyncLoading) {
((ISupportAsyncLoading) fl).setAsyncLoadingEnabled(!printing);
}
fl.setSelectOnEnter(field.getSelectOnEnter());
fl.setEditable(field.getEditable());
try {
int halign = field.getHorizontalAlignment();
if (halign != -1) {
fl.setHorizontalAlignment(halign);
} else if (style_halign != -1) {
fl.setHorizontalAlignment(style_halign);
}
} catch (RuntimeException e) {
// just ignore...Debug.error(e);
}
fl.setToolTipText(application.getI18NMessageIfPrefixed(field.getToolTipText()));
fl.setTitleText(application.getI18NMessageIfPrefixed(field.getText()));
fl.setDataProviderID(dp == null ? field.getDataProviderID() : dp.getDataProviderID());
if (field.getDataProviderID() != null && dataProviderLookup != null) {
if (scriptable instanceof IFormatScriptComponent) {
((IFormatScriptComponent) scriptable).setComponentFormat(fieldFormat);
}
if (dp != null) {
// if (valuelist != null && valuelist.getValueListType() != ValueList.CUSTOM_VALUES) type = valuelist.getDisplayValueType();
int l = dp.getLength();
int defaultType = Column.mapToDefaultType(fieldFormat.dpType);
boolean skipMaxLength = false;
if (valuelist != null) {
// if the display values are different than the real values, then maxlength should be skipped
IValueList vl = getRealValueList(application, valuelist, true, fieldFormat.dpType, fieldFormat.parsedFormat, dp.getDataProviderID());
skipMaxLength = vl.hasRealValues();
}
if (l > 0 && (defaultType == IColumnTypes.TEXT || defaultType == IColumnTypes.MEDIA) && !skipMaxLength) {
fl.setMaxLength(l);
}
}
}
// fl.setOpaque(!field.getTransparent());
if (field.getDisplaysTags()) {
fl.setNeedEntireState(true);
if (field.getDataProviderID() == null && field.getText() != null && fl instanceof IDisplayTagText) {
((IDisplayTagText) fl).setTagText(field.getText());
}
}
if (// el is an ActionListener
el != null) {
fl.addScriptExecuter(el);
Object[] cmds = combineMethodsToCommands(form, form.getOnElementFocusGainedMethodID(), "onElementFocusGainedMethodID", field, field.getOnFocusGainedMethodID(), "onFocusGainedMethodID");
if (cmds != null)
fl.setEnterCmds((String[]) cmds[0], (Object[][]) cmds[1]);
cmds = combineMethodsToCommands(form, form.getOnElementFocusLostMethodID(), "onElementFocusLostMethodID", field, field.getOnFocusLostMethodID(), "onFocusLostMethodID");
if (cmds != null)
fl.setLeaveCmds((String[]) cmds[0], (Object[][]) cmds[1]);
if (field.getOnActionMethodID() > 0)
fl.setActionCmd(Integer.toString(field.getOnActionMethodID()), Utils.parseJSExpressions(field.getFlattenedMethodArguments("onActionMethodID")));
if (field.getOnDataChangeMethodID() > 0)
fl.setChangeCmd(Integer.toString(field.getOnDataChangeMethodID()), Utils.parseJSExpressions(field.getFlattenedMethodArguments("onDataChangeMethodID")));
if (field.getOnRightClickMethodID() > 0)
fl.setRightClickCommand(Integer.toString(field.getOnRightClickMethodID()), Utils.parseJSExpressions(field.getFlattenedMethodArguments("onRightClickMethodID")));
}
int onRenderMethodID = field.getOnRenderMethodID();
AbstractBase onRenderPersist = field;
if (onRenderMethodID <= 0) {
onRenderMethodID = form.getOnRenderMethodID();
onRenderPersist = form;
}
if (onRenderMethodID > 0) {
RenderEventExecutor renderEventExecutor = scriptable.getRenderEventExecutor();
renderEventExecutor.setRenderCallback(Integer.toString(onRenderMethodID), Utils.parseJSExpressions(onRenderPersist.getFlattenedMethodArguments("onRenderMethodID")));
IForm rendererForm = application.getFormManager().getForm(form.getName());
IScriptExecuter rendererScriptExecuter = rendererForm instanceof FormController ? ((FormController) rendererForm).getScriptExecuter() : null;
renderEventExecutor.setRenderScriptExecuter(rendererScriptExecuter);
}
applyBasicComponentProperties(application, fl, field, styleInfo);
if (fl instanceof INullableAware) {
INullableAware nullAware = (INullableAware) fl;
boolean allowNull = true;
// become 0 (because it is unchecked) so that the user does not need to check/uncheck it for save
try {
if (dataProviderLookup != null && dataProviderLookup.getTable() != null && field.getDataProviderID() != null) {
String dataproviderId = dp == null ? field.getDataProviderID() : dp.getDataProviderID();
if (dataProviderLookup.getTable().getColumn(dataproviderId) != null) {
allowNull = dataProviderLookup.getTable().getColumn(dataproviderId).getAllowNull();
}
}
} catch (RepositoryException e) {
// maybe this field is not linked to a table column... so leave it true
}
nullAware.setAllowNull(allowNull);
}
Insets m = field.getMargin();
if (m == null)
m = style_margin;
if (m != null) {
fl.setMargin(m);
if (fl instanceof IMarginAwareBorder) {
if (field.getBorderType() != null || hasBorder) {
Border b = fl.getBorder();
if (b != null) {
fl.setBorder(BorderFactory.createCompoundBorder(b, BorderFactory.createEmptyBorder(m.top, m.left, m.bottom, m.right)));
}
}
}
}
if (fl.getScriptObject() instanceof HasRuntimePlaceholder) {
((HasRuntimePlaceholder) fl.getScriptObject()).setPlaceholderText(field.getPlaceholderText());
}
return fl;
}
Aggregations