/*******************************************************************************
* 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
* billy.goo - add dialog to view detail record
******************************************************************************/
package com.hangum.tadpole.rdb.core.editors.main.composite;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.eclipse.swt.SWT;
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.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine;
import com.hangum.tadpole.engine.define.DBGroupDefine;
import com.hangum.tadpole.engine.sql.util.resultset.QueryExecuteResultDTO;
import com.hangum.tadpole.engine.utils.RequestQuery;
import com.hangum.tadpole.preference.define.GetAdminPreference;
import com.hangum.tadpole.rdb.core.Activator;
import com.hangum.tadpole.rdb.core.Messages;
import com.hangum.tadpole.rdb.core.editors.main.composite.plandetail.AbstractPlanComposite;
import com.hangum.tadpole.rdb.core.editors.main.composite.plandetail.GeneralPlanComposite;
import com.hangum.tadpole.rdb.core.editors.main.composite.plandetail.OraclePlanComposite;
import com.hangum.tadpole.rdb.core.editors.main.composite.tail.PlanTailComposite;
import com.hangum.tadpole.rdb.core.util.QueryResultSaved;
import com.hangum.tadpole.session.manager.SessionManager;
import com.swtdesigner.ResourceManager;
/**
* plan 을 보여주기 위한
*
*/
public class ResultPlanComposite extends Composite {
/** Logger for this class. */
private static final Logger logger = Logger.getLogger(ResultPlanComposite.class);
private ResultMainComposite resultMainComposite;
private Button btnAddVertical;
private SashForm sashFormResult;
private AbstractPlanComposite compositeQueryPlan;
/**
* Create the composite.
* @param parent
* @param style
*/
public ResultPlanComposite(Composite parent, int style) {
super(parent, style);
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.verticalSpacing = 2;
gridLayout.horizontalSpacing = 2;
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 2;
setLayout(gridLayout);
Composite compHead = new Composite(this, SWT.NONE);
compHead.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
GridLayout gl_composite = new GridLayout(7, false);
gl_composite.verticalSpacing = 2;
gl_composite.horizontalSpacing = 2;
gl_composite.marginHeight = 0;
gl_composite.marginWidth = 2;
compHead.setLayout(gl_composite);
btnAddVertical = new Button(compHead, SWT.NONE);
btnAddVertical.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if(SWT.VERTICAL == sashFormResult.getOrientation()) {
sashFormResult.setOrientation(SWT.HORIZONTAL);
btnAddVertical.setImage(ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/editor/layouts_split_vertical.png"));
} else {
sashFormResult.setOrientation(SWT.VERTICAL);
btnAddVertical.setImage(ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/editor/layouts_split_horizontal.png"));
}
layout();
}
});
btnAddVertical.setToolTipText(Messages.get().ChangeRotation);
btnAddVertical.setImage(ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/editor/layouts_split_horizontal.png"));
sashFormResult = new SashForm(this, SWT.HORIZONTAL);
sashFormResult.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
// compositeQueryPlan = new GeneralPlanComposite(sashFormResult, SWT.BORDER);
// compositeQueryPlan.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 2));
// GridLayout gl_compositeResult = new GridLayout(1, false);
// gl_compositeResult.verticalSpacing = 2;
// gl_compositeResult.horizontalSpacing = 2;
// gl_compositeResult.marginHeight = 0;
// gl_compositeResult.marginWidth = 2;
// compositeQueryPlan.setLayout(gl_compositeResult);
}
public void setRDBResultComposite(ResultMainComposite resultMainComposite) {
this.resultMainComposite = resultMainComposite;
}
/**
* 쿼리 결과 저장여부
*
* @param reqQuery
* @param rsDAO
* @param longHistorySeq
*/
public void setQueryPlanData(RequestQuery reqQuery, QueryExecuteResultDTO rsDAO, long longHistorySeq) {
if(compositeQueryPlan != null && !compositeQueryPlan.getCompositeTail().getBtnPinSelection()) {
compositeQueryPlan.setQueryPlanData(reqQuery, rsDAO);
} else {
if(DBGroupDefine.ORACLE_GROUP == rsDAO.getUserDB().getDBGroup()) {
compositeQueryPlan = new OraclePlanComposite(sashFormResult, SWT.BORDER, rsDAO);
} else {
compositeQueryPlan = new GeneralPlanComposite(sashFormResult, SWT.BORDER, rsDAO);
}
compositeQueryPlan.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 2));
GridLayout gl_compositeResult = new GridLayout(1, false);
gl_compositeResult.verticalSpacing = 2;
gl_compositeResult.horizontalSpacing = 2;
gl_compositeResult.marginHeight = 0;
gl_compositeResult.marginWidth = 2;
compositeQueryPlan.setLayout(gl_compositeResult);
compositeQueryPlan.setQueryPlanData(reqQuery, rsDAO);
}
/** 쿼리 결과를 저장합니다 */
if(PublicTadpoleDefine.YES_NO.YES.name().equals(rsDAO.getUserDB().getIs_result_save())) {
QueryResultSaved.queryResult(GetAdminPreference.getQueryResultSaved() + PublicTadpoleDefine.DIR_SEPARATOR + SessionManager.getUserSeq(), ""+longHistorySeq, rsDAO);
}
resultSashLayout();
}
/**
* refresh sash layout form
*
*/
private void resultSashLayout() {
Map<Integer, Integer> mapWidths = new HashMap<Integer, Integer>();
Map<Integer, Integer> mapHeight = new HashMap<Integer, Integer>();
int intTmpCount = 0;
try {
List<GeneralPlanComposite> listDisComp = new ArrayList<>();
Control[] childControls = sashFormResult.getChildren();
for (int i=0; i<childControls.length; i++) {
Control control = childControls[i];
if(control instanceof GeneralPlanComposite) {
GeneralPlanComposite resultComposite = (GeneralPlanComposite)control;
PlanTailComposite tailComposite = resultComposite.getCompositeTail();
if(!tailComposite.getBtnPinSelection()) {
listDisComp.add(resultComposite);
} else {
mapWidths.put(intTmpCount, resultComposite.getBounds().width);
mapHeight.put(intTmpCount, resultComposite.getBounds().height);
intTmpCount++;
}
}
}
// 삭제한다.
int intDispCount = listDisComp.size()-1;
for(int i=0; i<intDispCount; i++) {
listDisComp.get(i).dispose();
}
int weights[] = new int[mapWidths.size()+1];
if(mapWidths.size() != 0) {
for (int i=0; i<mapWidths.size(); i++) {
float intCompositeWeights = 0f;
if(sashFormResult.getOrientation() == SWT.HORIZONTAL) {
intCompositeWeights = mapWidths.get(i) * 100;
} else {
intCompositeWeights = mapHeight.get(i) * 100;
}
weights[i] = (int)intCompositeWeights;
intTmpCount += weights[i];
// 처음 위젯이 생성 되었을 경우무조건 100이므로 반만 위젲을 준다.
if(weights[i] == 100) {
weights[i] = 50;
intTmpCount = 50;
// 100 이 넘어가면 마지막 위젲에서 30로 만큼 위젲을 차지한다.
} else if(intTmpCount >= 100) {
weights[i] = 30;
}
}
weights[mapWidths.size()] = 100 - intTmpCount;
} else {
weights[0] = 100;
}
sashFormResult.setWeights(weights);
} catch(Exception e) {
logger.error("calc weights of result composite");
}
sashFormResult.layout();
}
@Override
protected void checkSubclass() {
// Disable the check that prevents subclassing of SWT components
}
}