// ============================================================================ // // 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.util.ArrayList; import java.util.List; 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.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; /** * this customized nebula grid is used for indicator selection. */ public class IndicatorSelectGrid extends AbstractIndicatorSelectGrid implements Observerable<ObserverEvent>, TDQObserver<ObserverEvent> { private List<TDQObserver<ObserverEvent>> observers = null; private int[] preferColumnsWidth = null; /** * DOC talend IndicatorSelectGrid constructor comment. * * @param dialog * @param parent * @param style * @param modelElementIndicators */ public IndicatorSelectGrid(IndicatorSelectDialog dialog, Composite parent, int style, ModelElementIndicator[] modelElementIndicators, int[] preferColumnsWidth, List<Object[]> previewData) { super(dialog, parent, style, modelElementIndicators, previewData); this.preferColumnsWidth = preferColumnsWidth; initializeGrid(); addVscrollBarListener(); } /* * (non-Javadoc) * * @see org.eclipse.swt.widgets.Control#redraw() */ @Override public void redraw() { super.redraw(); notifyObservers(); } /* * (non-Javadoc) * * @see * org.talend.dataprofiler.core.ui.grid.utils.Observerable#addObserver(org.talend.dataprofiler.core.ui.grid.utils * .TalendObserver) */ 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 * .TalendObserver) */ 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() { if (observers == null) { return; } for (TDQObserver<ObserverEvent> observer : observers) { ObserverEvent observerEvent = new ObserverEvent(ObserverEventEnum.ItemHeaderWidth); observerEvent.putData(ObserverEvent.ITEM_HEADER_WIDTH, this.getItemHeaderWidth()); observer.update(observerEvent); } } /* * (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#getColumnHeaderRenderer() */ @Override protected AbstractColumnHerderRenderer getColumnHeaderRenderer() { return new TdColumnEmptyHeaderRenderer(); } /* * (non-Javadoc) * * @see org.talend.dataprofiler.core.ui.grid.utils.TDQObserver#update(java.lang.Object) */ public void update(ObserverEvent observerEvent) { switch (observerEvent.getEventType()) { case ColumnResize: Object data = observerEvent.getData(ObserverEvent.COLUMN_HEADER_RESIZE); if (data == null) { return; } GridColumn sourceGridColumn = ((GridColumn) data); for (GridColumn currColumn : this.getColumns()) { Object oldmodelElementIndicator = sourceGridColumn.getData(); if (oldmodelElementIndicator == currColumn.getData()) { currColumn.setWidth(sourceGridColumn.getWidth()); break; } } break; case MoveColumn: data = observerEvent.getData(ObserverEvent.COLUMN_HEADER_MOVE); if (data == null) { return; } this.setColumnOrder((int[]) data); if (result == null) { result = new ModelElementIndicator[getColumnCount() - 2]; } int[] order = getColumnOrder(); int j = 0; for (int columnIndex : order) { if (columnIndex > 1) { result[j] = _modelElementIndicators[columnIndex - 2]; // indicator selection starts from the 3rd // column j++; } } redraw(); break; case HSrcollMove: data = observerEvent.getData(ObserverEvent.HORIZONTAL_SCROLLBAR_MOVE); if (data == null || getHorizontalBar() == null) { return; } getHorizontalBar().setSelection(Integer.parseInt(data.toString())); redraw(getClientArea().x, getClientArea().y, getClientArea().width, getClientArea().height, false); break; case VSrcollVisible: data = observerEvent.getData(ObserverEvent.VERTICAL_SRCOLL_VISABLE); if (data == null || getVerticalBar() == null) { return; } if (!getVerticalBar().isVisible() && Boolean.parseBoolean(data.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(data.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); } break; case ColumnHighlight: data = observerEvent.getData(ObserverEvent.COLUMN_HIGH_LIGHT); handleColumnHighlight(((Integer) data)); break; } } /* * (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); } } /** * 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); } } @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); } } } /** * DOC talend Comment method "hideInvalidItem". * * @param selection */ public void hideInvalidItem(boolean selection) { for (GridItem item : this.getItems()) { if (TalendGridItem.class.isInstance(item)) { TalendGridItem talendItem = (TalendGridItem) item; if (!talendItem.getCheckable()) { talendItem.hideItem(selection); } } } redraw(); } @Override protected int getPreferWidth(int index) { if (index < preferColumnsWidth.length + 2) { return preferColumnsWidth[index + 2]; } else { return COLUMN_WIDTH; } } }