JAL-2375 JAL-2376 First commit of implementation for Phyre2 result browsing, template...
[jalview.git] / src / jalview / gui / JvSummaryTable.java
diff --git a/src/jalview/gui/JvSummaryTable.java b/src/jalview/gui/JvSummaryTable.java
new file mode 100644 (file)
index 0000000..2881e85
--- /dev/null
@@ -0,0 +1,195 @@
+package jalview.gui;
+
+import jalview.fts.api.FTSData;
+import jalview.fts.api.FTSDataColumnI;
+import jalview.fts.core.DecimalFormatTableCellRenderer;
+import jalview.fts.core.FTSRestRequest;
+
+import java.awt.event.MouseEvent;
+import java.util.Collection;
+import java.util.Map;
+
+import javax.swing.JTable;
+import javax.swing.event.ChangeEvent;
+import javax.swing.table.DefaultTableModel;
+import javax.swing.table.TableColumn;
+
+@SuppressWarnings("serial")
+public class JvSummaryTable extends JTable
+{
+  private Map<String, Integer> tempUserPrefs;
+
+  public JvSummaryTable(Map<String, Integer> tempUserPrefs)
+  {
+    this.tempUserPrefs = tempUserPrefs;
+  }
+
+  private boolean inLayout;
+
+  @Override
+  public boolean getScrollableTracksViewportWidth()
+  {
+    return hasExcessWidth();
+
+  }
+
+  @Override
+  public void doLayout()
+  {
+    if (hasExcessWidth())
+    {
+      autoResizeMode = AUTO_RESIZE_SUBSEQUENT_COLUMNS;
+    }
+    inLayout = true;
+    super.doLayout();
+    inLayout = false;
+    autoResizeMode = AUTO_RESIZE_OFF;
+  }
+
+  protected boolean hasExcessWidth()
+  {
+    return getPreferredSize().width < getParent().getWidth();
+  }
+
+  @Override
+  public void columnMarginChanged(ChangeEvent e)
+  {
+    if (isEditing())
+    {
+      removeEditor();
+    }
+    TableColumn resizingColumn = getTableHeader().getResizingColumn();
+    // Need to do this here, before the parent's
+    // layout manager calls getPreferredSize().
+    if (resizingColumn != null && autoResizeMode == AUTO_RESIZE_OFF
+            && !inLayout)
+    {
+      resizingColumn.setPreferredWidth(resizingColumn.getWidth());
+      String colHeader = resizingColumn.getHeaderValue().toString();
+      tempUserPrefs.put(colHeader, resizingColumn.getWidth());
+    }
+    resizeAndRepaint();
+  }
+
+  @Override
+  public String getToolTipText(MouseEvent evt)
+  {
+    String toolTipText = null;
+    java.awt.Point pnt = evt.getPoint();
+    int rowIndex = rowAtPoint(pnt);
+    int colIndex = columnAtPoint(pnt);
+
+    try
+    {
+      if (getValueAt(rowIndex, colIndex) == null)
+      {
+        return null;
+      }
+      toolTipText = getValueAt(rowIndex, colIndex).toString();
+    } catch (Exception e)
+    {
+      // e.printStackTrace();
+    }
+    toolTipText = (toolTipText == null ? null
+            : (toolTipText.length() > 500 ? JvSwingUtils.wrapTooltip(true,
+                    "\"" + toolTipText.subSequence(0, 500) + "...\"")
+                    : JvSwingUtils.wrapTooltip(true, toolTipText)));
+    return toolTipText;
+  }
+
+  /**
+   * Convenience method to obtain a Table model for a given summary List based
+   * on the request parameters
+   * 
+   * @param request
+   *          the FTSRestRequest object which holds useful information for
+   *          creating a table model
+   * @param summariesList
+   *          the summary list which contains the data for populating the
+   *          table's rows
+   * @return the table model which was dynamically generated
+   */
+  public static DefaultTableModel getTableModel(FTSRestRequest request,
+          Collection<FTSData> summariesList)
+  {
+    final FTSDataColumnI[] cols = request.getWantedFields().toArray(
+            new FTSDataColumnI[0]);
+    final int colOffset = request.getAssociatedSequence() == null ? 0 : 1;
+    DefaultTableModel tableModel = new DefaultTableModel()
+    {
+      @Override
+      public boolean isCellEditable(int row, int column)
+      {
+        return false;
+      }
+
+      @Override
+      public Class<?> getColumnClass(int columnIndex)
+      {
+        if (colOffset == 1 && columnIndex == 0)
+        {
+          return String.class;
+        }
+        return cols[columnIndex - colOffset].getDataType()
+                .getDataTypeClass();
+      }
+
+    };
+    if (request.getAssociatedSequence() != null)
+    {
+      tableModel.addColumn("Ref Sequence"); // Create sequence column header if
+      // exists in the request
+    }
+    for (FTSDataColumnI field : request.getWantedFields())
+    {
+      tableModel.addColumn(field.getName()); // Create sequence column header if
+                                             // exists in the request
+    }
+
+    for (FTSData res : summariesList)
+    {
+      tableModel.addRow(res.getSummaryData()); // Populate table rows with
+                                               // summary list
+    }
+
+    return tableModel;
+  }
+
+  public static void configureTableColumn(JTable tbl_summary,
+          Collection<FTSDataColumnI> wantedFields,
+          Map<String, Integer> columnPrefs)
+  {
+    for (FTSDataColumnI wantedField : wantedFields)
+    {
+      try
+      {
+        tbl_summary.getColumn(wantedField.getName()).setMinWidth(
+                wantedField.getMinWidth());
+        tbl_summary.getColumn(wantedField.getName()).setMaxWidth(
+                wantedField.getMaxWidth());
+        int prefedWidth = columnPrefs.get(wantedField.getName()) == null ? wantedField
+                .getPreferredWidth() : columnPrefs.get(wantedField
+                .getName());
+        tbl_summary.getColumn(wantedField.getName()).setPreferredWidth(
+                prefedWidth);
+      } catch (Exception e)
+      {
+        e.printStackTrace();
+      }
+      if (wantedField.getDataType().getDataTypeClass() == Double.class)
+      {
+        DecimalFormatTableCellRenderer dfr = new DecimalFormatTableCellRenderer(
+                wantedField.getDataType().isFormtted(), wantedField
+                        .getDataType().getSignificantFigures());
+        tbl_summary.getColumn(wantedField.getName()).setCellRenderer(dfr);
+      }
+      else if (wantedField.getDataType().getDataTypeClass() == Integer.class)
+      {
+        DecimalFormatTableCellRenderer dfr = new DecimalFormatTableCellRenderer(
+                wantedField.getDataType().isFormtted(), wantedField
+                        .getDataType().getSignificantFigures());
+        tbl_summary.getColumn(wantedField.getName()).setCellRenderer(dfr);
+      }
+    }
+  }
+}