JAL-2375 JAL-2376 First commit of implementation for Phyre2 result browsing, template...
[jalview.git] / src / jalview / gui / JvSummaryTable.java
1 package jalview.gui;
2
3 import jalview.fts.api.FTSData;
4 import jalview.fts.api.FTSDataColumnI;
5 import jalview.fts.core.DecimalFormatTableCellRenderer;
6 import jalview.fts.core.FTSRestRequest;
7
8 import java.awt.event.MouseEvent;
9 import java.util.Collection;
10 import java.util.Map;
11
12 import javax.swing.JTable;
13 import javax.swing.event.ChangeEvent;
14 import javax.swing.table.DefaultTableModel;
15 import javax.swing.table.TableColumn;
16
17 @SuppressWarnings("serial")
18 public class JvSummaryTable extends JTable
19 {
20   private Map<String, Integer> tempUserPrefs;
21
22   public JvSummaryTable(Map<String, Integer> tempUserPrefs)
23   {
24     this.tempUserPrefs = tempUserPrefs;
25   }
26
27   private boolean inLayout;
28
29   @Override
30   public boolean getScrollableTracksViewportWidth()
31   {
32     return hasExcessWidth();
33
34   }
35
36   @Override
37   public void doLayout()
38   {
39     if (hasExcessWidth())
40     {
41       autoResizeMode = AUTO_RESIZE_SUBSEQUENT_COLUMNS;
42     }
43     inLayout = true;
44     super.doLayout();
45     inLayout = false;
46     autoResizeMode = AUTO_RESIZE_OFF;
47   }
48
49   protected boolean hasExcessWidth()
50   {
51     return getPreferredSize().width < getParent().getWidth();
52   }
53
54   @Override
55   public void columnMarginChanged(ChangeEvent e)
56   {
57     if (isEditing())
58     {
59       removeEditor();
60     }
61     TableColumn resizingColumn = getTableHeader().getResizingColumn();
62     // Need to do this here, before the parent's
63     // layout manager calls getPreferredSize().
64     if (resizingColumn != null && autoResizeMode == AUTO_RESIZE_OFF
65             && !inLayout)
66     {
67       resizingColumn.setPreferredWidth(resizingColumn.getWidth());
68       String colHeader = resizingColumn.getHeaderValue().toString();
69       tempUserPrefs.put(colHeader, resizingColumn.getWidth());
70     }
71     resizeAndRepaint();
72   }
73
74   @Override
75   public String getToolTipText(MouseEvent evt)
76   {
77     String toolTipText = null;
78     java.awt.Point pnt = evt.getPoint();
79     int rowIndex = rowAtPoint(pnt);
80     int colIndex = columnAtPoint(pnt);
81
82     try
83     {
84       if (getValueAt(rowIndex, colIndex) == null)
85       {
86         return null;
87       }
88       toolTipText = getValueAt(rowIndex, colIndex).toString();
89     } catch (Exception e)
90     {
91       // e.printStackTrace();
92     }
93     toolTipText = (toolTipText == null ? null
94             : (toolTipText.length() > 500 ? JvSwingUtils.wrapTooltip(true,
95                     "\"" + toolTipText.subSequence(0, 500) + "...\"")
96                     : JvSwingUtils.wrapTooltip(true, toolTipText)));
97     return toolTipText;
98   }
99
100   /**
101    * Convenience method to obtain a Table model for a given summary List based
102    * on the request parameters
103    * 
104    * @param request
105    *          the FTSRestRequest object which holds useful information for
106    *          creating a table model
107    * @param summariesList
108    *          the summary list which contains the data for populating the
109    *          table's rows
110    * @return the table model which was dynamically generated
111    */
112   public static DefaultTableModel getTableModel(FTSRestRequest request,
113           Collection<FTSData> summariesList)
114   {
115     final FTSDataColumnI[] cols = request.getWantedFields().toArray(
116             new FTSDataColumnI[0]);
117     final int colOffset = request.getAssociatedSequence() == null ? 0 : 1;
118     DefaultTableModel tableModel = new DefaultTableModel()
119     {
120       @Override
121       public boolean isCellEditable(int row, int column)
122       {
123         return false;
124       }
125
126       @Override
127       public Class<?> getColumnClass(int columnIndex)
128       {
129         if (colOffset == 1 && columnIndex == 0)
130         {
131           return String.class;
132         }
133         return cols[columnIndex - colOffset].getDataType()
134                 .getDataTypeClass();
135       }
136
137     };
138     if (request.getAssociatedSequence() != null)
139     {
140       tableModel.addColumn("Ref Sequence"); // Create sequence column header if
141       // exists in the request
142     }
143     for (FTSDataColumnI field : request.getWantedFields())
144     {
145       tableModel.addColumn(field.getName()); // Create sequence column header if
146                                              // exists in the request
147     }
148
149     for (FTSData res : summariesList)
150     {
151       tableModel.addRow(res.getSummaryData()); // Populate table rows with
152                                                // summary list
153     }
154
155     return tableModel;
156   }
157
158   public static void configureTableColumn(JTable tbl_summary,
159           Collection<FTSDataColumnI> wantedFields,
160           Map<String, Integer> columnPrefs)
161   {
162     for (FTSDataColumnI wantedField : wantedFields)
163     {
164       try
165       {
166         tbl_summary.getColumn(wantedField.getName()).setMinWidth(
167                 wantedField.getMinWidth());
168         tbl_summary.getColumn(wantedField.getName()).setMaxWidth(
169                 wantedField.getMaxWidth());
170         int prefedWidth = columnPrefs.get(wantedField.getName()) == null ? wantedField
171                 .getPreferredWidth() : columnPrefs.get(wantedField
172                 .getName());
173         tbl_summary.getColumn(wantedField.getName()).setPreferredWidth(
174                 prefedWidth);
175       } catch (Exception e)
176       {
177         e.printStackTrace();
178       }
179       if (wantedField.getDataType().getDataTypeClass() == Double.class)
180       {
181         DecimalFormatTableCellRenderer dfr = new DecimalFormatTableCellRenderer(
182                 wantedField.getDataType().isFormtted(), wantedField
183                         .getDataType().getSignificantFigures());
184         tbl_summary.getColumn(wantedField.getName()).setCellRenderer(dfr);
185       }
186       else if (wantedField.getDataType().getDataTypeClass() == Integer.class)
187       {
188         DecimalFormatTableCellRenderer dfr = new DecimalFormatTableCellRenderer(
189                 wantedField.getDataType().isFormtted(), wantedField
190                         .getDataType().getSignificantFigures());
191         tbl_summary.getColumn(wantedField.getName()).setCellRenderer(dfr);
192       }
193     }
194   }
195 }