/******************************************************************************* * Copyright (c) 2013 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.viewers.object.sub.rdb.table; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CellLabelProvider; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.IWorkbenchPartSite; import com.hangum.tadpole.commons.google.analytics.AnalyticCaller; import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine; import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine.OBJECT_TYPE; import com.hangum.tadpole.commons.libs.core.message.CommonMessages; import com.hangum.tadpole.commons.util.AutoResizeTableLayout; import com.hangum.tadpole.commons.util.TadpoleWidgetUtils; import com.hangum.tadpole.engine.define.DBGroupDefine; import com.hangum.tadpole.engine.permission.PermissionChecker; import com.hangum.tadpole.engine.query.dao.mysql.TableColumnDAO; import com.hangum.tadpole.engine.query.dao.mysql.TableDAO; import com.hangum.tadpole.engine.query.dao.system.UserDBDAO; import com.hangum.tadpole.engine.sql.util.tables.TableUtil; import com.hangum.tadpole.rdb.core.Activator; import com.hangum.tadpole.rdb.core.Messages; import com.hangum.tadpole.rdb.core.actions.object.AbstractObjectAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.TableDataEditorAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.generate.GenerateSQLDMLAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.generate.GenerateSQLDeleteAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.generate.GenerateSQLInsertAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.generate.GenerateSQLSelectAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.generate.GenerateSQLUpdateAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.generate.GenerateSampleDataAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.generate.GenerateViewDDLAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.object.ObjectCreatAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.object.ObjectDropAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.object.ObjectExplorerSelectionToEditorAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.object.ObjectRefreshAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.object.ObjectRenameAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.object.TableColumnCreateAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.object.TableRelationAction; import com.hangum.tadpole.rdb.core.dialog.msg.TDBErroDialog; import com.hangum.tadpole.rdb.core.extensionpoint.definition.ITableDecorationExtension; import com.hangum.tadpole.rdb.core.extensionpoint.handler.TableDecorationContributionHandler; import com.hangum.tadpole.rdb.core.util.FindEditorAndWriteQueryUtil; import com.hangum.tadpole.rdb.core.util.GenerateDDLScriptUtils; import com.hangum.tadpole.rdb.core.viewers.object.ExplorerViewer; import com.hangum.tadpole.rdb.core.viewers.object.comparator.ObjectComparator; import com.hangum.tadpole.rdb.core.viewers.object.comparator.TableComparator; import com.hangum.tadpole.rdb.core.viewers.object.sub.AbstractObjectComposite; import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.table.columns.TableColumnComposite; import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.table.constraints.TadpoleConstraintComposite; import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.table.index.TadpoleIndexesComposite; import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.table.trigger.TadpoleTriggerComposite; import com.hangum.tadpole.rdb.core.viewers.object.sub.utils.TadpoleObjectQuery; import com.swtdesigner.ResourceManager; /** * RDB table composite * @author hangum * */ public class TadpoleTableComposite extends AbstractObjectComposite { /** * Logger for this class */ private static final Logger logger = Logger.getLogger(TadpoleTableComposite.class); /** Define table decoration extension */ private ITableDecorationExtension tableDecorationExtension; private CTabItem tbtmTable; /** selected table name */ private String selectTableName = ""; //$NON-NLS-1$ // table info private TableViewer tableListViewer; private List<TableDAO> listTablesDAO = new ArrayList<TableDAO>(); private ObjectComparator tableComparator; private TableFilter tableFilter; private AbstractObjectAction creatAction_Table; private AbstractObjectAction renameAction_Table; private AbstractObjectAction tableRelationAction; private AbstractObjectAction dropAction_Table; private AbstractObjectAction refreshAction_Table; private AbstractObjectAction generateSampleData; private AbstractObjectAction generateDMLAction; private AbstractObjectAction selectStmtAction; private AbstractObjectAction insertStmtAction; private AbstractObjectAction updateStmtAction; private AbstractObjectAction deleteStmtAction; private AbstractObjectAction viewDDLAction; private AbstractObjectAction tableDataEditorAction; private AbstractObjectAction addTableColumnAction; // table column private CTabFolder tabTableFolder; private TableColumnComposite tableColumnComposite; private TadpoleIndexesComposite indexComposite; private TadpoleConstraintComposite constraintsComposite; private TadpoleTriggerComposite triggerComposite; /** * Create the composite. * * @param partSite * @param parent * @param userDB */ public TadpoleTableComposite(IWorkbenchPartSite partSite, final CTabFolder tabFolderObject, UserDBDAO userDB) { super(partSite, tabFolderObject, userDB); createWidget(tabFolderObject); } private void createWidget(final CTabFolder tabFolderObject) { tbtmTable = new CTabItem(tabFolderObject, SWT.NONE); tbtmTable.setText(Messages.get().TadpoleTableComposite_0); tbtmTable.setData(TAB_DATA_KEY, PublicTadpoleDefine.OBJECT_TYPE.TABLES.name()); Composite compositeTables = new Composite(tabFolderObject, SWT.NONE); tbtmTable.setControl(compositeTables); GridLayout gl_compositeTables = new GridLayout(1, false); gl_compositeTables.verticalSpacing = 2; gl_compositeTables.horizontalSpacing = 2; gl_compositeTables.marginHeight = 2; gl_compositeTables.marginWidth = 2; compositeTables.setLayout(gl_compositeTables); compositeTables.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); SashForm sashForm = new SashForm(compositeTables, SWT.NONE); sashForm.setOrientation(SWT.VERTICAL); sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); tableListViewer = new TableViewer(sashForm, /* SWT.VIRTUAL | */ SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI); tableListViewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { if(PublicTadpoleDefine.YES_NO.NO.name().equals(userDB.getIs_showtables())) return; IStructuredSelection is = (IStructuredSelection) event.getSelection(); if (null != is) { TableDAO tableDAO = (TableDAO) is.getFirstElement(); try { // fixed https://github.com/hangum/TadpoleForDBTools/issues/666 // if (selectTableName.equals(tableDAO.getName())) { // String strSQL = GenerateDDLScriptUtils.genTableScript(userDB, tableDAO, showTableColumns); // if(StringUtils.isNotEmpty(strSQL)) { // FindEditorAndWriteQueryUtil.run(userDB, strSQL, PublicTadpoleDefine.OBJECT_TYPE.TABLES); // } // } else { List<TableColumnDAO> tmpTableColumns = TadpoleObjectQuery.getTableColumns(userDB, tableDAO); String strSQL = GenerateDDLScriptUtils.genTableScript(userDB, tableDAO, tmpTableColumns); if(StringUtils.isNotEmpty(strSQL)) { FindEditorAndWriteQueryUtil.run(userDB, strSQL, PublicTadpoleDefine.OBJECT_TYPE.TABLES); } // } } catch(Exception e) { logger.error("table columns", e); //$NON-NLS-1$ } } } }); tableListViewer.addPostSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { if(PublicTadpoleDefine.YES_NO.NO.name().equals(userDB.getIs_showtables())) return; IStructuredSelection is = (IStructuredSelection) tableListViewer.getSelection(); if (!is.isEmpty()) { Object objDAO = is.getFirstElement(); TableDAO tableDao = (TableDAO) objDAO; if (selectTableName.equals(tableDao.getName())) return; // column이 리프레쉬 될때만 selectTableName 값이 갱신되서 인덱스, 제약조건, 트리거 리프레쉬 전에 현재 선택된 테이블명 설정해줌. setSelectTableName(tableDao.getName()); String selTabName = (String)tabTableFolder.getSelection().getData(TAB_DATA_KEY); if(PublicTadpoleDefine.OBJECT_TYPE.INDEXES.name().equals(selTabName)){ // 인덱스 탭이 선택된 상태에서 다른 테이블을 선택할 경우 선택된 테이블에 정의된 인덱스 목록을 표시한다. indexComposite.setTable(userDB, tableDao); }else if(PublicTadpoleDefine.OBJECT_TYPE.CONSTRAINTS.name().equals(selTabName)){ // 테이블에 정의된 제약조건 목록을 표시한다. constraintsComposite.setTable(userDB, tableDao); }else if(PublicTadpoleDefine.OBJECT_TYPE.TRIGGERS.name().equals(selTabName)){ // 테이블에 정의된 트리거 목록을 표시한다. triggerComposite.setTable(userDB, tableDao); }else { tableColumnComposite.refreshTableColumn(tableListViewer); } } } }); Table tableTableList = tableListViewer.getTable(); tableTableList.setLinesVisible(true); tableTableList.setHeaderVisible(true); // sorter tableComparator = new TableComparator(); tableListViewer.setSorter(tableComparator); tableComparator.setColumn(0); // auto table layout AutoResizeTableLayout layoutColumnLayout = new AutoResizeTableLayout(tableListViewer.getTable()); // table decoration extension start... TableDecorationContributionHandler decorationExtension = new TableDecorationContributionHandler(); tableDecorationExtension = decorationExtension.evaluateCreateWidgetContribs(userDB); // table decoration extension end... TableViewerColumn tvColName = new TableViewerColumn(tableListViewer, SWT.NONE); TableColumn tbName = tvColName.getColumn(); tbName.setWidth(100); tbName.setMoveable(true); tbName.setText(Messages.get().TadpoleTableComposite_1); tbName.addSelectionListener(getSelectionAdapter(tableListViewer, tableComparator, tbName, 0)); tvColName.setLabelProvider(new ColumnLabelProvider() { @Override public Image getImage(Object element) { try { TableDAO table = (TableDAO) element; if(tableDecorationExtension != null) { Image extensionImage = tableDecorationExtension.getTableImage(table.getName()); if(extensionImage != null) { Image baseImage = ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/objectExplorer/tables.png"); //$NON-NLS-1$ return ResourceManager.decorateImage(baseImage, extensionImage, ResourceManager.BOTTOM_RIGHT); } else { return ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/objectExplorer/tables.png"); //$NON-NLS-1$; } }else if(StringUtils.contains(table.getTable_type(), "PARTITION")){ return ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/objectExplorer/tables_partition.png"); //$NON-NLS-1$ }else if(StringUtils.equalsIgnoreCase(table.getTable_type(), "IOT")){ return ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/objectExplorer/tables_iot.png"); //$NON-NLS-1$ }else if(StringUtils.contains(table.getTable_type(), "OVERFLOW" )){ return ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/objectExplorer/tables_iot_overflow.png"); //$NON-NLS-1$ }else if(StringUtils.contains(table.getTable_type(), "CSV" )){ return ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/objectExplorer/tables_csv.png"); //$NON-NLS-1$ }else if(StringUtils.contains(table.getTable_type(), "InnoDB" )){ return ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/objectExplorer/tables_inno.png"); //$NON-NLS-1$ }else if(StringUtils.contains(table.getTable_type(), "MyISAM" )){ return ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/objectExplorer/tables_isam.png"); //$NON-NLS-1$ } else { return ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/objectExplorer/tables.png"); //$NON-NLS-1$; } } catch(Exception e) { logger.error("extension point exception " + e.getMessage()); //$NON-NLS-1$ } return null; } @Override public String getText(Object element) { TableDAO table = (TableDAO) element; return table.getName(); } }); tvColName.setEditingSupport(new TableCommentEditorSupport(tableListViewer, userDB, 0)); layoutColumnLayout.addColumnData(new ColumnWeightData(170)); // table column tooltip ColumnViewerToolTipSupport.enableFor(tableListViewer); CellLabelProvider clpTable = new CellLabelProvider() { public String getToolTipText(Object element) { TableDAO table = (TableDAO) element; return table.getComment(); } public Point getToolTipShift(Object object) { return new Point(5, 5); } public int getToolTipDisplayDelayTime(Object object) { return 100; } public int getToolTipTimeDisplayed(Object object) { return 5000; } public void update(ViewerCell cell) { TableDAO table = (TableDAO)cell.getElement(); cell.setText(table.getComment()); } }; TableViewerColumn tvTableComment = new TableViewerColumn(tableListViewer, SWT.NONE); TableColumn tbComment = tvTableComment.getColumn(); tbComment.setWidth(200); tbComment.setMoveable(true); tbComment.setText(Messages.get().Comment); tbComment.addSelectionListener(getSelectionAdapter(tableListViewer, tableComparator, tbComment, 1)); tvTableComment.setLabelProvider(clpTable); tvTableComment.setEditingSupport(new TableCommentEditorSupport(tableListViewer, userDB, 1)); layoutColumnLayout.addColumnData(new ColumnWeightData(200)); CellLabelProvider clpTableType = new CellLabelProvider() { public void update(ViewerCell cell) { TableDAO table = (TableDAO)cell.getElement(); cell.setText(table.getTable_type()); } }; TableViewerColumn tvTableType = new TableViewerColumn(tableListViewer, SWT.NONE); TableColumn tbTabType = tvTableType.getColumn(); tbTabType.setWidth(40); tbTabType.setMoveable(true); tbTabType.setText(Messages.get().TableType); tbTabType.addSelectionListener(getSelectionAdapter(tableListViewer, tableComparator, tbTabType, 1)); tvTableType.setLabelProvider(clpTableType); //tvTableType.setEditingSupport(new TableCommentEditorSupport(tableListViewer, userDB, 1)); layoutColumnLayout.addColumnData(new ColumnWeightData(200)); tableListViewer.getTable().setLayout(layoutColumnLayout); tableListViewer.setContentProvider(new ArrayContentProvider()); tableListViewer.setInput(listTablesDAO); // dnd 기능 추가 Transfer[] transferTypes = new Transfer[]{TextTransfer.getInstance()}; tableListViewer.addDragSupport(DND_OPERATIONS, transferTypes , new TableDragListener(userDB, tableListViewer)); // filter tableFilter = new TableFilter(userDB); tableListViewer.addFilter(tableFilter); createTableMenu(); // columns tabTableFolder = new CTabFolder(sashForm, SWT.NONE); tabTableFolder.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent evt) { if (userDB == null) return; CTabItem ct = (CTabItem)evt.item; IStructuredSelection is = (IStructuredSelection) tableListViewer.getSelection(); if (!is.isEmpty()) { Object objDAO = is.getFirstElement(); TableDAO tableDao = (TableDAO) objDAO; String strSelectItemText = ""+ct.getData(AbstractObjectComposite.TAB_DATA_KEY); if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.COLUMNS.name())) { tableColumnComposite.refreshTableColumn(tableListViewer); } else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.INDEXES.name())) { indexComposite.setTable(userDB, tableDao); } else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.CONSTRAINTS.name())) { constraintsComposite.setTable(userDB, tableDao); } else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.TRIGGERS.name())) { triggerComposite.setTable(userDB, tableDao); } // filterText(); // google analytic AnalyticCaller.track(ExplorerViewer.ID, strSelectItemText); } } }); tabTableFolder.setBorderVisible(false); tabTableFolder.setSelectionBackground(TadpoleWidgetUtils.getTabFolderBackgroundColor(), TadpoleWidgetUtils.getTabFolderPercents()); sashForm.setWeights(new int[] { 1, 1 }); initUI(); } /** * initialize ui */ private void initUI() { createColumns(); if(userDB != null) { if(DBGroupDefine.ALTIBASE_GROUP == userDB.getDBGroup() || DBGroupDefine.CUBRID_GROUP == userDB.getDBGroup() || DBGroupDefine.SQLITE_GROUP == userDB.getDBGroup() || DBGroupDefine.POSTGRE_GROUP == userDB.getDBGroup()) { createIndexes(); createTrigger(); } else if(DBGroupDefine.HIVE_GROUP == userDB.getDBGroup() || DBGroupDefine.TAJO_GROUP == userDB.getDBGroup()) { // do not show them } else { createIndexes(); createConstraints(); createTrigger(); } } tabTableFolder.setSelection(0); } // /** // * 현재 선택된 tab을 리프레쉬합니다. // * // * @param strSelectItemText TabItem text // * @param strObjectName // */ // private void refershSelectObject(String strSelectItemText, String strObjectName) { // // if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.INDEXES.name())) { // refreshIndexes(true, strObjectName); // } else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.CONSTRAINTS.name())) { // refreshConstraints(true, strObjectName); // } else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.TRIGGERS.name())) { // refreshTrigger(true, strObjectName); // // } //// filterText(); // // // google analytic //// AnalyticCaller.track(ExplorerViewer.ID, strSelectItemText); // } // /** * index 정보를 최신으로 갱신 합니다. */ public void refreshIndexes(boolean boolRefresh, String strObjectName) { indexComposite.refreshIndexes(getUserDB(), boolRefresh, strObjectName); } /** * constraints 정보를 최신으로 갱신 합니다. */ public void refreshConstraints(boolean boolRefresh, String strObjectName) { constraintsComposite.refreshConstraints(getUserDB(), boolRefresh, strObjectName); } /** * trigger 정보를 최신으로 갱신 합니다. */ public void refreshTrigger(boolean boolRefresh, String strObjectName) { triggerComposite.refreshTrigger(userDB, boolRefresh, strObjectName); } /** * columm 정의 */ private void createColumns() { tableColumnComposite = new TableColumnComposite(this, tabTableFolder, SWT.NONE); tableColumnComposite.setLayout(new GridLayout(1, false)); } /** * indexes 정의 */ private void createIndexes() { indexComposite = new TadpoleIndexesComposite(getSite(), tabTableFolder, userDB); indexComposite.initAction(); } /** * indexes 정의 */ private void createConstraints() { constraintsComposite = new TadpoleConstraintComposite(getSite(), tabTableFolder, userDB); constraintsComposite.initAction(); } /** * Trigger 정의 */ private void createTrigger() { triggerComposite = new TadpoleTriggerComposite(getSite(), tabTableFolder, userDB); triggerComposite.initAction(); } /** * create Table menu */ private void createTableMenu() { if (getUserDB() == null) return; creatAction_Table = new ObjectCreatAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, Messages.get().TadpoleTableComposite_11); renameAction_Table= new ObjectRenameAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, Messages.get().TadpoleTableComposite_18); tableRelationAction = new TableRelationAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, Messages.get().TadpoleTableComposite_Relation); dropAction_Table = new ObjectDropAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, Messages.get().TadpoleTableComposite_12); refreshAction_Table = new ObjectRefreshAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, CommonMessages.get().Refresh); // generation sample data generateSampleData = new GenerateSampleDataAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, Messages.get().TadpoleTableComposite_14); generateDMLAction = new GenerateSQLDMLAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, "DML"); //$NON-NLS-1$ selectStmtAction = new GenerateSQLSelectAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, "Select"); //$NON-NLS-1$ insertStmtAction = new GenerateSQLInsertAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, "Insert"); //$NON-NLS-1$ updateStmtAction = new GenerateSQLUpdateAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, "Update"); //$NON-NLS-1$ deleteStmtAction = new GenerateSQLDeleteAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, "Delete"); //$NON-NLS-1$ addTableColumnAction = new TableColumnCreateAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, Messages.get().AddColumn); //$NON-NLS-1$ viewDDLAction = new GenerateViewDDLAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, Messages.get().ViewDDL); tableDataEditorAction = new TableDataEditorAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES); // object copy to query editor objectSelectionToEditorAction = new ObjectExplorerSelectionToEditorAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES); // menu final MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$ final DBGroupDefine dbGroup = getUserDB().getDBGroup(); if(DBGroupDefine.HIVE_GROUP == dbGroup || DBGroupDefine.TAJO_GROUP == dbGroup) { if(PermissionChecker.isShow(getUserRoleType(), getUserDB())) { if(!isDDLLock()) { menuMgr.add(creatAction_Table); menuMgr.add(dropAction_Table); menuMgr.add(new Separator()); } } menuMgr.add(refreshAction_Table); menuMgr.add(new Separator()); menuMgr.add(selectStmtAction); // others rdb } else { menuMgr.add(refreshAction_Table); menuMgr.add(new Separator()); if(PermissionChecker.isShow(getUserRoleType(), getUserDB())) { if(!isDDLLock()) { menuMgr.add(creatAction_Table); menuMgr.add(new Separator()); if (DBGroupDefine.ALTIBASE_GROUP != dbGroup) { menuMgr.add(renameAction_Table); if (DBGroupDefine.MYSQL_GROUP == dbGroup) { menuMgr.add(tableRelationAction); } } menuMgr.add(dropAction_Table); menuMgr.add(new Separator()); if (DBGroupDefine.MYSQL_GROUP == dbGroup) { menuMgr.add(addTableColumnAction); menuMgr.add(new Separator()); } } // 현재는 oracle db만 데이터 수정 모드.. if (DBGroupDefine.ORACLE_GROUP == dbGroup) { menuMgr.add(generateSampleData); menuMgr.add(new Separator()); } } menuMgr.add(generateDMLAction); menuMgr.add(new Separator()); menuMgr.add(selectStmtAction); if(PermissionChecker.isShow(getUserRoleType(), getUserDB())) { if(!isInsertLock()) menuMgr.add(insertStmtAction); if(!isUpdateLock()) menuMgr.add(updateStmtAction); if(!isDeleteLock()) menuMgr.add(deleteStmtAction); if (DBGroupDefine.ALTIBASE_GROUP != dbGroup) { menuMgr.add(new Separator()); menuMgr.add(viewDDLAction); } if(!(isInsertLock() || isUpdateLock() || isDeleteLock())) { menuMgr.add(new Separator()); menuMgr.add(tableDataEditorAction); } } } // if rdb menuMgr.add(new Separator()); menuMgr.add(objectSelectionToEditorAction); tableListViewer.getTable().setMenu(menuMgr.createContextMenu(tableListViewer.getTable())); getSite().registerContextMenu(menuMgr, tableListViewer); } /** * 스키마가 변경될 경우 현재 로딩된 목록을 제거한다. */ public void clearList() { if(tableColumnComposite != null) this.tableColumnComposite.clearList(); if(listTablesDAO != null) this.listTablesDAO.clear(); } /** * table 정보를 최신으로 리프레쉬합니다. * * @param selectUserDb * @param boolRefresh * @param strObjectName */ public void refreshTable(final UserDBDAO selectUserDb, final boolean boolRefresh, final String strObjectName) { if(!boolRefresh) if(selectUserDb == null) return; this.userDB = selectUserDb; selectTableName = ""; //$NON-NLS-1$ // 테이블 등록시 테이블 목록 보이지 않는 옵션을 선택했는지. if(PublicTadpoleDefine.YES_NO.NO.name().equals(this.userDB.getIs_showtables())) { listTablesDAO.clear(); listTablesDAO.add(new TableDAO(Messages.get().TadpoleMongoDBCollectionComposite_4, "")); //$NON-NLS-1$ tableListViewer.setInput(listTablesDAO); tableListViewer.refresh(); TableUtil.packTable(tableListViewer.getTable()); return; } listTablesDAO = (List<TableDAO>)selectUserDb.getDBObject(OBJECT_TYPE.TABLES, userDB.getDefaultSchemanName()); if(!(listTablesDAO == null || listTablesDAO.isEmpty())) { tableListViewer.setInput(listTablesDAO); TableUtil.packTable(tableListViewer.getTable()); // select tabitem getTabFolderObject().setSelection(tbtmTable); } else { Job job = new Job(Messages.get().MainEditor_45) { @Override public IStatus run(IProgressMonitor monitor) { monitor.beginTask(MSG_DataIsBeginAcquired, IProgressMonitor.UNKNOWN); try { listTablesDAO = TadpoleObjectQuery.getTableList(userDB); } catch(Exception e) { logger.error("Table Referesh", e); //$NON-NLS-1$ return new Status(Status.WARNING, Activator.PLUGIN_ID, e.getMessage(), e); } finally { monitor.done(); } ///////////////////////////////////////////////////////////////////////////////////////// return Status.OK_STATUS; } }; // job의 event를 처리해 줍니다. job.addJobChangeListener(new JobChangeAdapter() { public void done(IJobChangeEvent event) { final IJobChangeEvent jobEvent = event; final Display display = getSite().getShell().getDisplay(); display.asyncExec(new Runnable() { public void run() { if(jobEvent.getResult().isOK()) { tableListViewer.setInput(listTablesDAO); TableUtil.packTable(tableListViewer.getTable()); // select tabitem getTabFolderObject().setSelection(tbtmTable); selectDataOfTable(strObjectName); } else { if (listTablesDAO != null) listTablesDAO.clear(); tableListViewer.setInput(listTablesDAO); tableListViewer.refresh(); TableUtil.packTable(tableListViewer.getTable()); try { Throwable throwable = jobEvent.getResult().getException(); Throwable cause = throwable.getCause().getCause(); if(cause instanceof ClassNotFoundException) { // admin 이 드라이버를 업로드 해야한다. String msg = String.format(Messages.get().TadpoleTableComposite_driverMsg, userDB.getDbms_type(), throwable.getMessage()); MessageDialog.openError(display.getActiveShell(), Messages.get().TadpoleTableComposite_Drivernotfound, msg); } else { message(Messages.get().TadpoleTableComposite_3, jobEvent.getResult().getMessage()); } } catch(Exception e) { message(Messages.get().TadpoleTableComposite_3, jobEvent.getResult().getMessage()); } } // end else if // 컬럼, 인덱스,제약조건, 트리거 목록 초기화 initializeSubComposite(); } // end run }); // end display.asyncExec } // end done /** * * No more data to read from socket * * @param title * @param msg */ private void message(String title, String msg) { if(StringUtils.contains(msg, "No more data to read from socket")) { TDBErroDialog dialog = new TDBErroDialog(getShell(), Messages.get().TadpoleTableComposite_3, msg + CommonMessages.get().Check_DBAccessSystem); dialog.open(); } else { TDBErroDialog dialog = new TDBErroDialog(getShell(), Messages.get().TadpoleTableComposite_3, msg); dialog.open(); } } }); // end job job.setName(userDB.getDisplay_name()); job.setUser(true); job.schedule(); } } /** * 컬럼, 인덱스, 제약조건, 트리거를 초기화 한다. */ private void initializeSubComposite() { tabTableFolder.setSelection(0); if(tableColumnComposite != null) tableColumnComposite.initAction(); if(indexComposite != null) indexComposite.initAction(); if(constraintsComposite != null) constraintsComposite.initAction(); if(triggerComposite != null) triggerComposite.initAction(); } /** * initialize action */ public void initAction() { if(getUserDB() == null) return; creatAction_Table.setUserDB(getUserDB()); renameAction_Table.setUserDB(getUserDB()); tableRelationAction.setUserDB(getUserDB()); dropAction_Table.setUserDB(getUserDB()); refreshAction_Table.setUserDB(getUserDB()); generateSampleData.setUserDB(getUserDB()); generateDMLAction.setUserDB(getUserDB()); selectStmtAction.setUserDB(getUserDB()); insertStmtAction.setUserDB(getUserDB()); updateStmtAction.setUserDB(getUserDB()); deleteStmtAction.setUserDB(getUserDB()); addTableColumnAction.setUserDB(getUserDB()); viewDDLAction.setUserDB(getUserDB()); tableDataEditorAction.setUserDB(getUserDB()); tableColumnComposite.initAction(); objectSelectionToEditorAction.setUserDB(getUserDB()); } /** * initialize filter text * @param textSearch */ public void filter(String textSearch) { tableFilter.setSearchText(textSearch); tableListViewer.refresh(); } /** * select table * @param tableName */ public void selectTable(String tableName) { Table table = tableListViewer.getTable(); for (int i = 0; i < table.getItemCount(); i++) { if (tableName.equals(table.getItem(i).getText(0))) { tableListViewer.setSelection(new StructuredSelection(tableListViewer.getElementAt(i)), true); } } } /** * get tableviewer * @return */ public TableViewer getTableListViewer() { return tableListViewer; } /** * get table column viewer * @return */ public TableViewer getTableColumnViewer() { return tableColumnComposite.getTableColumnViewer(); } /** * table search * * @param string */ public void setSearchText(String searchText) { tableFilter.setSearchText(searchText); } @Override public void dispose() { super.dispose(); if(creatAction_Table != null) creatAction_Table.dispose(); if(renameAction_Table != null) renameAction_Table.dispose(); if(tableRelationAction != null) tableRelationAction.dispose(); if(dropAction_Table != null) dropAction_Table.dispose(); if(refreshAction_Table != null) refreshAction_Table.dispose(); if(generateSampleData != null) generateSampleData.dispose(); if(generateDMLAction != null) generateDMLAction.dispose(); if(selectStmtAction != null) selectStmtAction.dispose(); if(insertStmtAction != null) insertStmtAction.dispose(); if(updateStmtAction != null) updateStmtAction.dispose(); if(deleteStmtAction != null) deleteStmtAction.dispose(); if(addTableColumnAction != null) addTableColumnAction.dispose(); if(viewDDLAction != null) viewDDLAction.dispose(); if(tableDataEditorAction != null) tableDataEditorAction.dispose(); } @Override public void selectDataOfTable(String strObjectName) { if("".equals(strObjectName) || strObjectName == null) return; tableListViewer.getTable().setFocus(); // find select object and viewer select for(int i=0; i<listTablesDAO.size(); i++) { TableDAO tableDao = (TableDAO)tableListViewer.getElementAt(i); if(tableDao != null && StringUtils.equalsIgnoreCase(strObjectName, tableDao.getName())) { tableListViewer.setSelection(new StructuredSelection(tableListViewer.getElementAt(i)), true); break; } } } /** * select site * @return */ public IWorkbenchPartSite getSite() { return site; } public ITableDecorationExtension getTableDecorationExtension() { return tableDecorationExtension; } public void refreshTableColumn() { tableColumnComposite.refreshTableColumn(getTableListViewer()); } public void setSelectTableName(String tableName) { selectTableName = tableName; } public TadpoleIndexesComposite getIndexComposite() { return indexComposite; } public TadpoleConstraintComposite getConstraintsComposite() { return constraintsComposite; } public TadpoleTriggerComposite getTriggerComposite() { return triggerComposite; } }