@Override
    public Dimension getPreferredSize() {
      if (scrollable == null) {
        return super.getPreferredSize();
      } else {
        int width = super.getPreferredSize().width;
        int height = ((JComponent) scrollable).getPreferredSize().height;

        // the list view has some weird rendering sometimes (double space after last result)
        // so don't fill full screen on list view
        if ((scrollable instanceof ListViewTable)) {
          // old check, if sponsored results aren't showing properlly revert to just using this
          if (sponsoredResultsPanel.isVisible()) {
            height = Math.max(height, sponsoredResultsPanel.getPreferredSize().height);
          }
        } else { // classic view
          int headerHeight = 0;

          // the table headers aren't being set on the scrollpane, so if its visible check its
          // height and subtract it from the viewport size
          JTableHeader header = ((JTable) scrollable).getTableHeader();
          if (header != null && header.isShowing()) {
            headerHeight = header.getHeight();
          }

          // if the height of table is less than the scrollPane height, set preferred height
          // to same size as scrollPane
          if (height < scrollPane.getSize().height - headerHeight) {
            height = scrollPane.getSize().height - headerHeight;
          }
        }
        return new Dimension(width, height);
      }
    }
  /** Part of print code coped from Sun */
  public void getPageInfo(Graphics g, PageFormat pageFormat) {

    subTableSplit = null;
    subTableSplitSize = 0;
    subPageIndex = 0;
    prevPageIndex = 0;

    fontHeight = (int) (g.getFontMetrics().getHeight() * scale);
    fontDesent = (int) (g.getFontMetrics().getDescent() * scale);

    tableHeader = _table.getTableHeader();
    //		double headerWidth = tableHeader.getWidth() * scale;
    headerHeight = tableHeader.getHeight() + _table.getRowMargin() * scale;

    pageHeight = pageFormat.getImageableHeight();
    pageWidth = pageFormat.getImageableWidth();

    //		double tableWidth =_table.getColumnModel().getTotalColumnWidth() * scale;
    tableHeight = _table.getHeight() * scale;
    rowHeight = _table.getRowHeight() + _table.getRowMargin() * scale;

    tableHeightOnFullPage = (int) (pageHeight - headerHeight - fontHeight * 2);
    tableHeightOnFullPage = tableHeightOnFullPage / rowHeight * rowHeight;

    TableColumnModel tableColumnModel = tableHeader.getColumnModel();
    int columns = tableColumnModel.getColumnCount();
    int columnMargin = (int) (tableColumnModel.getColumnMargin() * scale);

    int[] temp = new int[columns];
    int columnIndex = 0;
    temp[0] = 0;
    int columnWidth;
    int length = 0;
    subTableSplitSize = 0;
    while (columnIndex < columns) {

      columnWidth = (int) (tableColumnModel.getColumn(columnIndex).getWidth() * scale);

      if (length + columnWidth + columnMargin > pageWidth) {
        temp[subTableSplitSize + 1] = temp[subTableSplitSize] + length;
        length = columnWidth;
        subTableSplitSize++;
      } else {
        length += columnWidth + columnMargin;
      }
      columnIndex++;
    } // while

    if (length > 0) { // if are more columns left, part page
      temp[subTableSplitSize + 1] = temp[subTableSplitSize] + length;
      subTableSplitSize++;
    }

    subTableSplitSize++;
    subTableSplit = new int[subTableSplitSize];
    for (int i = 0; i < subTableSplitSize; i++) {
      subTableSplit[i] = temp[i];
    }
    totalNumPages = (int) (tableHeight / tableHeightOnFullPage);
    if (tableHeight % tableHeightOnFullPage >= rowHeight) { // at least 1 more row left
      totalNumPages++;
    }

    totalNumPages *= (subTableSplitSize - 1);
    pageinfoCalculated = true;
  }