001/*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016package org.opengion.plugin.view;
017
018import org.opengion.hayabusa.common.HybsSystem;
019
020/**
021 * JavaScript のツリー階層を持ったテーブル表示を行う、ツリーテーブル表示クラスです。
022 *
023 * AbstractViewForm により、setter/getterメソッドのデフォルト実装を提供しています。
024 * 各HTMLのタグに必要な setter/getterメソッドのみ,追加定義しています。
025 *
026 * AbstractViewForm を継承している為,ロケールに応じたラベルを出力させる事が出来ます。
027 *
028 * @og.group 画面表示
029 *
030 * @version  4.0
031 * @author   Kazuhiko Hasegawa
032 * @since    JDK5.0,
033 */
034public class ViewForm_HTMLTreeBOM extends ViewForm_HTMLTable  {
035        //* このプログラムのVERSION文字列を設定します。   {@value} */
036        private static final String VERSION = "4.0.0.0 (2005/08/31)" ;
037
038        public static final String COLUMN_LEVEL_KEY = "COLUMN_LEVEL";
039
040        // 4.3.4.4 (2009/01/01)
041//      /**
042//       * デフォルトコンストラクター
043//       *
044//       */
045//      public ViewForm_HTMLTreeBOM() {
046//              super();
047//      }
048
049        /**
050         * DBTableModel から HTML文字列を作成して返します。
051         * startNo(表示開始位置)から、pageSize(表示件数)までのView文字列を作成します。
052         * 表示残りデータが pageSize 以下の場合は,残りのデータをすべて出力します。
053         *
054         * @og.rev 3.5.2.1 (2003/10/27) JavaScript 内のダブルコーテーションをシングルコーテーションに変更する。
055         * @og.rev 3.9.0.1 (2007/12/18) DBクラスを出力する。
056         *
057         * @param  stNo     表示開始位置
058         * @param  pgSize   表示件数
059         *
060         * @return  DBTableModelから作成された HTML文字列
061         */
062        @Override
063        public String create( final int stNo, final int pgSize )  {
064                // このクラスでは、テーブル全データを使用します。
065                if( getRowCount() == 0 ) { return ""; } // 暫定処置
066
067                int startNo = 0;
068                int pageSize = getRowCount();
069
070                int lastNo = getLastNo( startNo, pageSize );
071
072                StringBuilder out = new StringBuilder( HybsSystem.BUFFER_LARGE );
073
074                out.append( getHeader() );
075
076                int level;
077                boolean isFld;
078                int clmCnt = getColumnCount();  // 3.5.5.7 (2004/05/10)
079                for( int row=startNo; row<lastNo; row++ ) {
080                        // カラム==0は、レベルを指定する。
081                        level = Integer.parseInt( getValueLabel(row,0) );
082                        isFld = false;
083                        if( row+1<lastNo ) {
084                                int nextLevel = Integer.parseInt( getValueLabel(row+1,0) );
085                                isFld = ( level < nextLevel ) ? true : false ;
086                        }
087                        out.append( getLevelScript( level,isFld ) );
088
089                        // カラム==0は、レベルを指定するので表示しない。
090                        for(int column = 1; column < clmCnt; column++) {
091                                if( isColumnDisplay( column ) ) {
092                                        out.append("<td class=\""); // 3.9.0.1 (2007/12/18)
093                                        out.append( getColumnDbType(column) );
094                                        out.append("\"> ");
095                                        out.append( getValueLabel(row,column) );
096                                        out.append("</td>");
097                                }
098                        }
099                        out.append( "', '', 'gold')" );
100                        if( level != 0 ) {
101                                out.append( ")" );
102                        }
103                        out.append( HybsSystem.CR );
104                }
105                out.append( getFutter() );
106
107                return out.toString();
108        }
109
110        /**
111         * DBTableModel から テーブルのヘッダータグ文字列を作成して返します。
112         * JavaScript の TreeBody では、JavaScriptに関連する定義もこのヘッダーに
113         * 含めます。
114         *
115         * @og.rev 3.5.2.1 (2003/10/27) JavaScript 内のダブルコーテーションをシングルコーテーションに変更する。
116         * @og.rev 3.9.0.1 (2007/12/18) 文字サイズ変更スクリプト対応のため、id="viewTable"を出力
117         *
118         * @return  テーブルのヘッダータグ文字列
119         */
120        @Override
121        protected String getHeader() {
122                StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
123
124                buf.append("<table border=\"0\" cellspacing=\"2\" cellpadding=\"0\"  summary=\"bomTable\" id=\"viewTable\">"); // 3.9.0.1 (2007/12/18)
125                buf.append( HybsSystem.CR );
126                buf.append("<script type=\"text/javascript\">");
127                buf.append( HybsSystem.CR );
128                buf.append("<!--");
129                buf.append( HybsSystem.CR );
130                buf.append("aux0 = gFld('");
131                // カラム==0は、レベルを指定するので表示しない。
132                int clmCnt = getColumnCount();  // 3.5.5.7 (2004/05/10)
133                for(int column = 1; column < clmCnt; column++) {
134                        if( isColumnDisplay( column ) ) {
135                                buf.append("<th>");
136                                buf.append( getColumnLabel(column) );
137                                buf.append("</th>");
138                        }
139                }
140                buf.append("', '', 'gold')");
141                buf.append( HybsSystem.CR );
142
143                return buf.toString();
144        }
145
146        /**
147         * DBTableModel から テーブルのフッタータグ文字列を作成して返します。
148         * JavaScript の TreeBody では、JavaScriptに関連する定義もこのフッターに
149         * 含めます。
150         *
151         * @return  テーブルのフッタータグ文字列
152         */
153        protected String getFutter() {
154                StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
155
156                buf.append("initializeDocument()").append( HybsSystem.CR );
157                buf.append("//-->").append( HybsSystem.CR );
158                buf.append("</script>").append( HybsSystem.CR );
159                buf.append("</table>").append( HybsSystem.CR );
160
161                return buf.toString();
162        }
163
164        /**
165         * 行のレベルに応じた JavaScript関数のヘッダー部分を返します。
166         *
167         * @og.rev 3.5.2.1 (2003/10/27) JavaScript 内のダブルコーテーションをシングルコーテーションに変更する。
168         *
169         * @param       lvl             ツリーのレベル
170         * @param       isFld   フォルダかどうか[true:フォルダ/false:最下層]
171         *
172         * @return      JavaScript関数のヘッダー部分
173         */
174        private String getLevelScript( final int lvl,final boolean isFld ) {
175
176                String auxX = "\taux" + ( lvl );
177                String auxY = "aux" + ( lvl-1 );
178
179                final String rtn ;
180                if( isFld ) {
181                        rtn = auxX + " = insFld(" + auxY + ", gFld('";
182                }
183                else {
184                        rtn = "\tinsFld(" + auxY + ", gLnk('CONTENTS','";
185                }
186
187                return rtn;
188        }
189}