/******************************************************************************* * 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.index; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.viewers.ArrayContentProvider; 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.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.custom.SashForm; 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.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.ui.IWorkbenchPartSite; import com.hangum.tadpole.commons.exception.dialog.ExceptionDetailsErrorDialog; 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.manager.TadpoleSQLManager; import com.hangum.tadpole.engine.permission.PermissionChecker; import com.hangum.tadpole.engine.query.dao.mysql.InformationSchemaDAO; 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.SQLUtil; 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.rdb.object.ObjectCreatAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.object.ObjectDropAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.object.ObjectRefreshAction; import com.hangum.tadpole.rdb.core.viewers.object.comparator.DefaultComparator; import com.hangum.tadpole.rdb.core.viewers.object.comparator.IndexColumnComparator; import com.hangum.tadpole.rdb.core.viewers.object.comparator.ObjectComparator; import com.hangum.tadpole.rdb.core.viewers.object.sub.AbstractObjectComposite; import com.ibatis.sqlmap.client.SqlMapClient; /** * RDB indexes composite * * @author hangum * */ public class TadpoleIndexesComposite extends AbstractObjectComposite { /** * Logger for this class */ private static final Logger logger = Logger.getLogger(TadpoleIndexesComposite.class); private CTabItem tbtmIndex; private TableDAO tableDao; private String selectIndexName = ""; //$NON-NLS-1$ // index private TableViewer indexTableViewer; private ObjectComparator indexComparator; private List<InformationSchemaDAO> listIndexes = new ArrayList<InformationSchemaDAO>(); private IndexesViewFilter indexFilter; // column info private TableViewer indexColumnViewer; private ObjectComparator indexColumnComparator; private List<InformationSchemaDAO> showIndexColumns = new ArrayList<InformationSchemaDAO>(); private ObjectCreatAction creatAction_Index; private ObjectDropAction dropAction_Index; private ObjectRefreshAction refreshAction_Index; // private GenerateViewDDLAction viewDDLAction; /** * indexes info * * @param site * @param tabFolderObject * @param userDB */ public TadpoleIndexesComposite(IWorkbenchPartSite site, CTabFolder tabFolderObject, UserDBDAO userDB) { super(site, tabFolderObject, userDB); createWidget(tabFolderObject); } private void createWidget(final CTabFolder tabFolderObject) { tbtmIndex = new CTabItem(tabFolderObject, SWT.NONE); tbtmIndex.setText(Messages.get().Indexes); tbtmIndex.setData(TAB_DATA_KEY, PublicTadpoleDefine.OBJECT_TYPE.INDEXES.name()); Composite compositeIndexes = new Composite(tabFolderObject, SWT.NONE); tbtmIndex.setControl(compositeIndexes); GridLayout gl_compositeIndexes = new GridLayout(1, false); gl_compositeIndexes.verticalSpacing = 2; gl_compositeIndexes.horizontalSpacing = 2; gl_compositeIndexes.marginHeight = 2; gl_compositeIndexes.marginWidth = 2; compositeIndexes.setLayout(gl_compositeIndexes); SashForm sashForm = new SashForm(compositeIndexes, SWT.NONE); sashForm.setOrientation(SWT.VERTICAL); sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); // SWT.VIRTUAL 일 경우 FILTER를 적용하면 데이터가 보이지 않는 오류수정. indexTableViewer = new TableViewer(sashForm, /* SWT.VIRTUAL | */ SWT.BORDER | SWT.FULL_SELECTION); indexTableViewer.addPostSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { // 인덱스 디테일한 정보를 확인할동안은 블럭으로 만들어 놓습니다. if(DBGroupDefine.SQLITE_GROUP == userDB.getDBGroup()) return; if(PublicTadpoleDefine.YES_NO.NO.name().equals(userDB.getIs_showtables())) return; // 테이블의 컬럼 목록을 출력합니다. try { IStructuredSelection is = (IStructuredSelection) event.getSelection(); Object tableDAO = is.getFirstElement(); if (tableDAO != null) { InformationSchemaDAO index = (InformationSchemaDAO) tableDAO; if (selectIndexName.equals(index.getINDEX_NAME())) return; selectIndexName = index.getINDEX_NAME(); SqlMapClient sqlClient = TadpoleSQLManager.getInstance(userDB); HashMap<String, String>paramMap = new HashMap<String, String>(); paramMap.put("table_schema", index.getTABLE_SCHEMA()); //$NON-NLS-1$ paramMap.put("table_name", index.getTABLE_NAME()); //$NON-NLS-1$ paramMap.put("index_name", index.getINDEX_NAME()); //$NON-NLS-1$ showIndexColumns = sqlClient.queryForList("indexDetailList", paramMap); //$NON-NLS-1$ } else { showIndexColumns = new ArrayList<InformationSchemaDAO>(); } indexColumnViewer.setInput(showIndexColumns); indexColumnViewer.refresh(); TableUtil.packTable(indexColumnViewer.getTable()); } catch (Exception e) { logger.error("get table column", e); //$NON-NLS-1$ Status errStatus = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e); //$NON-NLS-1$ ExceptionDetailsErrorDialog.openError(tabFolderObject.getShell(),CommonMessages.get().Error, e.getMessage(), errStatus); //$NON-NLS-1$ } } }); Table tableTableList = indexTableViewer.getTable(); tableTableList.setLinesVisible(true); tableTableList.setHeaderVisible(true); indexComparator = new DefaultComparator(); indexTableViewer.setSorter(indexComparator); createIndexesColumn(indexTableViewer, indexComparator); indexTableViewer.setLabelProvider(new IndexesLabelProvicer()); indexTableViewer.setContentProvider(new ArrayContentProvider()); indexFilter = new IndexesViewFilter(); indexTableViewer.addFilter(indexFilter); // columns indexColumnViewer = new TableViewer(sashForm, /* SWT.VIRTUAL | */ SWT.BORDER | SWT.FULL_SELECTION); Table tableTableColumn = indexColumnViewer.getTable(); tableTableColumn.setHeaderVisible(true); tableTableColumn.setLinesVisible(true); indexColumnComparator = new IndexColumnComparator(); indexColumnViewer.setSorter(indexColumnComparator); indexColumnComparator.setColumn(0); createIndexColumne(indexColumnViewer); indexColumnViewer.setContentProvider(new ArrayContentProvider()); indexColumnViewer.setLabelProvider(new IndexColumnLabelprovider()); createMenu(); // index detail column sashForm.setWeights(new int[] { 1, 1 }); } /** * selection adapter * * @param indexColumn * @param index * @return */ private SelectionAdapter getSelectionAdapter(final TableViewerColumn indexColumn, final int index) { SelectionAdapter selectionAdapter = new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { indexColumnComparator.setColumn(index); indexColumnViewer.getTable().setSortDirection(indexColumnComparator.getDirection()); indexColumnViewer.getTable().setSortColumn(indexColumn.getColumn()); indexColumnViewer.refresh(); } }; return selectionAdapter; } /** * index column list */ protected void createIndexColumne(final TableViewer tv) { String[] name = {Messages.get().SEQ, Messages.get().Column, Messages.get().Order}; int[] size = {60, 300, 50}; for (int i=0; i<name.length; i++) { TableViewerColumn indexColumn = new TableViewerColumn(tv, SWT.LEFT); indexColumn.getColumn().setText(name[i]); indexColumn.getColumn().setWidth(size[i]); indexColumn.getColumn().addSelectionListener(getSelectionAdapter(indexColumn, i)); } } /** * create menu * */ private void createMenu() { if(getUserDB() == null) return; creatAction_Index = new ObjectCreatAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.INDEXES, Messages.get().TadpoleIndexesComposite_1); dropAction_Index = new ObjectDropAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.INDEXES, Messages.get().TadpoleIndexesComposite_2); refreshAction_Index = new ObjectRefreshAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.INDEXES, CommonMessages.get().Refresh); // viewDDLAction = new GenerateViewDDLAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.INDEXES, Messages.get().TadpoleIndexesComposite_7); // menu final MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$ if(PermissionChecker.isShow(getUserRoleType(), getUserDB())) { if(!isDDLLock()) { menuMgr.add(creatAction_Index); menuMgr.add(dropAction_Index); menuMgr.add(new Separator()); } menuMgr.add(refreshAction_Index); // menuMgr.add(new Separator()); // menuMgr.add(viewDDLAction); } indexTableViewer.getTable().setMenu(menuMgr.createContextMenu(indexTableViewer.getTable())); getSite().registerContextMenu(menuMgr, indexTableViewer); } /** * init action */ public void initAction() { listIndexes.clear(); indexTableViewer.setInput(listIndexes); indexTableViewer.refresh(); if(getUserDB() == null) return; creatAction_Index.setUserDB(getUserDB()); dropAction_Index.setUserDB(getUserDB()); refreshAction_Index.setUserDB(getUserDB()); // viewDDLAction.setUserDB(getUserDB()); } /** * refresh index * * @param userDB * @param tableDao */ public void setTable(UserDBDAO userDB, TableDAO tableDao) { this.userDB = userDB; this.tableDao = tableDao; refreshIndexes(userDB, true, ""); showIndexColumns.clear(); indexColumnViewer.setInput(showIndexColumns); indexColumnViewer.refresh(); } /** * index 정보를 최신으로 갱신 합니다. * @param strObjectName */ public void refreshIndexes(final UserDBDAO userDB, boolean boolRefresh, String strObjectName) { if(!boolRefresh) if(listIndexes != null) return; if(tableDao == null) return; this.userDB = userDB; try { SqlMapClient sqlClient = TadpoleSQLManager.getInstance(userDB); HashMap<String, String> map = new HashMap<String, String>(); if(DBGroupDefine.ALTIBASE_GROUP == userDB.getDBGroup()) { map.put("user_name", StringUtils.substringBefore(tableDao.getName(), ".")); //$NON-NLS-1$ map.put("table_name", StringUtils.substringAfter(tableDao.getName(), ".")); //$NON-NLS-1$ } else if(DBGroupDefine.ORACLE_GROUP == userDB.getDBGroup()) { map.put("table_schema", StringUtils.isBlank(tableDao.getSchema_name())? userDB.getSchema():tableDao.getSchema_name()); map.put("table_name", tableDao.getName()); } else if(DBGroupDefine.MYSQL_GROUP == userDB.getDBGroup()) { map.put("table_schema", StringUtils.isBlank(tableDao.getSchema_name())? userDB.getSchema():tableDao.getSchema_name()); map.put("table_name", tableDao.getName()); } else { map.put("table_schema", userDB.getDb()); map.put("table_name", tableDao.getName()); } listIndexes = sqlClient.queryForList("indexList", map); //$NON-NLS-1$ for(InformationSchemaDAO dao : listIndexes) { dao.setSysName(SQLUtil.makeIdentifierName(userDB, dao.getINDEX_NAME() )); } } catch (Exception e) { logger.error("index refresh", e); //$NON-NLS-1$ Status errStatus = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e); //$NON-NLS-1$ ExceptionDetailsErrorDialog.openError(getSite().getShell(),CommonMessages.get().Error, Messages.get().ExplorerViewer_1, errStatus); //$NON-NLS-1$ } indexTableViewer.setInput(listIndexes); indexTableViewer.refresh(); TableUtil.packTable(indexTableViewer.getTable()); // select tabitem getTabFolderObject().setSelection(tbtmIndex); selectDataOfTable(strObjectName); } /** * filter * * @param textSearch */ public void filter(String textSearch) { indexFilter.setSearchText(textSearch); indexTableViewer.refresh(); } /** * table viewer * @return */ public TableViewer getTableViewer() { return indexTableViewer; } @Override public void setSearchText(String searchText) { indexFilter.setSearchText(searchText); } @Override public void dispose() { super.dispose(); if(creatAction_Index != null) creatAction_Index.dispose(); if(dropAction_Index != null) dropAction_Index.dispose(); if(refreshAction_Index != null) refreshAction_Index.dispose(); // if(viewDDLAction != null) viewDDLAction.dispose(); } @Override public void selectDataOfTable(String strObjectName) { if("".equals(strObjectName) || strObjectName == null) return; getTableViewer().getTable().setFocus(); // find select object and viewer select for(int i=0; i<listIndexes.size(); i++) { InformationSchemaDAO tableDao = (InformationSchemaDAO)getTableViewer().getElementAt(i); if(StringUtils.equalsIgnoreCase(strObjectName, tableDao.getINDEX_NAME())) { getTableViewer().setSelection(new StructuredSelection(getTableViewer().getElementAt(i)), true); break; } } } }