package com.hackerdude.apps.sqlide.components; import java.awt.Font; import java.awt.Graphics2D; import java.awt.font.FontRenderContext; import javax.swing.JComponent; import javax.swing.plaf.FontUIResource; import javax.swing.table.DefaultTableColumnModel; import javax.swing.table.TableColumn; import com.hackerdude.apps.sqlide.dataaccess.QueryResults; /** * Title: JSqlIde * Description: A Java SQL Integrated Development Environment * Copyright: Copyright (c) David Martinez * Company: * @author David Martinez * @version 1.0 */ public class ResultSetColumnModel extends DefaultTableColumnModel { QueryResults queryResults; Font intendedFont; JComponent renderComponent; int avgCharWidth; int aggregatedWidths; public ResultSetColumnModel(QueryResults results, Font fontToUse, JComponent renderComponent) { super(); intendedFont = fontToUse; queryResults = results; this.renderComponent = renderComponent; addResultSetColumns(); recalculateWidths(); } private void setIntendedFont(Font fontToUse) { intendedFont = fontToUse; avgCharWidth = getAverageCharacterWidth(); } private void addResultSetColumns() { for ( int i=0; i<queryResults.getColumnCount(); i++) { TableColumn newColumn = new TableColumn(i); newColumn.setHeaderValue(queryResults.getColumnName(i)); boolean shouldShowClobEditor = queryResults.getColumnSQLTypes()[i] == java.sql.Types.CLOB; if ( shouldShowClobEditor ) { /** @todo add clob editor!! */ System.out.println("ResultSetColumnModel:50: Add clob editor!"); } addColumn(newColumn); } } private void recalculateWidths() { aggregatedWidths = 0; for ( int i=0; i<queryResults.getColumnCount(); i++) { TableColumn column = getColumn(i); int columnSize = queryResults.getColumnSize(i); int dataWidth = getAverageCharacterWidth() *columnSize; int titleWidth = getColumnTitlePixelWidth(i); int actualWidth = dataWidth; if ( dataWidth < titleWidth ) actualWidth = titleWidth; column.setMaxWidth(actualWidth*2); column.setPreferredWidth(actualWidth); column.setMinWidth(actualWidth / 2); aggregatedWidths = aggregatedWidths + actualWidth; } } /** * This function returns the pixel width of the average character as * would be rendered using the intended font into the render component. */ private int getAverageCharacterWidth() { Graphics2D g2 = (Graphics2D)renderComponent.getGraphics(); int result = 8; // Default FontUIResource fui = new FontUIResource(intendedFont); FontRenderContext frc = g2.getFontRenderContext(); int widestLetterWidth = (int)fui.getStringBounds("W", frc).getWidth(); int narrowestLetterWidth = (int)fui.getStringBounds("I", frc).getWidth(); result = ( widestLetterWidth + narrowestLetterWidth ) / 2; return result; } /** * This function returns the pixel width of the average character as * would be rendered using the intended font into the render component. */ private int getColumnTitlePixelWidth(int columnIndex) { Graphics2D g2 = (Graphics2D)renderComponent.getGraphics(); int result = 8; // Default FontUIResource fui = new FontUIResource(intendedFont); FontRenderContext frc = g2.getFontRenderContext(); result = (int)fui.getStringBounds(getColumn(columnIndex).getHeaderValue().toString(), frc).getWidth(); return result; } /** * This function returns the aggregated widths for all the columns. */ public int getAggregatedWidths() { return aggregatedWidths; } }