/*******************************************************************************
* 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.sql.template;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
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.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.part.ViewPart;
import com.hangum.tadpole.ace.editor.core.widgets.TadpoleEditorWidget;
import com.hangum.tadpole.commons.google.analytics.AnalyticCaller;
import com.hangum.tadpole.commons.libs.core.message.CommonMessages;
import com.hangum.tadpole.commons.util.GlobalImageUtils;
import com.hangum.tadpole.engine.query.dao.system.SQLTemplateDAO;
import com.hangum.tadpole.engine.query.sql.TadpoleSystem_SQLTemplate;
import com.hangum.tadpole.engine.utils.EditorDefine;
import com.hangum.tadpole.rdb.core.Messages;
import com.hangum.tadpole.rdb.core.util.FindEditorAndWriteQueryUtil;
import com.hangum.tadpole.session.manager.SessionManager;
/**
* SQL template view
*
* @author hangum
*
*/
public class SQLTemplateView extends ViewPart {
private static Logger logger = Logger.getLogger(SQLTemplateView.class);
public static final String ID = "com.hangum.tadpole.rdb.core.view.sql.template";
/**
* template type
*/
public enum SQL_TEMPLATE_TYPE {PUB, PRI};
private TreeViewer tvSQLTemplate;
private SQLTemplateFilter filter;
private List<SQLTemplateGroupDAO> listGroup = new ArrayList<>();
private SQLTemplateGroupDAO grpPublicDao;
private SQLTemplateGroupDAO grpPrivateDao;
private ToolItem tltmModify;
private ToolItem tltmDelete;
private Text textSearch;
private TadpoleEditorWidget textSQL;
public SQLTemplateView() {
}
@Override
public void createPartControl(Composite parent) {
parent.setLayout(new GridLayout(1, false));
Composite compositeHead = new Composite(parent, SWT.NONE);
compositeHead.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
compositeHead.setLayout(new GridLayout(1, false));
ToolBar toolBar = new ToolBar(compositeHead, SWT.FLAT | SWT.RIGHT);
ToolItem tltmRefresh = new ToolItem(toolBar, SWT.NONE);
tltmRefresh.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
initData();
}
});
tltmRefresh.setImage(GlobalImageUtils.getRefresh());
tltmRefresh.setToolTipText(CommonMessages.get().Refresh);
ToolItem tltmAdd = new ToolItem(toolBar, SWT.NONE);
tltmAdd.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
addTemplate(SQL_TEMPLATE_TYPE.PRI);
}
});
tltmAdd.setImage(GlobalImageUtils.getAdd());
tltmAdd.setToolTipText(CommonMessages.get().Add);
tltmModify = new ToolItem(toolBar, SWT.NONE);
tltmModify.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
StructuredSelection ss = (StructuredSelection)tvSQLTemplate.getSelection();
if(ss.getFirstElement() instanceof SQLTemplateDAO) {
SQLTemplateDAO dao = (SQLTemplateDAO)ss.getFirstElement();
SQLTemplateDialog dialog = new SQLTemplateDialog(getSite().getShell(), dao);
if(Dialog.OK == dialog.open()) {
tvSQLTemplate.refresh(dialog.getOldSqlTemplateDAO());
textSQL.setText("");
}
}
}
});
tltmModify.setImage(GlobalImageUtils.getModify());
tltmModify.setToolTipText(Messages.get().Modified);
tltmModify.setEnabled(false);
tltmDelete = new ToolItem(toolBar, SWT.NONE);
tltmDelete.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if(!MessageDialog.openConfirm(getSite().getShell(), CommonMessages.get().Confirm, Messages.get().SQLTemplateView_del_equestion)) return;
StructuredSelection ss = (StructuredSelection)tvSQLTemplate.getSelection();
if(ss.getFirstElement() instanceof SQLTemplateDAO) {
SQLTemplateDAO dao = (SQLTemplateDAO)ss.getFirstElement();
try {
TadpoleSystem_SQLTemplate.deleteSQLTemplate(dao);
grpPrivateDao.getChildList().remove(dao);
tvSQLTemplate.remove(dao);
textSQL.setText("");
} catch (Exception e1) {
logger.error("Delete SQL template", e1);
}
}
}
});
tltmDelete.setImage(GlobalImageUtils.getDelete());
tltmDelete.setToolTipText(CommonMessages.get().Delete);
tltmDelete.setEnabled(false);
// admin menu
if(SessionManager.isSystemAdmin()) {
new ToolItem(toolBar, SWT.SEPARATOR);
ToolItem tltmAdminAdd = new ToolItem(toolBar, SWT.NONE);
tltmAdminAdd.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
addTemplate(SQL_TEMPLATE_TYPE.PUB);
}
});
tltmAdminAdd.setText(Messages.get().SQLTemplateView_Addpublictemplate);
tltmAdminAdd.setToolTipText(Messages.get().SQLTemplateView_Addpublictemplate);
}
SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
Composite compositeBody = new Composite(sashForm, SWT.NONE);
compositeBody.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
GridLayout gl_compositeBody = new GridLayout(1, false);
gl_compositeBody.verticalSpacing = 0;
gl_compositeBody.horizontalSpacing = 0;
gl_compositeBody.marginHeight = 0;
gl_compositeBody.marginWidth = 0;
compositeBody.setLayout(gl_compositeBody);
textSearch = new Text(compositeBody, SWT.SEARCH | SWT.ICON_SEARCH | SWT.ICON_CANCEL);
textSearch.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
filterText();
}
});
textSearch.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
tvSQLTemplate = new TreeViewer(compositeBody, SWT.BORDER | SWT.FULL_SELECTION);
tvSQLTemplate.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
StructuredSelection ss = (StructuredSelection)event.getSelection();
if(ss.getFirstElement() instanceof SQLTemplateDAO) {
SQLTemplateDAO dao = (SQLTemplateDAO)ss.getFirstElement();
if(SQL_TEMPLATE_TYPE.PUB.name().equals(dao.getCategory())) {
if(SessionManager.isSystemAdmin()) {
enableBtn(true);
} else {
enableBtn(false);
}
} else {
enableBtn(true);
}
textSQL.setText(dao.getContent());
} else {
enableBtn(false);
textSQL.setText("");
}
}
private void enableBtn(boolean bool) {
tltmModify.setEnabled(bool);
tltmDelete.setEnabled(bool);
}
});
tvSQLTemplate.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
StructuredSelection ss = (StructuredSelection)event.getSelection();
if(ss.getFirstElement() instanceof SQLTemplateDAO) {
SQLTemplateDAO dao = (SQLTemplateDAO)ss.getFirstElement();
FindEditorAndWriteQueryUtil.run(dao.getContent());
}
}
});
Tree tree = tvSQLTemplate.getTree();
tree.setLinesVisible(true);
tree.setHeaderVisible(true);
tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
TreeViewerColumn treeViewerColumn = new TreeViewerColumn(tvSQLTemplate, SWT.NONE);
TreeColumn trclmnUrl = treeViewerColumn.getColumn();
trclmnUrl.setWidth(55);
trclmnUrl.setText(Messages.get().GroupName);
TreeViewerColumn tvcName = new TreeViewerColumn(tvSQLTemplate, SWT.NONE);
TreeColumn trclmnDBName = tvcName.getColumn();
trclmnDBName.setWidth(100);
trclmnDBName.setText(CommonMessages.get().Name);
TreeViewerColumn treeViewerColumn_2 = new TreeViewerColumn(tvSQLTemplate, SWT.NONE);
TreeColumn trclmnDescription = treeViewerColumn_2.getColumn();
trclmnDescription.setWidth(100);
trclmnDescription.setText(CommonMessages.get().Description);
TreeViewerColumn treeViewerColumn_1 = new TreeViewerColumn(tvSQLTemplate, SWT.NONE);
TreeColumn trclmnName = treeViewerColumn_1.getColumn();
trclmnName.setWidth(300);
trclmnName.setText(Messages.get().SQL);
Composite compositeSQL = new Composite(sashForm, SWT.NONE);
GridLayout gl_compositeSQL = new GridLayout(1, false);
gl_compositeSQL.verticalSpacing = 0;
gl_compositeSQL.horizontalSpacing = 0;
gl_compositeSQL.marginHeight = 0;
gl_compositeSQL.marginWidth = 0;
compositeSQL.setLayout(gl_compositeSQL);
textSQL = new TadpoleEditorWidget(compositeSQL, SWT.BORDER, EditorDefine.EXT_DEFAULT, "", "");
textSQL.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
sashForm.setWeights(new int[] {7, 3});
tvSQLTemplate.setContentProvider(new SQLTemplateContentprovider());
tvSQLTemplate.setLabelProvider(new SQLTemplateLabelprovider());
// Composite compositeTail = new Composite(parent, SWT.NONE);
// compositeTail.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
// compositeTail.setLayout(new GridLayout(1, false));
initData();
filter = new SQLTemplateFilter();
tvSQLTemplate.addFilter(filter);
AnalyticCaller.track(SQLTemplateView.ID);
}
/**
* add template
*
* @param type
*/
private void addTemplate(SQL_TEMPLATE_TYPE type) {
SQLTemplateDialog dialog = new SQLTemplateDialog(getSite().getShell(), type);
if(Dialog.OK == dialog.open()) {
SQLTemplateDAO addDao = dialog.getSqlTemplateDAO();
if(SQL_TEMPLATE_TYPE.PRI == type) {
grpPrivateDao.getChildList().add(addDao);
} else {
grpPublicDao.getChildList().add(addDao);
}
tvSQLTemplate.refresh();
tvSQLTemplate.setSelection(new StructuredSelection(addDao), true);
}
}
/**
* filter text
*/
private void filterText() {
filter.setSearchText(textSearch.getText());
tvSQLTemplate.refresh();
}
/*
* init data
*/
private void initData() {
listGroup.clear();
try {
grpPublicDao = new SQLTemplateGroupDAO();
grpPublicDao.setName(Messages.get().SQLTemplateView_PUBLIC_Person);
grpPublicDao.setChildList(TadpoleSystem_SQLTemplate.listPublicSQLTemplate());
listGroup.add(grpPublicDao);
grpPrivateDao = new SQLTemplateGroupDAO();
grpPrivateDao.setName(Messages.get().SQLTemplateView_Person);
grpPrivateDao.setChildList(TadpoleSystem_SQLTemplate.listPrivateSQLTemplate());
listGroup.add(grpPrivateDao);
tvSQLTemplate.setInput(listGroup);
tvSQLTemplate.expandAll();
} catch(Exception e) {
logger.error("list sql template", e);
}
}
@Override
public void setFocus() {
}
}
/**
* sql template content provider
* @author hangum
*
*/
class SQLTemplateContentprovider extends ArrayContentProvider implements ITreeContentProvider {
@Override
public Object[] getChildren(Object parentElement) {
if(parentElement instanceof SQLTemplateGroupDAO) {
SQLTemplateGroupDAO gropDao = (SQLTemplateGroupDAO)parentElement;
return gropDao.childList.toArray();
}
return null;
}
@Override
public Object getParent(Object element) {
return null;
}
@Override
public boolean hasChildren(Object element) {
if(element instanceof SQLTemplateGroupDAO) {
SQLTemplateGroupDAO gropDao = (SQLTemplateGroupDAO)element;
return gropDao.childList.size() > 0;
}
return false;
}
}
/**
* laver provider
* @author hangum
*
*/
class SQLTemplateLabelprovider extends LabelProvider implements ITableLabelProvider {
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
@Override
public String getColumnText(Object element, int columnIndex) {
if(element instanceof SQLTemplateGroupDAO) {
SQLTemplateGroupDAO dao = (SQLTemplateGroupDAO)element;
if(columnIndex == 0) {
return dao.getName();
} else {
return "";
}
} else {
SQLTemplateDAO dao = (SQLTemplateDAO)element;
switch(columnIndex) {
case 1: return dao.getName();
case 2: return dao.getDescription();
case 3: return dao.getContent();
}
}
return "";
}
}