ComparisonTable.java 4.83 KB
package com.gx.obe.component.comparison;

import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.IntStream;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;

import com.gx.obe.util.utils.Keys;

import de.kupzog.ktable.KTable;
import de.kupzog.ktable.KTableCellRenderer;
import de.kupzog.ktable.SWTX;
import de.kupzog.ktable.model.CommonKtableCModel;
import de.kupzog.ktable.renderers.FixedWrapCellRenderer;
import de.kupzog.ktable.renderers.TextWrapCellRenderer;

public class ComparisonTable extends KTable {
	
	/**
	 * @Description: 换行文本渲染
	 */
	private static final FixedWrapCellRenderer FIXED_RENDERER = new FixedWrapCellRenderer();
	/**
	 * @Description: 换行文本渲染
	 */
	private static final TextWrapCellRenderer TEXT_RENDERER = new TextWrapCellRenderer();
	
	/**
	 * @Description: 固定行数
	 */
	private static final int HEAD_ROW = 2;
	
	private final CommonKtableCModel model;
	
	private final List<Column> headColList;
	private final List<Column> titleColList;
	private final List<Column> itemColList;
	private final List<String> rowList;
	
	private final Map<Keys, String> headContentMap;
	private final Map<Keys, String> comparisonContentMap;
	
	public ComparisonTable(Composite parent, ComparisonData comparisonData) {
		super(parent, SWTX.AUTO_SCROLL | SWT.FULL_SELECTION | SWTX.EDIT_ON_KEY | SWTX.FILL_WITH_LASTCOL);
		
		comparisonData = Optional.ofNullable(comparisonData).orElseGet(ComparisonData::new);
		
		this.headColList = comparisonData.getHeadColList();
		this.titleColList = comparisonData.getTitleColList();
		this.itemColList = comparisonData.getItemColList();
		this.rowList = comparisonData.getRowList();
		
		this.headContentMap = comparisonData.getHeadContentMap();
		this.comparisonContentMap = comparisonData.getComparisonContentMap();
		
		this.model = new CommonKtableCModel(this, HEAD_ROW, headColList.size(), this.rowList.size(), titleColList.size() * itemColList.size());
		this.setModel(model);
//		this.model.setColumnWidth(sortCol, 40);
//		this.model.setColumnMaxWidth(sortCol, 80);
		IntStream.range(0, headColList.size()).forEach(i -> model.addRowSpan(0, i, HEAD_ROW));
		IntStream.range(0, titleColList.size()).map(i -> i * itemColList.size()).map(i -> i + headColList.size()).forEach(i -> model.addColSpan(0, i, itemColList.size()));
		
		IntStream.range(0, titleColList.size() * itemColList.size( )+ headColList.size()).forEach(i -> {
			model.setColumnWidth(i, 100);
			model.setColumnMaxWidth(i, 200);
		});
		
		this.model.setRowHeightRender($ -> 30);
//		this.model.setCellBackgroundRender(($, $$) -> SWTResourceManager.getColor(SWT.COLOR_WHITE));
		
		this.model.setCellContentRender(this::receiveContent);
		this.model.setCellRender(this::receiveCellRender);
		this.model.setCellAlignmentRender(this::receiveCellAlignment);
	}
	
	/**
	 * @Description: 加载内容
	 * @author chenxw
	 * @param row
	 * @param col
	 * @return
	 */
	private String receiveContent(int row, int col) {
 		if (col < headColList.size()) {
			if (row == 0) return Optional.of(headColList.get(col)).map(Column::getName).orElse("");
			if (row == 1) return "";
			return Optional.of(Keys.of(rowList.get(row - 2), headColList.get(col).getId())).map(headContentMap::get).orElse("");
		}
		col -= headColList.size();
		int itemSize = itemColList.size();
		if (row == 0) return Optional.of(titleColList.get(col / itemSize)).map(Column::getName).orElse("");
		if (row == 1) return Optional.of(itemColList.get(col % itemSize)).map(Column::getName).orElse("");
		try {
//			System.out.println( "get  keys:" +rowList.get(row - 2) +","+ titleColList.get(col / itemSize).getId()+","+itemColList.get(col % itemSize).getId()  + "   value :" + comparisonContentMap.get(Keys.of(rowList.get(row - 2), titleColList.get(col / itemSize).getId(), itemColList.get(col % itemSize).getId())) + "\r\n");
//			System.out.println(Keys.of(rowList.get(row - 2), titleColList.get(col / itemSize).getId(), itemColList.get(col % itemSize).getId()));
//			System.out.println(comparisonContentMap.get(Keys.of(rowList.get(row - 2), titleColList.get(col / itemSize).getId(), itemColList.get(col % itemSize).getId())));
			return Optional.of(Keys.of(rowList.get(row - 2), titleColList.get(col / itemSize).getId(), itemColList.get(col % itemSize).getId())).map(comparisonContentMap::get).orElse("");
		} catch (Exception e) {
			return "";
		}
	}
	
	/**
	 * @Description: 加载渲染器
	 * @author chenxw
	 * @param row
	 * @param col
	 * @return
	 */
	private KTableCellRenderer receiveCellRender(int row, int col) {
		if (this.model.isFixedCell(col, row)) {
			return FIXED_RENDERER;
		}
		return TEXT_RENDERER;
	}
	
	/**
	 * @Description: 加载单元格对齐方式
	 * @author chenxw
	 * @param row
	 * @param col
	 * @return
	 */
	private int receiveCellAlignment(int row, int col) {
		return SWTX.ALIGN_VERTICAL_CENTER | SWTX.ALIGN_HORIZONTAL_CENTER;
	}
	
}