// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.dataprofiler.core.ui.grid;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.nebula.widgets.grid.GridCellRenderer;
import org.eclipse.nebula.widgets.grid.GridColumn;
import org.eclipse.nebula.widgets.grid.GridItem;
import org.eclipse.nebula.widgets.grid.TalendGridItem;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.talend.core.model.metadata.builder.connection.MetadataColumn;
import org.talend.cwm.helper.ColumnHelper;
import org.talend.dataprofiler.core.helper.ModelElementIndicatorHelper;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dataprofiler.core.model.ModelElementIndicator;
import org.talend.dataprofiler.core.ui.grid.utils.Observerable;
import org.talend.dataprofiler.core.ui.grid.utils.TDQObserver;
import org.talend.dataprofiler.core.ui.grid.utils.events.ObserverEvent;
import org.talend.dataprofiler.core.ui.grid.utils.events.ObserverEventEnum;
import org.talend.dataquality.PluginConstant;
import orgomg.cwm.objectmodel.core.ModelElement;
/**
* The table which is used be preivew data
*
*/
public class ColumnPreviewGrid extends AbstractIndicatorSelectGrid implements TDQObserver<ObserverEvent>,
Observerable<ObserverEvent> {
private List<TDQObserver<ObserverEvent>> observers = null;
/**
* ColumnPreviewGrid constructor comment.
*
* @param dialog
* @param parent
* @param style
* @param modelElementIndicators
*/
public ColumnPreviewGrid(IndicatorSelectDialog dialog, Composite parent, int style,
ModelElementIndicator[] modelElementIndicators, int limit, List<Object[]> previewData) {
super(dialog, parent, style, modelElementIndicators, limit, previewData);
initializeGrid();
addVscrollBarListener();
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.grid.AbstractIndicatorSelectGrid#createTableContent()
*/
@Override
protected void createTableContent() {
try {
TalendGridItem PreviewItem = new TalendGridItem(this, SWT.NONE);
for (int i = 0; i < this.getColumnCount(); i++) {
PreviewItem.setCheckable(i, false);
}
PreviewItem.setText(DefaultMessagesImpl.getString("ColumnPreviewGrid.PreviewItemLabel")); //$NON-NLS-1$
processNodePrivew(null, PreviewItem);
PreviewItem.setExpanded(true);
} catch (SQLException e) {
}
}
/**
* DOC talend Comment method "processNodePrivew".
*
* @param object
* @param previewItem
* @throws SQLException
*/
private void processNodePrivew(Object object, GridItem parentItem) throws SQLException {
if (!checkSameTable()) {
return;
}
for (int j = 0; j < limitNumber; j++) {
TalendGridItem currentItem = new TalendGridItem(parentItem, SWT.NONE);
currentItem.setCheckable(0, false);
currentItem.setCheckable(1, false);
for (int i = 2; i < this.getColumnCount(); i++) {
GridColumn column = getColumn(i);
currentItem.setCheckable(i, false);
String columnValue = getColumnValue(i - 2, currentItem);
if (columnValue == null) {
this.remove(this.indexOf(currentItem));
return;
}
int minWith = columnValue.length() * 7 > 100 ? 100 : columnValue.length() * 7;
column.setWidth(COLUMN_WIDTH < minWith ? minWith : COLUMN_WIDTH);
currentItem.setText(i, columnValue);
}
}
}
/**
* DOC talend Comment method "checkSameTable".
*
* @return
*/
private boolean checkSameTable() {
List<MetadataColumn> columnsList = ModelElementIndicatorHelper.getColumns(_modelElementIndicators);
return ColumnHelper.checkSameTable(columnsList.toArray(new ModelElement[columnsList.size()]));
}
/**
* DOC talend Comment method "getColumnValue".
*
* @param column
* @param currentItem
* @return
* @throws SQLException
*/
private String getColumnValue(int columnNumber, GridItem currentItem) throws SQLException {
// row index
int indexOfRow = this.indexOf(currentItem);
if (indexOfRow - 1 < previewData.size()) {
Object[] objects = previewData.get(indexOfRow - 1);
Object columnValue = objects[columnNumber];
return columnValue == null ? PluginConstant.NULL_STRING : columnValue.toString();
}
return null;
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.grid.utils.TalendObserver#Update(org.talend.dataprofiler.core.ui.grid.utils.
* Observerable)
*/
public void update(ObserverEvent observer) {
switch (observer.getEventType()) {
case ItemHeaderWidth:
Object width = observer.getData(ObserverEvent.ITEM_HEADER_WIDTH);
if (width == null) {
return;
}
this.setItemHeaderWidth(Integer.parseInt(width.toString()));
break;
case HSrcollMove:
Object selection = observer.getData(ObserverEvent.HORIZONTAL_SCROLLBAR_MOVE);
if (selection == null) {
return;
}
this.getHorizontalBar().setSelection(Integer.parseInt(selection.toString()));
redraw(getClientArea().x, getClientArea().y, getClientArea().width, getClientArea().height, false);
break;
case VSrcollVisible:
Object show = observer.getData(ObserverEvent.VERTICAL_SRCOLL_VISABLE);
if (show == null || getVerticalBar() == null) {
return;
}
if (!getVerticalBar().isVisible() && Boolean.parseBoolean(show.toString())) {
// make current table bounds change to small
GridData previewGridData = (GridData) this.getLayoutData();
previewGridData.widthHint = this.getBounds().width - 50 - getVerticalBar().getSize().x;
previewGridData.minimumWidth = this.getBounds().width - 50 - getVerticalBar().getSize().x;
previewGridData.horizontalAlignment = SWT.BEGINNING;
this.getParent().layout();
}
if (!getVerticalBar().isVisible() && !Boolean.parseBoolean(show.toString())) {
// make current table bounds change to big
GridData previewGridData = (GridData) this.getLayoutData();
if (previewGridData.horizontalAlignment == SWT.FILL) {
return;
}
previewGridData.minimumWidth = 650;
previewGridData.horizontalAlignment = SWT.FILL;
notifyVerticalBarShown(false);
this.getParent().layout();
}
break;
case ColumnHighlight:
Object data = observer.getData(ObserverEvent.COLUMN_HIGH_LIGHT);
handleColumnHighlight(((Integer) data));
break;
default:
break;
}
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.grid.AbstractIndicatorSelectGrid#getCellRenderer()
*/
@Override
protected GridCellRenderer getCellRenderer() {
return new AbstractTdCellRenderer();
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.grid.AbstractIndicatorSelectGrid#redrawTable()
*/
@Override
protected void redrawTable() {
GridData previewGridData = (GridData) this.getLayoutData();
if (previewGridData.minimumHeight == this.getHeaderHeight() + this.getItemHeight() * 2) {
previewGridData.minimumHeight = this.getHeaderHeight() + this.getItemHeight() * 10;
previewGridData.heightHint = this.getHeaderHeight() + this.getItemHeight() * 10;
} else {
previewGridData.minimumHeight = this.getHeaderHeight() + this.getItemHeight() * 2;
previewGridData.heightHint = this.getHeaderHeight() + this.getItemHeight() * 2;
}
this.getParent().layout();
}
/*
* (non-Javadoc)
*
* @see
* org.talend.dataprofiler.core.ui.grid.utils.Observerable#addObserver(org.talend.dataprofiler.core.ui.grid.utils
* .TDQObserver)
*/
public boolean addObserver(TDQObserver<ObserverEvent> observer) {
initObserverable();
return observers.add(observer);
}
/*
* (non-Javadoc)
*
* @see
* org.talend.dataprofiler.core.ui.grid.utils.Observerable#removeObserver(org.talend.dataprofiler.core.ui.grid.utils
* .TDQObserver)
*/
public boolean removeObserver(TDQObserver<ObserverEvent> observer) {
if (observers == null) {
return false;
}
return observers.remove(observer);
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.grid.utils.Observerable#clearObserver()
*/
public void clearObserver() {
if (observers == null) {
return;
}
observers.clear();
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.grid.utils.Observerable#notifyObservers()
*/
public void notifyObservers() {
// no need to implement
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.grid.utils.Observerable#initObserverable()
*/
public void initObserverable() {
if (observers == null) {
observers = new ArrayList<TDQObserver<ObserverEvent>>();
}
}
/*
* (non-Javadoc)
*
* @see
* org.talend.dataprofiler.core.ui.grid.AbstractIndicatorSelectGrid#notifyObservers(org.eclipse.nebula.widgets.grid
* .GridColumn)
*/
@Override
protected void notifyObservers(Event event) {
if (observers == null) {
return;
}
GridColumn sourceColumn = null;
if (GridColumn.class.isInstance(event.item)) {
sourceColumn = (GridColumn) event.item;
} else {
return;
}
for (TDQObserver<ObserverEvent> observer : observers) {
ObserverEvent observerEvent = null;
if (SWT.Resize == event.type) {
observerEvent = new ObserverEvent(ObserverEventEnum.ColumnResize);
observerEvent.putData(ObserverEvent.COLUMN_HEADER_RESIZE, sourceColumn);
} else if (SWT.Move == event.type) {
observerEvent = new ObserverEvent(ObserverEventEnum.MoveColumn);
observerEvent.putData(ObserverEvent.COLUMN_HEADER_MOVE, this.getColumnOrder());
} else {
continue;
}
observer.update(observerEvent);
}
}
/**
* DOC talend Comment method "notifyVerticalBarVisible".
*
* @param observer
*/
@Override
protected void notifyVerticalBarShown(boolean show) {
if (observers == null) {
return;
}
for (TDQObserver<ObserverEvent> observer : observers) {
ObserverEvent observerEvent = new ObserverEvent(ObserverEventEnum.VSrcollVisible);
observerEvent.putData(ObserverEvent.VERTICAL_SRCOLL_VISABLE, show);
observer.update(observerEvent);
}
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.ui.grid.AbstractIndicatorSelectGrid#notifyHscrollSelectionChange()
*/
@Override
protected void notifyHscrollSelectionChange() {
if (observers == null) {
return;
}
for (TDQObserver<ObserverEvent> observer : observers) {
ObserverEvent observerEvent = new ObserverEvent(ObserverEventEnum.HSrcollMove);
observerEvent.putData(ObserverEvent.HORIZONTAL_SCROLLBAR_MOVE, this.getHorizontalBar().getSelection());
observer.update(observerEvent);
}
}
@Override
protected void notifyhandleColumnHighlight(MouseEvent e) {
if (observers == null) {
return;
}
for (TDQObserver<ObserverEvent> observer : observers) {
ObserverEvent observerEvent = new ObserverEvent(ObserverEventEnum.ColumnHighlight);
GridColumn currentColumn = this.getColumn(new Point(e.x, e.y));
if (currentColumn != null) {
observerEvent.putData(ObserverEvent.COLUMN_HIGH_LIGHT, this.indexOf(currentColumn));
observer.update(observerEvent);
}
}
}
public int[] getColumnsWidth() {
int[] result = new int[this.getColumnCount()];
for (int index = 0; index < this.getColumnCount(); index++) {
result[index] = this.getColumn(index).getWidth();
}
return result;
}
@Override
protected int getPreferWidth(int index) {
return COLUMN_WIDTH;
}
}