/******************************************************************************* * Copyright (c) 2015 hangum. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v2.1 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * * Contributors: * hangum - initial API and implementation ******************************************************************************/ package com.hangum.tadpole.rdb.core.editors.main.composite.resultdetail; import java.io.InputStream; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import com.hangum.tadpole.commons.dialogs.message.TadpoleImageViewDialog; import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine; import com.hangum.tadpole.commons.libs.core.message.CommonMessages; import com.hangum.tadpole.engine.define.DBGroupDefine; import com.hangum.tadpole.engine.query.dao.mysql.TableColumnDAO; import com.hangum.tadpole.engine.query.dao.system.UserDBDAO; import com.hangum.tadpole.engine.query.sql.TadpoleSystem_UserInfoData; import com.hangum.tadpole.engine.sql.util.RDBTypeToJavaTypeUtils; import com.hangum.tadpole.engine.sql.util.resultset.QueryExecuteResultDTO; import com.hangum.tadpole.engine.sql.util.resultset.TadpoleResultSet; import com.hangum.tadpole.engine.sql.util.tables.SQLResultFilter; import com.hangum.tadpole.engine.sql.util.tables.SQLResultSorter; import com.hangum.tadpole.engine.sql.util.tables.TableUtil; import com.hangum.tadpole.engine.utils.EditorDefine; import com.hangum.tadpole.engine.utils.RequestQuery; import com.hangum.tadpole.mongodb.core.dialogs.msg.TadpoleSimpleMessageDialog; import com.hangum.tadpole.preference.define.GetAdminPreference; import com.hangum.tadpole.preference.define.PreferenceDefine; import com.hangum.tadpole.preference.get.GetPreferenceGeneral; import com.hangum.tadpole.rdb.core.Messages; import com.hangum.tadpole.rdb.core.actions.resultView.ColumnRowDataDialogAction; import com.hangum.tadpole.rdb.core.actions.resultView.OpenSingleRowDataDialogAction; import com.hangum.tadpole.rdb.core.actions.resultView.SelectColumnToEditorAction; import com.hangum.tadpole.rdb.core.actions.resultView.SelectRowToEditorAction; import com.hangum.tadpole.rdb.core.dialog.msg.TDBClipboardDialog; import com.hangum.tadpole.rdb.core.editors.main.composite.ResultSetComposite; import com.hangum.tadpole.rdb.core.editors.main.composite.direct.SQLResultLabelProvider; import com.hangum.tadpole.rdb.core.editors.main.composite.plandetail.mysql.MySQLExtensionViewDialog; import com.hangum.tadpole.rdb.core.editors.main.composite.plandetail.mysql.MySQLExtensionViewDialog.MYSQL_EXTENSION_VIEW; import com.hangum.tadpole.rdb.core.editors.main.composite.tail.ResultTailComposite; import com.hangum.tadpole.rdb.core.editors.main.utils.TableToDataUtils; import com.hangum.tadpole.rdb.core.extensionpoint.definition.IMainEditorExtension; import com.hangum.tadpole.rdb.core.util.QueryResultSaved; import com.hangum.tadpole.session.manager.SessionManager; import com.swtdesigner.SWTResourceManager; /** * Table result type * * @author hangum * */ public class ResultTableComposite extends AbstractResultDetailComposite { /** Logger for this class. */ private static final Logger logger = Logger.getLogger(ResultTableComposite.class); /** 이미 결과를 마지막까지 그렸는지 유무 */ private PublicTadpoleDefine.BASIC_STATUS STATUS_LastReadData = PublicTadpoleDefine.BASIC_STATUS.NONE;; private Text textFilter; private TableViewer tvQueryResult; private SQLResultFilter sqlFilter = new SQLResultFilter(); private SQLResultSorter sqlSorter; // 결과 로우 지정. private SelectRowToEditorAction selectRowToEditorAction; private SelectColumnToEditorAction selectColumntoEditorAction; private OpenSingleRowDataDialogAction openSingleRowDataAction; private ColumnRowDataDialogAction columnRowDataDialogAction; /** mysql profilling yn */ private Button btnShowQueryProfilling; private Button btnResultRowToEditor; private Button btnResultColumnToEditor; private Button btnDetailView; private Button btnColumnDetail; private Composite compositeHead; /** * Create the composite. * @param parent * @param style * @param rdbResultComposite */ public ResultTableComposite(Composite parent, int style, ResultSetComposite rdbResultComposite) { super(parent, style, rdbResultComposite); setLayout(new GridLayout(1, false)); GridData gd_compositeBody = new GridData(SWT.FILL, SWT.TOP, true, true, 1, 1); setLayoutData(gd_compositeBody); Composite compositeBody = new Composite(this, SWT.NONE); compositeBody.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); GridLayout gl_compositeBody = new GridLayout(1, false); gl_compositeBody.verticalSpacing = 2; gl_compositeBody.horizontalSpacing = 2; gl_compositeBody.marginHeight = 0; gl_compositeBody.marginWidth = 2; compositeBody.setLayout(gl_compositeBody); compositeHead = new Composite(compositeBody, SWT.NONE); GridLayout gl_compositeHead = new GridLayout(2, false); gl_compositeHead.verticalSpacing = 2; gl_compositeHead.horizontalSpacing = 2; gl_compositeHead.marginHeight = 0; gl_compositeHead.marginWidth = 2; compositeHead.setLayout(gl_compositeHead); compositeHead.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Label lblFilter = new Label(compositeHead, SWT.NONE); lblFilter.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); lblFilter.setText(CommonMessages.get().Filter); textFilter = new Text(compositeHead,SWT.SEARCH | SWT.ICON_SEARCH | SWT.ICON_CANCEL); textFilter.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); textFilter.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if(e.keyCode == SWT.Selection) { setFilter(); } } }); // SWT.VIRTUAL 일 경우 FILTER를 적용하면 데이터가 보이지 않는 오류수정. tvQueryResult = new TableViewer(compositeBody, /* SWT.VIRTUAL | */ SWT.MULTI | SWT.BORDER ); //| SWT.FULL_SELECTION final Table tableResult = tvQueryResult.getTable(); GridData gd_tableResult = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1); gd_tableResult.heightHint = 90; tableResult.setLayoutData(gd_tableResult); final String PREFERENCE_USER_FONT = GetPreferenceGeneral.getRDBResultFont(); if(!"".equals(PREFERENCE_USER_FONT)) { //$NON-NLS-1$ try { String[] arryFontInfo = StringUtils.split(PREFERENCE_USER_FONT, "|"); //$NON-NLS-1$ tableResult.setFont(SWTResourceManager.getFont(arryFontInfo[0], Integer.parseInt(arryFontInfo[1]), Integer.parseInt(arryFontInfo[2]))); } catch(Exception e) { logger.error("Fail setting the user font", e); //$NON-NLS-1$ } } // // 더블클릭시 에디터에 데이터를 넣어준다. // tvQueryResult.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { selectColumnToEditor(); } }); tableResult.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { if(e.stateMask == 0) return; if(e.stateMask == SWT.CTRL && e.keyCode == 'c') { openSinglColumViewDialog(); } else if(e.stateMask == SWT.COMMAND && e.keyCode == 'c') { openSinglColumViewDialog(); } } }); tableResult.addListener(SWT.MouseDown, new Listener() { public void handleEvent(final Event event) { TableItem[] selection = tableResult.getSelection(); if (selection.length != 1) return; eventTableSelect = event; final TableItem item = tableResult.getSelection()[0]; for (int i=0; i<tableResult.getColumnCount(); i++) { if (item.getBounds(i).contains(event.x, event.y)) { Map<Integer, Object> mapColumns = getRsDAO().getDataList().getData().get(tableResult.getSelectionIndex()); // execute extension start =============================== IMainEditorExtension[] extensions = getRdbResultComposite().getRdbResultComposite().getMainEditor().getMainEditorExtions(); for (IMainEditorExtension iMainEditorExtension : extensions) { iMainEditorExtension.resultSetClick(i, mapColumns); } break; } } // for column count } }); tableResult.setLinesVisible(true); tableResult.setHeaderVisible(true); createResultMenu(); sqlFilter.setTable(tableResult); // single column select start // TableUtil.makeSelectSingleColumn(tvQueryResult); // single column select end tableResult.getVerticalBar().addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { calcTableData(); } }); tableResult.addListener(SWT.Resize, new Listener() { @Override public void handleEvent(Event event) { calcTableData(); } }); // bottom composite group Composite compositeBtn = new Composite(compositeBody, SWT.NONE); compositeBtn.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); GridLayout gl_compositeBtn = new GridLayout(7, false); gl_compositeBtn.verticalSpacing = 2; gl_compositeBtn.horizontalSpacing = 2; gl_compositeBtn.marginWidth = 0; gl_compositeBtn.marginHeight = 2; compositeBtn.setLayout(gl_compositeBtn); // mysql, maria 일 경우 버튼에 프로파일 버튼을 붙인다. final UserDBDAO userDB = rdbResultComposite.getUserDB(); if(DBGroupDefine.MYSQL_GROUP == userDB.getDBGroup()) { final Button btnQueryProfilling = new Button(compositeBtn, SWT.CHECK); btnQueryProfilling.setText(Messages.get().WhetherProfile); btnQueryProfilling.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { try { boolean booleanQueryProfilling = btnQueryProfilling.getSelection(); TadpoleSystem_UserInfoData.updateUserInfoData(PreferenceDefine.RDB_QUERY_PROFILLING, ""+booleanQueryProfilling); SessionManager.setUserInfo(PreferenceDefine.RDB_QUERY_PROFILLING, ""+booleanQueryProfilling); btnShowQueryProfilling.setEnabled(booleanQueryProfilling); } catch(Exception ee) { logger.error("Update RDB query profilling option", ee); } } }); btnQueryProfilling.setSelection(GetPreferenceGeneral.getRDBQueryProfilling()); btnShowQueryProfilling = new Button(compositeBtn, SWT.NONE); btnShowQueryProfilling.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { // rsDAO의 결과가 없을 경우에 처리 할것 Object obj = rsDAO.getMapExtendResult().get(MYSQL_EXTENSION_VIEW.SHOW_PROFILLING.name()); if(obj != null) { MySQLExtensionViewDialog profileDialog = new MySQLExtensionViewDialog(getShell(), reqQuery, rsDAO); profileDialog.open(); } else { MessageDialog.openWarning(getShell(), CommonMessages.get().Warning, Messages.get().DoNotShowProfileResult); } } }); btnShowQueryProfilling.setText(Messages.get().ShowProfileResult); btnShowQueryProfilling.setEnabled(GetPreferenceGeneral.getRDBQueryProfilling()); } // end mysql profile btnResultRowToEditor = new Button(compositeBtn, SWT.NONE); btnResultRowToEditor.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { selectRowToEditor(); } }); btnResultRowToEditor.setText(Messages.get().ResultSetComposite_row_to_editor); btnResultColumnToEditor = new Button(compositeBtn, SWT.NONE); btnResultColumnToEditor.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { selectColumnToEditor(); } }); btnResultColumnToEditor.setText(Messages.get().ResultSetComposite_column_to_editor); btnDetailView = new Button(compositeBtn, SWT.NONE); GridData gd_btnDetailView = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gd_btnDetailView.widthHint = 80; btnDetailView.setLayoutData(gd_btnDetailView); btnDetailView.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { openSingleRecordViewDialog(); } }); btnDetailView.setText(Messages.get().ResultSetComposite_0); btnColumnDetail = new Button(compositeBtn, SWT.NONE); btnColumnDetail.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { openSinglColumViewDialog(); } }); btnColumnDetail.setText(Messages.get().ResultSetComposite_btnColumnDetail_text); btnColumnDetail.setEnabled("YES".equals(userDB.getIs_resource_download())); compositeTail = new ResultTailComposite(rdbResultComposite.getUserDB(), this, compositeBtn, SWT.NONE); compositeTail.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 2)); GridLayout gl_compositeResult = new GridLayout(1, false); gl_compositeResult.verticalSpacing = 2; gl_compositeResult.horizontalSpacing = 2; gl_compositeResult.marginHeight = 0; gl_compositeResult.marginWidth = 2; compositeTail.setLayout(gl_compositeResult); } /** * 선택행을 에디터로 보낸다. */ public void selectRowToEditor() { TableColumnDAO columnDao = findSelectRowData(); if(columnDao == null) { MessageDialog.openWarning(getShell(), CommonMessages.get().Warning, Messages.get().PleaseSelectRowData); return; } appendTextAtPosition(StringUtils.replace(""+columnDao.getCol_value(), PublicTadpoleDefine.DELIMITER_DBL, ",")); //$NON-NLS-1$ } /** * 선택 컬럼을 에디터로 보낸다. */ public void selectColumnToEditor() { TableColumnDAO columnDao = findSelectColumnData(); if(columnDao == null) { MessageDialog.openWarning(getShell(), CommonMessages.get().Warning, Messages.get().PleaseSelectRowData); return; } String strData = StringUtils.replace(""+columnDao.getCol_value(), PublicTadpoleDefine.DELIMITER_DBL, ","); if(!"".equals(columnDao.getCol_value())) { //$NON-NLS-1$ if(PublicTadpoleDefine.DEFINE_TABLE_COLUMN_BASE_ZERO.equals(columnDao.getName())) { appendTextAtPosition(strData); //$NON-NLS-1$ } else { if(GetPreferenceGeneral.getAddComma()) { if(RDBTypeToJavaTypeUtils.isNumberType(columnDao.getType())) { appendTextAtPosition(strData + ", "); } else { appendTextAtPosition(String.format(" '%s', ", strData)); //$NON-NLS-1$ } } else { if(RDBTypeToJavaTypeUtils.isNumberType(columnDao.getType())) { appendTextAtPosition(strData + " "); } else { appendTextAtPosition(String.format(" '%s' ", strData)); //$NON-NLS-1$ } } } } } /** * select table column to editor */ private TableColumnDAO findSelectRowData() { if(eventTableSelect == null) return null; final Table tableResult = tvQueryResult.getTable(); TableItem[] selection = tableResult.getSelection(); if (selection.length == 1) { TableColumnDAO columnDao = new TableColumnDAO(); TableItem item = tableResult.getSelection()[0]; for (int i=0; i<tableResult.getColumnCount(); i++) { if (item.getBounds(i).contains(eventTableSelect.x, eventTableSelect.y)) { Map<Integer, Object> mapColumns = getRsDAO().getDataList().getData().get(tableResult.getSelectionIndex()); // execute extension start =============================== IMainEditorExtension[] extensions = getRdbResultComposite().getRdbResultComposite().getMainEditor().getMainEditorExtions(); for (IMainEditorExtension iMainEditorExtension : extensions) { iMainEditorExtension.resultSetDoubleClick(i, mapColumns); } // execute extension stop =============================== // 첫번째 컬럼이면 전체 로우의 데이터를 상세하게 뿌려줍니 columnDao = TableToDataUtils.getTableRowData(tableResult, mapColumns, getRsDAO().getColumnType()); break; } // for column index } // end for return columnDao; } else { return TableToDataUtils.getTableRowDatas(tableResult, getRsDAO().getDataList(), getRsDAO().getColumnType()); } } /** * select table column to editor */ private TableColumnDAO findSelectColumnData() { if(eventTableSelect == null) return null; final Table tableResult = tvQueryResult.getTable(); TableItem[] selection = tableResult.getSelection(); if (selection.length == 1) { TableColumnDAO columnDao = new TableColumnDAO(); TableItem item = tableResult.getSelection()[0]; for (int i=0; i<tableResult.getColumnCount(); i++) { if (item.getBounds(i).contains(eventTableSelect.x, eventTableSelect.y)) { Map<Integer, Object> mapColumns = getRsDAO().getDataList().getData().get(tableResult.getSelectionIndex()); // execute extension start =============================== IMainEditorExtension[] extensions = getRdbResultComposite().getRdbResultComposite().getMainEditor().getMainEditorExtions(); for (IMainEditorExtension iMainEditorExtension : extensions) { iMainEditorExtension.resultSetDoubleClick(i, mapColumns); } // execute extension stop =============================== // 첫번째 컬럼이면 전체 로우의 데이터를 상세하게 뿌려줍니 if(i == 0) { columnDao = TableToDataUtils.getTableRowData(tableResult, mapColumns, getRsDAO().getColumnType()); } else { columnDao = TableToDataUtils.getTableData(mapColumns.get(i), getRsDAO().getColumnType().get(i), getRsDAO().getColumnName().get(i)); } // end if first column break; } // for column index } // end for return columnDao; } else { return TableToDataUtils.getTableRowDatas(tableResult, getRsDAO().getDataList(), getRsDAO().getColumnType()); } } /** * Open Single recode view. * Just view detail data. */ private void openSingleRecordViewDialog() { // selection sevice를 이용할 수 없어 중복되는 코드 생성이 필요해서 작성. openSingleRowDataAction.selectionChanged(getRsDAO(), tvQueryResult.getSelection()); if (openSingleRowDataAction.isEnabled()) { openSingleRowDataAction.run(); } else { MessageDialog.openWarning(getShell(), CommonMessages.get().Warning, Messages.get().ResultSetComposite_8); } } /** * column popup dialog */ public void openSinglColumViewDialog() { TableColumnDAO columnDao = findSelectColumnData(); if(columnDao == null) { MessageDialog.openWarning(getShell(), CommonMessages.get().Warning, Messages.get().ResultSetComposite_6); return; } String strType = columnDao.getType(); String strData = StringUtils.replace(""+columnDao.getCol_value(), PublicTadpoleDefine.DELIMITER_DBL, ","); //$NON-NLS-1$ if("JSON".equalsIgnoreCase(strType)) { //$NON-NLS-1$ TadpoleSimpleMessageDialog dialog = new TadpoleSimpleMessageDialog(getShell(), Messages.get().ResultSetComposite_16, strData); dialog.open(); } else if("BLOB".equalsIgnoreCase(strType)) { //$NON-NLS-1$ if (columnDao.getCol_value() instanceof String){ TDBClipboardDialog dialog = new TDBClipboardDialog(getShell(), Messages.get().ResultSetComposite_16, strData); dialog.open(); }else{ TadpoleImageViewDialog dlg = new TadpoleImageViewDialog(getShell(), Messages.get().ResultSetComposite_16, (InputStream)columnDao.getCol_value()); dlg.open(); } } else { TDBClipboardDialog dialog = new TDBClipboardDialog(getShell(), Messages.get().ResultSetComposite_16, ""+columnDao.getCol_value()); dialog.open(); } // 다이얼로그 화면이 닫히면 에디터에 포커스가 위치된다. rdbResultComposite.getRdbResultComposite().getMainEditor().setFocus(); } /** * tvQueryResult 테이블 뷰어에 메뉴 추가하기 */ private void createResultMenu() { openSingleRowDataAction = new OpenSingleRowDataDialogAction(); selectRowToEditorAction = new SelectRowToEditorAction(this); selectColumntoEditorAction = new SelectColumnToEditorAction(this); columnRowDataDialogAction = new ColumnRowDataDialogAction(this); // menu final MenuManager menuMgr = new MenuManager("#PopupMenu", "ResultSet"); //$NON-NLS-1$ //$NON-NLS-2$ menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { @Override public void menuAboutToShow(IMenuManager manager) { manager.add(selectRowToEditorAction); manager.add(selectColumntoEditorAction); manager.add(openSingleRowDataAction); manager.add(columnRowDataDialogAction); } }); tvQueryResult.getTable().setMenu(menuMgr.createContextMenu(tvQueryResult.getTable())); // // 본 Composite는 Editor에서 최초 생성되는데, 에디터가 site()에 등록되지 않은 상태에서 // selection service에 접근할 수 없어서 임시로 selection 이벤트가 발생할때마다 // 직접 action selection 메소드를 호출하도록 수정함. // 또한, 쿼리 실행할 때 마다 rsDAO 값도 변경되므로, selectoin이 변경될때 마다 같이 // 전달해 준다. tvQueryResult.addSelectionChangedListener(new ISelectionChangedListener() { // private boolean update; // private ISelection lastSelection; @Override public void selectionChanged(SelectionChangedEvent event) { openSingleRowDataAction.selectionChanged(getRsDAO(), event.getSelection()); selectRowToEditorAction.selectionChanged(event.getSelection()); selectColumntoEditorAction.selectionChanged(event.getSelection()); columnRowDataDialogAction.selectionChanged(event.getSelection()); // if (event.getSelection().isEmpty() && !update) { // update = true; // v.setSelection(lastSelection); // update = false; // } else if (!event.getSelection().isEmpty()) { // lastSelection = event.getSelection(); // } } }); } /** * scroll data에 맞게 데이터를 출력합니다. */ private void calcTableData() { if(getRsDAO() == null) return; if(STATUS_LastReadData == PublicTadpoleDefine.BASIC_STATUS.DONE || STATUS_LastReadData == PublicTadpoleDefine.BASIC_STATUS.START) return; final Table tableResult = tvQueryResult.getTable(); int tableRowCnt = tableResult.getBounds().height / tableResult.getItemHeight(); // 만약에(테이블 위치 인덱스 + 테이블에 표시된로우 수 + 1) 보다 전체 아이템 수가 크면). if( (tableResult.getTopIndex() + tableRowCnt + 1) > tableResult.getItemCount()) { final TadpoleResultSet oldTadpoleResultSet = getRsDAO().getDataList(); final int intPageCnt = GetPreferenceGeneral.getPageCount(); if(oldTadpoleResultSet.getData().size() >= intPageCnt) { if(logger.isDebugEnabled()) { logger.debug("####11111###### [tableResult.getItemCount()]" + oldTadpoleResultSet.getData().size() +":"+tableResult.getItemCount() + ":" + GetPreferenceGeneral.getPageCount()); } if(oldTadpoleResultSet.getData().size() >= tableResult.getItemCount()) { STATUS_LastReadData = PublicTadpoleDefine.BASIC_STATUS.START; // 나머지 데이터를 가져온다. final String strUserEmail = SessionManager.getEMAIL(); final int queryTimeOut = GetPreferenceGeneral.getQueryTimeOut(); try { QueryExecuteResultDTO newRsDAO = getRdbResultComposite().runSelect(reqQuery, queryTimeOut, strUserEmail, intPageCnt * 4, oldTadpoleResultSet.getData().size()); if(logger.isDebugEnabled()) logger.debug("==> old count is " + oldTadpoleResultSet.getData().size() ); /** 쿼리 결과를 저장합니다 */ if(PublicTadpoleDefine.YES_NO.YES.name().equals(rsDAO.getUserDB().getIs_result_save())) { QueryResultSaved.queryResult(GetAdminPreference.getQueryResultSaved() + PublicTadpoleDefine.DIR_SEPARATOR + SessionManager.getUserSeq(), ""+longHistorySeq, newRsDAO); } oldTadpoleResultSet.getData().addAll(newRsDAO.getDataList().getData()); tvQueryResult.setInput(oldTadpoleResultSet.getData()); compositeTail.execute(getTailResultMsg()); tvQueryResult.getTable().setToolTipText(getTailResultMsg()); if(newRsDAO.getDataList().getData().isEmpty()) { STATUS_LastReadData = PublicTadpoleDefine.BASIC_STATUS.DONE; } else { STATUS_LastReadData = PublicTadpoleDefine.BASIC_STATUS.NONE; } } catch(Exception e) { STATUS_LastReadData = PublicTadpoleDefine.BASIC_STATUS.DONE; logger.error("continue result set : " + e.getMessage()); } } else { tvQueryResult.setInput(oldTadpoleResultSet.getData()); } } } } /** * 필터를 설정합니다. */ private void setFilter() { sqlFilter.setFilter(textFilter.getText()); tvQueryResult.addFilter( sqlFilter ); } public void appendTextAtPosition(String cmd) { getRdbResultComposite().getRdbResultComposite().appendTextAtPosition(cmd); } @Override public void dispose() { if(openSingleRowDataAction != null) openSingleRowDataAction.dispose(); if(selectRowToEditorAction != null) selectRowToEditorAction.dispose(); if(selectColumntoEditorAction != null) selectColumntoEditorAction.dispose(); if(columnRowDataDialogAction != null) columnRowDataDialogAction.dispose(); super.dispose(); } @Override public void initUI() { if(this.isDisposed()) return; this.layout(); this.sqlFilter.setFilter(""); //$NON-NLS-1$ this.textFilter.setText(""); //$NON-NLS-1$ } @Override public void printUI(RequestQuery reqQuery, QueryExecuteResultDTO rsDAO, boolean isMakePin, long longHistorySeq) { if(rsDAO == null) return; if(rsDAO.getDataList() == null) return; STATUS_LastReadData = PublicTadpoleDefine.BASIC_STATUS.NONE; super.printUI(reqQuery, rsDAO, isMakePin, longHistorySeq); final TadpoleResultSet trs = rsDAO.getDataList(); sqlSorter = new SQLResultSorter(-999); boolean isEditable = true; if("".equals(rsDAO.getColumnTableName().get(1))) isEditable = false; //$NON-NLS-1$ SQLResultLabelProvider.createTableColumn(this, reqQuery, tvQueryResult, rsDAO, sqlSorter, strResultSetHeadClicks, isEditable); // 연속 쿼리 실행시 쿼리 스크롤이 최 상위로 가도록 테이블 인덱스를 수정. 이렇게 하지 않으면 쿼리 결과가 많을 경우 제일 하단으로 가서 쿼리를 여러번 호출할 여지가 있습니다. tvQueryResult.getTable().setTopIndex(0); tvQueryResult.setLabelProvider(new SQLResultLabelProvider(reqQuery.getMode(), rsDAO)); tvQueryResult.setContentProvider(new ArrayContentProvider()); // 쿼리를 설정한 사용자가 설정 한 만큼 보여준다. if(trs.getData().size() > GetPreferenceGeneral.getPageCount()) { tvQueryResult.setInput(trs.getData().subList(0, GetPreferenceGeneral.getPageCount())); } else { tvQueryResult.setInput(trs.getData()); } tvQueryResult.setSorter(sqlSorter); // 메시지를 출력합니다. compositeTail.execute(getTailResultMsg()); tvQueryResult.getTable().setToolTipText(getTailResultMsg()); sqlFilter.setTable(tvQueryResult.getTable()); // Pack the columns TableUtil.packTable(tvQueryResult.getTable()); getRdbResultComposite().getRdbResultComposite().resultFolderSel(EditorDefine.RESULT_TAB.RESULT_SET); } @Override public RESULT_COMP_TYPE getResultType() { return RESULT_COMP_TYPE.Table; } }