cssgwtuibinder

Ui:style or css class in GWT/UiBinder


What is more preferable to use <ui:style> or write class in css file for HTML elements (for GWT Widgets) in GWT ui.xml file. I know that if to use <ui:style> so the class attribute has very difficult name. Help me please find out when to use <ui:style>

<ui:style>
   .panel {
        width: 100%;
   }
   .decPanel {
        height:100%;
   }
</ui:style>

<g:HTMLPanel addStyleNames='{style.panel}'>
    <fieldset addStyleNames='{style.decPanel}'>
        <legend>
            ...
        </legend>
    </fieldset>
</g:HTMLPanel>

and when to use class

CSS file

   .panel {
        width: 100%;
   }
   .decPanel {
        height:100%;
   }

ui.xml file

<g:HTMLPanel class="panel">
   <fieldset class="decPanel">
        <legend>
            ...
        </legend>
   </fieldset>
</g:HTMLPanel>

Solution

  • It might help you to understand the advantage of using <ui:style> over constant static class name.

    Hello Stylish World

    With the <ui:style> element, you can define the CSS for your UI right where you need it.

    Sample:

    <ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'>
    
        <ui:style>
          .pretty { background-color: Skyblue; }
        </ui:style>
    
        <div class='{style.pretty}'>
          Hello, <span ui:field='nameSpan'/>.
        </div>
    
    </ui:UiBinder>
    

    Advantage


    Note: Most real world projects will probably keep their CSS in a separate file. In the example given below, the src values are relative to the location of the ui.xml file.

    Sample

      <ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'>
        <ui:style src="MyUi.css" />
        <ui:style field='otherStyle' src="MyUiOtherStyle.css">
    
        <div class='{style.pretty}'>
          Hello, <span class='{otherStyle.pretty}' ui:field='nameSpan'/>.
        </div>
      </ui:UiBinder>
    

    Prefer <span class='{otherStyle.pretty}' instead of <span class='pretty'.

    ======================

    EDIT

    As per suggestion by @Thomas in comments, prefer to use <ui:with>

    Sometimes your template will need to work with styles or other objects that come from outside of your template. Use the <ui:with> element to make them available.

    <ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
        xmlns:g='urn:import:com.google.gwt.user.client.ui'>
    
      <ui:with field='res' type='com.my.app.widgets.logoname.Resources'/>
    
      <g:HTMLPanel>
    
        <g:Image resource='{res.logo}'/>
    
        <div class='{res.style.mainBlock}'>
          <div class='{res.style.userPictureSprite}'/>
    
          <div>
            Well hello there
            <span class='{res.style.nameSpan}' ui:field='nameSpan'/>
          </div>
        </div>
    
      </g:HTMLPanel>
    </ui:UiBinder>
    
    /**
     * Resources used by the entire application.
     */
    public interface Resources extends ClientBundle {
      @Source("Style.css")
      Style style();
    
      @Source("Logo.jpg")
      ImageResource logo();
    
      public interface Style extends CssResource {
        String mainBlock();
        String nameSpan();
        Sprite userPictureSprite();
      }
    }
    // Within the owner class for the UiBinder template
    @UiField Resources res;
    
    ...
    
    res.style().ensureInjected();
    

    Refer GWT documentation on Using an external resource