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
018/**
019 * JavaScript のツリー階層を持ったテーブル表示を行う、ツリーテーブル表示クラスです。
020 *
021 * AbstractViewForm により、setter/getterメソッドのデフォルト実装を提供しています。
022 * 各HTMLのタグに必要な setter/getterメソッドのみ,追加定義しています。
023 *
024 * AbstractViewForm を継承している為,ロケールに応じたラベルを出力させる事が出来ます。
025 *
026 * @og.group 画面表示
027 *
028 * @version  4.0
029 * @author   Kazuhiko Hasegawa
030 * @since    JDK5.0,
031 */
032public class ViewForm_HTMLTreeBOM extends ViewForm_HTMLTable  {
033        /** このプログラムのVERSION文字列を設定します。   {@value} */
034        private static final String VERSION = "6.4.5.0 (2016/04/08)" ;
035
036        public static final String COLUMN_LEVEL_KEY = "COLUMN_LEVEL";
037
038        // 6.4.4.1 (2016/03/18) static final 定数化にします。
039        private static final String FUTTER = "initializeDocument()" + CR + "//-->" + CR + "</script>" + CR + "</table>" + CR ;
040
041        // 6.4.4.1 (2016/03/18) static final 定数化にします。
042        private static final String HEADER = "<table border=\"0\" cellspacing=\"2\" cellpadding=\"0\"  summary=\"bomTable\" id=\"viewTable\">"
043                                                                                + CR + "<script type=\"text/javascript\">" + CR + "<!--" + CR + "aux0 = gFld('" ;
044
045        /**
046         * デフォルトコンストラクター
047         *
048         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
049         */
050        public ViewForm_HTMLTreeBOM() { super(); }              // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
051
052        /**
053         * DBTableModel から HTML文字列を作成して返します。
054         * startNo(表示開始位置)から、pageSize(表示件数)までのView文字列を作成します。
055         * 表示残りデータが pageSize 以下の場合は,残りのデータをすべて出力します。
056         *
057         * @og.rev 3.5.2.1 (2003/10/27) JavaScript 内のダブルコーテーションをシングルコーテーションに変更する。
058         * @og.rev 3.9.0.1 (2007/12/18) DBクラスを出力する。
059         * @og.rev 6.4.4.1 (2016/03/18) FUTTER を、static final 定数化にします。
060         * @og.rev 6.4.5.0 (2016/04/08) メソッド変更( getColumnDbType(int) → getClassName(int) )
061         *
062         * @param  stNo     表示開始位置
063         * @param  pgSize   表示件数
064         *
065         * @return  DBTableModelから作成された HTML文字列
066         * @og.rtnNotNull
067         */
068        @Override
069        public String create( final int stNo, final int pgSize )  {
070                // このクラスでは、テーブル全データを使用します。
071                if( getRowCount() == 0 ) { return ""; } // 暫定処置
072
073                final int startNo = 0;
074                final int pageSize = getRowCount();
075
076                final int lastNo = getLastNo( startNo, pageSize );
077
078                final StringBuilder out = new StringBuilder( BUFFER_LARGE ).append( getHeader() );
079
080                int level;
081                final int clmCnt = getColumnCount();    // 3.5.5.7 (2004/05/10)
082                for( int row=startNo; row<lastNo; row++ ) {
083                        // カラム==0は、レベルを指定する。
084                        level = Integer.parseInt( getValueLabel(row,0) );
085                        // 6.3.9.0 (2015/11/06) Found 'DD'-anomaly for variable(PMD)
086                        final boolean isFld = row+1<lastNo && level < Integer.parseInt( getValueLabel(row+1,0) );
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                                                .append( getClassName(column) )                 // 6.4.5.0 (2016/04/08)
094                                                .append("\"> ")
095                                                .append( getValueLabel(row,column) )
096                                                .append("</td>");
097                                }
098                        }
099                        out.append( "', '', 'gold')" );
100                        if( level != 0 ) {
101                                out.append( ')' );              // 6.0.2.5 (2014/10/31) char を append する。
102                        }
103                        out.append( CR );
104                }
105                out.append( FUTTER );                   // 6.4.4.1 (2016/03/18)
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         * @og.rev 6.4.4.1 (2016/03/18) HEADER を、static final 定数化にします。
118         *
119         * @return  テーブルのヘッダータグ文字列
120         * @og.rtnNotNull
121         */
122        @Override
123        protected String getHeader() {
124                // 6.4.4.1 (2016/03/18) HEADER を、static final 定数化にします。
125                final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE ).append( HEADER );
126
127                // カラム==0は、レベルを指定するので表示しない。
128                final int clmCnt = getColumnCount();    // 3.5.5.7 (2004/05/10)
129                for( int column=1; column<clmCnt; column++ ) {
130                        if( isColumnDisplay( column ) ) {
131                                buf.append( "<th>" ).append( getColumnLabel(column) ).append( "</th>" );
132                        }
133                }
134                buf.append( "', '', 'gold')" ).append( CR );
135
136                return buf.toString();
137        }
138
139        /**
140         * 行のレベルに応じた JavaScript関数のヘッダー部分を返します。
141         *
142         * @og.rev 3.5.2.1 (2003/10/27) JavaScript 内のダブルコーテーションをシングルコーテーションに変更する。
143         *
144         * @param       lvl             ツリーのレベル
145         * @param       isFld   フォルダかどうか[true:フォルダ/false:最下層]
146         *
147         * @return      JavaScript関数のヘッダー部分
148         * @og.rtnNotNull
149         */
150        private String getLevelScript( final int lvl,final boolean isFld ) {
151
152                final String auxX = "\taux" + ( lvl );
153                final String auxY = "aux" + ( lvl-1 );
154
155                final String rtn ;
156                if( isFld ) {
157                        rtn = auxX + " = insFld(" + auxY + ", gFld('";
158                }
159                else {
160                        rtn = "\tinsFld(" + auxY + ", gLnk('CONTENTS','";
161                }
162
163                return rtn;
164        }
165}