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     */
016    package org.opengion.plugin.view;
017    
018    import java.io.Serializable;
019    import java.util.Arrays;
020    import java.util.Comparator;
021    import java.util.LinkedHashSet;
022    import java.util.Set;
023    import java.util.TreeSet;
024    
025    import org.opengion.fukurou.util.StringUtil;
026    import org.opengion.hayabusa.common.HybsSystem;
027    import org.opengion.hayabusa.common.HybsSystemException;
028    import org.opengion.hayabusa.db.DBColumn;
029    import org.opengion.hayabusa.db.DBColumnConfig;
030    import org.opengion.hayabusa.db.DBTableModel;
031    import org.opengion.hayabusa.db.DBTableModelSorter;
032    import org.opengion.hayabusa.db.DBTableModelUtil;
033    import org.opengion.hayabusa.db.Selection;
034    import org.opengion.hayabusa.html.CrossMap;
035    import org.opengion.hayabusa.html.ViewCrossTableParam;
036    import org.opengion.hayabusa.resource.CodeData;
037    import org.opengion.hayabusa.resource.ResourceManager;
038    
039    /**
040     * クロスé›?¨ˆãƒ†ãƒ¼ãƒ–ル作æ?クラスã§ã™ã?
041     *
042     *   select dept.dname,emp.deptno,substrb(job,1,2) as X,job,mgr,sum(sal),count(*)
043     *   from emp,dept
044     *   where emp.deptno = dept.deptno
045     *   group by dept.dname,emp.deptno,cube(job,mgr)
046     *   order by emp.deptno,job,mgr;
047     *
048     *   HEAD1   ?šã?ãƒ?ƒ€ãƒ¼ã€‚剿®µã¨åŒã˜ãƒ??ã‚¿ã¯è¡¨ç¤ºã•ã›ãªã??
049     *   HEAD2   ?šã‚­ãƒ¼ãƒ–レイクã•ã›ã‚‹ã‚«ãƒ©ãƒ??ã¾ãŸã?剿®µã¨åŒã˜ãƒ??ã‚¿ã¯è¡¨ç¤ºã•ã›ãªã??
050     *   HEAD3   ?šã‚­ãƒ¼ãƒ–レイクã•ã›ãªã?‚«ãƒ©ãƒ??ã¾ãŸã?剿®µã¨åŒã˜ãƒ??ã‚¿ã§ã‚‚表示ã•ã›ã‚‹ã?
051     *   ROW     ?šè¡Œãƒ‡ãƒ¼ã‚¿ã®ãƒ˜ãƒƒãƒ??ã«ãªã‚‹ã‚«ãƒ©ãƒ?
052     *   COL     ?šå?ãƒ??ã‚¿ã®ãƒ˜ãƒƒãƒ??ã«ãªã‚‹ã‚«ãƒ©ãƒ??下記ã?SUM1,SUM2ã®ä¸¡æ–¹ã®ãƒ˜ãƒƒãƒ??ã«ãªã‚‹ã?
053     *   SUM1    ?šå?ãƒ??ã‚¿ã®å€¤ã«ãªã‚‹ã‚«ãƒ©ãƒ??
054     *   SUM2    ?šå?ãƒ??ã‚¿ã®å€¤ã«ãªã‚‹ã‚«ãƒ©ãƒ??
055     *
056     *   SUMカラãƒ??æ•°ã€ã‚­ãƒ¼ãƒ–レイクã®ã‚«ãƒ©ãƒ?ã€ã‚°ãƒ«ãƒ¼ãƒ—化ã™ã‚‹ã‚«ãƒ©ãƒ?ã‚?
057     *   æŒ?®šã™ã‚‹ã“ã¨ã§ã€ã“れらã®ã‚¯ãƒ­ã‚¹é›?¨ˆçµæžœã®è¡¨ç¤ºæ–¹æ³•ã‚’æŒ?®šã—ã¾ã™ã?
058     *
059     *   breakColumn    = "DEPTNO"             キーブレイクã®ã‚«ãƒ©ãƒ?
060     *   noGroupColumns = "X"                  グループ化ã™ã‚‹ã‚«ãƒ©ãƒ?
061     *   sumNumber      = "2"                  SUMカラ�?数
062     *   cubeXColumn    = "JOB"                CUBE計算ã??‘ã¤ç›®(X)カラãƒ?‚’æŒ?®?
063     *   cubeYColumn    = "MGR"                CUBE計算ã??’ã¤ç›®(Y)カラãƒ?‚’æŒ?®?
064     *   cubeSortType   = "NUMBER"             CUBE Y ã®åˆ—ã?ãƒ?ƒ€ãƒ¼ã®ã‚½ãƒ¼ãƒˆæ–¹æ³•ã‚’æŒ?®?
065     *   gokeiSortDir   = "false"              åˆè¨ˆã‚«ãƒ©ãƒ??ソート方å‘ã‚’æŒ?®?åˆæœŸå€¤:ソートã—ãªã?
066     *   shokeiLabel    = "SHOKEI"             列å°è¨ˆã?カラãƒ?«è¡¨ç¤ºã™ã‚‹ãƒ©ãƒ™ãƒ«ID
067     *   gokeiLabel     = "GOKEI"              列åˆè¨ˆã?カラãƒ?«è¡¨ç¤ºã™ã‚‹ãƒ©ãƒ™ãƒ«ID
068     *   useHeaderColumn= "false"              ヘッãƒ??カラãƒ?«ãƒ¬ãƒ³ãƒ?ƒ©ãƒ¼ã€ã‚¨ãƒ?‚£ã‚¿ãƒ¼ã‚’é©ç”¨ã™ã‚‹ã‹ã‚’æŒ?®?
069     *   useClassAdd    = "false"              å??æƒ??ã®class属æ?ã«ã€ã‚«ãƒ©ãƒ?ãªã©ã‚’付与ã™ã‚‹ã‹ã©ã?‹ã‚’指å®?
070     *   useHeaderResource = "false"           ヘッãƒ??表示ã«ãƒ©ãƒ™ãƒ«ãƒªã‚½ãƒ¼ã‚¹ã‚’利用ã™ã‚‹ã?
071     *
072     *   å?‚«ãƒ©ãƒ??属æ?(HEAD,SUMç­?ã‚’èªè­˜ã™ã‚‹æ–¹æ³?
073     *
074     *     HEAD1 HEAD2 HEAD3 ROW COL SUM1 SUM2 ã¨ã?†ä¸¦ã³ã‚’èªè­˜ã™ã‚‹æ–¹æ³•ã?ã€?
075     *     多数ã®å‰ææ¡ä»¶ã‚’利用ã—ã¦ã€å?æ¥ã‚‹ã ã‘å°‘ãªã?ƒ‘ラメータã§è‡ªå‹•èªè­?
076     *     ã•ã›ã¦ã?¾ã™ã?
077     *     若干ç?§£ã—ã«ãã„ã‹ã‚‚ã—れã¾ã›ã‚“ãŒã?慣れã¦ãã ã•ã„ã€?
078     *
079     *     剿æ¡ä»¶??
080     *       ROW,COL ã¯ã€å¿?š?‘å?ãšã¤å­˜åœ¨ã™ã‚‹ã€?
081     *       HEAD群ã€ROW,COL,SUM群 ã¨ã?†ä¸¦ã³ã«ãªã£ã¦ã?‚‹ã€?
082     *       SUMç¾¤ã®æ•°ã¯ã€ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã§æŒ?®šã™ã‚‹ã?
083     *     計算方法�
084     *       HEADæ•°=カラãƒ?•°(7)-SUMæ•°(2)-1(ROW,COLåˆ? ????å€?(0 ??3)
085     *       ROWアドレス?cubeXColumn 設å®?                      (3)      ※ アドレスã¯?ã‹ã‚‰å§‹ã¾ã‚‹ç‚º
086     *       COLアドレス?cubeYColumn 設�                      (4)
087     *       SUMアドレス?HEADæ•°?‹ï¼???カラãƒ?•°(7)-1            (5 ??6)
088     *
089     * @og.rev 3.5.4.0 (2003/11/25) æ–°è¦ä½œæ?
090     * @og.group ç”»é¢è¡¨ç¤º
091     *
092     * @version  4.0
093     * @author       Kazuhiko Hasegawa
094     * @since    JDK5.0,
095     */
096    public class ViewForm_HTMLCrossTable extends ViewForm_HTMLTable {
097            //* ã“ã?プログラãƒ??VERSIONæ–?­—å?を設定ã—ã¾ã™ã?       {@value} */
098            private static final String VERSION = "5.7.4.3 (2014/03/28)" ;
099    
100            private String[] groupByData = null;
101            private String[] groupByCls  = null;
102    
103            // 3.5.4.8 (2004/02/23) 機è?改å–?
104            private int             rowClmNo        = -1;                   // ROWカラãƒ??カラãƒ?•ªå·
105            private int             colClmNo        = -1;                   // CLMカラãƒ??カラãƒ?•ªå·
106            private int             headCount       = 0;                    // HEADカラ�?数
107            private int             sumCount        = 1;                    // åˆè¨ˆã‚«ãƒ©ãƒ??æ•°
108            private int             breakClmNo      = -1;                   // ブレークã™ã‚‹ã‚«ãƒ©ãƒ??カラãƒ?•ªå·
109            private boolean[]       noGroupClm = null;              // グループ化ã™ã‚‹/ã—ãªã??フラグé…å?
110            private String          shokeiLabel  = "å°è¨?;   // 列å°è¨ˆã?カラãƒ?«è¡¨ç¤ºã™ã‚‹ãƒ©ãƒ™ãƒ«ID
111            private String          gokeiLabel   = "åˆè¨?;   // 列åˆè¨ˆã?カラãƒ?«è¡¨ç¤ºã™ã‚‹ãƒ©ãƒ™ãƒ«ID
112            private String          gokeiSortDir = null;    // 列åˆè¨ˆã?カラãƒ?‚’ソートã™ã‚‹æ–¹å?
113    
114            // 3.5.6.3 (2004/07/12) ソート方å¼[STRING,NUMBER,LOAD]
115            private String          cubeSortType = "LOAD";
116    
117            private DBTableModel table2             = null;
118            private boolean          firstStep      = true;
119    
120            private String[]        clmKeys         = null;                         // é›?¨ˆéƒ¨ã®ã‚«ãƒ©ãƒ?‚­ãƒ¼(é›?¨ˆã‚«ãƒ©ãƒ?Œè¤?•°ã§ã‚‚ä¸?¤)ã®é…å?
121            private String[]        clsAdd          = null;                         // 5.2.2.0 (2010/11/01) class属æ?ã«ä»˜ä¸Žã•れるカラãƒ?‚­ãƒ¼
122    
123            private String          noDisplayKeys           = null;         // 3.7.0.4 (2005/03/18)
124            private String          columnDisplayKeys       = null;         // 5.2.2.0 (2010/11/01)
125    
126            private boolean         firstClmGokei           = false;        // 5.0.0.3 (2009/09/22)
127            private boolean         useHeaderColumn         = false;        // 5.2.2.0 (2010/11/01)
128            private boolean         useClassAdd                     = false;        // 5.2.2.0 (2010/11/01) class属æ?ã«ã‚«ãƒ©ãƒ?‚­ãƒ¼ã‚’追åŠ?™ã‚‹ã‹ã©ã?‹
129            private boolean         useHeaderResource       = false;        // 5.5.5.0 (2012/07/28)
130            private String          headerCode                      = null;         // 5.5.5.0 (2012/07/28)
131            
132            /**
133             * åˆæœŸåŒ–ã—ã¾ã™ã?
134             * ã“ã“ã§ã¯ã€å?部ã§ä½¿ç”¨ã•れã¦ã?‚‹ã‚­ãƒ£ãƒ?‚·ãƒ¥ã‚’クリアã—ã?
135             * æ–°ã—ã„モãƒ?ƒ«(DBTableModel)ã¨è¨?ª?lang) ã‚’å?ã«å†?ƒ¨ãƒ??ã‚¿ã‚’å?構築ã—ã¾ã™ã?
136             * ãŸã ã—ã?設定情報ã¯ã€ä»¥å‰ã?状態ãŒãã?ã¾ã¾ã‚­ãƒ¼ãƒ—ã•れã¦ã?¾ã™ã?
137             *
138             * @og.rev 3.5.4.8 (2004/02/23) paramInit メソãƒ?ƒ‰ã§ã€å?期化を行ã„ã¾ã™ã?
139             * @og.rev 3.5.6.1 (2004/06/25) lang è¨?ªžã‚³ãƒ¼ãƒ?属æ?を削除ã—ã¾ã™ã?
140             *
141             * @param       table   DBTableModelオブジェク�
142             */
143            @Override
144            public void init( final DBTableModel table ) {
145                    table2          = table;
146                    firstStep       = true;
147            }
148    
149            /**
150             * å†?®¹ã‚’クリア(åˆæœŸåŒ?ã—ã¾ã™ã?
151             *
152             * @og.rev 3.5.6.3 (2004/07/12) cubeSortType , gokeiSortDir 属æ?を追åŠ?—ã¾ã™ã?
153             * @og.rev 3.7.0.4 (2005/03/18) noDisplayKeys 属æ?を追åŠ?—ã¾ã™ã?
154             * @og.rev 3.7.1.1 (2005/05/31) shokeiLabel,gokeiLabel ã®åˆæœŸå€¤å¤‰æ›´
155             * @og.rev 5.2.2.0 (2010/11/01) columnDisplayKeysã€clsAddã€useClassAdd 属æ?を追åŠ?—ã¾ã?
156             * @og.rev 5.5.5.0 (2012/07/20) useHeaderResource追�
157             */
158            @Override
159            public void clear() {
160                    super.clear();
161                    groupByData = null;
162                    groupByCls  = null;
163                    rowClmNo        = -1;                   // ROWカラãƒ??カラãƒ?•ªå·
164                    colClmNo        = -1;                   // CLMカラãƒ??カラãƒ?•ªå·
165                    headCount       = 0;                    // HEADカラ�?数
166                    sumCount        = 1;                    // åˆè¨ˆã‚«ãƒ©ãƒ??æ•°
167                    breakClmNo      = -1;                   // ブレークã™ã‚‹ã‚«ãƒ©ãƒ??カラãƒ?•ªå·
168                    noGroupClm      = null;                 // グループ化ã™ã‚‹/ã—ãªã??フラグé…å?
169                    table2          = null;
170                    firstStep       = true;
171                    clmKeys         = null;
172                    clsAdd          = null;                 // 5.2.2.0 (2010/11/01)
173                    shokeiLabel     = "å°è¨?;                // 列å°è¨ˆã?カラãƒ?«è¡¨ç¤ºã™ã‚‹ãƒ©ãƒ™ãƒ«ID
174                    gokeiLabel      = "åˆè¨?;                // 列åˆè¨ˆã?カラãƒ?«è¡¨ç¤ºã™ã‚‹ãƒ©ãƒ™ãƒ«ID
175                    cubeSortType = "LOAD";          // 3.5.6.3 (2004/07/12)
176                    gokeiSortDir = null;            // 3.5.6.3 (2004/07/12) 列åˆè¨ˆã?カラãƒ?‚’ソートã™ã‚‹æ–¹å?
177                    noDisplayKeys           = null; // 3.7.0.4 (2005/03/18)
178                    columnDisplayKeys       = null; // 5.2.2.0 (2010/11/01)
179                    firstClmGokei           = false;        // 5.2.2.0 (2010/11/01)
180                    useHeaderColumn         = false;        // 5.2.2.0 (2010/11/01)
181                    useClassAdd                     = false;        // 5.2.2.0 (2010/11/01)
182                    useHeaderResource       = false;        // 5.5.5.0 (2012/07/20)
183                    headerCode                      = null;         // 5.5.5.0 (2012/07/28)
184            }
185    
186            /**
187             * DBTableModel ã‹ã‚‰ HTMLæ–?­—å?を作æ?ã—ã¦è¿”ã—ã¾ã™ã?
188             * startNo(表示開始ä½ç½®)ã‹ã‚‰ã€pageSize(表示件数)ã¾ã§ã®Viewæ–?­—å?を作æ?ã—ã¾ã™ã?
189             * 表示残りãƒ??ã‚¿ã?pageSize 以下ã?å ´åˆã?,残りã®ãƒ??ã‚¿ã‚’ã™ã¹ã¦å‡ºåŠ›ã—ã¾ã™ã?
190             *
191             * @og.rev 3.5.5.0 (2004/03/12) No æ¬?ã®ã‚‚ã?ã®ä½œæ?判断ロジãƒ?‚¯ã‚’追åŠ?
192             * @og.rev 3.5.6.1 (2004/06/25) lang è¨?ªžã‚³ãƒ¼ãƒ?属æ?を削除ã—ã¾ã™ã?
193             * @og.rev 3.5.6.4 (2004/07/16) ヘッãƒ??ã¨ãƒœãƒ‡ã‚£ãƒ¼éƒ¨ã‚’JavaScriptã§åˆ?›¢
194             * @og.rev 3.7.0.4 (2005/03/18) setNoDisplay メソãƒ?ƒ‰ã‚’追åŠ?
195             * @og.rev 4.3.1.0 (2008/09/08) ç·¨é›?¡Œã?ã¿ã‚’表示ã™ã‚‹å±žæ?(isSkipNoEdit)追åŠ?
196             * @og.rev 5.0.0.3 (2009/09/22) åˆè¨ˆå?ã‚’cubeã®å…ˆé?ã«å‡ºã›ã‚‹ã‚ˆã†ã«ã™ã‚‹
197             * @og.rev 5.1.0.0 (2009/11/04) ↑ã§åˆè¨ˆå?ãŒè¤?•°ã‚«ãƒ©ãƒ?­˜åœ¨ã™ã‚‹å ´åˆã«æ­£ã—ã表示ã•れãªã?ƒã‚°ã‚’修正
198             * @og.rev 5.2.2.0 (2010/11/01) setColumnDisplay メソãƒ?ƒ‰ã‚’追åŠ?
199             *
200             * @param  startNo        表示開始ä½ç½®
201             * @param  pageSize   表示件数
202             *
203             * @return      DBTableModelã‹ã‚‰ä½œæ?ã•れã?HTMLæ–?­—å?
204             */
205            @Override
206            public String create( final int startNo, final int pageSize )  {
207                    if( firstStep ) {
208                            paramInit( table2 );
209                            super.init( makeCrossTable(table2) );
210                            super.setNoDisplay( noDisplayKeys ) ;                           // 3.7.0.4 (2005/03/18)
211                            super.setColumnDisplay( columnDisplayKeys ) ;           // 5.2.2.0 (2010/11/01)
212                            markerSet( this );              // 3.5.6.4 (2004/07/16)
213                            firstStep = false;
214                    }
215    
216                    if( getRowCount() == 0 ) { return ""; } // 暫定å?ç½®
217    
218                    int clmCnt = getColumnCount();  // 3.5.5.7 (2004/05/10)
219    
220                    headerLine       = null;
221    
222                    int lastNo = getLastNo( startNo, pageSize );
223                    int blc = getBackLinkCount();
224                    String backData = null;
225    
226                    StringBuilder out = new StringBuilder( HybsSystem.BUFFER_LARGE );
227    
228                    out.append( getCountForm( startNo,pageSize ) );
229                    out.append( getHeader() );
230    
231                    String ckboxTD = "  <td class=\"" + ViewCrossTableParam.HEADER1 + "\">";
232    
233                    out.append("<tbody>").append( HybsSystem.CR );
234                    int bgClrCnt = 0;
235                    boolean shokei;
236                    for( int row=startNo; row<lastNo; row++ ) {
237    //                      if( isSkip( row ) ) { continue; }               // 3.5.3.1 (2003/10/31)
238                            if( isSkip( row ) || isSkipNoEdit( row ) ) { continue; } // 4.3.1.0 (2008/09/08)
239                            // キーブレイク時ã?ヘッãƒ??設å®?
240                            if( breakClmNo >= 0 ) {
241                                    String val = getValue( row,breakClmNo );
242                                    if( backData == null ) {        // キーブレイクã®åˆæœŸãƒ??タ設定ã?
243                                            backData = val;
244                                    }
245                                    else {
246                                            if( ! backData.equals( val ) ) {
247                                                    backData = val;
248                                                    out.append( getHeadLine() );
249                                            }
250                                    }
251                            }
252                            // å°è¨ˆã?ãƒ?ƒ€ãƒ¼æ™‚ã?クラス設å®?
253                            String val2 = getValue( row,rowClmNo );
254                            if( val2.length() == 0 ) {
255                                    shokei = true;
256                                    out.append("<tr class=\"").append( ViewCrossTableParam.SHOKEI ).append("\">");
257                            }
258                            else {
259                                    shokei = false;
260                                    out.append("<tr").append( getBgColorCycleClass( bgClrCnt++ ) ).append(">");
261                            }
262                            out.append( HybsSystem.CR );
263                            // 3.5.5.0 (2004/03/12) No æ¬?ã®ã‚‚ã?ã®ä½œæ?判断追åŠ?
264                            if( isNumberDisplay() ) {
265                                    out.append( makeCheckbox( ckboxTD, row, blc ) ).append( HybsSystem.CR );
266                            }
267                            for(int column = 0; column < clmCnt; column++) {
268                                    if( isColumnDisplay( column ) ) {
269                                            if( column < headCount-1 ) {         // CUBEã§ã¯ãªã?¡Œã?ãƒ?ƒ€ãƒ¼éƒ¨
270                                                    String val = getGroupData( column,getRendererValue(row,column) );
271                                                    out.append("  <td class=\"").append( groupByCls[column] ).append("\">");
272                                                    out.append( val );
273                                            }
274                                            else if( column == headCount-1 ) {      // ヘッãƒ??ã®æœ?¾Œå°¾
275                                                    if( shokei ) {
276                                                            out.append("  <td class=\"").append( ViewCrossTableParam.SHOKEI ).append("\">");
277                                                            out.append( shokeiLabel );
278                                                    }
279                                                    else {
280                                                            if( breakClmNo > 0 ) {       // ヘッãƒ??ãŒã‚ã‚‹å?å?
281                                                                    out.append("  <td class=\"").append( groupByCls[column-1] ).append("\">");
282                                                            }
283                                                            else {
284                                                                    out.append("  <td class=\"").append( ViewCrossTableParam.HEADER1 ).append("\">");
285                                                            }
286                                                            out.append( getRendererValue(row,column) );
287                                                    }
288                                            }
289                                            // else if( column >= clmCnt-sumCount ) {    // CUBEã®æœ?µ‚カラãƒ?列åˆè¨?
290                                            else if( column >= clmCnt-sumCount && ! firstClmGokei ) {    // 5.0.0.3 (2009/09/22) CUBEã®æœ?µ‚カラãƒ?列åˆè¨?
291                                                    out.append("  <td class=\"").append( ViewCrossTableParam.SHOKEI ).append("\">");
292                                                    out.append( getRendererValue(row,column) );
293                                            }
294    //                                      else if( column == headCount && firstClmGokei ) {               // 5.0.0.3 (2009/09/22) CUBEã®å…ˆé?カラãƒ?列åˆè¨?
295                                            else if( column >= headCount && column < headCount + sumCount && firstClmGokei ) {                // 5.1.0.0 (2009/11/04)
296                                                            out.append("  <td class=\"").append( ViewCrossTableParam.SHOKEI ).append("\">");
297    //                                                      out.append( getRendererValue(row,clmCnt-sumCount) );
298                                                            out.append( getRendererValue(row,clmCnt-sumCount+(column-headCount)) ); // 5.1.0.0 (2009/11/04)
299                                            }
300                                            else {          // カラ�SUM�
301                                                    if( useClassAdd && clsAdd[column] != null ) {
302                                                            out.append("  <td class=\"").append( clsAdd[column] ).append("\">");
303                                                    }
304                                                    else {
305                                                            out.append("  <td>");
306                                                    }
307                                                    if( firstClmGokei ){
308    //                                                      out.append( getRendererValue(row,column-1) ); // åˆè¨ˆè¡Œã‚’å…ˆé?ã«å‡ºã™ã¨1ã¤ãšã‚Œã‚?
309                                                            out.append( getRendererValue(row,column-sumCount) ); // 5.1.0.0 (2009/11/04)
310                                                    }
311                                                    else{
312                                                            out.append( getRendererValue(row,column) );
313                                                    }
314                                            }
315                                            out.append("</td>").append( HybsSystem.CR );
316                                    }
317                            }
318                            out.append("</tr>").append( HybsSystem.CR );
319                    }
320                    out.append("</tbody>").append( HybsSystem.CR );
321                    out.append("</table>").append( HybsSystem.CR );
322    
323                    out.append( getScrollBarEndDiv() );     // 3.8.0.3 (2005/07/15)
324                    return out.toString();
325            }
326    
327            /**
328             * パラメータå†?®¹ã‚’å?期化ã—ã¾ã™ã?
329             *
330             * @og.rev 3.5.4.8 (2004/02/23) æ–°è¦ä½œæ?
331             * @og.rev 3.5.6.3 (2004/07/12) 列ã?ãƒ?ƒ€ãƒ¼ã®ã‚½ãƒ¼ãƒˆæ–¹æ³•ã‚’æŒ?®?
332             * @og.rev 5.0.0.3 (2009/09/22) åˆè¨ˆè¡Œã‚’CUBEã®å…ˆé?ã«æŒã£ã¦ãã‚‹ãŸã‚ã®ãƒ•ラグ追åŠ?
333             * @og.rev 5.2.2.0 (2010/11/01) useHeaderColumn,useClassAdd 属æ?ã®è¿½åŠ?
334             *
335             * @param       table   入力もã¨ã® DBTableModelオブジェクãƒ?
336             */
337            private void paramInit( final DBTableModel table ) {
338                    String breakColumn              = getParam( ViewCrossTableParam.BREAK_COLUMN_KEY     , null );
339                    String noGroupColumns   = getParam( ViewCrossTableParam.NO_GROUP_COLUMNS_KEY , null );
340                    String sumNumber                = getParam( ViewCrossTableParam.SUM_NUMBER_KEY       , null );
341                    shokeiLabel                             = getParam( ViewCrossTableParam.SHOKEI_LABEL_KEY     , shokeiLabel );
342                    gokeiLabel                              = getParam( ViewCrossTableParam.GOKEI_LABEL_KEY      , gokeiLabel );
343                    String cubeXColumn              = getParam( ViewCrossTableParam.CUBE_X_COLUMN_KEY    , null );  // CUBE計算ã??‘ã¤ç›®(X)カラãƒ?‚’æŒ?®?
344                    String cubeYColumn              = getParam( ViewCrossTableParam.CUBE_Y_COLUMN_KEY    , null );  // CUBE計算ã??’ã¤ç›®(Y)カラãƒ?‚’æŒ?®?
345                    cubeSortType                    = getParam( ViewCrossTableParam.CUBE_SORT_TYPE_KEY   , "LOAD" );        // 3.5.6.3 (2004/07/12)
346                    gokeiSortDir                    = getParam( ViewCrossTableParam.GOKEI_SORT_DIR_KEY   , null );  // 3.5.6.3 (2004/07/12)
347                    firstClmGokei                   = StringUtil.nval( getParam( ViewCrossTableParam.FIRST_CLM_GOKEI_KEY , null ), false);  // 5.0.0.3 (2009/09/22)
348                    useHeaderColumn                 = StringUtil.nval( getParam( ViewCrossTableParam.USE_HEADER_COLUMN   , null ), false);  // 5.2.2.0 (2010/11/01)
349                    useClassAdd                             = StringUtil.nval( getParam( ViewCrossTableParam.USE_CLASS_ADD       , null ), false);  // 5.2.2.0 (2010/11/01)
350                    useHeaderResource               = StringUtil.nval( getParam( ViewCrossTableParam.USE_HEADER_RSC      , null ), false);  // 5.5.5.0 (2012/07/20)
351                    headerCode                              = getParam( ViewCrossTableParam.HEADER_CODE_KEY     , null );   // 5.5.5.0 (2012/07/28)
352                    
353                    if( sumNumber != null ) {
354                            sumCount = Integer.parseInt( sumNumber );
355                    }
356    
357                    // HEADæ•°=カラãƒ?•°-SUMæ•°-1(COLåˆ? ROW ã¯ã€HEADã«å«ã¿ã¾ã™ã?
358                    headCount = table.getColumnCount() - sumCount - 1;
359    
360                    // 3.5.5.9 (2004/06/07)
361                    if( cubeXColumn != null ) {
362                            rowClmNo = table.getColumnNo( cubeXColumn );
363                    }
364                    else {
365                            rowClmNo = headCount-1;                 // ROWカラãƒ??カラãƒ?•ªå·
366                    }
367    
368                    // 3.5.5.9 (2004/06/07)
369                    if( cubeYColumn != null ) {
370                            colClmNo = table.getColumnNo( cubeYColumn );
371                    }
372                    else {
373                            colClmNo = headCount;           // CLMカラãƒ??カラãƒ?•ªå·
374                    }
375    
376                    if( breakColumn != null ) {
377                            breakClmNo = table.getColumnNo( breakColumn );
378                    }
379    
380                    groupByData = new String[headCount];
381                    groupByCls  = new String[headCount];
382                    Arrays.fill( groupByCls,ViewCrossTableParam.HEADER2 );          // 変ã§ã‚ã‚‹ãŒã?æœ??ã«å…¥ã‚Œæ›¿ãˆãŒç™ºç”Ÿã™ã‚‹ç‚ºã€?
383    
384                    noGroupClm    = new boolean[headCount];         // グループ化ã™ã‚‹/ã—ãªã??フラグé…å?
385                    Arrays.fill( noGroupClm,false );
386    
387                    if( noGroupColumns != null ) {
388                            String[] gClms = StringUtil.csv2Array( noGroupColumns );
389                            for( int i=0; i<gClms.length; i++ ) {
390                                    noGroupClm[table.getColumnNo( gClms[i] )] = true;
391                            }
392                    }
393    
394                    if( ! "true".equalsIgnoreCase( gokeiSortDir ) &&
395                            ! "false".equalsIgnoreCase( gokeiSortDir ) ) {
396                                    gokeiSortDir = null;
397                    }
398            }
399    
400            /**
401             * CUBEã§ã¯ãªã?¡Œã?ãƒ?ƒ€ãƒ¼éƒ¨ã®å€¤ãŒå‰ã¨åŒã˜ãªã‚‰ã?ã€ã‚¼ãƒ­æ–?­—å?ã‚’è¿”ã—ã¾ã™ã?
402             *
403             * @param       clm     カラãƒ?•ªå·
404             * @param       val     比è¼?™ã‚‹å?
405             *
406             * @return      å‰ã¨åŒã˜ãªã‚?""ã‚’ã?ç•°ãªã‚‹å?åˆã?ã€å¼•æ•°ã® val ã‚’è¿”ã—ã¾ã™ã?
407             */
408            private String getGroupData( final int clm,final String val ) {
409                    if( noGroupClm[clm] ) { return val; }
410    
411                    if( val.equals( groupByData[clm] )) {
412                            return "";
413                    }
414                    else {
415                            groupByData[clm] = val;
416                            groupByCls[clm] = ( groupByCls[clm].equals( ViewCrossTableParam.HEADER1 )) ? ViewCrossTableParam.HEADER2 : ViewCrossTableParam.HEADER1 ;
417                            return val;
418                    }
419            }
420    
421            /**
422             * é¸æŠžç”¨ã®ãƒã‚§ãƒ?‚¯ãƒœãƒƒã‚¯ã‚¹ã¨è¡Œç•ªå·ã¨å¤‰æ›´ã‚¿ã‚¤ãƒ?A,C,D)を表示ã—ã¾ã™ã?
423             *
424             * @param  ckboxTD ãƒã‚§ãƒ?‚¯ãƒœãƒƒã‚¯ã‚¹ã®ã‚¿ã‚°(マルãƒã‚«ãƒ©ãƒ?™‚ã®rowspan対å¿?
425             * @param  row   行番å·
426             * @param  blc   ãƒãƒƒã‚¯ãƒ©ã‚¤ãƒ³ã‚«ã‚¦ãƒ³ãƒ?å…ˆé?ã¸æˆ»ã‚‹ãƒªãƒ³ã‚¯é–“éš”)
427             *
428             * @return      tdã‚¿ã‚°ã§å›²ã¾ã‚ŒãŸãƒã‚§ãƒ?‚¯ãƒœãƒƒã‚¯ã‚¹ã®HTMLæ–?­—å?
429             */
430            @Override
431            protected String makeCheckbox( final String ckboxTD,final int row,final int blc ) {
432                    StringBuilder out = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
433    
434                    out.append( ckboxTD ).append("</td>");
435                    out.append( ckboxTD ).append("</td>");
436                    out.append( ckboxTD );
437                    // 3.5.1.0 (2003/10/03) Noカラãƒ?«ã€numberType 属æ?を追åŠ?
438                    if( blc != 0 && (row+1) % blc == 0 ) {
439                            out.append( "<a href=\"#top\">" ).append( (row+1) ).append(  "</a>" );
440                    } else {
441                            out.append( (row+1) );
442                    }
443                    out.append("</td>");
444    
445                    return out.toString();
446            }
447    
448            /**
449             * ヘッãƒ??繰り返ã—部をã?getTableHead()メソãƒ?ƒ‰ã‹ã‚‰åˆ?›¢ã€?
450             *
451             * @og.rev 3.5.4.5 (2004/01/23) 実è£?‚’getHeadLine( String thTag )ã«ç§»å‹?
452             * @og.rev 3.5.5.0 (2004/03/12) No æ¬?ã®ã‚‚ã?ã®ä½œæ?判断ロジãƒ?‚¯ã‚’追åŠ?
453             * @og.rev 5.0.0.3 (2009/09/17) åˆè¨ˆè¡Œã‚’出力ã™ã‚‹ä½ç½®ã‚’firstClmGokeiã§å¤‰ãˆã‚?
454             * @og.rev 5.2.2.0 (2010/11/01) é›?¨ˆéƒ¨ã® ColumnDisplay/NoDisplay 対å¿?
455             * @og.rev 5.5.5.0 (2012/07/28) useHeaderResource利用時ã?ヘッãƒ??ラベル/コードリソース対å¿?
456             * @og.rev 5.7.4.2 (2014/03/20) ヘッãƒ??ã®ãƒªã‚½ãƒ¼ã‚¹é©ç”¨è¦‹ç›´ã?
457             * @og.rev 5.7.4.3 (2014/03/28) useHeaderResource å˜ç‹¬ã§ãƒªã‚½ãƒ¼ã‚¹é©ç”¨ã—ã¾ã™ã?
458             *
459             * @return      ãƒ??ブルã®ã‚¿ã‚°æ–?­—å?
460             */
461            @Override
462            protected String getHeadLine() {
463                    if( headerLine != null ) { return headerLine; }         // キャãƒ?‚·ãƒ¥ã‚’è¿”ã™ã€?
464    
465                    String rowspan = "";
466                    if( sumCount > 1 ) { rowspan = " rowspan=\"2\""; }
467    
468                    String thTag = "<th" + rowspan;
469    
470                    StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
471    
472                    buf.append("<tr").append( rowspan ).append(" class=\"row_h\"").append(" >").append( HybsSystem.CR );
473    
474                    // 3.5.5.0 (2004/03/12) No æ¬?ã®ã‚‚ã?ã®ä½œæ?判断追åŠ?
475                    if( isNumberDisplay() ) {
476                            buf.append( thTag ).append(" colspan='3'>").append( getNumberHeader() ).append("</th>");
477                    }
478    
479                    buf.append( HybsSystem.CR );
480                    // ヘッãƒ??部åˆ??ã€ãã®ã¾ã¾è¡¨ç¤ºã—ã¾ã™ã?
481                    for(int column = 0; column < headCount; column++) {
482                            if( isColumnDisplay( column ) ) {
483                                    buf.append( thTag ).append(">");
484                                    buf.append( getColumnLabel(column) );
485                                    buf.append("</th>").append( HybsSystem.CR );
486                            }
487                    }
488    
489                    // ヘッãƒ??部åˆ?上段)ã¯ã€ã‚«ãƒ©ãƒ??列を利用ã—ã¾ã™ã?
490                    String colspan = "";
491                    if( sumCount > 1 ) { colspan = " colspan='" + sumCount + "'"; }
492    
493                    // 5.2.2.0 (2010/11/01) é›?¨ˆéƒ¨ã® ColumnDisplay/NoDisplay 対å¿?
494    //              String gokeiClm = "<th" + colspan + ">" + temp + "</th>" + HybsSystem.CR ;
495                    String gokeiClm = null;
496                    if( isColumnDisplay( headCount+(clmKeys.length-1)*sumCount ) ) {
497                            String temp = clmKeys[clmKeys.length-1];
498                            if( temp == null || temp.length() == 0 ) {
499                                    temp = gokeiLabel;
500                            }
501    
502                            gokeiClm = "<th" + colspan + ">" + temp + "</th>" + HybsSystem.CR ;
503                    }
504    
505                    // 5.2.2.0 (2010/11/01) æœ?¾Œã?カラãƒ?Œã€åˆè¨ˆè¡Œã?
506                    // 5.0.0.3 (2009/09/22) firstClmGokei ã?trueã®å ´åˆã?cubeã®å…ˆé?ã«å‡ºã™ã‚ˆã?«ã—ã¾ã™ã?
507    //              if( firstClmGokei && isColumnDisplay( headCount+clmKeys.length-1 ) ) {
508                    if( firstClmGokei && gokeiClm != null ) {
509                            buf.append( gokeiClm );
510                    }
511    
512    //              // 5.0.0.3 (2009/09/22) trueã®å ´åˆã?cubeã®å…ˆé?ã«å‡ºã™ã‚ˆã?«ã—ã¾ã™ã?
513    //              if( firstClmGokei ){
514    //                      String temp = clmKeys[clmKeys.length-1];
515    //                      if( temp == null || temp.length() == 0 ) {
516    //                              temp = gokeiLabel;
517    //                      }
518    //                      buf.append( "<th").append( colspan ).append( ">" );
519    //                      buf.append( temp );
520    //                      buf.append("</th>").append( HybsSystem.CR );
521    //              }
522    
523                    // 3.7.0.4 (2005/03/18) カラãƒ??列ã?ã€ã‚«ãƒ©ãƒ?•ªå·ã¨åˆ¥ç‰©
524                    ResourceManager resource = getResourceManager();
525                    Selection selection = null;
526                    if( headerCode != null && headerCode.length() > 0 && resource != null ){
527                            DBColumn clmTmp = resource.getDBColumn( headerCode );
528                            //selection = new Selection_CODE(resource.getCodeData( headerCode )); codeç›´ã®å ´å?
529                            if ( clmTmp != null ){
530                                    selection = clmTmp.getSelection();
531                            }
532                    }
533    
534                    // 5.7.4.2 (2014/03/20) ヘッãƒ??ã®ãƒªã‚½ãƒ¼ã‚¹é©ç”¨è¦‹ç›´ã?
535                    // 5.7.4.3 (2014/03/28) useHeaderResource å˜ç‹¬ã§ãƒªã‚½ãƒ¼ã‚¹é©ç”¨ã—ã¾ã™ã?
536                    DBColumn colClm = null;
537    //              if( useHeaderResource && useHeaderColumn ) {
538                    if( useHeaderResource ) {
539                            colClm = table2.getDBColumn( colClmNo );
540                    }
541    
542                    for( int keyNo = 0; keyNo < clmKeys.length-1; keyNo++ ) {
543                            // 5.2.2.0 (2010/11/01) ColumnDisplay/NoDisplay 対�
544                            if( isColumnDisplay( headCount+keyNo ) ) {
545                                    buf.append( "<th").append( colspan ).append( ">" );
546    //                              if( headerCode != null && headerCode.length() > 0 && selection != null ){
547                                    if( selection != null ){
548                                            buf.append( selection.getValueLabel( clmKeys[keyNo] ) );
549                                    }
550                                    // 5.7.4.2 (2014/03/20) ヘッãƒ??ã®ãƒªã‚½ãƒ¼ã‚¹é©ç”¨è¦‹ç›´ã?
551    //                              else if( useHeaderResource && useHeaderColumn ){ // 5.5.5.0 (2012/07/28) ヘッ�?リソース対�
552    //                                      buf.append( getColumnLabel(headCount+keyNo) );
553    //                              }
554                                    // 5.7.4.3 (2014/03/28) ヘッãƒ??ã®ãƒªã‚½ãƒ¼ã‚¹é©ç”¨ã¯ã€CLMカラãƒ??カラãƒ?•ªå·ã®ã¿ã¨ã—ã¾ã™ã?
555                                    else if( colClm != null ) {
556                                            buf.append( colClm.getRendererValue( clmKeys[keyNo] ) );
557                                    }
558                                    else{
559                                            buf.append( clmKeys[keyNo] );
560                                    }
561                                    buf.append("</th>").append( HybsSystem.CR );
562                            }
563                    }
564    
565                    // 5.2.2.0 (2010/11/01) æœ?¾Œã?カラãƒ?Œã€åˆè¨ˆè¡Œã?
566                    // 5.0.0.3 (2009/09/22) firstClmGokei ã?trueã®å ´åˆã?cubeã®å…ˆé?ã«å‡ºã™ã‚ˆã?«ã—ã¾ã™ã?
567    //              if( ! firstClmGokei && isColumnDisplay( headCount+clmKeys.length-1 ) ) {
568                    if( ! firstClmGokei && gokeiClm != null ) {
569                            buf.append( gokeiClm );
570                    }
571    
572                    // 3.5.6.2 (2004/07/05) makeCrossTable( DBTableModel table ) ã«ç§»å‹?
573                    // æœ?µ‚カラãƒ?åˆ?ãŒNULL(空æ–?­—å?)ã®å ´åˆã?列åˆè¨ˆã§ã™ã?
574    //              if( ! firstClmGokei ){ // 5.0.0.3 (2009/09/22) falseã®å ´åˆã?æœ?µ‚å?ã«å‡ºã?
575    //                      String temp = clmKeys[clmKeys.length-1];
576    //                      if( temp == null || temp.length() == 0 ) {
577    //                              temp = gokeiLabel;
578    //                      }
579    //                      buf.append( "<th").append( colspan ).append( ">" );
580    //                      buf.append( temp );
581    //                      buf.append("</th>").append( HybsSystem.CR );
582    //              }
583    
584                    buf.append("</tr>").append( HybsSystem.CR );
585    
586                    if( sumCount > 1 ) {
587                            buf.append("<tr").append(" class=\"row_h\"").append(" >").append( HybsSystem.CR );
588                            int clmCnt = getColumnCount();  // 3.5.5.7 (2004/05/10)
589                            for(int column = headCount; column < clmCnt; column++) {
590                                    if( isColumnDisplay( column ) ) {
591                                            buf.append( "<th>");
592                                            buf.append( getColumnLabel(column) );
593                                            buf.append("</th>").append( HybsSystem.CR );
594                                    }
595                            }
596                            buf.append("</tr>").append( HybsSystem.CR );
597                    }
598    
599                    headerLine = buf.toString();
600                    return headerLine;
601            }
602    
603            /**
604             * クロスé›?¨ˆçµæžœã® DBTableModelオブジェクトを作æ?ã—ã¾ã™ã?
605             *
606             * @og.rev 3.5.4.8 (2004/02/23) paramInit メソãƒ?ƒ‰ã§ã€å?期化を行ã„ã¾ã™ã?
607             * @og.rev 3.5.6.3 (2004/07/12) 列ã?ãƒ?ƒ€ãƒ¼ã®ã‚½ãƒ¼ãƒˆå¯å¦ã®æŒ?®šã‚’追åŠ?
608             * @og.rev 4.0.0.0 (2007/11/27) ヘッãƒ??カラãƒ??エãƒ?‚£ã‚¿ãƒ¼ã€ãƒ¬ãƒ³ãƒ?ƒ©ãƒ¼é©ç”¨å¯¾å¿?
609             * @og.rev 4.3.5.7 (2008/03/22) ↑リソースãŒå­˜åœ¨ã—ãªã??åˆã?ã€ãƒ©ãƒ™ãƒ«ã®ã¿å…¥ã‚Œæ›¿ã?
610             * @og.rev 5.2.2.0 (2010/11/01) useHeaderColumn,useClassAdd 属æ?ã®è¿½åŠ?
611             * @og.rev 5.7.4.3 (2014/03/28) useHeaderColumn ã®é©ç”¨æ¡ä»¶ã‚’ã?æœ??ã®é›?¨ˆã‚«ãƒ©ãƒ??ã¿ã«å¤‰æ›´ã€?
612             *
613             * @param       table   入力もã¨ã® DBTableModelオブジェクãƒ?
614             *
615             * @return      DBTableModelオブジェク�
616             */
617            private DBTableModel makeCrossTable( final DBTableModel table ) {
618                    Set<String> clmData = gatSortAlgorithmSet();
619    
620                    // 列ã?キーã¨ãªã‚‹ã‚«ãƒ©ãƒ??値をå–å¾—ã—ã¾ã™ã?
621                    int rowCnt = table.getRowCount();               // 3.5.5.7 (2004/05/10)
622                    for( int row=0; row<rowCnt; row++ ) {
623                            String clm = table.getValue( row,colClmNo );
624                            if( clm.length() > 0 ) { clmData.add( clm ); }
625                    }
626                    // ゼロストリングã¯ã€åˆè¨ˆè¡Œã«ãªã‚Šã¾ã™ã?ã§ã€æœ€å¾Œã«è¿½åŠ?—ã¾ã™ã?
627    
628                    // 3.5.6.3 (2004/07/12) ゼロストリングã¯ã€åˆè¨ˆè¡Œã«ãªã‚Šã¾ã™ã?ã§ã€æœ€å¾Œã«è¿½åŠ?—ã¾ã™ã?
629    //              clmKeys = new String[ clmData.size() + 1 ];
630    //              clmKeys = clmData.toArray( clmKeys ) ;
631                    clmKeys = clmData.toArray( new String[clmData.size() + 1] ) ;
632    
633                    clmKeys[clmKeys.length-1] = "" ;
634    
635                    int numberOfColumns =  headCount + clmKeys.length * sumCount ;
636    
637                    DBTableModel tableImpl = DBTableModelUtil.newDBTable();
638                    tableImpl.init( numberOfColumns );
639    
640                    // ヘッãƒ??カラãƒ?ROWãƒ??ã‚¿å«ã‚?ã¯ã€ãã®ã¾ã¾ã€è¨­å®šã—ã¾ã™ã?
641                    for(int column=0; column<headCount; column++) {
642                            tableImpl.setDBColumn( column,table.getDBColumn(column) );
643                    }
644    
645                    // 列情報ã¯ã€åˆè¨ˆå?ã®ã‚«ãƒ©ãƒ?®šç¾©ã‚’使用ã—ã¾ã™ã?
646                    DBColumn[] dbColumn = new DBColumn[sumCount];
647                    for( int i=0; i<sumCount; i++ ) {
648                            dbColumn[i] = table.getDBColumn(headCount + 1 + i);
649                    }
650    
651                    // 列情報ã¯ã€å?ã®åå‰ã‚’カラãƒ??値ã«å¤‰ãˆã¦ã€åˆè¨ˆã‚«ãƒ©ãƒ??ã®ã‚³ãƒ”ã?æƒ??を設定ã—ã¾ã™ã?
652    
653                    int sumId = 0;
654                    ResourceManager resource = getResourceManager();
655                    useHeaderColumn = useHeaderColumn && resource != null ; // 5.2.2.0 (2010/11/01)
656    
657                    // 5.2.2.0 (2010/11/01) useClassAdd 属æ?ã®è¿½åŠ?
658    
659                    clsAdd = new String[numberOfColumns];
660    
661                    // 列情報カラãƒ??ã€ã?ãƒ?ƒ€ãƒ¼åˆ?«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã‚‹ç‚ºã€?–‹å§‹ãŒã€headCount ã‹ã‚‰ã«ãªã‚Šã¾ã™ã?
662                    for(int column=headCount; column<numberOfColumns; column++) {
663                            DBColumn dbClm = dbColumn[sumId];
664                            String clmKey  = clmKeys[ (column-headCount)/sumCount ];
665    
666                            // 5.2.2.0 (2010/11/01) useClassAdd 属æ?ã®è¿½åŠ?
667                            if( useClassAdd ) {
668                                     // ※ 特殊対応:cssãªã©ã§æŒ?®šã§ãã‚‹IDã‚„CLASS属æ?ã¯ã€å?é ­æ–?­—ãŒæ•°å­—ã?å ´åˆã?ã€?
669                                     // 無効ã«ãªã‚Šã¾ã™ã?(ã¤ã¾ã‚Šã?効ãã¾ã›ã‚“ã€?
670                                     // 表示ヘッãƒ??ã¯ã€å¹´æœˆã‚„ã€ç¤¾å“¡ç•ªå·(æ•°å­?ãªã©ã®ã‚±ãƒ¼ã‚¹ã‚‚ã‚りã¾ã™ã?ãã“ã§ã€å?é ­ãŒæ•°å­—ã?
671                                     // å ´åˆã?ã€?x"(å°æ–‡å­—ã?x)ã‚’è?å‹•çš„ã«é ­ã«è¿½åŠ?—ã¾ã™ã?
672                                    StringBuilder buf = new StringBuilder();
673                                    if( clmKey != null && clmKey.length() > 0 ) {
674                                            char ch = clmKey.charAt(0);
675                                            if( ch >= '0' && ch <= '9' ) {
676                                                    buf.append( "x" );
677                                            }
678                                            buf.append( clmKey );
679                                    }
680    
681                                    String nm = dbClm.getName();
682                                    if( nm != null && nm.length() > 0 ) {
683                                            buf.append( " " );
684                                            char ch = nm.charAt(0);
685                                            if( ch >= '0' && ch <= '9' ) {
686                                                    buf.append( "x" );
687                                            }
688                                            buf.append( nm );
689                                    }
690                                    clsAdd[column] = buf.toString();
691                            }
692    
693                            // 4.0.0.0 (2007/11/27)
694    //                      if( resource != null && "true".equalsIgnoreCase( getParam( "useHeaderColumn", null ) ) ) {
695                            // 5.2.2.0 (2010/11/01) 処ç?¦‹ç›´ã—ã?useHeaderColumn ã®å‰å?ã—ã¨ã€setName 対å¿?
696    
697                            // 5.7.4.3 (2014/03/28) useHeaderColumn ã®é©ç”¨æ¡ä»¶ã‚’ã?æœ??ã®é›?¨ˆã‚«ãƒ©ãƒ??ã¿ã«å¤‰æ›´ã€?
698    //                      if( useHeaderColumn ) {
699                            if( useHeaderColumn && sumId == 0 ) {
700    //                              String clmKey = clmKeys[ (column-headCount)/sumCount ]; // 5.2.2.0 (2010/11/01) 上ã«ç§»å‹?
701                                    DBColumn clmTmp = resource.getDBColumn( clmKey );
702                                    if( clmTmp == null ) {
703    //                                      tableImpl.setDBColumn( column,dbColumn[sumId] ); }
704                                            DBColumnConfig dbCfg2 = dbClm.getConfig();
705                                            if( clmKey != null && clmKey.length() > 0 ) {        // 5.2.2.0 (2010/11/01)
706                                                    dbCfg2.setName( clmKey );
707                                                    dbCfg2.setLabelData( resource.getLabelData( clmKey ) );
708                                            }
709                                            else {
710                                                    dbCfg2.setLabelData( resource.getLabelData( gokeiLabel ) );
711                                            }
712                                            dbClm = new DBColumn( dbCfg2 );
713    //                                      tableImpl.setDBColumn( column, new DBColumn( dbCfg2 ) );
714                                    }
715                                    else {
716    //                                      tableImpl.setDBColumn( column,dbClm );
717                                            dbClm = clmTmp;
718                                    }
719                            }
720    //                      else {
721    //                              tableImpl.setDBColumn( column,dbColumn[sumId] );
722    //                      }
723    
724                            tableImpl.setDBColumn( column,dbClm );
725    
726                            sumId++;
727                            if( sumId % sumCount == 0 ) {
728                                    sumId = 0;
729                            }
730                    }
731    
732                    // クロスé›?¨ˆãƒ‡ãƒ¼ã‚¿ã®ä½œæ?
733                    CrossMap cross = new CrossMap( clmKeys,headCount,sumCount );
734                    for( int row=0; row<rowCnt; row++ ) {
735                            String[] data = table.getValues( row );
736                            cross.add( data );
737                    }
738    
739                    // ãƒ??タ部ã®è¨­å®?
740                    int size = cross.getSize();
741                    for( int row=0; row<size; row++ ) {
742                            tableImpl.addValues( cross.get( row ), row );
743                    }
744    
745                    tableImpl.resetModify();
746    
747                    final DBTableModel model ;
748                    if( gokeiSortDir != null ) {
749                            DBTableModelSorter temp = new DBTableModelSorter();
750                            temp.setModel( tableImpl );
751    
752                            boolean direction = Boolean.valueOf( gokeiSortDir ).booleanValue();
753                            temp.sortByColumn( numberOfColumns-1,direction );
754                            model = temp ;
755                    }
756                    else {
757                            model = tableImpl;
758                    }
759                    return model ;
760            }
761    
762            /**
763             * 列ã?ãƒ?ƒ€ãƒ¼ã®ã‚½ãƒ¼ãƒˆæ–¹æ³•ã«å¿œã˜ãŸã?Setオブジェクトを返ã—ã¾ã™ã?
764             * ã“ã“ã§ã¯ã€NUMBER , STRING , LOAD ã®?“種類用æ„ã—ã¦ã?¾ã™ã?
765             *
766             * @og.rev 3.5.6.3 (2004/07/12) æ–°è¦ä½œæ?
767             *
768             * @return      ソート方法ã«å¿œã˜ãŸSetオブジェクãƒ?
769             */
770            private Set<String> gatSortAlgorithmSet() {
771                    final Set<String> rtnSet ;
772    
773                    if( "LOAD".equalsIgnoreCase( cubeSortType ) ) {
774                            rtnSet = new LinkedHashSet<String>();
775                    }
776                    else if( "NUMBER".equalsIgnoreCase( cubeSortType ) ) {
777                            rtnSet = new TreeSet<String>( numberSort );
778                    }
779                    else if( "STRING".equalsIgnoreCase( cubeSortType ) ) {
780                            rtnSet = new TreeSet<String>();
781                    }
782                    else {
783                            String errMsg = "cubeSortType ã¯ã€NUMBER,STRING,LOAD 以外指定ã§ãã¾ã›ã‚“ã€? +
784                                                            "  cubeSortType=[" + cubeSortType + "]";
785                            throw new HybsSystemException( errMsg );
786                    }
787    
788                    return rtnSet ;
789            }
790    
791            /**
792             * 表示ä¸å¯ã‚«ãƒ©ãƒ?ã‚’ã?カンマ区åˆ?‚Šã§ä¸Žãˆã¾ã™ã?
793             * 例�OYA,KO,HJO,SU,DYSET,DYUPD"
794             * null を与ãˆãŸå?åˆã?,ãªã«ã‚‚ã—ã¾ã›ã‚“ã€?
795             *
796             * 注æ„:ã“ã®ã‚¯ãƒ©ã‚¹ã§ã¯ã€DBTableModel を作り直ã™ã‚¿ã‚¤ãƒŸãƒ³ã‚°ãŒã?
797             * create メソãƒ?ƒ‰å®Ÿè¡Œæ™‚ã§ã™ã?(パラメータã®åˆæœŸåŒ–ãŒå¿?¦ãªç‚º)
798             * よã£ã¦ã€ã“ã®ãƒ¡ã‚½ãƒ?ƒ‰ã¯ã€å?期ãŒçµ‚äº?¾Œã«ã€å?ã‚»ãƒ?ƒˆã—ã¾ã™ã?
799             *
800             * @og.rev 3.7.0.4 (2005/03/18) æ–°è¦ä½œæ?
801             *
802             * @param       columnName      カラ�
803             */
804            @Override
805            public void setNoDisplay( final String columnName ) {
806                    noDisplayKeys = columnName;
807            }
808    
809            /**
810             * 表示å¯èƒ½ã‚«ãƒ©ãƒ?ã‚’ã?カンマ区åˆ?‚Šã§ä¸Žãˆã¾ã™ã?
811             * 例�OYA,KO,HJO,SU,DYSET,DYUPD"
812             * setColumnDisplay( int column,boolean rw ) ã®ç°¡æ˜“版ã§ã™ã?
813             * null を与ãˆãŸå?åˆã?,ãªã«ã‚‚ã—ã¾ã›ã‚“ã€?
814             * ã¾ãŸã?全カラãƒ?«ã¤ã?¦ã€æœ‰åйã«ã™ã‚‹å ´åˆã?ã€columnName="*" を設定ã—ã¾ã™ã?
815             *
816             * @og.rev 5.2.2.0 (2010/11/01) æ–°è¦è¿½åŠ?
817             *
818             * @param       columnName      カラ�
819             */
820            @Override
821            public void setColumnDisplay( final String columnName ) {
822                    columnDisplayKeys = columnName;
823            }
824    
825            /**
826             * NUMBER ソート機è?(æ•´æ•°é™å®? å†?ƒ¨ã‚¯ãƒ©ã‚¹
827             * ã“れã¯é€šå¸¸ã®ã‚½ãƒ¼ãƒˆã§ã¯ãªãã?ヘッãƒ??ã«ä½¿ã?ƒ©ãƒ™ãƒ«ã®ã‚½ãƒ¼ãƒˆãªã®ã§ã€?
828             * æ•´æ•°ã®ã¿ã¨é™å®šã—ã¾ã™ã?実数ã®å ´åˆã?ã€æ¡åˆã‚ã›(å°æ•°ç‚¹ä»¥ä¸‹ã?æ¡æ•°)
829             * ã•れã¦ã?‚‹ã¨ã?†å‰æã§ã™ã?
830             *
831             * @og.rev 3.5.6.3 (2004/07/12) æ–°è¦ä½œæ?
832             *
833             */
834            private static final Comparator<String> numberSort = new NumberComparator();
835    
836            private static class NumberComparator implements Comparator<String>,Serializable {
837                    private static final long serialVersionUID = 4000 ;     // 4.0.0 (2005/01/31)
838    
839                    public int compare( final String s1, final String s2 ) {
840                            if( s1.length() > s2.length() )      { return 1;  }
841                            else if( s1.length() < s2.length() ) { return -1; }
842                            else {
843                                    return s1.compareTo( s2 );
844                            }
845                    }
846            }
847    
848            /**
849             * 表示é ?›®ã®ç·¨é›?ä¸¦ã³æ›¿ã?ãŒå¯èƒ½ã‹ã©ã?‹ã‚’è¿”ã—ã¾ã?
850             *
851             * @og.rev 5.1.6.0 (2010/05/01) æ–°è¦è¿½åŠ?
852             *
853             * @return      表示é ?›®ã®ç·¨é›?ä¸¦ã³æ›¿ã?ãŒå¯èƒ½ã‹ã©ã?‹(false:ä¸å¯èƒ½)
854             */
855            @Override
856            public boolean isEditable() {
857                    return false;
858            }
859    }