S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

Myfaces/Trinidadのスタイル(スキン)

MyFaces 1.2.3/Trinidad 1.2.9
Trinidadでスタイル(CSS)を適用する場合は、Trinidadのスキンの定義を理解し、スキンとして定義しなければ、意図しないスタイルが適用される場合がある。


Trinidadのスキンは、trinidad-config.xmlとtrinidad-skins.xmlに定義する。
デフォルトのスキンを使用した場合には、
trinidad-impl-1.2.9.jar!/META-INF/adf/styles/*.xss
のファイルの定義が使用される。
Trinidadのコンポーネントでは、それぞれ個別のスタイルが定義されるが、スキンに設定されたスタイルが適用される。
コンポーネントタグのstyleClass属性で、任意のスタイルを指定すれば、意図したスタイルで表示される。
しかし、意図したスタイルとは異なったスタイルで表示されてしまう場合がある。
具体的には、tr:commandLinkタグでは、クリックした直後スキン(:visited?)のスタイルが適用されてしまい、文字の大きさが変わってしまう。(デフォルトのスキンのスタイルで文字の大きさを指定しているため)


このスキンのスタイルの定義ファイルは、
org.apache.myfaces.trinidadinternal.style.cache.FileSystemStyleCache#getStyleSheetURI
により、生成され、
org.apache.myfaces.trinidad.webapp.ResourceServlet
により、ブラウザに送信される。
一度生成されたスキンは、一時ファイルとしてキャッシュされる(Tomcatであればwork/asf/styles/cachの下に生成される)。


今回の対応では、tr:commandLinkタグのクリック時のスタイルの適用以外は問題ないため、スキンの定義の見直しを行わず、tr:commandLinkタグのスキンの定義をスタイルとして生成しない、という方法を採用した。
この調査のため、tr:commandLinkタグで定義されているスタイルを、ソースで確認したところ"xi"と指定されていた。
これはTrinidadが圧縮した形であり、スキンの定義を確認するためには、サーブレットパラメータ(web.xmlのcontext-param要素)の
org.apache.myfaces.trinidad.DISABLE_CONTENT_COMPRESSION
をtrueとする必要がある。
この設定により確認した所、tr:commandLinkタグで定義されているスタイル"xi"は、スキンの定義の"OraLink"に相当することが判明した。
ここで、この"OraLink"("xi")のスタイルを生成しないようにするため、
org.apache.myfaces.trinidadinternal.style.util.CSSGenerationUtils#writeCSS
に以下のようなif文を追加し、"OraLink"("xi")のスタイルを生成する処理をスキップさせることで対処した。


本来は、"OraLink"("xi")のスタイルに相当するスキンの定義を変更することで対応すべきであり、
trinidad-impl-1.2.9.jar!/META-INF/adf/styles/base-desktop.xss
に記述された、"OraLink"の定義を削除したが有効にならなかったため断念した。(他のファイル(*.xss)のスタイルの定義もマージしている???)

【コメントは除去】

  public static void writeCSS(
    StyleContext        context,
    String              styleSheetName,
    StyleNode[]         styles,
    PrintWriter         out,
    boolean             compressStyles,
    Map<String, String> shortStyleClassMap,
    String[]            namespacePrefixArray,
    Map<String, String> afSelectorMap
    )
  {
    HashMap<String, StyleNode[]> matchingStylesMap =
      new HashMap<String, StyleNode[]>(101);

    String[] propertyStrings = new String[styles.length];

     int numberSelectorsWritten = 0;
     
    for (int i = 0; i < styles.length; i++)
    {
      StyleNode style = styles[i];


// 追加したif文
if ((style != null) && (style.getSelector() != null) && (style.getSelector().indexOf("OraLink:") > -1)) { 
	continue;
}


      if (style.getSelector() != null)
      {

      …