/*******************************************************************************
* 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.function;
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.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
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.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 org.eclipse.ui.PlatformUI;
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.ProcedureFunctionDAO;
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.ObjectExecuteProcedureAction;
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.viewers.object.comparator.ProcedureFunctionComparator;
import com.hangum.tadpole.rdb.core.viewers.object.sub.AbstractObjectComposite;
import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.procedure.ProcedureFunctionLabelProvicer;
import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.procedure.ProcedureFunctionViewFilter;
/**
* Function composite
*
* @author hangum
*
*/
public class TadpoleFunctionComposite extends AbstractObjectComposite {
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(TadpoleFunctionComposite.class);
private CTabItem tbtmFunctions;
private TableViewer functionTableViewer;
private ProcedureFunctionComparator functionComparator;
private List<ProcedureFunctionDAO> showFunction = new ArrayList<>();
private ProcedureFunctionViewFilter functionFilter;
private ObjectCreatAction creatAction_Function;
private ObjectDropAction dropAction_Function;
private ObjectRefreshAction refreshAction_Function;
private GenerateViewDDLAction viewDDLAction;
private ObjectExecuteProcedureAction executeAction_Procedure;
private OracleObjectCompileAction objectCompileAction;
/**
* function composite
*
* @param site
* @param tabFolderObject
* @param userDB
*/
public TadpoleFunctionComposite(IWorkbenchPartSite site, CTabFolder tabFolderObject, UserDBDAO userDB) {
super(site, tabFolderObject, userDB);
createWidget(tabFolderObject);
}
private void createWidget(final CTabFolder tabFolderObject) {
tbtmFunctions = new CTabItem(tabFolderObject, SWT.NONE);
tbtmFunctions.setText(Messages.get().Functions);
tbtmFunctions.setData(TAB_DATA_KEY, PublicTadpoleDefine.OBJECT_TYPE.FUNCTIONS.name());
Composite compositeIndexes = new Composite(tabFolderObject, SWT.NONE);
tbtmFunctions.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를 적용하면 데이터가 보이지 않는 오류수정.
functionTableViewer = new TableViewer(sashForm, /* SWT.VIRTUAL | */ SWT.BORDER | SWT.FULL_SELECTION);
Table tableTableList = functionTableViewer.getTable();
tableTableList.setLinesVisible(true);
tableTableList.setHeaderVisible(true);
functionComparator = new ProcedureFunctionComparator();
functionTableViewer.setSorter(functionComparator);
functionComparator.setColumn(0);
createProcedureFunctionColumn(functionTableViewer, functionComparator);
functionTableViewer.setLabelProvider(new ProcedureFunctionLabelProvicer());
functionTableViewer.setContentProvider(new ArrayContentProvider());
functionTableViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
IStructuredSelection iss = (IStructuredSelection) event.getSelection();
if(!iss.isEmpty()) {
ObjectExecuteProcedureAction action = new ObjectExecuteProcedureAction(PlatformUI.getWorkbench().getActiveWorkbenchWindow(), OBJECT_TYPE.FUNCTIONS, Messages.get().TadpoleFunctionComposite_4);
action.run(iss, getUserDB(), OBJECT_TYPE.FUNCTIONS);
} // end iss.isempty
}
});
functionFilter = new ProcedureFunctionViewFilter();
functionTableViewer.addFilter(functionFilter);
sashForm.setWeights(new int[] { 1 });
// creat action
createMenu();
}
private void createMenu() {
if(getUserDB() == null) return;
creatAction_Function = new ObjectCreatAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.FUNCTIONS, Messages.get().TadpoleFunctionComposite_1);
dropAction_Function = new ObjectDropAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.FUNCTIONS, Messages.get().TadpoleFunctionComposite_2);
refreshAction_Function = new ObjectRefreshAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.FUNCTIONS, CommonMessages.get().Refresh);
viewDDLAction = new GenerateViewDDLAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.FUNCTIONS, Messages.get().TadpoleFunctionComposite_4);
executeAction_Procedure = new ObjectExecuteProcedureAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.FUNCTIONS, Messages.get().TadpoleFunctionComposite_5);
objectCompileAction = new OracleObjectCompileAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.FUNCTIONS, Messages.get().TadpoleFunctionComposite_6);
// object copy to query editor
objectSelectionToEditorAction = new ObjectExplorerSelectionToEditorAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES);
// menu
final MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
if(PermissionChecker.isShow(getUserRoleType(), getUserDB())) {
if(!isDDLLock()) {
menuMgr.add(creatAction_Function);
menuMgr.add(dropAction_Function);
menuMgr.add(new Separator());
}
}
menuMgr.add(refreshAction_Function);
menuMgr.add(new Separator());
menuMgr.add(viewDDLAction);
if (DBGroupDefine.ALTIBASE_GROUP != userDB.getDBGroup()) {
menuMgr.add(new Separator());
menuMgr.add(executeAction_Procedure);
}
if (DBGroupDefine.ORACLE_GROUP == userDB.getDBGroup()){
menuMgr.add(new Separator());
menuMgr.add(objectCompileAction);
}
menuMgr.add(new Separator());
menuMgr.add(objectSelectionToEditorAction);
functionTableViewer.getTable().setMenu(menuMgr.createContextMenu(functionTableViewer.getTable()));
getSite().registerContextMenu(menuMgr, functionTableViewer);
}
/**
* text filter
* @param textSearch
*/
public void filter(String textSearch) {
functionFilter.setSearchText(textSearch);
functionTableViewer.refresh();
}
/**
* initialize action
*/
public void initAction() {
if (showFunction != null) showFunction.clear();
functionTableViewer.setInput(showFunction);
functionTableViewer.refresh();
if(getUserDB() == null) return;
creatAction_Function.setUserDB(getUserDB());
dropAction_Function.setUserDB(getUserDB());
refreshAction_Function.setUserDB(getUserDB());
viewDDLAction.setUserDB(getUserDB());
executeAction_Procedure.setUserDB(getUserDB());
objectCompileAction.setUserDB(getUserDB());
objectSelectionToEditorAction.setUserDB(getUserDB());
}
/**
* function 정보를 최신으로 갱신 합니다.
*/
public void refreshFunction(final UserDBDAO userDB, boolean boolRefresh, String strObjectName) {
if(!boolRefresh) if(!showFunction.isEmpty()) return;
this.userDB = userDB;
showFunction = (List<ProcedureFunctionDAO>)userDB.getDBObject(OBJECT_TYPE.FUNCTIONS, userDB.getDefaultSchemanName());
if(showFunction == null || showFunction.isEmpty()) {
try {
showFunction = DBSystemSchema.getFunctionList(userDB);
// set push of cache
userDB.setDBObject(OBJECT_TYPE.FUNCTIONS, userDB.getDefaultSchemanName(), showFunction);
} catch (Exception e) {
logger.error("showFunction 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_81, errStatus); //$NON-NLS-1$
}
}
functionTableViewer.setInput(showFunction);
functionTableViewer.refresh();
TableUtil.packTable(functionTableViewer.getTable());
// select tabitem
getTabFolderObject().setSelection(tbtmFunctions);
selectDataOfTable(strObjectName);
}
/**
* tableviewer
*
* @return
*/
public TableViewer getTableviewer() {
return functionTableViewer;
}
@Override
public void setSearchText(String searchText) {
functionFilter.setSearchText(searchText);
}
@Override
public void dispose() {
super.dispose();
if(creatAction_Function != null) creatAction_Function.dispose();
if(dropAction_Function != null) dropAction_Function.dispose();
if(refreshAction_Function != null) refreshAction_Function.dispose();
if(viewDDLAction != null) viewDDLAction.dispose();
if(executeAction_Procedure != null) executeAction_Procedure.dispose();
if(objectCompileAction != null) objectCompileAction.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<showFunction.size(); i++) {
ProcedureFunctionDAO tableDao = (ProcedureFunctionDAO)getTableviewer().getElementAt(i);
if(StringUtils.equalsIgnoreCase(strObjectName, tableDao.getName())) {
getTableviewer().setSelection(new StructuredSelection(getTableviewer().getElementAt(i)), true);
break;
}
}
}
public void clearList() {
// TODO Auto-generated method stub
if(showFunction != null) this.showFunction.clear();
}
}