Настройка GWT CssResource - PullRequest
       14

Настройка GWT CssResource

1 голос
/ 05 апреля 2010

Я пишу виджет GWT, используя UIBinder и MVP. Стили виджета по умолчанию определены в TheWidgetView.ui.xml :

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

Интерфейс CssResource виджета определен в 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
}

Я бы хотел, чтобы потребитель этого виджета мог настраивать часть стилей виджета и иметь это в своих MyExample.ui.xml :

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

И это будет их MyExample.java :

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

Есть ли способ, что мой виджет может иметь стили по умолчанию, но потребитель виджета может переопределить один из них? Когда интерфейс расширяет TheWidgetView.MyStyle, потребителю виджета необходимо определить все стили, перечисленные в этом родительском интерфейсе. Я видел, что в некоторых библиотеках виджетов конструктор виджета принимает параметр ClientBundle в качестве параметра, который, я полагаю, может применяться к CssResource. Хотя я не уверен, как передать этот объект стиля в конструктор, вызванный UIBinder.

Большое спасибо заранее!

1 Ответ

0 голосов
/ 15 ноября 2011

Я играю с чем-то похожим, чтобы сделать мое приложение доступным для скинов.Я бы начал с просмотра исходного кода любого из виджетов ячеек.Кажется, они принимают ресурсы как конструктор, однако у них также есть конструкторы, которые используют GWT.create (Resources.class) для создания ресурсов, если они не предоставлены.Что касается вашего вопроса об использовании этого шаблона для UIBinder, есть 3 варианта, упомянутых здесь .Однако при попытке определить стиль внутри UIBinder могут возникнуть проблемы с курицей и яйцом.

Проблема, с которой вы сталкиваетесь с другим кодом, заключается в том, что ваши две разные реализации стиля, потому что uibinder создает свой собственныйпакет ресурсов, который не ссылается на родительский css.Существует 3 решения:

1) Вырежьте CSS из файла подшивки пользовательского интерфейса в его собственный файл и используйте пользовательский интерфейс: вместе с предоставленным полем или пользовательским каталогом, чтобы внедрить стиль, используя свой собственный ресурсный переплет, где выможет объединять источники (т.е. @Source ({DEFAULT_CSS, "myCss.css"})).

2) Другой вариант - посмотреть на сгенерированный код и использовать синтаксис, который они используют для ссылки на css.однако в файле uibinder есть 2 проблемы, которые вам придется преодолеть: проблема с курицей и яйцом, а также тот факт, что Google может изменить это, не сказав вам и не сломав ваши вещи.Вот пример сгенерированного клиентского пакета из одного из моих файлов:

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

3) Последнее решение заключается в использовании отложенной привязки для замены стиля по умолчанию.

<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>
...