/******************************************************************************* * 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.view; import java.util.ArrayList; 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.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; 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.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.graphics.Image; 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.swt.widgets.TableColumn; 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.define.PublicTadpoleDefine.OBJECT_TYPE; import com.hangum.tadpole.commons.libs.core.message.CommonMessages; 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.query.sql.DBSystemSchema; 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.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.OracleObjectCompileAction; import com.hangum.tadpole.rdb.core.util.FindEditorAndWriteQueryUtil; import com.hangum.tadpole.rdb.core.viewers.object.comparator.ObjectComparator; import com.hangum.tadpole.rdb.core.viewers.object.comparator.TableColumnComparator; 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.TableColumnLabelprovider; import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.table.TableFilter; import com.swtdesigner.ResourceManager; /** * RDB viewer composite * * @author hangum * */ public class TadpoleViewerComposite extends AbstractObjectComposite { /** * Logger for this class */ private static final Logger logger = Logger.getLogger(TadpoleViewerComposite.class); private CTabItem tbtmViews; private TableViewer viewListViewer; private ObjectComparator viewComparator; private List<TableDAO> showViews = new ArrayList<>(); private TableViewer viewColumnViewer; private ObjectComparator tableColumnComparator; private List<TableColumnDAO> showViewColumns = new ArrayList<>(); private TableFilter viewFilter; private ObjectCreatAction creatAction_View; private ObjectDropAction deleteAction_View; private ObjectRefreshAction refreshAction_View; private GenerateViewDDLAction viewDDLAction; private OracleObjectCompileAction objectCompileAction; // private TableColumnSelectionAction tableColumnSelectionAction; /** * * @param partSite * @param parent * @param userDB */ public TadpoleViewerComposite(IWorkbenchPartSite site, final CTabFolder tabFolderObject, final UserDBDAO userDB) { super(site, tabFolderObject, userDB); createWidget(tabFolderObject); } private void createWidget(final CTabFolder tabFolderObject) { tbtmViews = new CTabItem(tabFolderObject, SWT.NONE); tbtmViews.setText(Messages.get().Views); tbtmViews.setData(TAB_DATA_KEY, PublicTadpoleDefine.OBJECT_TYPE.VIEWS.name()); Composite compositeTables = new Composite(tabFolderObject, SWT.NONE); tbtmViews.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); SashForm sashForm = new SashForm(compositeTables, SWT.NONE); sashForm.setOrientation(SWT.VERTICAL); sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); // SWT.VIRTUAL 일 경우 FILTER를 적용하면 데이터가 보이지 않는 오류수정. viewListViewer = new TableViewer(sashForm, /* SWT.VIRTUAL | */ SWT.BORDER | SWT.FULL_SELECTION); viewListViewer.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(PermissionChecker.isShow(getUserRoleType(), userDB)) { if (null != is) { try { TableDAO viewDao = (TableDAO)is.getFirstElement(); StringBuffer sbSQL = new StringBuffer(); List<TableColumnDAO> showTableColumns = DBSystemSchema.getViewColumnList(userDB, viewDao); sbSQL.append("SELECT "); //$NON-NLS-1$ for (int i=0; i<showTableColumns.size(); i++) { TableColumnDAO dao = showTableColumns.get(i); sbSQL.append(dao.getSysName()); // 마지막 컬럼에는 ,를 않넣어주어야하니까 if(i < (showTableColumns.size()-1)) sbSQL.append(", "); //$NON-NLS-1$ else sbSQL.append(" "); //$NON-NLS-1$ } sbSQL.append(PublicTadpoleDefine.LINE_SEPARATOR + "FROM " + viewDao.getFullName() + PublicTadpoleDefine.SQL_DELIMITER); //$NON-NLS-1$ //$NON-NLS-2$ // FindEditorAndWriteQueryUtil.run(userDB, sbSQL.toString(), PublicTadpoleDefine.OBJECT_TYPE.VIEWS); } catch(Exception e) { logger.error("get view listt", e); Status errStatus = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e); //$NON-NLS-1$ ExceptionDetailsErrorDialog.openError(null,CommonMessages.get().Error, Messages.get().GenerateSQLSelectAction_0, errStatus); //$NON-NLS-1$ } } } } }); viewListViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { // 테이블의 컬럼 목록을 출력합니다. try { IStructuredSelection is = (IStructuredSelection) event.getSelection(); if (!is.isEmpty()) { if (is.getFirstElement() != null) { TableDAO viewDao = (TableDAO)is.getFirstElement(); showViewColumns = DBSystemSchema.getViewColumnList(userDB, viewDao); } else { showViewColumns = new ArrayList<>(); } } else { showViewColumns.clear(); } } catch (Exception e) { logger.error("get view list", 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_29, errStatus); //$NON-NLS-1$ } finally { viewColumnViewer.setInput(showViewColumns); tableColumnComparator = new TableColumnComparator(); viewColumnViewer.setSorter(tableColumnComparator); viewColumnViewer.refresh(); TableUtil.packTable(viewColumnViewer.getTable()); } } }); Table tableTableList = viewListViewer.getTable(); tableTableList.setLinesVisible(true); tableTableList.setHeaderVisible(true); // sorter viewComparator = new TableComparator(); viewListViewer.setSorter(viewComparator); viewComparator.setColumn(0); TableViewerColumn tableViewerColumn = new TableViewerColumn(viewListViewer, SWT.NONE); TableColumn tblclmnTableName = tableViewerColumn.getColumn(); tblclmnTableName.setWidth(200); tblclmnTableName.setText(CommonMessages.get().Name); tblclmnTableName.addSelectionListener(getSelectionAdapter(viewListViewer, viewComparator, tblclmnTableName, 0)); tableViewerColumn.setLabelProvider(new ColumnLabelProvider() { @Override public Image getImage(Object element) { return ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/objectExplorer/view.png"); //$NON-NLS-1$ } @Override public String getText(Object element) { TableDAO tdbDao = (TableDAO)element; return tdbDao.getName(); } }); TableViewerColumn tableViewerComment = new TableViewerColumn(viewListViewer, SWT.NONE); TableColumn tblclmnViewComment = tableViewerComment.getColumn(); tblclmnViewComment.setWidth(300); tblclmnViewComment.setText(Messages.get().Comment); tblclmnViewComment.addSelectionListener(getSelectionAdapter(viewListViewer, viewComparator, tblclmnTableName, 0)); tableViewerComment.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { TableDAO tdbDao = (TableDAO)element; return tdbDao.getComment() == null ? "" : tdbDao.getComment(); } }); viewListViewer.setContentProvider(new ArrayContentProvider()); viewListViewer.setInput(showViews); viewFilter = new TableFilter(userDB); viewListViewer.addFilter(viewFilter); createMenu(); // columns viewColumnViewer = new TableViewer(sashForm, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI); viewColumnViewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { IStructuredSelection is = (IStructuredSelection) event.getSelection(); if (null != is) { TableColumnDAO tableDAO = (TableColumnDAO) is.getFirstElement(); FindEditorAndWriteQueryUtil.runAtPosition(StringUtils.trim(tableDAO.getField())); } } }); Table tableTableColumn = viewColumnViewer.getTable(); tableTableColumn.setHeaderVisible(true); tableTableColumn.setLinesVisible(true); tableColumnComparator = new TableColumnComparator(); viewColumnViewer.setSorter(tableColumnComparator); createViewColumne(); viewColumnViewer.setContentProvider(new ArrayContentProvider()); viewColumnViewer.setLabelProvider(new TableColumnLabelprovider()); // createTableColumnMenu(); sashForm.setWeights(new int[] { 1, 1 }); } // /** // * create table column menu // */ // private void createTableColumnMenu() { // tableColumnSelectionAction = new TableColumnSelectionAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.VIEWS, "View"); //$NON-NLS-1$ // // // menu // final MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$ // menuMgr.setRemoveAllWhenShown(true); // menuMgr.addMenuListener(new IMenuListener() { // @Override // public void menuAboutToShow(IMenuManager manager) { // manager.add(tableColumnSelectionAction); // } // }); // // viewColumnViewer.getTable().setMenu(menuMgr.createContextMenu(viewColumnViewer.getTable())); // getSite().registerContextMenu(menuMgr, viewColumnViewer); // } /** * create menu */ private void createMenu() { if(getUserDB() == null) return; creatAction_View = new ObjectCreatAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.VIEWS, Messages.get().TadpoleViewerComposite_1); deleteAction_View = new ObjectDropAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.VIEWS, Messages.get().TadpoleViewerComposite_2); refreshAction_View = new ObjectRefreshAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.VIEWS, CommonMessages.get().Refresh); // modifyAction_View = new ObjectModifyAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.VIEWS, "View"); viewDDLAction = new GenerateViewDDLAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.VIEWS, Messages.get().ViewDDL); objectCompileAction = new OracleObjectCompileAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.VIEWS, Messages.get().TadpoleViewerComposite_6); // object copy to query editor objectSelectionToEditorAction = new ObjectExplorerSelectionToEditorAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.VIEWS); // menu final MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$ if(PermissionChecker.isShow(getUserRoleType(), getUserDB())) { if(!isDDLLock()) { menuMgr.add(creatAction_View); menuMgr.add(deleteAction_View); menuMgr.add(new Separator()); } } // manager.add(modifyAction_View); menuMgr.add(refreshAction_View); menuMgr.add(new Separator()); menuMgr.add(viewDDLAction); if (DBGroupDefine.ORACLE_GROUP == getUserDB().getDBGroup()){ menuMgr.add(new Separator()); menuMgr.add(objectCompileAction); } menuMgr.add(new Separator()); menuMgr.add(objectSelectionToEditorAction); viewListViewer.getTable().setMenu(menuMgr.createContextMenu(viewListViewer.getTable())); getSite().registerContextMenu(menuMgr, viewListViewer); } /** * tableviewer filter * @param textSearch */ public void filter(String textSearch) { viewFilter.setSearchText(textSearch); viewListViewer.refresh(); } /** * view 정보를 최신으로 리프레쉬합니다. * @param userDB * @param boolRefresh * @param strObjectName */ public void refreshView(final UserDBDAO userDB, boolean boolRefresh, String strObjectName) { if(!boolRefresh) if(!showViews.isEmpty()) return; showViews.clear(); this.userDB = userDB; showViews = (List<TableDAO>)userDB.getDBObject(OBJECT_TYPE.VIEWS, userDB.getDefaultSchemanName()); if((showViews == null || showViews.isEmpty())) { try { showViews = DBSystemSchema.getViewList(userDB); userDB.setDBObject(OBJECT_TYPE.VIEWS, userDB.getDefaultSchemanName(), showViews); } catch (Exception e) { showViews.clear(); logger.error("view 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_61, errStatus); //$NON-NLS-1$ } } viewListViewer.setInput(showViews); viewListViewer.refresh(); TableUtil.packTable(viewListViewer.getTable()); // select tabitem getTabFolderObject().setSelection(tbtmViews); selectDataOfTable(strObjectName); } /** * initialize action */ public void initAction() { showViews.clear(); viewListViewer.setInput(showViews); viewListViewer.refresh(); showViewColumns.clear(); viewColumnViewer.setInput(showViewColumns); viewColumnViewer.refresh(); if(getUserDB() == null) return; creatAction_View.setUserDB(getUserDB()); deleteAction_View.setUserDB(getUserDB()); refreshAction_View.setUserDB(getUserDB()); // modifyAction_View.setUserDB(getUserDB()); viewDDLAction.setUserDB(getUserDB()); objectCompileAction.setUserDB(getUserDB()); // table column // tableColumnSelectionAction.setUserDB(getUserDB()); objectSelectionToEditorAction.setUserDB(getUserDB()); } /** * get tableViewer * @return */ public TableViewer getTableViewer() { return viewListViewer; } @Override public void setSearchText(String searchText) { viewFilter.setSearchText(searchText); } @Override public void dispose() { super.dispose(); if(creatAction_View != null) creatAction_View.dispose(); if(deleteAction_View != null) deleteAction_View.dispose(); if(refreshAction_View != null) refreshAction_View.dispose(); if(viewDDLAction != null) viewDDLAction.dispose(); if(objectCompileAction != null) objectCompileAction.dispose(); // if(tableColumnSelectionAction != null) tableColumnSelectionAction.dispose(); } /** * view column */ protected void createViewColumne() { String[] name = {Messages.get().Field, Messages.get().Type, Messages.get().Key, Messages.get().Comment, Messages.get().Null, Messages.get().Default, Messages.get().Extra}; int[] size = {120, 70, 50, 100, 50, 50, 50}; ColumnViewerToolTipSupport.enableFor(viewColumnViewer); for (int i=0; i<name.length; i++) { TableViewerColumn tableColumn = new TableViewerColumn(viewColumnViewer, SWT.LEFT); tableColumn.getColumn().setText(name[i]); tableColumn.getColumn().setWidth(size[i]); tableColumn.getColumn().setMoveable(true); tableColumn.getColumn().addSelectionListener(getSelectionAdapter(tableColumn, i)); } } /** * selection adapter * * @param tableColumn * @param index * @return */ private SelectionAdapter getSelectionAdapter(final TableViewerColumn tableColumn, final int index) { SelectionAdapter selectionAdapter = new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { tableColumnComparator.setColumn(index); viewColumnViewer.getTable().setSortDirection(tableColumnComparator.getDirection()); viewColumnViewer.getTable().setSortColumn(tableColumn.getColumn()); viewColumnViewer.refresh(); } }; return selectionAdapter; } @Override public void selectDataOfTable(String strObjectName) { if(strObjectName == null || "".equals(strObjectName)) return; getTableViewer().getTable().setFocus(); // find select object and viewer select for(int i=0; i<showViews.size(); i++) { TableDAO tableDao = (TableDAO)getTableViewer().getElementAt(i); if(StringUtils.equalsIgnoreCase(strObjectName, tableDao.getName())) { getTableViewer().setSelection(new StructuredSelection(getTableViewer().getElementAt(i)), true); break; } } } public void clearList() { if(showViews != null) this.showViews.clear(); } }