2010-04-05 3 views
1

UIBinder 및 MVP를 사용하여 GWT 위젯을 작성하고 있습니다.GWT CssResource 사용자 정의

위젯의 CssResource 인터페이스가 TheWidgetView.java에 정의되어

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

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

내가이의 소비자 싶습니다 위젯의 기본 스타일은 TheWidgetView.ui.xml에 정의되어 있습니다 위젯은 위젯 스타일의 일부를 사용자 정의하고 해당 항목을 가질 수 있습니다. 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 
} 

내 위젯이 기본 스타일을 가질 수 있지만, 위젯의 소비자가 그들 중 하나를 오버라이드 (override) 할 수있는 방법이 있나요? 인터페이스가 TheWidgetView.MyStyle을 확장하면 위젯 소비자는 해당 부모 인터페이스에 나열된 모든 스타일을 정의해야합니다. 위젯의 생성자에 매개 변수로 ClientBundle을 사용하는 일부 위젯 라이브러리를 보았습니다. CssResource에 적용 할 수 있습니다. UIBinder가 호출 한 생성자에서이 스타일 객체를 어떻게 전달할 지 확신 할 수 없지만.

미리 감사드립니다.

+0

누구나 CssResource '@eval'을 사용 했습니까? 그게 아마도 도움이 될까요? –

+0

http://code.google.com/p/google-web-toolkit/issues/detail?id=4420#c1 –

+0

UIBinder/MVP에 적용되지 않는 것 같습니다. http://googlewebtoolkit.blogspot.com/ 2008/12/gwt-no-need-to-shortchange-your-style.html –

답변

0

나는 내 응용 프로그램을 껍질을 벗기 쉽도록 만들기 위해 비슷한 것을 가지고 놀았습니다. 먼저 셀 위젯의 소스 코드를 살펴 보겠습니다. 그들은 생성자로 리소스를 사용하는 것처럼 보이지만 제공되지 않는 리소스를 생성하기 위해 GWT.create (Resources.class)를 사용하는 생성자도 있습니다. UIBinder에이 템플릿을 사용하는 것에 관한 질문에 대해서는 here이라는 3 가지 옵션이 있습니다. 그러나 UIBinder 내부에서 스타일을 정의하려고 할 때 닭고기와 달걀 문제가 발생할 수 있습니다.

당신이 다른 코드로 실행하는 문제는 스타일의 당신이 다른 구현 uibinder 그것이 부모의 CSS를 참조하지 않습니다 자신의 자원 번들의 생성 때문이다. 3 가지 해결책이 있습니다 :

1) Ui 바인더 파일에서 CSS를 찢어 내고 ui :를 사용하십시오. 제공되는 필드 또는 uifactory와 결합하면 자신 만의 리소스 바인드를 사용하여 스타일을 주입 할 수 있습니다. 소스 (즉, @Source ({DEFAULT_CSS, "myCss.css"})).

2) 다른 옵션은 생성 된 코드를보고 uibinder 파일 내에서 CSS를 참조하는 구문을 사용하는 것입니다. 그러나 당신이 극복해야 할 2 가지 문제가 있습니다 : 닭고기 및 계란 문제 사실 구글은 말도없이이를 변경하고 물건을 깰 수있다.

@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> 
관련 문제