    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.hayabusa.taglib;
    017
    018import org.opengion.hayabusa.common.HybsSystem;
    019import org.opengion.hayabusa.common.HybsSystemException;
    020
    021import static org.opengion.fukurou.util.StringUtil.nval ;
    022
    023import java.util.Map;
    024import java.util.HashMap;
    025
    026/**
    027 * viewタグの viewFormType が ImageTimeBar の場合にパラメータを設定します。
    028 *
    029 * キー、日時、状況コードを持つ稼働状況の表示を行う、ViewForm_ImageTimeBar クラスに対して、
    030 * 各種パラメータを設定します。
    031 * (パラメータを使用するには、viewタグのuseParam 属性をtrueに設定する必要があります。)
    032 *
    033 * SELECT文は、キー、日時、状況コードが、必須項目で、カラムの並び順は、完全に固定です。
    034 * よって、カラム位置を指定する必要はありませんが、SELECT文を自由に設定することも
    035 * 出来ませんので、ご注意ください。
    036 * この固定化に伴い、WRITABLE 指定も使用できません。（そもそも書き込み不可です）
    037 * それ以降のカラムについては、内部処理としては、使用していません。
    038 * ただし、パラメータで、カラー色指定、ラベル表記部、イメージ重ね合わせ、
    039 * ポップアップ表記、リンク表記に使えます。
    040 *
    041 * データの並び順(ORDER BY)も、キー、日時順にしてください。
    042 * データは、キー単位に１レコード作成されます。（キーブレイク）その間、日時順に
    043 * データを処理します。
    044 *
    045 * データの表示は、今のレコードの日時から、次のレコードの日時までを一つの状態と
    046 * して表します。今のレコードを表示するには、次のレコードが必要になります。
    047 * 画面表示は、表示開始日時(minStartTime) から 表示期間(timeSpan)分を表示します。
    048 * 通常、開始時刻は、表示開始時刻より前より始まり、次のレコードで、終了時刻が決定
    049 * されます。最後のデータは、期間満了まで続いていると仮定されます。
    050 * データが存在しないのであれば、「存在しないデータ」を作成してください。
    051 *
    052 * ImageTimeBar では、キーでまとめた値について、各状況コードをカラー化し、積み上げ
    053 * 帯グラフ形式でPNG画像化します。
    054 * この画像を、読み込む HTML を出力することで、画面上に、積み上げ帯グラフを表示します。
    055 * 状況コードに対応する色は、標準では自動作成ですが、外部から色文字列を与えることで
    056 * 自由に指定する事も可能です。
    057 *
    058 * ポップアップ表記(tipsClm)、リンク表記(linkClm)は、この画像に対するエリア指定タグを出力する事で実現します。
    059 * 画像ファイルは、全データに対して、１画像だけなので、サイズは大きくなりますが、１レコード
    060 * 単位に画像を作成しないため、レスポンスは向上します。
    061 * それぞれ、viewMarker , viewLink を利用することが可能です。特に、リンク表記(linkClm) については、
    062 * linkタグの hrefTarget 属性を true に設定することで適用できます。
    063 *
    064 * 画像ファイルは、java.io.File.createTempFile( File ) で作成するため、JavaVM(=Tomcat)が
    065 * 正常終了するときに、削除されます。異常終了時には残りますが、temp フォルダを定期的に
    066 * 整理すれば、それほど大量のファイルが残ることはないと思われます。
    067 *
    068 * データは、イベント発生時に作成されると仮定しています。つまり、書き込まれた日時から、
    069 * 状況コードに対応する状況が発生し、次の状況違いのレコードまで継続していると考えます。
    070 * よって、データを途中で切り出す場合、切り出す範囲の前の状態が必要になります。
    071 * 一番最初の状態は、"不明" として扱います。（空欄＝白色）
    072 *
    073 * <img src="doc-files/ViewTimeBarParamTag.png" alt="ViewTimeBarParamTag" >
    074 *
    075 * @og.formSample
    076 * ●形式：&lt;og:timeBarParam startDate="･･･" timeSpan="･･･" ･･･ /&gt;
    077 * ●body：なし
    078 *
    079 * ●Tag定義：
    080 *   &lt;og:timeBarParam
    081 *       startDate     ○【TAG】タイムテーブルの表示開始日時をセットします(必須)。
    082 *       timeSpan      ○【TAG】タイムテーブルの表示期間を時間で指定します(必須)。
    083 *       labelClms       【TAG】一覧表のラベル表示部に表示するカラムをCSV形式で指定します(初期値:キーのRenderer値)。
    084 *       colorClm        【TAG】レコードに付ける色を色文字列で指定する場合のカラム名を指定します(初期値:指定しない)。
    085 *       tipsClm         【TAG】レコード単位に、マウスオーバー時のTips表示を行うカラムを指定します(初期値:指定しない)。
    086 *       linkClm         【TAG】レコード単位に、クリッカブルリンクを設定するカラムを指定します(初期値:指定しない)。
    087 *       useLegend       【TAG】カラーの凡例を使用するかどうか[true/false]を指定します(初期値:{@og.value #USE_LEGEND})。
    088 *       maxLabelWidth   【TAG】ラベル表記部の最大サイズをpxで指定します(初期値:{@og.value #MAX_LABEL_WIDTH})。
    089 *       maxTimeWidth    【TAG】タイム表記部の最大サイズをpxで指定をpxで指定します(初期値:{@og.value #MAX_TIME_WIDTH})。
    090 *       chartHeight     【TAG】１行のタイムチャートの幅をpxで指定します(初期値:{@og.value #CHART_HEIGHT})。
    091 *       headerHeight    【TAG】チャートの凡例、ヘッダー部の高さ(指定されない場合は、チャートの間隔:chartHeight)(初期値:{@og.value #CHART_HEIGHT})。
    092 *       padding         【TAG】イメージ作成の 全体テーブルの隙間（パディング）をpxで指定します(初期値:{@og.value #CHART_PADDING})。
    093 *       margin          【TAG】１レコードの文字やタイムチャートのマージンをpxで指定します(初期値:{@og.value #RECODE_MARGIN})。
    094 *       useLastData     【TAG】行の最後の情報が、継続しているとして使うかどうか[true/false]を指定(初期値:{@og.value #USE_LAST_DATA})。
    095 *       headerUpFmt     【TAG】一覧表のヘッダー部分上段の日付フォーマット(初期値：未指定) 7.1.0.0 (2020/01/20)
    096 *       headerDwFmt     【TAG】一覧表のヘッダー部分下段の日付フォーマット(初期値：未指定) 7.1.0.0 (2020/01/20)
    097 *       debug           【TAG】内部情報を出力します(初期値:false)。
    098 *   /&gt;
    099 *
    100 * ●使用例
    101 *     ViewFormTag の viewFormType が、ImageTimeBar の場合に使用します。
    102 *     useParam 属性を設定しておかないと、使用されません。
    103 *     &lt;og:view
    104 *         viewFormType = "ImageTimeBar"
    105 *         command      = "{&#064;command}"
    106 *         <b>useParam     = "true"</b>
    107 *     &gt;
    108 *         &lt;og:timeBarParam
    109 *             startDate   = "{&#064;DYFROM}"
    110 *             timeSpan    = "24"
    111 *         /&gt;
    112 *     &lt;/og:view &gt;
    113 *
    114 * @og.group 画面表示
    115 * @og.rev 5.5.5.6 (2012/08/31) 新規追加
    116 *
    117 * @version  4.0
    118 * @author       Kazuhiko Hasegawa
    119 * @since    JDK5.0,
    120 */
    121public class ViewTimeBarParamTag extends ViewParamImpl {
    122        /** このプログラムのVERSION文字列を設定します。   {@value} */
    123        private static final String VERSION = "7.1.0.0 (2020/01/20)" ;
    124        private static final long serialVersionUID = 710020200120L ;
    125
    126        private static final String START_DATE          = null;         // タイムテーブルの表示開始日時をセットします(初期値:データの最小日時)。
    127        private static final String TIME_SPAN           = "24";         // タイムテーブルの表示期間を時間で指定します(初期値:{@og.value #TIME_SPAN})。
    128
    129        private static final String LABEL_CLMS          = null;         // 一覧表のラベル表示部に表示するカラムをCSV形式で指定します。
    130        private static final String COLOR_CLM           = null;         // レコードに付ける色を色文字列で指定する場合のカラム名を指定します。
    131        private static final String TIPS_CLM            = null;         // レコード単位に、マウスオーバー時のTips表示を行うカラム名を指定します。
    132        private static final String LINK_CLM            = null;         // レコード単位に、クリッカブルリンクを設定するカラム名を指定します。
    133
    134        private static final String USE_LEGEND          = "true";       // カラーの凡例を使用するかどうか[true/false]を指定します。
    135        private static final String MAX_LABEL_WIDTH     = null;         // ラベル表記部の最大サイズをpxで指定。何もなければ、可変長サイズ
    136        private static final String MAX_TIME_WIDTH      = "600";        // タイム表記部の最大サイズをpxで指定。
    137        private static final String CHART_HEIGHT        = "20";         // １レコードのチャートの間隔をpxで指定。実際の幅は、CHART_HEIGHT＋MARGIN＊２
    138        private static final String CHART_PADDING       = "5";          // イメージ作成の 全体テーブルの隙間
    139        private static final String RECODE_MARGIN       = "3";          // 各レコード、文字等の内部の間隔
    140        private static final String USE_LAST_DATA       = "true";       // 5.6.1.1 (2013/02/08) 行の最後の情報が、継続しているとして使うかどうか[true/false]を指定します。
    141
    142        /** パラメータの初期値設定 */
    143        /** staticイニシャライザ後、読み取り専用にするので、ConcurrentHashMap を使用しません。 */
    144        private static final Map<String,String> INIT_PARAM = new HashMap<>();
    145        static {
    146                INIT_PARAM.put( "START_DATE"            , START_DATE            );
    147                INIT_PARAM.put( "TIME_SPAN"                     , TIME_SPAN                     );
    148                INIT_PARAM.put( "LABEL_CLMS"            , LABEL_CLMS            );
    149                INIT_PARAM.put( "COLOR_CLM"                     , COLOR_CLM                     );
    150                INIT_PARAM.put( "TIPS_CLM"                      , TIPS_CLM                      );
    151                INIT_PARAM.put( "LINK_CLM"                      , LINK_CLM                      );
    152                INIT_PARAM.put( "USE_LEGEND"            , USE_LEGEND            );
    153                INIT_PARAM.put( "MAX_LABEL_WIDTH"       , MAX_LABEL_WIDTH       );
    154                INIT_PARAM.put( "MAX_TIME_WIDTH"        , MAX_TIME_WIDTH        );
    155                INIT_PARAM.put( "CHART_HEIGHT"          , CHART_HEIGHT          );
    156                INIT_PARAM.put( "CHART_PADDING"         , CHART_PADDING         );
    157                INIT_PARAM.put( "RECODE_MARGIN"         , RECODE_MARGIN         );
    158                INIT_PARAM.put( "USE_LAST_DATA"         , USE_LAST_DATA         );              // 5.6.1.1 (2013/02/08)
    159        //      INIT_PARAM.put( "TEMP_DIR"                      , null                          );              // 6.4.3.2 (2016/02/19) 使用するキーだが、null を設定しておく必要は無い。
    160        //      INIT_PARAM.put( "TEMP_URL"                      , null                          );              // 6.4.3.2 (2016/02/19) 使用するキーだが、null を設定しておく必要は無い。
    161        //      INIT_PARAM.put( "HEAD_UP_FMT"           , null                          );              // 7.1.0.0 (2020/01/20) 使用するキーだが、null を設定しておく必要は無い。
    162        //      INIT_PARAM.put( "HEAD_DW_FMT"           , null                          );              // 7.1.0.0 (2020/01/20) 使用するキーだが、null を設定しておく必要は無い。
    163        }
    164
    165        /**
    166         * デフォルトコンストラクター
    167         *
    168         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
    169         */
    170        public ViewTimeBarParamTag() { super(); }               // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    171
    172        /**
    173         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    174         *
    175         * @return      後続処理の指示
    176         */
    177        @Override
    178        public int doStartTag() {
    179                initParam( INIT_PARAM );
    180
    181                final String FILE_DIR           = HybsSystem.sys( "CHART_TEMP_DIR" );           // 画像ファイルの作成DIR
    182
    183                putParam( "TEMP_DIR" , HybsSystem.url2dir( FILE_DIR ) );
    184                putParam( "TEMP_URL" , getContextPath() + "/" + FILE_DIR );
    185
    186                return SKIP_BODY ;                              // Body を評価しない
    187        }
    188
    189        /**
    190         * 【TAG】タイムテーブルの表示開始日時をセットします(初期値:データの最小日時)。
    191         *
    192         * @og.tag
    193         * 表示開始日時を起点として、タイムテーブルを表示します。
    194         * 実際に画面に表示されるのは、開始時刻から終了時刻の範囲内だけですが、
    195         * 起点は、この日時になります。
    196         *
    197         * 指定方法として、フォーマットされた日付、時刻情報も設定可能です。（内部的に処理します）
    198         * また、処理後(例：20120824102823）１４ケタ以上の場合は、１４ケタにカットします。
    199         * ８ケタ以上の場合は、時刻 000000 を追加します。
    200         * それ以下の場合は、設定エラーとして、HybsSystemException を throw します。
    201         *
    202         * 表示開始日時が指定されない場合は、データの最小時刻を利用して表示します。
    203         * 初期値は、データの最小日時 です。
    204         *
    205         * @og.rev 6.9.7.0 (2018/05/14) 14桁 丁度のときに、エラーになるので、修正します。
    206         *
    207         * @param       startDate 表示開始日時
    208         */
    209        public void setStartDate( final String startDate ) {
    210                final String date = nval( getRequestParameter( startDate ),null );
    211                if( date != null ) {
    212                        final StringBuilder buf = new StringBuilder();                  // 最大、14桁のはず
    213                        for( int i=0; i<date.length(); i++ ) {
    214                                final char ch = date.charAt( i );
    215                                if( ch >= '0' && ch <= '9' ) { buf.append( ch ); }      // 記号(-,/,:,スペースなど)を取り除きます。
    216                        }
    217
    218                        if( buf.length() >= 8 ) {
    219                                buf.append( "000000" ).setLength( 14 );                         // 8 桁以上あれば、"000000" を追加して、14 桁に長さを設定します。
    220                                putParam( "START_DATE" , buf.toString() );
    221                        }
    222                        else {
    223                                final String errMsg = "日付データの設定エラーです。date=[" + startDate + "]" ;
    224                                throw new HybsSystemException( errMsg );
    225                        }
    226                }
    227                // 引数が null の場合は、START_DATE キーは、INIT_PARAM 登録済みなので、何もしなくて良い。
    228
    229//              // 6.9.7.0 (2018/05/14) 14桁 丁度のときに、エラーになるので、修正します。
    230//              String date = nval( getRequestParameter( startDate ),START_DATE );
    231//              if( date != null ) {
    232//                      if( date.indexOf( '-' ) >= 0 ) { date = date.replaceAll( "-","" ); }
    233//                      if( date.indexOf( '/' ) >= 0 ) { date = date.replaceAll( "/","" ); }
    234//                      if( date.indexOf( ':' ) >= 0 ) { date = date.replaceAll( ":","" ); }
    235//                      if( date.indexOf( ' ' ) >= 0 ) { date = date.replaceAll( " ","" ); }
    236//
    237//                      final int len = date.length();
    238//                      if( len > 14 ) { date = date.substring( 0,14 ); }       // ミリ秒まで指定されていると想定
    239//                      else if( len >= 8 && len < 14 ) { date = ( date + "000000" ).substring( 0,14 ) ; }      // 西暦からの日付は入っていると考えます。
    240//                      else {
    241//                              final String errMsg = "日付データの設定エラーです。date=[" + date + "]" ;
    242//                              throw new HybsSystemException( errMsg );
    243//                      }
    244//              }
    245//              putParam( "START_DATE" , date );
    246        }
    247
    248        /**
    249         * 【TAG】タイムテーブルの表示期間を時間で指定します(初期値:{@og.value #TIME_SPAN})。
    250         *
    251         * @og.tag
    252         * 表示開始日時から、どれだけの時間範囲を表示対象とするかを指定します。
    253         * 指定する単位は、時間です。
    254         * 小数点は指定できません。また、１０日なら、"240" 、１か月（３０日）なら、"720"
    255         * １年（３６５日）なら、"8760" を指定します。
    256         * 実際に画面に表示されるのは、開始時刻から終了時刻の範囲内だけです。
    257         * 初期値は、"{@og.value #TIME_SPAN}" です。
    258         *
    259         * @param       timeSpan 表示期間(時)
    260         */
    261        public void setTimeSpan( final String timeSpan ) {
    262                putParam( "TIME_SPAN" , nval( getRequestParameter( timeSpan ),TIME_SPAN ) );
    263        }
    264
    265        /**
    266         * 【TAG】一覧表のラベル表示部に表示するカラムをCSV形式で指定します(初期値:キーのRenderer値)。
    267         *
    268         * @og.tag
    269         * ラベル表示部に表示するカラムをCSV形式で指定します。
    270         * 指定されたカラムの値の、Renderer値を画面上に表示します。
    271         * ラベル表記部の最大サイズ（maxLblWidth）を指定しない場合は、ここで指定されたカラムの
    272         * 値のそれぞれの最大長を加算した値が、ラベル表記部の最大サイズ（maxLblWidth）になります。
    273         * 初期値は、キーのRenderer値 です。
    274         *
    275         * @param       labelClms ラベルカラム (CSV形式)
    276         */
    277        public void setLabelClms( final String labelClms ) {
    278                putParam( "LABEL_CLMS" , nval( getRequestParameter( labelClms ),LABEL_CLMS ) );
    279        }
    280
    281        /**
    282         * 【TAG】レコードに付ける色を色文字列で指定する場合のカラム名を指定します(初期値:指定しない)。
    283         *
    284         * @og.tag
    285         * レコード単位に、色を付ける場合、指定の色を付けたい場合に、外部から色文字列を与えることが可能です。
    286         * 色文字列は、java.awt.Color の フィールド定義されているコードと同じ文字列です。
    287         * また、#XXXXXX 形式の １６進文字列を与えることで、任意の色を指定可能です。
    288         * ※ 6.7.5.0 (2017/03/10) で、値の取得を、getValue から、getValueLabel に変更したため、
    289         * リソース変換が使用できます。columnEditor等で、renderer="DBMENU" が使用可能です。
    290         *
    291         * @og.rev 6.7.5.0 (2017/03/10) COLOR_CLM の値を、getValueLabel で取得するように変更。
    292         *
    293         * 初期値は、"指定しない" です。
    294         *
    295         * @param       colorClm 色指定カラム名
    296         */
    297        public void setColorClm( final String colorClm ) {
    298                putParam( "COLOR_CLM" , nval( getRequestParameter( colorClm ),COLOR_CLM ) );
    299        }
    300
    301        /**
    302         * 【TAG】レコード単位に、マウスオーバー時のTips表示を行うカラムを指定します(初期値:指定しない)。
    303         *
    304         * @og.tag
    305         * レコード単位に、画像にマウスオーバー時のツールチップ表示のためのデータを作成します。
    306         * HTMLのareaタグの alt 属性を出力します。
    307         *
    308         * 通常は、複数の文字列を使用しますので、viewMarker タグ等で整形してください。
    309         * 何も指定しない場合は、リンクがなければ、なにも出力しません。
    310         * 初期値は、"指定しない" です。
    311         *
    312         * @param       tipsClm Tips表示カラム名
    313         */
    314        public void setTipsClm( final String tipsClm ) {
    315                putParam( "TIPS_CLM" , nval( getRequestParameter( tipsClm ),TIPS_CLM ) );
    316        }
    317
    318        /**
    319         * 【TAG】レコード単位に、クリッカブルリンクを設定するカラムを指定します(初期値:指定しない)。
    320         *
    321         * @og.tag
    322         * レコード単位に、画像にクリッカブルリンクを設定するためのデータを作成します。
    323         * HTMLのareaタグ の href 属性を出力します。
    324         *
    325         * 通常は、viewLink タグ等でリンクを作成してください。
    326         * 何も指定しない場合は、Tipsがなければ、なにも出力しません。
    327         * 初期値は、"指定しない" です。
    328         *
    329         * @param       linkClm リンク設定カラム名
    330         */
    331        public void setLinkClm( final String linkClm ) {
    332                putParam( "LINK_CLM" , nval( getRequestParameter( linkClm ),LINK_CLM ) );
    333        }
    334
    335        /**
    336         * 【TAG】カラーの凡例を使用可否[true:する/false:しない]を指定します(初期値:{@og.value #USE_LEGEND})。
    337         *
    338         * @og.tag
    339         * 状況コード、または、色文字列等でグラフ作成した場合の色に対する凡例を使用するかどうかを指定します。
    340         * 凡例の表示位置は、グラフの上側で、１レコード分出力します。
    341         *
    342         * 初期値は、"{@og.value #USE_LEGEND}" です。
    343         *
    344         * @param       useLegend 凡例使用可否 [true:する/false:しない]
    345         */
    346        public void setUseLegend( final String useLegend ) {
    347                putParam( "USE_LEGEND" , nval( getRequestParameter( useLegend ),USE_LEGEND ) );
    348        }
    349
    350        /**
    351         * 【TAG】ラベル表記部の最大サイズをpxで指定します(初期値:{@og.value #MAX_LABEL_WIDTH})。
    352         *
    353         * @og.tag
    354         * 画像の１行は、ラベル表記部と、タイムチャート部に分かれます。
    355         * その、ラベル表記部の最大サイズを指定します。
    356         * 何も指定しなければ、可変長サイズ（ラベルの大きさに合わせた値）になります。
    357         * 単位は px です。（pxは記述不要です）
    358         * 初期値は、"{@og.value #MAX_LABEL_WIDTH}" です。
    359         *
    360         * @param       maxLblWidth ラベル最大幅 (px)
    361         */
    362        public void setMaxLabelWidth( final String maxLblWidth ) {
    363                putPxParam( "MAX_LABEL_WIDTH" , maxLblWidth , MAX_LABEL_WIDTH );
    364        }
    365
    366        /**
    367         * 【TAG】タイム表記部の最大サイズをpxで指定をpxで指定します(初期値:{@og.value #MAX_TIME_WIDTH})。
    368         *
    369         * @og.tag
    370         * 画像の１行は、ラベル表記部と、タイムチャート部に分かれます。
    371         * そのタイムチャート部の最大サイズを指定します。
    372         * この幅は、ここで指定した幅に固定されるため、時間範囲が多ければ、１時間当たりの表示幅が
    373         * 小さくなります。
    374         * たとえば、8H～20H=12H を 600px で表示すれば、１時間=５０px になりますし、24H 表示ならば、
    375         * 半分の ２５px 、6H ならば、倍の 100px が、１時間の表示幅になります。
    376         *
    377         * 単位は px です。（pxは記述不要です）
    378         * 初期値は、"{@og.value #MAX_TIME_WIDTH}" です。
    379         *
    380         * @param       maxTmWidth タイム最大幅(px)
    381         */
    382        public void setMaxTimeWidth( final String maxTmWidth ) {
    383                putPxParam( "MAX_TIME_WIDTH" , maxTmWidth , MAX_TIME_WIDTH );
    384        }
    385
    386        /**
    387         * 【TAG】１行のタイムチャートの幅をpxで指定します(初期値:{@og.value #CHART_HEIGHT})。
    388         *
    389         * @og.tag
    390         * 画像の１行の間隔は、上下のRECODE_MARGIN と、このチャート本体の幅になります（CHART_HEIGHT＋RECODE_MARGIN＊２）。
    391         * ここでは、チャート本体の幅を指定します。
    392         *
    393         * 単位は px です。（pxは記述不要です）
    394         * 初期値は、"{@og.value #CHART_HEIGHT}" です。
    395         *
    396         * @param       chartHeight タイムチャートの幅
    397         */
    398        public void setChartHeight( final String chartHeight ) {
    399                putPxParam( "CHART_HEIGHT" , chartHeight , CHART_HEIGHT );
    400        }
    401
    402        /**
    403         * 【TAG】チャートの凡例、ヘッダー部の高さをpxで指定します(初期値:{@og.value #CHART_HEIGHT})。
    404         *
    405         * @og.tag
    406         * 画像の１行の間隔は、上下のRECODE_MARGIN と、このチャート本体の幅になります（CHART_HEIGHT＋RECODE_MARGIN＊２）。
    407         * ここでは、チャートの凡例、ヘッダー部の高さを指定します。
    408         * 指定しない場合の初期値は、chartHeight の値を使用します。
    409         *
    410         * 単位は px です。（pxは記述不要です）
    411         * 初期値は、"{@og.value #CHART_HEIGHT}" です。
    412         *
    413         * @og.rev 6.4.7.0 (2016/06/03) 新規追加
    414         *
    415         * @param       headerHeight タイムチャートの幅
    416         */
    417        public void setHeaderHeight( final String headerHeight ) {
    418                putPxParam( "HEADER_HEIGHT" , headerHeight , CHART_HEIGHT );
    419        }
    420
    421        /**
    422         * 【TAG】イメージ作成のパディング (全体テーブルの隙間)をpxで指定します(初期値:{@og.value #CHART_PADDING})。
    423         *
    424         * @og.tag
    425         * イメージは、データの全行を含んだ１枚の画像ファイルになります。
    426         * 画像ファイル自体の大きさと、書き込まれた画像の大きさは異なります。
    427         * この、padding は、画像の周りに、余白として指定するサイズをpx単位で指定します。
    428         * ここでは、上下左右に、均等にとります。
    429         *
    430         * 単位は px です。（pxは記述不要です）
    431         * 初期値は、"{@og.value #CHART_PADDING}" です。
    432         *
    433         * @param       padding パディング (全体テーブルの隙間)
    434         */
    435        public void setPadding( final String padding ) {
    436                putPxParam( "CHART_PADDING" , padding , CHART_PADDING );
    437        }
    438
    439        /**
    440         * 【TAG】１レコードの文字やタイムチャートのマージンをpxで指定します(初期値:{@og.value #RECODE_MARGIN})。
    441         *
    442         * @og.tag
    443         * イメージは、１レコードづつ書き込まれますが、そのレコードの幅は、chartHeight で指定された
    444         * タイムチャートの幅＋マージン＊２ になります。
    445         * 同様に、ラベル表記部の文字の書き出し位置も、この、マージンが適用されます。
    446         * （文字の場合は、上下左右に適用され、チャート部は、上下のみ適用されます。）
    447         *
    448         * 単位は px です。（pxは記述不要です）
    449         * 初期値は、"{@og.value #RECODE_MARGIN}" です。
    450         *
    451         * @param       margin マージン(px)
    452         */
    453        public void setMargin( final String margin ) {
    454                putPxParam( "RECODE_MARGIN" , margin , RECODE_MARGIN );
    455        }
    456
    457        /**
    458         * 【TAG】行の最後の情報が、継続しているとして使うかどうか[true/false]を指定します(初期値:{@og.value #USE_LAST_DATA})。
    459         *
    460         * @og.tag
    461         * データは、開始時刻を与えられ、次のデータの開始時刻が前のデータの終了時刻として
    462         * 処理しています。行の最後のデータは、表示範囲いっぱいまで、続いていると認識する場合は、
    463         * この値を true とします。つまり、最後のデータは利用されます。
    464         * 最後のデータがそこで処理を停止したイベントの場合、そのデータは使われません。
    465         * その場合は、false に設定します。イベント色としては、"不明"（空欄＝白色） として扱います。
    466         *
    467         * 初期値は、"{@og.value #USE_LAST_DATA}" です。
    468         *
    469         * @og.rev 5.6.1.1 (2013/02/08) 新規追加
    470         * @og.rev 7.1.0.0 (2020/01/20) putPxParamは間違い
    471         *
    472         * @param       useLastData 継続使用可否 [true:する/false:しない]
    473         */
    474        public void setUseLastData( final String useLastData ) {
    475//              putPxParam( "USE_LAST_DATA" , useLastData , USE_LAST_DATA );
    476                putParam( "USE_LAST_DATA" , nval( getRequestParameter( useLastData ),USE_LAST_DATA ) );
    477        }
    478
    479        /**
    480         * 【TAG】一覧表のヘッダー部分上段の日付フォーマットを指定します(初期値:未指定)。
    481         *
    482         * @og.tag
    483         * ヘッダー部分の日付は、上段下段に分かれています。
    484         * ここでは、上段部分に表示される日付フォーマットを指定します。
    485         * 未指定の場合は、STEPが日単位より大きい場合は、"M月" 小さい場合は "M/d(EE)" になります。
    486         *
    487         * @og.rev 7.1.0.0 (2020/01/20) ヘッダー部分の日付フォーマット指定の追加
    488         *
    489         * @param       fmt 上段日付フォーマット
    490         */
    491        public void setHeaderUpFmt( final String fmt ) {
    492                putParam( "HEADER_UP_FMT" , nval( getRequestParameter( fmt ),null ) );
    493        }
    494
    495        /**
    496         * 【TAG】一覧表のヘッダー部分下段の日付フォーマットを指定します(初期値:未指定)。
    497         *
    498         * @og.tag
    499         * ヘッダー部分の日付は、上段下段に分かれています。
    500         * ここでは、下段部分に表示される日付フォーマットを指定します。
    501         * 未指定の場合は、STEPが日単位より大きい場合は、"dEE" 小さい場合は "H:mm" になります。
    502         *
    503         * @og.rev 7.1.0.0 (2020/01/20) ヘッダー部分の日付フォーマット指定の追加
    504         *
    505         * @param       fmt 下段日付フォーマット
    506         */
    507        public void setHeaderDwFmt( final String fmt ) {
    508                putParam( "HEADER_DW_FMT" , nval( getRequestParameter( fmt ),null ) );
    509        }
    510
    511        /**
    512         * 引数の "px" 文字列を取り除く共通メソッド。
    513         *
    514         * 指定のパラメータに、"px" 文字列を含む場合、"px"文字列以降を削除します。
    515         * HTML上には、px を付けた方が分かりやすいケースが考えられるためです。
    516         * ここでは、putParam( String , String ) するために必要な、キー、初期値も指定する事で、
    517         * 呼び出し元の処理を簡素化します。
    518         * この処理では、val 引数を、getRequestParameter 処理し、結果を、nval で 初期値設定したあと、
    519         * null 判定で、null でなければ、putParam にセットする処理をおこないます。
    520         * この処理の中で、"px" 削除処理をおこないます。
    521         *
    522         * @param       key putParamする場合のキー
    523         * @param       val "px"文字列があれば取り除く値
    524         * @param       def 引数がnullの場合の、初期値
    525         * @see         #putParam( String , String )
    526         */
    527        private void putPxParam( final String key , final String val , final String def ) {
    528                String tmp = nval( getRequestParameter( val ),def );
    529                if( tmp != null ) {
    530                        final int idx = tmp.indexOf( "px" );
    531                        if( idx > 0 ) { tmp = tmp.substring( 0,idx ); }
    532
    533                        putParam( key , tmp );
    534                }
    535        }
    536
    537        /**
    538         * タグの名称を、返します。
    539         * 自分自身のクラス名より、自動的に取り出せないため、このメソッドをオーバーライドします。
    540         *
    541         * @return  タグの名称
    542         * @og.rtnNotNull
    543         */
    544        @Override
    545        protected String getTagName() {
    546                return "timeBarParam" ;
    547        }
    548}