如何自定义使用ThemeBuilder生成的主题的CSS?

时间:2014-08-29 17:15:28

标签: css3 gwt extjs gxt

我已经使用ThemeBuilder创建了一个主题,但现在我需要在CSS类中添加一个属性,所以我可以在ListView的选定元素中使用不同的字体颜色。例如。

理想情况下,我希望构建器支持在.theme文件中指定这样的配置,特别是因为字体颜色不会影响用于支持旧浏览器的图像生成过程。实际上,构建器应该支持所有不会影响生成的图像的标准CSS3属性。

显然可以修改ThemeBuilder jar来实现这一点,但这不是一个好主意。

我查看了生成的外观类,我的第一次尝试是使用以下构造函数:

public Css3ContentPanelAppearance(Css3ContentPanelResources resources) {
    this(resources, GWT.<Css3ContentPanelTemplate> create(Css3ContentPanelTemplate.class));
}

这不能很好地工作,因为无论使用哪个Css3ContentPanelResources,所有使用Css3ContentPanelAppearance的组件都会受到影响。我相信这是因为CSS类名基于外观类名和CssResource类名。

1 个答案:

答案 0 :(得分:1)

解决方案非常简单:创建生成的外观类的子类,如下所示:

public class CustomCss3ListViewAppearance extends Css3ListViewAppearance {
    public interface CustomCss3ListViewResources extends Css3ListViewAppearance.Css3ListViewResources {
        // Load the original resources first and then the custom one, so the customizations will take precedence.
        @ClientBundle.Source({"com/example/client/base/listview/Css3ListView.css","CustomCss3ListView.css"})
        @Override
        Css3ListViewAppearance.Css3ListViewStyle css();
    }
    public CustomCss3ListViewAppearance() {
        super(GWT.<Css3ListViewAppearance.Css3ListViewResources>create(CustomCss3ListViewResources.class));
    }
}

然后,您可以创建一个独立的JAR模块,该模块依赖于生成的主题,在.gwt.xml文件中指定一些绑定,它的行为与纯生成的主题完全相同(只需要添加一个依赖项并将其导入应用程序.gwt.xml文件):

<?xml version="1.0" encoding="UTF-8"?>
<module rename-to='myCustomTheme'>
    <inherits name="com.example.Theme"/>

    <replace-with class="com.example.client.base.listview.CustomCss3ListViewAppearance">
        <when-type-is class="com.sencha.gxt.widget.core.client.ListView.ListViewAppearance" />
        <when-property-is name="gxt.theme" value="myTheme" />
    </replace-with>

    <source path="myCustomTheme/client"/>

</module>