blob: 757ee21c8efeb0be60806a5f98514239f57896be [file] [log] [blame]
/*=========================================================================
* (c)Copyright 2002-2011, GemStone Systems, Inc. All Rights Reserved.
* 1260 NW Waterhouse Ave., Suite 200, Beaverton, OR 97006
* All Rights Reserved.
* =======================================================================*/
package com.gemstone.gemfire.mgmt.DataBrowser.ui;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ILazyContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.TableColumn;
import com.gemstone.gemfire.mgmt.DataBrowser.query.ColumnNotFoundException;
import com.gemstone.gemfire.mgmt.DataBrowser.query.ColumnValueNotAvailableException;
import com.gemstone.gemfire.mgmt.DataBrowser.query.IntrospectionResult;
import com.gemstone.gemfire.mgmt.DataBrowser.query.QueryResult;
import com.gemstone.gemfire.mgmt.DataBrowser.ui.model.QueryResultsInput;
import com.gemstone.gemfire.mgmt.DataBrowser.ui.tree.ExploreAction;
/**
* @author mghosh
*
*/
public class ResultsPanel extends Composite {
private static final int WIDTH = 100;
private List<TableViewer> tblResults_ = null;
private CTabFolder resultsContainer_;
/**
* @param parent
* @param style
*/
public ResultsPanel(Composite parent, int style) {
super(parent, style);
this.setBackground(this.getDisplay().getSystemColor(SWT.COLOR_GREEN));
GridLayout fl = new GridLayout();
this.setLayout(fl);
resultsContainer_ = new CTabFolder(this, SWT.NONE);
resultsContainer_.setBorderVisible(true);
// Display display = this.resultsPane_.getShell().getDisplay();
resultsContainer_
.addControlListener(new ResultsTabFolderResizeHandler(this));
resultsContainer_.setSimple(false);
resultsContainer_.setUnselectedCloseVisible(true);
resultsContainer_.setUnselectedImageVisible(true);
resultsContainer_
.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
addDummyTabs();
this.layout();
this.pack();
}
private void addDummyTabs() {
resultsContainer_.setTabHeight(0);
int iStyle = SWT.NONE;
iStyle |= SWT.BORDER;
CTabItem ti = new CTabItem(resultsContainer_, iStyle, 0);
ti.setControl(getDummyTable());
resultsContainer_.setSelection(0);
}
private Composite getDummyTable() {
Composite tableComp = new Composite(resultsContainer_, SWT.NONE);
GridLayout layout = new GridLayout();
tableComp.setLayout(layout);
tableComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
TableViewer viewer = new TableViewer(tableComp, SWT.SINGLE
| SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.VIRTUAL);
TableLayout lytTable = new TableLayout();
for (int i = 0; i < 2; i++) {
lytTable.addColumnData(new ColumnPixelData(WIDTH, true));
}
viewer.getTable().setLayout(lytTable);
viewer.getTable().setHeaderVisible(true);
viewer.getTable().setLinesVisible(true);
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
viewer.getTable().setLayoutData(gd);
String colName = "Key";
TableColumn col = new TableColumn(viewer.getTable(), SWT.NONE, 0);
col.setText(colName);
col.setResizable(true);
colName = "Value";
col = new TableColumn(viewer.getTable(), SWT.NONE, 1);
col.setText(colName);
col.setResizable(true);
return tableComp;
}
private void createTable(Composite parent,QueryResult results, IntrospectionResult result) {
TableViewer viewer = new TableViewer(parent, SWT.SINGLE
| SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.VIRTUAL);
TableLayout lytTable = new TableLayout();
int columnCount = result.getColumnCount();
for (int i = 0; i < columnCount; i++) {
lytTable.addColumnData(new ColumnPixelData(WIDTH, true));
}
viewer.getTable().setLayout(lytTable);
viewer.getTable().setHeaderVisible(true);
viewer.getTable().setLinesVisible(true);
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
viewer.getTable().setLayoutData(gd);
for (int i = 0; i < columnCount; i++) {
try {
String colName = result.getColumnName(i);
TableColumn col = new TableColumn(viewer.getTable(), SWT.NONE, i);
col.setText(colName);
col.setResizable(true);
}
catch (ColumnNotFoundException e) {
continue;
}
}
QueryResultsInput queryResultsInput = new QueryResultsInput(viewer,results, result);
int size = queryResultsInput.getSize();
viewer.setItemCount(size);
viewer.setContentProvider(new ResultTableContentProvider(viewer));
viewer.setLabelProvider(new ResultTableLabelProvider(viewer));
viewer.setInput(queryResultsInput);
ExploreAction exploreAction = new ExploreAction(this.getShell(), viewer);
MenuManager manager = new MenuManager();
viewer.getTable().setMenu(manager.createContextMenu(viewer.getTable()));
manager.add(exploreAction);
viewer.addDoubleClickListener(exploreAction);
if (tblResults_ == null)
tblResults_ = new ArrayList<TableViewer>();
tblResults_.add(viewer);
// this.tblResults_.getTable().addControlListener( new
// PaneResizeHandler(
// this ));
}
private Composite getTablePane(QueryResult results, IntrospectionResult result){
Composite tableComp = new Composite(resultsContainer_, SWT.NONE);
GridLayout layout = new GridLayout();
tableComp.setLayout(layout);
tableComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
createTable(tableComp, results, result);
return tableComp;
}
private void addTabs(QueryResult results) {
resultsContainer_.setTabHeight(SWT.DEFAULT);
IntrospectionResult[] introspectionResults = results.getIntrospectionResult();
for (int i = 0; i < introspectionResults.length; i++) {
int iStyle = SWT.NONE;
iStyle |= SWT.BORDER;
CTabItem ti = new CTabItem(resultsContainer_, iStyle, i);
ti.setText(introspectionResults[i].getJavaTypeName());
ti.setControl(getTablePane(results, introspectionResults[i]));
}
resultsContainer_.setSelection(0);
}
public void showResults(Object oResults) {
if (!(oResults instanceof QueryResult))
return;// only QueryResult is expected
disposeOldResults();
QueryResult results = (QueryResult)oResults;
if(results.isEmpty()) {
MessageBox mb = new MessageBox(getShell(), SWT.OK);
mb.setText("Query Result");
mb.setMessage("Query result is empty.");
mb.open();
} else {
addTabs(results);
}
}
public void handleEventForConnection() {
if(tblResults_ != null){
disposeOldResults();
addDummyTabs();
}
}
void disposeOldResults() {
CTabItem[] items = resultsContainer_.getItems();
for (int i = 0; i < items.length; i++) {
items[i].getControl().dispose();
items[i].dispose();
}
if (tblResults_ != null && !tblResults_.isEmpty()){
tblResults_.clear();
tblResults_ = null;
}
}
private static class ResultTableContentProvider implements
ILazyContentProvider {
private TableViewer viewer_;
ResultTableContentProvider(TableViewer viewer) {
viewer_ = viewer;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ILazyContentProvider#getElements(java
* .lang.Object)
*/
public void updateElement(int index) {
QueryResultsInput input = (QueryResultsInput)viewer_.getInput();
viewer_.replace(input.getElement(index), index);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
public void dispose() {
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface
* .viewers.Viewer, java.lang.Object, java.lang.Object)
*/
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
private static class ResultTableLabelProvider implements ITableLabelProvider {
private TableViewer viewer_;
ResultTableLabelProvider(TableViewer viewer) {
viewer_ = viewer;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang
* .Object, int)
*/
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang
* .Object, int)
*/
public String getColumnText(Object element, int columnIndex) {
String res = "";
if (element == null)
return res;
QueryResultsInput input = (QueryResultsInput)viewer_.getInput();
try {
Object columnValue = input.getColumnValue(element, columnIndex);
if (columnValue != null)
res = columnValue.toString();
}
catch (ColumnNotFoundException e) {
// TODO: MGH - Should this be logged
}
catch (ColumnValueNotAvailableException e) {
// TODO: MGH - Should this be logged
}
return res;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.
* jface.viewers.ILabelProviderListener)
*/
public void addListener(ILabelProviderListener listener) {
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
*/
public void dispose() {
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang
* .Object, java.lang.String)
*/
public boolean isLabelProperty(Object element, String property) {
return false;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse
* .jface.viewers.ILabelProviderListener)
*/
public void removeListener(ILabelProviderListener listener) {
}
}
static private class ResultsTabFolderResizeHandler implements ControlListener {
ResultsPanel parent_;
ResultsTabFolderResizeHandler(ResultsPanel p) {
parent_ = p;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.events.ControlListener#controlMoved(org.eclipse.swt
* .events .ControlEvent)
*/
public void controlMoved(ControlEvent e) {
// MGH: Do nothing; let the system handle it
// System.out.println( "ResultsTabFolderResizeHandler.controlMoved"
// );
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.swt.events.ControlListener#controlResized(org.eclipse.swt
* .events.ControlEvent)
*/
public void controlResized(ControlEvent e) {
Rectangle rcClntArea = parent_.getClientArea();
int clntWd = rcClntArea.width;
int clntHt = rcClntArea.height;
if (e.widget == parent_.resultsContainer_) {
// System.out.println(
// "ResultsTabFolderResizeHandler.controlResized for txtQueryEntry_"
// );
parent_.resultsContainer_.setBounds(0, 0, clntWd, clntHt);
}
}
} // ResultsTabFolderResizeHandler
}