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