Skip to content

Commit 3ed0cc5

Browse files
committed
Add ability to set length of heatmap expression vertical column headers.
Refs #501
1 parent e9a2d34 commit 3ed0cc5

File tree

5 files changed

+74
-33
lines changed

5 files changed

+74
-33
lines changed

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/PropertyManager.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public class PropertyManager implements PropertyUpdatedListener {
4040
public static final Property<Boolean> HEATMAP_DATASET_SYNC = Property.of("heatmapDatasetSync", true);
4141
public static final Property<Boolean> HEATMAP_AUTO_SORT = Property.of("heatmapAutoSort", true);
4242
public static final Property<Boolean> HEATMAP_SELECT_SYNC = Property.of("heatmapSelectSync", true);
43+
public static final Property<Integer> HEATMAP_NAME_LENGTH = Property.of("heatmapNameLength", 14);
4344
public static final Property<Double> P_VALUE = Property.of("default.pvalue", 1.0);
4445
public static final Property<Double> Q_VALUE = Property.of("default.qvalue", 0.1);
4546
public static final Property<Boolean> CREATE_WARN = Property.of("create.warn", true);
@@ -177,6 +178,9 @@ public static Property<String> of(String key, String defaultValue) {
177178
public static Property<Double> of(String key, double defaultValue) {
178179
return new Property<>(key, defaultValue, Double::valueOf);
179180
}
181+
public static Property<Integer> of(String key, int defaultValue) {
182+
return new Property<>(key, defaultValue, Integer::valueOf);
183+
}
180184
}
181185

182186

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/view/heatmap/HeatMapContentPanel.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ public class HeatMapContentPanel extends JPanel {
7676
private static final int COLUMN_WIDTH_VALUE = 50;
7777

7878
@Inject private Provider<OptionsPopup> optionsPopupProvider;
79+
@Inject private Provider<ColumnHeaderVerticalRenderer> verticalRendererProvider;
7980
@Inject private ColumnHeaderRankOptionRenderer.Factory columnHeaderRankOptionRendererFactory;
8081
@Inject private PropertyManager propertyManager;
8182
@Inject private IconManager iconManager;
@@ -146,9 +147,9 @@ void updateTableHeader(boolean showValues) {
146147
HeatMapTableModel tableModel = (HeatMapTableModel) getTable().getModel();
147148
TableColumnModel columnModel = getTable().getColumnModel();
148149

149-
TableCellRenderer vertRenderer = new ColumnHeaderVerticalRenderer();
150-
TableCellRenderer vertRendererPheno1 = new ColumnHeaderVerticalRenderer(EMStyleBuilder.Colors.LIGHTEST_PHENOTYPE_1);
151-
TableCellRenderer vertRendererPheno2 = new ColumnHeaderVerticalRenderer(EMStyleBuilder.Colors.LIGHTEST_PHENOTYPE_2);
150+
var vertRenderer = verticalRendererProvider.get();
151+
var vertRendererPheno1 = verticalRendererProvider.get().setPhenoColor(EMStyleBuilder.Colors.LIGHTEST_PHENOTYPE_1);
152+
var vertRendererPheno2 = verticalRendererProvider.get().setPhenoColor(EMStyleBuilder.Colors.LIGHTEST_PHENOTYPE_2);
152153

153154
TableColumn rankColumn = columnModel.getColumn(RANK_COL);
154155

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/view/heatmap/HeatMapMediator.java

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
import java.util.Set;
1717
import java.util.stream.Collectors;
1818

19+
import javax.swing.JOptionPane;
20+
import javax.swing.JSpinner;
21+
import javax.swing.SpinnerNumberModel;
22+
1923
import org.baderlab.csplugins.enrichmentmap.AfterInjection;
2024
import org.baderlab.csplugins.enrichmentmap.PropertyManager;
2125
import org.baderlab.csplugins.enrichmentmap.actions.OpenPathwayCommonsTask;
@@ -97,7 +101,7 @@ public class HeatMapMediator implements RowsSetListener, SetCurrentNetworkViewLi
97101
@Inject private HeatMapPanel heatMapPanel;
98102
@Inject private Provider<HeatMapContentPanel> contentPanelProvider;
99103

100-
private HeatMapContentPanel contentPanel2;
104+
private HeatMapContentPanel contentPanel;
101105
private final CoalesceTimer selectionEventTimer = new CoalesceTimer(200, 1);
102106
private boolean onlyEdges;
103107

@@ -108,6 +112,7 @@ public class HeatMapMediator implements RowsSetListener, SetCurrentNetworkViewLi
108112
public void setPropertyListeners() {
109113
propertyManager.addListener(PropertyManager.HEATMAP_DATASET_SYNC, (prop, value) -> reset());
110114
propertyManager.addListener(PropertyManager.HEATMAP_SELECT_SYNC, (prop, value) -> reset());
115+
propertyManager.addListener(PropertyManager.HEATMAP_NAME_LENGTH, (prop, value) -> reset());
111116
}
112117

113118

@@ -123,33 +128,34 @@ private HeatMapContentPanel getContentPanel() {
123128
showValueActionListener = evt -> updateSetting_ShowValues();
124129

125130
// Tool Bar
126-
if(contentPanel2 == null) {
127-
contentPanel2 = contentPanelProvider.get();
128-
contentPanel2.getOperatorCombo().addActionListener(operatorActionListener);
129-
contentPanel2.getNormCombo().addActionListener(normActionListener);
130-
contentPanel2.getCompressCombo().addActionListener(compressActionListener);
131-
contentPanel2.getShowValuesCheck().addActionListener(showValueActionListener);
131+
if(contentPanel == null) {
132+
contentPanel = contentPanelProvider.get();
133+
contentPanel.getOperatorCombo().addActionListener(operatorActionListener);
134+
contentPanel.getNormCombo().addActionListener(normActionListener);
135+
contentPanel.getCompressCombo().addActionListener(compressActionListener);
136+
contentPanel.getShowValuesCheck().addActionListener(showValueActionListener);
132137

133138
// Fire a setting changed event when column sort changes
134-
contentPanel2.getTable().getRowSorter().addRowSorterListener(e -> settingChanged());
139+
contentPanel.getTable().getRowSorter().addRowSorterListener(e -> settingChanged());
135140

136141
// Options Popup
137-
contentPanel2.getOptionsPopup().setDistanceConsumer(this::updateSetting_Distance);
138-
contentPanel2.getOptionsPopup().getGeneManiaButton().addActionListener(e -> runGeneMANIA());
139-
contentPanel2.getOptionsPopup().getStringButton().addActionListener(e -> runString());
140-
contentPanel2.getOptionsPopup().getPathwayCommonsButton().addActionListener(e -> runPathwayCommons());
141-
contentPanel2.getOptionsPopup().getAddRanksButton().addActionListener(e -> addRankings());
142-
contentPanel2.getOptionsPopup().getExportTxtButton().addActionListener(txtActionFactory.create(contentPanel2.getTable()));
143-
contentPanel2.getOptionsPopup().getExportPdfButton().addActionListener(pdfActionFactory.create(contentPanel2.getTable(), contentPanel2::getRankingOption, contentPanel2::isShowValues));
142+
contentPanel.getOptionsPopup().setDistanceConsumer(this::updateSetting_Distance);
143+
contentPanel.getOptionsPopup().getGeneManiaButton().addActionListener(e -> runGeneMANIA());
144+
contentPanel.getOptionsPopup().getStringButton().addActionListener(e -> runString());
145+
contentPanel.getOptionsPopup().getPathwayCommonsButton().addActionListener(e -> runPathwayCommons());
146+
contentPanel.getOptionsPopup().getAddRanksButton().addActionListener(e -> addRankings());
147+
contentPanel.getOptionsPopup().getNameLengthButton().addActionListener(e -> promptForNameLength());
148+
contentPanel.getOptionsPopup().getExportTxtButton().addActionListener(txtActionFactory.create(contentPanel.getTable()));
149+
contentPanel.getOptionsPopup().getExportPdfButton().addActionListener(pdfActionFactory.create(contentPanel.getTable(), contentPanel::getRankingOption, contentPanel::isShowValues));
144150

145151
// Property Change Listeners
146-
contentPanel2.addPropertyChangeListener("selectedRankingOption", evt -> settingChanged());
152+
contentPanel.addPropertyChangeListener("selectedRankingOption", evt -> settingChanged());
147153
}
148-
return contentPanel2;
154+
return contentPanel;
149155
}
150156

151157
private void disposeContentPanel() {
152-
contentPanel2 = null;
158+
contentPanel = null;
153159
heatMapPanel.showContentPanel(null);
154160
}
155161

@@ -599,6 +605,21 @@ private void runPathwayCommons() {
599605
taskManager.execute(new TaskIterator(task));
600606
}
601607
}
608+
609+
private void promptForNameLength() {
610+
int length = propertyManager.getValue(PropertyManager.HEATMAP_NAME_LENGTH);
611+
var spinnerModel = new SpinnerNumberModel(length, 10, 200, 1);
612+
var spinner = new JSpinner(spinnerModel);
613+
614+
int option = JOptionPane.showOptionDialog(null, spinner, "DataSet Max Length", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null);
615+
616+
if(option == JOptionPane.OK_OPTION) {
617+
int newLength = spinnerModel.getNumber().intValue();
618+
if(newLength != length) {
619+
propertyManager.setValue(PropertyManager.HEATMAP_NAME_LENGTH, newLength);
620+
}
621+
}
622+
}
602623

603624
private boolean isHeatMapPanelRegistered() {
604625
try {

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/view/heatmap/OptionsPopup.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ public class OptionsPopup extends JPopupMenu {
4040
private JMenuItem stringButton;
4141
private JMenuItem pcButton;
4242

43+
private JMenuItem nameLengthButton;
44+
4345
private JCheckBoxMenuItem cosineRadio;
4446
private JCheckBoxMenuItem euclideanRadio;
4547
private JCheckBoxMenuItem pearsonRadio;
@@ -94,6 +96,7 @@ private void createContents() {
9496
pearsonRadio.addActionListener(pearsonListener = distanceListenerFor(Distance.PEARSON));
9597
distanceMenu.add(pearsonRadio);
9698

99+
nameLengthButton = new JMenuItem("Expression Header Max Length...");
97100
JCheckBoxMenuItem autofocusCheck = propertyManager.createJCheckBoxMenuItem(HEATMAP_AUTOFOCUS, "Auto-Focus HeatMap");
98101
JCheckBoxMenuItem syncCheck = propertyManager.createJCheckBoxMenuItem(HEATMAP_DATASET_SYNC, "Sync Data Sets with Control Panel");
99102
JCheckBoxMenuItem selectedCheck = propertyManager.createJCheckBoxMenuItem(HEATMAP_SELECT_SYNC, "Display only selected Data Sets");
@@ -107,6 +110,7 @@ private void createContents() {
107110
add(exportTxtButton);
108111
add(exportPdfButton);
109112
addSeparator();
113+
add(nameLengthButton);
110114
add(distanceMenu);
111115
add(autofocusCheck);
112116
add(syncCheck);
@@ -140,6 +144,10 @@ public JMenuItem getGeneManiaButton() {
140144
return geneManiaButton;
141145
}
142146

147+
public JMenuItem getNameLengthButton() {
148+
return nameLengthButton;
149+
}
150+
143151
public JMenuItem getStringButton() {
144152
return stringButton;
145153
}

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/view/heatmap/table/ColumnHeaderVerticalRenderer.java

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,40 +47,42 @@
4747
import java.awt.Component;
4848
import java.awt.Dimension;
4949
import java.awt.Font;
50-
import java.util.Optional;
5150

5251
import javax.swing.JLabel;
5352
import javax.swing.JPanel;
5453
import javax.swing.JTable;
5554
import javax.swing.UIManager;
5655
import javax.swing.table.TableCellRenderer;
5756

57+
import org.baderlab.csplugins.enrichmentmap.PropertyManager;
5858
import org.baderlab.csplugins.enrichmentmap.model.EMDataSet;
5959
import org.baderlab.csplugins.enrichmentmap.view.util.SwingUtil;
6060

61+
import com.google.inject.Inject;
62+
6163
/**
6264
* Flips column headers to vertical position
6365
*/
6466
public class ColumnHeaderVerticalRenderer implements TableCellRenderer {
6567

6668
public static final int MIN_HEIGHT = 65;
6769

68-
private Optional<Color> labelBackgroundColor;
70+
@Inject private PropertyManager propertyManager;
6971

70-
public ColumnHeaderVerticalRenderer(Color labelBackgroundColor) {
71-
this.labelBackgroundColor = Optional.ofNullable(labelBackgroundColor);
72-
}
72+
private Color phenoColor;
7373

74-
public ColumnHeaderVerticalRenderer() {
75-
this.labelBackgroundColor = Optional.empty();
74+
public ColumnHeaderVerticalRenderer setPhenoColor(Color phenoColor) {
75+
this.phenoColor = phenoColor;
76+
return this;
7677
}
7778

7879
@Override
7980
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
8081
HeatMapTableModel model = (HeatMapTableModel) table.getModel();
8182
EMDataSet dataset = model.getDataSet(col);
8283

83-
JLabel verticalLabel = createVerticalLabel(value.toString());
84+
String labelText = abbreviate(value.toString());
85+
JLabel verticalLabel = createVerticalLabel(labelText);
8486

8587
JPanel panel = new JPanel(new BorderLayout());
8688
panel.add(verticalLabel, BorderLayout.CENTER);
@@ -93,24 +95,29 @@ public Component getTableCellRendererComponent(JTable table, Object value, boole
9395
panel.add(barPanel, BorderLayout.NORTH);
9496
}
9597

96-
panel.setBackground(labelBackgroundColor.isPresent() ? labelBackgroundColor.get()
97-
: UIManager.getColor("TableHeader.background"));
98+
panel.setBackground(phenoColor != null ? phenoColor : UIManager.getColor("TableHeader.background"));
9899
panel.setToolTipText(value.toString() + " - " + dataset.getName());
99100

100101
return panel;
101102
}
102103

104+
105+
private String abbreviate(String value) {
106+
int length = propertyManager.getValue(PropertyManager.HEATMAP_NAME_LENGTH);
107+
return SwingUtil.abbreviate(value, length);
108+
}
109+
110+
103111
private JLabel createVerticalLabel(String value) {
104112
JLabel label = new JLabel();
105113
label.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
106114
label.setToolTipText(value);
107115

108116
// Create vertical text label
109-
String s = SwingUtil.abbreviate(value, 14);
110117
Font font = UIManager.getFont("TableHeader.font");
111118
Color foreground = UIManager.getColor("TableHeader.foreground");
112119

113-
label.setIcon(new VerticalTextIcon(label.getFontMetrics(font), foreground, false, s));
120+
label.setIcon(new VerticalTextIcon(label.getFontMetrics(font), foreground, false, value));
114121
label.setVerticalAlignment(JLabel.BOTTOM);
115122
label.setHorizontalAlignment(JLabel.CENTER);
116123

0 commit comments

Comments
 (0)