/******************************************************************************* * Copyright (c) 2016 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.columns; import java.util.ArrayList; import java.util.List; 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.ColumnViewerToolTipSupport; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IStructuredSelection; 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 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.query.dao.mysql.TableColumnDAO; import com.hangum.tadpole.engine.query.dao.mysql.TableDAO; 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.object.ObjectExplorerSelectionToEditorAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.object.TableColumnDeleteAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.object.TableColumnModifyAction; 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.sub.rdb.table.ColumnCommentEditorSupport; import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.table.TableColumnLabelprovider; import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.table.TadpoleTableComposite; import com.hangum.tadpole.rdb.core.viewers.object.sub.utils.TadpoleObjectQuery; /** * Table column * * @author hangum * */ public class TableColumnComposite extends AbstractTableComposite { private static final Logger logger = Logger.getLogger(TableColumnComposite.class); private TableViewer tableColumnViewer; private List<TableColumnDAO> showTableColumns = new ArrayList<>(); private ObjectComparator tableColumnComparator; private AbstractObjectAction tableColumnSelectionAction; private AbstractObjectAction tableColumnDeleteAction; private AbstractObjectAction tableColumnModifyAction; /** * Create the composite. * @param parentFolder * @param style */ public TableColumnComposite(TadpoleTableComposite tableComposite, CTabFolder parentFolder, int style) { super(tableComposite, parentFolder, style); CTabItem tbtmTable = new CTabItem(parentFolder, SWT.NONE); tbtmTable.setText(Messages.get().Columns); tbtmTable.setData(Messages.get().Columns); tbtmTable.setData(TAB_DATA_KEY, PublicTadpoleDefine.OBJECT_TYPE.COLUMNS.name()); Composite compositeColumn = new Composite(parentFolder, SWT.NONE); tbtmTable.setControl(compositeColumn); GridLayout gl_compositeTables = new GridLayout(1, false); gl_compositeTables.verticalSpacing = 2; gl_compositeTables.horizontalSpacing = 2; gl_compositeTables.marginHeight = 2; gl_compositeTables.marginWidth = 2; compositeColumn.setLayout(gl_compositeTables); SashForm sashForm = new SashForm(compositeColumn, SWT.NONE); sashForm.setOrientation(SWT.VERTICAL); sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); tableColumnViewer = new TableViewer(sashForm, /* SWT.VIRTUAL | */ SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI | SWT.Move); tableColumnViewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { IStructuredSelection is = (IStructuredSelection) event.getSelection(); if (!is.isEmpty()) { TableColumnDAO tableDAO = (TableColumnDAO) is.getFirstElement(); FindEditorAndWriteQueryUtil.runAtPosition(String.format("%s, ", tableDAO.getField())); } } }); Table tableTableColumn = tableColumnViewer.getTable(); tableTableColumn.setHeaderVisible(true); tableTableColumn.setLinesVisible(true); tableColumnComparator = new TableColumnComparator(); tableColumnViewer.setSorter(tableColumnComparator); createTableColumne(); createTableColumnMenu(); tableColumnViewer.setContentProvider(new ArrayContentProvider()); tableColumnViewer.setLabelProvider(new TableColumnLabelprovider(getTableComposite().getTableListViewer(), getTableComposite().getTableDecorationExtension())); sashForm.setWeights(new int[] { 1 }); } public List<TableColumnDAO> getShowTableColumns() { return showTableColumns; } /** * table table column */ protected void createTableColumne() { String[] name = {Messages.get().Field, Messages.get().Type, Messages.get().Key, Messages.get().Comment, Messages.get().TadpoleTableComposite_8, Messages.get().Default, Messages.get().TadpoleTableComposite_10}; int[] size = {120, 90, 100, 50, 50, 50, 50}; // table column tooltip ColumnViewerToolTipSupport.enableFor(tableColumnViewer); for (int i=0; i<name.length; i++) { TableViewerColumn tableColumn = new TableViewerColumn(tableColumnViewer, SWT.LEFT); tableColumn.getColumn().setText(name[i]); tableColumn.getColumn().setWidth(size[i]); tableColumn.getColumn().addSelectionListener(getSelectionAdapter(tableColumn, i)); tableColumn.getColumn().setMoveable(true); tableColumn.setEditingSupport(new ColumnCommentEditorSupport(getTableComposite().getTableListViewer(), tableColumnViewer, getUserDB(), i)); } } /** * initialize action */ public void initAction() { showTableColumns.clear(); tableColumnViewer.setInput(showTableColumns); if(getUserDB() == null) return; // table column if(tableColumnSelectionAction != null) tableColumnSelectionAction.setUserDB(getUserDB()); if(tableColumnDeleteAction!= null) tableColumnDeleteAction.setUserDB(getUserDB()); if(tableColumnModifyAction != null) tableColumnModifyAction.setUserDB(getUserDB()); } public TableViewer getTableColumnViewer() { return tableColumnViewer; } /** * selection adapter * * @param tableColumn * @param i * @return */ private SelectionAdapter getSelectionAdapter(final TableViewerColumn tableColumn, final int index) { SelectionAdapter selectionAdapter = new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { tableColumnComparator.setColumn(index); tableColumnViewer.getTable().setSortDirection(tableColumnComparator.getDirection()); tableColumnViewer.getTable().setSortColumn(tableColumn.getColumn()); tableColumnViewer.refresh(); } }; return selectionAdapter; } /** * refresh table column */ public void refreshTableColumn(TableViewer tableListViewer) { // 테이블의 컬럼 목록을 출력합니다. try { IStructuredSelection is = (IStructuredSelection) tableListViewer.getSelection(); Object objDAO = is.getFirstElement(); if (objDAO != null) { TableDAO tableDao = (TableDAO) objDAO; getTableComposite().setSelectTableName(tableDao.getName()); showTableColumns = TadpoleObjectQuery.getTableColumns(getUserDB(), tableDao); } else { showTableColumns = new ArrayList<>(); getTableComposite().setSelectTableName(""); } } catch (Exception e) { logger.error("get table column", e); //$NON-NLS-1$ // initialize table columns showTableColumns.clear(); // show error message Status errStatus = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e); //$NON-NLS-1$ ExceptionDetailsErrorDialog.openError(getShell(),CommonMessages.get().Error, e.getMessage(), errStatus); //$NON-NLS-1$ } finally { tableColumnViewer.setInput(showTableColumns); tableColumnComparator = new TableColumnComparator(); tableColumnViewer.setSorter(tableColumnComparator); tableColumnViewer.refresh(); TableUtil.packTable(tableColumnViewer.getTable()); } } /** * create table column menu */ private void createTableColumnMenu() { if(getUserDB() == null) return; tableColumnDeleteAction = new TableColumnDeleteAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, "Table"); //$NON-NLS-1$ tableColumnModifyAction = new TableColumnModifyAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, "Table"); //$NON-NLS-1$ // 컬럼을 에디터로 복사하기 tableColumnSelectionAction = new ObjectExplorerSelectionToEditorAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES); //$NON-NLS-1$ // menu final MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$ if(DBGroupDefine.MYSQL_GROUP == getUserDB().getDBGroup()) { menuMgr.add(tableColumnModifyAction); menuMgr.add(tableColumnDeleteAction); menuMgr.add(new Separator()); } menuMgr.add(tableColumnSelectionAction); tableColumnViewer.getTable().setMenu(menuMgr.createContextMenu(tableColumnViewer.getTable())); getSite().registerContextMenu(menuMgr, tableColumnViewer); } @Override public void dispose() { super.dispose(); if(tableColumnDeleteAction != null) tableColumnDeleteAction.dispose(); if(tableColumnModifyAction != null) tableColumnModifyAction.dispose(); if(tableColumnSelectionAction != null) tableColumnSelectionAction.dispose(); } public void clearList() { this.showTableColumns.clear(); } }