Pregunta

Estoy escribiendo un widget de GWT usando UiBinder y MVP. estilos por defecto del widget se definen en TheWidgetView.ui.xml

<ui:style type="com.widgetlib.spinner.display.TheWidgetView.MyStyle">
    .textbox {
        border: 1px solid #red;
    }
    .important {
        font-weight: bold;
    }
</ui:style>

interfaz CssResource del widget se define en TheWidgetView.java :

public class TheWidgetView extends HorizontalPanel implements TheWidgetPresenter.Display {
    // ... some code
    @UiField MyStyle style;
    public interface MyStyle extends CssResource {
        String textbox();
        String important();
    }
    // ... more code
}

Me gustaría que el consumidor de este widget para poder personalizar parte de estilos del widget y tener esto en su MyExample.ui.xml

<ui:style type="com.consumer.MyExample.MyStyle">
    .textbox {
        border: 2px solid #black;
    }
</ui:style>

Y esta será su MyExample.java

public class MyExample extends Composite {
    // ... some code
    @UiField MyStyle style;
    interface MyStyle extends TheWidgetView.MyStyle{
        String textbox();
    }
    // ... more code
}

¿Hay alguna manera de que mi aparato puede tener estilos por defecto, pero que el consumidor del widget puede anular una de ellas? Cuando una interfaz se extiende TheWidgetView.MyStyle, el de las necesidades de los consumidores de widgets para definir todos los estilos enumerados en esa interfaz padres. He visto algunas bibliotecas de widgets tienen toma constructor del widget en un ClientBundle como parámetro, que supongo que se podría aplicar a CssResource. Aunque, no estoy seguro de cómo me lo pase en este objeto de estilo en un constructor invocado por UiBinder.

Gracias de antemano!

¿Fue útil?

Solución

He jugar con algo similar para hacer mi solicitud skinable. Me gustaría empezar por mirar el código fuente de cualquiera de los widgets de celulares. Ellos parecen tener los recursos como constructor, sin embargo, también tienen constructores que utilizan GWT.create (Resources.class) para crear los recursos si no se proporcionan. En cuanto a su pregunta sobre el uso de esta plantilla para UiBinder, hay 3 opciones mencionadas aquí . Sin embargo es posible que encuentre el pollo y las cuestiones de huevo cuando se trata de definir el estilo en el interior del UiBinder.

La cuestión está ejecutando en con su otro código es que sus 2 implementaciones diferentes del estilo porque UiBinder crea su propio paquete de recursos, que no hace referencia a css de los padres. Hay 3 soluciones:

1) Cortar el css del archivo de cuaderno ui en su propio archivo y utilizar la interfaz de usuario: con el combinado ya sea con un campo proporcionado o uifactory para inyectar el estilo utilizando su propio bindle de recursos donde se puede agravar las fuentes (es decir @Source ({DEFAULT_CSS, "myCss.css"})).

2) Su otra opción es buscar en el código generado y el uso de la sintaxis que están utilizando para refernce el css dentro del archivo UiBinder, sin embargo hay 2 temas que se tienen que superar: el pollo y el problema del huevo y la hecho de que Google puede cambiar esto sin que le dice y romper sus cosas. Este es un ejemplo del paquete de cliente generado a partir de una de mis archivos:

@Source("uibinder:com.foo.gwt.client.workspace.select.SelectWorkspaceViewImpl_SelectWorkspaceViewImplUiBinderImpl_GenCss_style.css")
SelectWorkspaceViewImpl_SelectWorkspaceViewImplUiBinderImpl_GenCss_style style();

3) La última solución es utilizar la vinculación diferida para reemplazar el estilo por defecto.

<replace-with class="com.foo.gwt.laf.mpe.resource.CellTableResources">
    <when-type-is class="com.google.gwt.user.cellview.client.CellTable.Resources" />
    <when-property-is name="laf" value="MPE" />
</replace-with>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top