From 121fb3c1b8756e9d85c23d839b31bedbfb99d2ce Mon Sep 17 00:00:00 2001 From: JoePfeiffer Date: Sat, 16 Sep 2023 16:47:28 -0600 Subject: [PATCH 01/17] Add David Cain's 3d printed model rocket example --- swing/resources-src/datafiles/components-dbcook | 2 +- .../src/net/sf/openrocket/gui/main/ExampleDesignFileAction.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/swing/resources-src/datafiles/components-dbcook b/swing/resources-src/datafiles/components-dbcook index f4e30ecd1..9da5f4e25 160000 --- a/swing/resources-src/datafiles/components-dbcook +++ b/swing/resources-src/datafiles/components-dbcook @@ -1 +1 @@ -Subproject commit f4e30ecd12c64803dce013c615bbe62f89785408 +Subproject commit 9da5f4e25f57e8ec476ea38cd91c78edff06003f diff --git a/swing/src/net/sf/openrocket/gui/main/ExampleDesignFileAction.java b/swing/src/net/sf/openrocket/gui/main/ExampleDesignFileAction.java index b70b47ad8..a02550ec3 100644 --- a/swing/src/net/sf/openrocket/gui/main/ExampleDesignFileAction.java +++ b/swing/src/net/sf/openrocket/gui/main/ExampleDesignFileAction.java @@ -33,6 +33,7 @@ public final class ExampleDesignFileAction extends JMenu { "Three-stage rocket", "TARC payload rocket", "Tube fin rocket", + "A 3D printable model rocket", null, // Examples demonstrating complex rocket features "Airstart timing", From d185be011ce84da5877322ef034492b6f07f5df4 Mon Sep 17 00:00:00 2001 From: JoePfeiffer Date: Sat, 16 Sep 2023 18:08:43 -0600 Subject: [PATCH 02/17] Include the actual .ork file --- .../examples/A 3D printable model rocket.ork | Bin 0 -> 4292 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 swing/resources/datafiles/examples/A 3D printable model rocket.ork diff --git a/swing/resources/datafiles/examples/A 3D printable model rocket.ork b/swing/resources/datafiles/examples/A 3D printable model rocket.ork new file mode 100644 index 0000000000000000000000000000000000000000..4b3a2bbea7b847f49f1c3bf8989732d72abcbd31 GIT binary patch literal 4292 zcmV;#5IgTsO9KQH00;;O03wGkR{#J20000000000015yA0CI0*Yh`pUZ*ptxT+A+)Y!^iQ~m`Ce__BKk8rq+y(M zKT>F)NEM-qZM`ZvD&|mbRA6J5_<y z@#sD!fqo{}YAgE*&)S9Col0Sfq8zLY9g<281U~%v?Gk-V_6lv2M55%Nbq}3S75Z>< z`>*9Q-@f~}M7KL_Ibe72e*x0akphOTACTpmOLt=jmZ_hA;0Ki&f@exrLfJL)p=)uH zBOVp|FfR7T+o_5YE;AU-ZD$<%UpcoK`lLW*U@cnJL6UyrsRX>p>uPMo{AU!#Fy81| z&y0XUr=dVuaVTf4vH@!D_lO!1e*h);X}Cvu0&Qdkj1oHUhf$b6R6}g1I4q}7@$8}M zN!ZY4kDpqU^|_ULzi zE0X;8Z&4QR4+HF0w~+sUKJxt`LH`kEcRW_{det;rJtbB5q4pn}j|v*z`_MORT|@5) zy+;34`4)sV_!`biu$($jMi6d`l$V&Tu0p`MLu2d++^curSL%k^yE;)a8{V=$Ks!*{qc z6qm{;w&OXL|BbrhW2#)ii4j;#f>yX|cs`+qX$xC;&>QOTZ`2iqrEr+*8jd4OgPD{Y zzQw?`n^^j$!+lPIZ`2h_dYm}6Wl+xotw>K8p6$2>b(NB)=eoinU#}~v3KaNqp>%-R z>>&c}i@i4PF8QkB%?ckNc>utJuj%)ozN*9M#{$S9z^WTG>%eLGgxSot4QvT8L7Q7J zLT-W`S^;R~L zpjuWvSDgm39cU0Dy}e#lKl_hfO+9-Jks-`>n=~o5yCSZxlw7Zl^gi>R=PHG~6iz!!F&aI%4Jw&8(u(QgAQN63|OxtcAM!{JFlu-{mOb8twn85;D8a^|H z;rPCbMF6hDbWZ^~nR@$4o+tY9rBRVCWz85+`R#*zT@li^|2#)mFhuO;+SVl-;#j2ykwtBu>jpNtsHBpk9P z&rpmC2-FreJZd|JNx>)ho}i9nk3@_^sW`XuRE&_<&kZ40B zzsYiyEy|TzoB*F*0R8di8q#xW!Maw4Tb1RIx4>hR=SWHvBndVNY)hFImH-sr3#2oQ zDrd$k9gmubrGHlutNeLZ$RhaCm=!|6k!q%UO2Uvcm>N-yQlv-C2hmif`w0X&2OL@@fQ=-2fC+g3ohbCYOepwA3jX9_3+PfUhBDIl=*TN=&MVKWsV@6=8%uJSM;9lEO?im#3T& z0AJ`L)dpf!doj+~SP-pvC#^@{9B5sWIx4426M(X75K> zyT=ld{r(!^6}DlPW_*!ODjLIo(hBUqxzu|qv!KAXbO~XGR1SbbVQl!Aalt;Y&pg=HNj2wo;}~zq3l+7bNyyQlK*(yPHw#oce{Q z?-7TumqzF#Dv7s|8o2iqGE=<~vDjdz+}dt=&hUwq z%;QdRF55C4>xubRDLLc8&j9VS0CxZ>lUgl^PE+tU_F3bw9;?MqLRp(!2YkbOdCCv! z?@1^@8RNPx!FXGn;2yw8BQU~R)vGGTd%3EKeRnVbK3Cyd*c1vx%=c)7)p31t>Id7IEx!CD- zi(Vz_4V;!TqPXzTXKo0myxAwE4xOzwy*TO8P9=6K-0t$@YTu_V^kFegZH~dA`Y2f#$0K|dRWr`k zYM#Z#wZJpyvX5`MfG(BU+52Cwx|A_PiwFE&%86qb;QpE2g69Z@J(C*_R}xmf1RJgl zgyB)bEgYDxBiXB4_!@5E`Erm~hw%T|A(XPGwXxP2{98F&QwI>5s;m?waIkAwo~KWi zVrlrU0L|FV$u=_ZkE%NK*P~1d^jD=r;)o6CYV>|Q2n_CK_z{gS!-u8j7gH=tgP_A3~z^=wA_C3E>*8SO>y%Do!x zS1?-V*^Kr}=JMql?NKAgHRQ-P)!cEH>b-|}8^+3y5^*;%fU-JtQ?j9wZ>nHa7mXYa zcBtQ-3b@1uB&jYeA9N<>a_V89OUI$(MWZtcM_;XYbY=nR@gmaWM@1excRzbtWcKX+ zvz3xAsH#4>r1S-4rKeO_M`}xSww9zPeij}xM;7b%Zkj6W$&nVIiljJ1qvz(U<1D)7 z{=VXwE7JPHB_zPU;e#79824<$=dLm+gBU=3S9tQ`qqBO)5z~I<&3np$r-_DsyUJ*} zRsSMOqr|ib>AmfAQJs{K+2d7{26yJc+eg@e+`g$l!lRE~RA0l<7g@M3qB5o(8|YB< zM>_H%d$Wj>{76-@{Uky4qD9M%`_QNxf;8dRe`g=-3+PcpziN)LMB+$#$I~?V1bNr{ zhNcg>Ft?`Y z^(97Zbp0ueCBIjxo>HQ@yM#U)q^W>W{WXW`4a5O$*pucpq)sPJUrnly;_~ASX0_Z6 z@q{}8Z#`_gCAREal}H5{T;=jM0kpVY4Tvo_&-Y1o*s1jR(U&)iFyq~%Vx5P3NV3(T zJUOJ#4IM8VY@FK7I*9ZUAjxz6>dWU^18)|LEgfd-7j{42D~LO#*CY1Qby-Q|LMXs+ zY5d?0DPG#7ys_tESHADzE|Bg)p72AmRZ71NMG0g?)f4qCkYh_QN1Z$AGhe$fZ=c1M z*oHfed9-&x$i`GVWBqoR-rwy>G1{VZ)ef(52@PhOFMd1~^W^1V{+zPoE9PG@KZ|(` z_{JKdJ>lW`b{T!tTT8-NANAB)+6+&j-f_lJ?<}!rkE5P0P48QQ zo`I8-kK25!K^8e}70z_GwTu$~)$^z+mW zFvsh=0moc=)u$%L+yJ3dZh(5ugd3pCPVm>p!P8iuOZxTrDHf2r4~6OoBc7MvLPXg? zzd`(?18EQ1A9g>16&;1Yjay+a$BCR%SbudQuTEsviBQPW8KommggKL5*c`yoUMsh*uTR55!ky+?*#Sc(q(uG^^`phd$7I% z?Ag+E$rS9ZncTr0hrP3OZR>2*_phtU;$fHMNd{^NlZv57Sg+d8cW Date: Sat, 16 Sep 2023 18:17:23 -0600 Subject: [PATCH 03/17] fix indentation --- .../src/net/sf/openrocket/gui/main/ExampleDesignFileAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swing/src/net/sf/openrocket/gui/main/ExampleDesignFileAction.java b/swing/src/net/sf/openrocket/gui/main/ExampleDesignFileAction.java index a02550ec3..d3f745076 100644 --- a/swing/src/net/sf/openrocket/gui/main/ExampleDesignFileAction.java +++ b/swing/src/net/sf/openrocket/gui/main/ExampleDesignFileAction.java @@ -33,7 +33,7 @@ public final class ExampleDesignFileAction extends JMenu { "Three-stage rocket", "TARC payload rocket", "Tube fin rocket", - "A 3D printable model rocket", + "A 3D printable model rocket", null, // Examples demonstrating complex rocket features "Airstart timing", From c759a6a865b3c0dc4679c32a1fa839e03e9b5fb8 Mon Sep 17 00:00:00 2001 From: JoePfeiffer Date: Sat, 16 Sep 2023 18:34:35 -0600 Subject: [PATCH 04/17] update dbcook database --- swing/resources-src/datafiles/components-dbcook | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swing/resources-src/datafiles/components-dbcook b/swing/resources-src/datafiles/components-dbcook index 9da5f4e25..f4e30ecd1 160000 --- a/swing/resources-src/datafiles/components-dbcook +++ b/swing/resources-src/datafiles/components-dbcook @@ -1 +1 @@ -Subproject commit 9da5f4e25f57e8ec476ea38cd91c78edff06003f +Subproject commit f4e30ecd12c64803dce013c615bbe62f89785408 From c7e9f46b39c9cff329969b256987e9cb095fa1ee Mon Sep 17 00:00:00 2001 From: SiboVG Date: Tue, 19 Sep 2023 01:31:02 +0200 Subject: [PATCH 05/17] Reformat --- .../dialogs/preset/ComponentPresetTable.java | 113 ++++++++++-------- 1 file changed, 61 insertions(+), 52 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTable.java b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTable.java index 469466a31..bfba35d26 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTable.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTable.java @@ -51,11 +51,12 @@ public class ComponentPresetTable extends JTable { this.presets = presets; this.presetType = presetType; this.favorites = Application.getPreferences().getComponentFavorites(presetType); - this.columns = new ComponentPresetTableColumn[ComponentPreset.ORDERED_KEY_LIST.size()+1]; + this.columns = new ComponentPresetTableColumn[ComponentPreset.ORDERED_KEY_LIST.size() + 1]; tableModel = new AbstractTableModel() { final ComponentPresetTableColumn[] myColumns = columns; + @Override public int getRowCount() { return ComponentPresetTable.this.presets.size(); @@ -68,7 +69,7 @@ public class ComponentPresetTable extends JTable { @Override public Object getValueAt(int rowIndex, int columnIndex) { - return myColumns[columnIndex].getValueFromPreset(favorites,ComponentPresetTable.this.presets.get(rowIndex)); + return myColumns[columnIndex].getValueFromPreset(favorites, ComponentPresetTable.this.presets.get(rowIndex)); } @Override @@ -109,25 +110,25 @@ public class ComponentPresetTable extends JTable { List hiddenColumns = new ArrayList(); { int index = 1; - for (final TypedKey key: ComponentPreset.ORDERED_KEY_LIST ) { - if ( key.getType() == Double.class && key.getUnitGroup() != null ) { - columns[index] = new ComponentPresetTableColumn.DoubleWithUnit((TypedKey)key,index); + for (final TypedKey key : ComponentPreset.ORDERED_KEY_LIST) { + if (key.getType() == Double.class && key.getUnitGroup() != null) { + columns[index] = new ComponentPresetTableColumn.DoubleWithUnit((TypedKey) key, index); } else { - columns[index] = new ComponentPresetTableColumn.Parameter(key,index); + columns[index] = new ComponentPresetTableColumn.Parameter(key, index); } tableColumnModel.addColumn(columns[index]); - if ( key == ComponentPreset.PARTNO ) { + if (key == ComponentPreset.PARTNO) { sorter.setComparator(index, new AlphanumComparator()); - } else if ( key.getType() == Double.class ) { - sorter.setComparator(index, new Comparator() { + } else if (key.getType() == Double.class) { + sorter.setComparator(index, new Comparator() { @Override public int compare(Value o1, Value o2) { return Double.compare(o1.getValue(), o2.getValue()); } - + }); - } else if ( key.getType() == Boolean.class ) { + } else if (key.getType() == Boolean.class) { sorter.setComparator(index, new Comparator() { @Override @@ -140,42 +141,43 @@ public class ComponentPresetTable extends JTable { return 0; } } - }); + }); } - - if ( visibleColumnKeys.indexOf(key) < 0 ) { + + if (visibleColumnKeys.indexOf(key) < 0) { hiddenColumns.add(columns[index]); } - index ++; - } + index++; + } } this.setAutoCreateColumnsFromModel(false); - this.setColumnModel( tableColumnModel ); + this.setColumnModel(tableColumnModel); this.setModel(tableModel); this.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); this.setRowSorter(sorter); - sorter.toggleSortOrder(2); // Sort by the first column (manufacturer) by default + sorter.toggleSortOrder(2); // Sort by the first column (manufacturer) by default - for ( TableColumn hiddenColumn : hiddenColumns ) { + for (TableColumn hiddenColumn : hiddenColumns) { tableColumnModel.setColumnVisible(hiddenColumn, false); } JTableHeader header = this.getTableHeader(); - + header.setReorderingAllowed(true); - header.addMouseListener( new MouseAdapter() { + header.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { - if ( e.isPopupTrigger() ) { + if (e.isPopupTrigger()) { doPopup(e); } } + @Override public void mouseReleased(MouseEvent e) { - if ( e.isPopupTrigger() ) { + if (e.isPopupTrigger()) { doPopup(e); } } @@ -186,49 +188,49 @@ public class ComponentPresetTable extends JTable { return tableColumnModel; } - public void setRowFilter( RowFilter filter ) { - sorter.setRowFilter( filter ); + public void setRowFilter(RowFilter filter) { + sorter.setRowFilter(filter); } - public void updateData( List myPresets ) { + public void updateData(List myPresets) { this.presets = myPresets; this.favorites = Application.getPreferences().getComponentFavorites(presetType); this.tableModel.fireTableDataChanged(); } - + public void updateFavorites() { this.favorites = Application.getPreferences().getComponentFavorites(presetType); this.tableModel.fireTableDataChanged(); } - private void doPopup(MouseEvent evt ) { - + private void doPopup(MouseEvent evt) { + // Figure out what column header was clicked on. - int colIndex = tableColumnModel.getColumnIndexAtX( evt.getX() ); + int colIndex = tableColumnModel.getColumnIndexAtX(evt.getX()); ComponentPresetTableColumn colClicked = null; - if ( colIndex >=0 ) { + if (colIndex >= 0) { colClicked = (ComponentPresetTableColumn) tableColumnModel.getColumn(colIndex); } - + JPopupMenu columnMenu = new ColumnPopupMenu(colClicked, colIndex); - columnMenu.show(evt.getComponent(),evt.getX(),evt.getY()); + columnMenu.show(evt.getComponent(), evt.getX(), evt.getY()); } private class ColumnPopupMenu extends JPopupMenu { ColumnPopupMenu(ComponentPresetTableColumn colClicked, int colClickedIndex) { - if ( colClickedIndex >= 0 ) { + if (colClickedIndex >= 0) { JCheckBoxMenuItem item = new SortAscColumnMenuItem(colClickedIndex); this.add(item); item = new SortDescColumnMenuItem(colClickedIndex); this.add(item); this.addSeparator(); - if ( colClicked instanceof ComponentPresetTableColumn.DoubleWithUnit ) { - this.add( new UnitSelectorMenuItem( (ComponentPresetTableColumn.DoubleWithUnit) colClicked )); + if (colClicked instanceof ComponentPresetTableColumn.DoubleWithUnit) { + this.add(new UnitSelectorMenuItem((ComponentPresetTableColumn.DoubleWithUnit) colClicked)); this.addSeparator(); } } - for( TableColumn c: columns ) { + for (TableColumn c : columns) { JCheckBoxMenuItem item = new ToggleColumnMenuItem(c); this.add(item); } @@ -237,67 +239,74 @@ public class ComponentPresetTable extends JTable { private class SortAscColumnMenuItem extends JCheckBoxMenuItem implements ItemListener { private int columnClicked; + SortAscColumnMenuItem(int columnClicked) { - super( trans.get("ComponentPresetChooserDialog.menu.sortAsc") ); + super(trans.get("ComponentPresetChooserDialog.menu.sortAsc")); this.addItemListener(this); this.columnClicked = columnClicked; } + @Override public void itemStateChanged(ItemEvent e) { - sorter.setSortKeys( Collections.singletonList( new SortKey(columnClicked, SortOrder.ASCENDING))); + sorter.setSortKeys(Collections.singletonList(new SortKey(columnClicked, SortOrder.ASCENDING))); } } - + private class SortDescColumnMenuItem extends JCheckBoxMenuItem implements ItemListener { private int columnClicked; + SortDescColumnMenuItem(int columnClicked) { - super( trans.get("ComponentPresetChooserDialog.menu.sortDesc") ); + super(trans.get("ComponentPresetChooserDialog.menu.sortDesc")); this.addItemListener(this); this.columnClicked = columnClicked; } + @Override public void itemStateChanged(ItemEvent e) { - sorter.setSortKeys( Collections.singletonList( new SortKey(columnClicked, SortOrder.DESCENDING))); + sorter.setSortKeys(Collections.singletonList(new SortKey(columnClicked, SortOrder.DESCENDING))); } } - + private class ToggleColumnMenuItem extends JCheckBoxMenuItem implements ItemListener { TableColumn col; - ToggleColumnMenuItem( TableColumn col ) { - super( String.valueOf(col.getHeaderValue()), tableColumnModel.isColumnVisible(col)); + + ToggleColumnMenuItem(TableColumn col) { + super(String.valueOf(col.getHeaderValue()), tableColumnModel.isColumnVisible(col)); this.addItemListener(this); this.col = col; } + @Override public void itemStateChanged(ItemEvent e) { tableColumnModel.setColumnVisible(col, !tableColumnModel.isColumnVisible(col)); } } - + private class UnitSelectorMenuItem extends JMenu implements ItemListener { ComponentPresetTableColumn.DoubleWithUnit col; - UnitSelectorMenuItem( ComponentPresetTableColumn.DoubleWithUnit col ) { + + UnitSelectorMenuItem(ComponentPresetTableColumn.DoubleWithUnit col) { super(trans.get("ComponentPresetChooserDialog.menu.units")); this.col = col; UnitGroup group = col.unitGroup; Unit selectedUnit = col.selectedUnit; - for( Unit u : group.getUnits() ) { - JCheckBoxMenuItem item = new JCheckBoxMenuItem( u.toString() ); - if ( u == selectedUnit ) { + for (Unit u : group.getUnits()) { + JCheckBoxMenuItem item = new JCheckBoxMenuItem(u.toString()); + if (u == selectedUnit) { item.setSelected(true); } item.addItemListener(this); this.add(item); } - + } + @Override public void itemStateChanged(ItemEvent e) { JCheckBoxMenuItem item = (JCheckBoxMenuItem) e.getItem(); String val = item.getText(); col.selectedUnit = col.unitGroup.findApproximate(val); ComponentPresetTable.this.tableModel.fireTableDataChanged(); - return; } } From 26d399c5f12efbd89e5cf29a108479e6dcd296fa Mon Sep 17 00:00:00 2001 From: SiboVG Date: Tue, 19 Sep 2023 18:30:04 +0200 Subject: [PATCH 06/17] Only show visible columns in popup menu --- .../dialogs/preset/ComponentPresetTable.java | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTable.java b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTable.java index bfba35d26..1b50983e1 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTable.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTable.java @@ -7,6 +7,7 @@ import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.Enumeration; import java.util.List; import java.util.Set; @@ -45,6 +46,7 @@ public class ComponentPresetTable extends JTable { private final AbstractTableModel tableModel; private final XTableColumnModel tableColumnModel; private final ComponentPresetTableColumn[] columns; + private final List hiddenColumns; public ComponentPresetTable(final ComponentPreset.Type presetType, List presets, List> visibleColumnKeys) { super(); @@ -54,7 +56,7 @@ public class ComponentPresetTable extends JTable { this.columns = new ComponentPresetTableColumn[ComponentPreset.ORDERED_KEY_LIST.size() + 1]; - tableModel = new AbstractTableModel() { + this.tableModel = new AbstractTableModel() { final ComponentPresetTableColumn[] myColumns = columns; @Override @@ -97,17 +99,16 @@ public class ComponentPresetTable extends JTable { }; - sorter = new TableRowSorter(tableModel); - - tableColumnModel = new XTableColumnModel(); + this.sorter = new TableRowSorter(tableModel); + this.tableColumnModel = new XTableColumnModel(); /* * Set up the Column Table model, and customize the sorting. */ - columns[0] = new ComponentPresetTableColumn.Favorite(0); - tableColumnModel.addColumn(columns[0]); + this.columns[0] = new ComponentPresetTableColumn.Favorite(0); + this.tableColumnModel.addColumn(columns[0]); - List hiddenColumns = new ArrayList(); + this.hiddenColumns = new ArrayList<>(); { int index = 1; for (final TypedKey key : ComponentPreset.ORDERED_KEY_LIST) { @@ -144,7 +145,7 @@ public class ComponentPresetTable extends JTable { }); } - if (visibleColumnKeys.indexOf(key) < 0) { + if (!visibleColumnKeys.contains(key)) { hiddenColumns.add(columns[index]); } index++; @@ -156,10 +157,10 @@ public class ComponentPresetTable extends JTable { this.setModel(tableModel); this.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); this.setRowSorter(sorter); - sorter.toggleSortOrder(2); // Sort by the first column (manufacturer) by default + this.sorter.toggleSortOrder(2); // Sort by the first column (manufacturer) by default - for (TableColumn hiddenColumn : hiddenColumns) { - tableColumnModel.setColumnVisible(hiddenColumn, false); + for (TableColumn hiddenColumn : this.hiddenColumns) { + this.tableColumnModel.setColumnVisible(hiddenColumn, false); } JTableHeader header = this.getTableHeader(); @@ -185,7 +186,7 @@ public class ComponentPresetTable extends JTable { } public XTableColumnModel getXColumnModel() { - return tableColumnModel; + return this.tableColumnModel; } public void setRowFilter(RowFilter filter) { @@ -231,6 +232,9 @@ public class ComponentPresetTable extends JTable { } } for (TableColumn c : columns) { + if (hiddenColumns.contains(c)) { + continue; + } JCheckBoxMenuItem item = new ToggleColumnMenuItem(c); this.add(item); } From 4ab28ac27613c186a4eed8ead77ea03f83d8a61f Mon Sep 17 00:00:00 2001 From: SiboVG Date: Tue, 19 Sep 2023 19:06:07 +0200 Subject: [PATCH 07/17] Update legacy checkbox when legacy column visibility changes --- .../preset/ComponentPresetChooserDialog.java | 43 ++++++++++++++++--- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java index bdc5230a1..2f8e8fcf3 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java @@ -22,8 +22,12 @@ import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.RowFilter; +import javax.swing.event.ChangeEvent; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.TableColumnModelEvent; +import javax.swing.event.TableColumnModelListener; import javax.swing.table.TableColumn; import javax.swing.table.TableModel; @@ -245,12 +249,41 @@ public class ComponentPresetChooserDialog extends JDialog { panel.add(showLegacyCheckBox, "wrap"); showLegacyCheckBox.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - updateFilters(); - tm.setColumnVisible(legacyColumn, showLegacyCheckBox.isSelected()); + @Override + public void itemStateChanged(ItemEvent e) { + updateFilters(); + tm.setColumnVisible(legacyColumn, showLegacyCheckBox.isSelected()); + } + }); + + // When the legacy column changes visibility (by right-clicking on the column header and toggling the legacy header checkbox), + // update the main legacy checkbox + tm.addColumnModelListener(new TableColumnModelListener() { + @Override + public void columnAdded(TableColumnModelEvent e) { + TableColumn column = tm.getColumn(e.getToIndex()); + if (column == legacyColumn) { + showLegacyCheckBox.setSelected(true); } - }); + } + + @Override + public void columnRemoved(TableColumnModelEvent e) { + // Use 'getFromIndex' since the column has been removed + if (e.getFromIndex() == legacyColumnIndex) { + showLegacyCheckBox.setSelected(false); + } + } + + @Override + public void columnMoved(TableColumnModelEvent e) {} + + @Override + public void columnMarginChanged(ChangeEvent e) {} + + @Override + public void columnSelectionChanged(ListSelectionEvent e) {} + }); if(component instanceof SymmetricComponent) { final SymmetricComponent curSym = (SymmetricComponent) component; From d0f3f7b34572608c2a8ee4ed9daf4018d4a1e523 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Tue, 19 Sep 2023 22:12:20 +0200 Subject: [PATCH 08/17] More robust column remembering --- .../src/net/sf/openrocket/gui/util/GUIUtil.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/util/GUIUtil.java b/swing/src/net/sf/openrocket/gui/util/GUIUtil.java index 687eedf53..70e5ae806 100644 --- a/swing/src/net/sf/openrocket/gui/util/GUIUtil.java +++ b/swing/src/net/sf/openrocket/gui/util/GUIUtil.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; +import java.util.Enumeration; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -56,6 +57,7 @@ import javax.swing.event.ChangeListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableColumnModel; import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import javax.swing.table.TableModel; import javax.swing.tree.DefaultMutableTreeNode; @@ -404,23 +406,24 @@ public class GUIUtil { public static void rememberTableColumnWidths(final JTable table, String keyName) { final String key = keyName == null ? table.getClass().getName() : keyName; - for (int i = 0; i < table.getColumnCount(); i++) { - final int column = i; - table.getColumnModel().getColumn(i).addPropertyChangeListener(new PropertyChangeListener() { + Enumeration columns = table.getColumnModel().getColumns(); + while (columns.hasMoreElements()) { + TableColumn column = columns.nextElement(); + column.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if (evt.getPropertyName().equals("width")) { - log.debug("Storing width of " + table.getName() + "-" + table.getColumnName(column) + ": " + table.getColumnModel().getColumn(column).getWidth()); + log.debug("Storing width of " + table.getName() + "-" + column + ": " + column.getWidth()); ((SwingPreferences) Application.getPreferences()).setTableColumnWidth( - key, column, table.getColumnModel().getColumn(column).getWidth()); + key, column.getModelIndex(), column.getWidth()); } } }); final Integer width = ((SwingPreferences) Application.getPreferences()).getTableColumnWidth( - key, column); + key, column.getModelIndex()); if (width != null) { - table.getColumnModel().getColumn(column).setPreferredWidth(width); + column.setPreferredWidth(width); } } } From e342574ef32315e39a557cd3bd11f117e9baa433 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Tue, 19 Sep 2023 22:14:54 +0200 Subject: [PATCH 09/17] Use optimal width if no width found --- .../net/sf/openrocket/gui/util/GUIUtil.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/swing/src/net/sf/openrocket/gui/util/GUIUtil.java b/swing/src/net/sf/openrocket/gui/util/GUIUtil.java index 70e5ae806..e11f5fe81 100644 --- a/swing/src/net/sf/openrocket/gui/util/GUIUtil.java +++ b/swing/src/net/sf/openrocket/gui/util/GUIUtil.java @@ -424,6 +424,8 @@ public class GUIUtil { key, column.getModelIndex()); if (width != null) { column.setPreferredWidth(width); + } else { + column.setPreferredWidth(getOptimalColumnWidth(table, column.getModelIndex())); } } } @@ -431,6 +433,24 @@ public class GUIUtil { public static void rememberTableColumnWidths(final JTable table) { rememberTableColumnWidths(table, null); } + + public static int getOptimalColumnWidth(JTable table, int columnIndex) { + TableColumn column = table.getColumnModel().getColumn(columnIndex); + Component headerRenderer = table.getTableHeader().getDefaultRenderer() + .getTableCellRendererComponent(table, column.getHeaderValue(), false, false, 0, columnIndex); + + int maxWidth = headerRenderer.getPreferredSize().width; + + for (int row = 0; row < table.getRowCount(); row++) { + Component renderer = table.getCellRenderer(row, columnIndex) + .getTableCellRendererComponent(table, table.getValueAt(row, columnIndex), false, false, row, columnIndex); + maxWidth = Math.max(maxWidth, renderer.getPreferredSize().width); + } + + // Optional: Add some padding + int padding = 5; // adjust this value as needed + return maxWidth + padding; + } /** From 9d6d8f25b7b1764a61d4f6fbfd4a15e2beaeb652 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Tue, 19 Sep 2023 22:17:39 +0200 Subject: [PATCH 10/17] More reasonable legacy column default width --- .../gui/dialogs/preset/ComponentPresetChooserDialog.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java index 2f8e8fcf3..147af6f52 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java @@ -253,6 +253,12 @@ public class ComponentPresetChooserDialog extends JDialog { public void itemStateChanged(ItemEvent e) { updateFilters(); tm.setColumnVisible(legacyColumn, showLegacyCheckBox.isSelected()); + + if (showLegacyCheckBox.isSelected()) { + // Let's say the optimal width is 100 (you can adjust this as needed) + int optimalWidth = 50; + legacyColumn.setPreferredWidth(optimalWidth); + } } }); From d6b5034764e4e3b932d9b402c4f81549aa82d585 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Tue, 19 Sep 2023 22:23:07 +0200 Subject: [PATCH 11/17] Don't do anything if legacy column already in right state --- .../preset/ComponentPresetChooserDialog.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java index 147af6f52..8a6203ca9 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java @@ -251,10 +251,17 @@ public class ComponentPresetChooserDialog extends JDialog { showLegacyCheckBox.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { - updateFilters(); - tm.setColumnVisible(legacyColumn, showLegacyCheckBox.isSelected()); + boolean selected = e != null && e.getStateChange() == ItemEvent.SELECTED; + if (tm.isColumnVisible(legacyColumn) == selected) { + // No change + return; + } - if (showLegacyCheckBox.isSelected()) { + updateFilters(); + + tm.setColumnVisible(legacyColumn, selected); + + if (selected) { // Let's say the optimal width is 100 (you can adjust this as needed) int optimalWidth = 50; legacyColumn.setPreferredWidth(optimalWidth); From a9c328d8b1fdf4b391d3ccdbdf58b9371f63cb61 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Tue, 19 Sep 2023 22:30:39 +0200 Subject: [PATCH 12/17] Use radio buttons for units buttons --- .../dialogs/preset/ComponentPresetTable.java | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTable.java b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTable.java index 1b50983e1..6b32bd009 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTable.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTable.java @@ -1,5 +1,7 @@ package net.sf.openrocket.gui.dialogs.preset; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.MouseAdapter; @@ -7,13 +9,14 @@ import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.Enumeration; import java.util.List; import java.util.Set; +import javax.swing.ButtonGroup; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenu; import javax.swing.JPopupMenu; +import javax.swing.JRadioButtonMenuItem; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.RowFilter; @@ -286,33 +289,38 @@ public class ComponentPresetTable extends JTable { } } - private class UnitSelectorMenuItem extends JMenu implements ItemListener { + private class UnitSelectorMenuItem extends JMenu { ComponentPresetTableColumn.DoubleWithUnit col; + ButtonGroup buttonGroup; // To group the radio buttons UnitSelectorMenuItem(ComponentPresetTableColumn.DoubleWithUnit col) { super(trans.get("ComponentPresetChooserDialog.menu.units")); this.col = col; + + buttonGroup = new ButtonGroup(); // Create a new ButtonGroup to hold the radio buttons + UnitGroup group = col.unitGroup; Unit selectedUnit = col.selectedUnit; + for (Unit u : group.getUnits()) { - JCheckBoxMenuItem item = new JCheckBoxMenuItem(u.toString()); + JRadioButtonMenuItem item = new JRadioButtonMenuItem(u.toString()); + if (u == selectedUnit) { item.setSelected(true); } - item.addItemListener(this); - this.add(item); + + item.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + col.selectedUnit = u; + ComponentPresetTable.this.tableModel.fireTableDataChanged(); + } + }); + + buttonGroup.add(item); // Add the radio button to the button group + this.add(item); // Add the radio button to the menu } - } - - @Override - public void itemStateChanged(ItemEvent e) { - JCheckBoxMenuItem item = (JCheckBoxMenuItem) e.getItem(); - String val = item.getText(); - col.selectedUnit = col.unitGroup.findApproximate(val); - ComponentPresetTable.this.tableModel.fireTableDataChanged(); - } - } } } From 19854154b4d13b19583fc0d23043cf926ac51628 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Wed, 20 Sep 2023 13:27:38 +0200 Subject: [PATCH 13/17] Refactor filename illegal char method --- .../src/net/sf/openrocket/util/FileUtils.java | 36 +++++++++++++------ .../gui/widgets/SaveFileChooser.java | 23 ++---------- 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/core/src/net/sf/openrocket/util/FileUtils.java b/core/src/net/sf/openrocket/util/FileUtils.java index 09b77bfdc..b74b82d8a 100644 --- a/core/src/net/sf/openrocket/util/FileUtils.java +++ b/core/src/net/sf/openrocket/util/FileUtils.java @@ -9,31 +9,29 @@ import java.io.OutputStream; import java.nio.file.Paths; public abstract class FileUtils { + private static final char[] ILLEGAL_CHARS = new char[] { '/', '\\', ':', '*', '?', '"', '<', '>', '|' }; - public static void copy( InputStream is, OutputStream os ) throws IOException { - - if ( ! (os instanceof BufferedOutputStream ) ) { + public static void copy(InputStream is, OutputStream os) throws IOException { + if (!(os instanceof BufferedOutputStream)) { os = new BufferedOutputStream(os); } - if ( ! (is instanceof BufferedInputStream ) ) { + if (!(is instanceof BufferedInputStream)) { is = new BufferedInputStream(is); } byte[] buffer = new byte[1024]; int bytesRead = 0; - while( (bytesRead = is.read(buffer)) > 0 ) { - os.write(buffer,0,bytesRead); + while( (bytesRead = is.read(buffer)) > 0) { + os.write(buffer, 0, bytesRead); } os.flush(); } - public static byte[] readBytes( InputStream is ) throws IOException { - + public static byte[] readBytes(InputStream is) throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(1024); - - copy( is, bos ); + copy(is, bos); return bos.toByteArray(); @@ -61,4 +59,22 @@ public abstract class FileUtils { return Paths.get(pathString).getFileName().toString(); } + + /** + * Returns an illegal character if one is found in the filename, otherwise returns null. + * @param filename The filename to check + * @return The illegal character, or null if none is found + */ + public static Character getIllegalFilenameChar(String filename) { + if (filename == null || filename.isEmpty()) { + return null; + } + for (char c : ILLEGAL_CHARS) { + if (filename.indexOf(c) >= 0) { + return c; + } + } + return null; + } + } diff --git a/swing/src/net/sf/openrocket/gui/widgets/SaveFileChooser.java b/swing/src/net/sf/openrocket/gui/widgets/SaveFileChooser.java index 61b5ce3ba..9fb73c17c 100644 --- a/swing/src/net/sf/openrocket/gui/widgets/SaveFileChooser.java +++ b/swing/src/net/sf/openrocket/gui/widgets/SaveFileChooser.java @@ -2,6 +2,7 @@ package net.sf.openrocket.gui.widgets; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.startup.Application; +import net.sf.openrocket.util.FileUtils; import javax.swing.JFileChooser; import javax.swing.JOptionPane; @@ -12,7 +13,6 @@ import java.util.regex.PatternSyntaxException; public class SaveFileChooser extends JFileChooser { private static final Translator trans = Application.getTranslator(); - private static final char[] ILLEGAL_CHARS = new char[] { '/', '\\', ':', '*', '?', '"', '<', '>', '|' }; private File cwd = null; private File currentFile = null; @@ -30,7 +30,7 @@ public class SaveFileChooser extends JFileChooser { if (file.getParentFile() != getCurrentDirectory()) { cwd = getCurrentDirectory(); fileName = getFilenameInput(currentFile, cwd); - if (getIllegalChar(fileName) != null) { + if (FileUtils.getIllegalFilenameChar(fileName) != null) { return; } } @@ -42,7 +42,7 @@ public class SaveFileChooser extends JFileChooser { @Override public void approveSelection() { - Character c = getIllegalChar(fileName); + Character c = FileUtils.getIllegalFilenameChar(fileName); if (c != null) { // Illegal character found JOptionPane.showMessageDialog(getParent(), @@ -57,23 +57,6 @@ public class SaveFileChooser extends JFileChooser { } } - /** - * Returns an illegal character if one is found in the filename, otherwise returns null. - * @param filename The filename to check - * @return The illegal character, or null if none is found - */ - private Character getIllegalChar(String filename) { - if (filename == null || filename.isEmpty()) { - return null; - } - for (char c : ILLEGAL_CHARS) { - if (filename.indexOf(c) >= 0) { - return c; - } - } - return null; - } - /** * Returns the filename input by the user, or null if the filename is invalid. * You can't simply use getSelectedFile().getName() because it won't work for malformed filenames. From d36b5d3e9d5b7409e31671565dd88e35744b7787 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Wed, 20 Sep 2023 13:27:58 +0200 Subject: [PATCH 14/17] [#2341] Sanitize groupnames --- .../wavefrontobj/export/OBJExporterFactory.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/core/src/net/sf/openrocket/file/wavefrontobj/export/OBJExporterFactory.java b/core/src/net/sf/openrocket/file/wavefrontobj/export/OBJExporterFactory.java index b9e6f52b3..11a607146 100644 --- a/core/src/net/sf/openrocket/file/wavefrontobj/export/OBJExporterFactory.java +++ b/core/src/net/sf/openrocket/file/wavefrontobj/export/OBJExporterFactory.java @@ -154,6 +154,7 @@ public class OBJExporterFactory { // Component exporting String groupName = idx + "_" + component.getName(); + groupName = sanitizeGroupName(groupName); handleComponent(obj, this.configuration, this.options.getTransformer(), component, groupName, materials.get(obj), this.options.getLOD(), options, warnings); @@ -293,6 +294,20 @@ public class OBJExporterFactory { return sortedComponents; } + /** + * Sanitize the group name by replacing illegal characters with underscores. + * @param groupName the group name to sanitize + * @return the sanitized group name + */ + private static String sanitizeGroupName(String groupName) { + Character c = FileUtils.getIllegalFilenameChar(groupName); + while (c != null) { + groupName = groupName.replace(c, '_'); + c = FileUtils.getIllegalFilenameChar(groupName); + } + return groupName; + } + private void addChildComponentToList(RocketComponent parent, Set components, Set sortedComponents) { for (RocketComponent child : parent.getChildren()) { if (components.contains(child)) { From 248ca23a502074f6b57b43bd1ba4678ed3097970 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Fri, 22 Sep 2023 11:56:05 +0200 Subject: [PATCH 15/17] [#2344] Optimize UI color fetching --- .../gui/scalefigure/FinPointFigure.java | 44 +++++++++++++------ 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/scalefigure/FinPointFigure.java b/swing/src/net/sf/openrocket/gui/scalefigure/FinPointFigure.java index cf5662574..a8688bec7 100644 --- a/swing/src/net/sf/openrocket/gui/scalefigure/FinPointFigure.java +++ b/swing/src/net/sf/openrocket/gui/scalefigure/FinPointFigure.java @@ -1,6 +1,7 @@ package net.sf.openrocket.gui.scalefigure; import java.awt.BasicStroke; +import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; @@ -56,6 +57,12 @@ public class FinPointFigure extends AbstractScaleFigure { private Rectangle2D.Double[] finPointHandles = null; private int selectedIndex = -1; + + private static Color finPointBodyLineColor; + private static Color finPointGridMajorLineColor; + private static Color finPointGridMinorLineColor; + private static Color finPointPointColor; + private static Color finPointSelectedPointColor; public FinPointFigure(FreeformFinSet finset) { this.finset = finset; @@ -63,9 +70,18 @@ public class FinPointFigure extends AbstractScaleFigure { setBackground(GUIUtil.getUITheme().getBackgroundColor()); setOpaque(true); + updateColors(); updateFigure(); } + private static void updateColors() { + finPointBodyLineColor = GUIUtil.getUITheme().getFinPointBodyLineColor(); + finPointGridMajorLineColor = GUIUtil.getUITheme().getFinPointGridMajorLineColor(); + finPointGridMinorLineColor = GUIUtil.getUITheme().getFinPointGridMinorLineColor(); + finPointPointColor = GUIUtil.getUITheme().getFinPointPointColor(); + finPointSelectedPointColor = GUIUtil.getUITheme().getFinPointSelectedPointColor(); + } + @Override public Point getAutoZoomPoint(){ return new Point( Math.max(0, (originLocation_px.x - borderThickness_px.width)), 0); @@ -122,11 +138,11 @@ public class FinPointFigure extends AbstractScaleFigure { Line2D.Double line = new Line2D.Double(); for (Tick t : verticalTicks) { if (t.major) { - g2.setColor(GUIUtil.getUITheme().getFinPointGridMajorLineColor()); + g2.setColor(finPointGridMajorLineColor); line.setLine( t.value, y0, t.value, y1); g2.draw(line); }else{ - g2.setColor(GUIUtil.getUITheme().getFinPointGridMinorLineColor()); + g2.setColor(finPointGridMinorLineColor); line.setLine( t.value, y0, t.value, y1); g2.draw(line); } @@ -136,11 +152,11 @@ public class FinPointFigure extends AbstractScaleFigure { Tick[] horizontalTicks = unit.getTicks(y0, y1, MINOR_TICKS / this.scale, MAJOR_TICKS / this.scale); for (Tick t : horizontalTicks) { if (t.major) { - g2.setColor(GUIUtil.getUITheme().getFinPointGridMajorLineColor()); + g2.setColor(finPointGridMajorLineColor); line.setLine( x0, t.value, x1, t.value); g2.draw(line); }else{ - g2.setColor(GUIUtil.getUITheme().getFinPointGridMinorLineColor()); + g2.setColor(finPointGridMinorLineColor); line.setLine( x0, t.value, x1, t.value); g2.draw(line); } @@ -163,7 +179,7 @@ public class FinPointFigure extends AbstractScaleFigure { // setup lines final float bodyLineWidth = (float) ( LINE_WIDTH_BODY_PIXELS / scale ); g2.setStroke(new BasicStroke( bodyLineWidth, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); - g2.setColor(GUIUtil.getUITheme().getFinPointBodyLineColor()); + g2.setColor(finPointBodyLineColor); Transition body = (Transition) finset.getParent(); final float xResolution_m = 0.01f; // distance between draw points, in meters @@ -213,7 +229,7 @@ public class FinPointFigure extends AbstractScaleFigure { final float bodyLineWidth = (float) ( LINE_WIDTH_BODY_PIXELS / scale ); g2.setStroke(new BasicStroke( bodyLineWidth, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); - g2.setColor(GUIUtil.getUITheme().getFinPointBodyLineColor()); + g2.setColor(finPointBodyLineColor); g2.draw(shape); } @@ -230,12 +246,12 @@ public class FinPointFigure extends AbstractScaleFigure { final float finEdgeWidth_m = (float) (LINE_WIDTH_FIN_PIXELS / scale ); g2.setStroke(new BasicStroke( finEdgeWidth_m, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); - g2.setColor(GUIUtil.getUITheme().getFinPointBodyLineColor()); + g2.setColor(finPointBodyLineColor); g2.draw(shape); } private void paintFinHandles(final Graphics2D g2) { - // excludes fin tab points + // Excludes fin tab points final Coordinate[] drawPoints = finset.getFinPoints(); // Fin point boxes @@ -244,7 +260,7 @@ public class FinPointFigure extends AbstractScaleFigure { final float boxEdgeWidth_m = (float) ( LINE_WIDTH_BOX_PIXELS / scale ); g2.setStroke(new BasicStroke( boxEdgeWidth_m, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); - g2.setColor(GUIUtil.getUITheme().getFinPointPointColor()); + g2.setColor(finPointPointColor); finPointHandles = new Rectangle2D.Double[ drawPoints.length]; for (int currentIndex = 0; currentIndex < drawPoints.length; currentIndex++) { @@ -256,15 +272,15 @@ public class FinPointFigure extends AbstractScaleFigure { final Rectangle2D.Double selectedPointHighlight = new Rectangle2D.Double(c.x - selBoxHalfWidth, c.y - selBoxHalfWidth, selBoxWidth, selBoxWidth); - // switch to the highlight color - g2.setColor(GUIUtil.getUITheme().getFinPointSelectedPointColor()); + // Switch to the highlight color + g2.setColor(finPointSelectedPointColor); g2.draw(selectedPointHighlight); - // reset to the normal color - g2.setColor(GUIUtil.getUITheme().getFinPointPointColor()); + // Reset to the normal color + g2.setColor(finPointPointColor); } - // normal boxes + // Normal boxes finPointHandles[currentIndex] = new Rectangle2D.Double(c.x - boxHalfWidth, c.y - boxHalfWidth, boxWidth, boxWidth); g2.draw(finPointHandles[currentIndex]); From ebb4186ccb0f5ad8de9f092cd6ee28d54daac0db Mon Sep 17 00:00:00 2001 From: SiboVG Date: Fri, 22 Sep 2023 18:21:49 +0200 Subject: [PATCH 16/17] Refactor UI theme elements to update from listener --- .../file/wavefrontobj/OBJOptionChooser.java | 19 +++++- .../openrocket/gui/components/BasicTree.java | 19 +++++- .../gui/components/DescriptionArea.java | 19 +++++- .../openrocket/gui/components/URLLabel.java | 19 +++++- .../gui/configdialog/InnerTubeConfig.java | 14 ++++- .../configdialog/RocketComponentConfig.java | 27 ++++++-- .../gui/configdialog/RocketConfig.java | 21 ++++++- .../CustomExpressionPanel.java | 42 +++++++++++-- .../gui/dialogs/BugReportDialog.java | 18 +++++- .../gui/dialogs/ComponentAnalysisDialog.java | 35 ++++++++++- .../gui/dialogs/DebugLogDialog.java | 21 ++++++- .../gui/dialogs/ErrorWarningDialog.java | 31 ++++++++-- .../gui/dialogs/UpdateInfoDialog.java | 19 +++++- .../openrocket/gui/dialogs/WarningDialog.java | 20 +++++- .../openrocket/gui/dialogs/WelcomeDialog.java | 20 +++++- .../RenameConfigDialog.java | 19 +++++- .../motor/thrustcurve/MotorFilterPanel.java | 23 +++++-- .../thrustcurve/MotorInformationPanel.java | 28 +++++++-- .../ThrustCurveMotorSelectionPanel.java | 17 +++++- .../optimization/SimulationModifierTree.java | 35 +++++++++-- .../preferences/LaunchPreferencesPanel.java | 18 +++++- .../SimulationPreferencesPanel.java | 19 +++++- .../gui/figure3d/RocketFigure3d.java | 21 ++++++- .../gui/figureelements/CGCaret.java | 18 +++++- .../gui/figureelements/CPCaret.java | 18 +++++- .../gui/figureelements/RocketInfo.java | 52 +++++++++++----- .../gui/help/tours/SlideSetManager.java | 18 +++++- .../gui/help/tours/SlideShowComponent.java | 21 ++++++- .../sf/openrocket/gui/main/DesignPanel.java | 19 +++++- .../componenttree/ComponentTreeRenderer.java | 61 +++++++++++++++---- .../FlightConfigurablePanel.java | 30 +++++++-- .../gui/plot/SimulationPlotDialog.java | 23 ++++++- .../gui/scalefigure/AbstractScaleFigure.java | 18 +++++- .../gui/scalefigure/FinPointFigure.java | 15 ++++- .../gui/scalefigure/RocketFigure.java | 22 ++++++- .../gui/scalefigure/ScaleScrollPane.java | 20 +++++- .../simulation/SimulationOptionsPanel.java | 25 +++++++- .../gui/simulation/SimulationPlotPanel.java | 29 +++++++-- .../gui/util/BetterListCellRenderer.java | 29 +++++++-- .../net/sf/openrocket/gui/util/UITheme.java | 29 +++++++++ .../extension/impl/JavaCodeConfigurator.java | 20 +++++- 41 files changed, 874 insertions(+), 117 deletions(-) diff --git a/swing/src/net/sf/openrocket/file/wavefrontobj/OBJOptionChooser.java b/swing/src/net/sf/openrocket/file/wavefrontobj/OBJOptionChooser.java index d23149313..ec42ad0a0 100644 --- a/swing/src/net/sf/openrocket/file/wavefrontobj/OBJOptionChooser.java +++ b/swing/src/net/sf/openrocket/file/wavefrontobj/OBJOptionChooser.java @@ -5,6 +5,7 @@ import net.sf.openrocket.file.wavefrontobj.export.OBJExportOptions; import net.sf.openrocket.gui.SpinnerEditor; import net.sf.openrocket.gui.adaptors.DoubleModel; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.rocketcomponent.ComponentAssembly; import net.sf.openrocket.rocketcomponent.Rocket; @@ -27,6 +28,7 @@ import javax.swing.JToggleButton; import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import java.awt.Color; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -64,6 +66,12 @@ public class OBJOptionChooser extends JPanel { private int totallyNormalCounter = 0; + private static Color darkWarningColor; + + static { + initColors(); + } + public OBJOptionChooser(JComponent parent, OBJExportOptions opts, List selectedComponents, Rocket rocket) { super(new MigLayout("hidemode 3")); @@ -305,13 +313,22 @@ public class OBJOptionChooser extends JPanel { loadOptions(opts); } + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(OBJOptionChooser::updateColors); + } + + private static void updateColors() { + darkWarningColor = GUIUtil.getUITheme().getDarkWarningColor(); + } + /** * Highlight the given button and un-highlight the other button. * @param highlightButton The button to highlight * @param loserButton The button to un-highlight */ private void highlightButton(JButton highlightButton, JButton loserButton) { - highlightButton.setBorder(BorderFactory.createLineBorder(GUIUtil.getUITheme().getDarkWarningColor())); + highlightButton.setBorder(BorderFactory.createLineBorder(darkWarningColor)); loserButton.setBorder(UIManager.getBorder("Button.border")); } diff --git a/swing/src/net/sf/openrocket/gui/components/BasicTree.java b/swing/src/net/sf/openrocket/gui/components/BasicTree.java index c3d75231e..6da216522 100644 --- a/swing/src/net/sf/openrocket/gui/components/BasicTree.java +++ b/swing/src/net/sf/openrocket/gui/components/BasicTree.java @@ -1,6 +1,7 @@ package net.sf.openrocket.gui.components; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import java.awt.BasicStroke; import java.awt.Color; @@ -16,6 +17,12 @@ import javax.swing.tree.TreePath; @SuppressWarnings("serial") public class BasicTree extends JTree { + private static Color backgroundColor; + + static { + initColors(); + } + public BasicTree() { super(); setDefaultOptions(); @@ -37,10 +44,18 @@ public class BasicTree extends JTree { plainUI.setLeftChildIndent(15); - this.setBackground(GUIUtil.getUITheme().getBackgroundColor()); + this.setBackground(backgroundColor); this.setShowsRootHandles(false); } - + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(BasicTree::updateColors); + } + + private static void updateColors() { + backgroundColor = GUIUtil.getUITheme().getBackgroundColor(); + } /** * Expand the entire tree structure. All nodes will be visible after the call. diff --git a/swing/src/net/sf/openrocket/gui/components/DescriptionArea.java b/swing/src/net/sf/openrocket/gui/components/DescriptionArea.java index 947f70335..edc39f6f7 100644 --- a/swing/src/net/sf/openrocket/gui/components/DescriptionArea.java +++ b/swing/src/net/sf/openrocket/gui/components/DescriptionArea.java @@ -1,6 +1,7 @@ package net.sf.openrocket.gui.components; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.gui.util.URLUtil; import java.awt.Color; @@ -16,6 +17,7 @@ import java.io.File; import java.io.FileOutputStream; import javax.swing.JTextPane; +import javax.swing.border.Border; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import javax.swing.text.SimpleAttributeSet; @@ -33,6 +35,12 @@ public class DescriptionArea extends JScrollPane { private final JEditorPane editorPane; private final float size; + + private static Border border; + + static { + initColors(); + } /** @@ -177,11 +185,20 @@ public class DescriptionArea extends JScrollPane { dim.height = lineheight * rows + extraheight + 2; this.setPreferredSize(dim); - editorPane.setBorder(GUIUtil.getUITheme().getBorder()); + editorPane.setBorder(border); this.setViewportView(editorPane); this.setText(text); } + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(DescriptionArea::updateColors); + } + + private static void updateColors() { + border = GUIUtil.getUITheme().getBorder(); + } public void setText(String txt) { // Set the font size (we can't simply set the font to change the font size, because we're using text/html) diff --git a/swing/src/net/sf/openrocket/gui/components/URLLabel.java b/swing/src/net/sf/openrocket/gui/components/URLLabel.java index 3d9a45321..cc64b9b50 100644 --- a/swing/src/net/sf/openrocket/gui/components/URLLabel.java +++ b/swing/src/net/sf/openrocket/gui/components/URLLabel.java @@ -1,5 +1,6 @@ package net.sf.openrocket.gui.components; +import java.awt.Color; import java.awt.Cursor; import java.awt.Desktop; import java.awt.event.MouseAdapter; @@ -9,6 +10,7 @@ import java.util.HashMap; import java.util.Map; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.gui.util.URLUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,6 +24,12 @@ import org.slf4j.LoggerFactory; public class URLLabel extends SelectableLabel { private static final Logger log = LoggerFactory.getLogger(URLLabel.class); + private static Color URLColor; + + static { + initColors(); + } + /** * Create a label showing the url it will direct to. * @@ -48,7 +56,7 @@ public class URLLabel extends SelectableLabel { Map map = new HashMap(); map.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON); this.setFont(this.getFont().deriveFont(map)); - this.setForeground(GUIUtil.getUITheme().getURLColor()); + this.setForeground(URLColor); this.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); @@ -66,4 +74,13 @@ public class URLLabel extends SelectableLabel { } } + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(URLLabel::updateColors); + } + + private static void updateColors() { + URLColor = GUIUtil.getUITheme().getURLColor(); + } } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java index 98709e734..d3c267ff1 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java @@ -41,6 +41,7 @@ import net.sf.openrocket.gui.components.BasicSlider; import net.sf.openrocket.gui.components.DescriptionArea; import net.sf.openrocket.gui.components.UnitSelector; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.gui.widgets.SelectColorButton; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.material.Material; @@ -467,15 +468,15 @@ class ClusterSelectionPanel extends JPanel { private static final int MOTOR_DIAMETER = 10; private static final Color SELECTED_COLOR; - private static final Color UNSELECTED_COLOR; + private static Color UNSELECTED_COLOR; private static final Color MOTOR_FILL_COLOR; private static final Color MOTOR_BORDER_COLOR; static { SELECTED_COLOR = Color.RED; - UNSELECTED_COLOR = GUIUtil.getUITheme().getBackgroundColor(); MOTOR_FILL_COLOR = Color.GREEN; MOTOR_BORDER_COLOR = Color.BLACK; + initColors(); } public ClusterSelectionPanel(Clusterable component) { @@ -495,6 +496,15 @@ class ClusterSelectionPanel extends JPanel { } + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(ClusterSelectionPanel::updateColors); + } + + private static void updateColors() { + UNSELECTED_COLOR = GUIUtil.getUITheme().getBackgroundColor(); + } + private class ClusterButton extends JPanel implements StateChangeListener, MouseListener, Resettable { diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java index e5a985341..a62a0e969 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java @@ -30,6 +30,7 @@ import javax.swing.JTabbedPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingUtilities; +import javax.swing.border.Border; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; @@ -49,6 +50,7 @@ import net.sf.openrocket.gui.components.UnitSelector; import net.sf.openrocket.gui.dialogs.preset.ComponentPresetChooserDialog; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.gui.util.Icons; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.gui.widgets.IconToggleButton; import net.sf.openrocket.gui.widgets.SelectColorButton; import net.sf.openrocket.l10n.Translator; @@ -97,6 +99,13 @@ public class RocketComponentConfig extends JPanel { private boolean allSameType; // Checks whether all listener components are of the same type as private boolean allMassive; // Checks whether all listener components, and this component, are massive + private static Color darkWarningColor; + private static Border border; + + static { + initColors(); + } + public RocketComponentConfig(OpenRocketDocument document, RocketComponent component, JDialog parent) { setLayout(new MigLayout("fill, gap 4!, ins panel, hidemode 3", "[]:5[]", "[growprio 5]5![fill, grow, growprio 500]5![growprio 5]")); @@ -187,6 +196,16 @@ public class RocketComponentConfig extends JPanel { updateFields(); } + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(RocketComponentConfig::updateColors); + } + + private static void updateColors() { + darkWarningColor = GUIUtil.getUITheme().getDarkWarningColor(); + border = GUIUtil.getUITheme().getBorder(); + } + /** * Add a section to the component configuration dialog that displays information about the component. */ @@ -506,7 +525,7 @@ public class RocketComponentConfig extends JPanel { StyledLabel labelMassOverriddenBy = new StyledLabel( String.format(trans.get("RocketCompCfg.lbl.MassOverriddenBy"), component.getMassOverriddenBy().getName()), 0, StyledLabel.Style.BOLD); - labelMassOverriddenBy.setFontColor(GUIUtil.getUITheme().getDarkWarningColor()); + labelMassOverriddenBy.setFontColor(darkWarningColor); labelMassOverriddenBy.setToolTipText( String.format(trans.get("RocketCompCfg.lbl.MassOverriddenBy.ttip"), component.getMassOverriddenBy().getName())); checkboxes.add(labelMassOverriddenBy, "gapleft 25lp, wrap"); @@ -569,7 +588,7 @@ public class RocketComponentConfig extends JPanel { StyledLabel labelCGOverriddenBy = new StyledLabel( String.format(trans.get("RocketCompCfg.lbl.CGOverriddenBy"), component.getCGOverriddenBy().getName()), 0, StyledLabel.Style.BOLD); - labelCGOverriddenBy.setFontColor(GUIUtil.getUITheme().getDarkWarningColor()); + labelCGOverriddenBy.setFontColor(darkWarningColor); labelCGOverriddenBy.setToolTipText( String.format(trans.get("RocketCompCfg.lbl.CGOverriddenBy.ttip"), component.getCGOverriddenBy().getName())); checkboxes.add(labelCGOverriddenBy, "gapleft 25lp, wrap"); @@ -663,7 +682,7 @@ public class RocketComponentConfig extends JPanel { StyledLabel labelCDOverriddenBy = new StyledLabel( String.format(trans.get("RocketCompCfg.lbl.CDOverriddenBy"), component.getCDOverriddenBy().getName()), 0, StyledLabel.Style.BOLD); - labelCDOverriddenBy.setFontColor(GUIUtil.getUITheme().getDarkWarningColor()); + labelCDOverriddenBy.setFontColor(darkWarningColor); labelCDOverriddenBy.setToolTipText( String.format(trans.get("RocketCompCfg.lbl.CDOverriddenBy"), component.getCDOverriddenBy().getName())); checkboxes.add(labelCDOverriddenBy, "gapleft 25lp, wrap"); @@ -719,7 +738,7 @@ public class RocketComponentConfig extends JPanel { commentTextArea.setLineWrap(true); commentTextArea.setWrapStyleWord(true); commentTextArea.setEditable(true); - commentTextArea.setBorder(GUIUtil.getUITheme().getBorder()); + commentTextArea.setBorder(border); GUIUtil.setTabToFocusing(commentTextArea); commentTextArea.addFocusListener(textFieldListener); commentTextArea.addKeyListener(new TextComponentSelectionKeyListener(commentTextArea)); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RocketConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RocketConfig.java index 9835778ca..0b7bd3df4 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RocketConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RocketConfig.java @@ -16,10 +16,12 @@ import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTextArea; +import javax.swing.border.Border; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; @@ -34,6 +36,12 @@ public class RocketConfig extends RocketComponentConfig { private JTextArea revisionTextArea; private final Rocket rocket; + + private static Border border; + + static { + initColors(); + } public RocketConfig(OpenRocketDocument d, RocketComponent c, JDialog parent) { super(d, c, parent); @@ -55,7 +63,7 @@ public class RocketConfig extends RocketComponentConfig { designerTextArea.setLineWrap(true); designerTextArea.setWrapStyleWord(true); designerTextArea.setEditable(true); - designerTextArea.setBorder(GUIUtil.getUITheme().getBorder()); + designerTextArea.setBorder(border); GUIUtil.setTabToFocusing(designerTextArea); designerTextArea.addFocusListener(textFieldListener); this.add(new JScrollPane(designerTextArea), "wmin 400lp, height 60lp:60lp:, grow 30, wrap para"); @@ -70,7 +78,7 @@ public class RocketConfig extends RocketComponentConfig { revisionTextArea.setLineWrap(true); revisionTextArea.setWrapStyleWord(true); revisionTextArea.setEditable(true); - revisionTextArea.setBorder(GUIUtil.getUITheme().getBorder()); + revisionTextArea.setBorder(border); GUIUtil.setTabToFocusing(revisionTextArea); revisionTextArea.addFocusListener(textFieldListener); @@ -81,6 +89,15 @@ public class RocketConfig extends RocketComponentConfig { addEasterEgg(); } + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(RocketConfig::updateColors); + } + + private static void updateColors() { + border = GUIUtil.getUITheme().getBorder(); + } + /** * Little method that adds a fun easter-egg to the rocket config dialog. */ diff --git a/swing/src/net/sf/openrocket/gui/customexpression/CustomExpressionPanel.java b/swing/src/net/sf/openrocket/gui/customexpression/CustomExpressionPanel.java index c37e8ed2b..8470a6a9a 100644 --- a/swing/src/net/sf/openrocket/gui/customexpression/CustomExpressionPanel.java +++ b/swing/src/net/sf/openrocket/gui/customexpression/CustomExpressionPanel.java @@ -1,5 +1,6 @@ package net.sf.openrocket.gui.customexpression; +import java.awt.Color; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -15,10 +16,12 @@ import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; +import javax.swing.border.Border; import javax.swing.filechooser.FileNameExtensionFilter; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.gui.util.SwingPreferences; +import net.sf.openrocket.gui.util.UITheme; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,7 +45,13 @@ public class CustomExpressionPanel extends JPanel { private JPanel expressionSelectorPanel; private OpenRocketDocument doc; - + + private static Border border; + + static { + initColors(); + } + public CustomExpressionPanel(final OpenRocketDocument doc, final JDialog parentDialog) { super(new MigLayout("fill")); this.doc = doc; @@ -51,7 +60,7 @@ public class CustomExpressionPanel extends JPanel { expressionSelectorPanel.setToolTipText(trans.get("customExpressionPanel.lbl.CalcNote")); JScrollPane scroll = new JScrollPane(expressionSelectorPanel); - expressionSelectorPanel.setBorder(GUIUtil.getUITheme().getBorder()); + expressionSelectorPanel.setBorder(border); //Border bdr = BorderFactory.createTitledBorder(trans.get("customExpressionPanel.lbl.CustomExpressions")); //scroll.setBorder(bdr); @@ -131,7 +140,16 @@ public class CustomExpressionPanel extends JPanel { updateExpressions(); } - + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(CustomExpressionPanel::updateColors); + } + + private static void updateColors() { + border = GUIUtil.getUITheme().getBorder(); + } + /* * Update the expressionSelectorPanel */ @@ -171,10 +189,24 @@ public class CustomExpressionPanel extends JPanel { * A JPanel which configures a single expression */ private class SingleExpression extends JPanel { + private static Color backgroundColor; + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(SingleExpression::updateColors); + } + + static { + initColors(); + } + + private static void updateColors() { + backgroundColor = GUIUtil.getUITheme().getBackgroundColor(); + } // Convenience method to make the labels consistent private JLabel setLabelStyle(JLabel l) { - l.setBackground(GUIUtil.getUITheme().getBackgroundColor()); + l.setBackground(backgroundColor); l.setOpaque(true); l.setBorder(BorderFactory.createRaisedBevelBorder()); l.setText(" " + l.getText() + " "); @@ -192,7 +224,7 @@ public class CustomExpressionPanel extends JPanel { JLabel symbolLabel = new JLabel(trans.get("customExpression.Symbol") + " :"); JLabel symbol = new JLabel(expression.getSymbol()); symbol = setLabelStyle(symbol); - symbol.setBackground(GUIUtil.getUITheme().getBackgroundColor()); + symbol.setBackground(backgroundColor); JLabel unitLabel = new JLabel(trans.get("customExpression.Units") + " :"); UnitSelector unitSelector = new UnitSelector(expression.getType().getUnitGroup()); diff --git a/swing/src/net/sf/openrocket/gui/dialogs/BugReportDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/BugReportDialog.java index 117384b51..7e9818629 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/BugReportDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/BugReportDialog.java @@ -29,6 +29,7 @@ import net.sf.openrocket.gui.components.StyledLabel; import net.sf.openrocket.gui.components.URLLabel; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.gui.util.SwingPreferences; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.logging.LogLevelBufferLogger; import net.sf.openrocket.logging.LogLine; @@ -47,6 +48,12 @@ public class BugReportDialog extends JDialog { private static final Translator trans = Application.getTranslator(); private static final SwingPreferences preferences = (SwingPreferences) Application.getPreferences(); + + private static Color darkWarningColor; + + static { + initColors(); + } public BugReportDialog(Window parent, String labelText, final String message, final boolean sendIfUnchanged) { @@ -103,6 +110,15 @@ public class BugReportDialog extends JDialog { GUIUtil.setDisposableDialogOptions(this, close); } + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(BugReportDialog::updateColors); + } + + private static void updateColors() { + darkWarningColor = GUIUtil.getUITheme().getDarkWarningColor(); + } /** * Show a general bug report dialog allowing the user to input information about @@ -178,7 +194,7 @@ public class BugReportDialog extends JDialog { private static void addBugReportInformation(StringBuilder sb) { sb.append("---------- Bug report ----------\n"); sb.append('\n'); - Color color = GUIUtil.getUITheme().getDarkWarningColor(); + Color color = darkWarningColor; sb.append(String.format("Please include a description about what actions you were " + "performing when the exception occurred:\n", color.getRed(), color.getGreen(), color.getBlue())); sb.append("(You can edit text directly in this window)\n"); diff --git a/swing/src/net/sf/openrocket/gui/dialogs/ComponentAnalysisDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/ComponentAnalysisDialog.java index 2a9d598d7..e91a4af75 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/ComponentAnalysisDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/ComponentAnalysisDialog.java @@ -33,6 +33,7 @@ import javax.swing.ListSelectionModel; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import javax.swing.UIManager; +import javax.swing.border.Border; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.table.DefaultTableCellRenderer; @@ -41,6 +42,7 @@ import net.miginfocom.swing.MigLayout; import net.sf.openrocket.aerodynamics.AerodynamicCalculator; import net.sf.openrocket.aerodynamics.AerodynamicForces; import net.sf.openrocket.aerodynamics.FlightConditions; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.logging.Warning; import net.sf.openrocket.logging.WarningSet; import net.sf.openrocket.gui.adaptors.Column; @@ -97,6 +99,12 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe private final List dragData = new ArrayList(); private final List rollData = new ArrayList(); + private static Border border; + + static { + initColors(); + } + public ComponentAnalysisDialog(final RocketPanel rocketPanel) { ////Component analysis @@ -150,7 +158,7 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe warningList = new JList<>(); JScrollPane scrollPane = new JScrollPane(warningList); - warningList.setBorder(GUIUtil.getUITheme().getBorder()); + warningList.setBorder(border); ////Warnings: scrollPane.setBorder(BorderFactory.createTitledBorder(trans.get("componentanalysisdlg.TitledBorder.warnings"))); panel.add(scrollPane, "gap paragraph, spany 4, w 300lp, grow, height :100lp:, wrap"); @@ -499,6 +507,14 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe } + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(ComponentAnalysisDialog::updateColors); + } + + private static void updateColors() { + border = GUIUtil.getUITheme().getBorder(); + } /** * Updates the data in the table and fires a table data change event. @@ -626,6 +642,12 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe private final List data; protected final int decimalPlaces; + private static Color backgroundColor; + + static { + initColors(); + } + public CustomCellRenderer(List data, int decimalPlaces) { super(); this.decimalPlaces = decimalPlaces; @@ -634,6 +656,15 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe this.boldFont = normalFont.deriveFont(Font.BOLD); } + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(CustomCellRenderer::updateColors); + } + + private static void updateColors() { + backgroundColor = GUIUtil.getUITheme().getBackgroundColor(); + } + @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { @@ -647,7 +678,7 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe } label.setOpaque(true); - label.setBackground(GUIUtil.getUITheme().getBackgroundColor()); + label.setBackground(backgroundColor); label.setHorizontalAlignment(SwingConstants.LEFT); if ((row < 0) || (row >= data.size())) diff --git a/swing/src/net/sf/openrocket/gui/dialogs/DebugLogDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/DebugLogDialog.java index 26bbd5ddf..9fe13d2d0 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/DebugLogDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/DebugLogDialog.java @@ -32,12 +32,14 @@ import javax.swing.ListSelectionModel; import javax.swing.RowFilter; import javax.swing.SwingUtilities; import javax.swing.Timer; +import javax.swing.border.Border; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; +import net.sf.openrocket.gui.util.UITheme; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -109,6 +111,12 @@ public class DebugLogDialog extends JDialog { private final SelectableLabel locationLabel; private final SelectableLabel messageLabel; private final JTextArea stackTraceLabel; + + private static Border border; + + static { + initColors(); + } public DebugLogDialog(Window parent) { //// OpenRocket debug log @@ -343,7 +351,7 @@ public class DebugLogDialog extends JDialog { bottomPanel.add(new JLabel(trans.get("debuglogdlg.lbl.Stacktrace")), "wrap rel"); stackTraceLabel = new JTextArea(8, 80); stackTraceLabel.setEditable(false); - stackTraceLabel.setBorder(GUIUtil.getUITheme().getBorder()); + stackTraceLabel.setBorder(border); GUIUtil.changeFontSize(stackTraceLabel, -2); bottomPanel.add(new JScrollPane(stackTraceLabel), "grow, pushy 200, growprioy 200"); @@ -385,7 +393,16 @@ public class DebugLogDialog extends JDialog { setLocationRelativeTo(parent); followBox.requestFocus(); } - + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(DebugLogDialog::updateColors); + } + + private static void updateColors() { + border = GUIUtil.getUITheme().getBorder(); + } + private void updateSelected(int row) { if (row < 0) { diff --git a/swing/src/net/sf/openrocket/gui/dialogs/ErrorWarningDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/ErrorWarningDialog.java index 29e74dcde..13e2a8b1f 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/ErrorWarningDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/ErrorWarningDialog.java @@ -4,6 +4,7 @@ import net.miginfocom.swing.MigLayout; import net.sf.openrocket.gui.components.StyledLabel; import net.sf.openrocket.gui.util.BetterListCellRenderer; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.logging.Error; import net.sf.openrocket.logging.ErrorSet; import net.sf.openrocket.logging.Warning; @@ -16,6 +17,8 @@ import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSeparator; import javax.swing.ListSelectionModel; +import javax.swing.border.Border; +import java.awt.Color; import java.awt.Component; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -25,12 +28,30 @@ import java.awt.event.MouseEvent; */ @SuppressWarnings("serial") public abstract class ErrorWarningDialog { + private static Border border; + private static Color darkWarningColor; + private static Color textSelectionForegroundColor; + + static { + initColors(); + } + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(ErrorWarningDialog::updateColors); + } + + private static void updateColors() { + border = GUIUtil.getUITheme().getBorder(); + darkWarningColor = GUIUtil.getUITheme().getDarkWarningColor(); + textSelectionForegroundColor = GUIUtil.getUITheme().getTextSelectionForegroundColor(); + } public static void showErrorsAndWarnings(Component parent, Object message, String title, ErrorSet errors, WarningSet warnings) { JPanel content = new JPanel(new MigLayout("ins 0, fillx")); StyledLabel label = new StyledLabel("Errors"); - label.setFontColor(GUIUtil.getUITheme().getDarkWarningColor()); + label.setFontColor(darkWarningColor); content.add(label, "wrap, gaptop 15lp"); Error[] e = errors.toArray(new Error[0]); @@ -38,7 +59,7 @@ public abstract class ErrorWarningDialog { errorList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); errorList.setCellRenderer(new ErrorListCellRenderer()); JScrollPane errorPane = new JScrollPane(errorList); - errorList.setBorder(GUIUtil.getUITheme().getBorder()); + errorList.setBorder(border); content.add(errorPane, "wrap, growx"); // Deselect items if clicked on blank region @@ -60,7 +81,7 @@ public abstract class ErrorWarningDialog { final JList warningList = new JList<>(w); warningList.setCellRenderer(new BetterListCellRenderer()); JScrollPane warningPane = new JScrollPane(warningList); - warningList.setBorder(GUIUtil.getUITheme().getBorder()); + warningList.setBorder(border); content.add(warningPane, "wrap, growx"); // Deselect items if clicked on blank region @@ -87,9 +108,9 @@ public abstract class ErrorWarningDialog { // Text color if (isSelected) { - label.setForeground(GUIUtil.getUITheme().getTextSelectionForegroundColor()); + label.setForeground(textSelectionForegroundColor); } else { - label.setForeground(GUIUtil.getUITheme().getDarkWarningColor()); + label.setForeground(darkWarningColor); } return label; diff --git a/swing/src/net/sf/openrocket/gui/dialogs/UpdateInfoDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/UpdateInfoDialog.java index cf84659ca..cfcd415d7 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/UpdateInfoDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/UpdateInfoDialog.java @@ -1,5 +1,6 @@ package net.sf.openrocket.gui.dialogs; +import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Insets; @@ -32,6 +33,7 @@ import net.sf.openrocket.gui.components.StyledLabel; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.gui.util.Icons; import net.sf.openrocket.gui.util.SwingPreferences; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.gui.util.URLUtil; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.startup.Application; @@ -51,6 +53,12 @@ public class UpdateInfoDialog extends JDialog { private static final Translator trans = Application.getTranslator(); private final SwingPreferences preferences = (SwingPreferences) Application.getPreferences(); + private static Color textColor; + + static { + initColors(); + } + public UpdateInfoDialog(UpdateInfo info) { //// OpenRocket update available super(null, trans.get("update.dlg.updateAvailable.title"), ModalityType.APPLICATION_MODAL); @@ -74,7 +82,7 @@ public class UpdateInfoDialog extends JDialog { // Release information box final JTextPane textPane = new JTextPane(); - textPane.setBorder(BorderFactory.createLineBorder(GUIUtil.getUITheme().getTextColor())); + textPane.setBorder(BorderFactory.createLineBorder(textColor)); textPane.setEditable(false); textPane.setContentType("text/html"); textPane.setMargin(new Insets(10, 10, 40, 10)); @@ -201,6 +209,15 @@ public class UpdateInfoDialog extends JDialog { GUIUtil.setDisposableDialogOptions(this, btnLater); } + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(UpdateInfoDialog::updateColors); + } + + private static void updateColors() { + textColor = GUIUtil.getUITheme().getTextColor(); + } + /** * ComboBox renderer to display an UpdatePlatform by the platform name */ diff --git a/swing/src/net/sf/openrocket/gui/dialogs/WarningDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/WarningDialog.java index ec2a0a34a..5eb41437c 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/WarningDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/WarningDialog.java @@ -6,21 +6,37 @@ import javax.swing.BorderFactory; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JScrollPane; +import javax.swing.border.Border; import net.sf.openrocket.gui.util.BetterListCellRenderer; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.logging.Warning; import net.sf.openrocket.logging.WarningSet; @SuppressWarnings("serial") public abstract class WarningDialog { + private static Border border; + + static { + initColors(); + } + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(WarningDialog::updateColors); + } + + private static void updateColors() { + border = GUIUtil.getUITheme().getBorder(); + } + public static void showWarnings(Component parent, Object message, String title, WarningSet warnings) { - Warning[] w = warnings.toArray(new Warning[0]); final JList list = new JList(w); list.setCellRenderer(new BetterListCellRenderer()); JScrollPane pane = new JScrollPane(list); - pane.setBorder(GUIUtil.getUITheme().getBorder()); + pane.setBorder(border); JOptionPane.showMessageDialog(parent, new Object[] { message, pane }, title, JOptionPane.WARNING_MESSAGE); diff --git a/swing/src/net/sf/openrocket/gui/dialogs/WelcomeDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/WelcomeDialog.java index 4d1cfa805..6b8d92d74 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/WelcomeDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/WelcomeDialog.java @@ -4,6 +4,7 @@ import net.miginfocom.swing.MigLayout; import net.sf.openrocket.gui.components.StyledLabel; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.gui.util.Icons; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.gui.util.URLUtil; import net.sf.openrocket.gui.widgets.SelectColorButton; import net.sf.openrocket.l10n.Translator; @@ -20,9 +21,9 @@ import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextPane; +import javax.swing.border.Border; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; -import java.awt.Desktop; import java.awt.Dimension; import java.awt.Insets; import java.awt.event.ActionEvent; @@ -35,6 +36,12 @@ public class WelcomeDialog extends JDialog { private static final Translator trans = Application.getTranslator(); private static final Logger log = LoggerFactory.getLogger(WelcomeDialog.class); + private static Border border; + + static { + initColors(); + } + /** * @param releaseNotes the release notes to display for the current version */ @@ -82,7 +89,7 @@ public class WelcomeDialog extends JDialog { textPane.setCaretPosition(0); // Scroll to the top JScrollPane scrollPane = new JScrollPane(textPane); - scrollPane.setBorder(GUIUtil.getUITheme().getBorder()); + scrollPane.setBorder(border); panel.add(scrollPane, "skip 1, left, spanx, grow, push, gapbottom 6px, wrap"); // Don't show this dialog again @@ -114,4 +121,13 @@ public class WelcomeDialog extends JDialog { this.setLocationRelativeTo(null); GUIUtil.setDisposableDialogOptions(this, closeBtn); } + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(WelcomeDialog::updateColors); + } + + private static void updateColors() { + border = GUIUtil.getUITheme().getBorder(); + } } diff --git a/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/RenameConfigDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/RenameConfigDialog.java index 7cb232a0b..df94a3ffc 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/RenameConfigDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/RenameConfigDialog.java @@ -1,5 +1,6 @@ package net.sf.openrocket.gui.dialogs.flightconfiguration; +import java.awt.Color; import java.awt.Dialog; import java.awt.Window; import java.awt.event.ActionEvent; @@ -15,6 +16,7 @@ import net.miginfocom.swing.MigLayout; import net.sf.openrocket.gui.components.StyledLabel; import net.sf.openrocket.gui.configdialog.CommonStrings; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.Rocket; @@ -25,6 +27,12 @@ public class RenameConfigDialog extends JDialog { private static final long serialVersionUID = -5423008694485357248L; private static final Translator trans = Application.getTranslator(); + private static Color dimTextColor; + + static { + initColors(); + } + public RenameConfigDialog(final Window parent, final Rocket rocket, final FlightConfigurationId fcid) { super(parent, trans.get("RenameConfigDialog.title"), Dialog.ModalityType.APPLICATION_MODAL); @@ -73,11 +81,20 @@ public class RenameConfigDialog extends JDialog { + trans.get("RenameConfigDialog.lbl.infoCases") + trans.get("RenameConfigDialog.lbl.infoCombination"); StyledLabel info = new StyledLabel(text, -2); - info.setFontColor(GUIUtil.getUITheme().getDimTextColor()); + info.setFontColor(dimTextColor); panel.add(info, "spanx, growx, wrap"); this.add(panel); GUIUtil.setDisposableDialogOptions(this, okButton); } + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(RenameConfigDialog::updateColors); + } + + private static void updateColors() { + dimTextColor = GUIUtil.getUITheme().getDimTextColor(); + } } diff --git a/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/MotorFilterPanel.java b/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/MotorFilterPanel.java index 4e461b983..4d1682adc 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/MotorFilterPanel.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/MotorFilterPanel.java @@ -34,6 +34,7 @@ import net.sf.openrocket.gui.components.UnitSelector; import net.sf.openrocket.gui.util.CheckList; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.gui.util.SwingPreferences; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.gui.widgets.MultiSlider; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.motor.Manufacturer; @@ -118,6 +119,12 @@ public abstract class MotorFilterPanel extends JPanel { private final MultiSlider lengthSlider; private final MultiSlider diameterSlider; + private static Border border; + + static { + initColors(); + } + public MotorFilterPanel(Collection allManufacturers, MotorRowFilter filter ) { super(new MigLayout("fill", "[grow]")); this.filter = filter; @@ -146,7 +153,7 @@ public abstract class MotorFilterPanel extends JPanel { // Manufacturer selection JPanel sub = new JPanel(new MigLayout("fill")); - Border templateBorder = GUIUtil.getUITheme().getBorder(); + Border templateBorder = border; TitledBorder border = BorderFactory.createTitledBorder(templateBorder); border.setTitle(trans.get("TCurveMotorCol.MANUFACTURER")); GUIUtil.changeFontStyle(border, Font.BOLD); @@ -186,9 +193,8 @@ public abstract class MotorFilterPanel extends JPanel { }); JScrollPane scrollPane = new JScrollPane(manufacturerCheckList.getList()); - Border border1 = GUIUtil.getUITheme().getBorder(); - if (border1 != null) { - scrollPane.setBorder(border1); + if (border != null) { + scrollPane.setBorder(border); } sub.add(scrollPane, "grow, pushy, wrap"); @@ -368,6 +374,15 @@ public abstract class MotorFilterPanel extends JPanel { } + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(MotorFilterPanel::updateColors); + } + + private static void updateColors() { + border = GUIUtil.getUITheme().getBorder(); + } + public void setMotorMount( MotorMount mount ) { filter.setMotorMount(mount); onSelectionChanged(); diff --git a/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/MotorInformationPanel.java b/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/MotorInformationPanel.java index 741b61ecd..ddb02dde9 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/MotorInformationPanel.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/MotorInformationPanel.java @@ -15,7 +15,9 @@ import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingUtilities; +import javax.swing.border.Border; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.util.StringUtils; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; @@ -42,8 +44,10 @@ class MotorInformationPanel extends JPanel { private static final int ZOOM_ICON_POSITION_NEGATIVE_X = 50; private static final int ZOOM_ICON_POSITION_POSITIVE_Y = 12; - private static final Color NO_COMMENT_COLOR = GUIUtil.getUITheme().getDimTextColor(); - private static final Color WITH_COMMENT_COLOR = GUIUtil.getUITheme().getTextColor(); + private static Color NO_COMMENT_COLOR; + private static Color WITH_COMMENT_COLOR; + private static Color textColor; + private static Border border; // Motors in set private List selectedMotorSet; @@ -74,6 +78,10 @@ class MotorInformationPanel extends JPanel { private final ChartPanel chartPanel; private final JLabel zoomIcon; + static { + initColors(); + } + public MotorInformationPanel() { super(new MigLayout("fill")); @@ -159,7 +167,7 @@ class MotorInformationPanel extends JPanel { comment = new JTextArea(5, 5); - comment.setBorder(GUIUtil.getUITheme().getBorder()); + comment.setBorder(border); GUIUtil.changeFontSize(comment, -2); withCommentFont = comment.getFont(); noCommentFont = withCommentFont.deriveFont(Font.ITALIC); @@ -191,7 +199,7 @@ class MotorInformationPanel extends JPanel { //// Thrust curve: TextTitle title = new TextTitle(trans.get("TCMotorSelPan.title.Thrustcurve"), this.getFont()); - title.setPaint(GUIUtil.getUITheme().getTextColor()); + title.setPaint(textColor); chart.setTitle(title); chart.setBackgroundPaint(this.getBackground()); plot.setBackgroundPaint(Color.WHITE); @@ -239,6 +247,18 @@ class MotorInformationPanel extends JPanel { this.add(layer, "width 300:300:, height 180:180:, grow, spanx"); } } + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(MotorInformationPanel::updateColors); + } + + private static void updateColors() { + NO_COMMENT_COLOR = GUIUtil.getUITheme().getDimTextColor(); + WITH_COMMENT_COLOR = GUIUtil.getUITheme().getTextColor(); + textColor = GUIUtil.getUITheme().getTextColor(); + border = GUIUtil.getUITheme().getBorder(); + } public void clearData() { selectedMotor = null; diff --git a/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/ThrustCurveMotorSelectionPanel.java b/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/ThrustCurveMotorSelectionPanel.java index 2cc104581..60f4eff46 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/ThrustCurveMotorSelectionPanel.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/ThrustCurveMotorSelectionPanel.java @@ -111,6 +111,12 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec private ThrustCurveMotorSet selectedMotorSet; private double selectedDelay; + private static Color dimTextColor; + + static { + initColors(); + } + public ThrustCurveMotorSelectionPanel( final FlightConfigurationId fcid, MotorMount mount ) { this(); setMotorMountAndConfig( fcid, mount ); @@ -336,7 +342,7 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec nrOfMotorsLabel = new StyledLabel(-2f, StyledLabel.Style.ITALIC); nrOfMotorsLabel.setToolTipText(trans.get("TCMotorSelPan.lbl.ttip.nrOfMotors")); updateNrOfMotors(); - nrOfMotorsLabel.setForeground(GUIUtil.getUITheme().getDimTextColor()); + nrOfMotorsLabel.setForeground(dimTextColor); panel.add(nrOfMotorsLabel, "gapleft para, spanx, wrap"); sorter.addRowSorterListener(new RowSorterListener() { @Override @@ -400,6 +406,15 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec } + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(ThrustCurveMotorSelectionPanel::updateColors); + } + + private static void updateColors() { + dimTextColor = GUIUtil.getUITheme().getDimTextColor(); + } + public void setMotorMountAndConfig( final FlightConfigurationId _fcid, MotorMount mountToEdit ) { if ( null == _fcid ){ throw new NullPointerException(" attempted to set mount with a null FCID. bug. "); diff --git a/swing/src/net/sf/openrocket/gui/dialogs/optimization/SimulationModifierTree.java b/swing/src/net/sf/openrocket/gui/dialogs/optimization/SimulationModifierTree.java index 8718a48a6..f2c56dc30 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/optimization/SimulationModifierTree.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/optimization/SimulationModifierTree.java @@ -1,5 +1,6 @@ package net.sf.openrocket.gui.dialogs.optimization; +import java.awt.Color; import java.awt.Component; import java.awt.Font; import java.util.Enumeration; @@ -17,6 +18,7 @@ import javax.swing.tree.TreePath; import net.sf.openrocket.gui.components.BasicTree; import net.sf.openrocket.gui.main.ComponentIcons; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.optimization.rocketoptimization.SimulationModifier; import net.sf.openrocket.rocketcomponent.Rocket; @@ -38,6 +40,15 @@ public class SimulationModifierTree extends BasicTree { private final List selectedModifiers; private static final Translator trans = Application.getTranslator(); + private static Color textColor; + private static Color dimTextColor; + private static Color textSelectionForegroundColor; + private static Color textSelectionBackgroundColor; + + static { + initColors(); + } + /** * Sole constructor. * @@ -57,6 +68,18 @@ public class SimulationModifierTree extends BasicTree { expandComponents(); } + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(SimulationModifierTree::updateColors); + } + + private static void updateColors() { + textColor = GUIUtil.getUITheme().getTextColor(); + dimTextColor = GUIUtil.getUITheme().getDimTextColor(); + textSelectionForegroundColor = GUIUtil.getUITheme().getTextSelectionForegroundColor(); + textSelectionBackgroundColor = GUIUtil.getUITheme().getTextSelectionBackgroundColor(); + } /** @@ -157,7 +180,7 @@ public class SimulationModifierTree extends BasicTree { // Set text color/style if (object instanceof RocketComponent) { - setForeground(GUIUtil.getUITheme().getDimTextColor()); + setForeground(dimTextColor); setFont(componentFont); // Set tooltip @@ -171,21 +194,21 @@ public class SimulationModifierTree extends BasicTree { this.setToolTipText(null); } } else if (object instanceof String) { - setForeground(GUIUtil.getUITheme().getDimTextColor()); + setForeground(dimTextColor); setFont(stringFont); } else if (object instanceof SimulationModifier) { if (selectedModifiers.contains(object)) { - setForeground(GUIUtil.getUITheme().getDimTextColor()); + setForeground(dimTextColor); setFont(stringFont); } else { if (tree.getSelectionRows() != null && IntStream.of(tree.getSelectionRows()).anyMatch(r -> r == row)) { - setForeground(GUIUtil.getUITheme().getTextSelectionForegroundColor()); - setBackground(GUIUtil.getUITheme().getTextSelectionBackgroundColor()); + setForeground(textSelectionForegroundColor); + setBackground(textSelectionBackgroundColor); setOpaque(true); } else { - setForeground(GUIUtil.getUITheme().getTextColor()); + setForeground(textColor); } setFont(modifierFont); } diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preferences/LaunchPreferencesPanel.java b/swing/src/net/sf/openrocket/gui/dialogs/preferences/LaunchPreferencesPanel.java index 2cb386954..50b5d97f7 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preferences/LaunchPreferencesPanel.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preferences/LaunchPreferencesPanel.java @@ -1,5 +1,6 @@ package net.sf.openrocket.gui.dialogs.preferences; +import java.awt.Color; import java.awt.LayoutManager; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; @@ -24,6 +25,7 @@ import net.sf.openrocket.gui.components.BasicSlider; import net.sf.openrocket.gui.components.StyledLabel; import net.sf.openrocket.gui.components.UnitSelector; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.models.atmosphere.ExtendedISAModel; import net.sf.openrocket.simulation.SimulationOptions; import net.sf.openrocket.unit.UnitGroup; @@ -31,6 +33,11 @@ import net.sf.openrocket.util.Chars; import net.sf.openrocket.util.StateChangeListener; public class LaunchPreferencesPanel extends PreferencesPanel { + private static Color darkWarningColor; + + static { + initColors(); + } public LaunchPreferencesPanel(JDialog parent, LayoutManager layout) { super(parent, layout); @@ -44,7 +51,7 @@ public class LaunchPreferencesPanel extends PreferencesPanel { StyledLabel warning = new StyledLabel(String.format( "%s", trans.get("pref.dlg.lbl.launchWarning")), 0.5f, StyledLabel.Style.BOLD); - warning.setFontColor(GUIUtil.getUITheme().getDarkWarningColor()); + warning.setFontColor(darkWarningColor); warning.setToolTipText(trans.get("pref.dlg.lbl.launchWarning.ttip")); add(warning, "spanx, growx 0, gapbottom para, wrap"); @@ -451,6 +458,15 @@ public class LaunchPreferencesPanel extends PreferencesPanel { } + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(LaunchPreferencesPanel::updateColors); + } + + private static void updateColors() { + darkWarningColor = GUIUtil.getUITheme().getDarkWarningColor(); + } + private String getIntensityDescription(double i) { if (i < 0.001) // // None diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preferences/SimulationPreferencesPanel.java b/swing/src/net/sf/openrocket/gui/dialogs/preferences/SimulationPreferencesPanel.java index 051e312ac..36e3c2dda 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preferences/SimulationPreferencesPanel.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preferences/SimulationPreferencesPanel.java @@ -1,5 +1,6 @@ package net.sf.openrocket.gui.dialogs.preferences; +import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -18,6 +19,7 @@ import net.sf.openrocket.gui.components.BasicSlider; import net.sf.openrocket.gui.components.StyledLabel; import net.sf.openrocket.gui.components.UnitSelector; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.simulation.RK4SimulationStepper; import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.util.GeodeticComputationStrategy; @@ -26,6 +28,12 @@ import net.sf.openrocket.gui.widgets.SelectColorButton; public class SimulationPreferencesPanel extends PreferencesPanel { private static final long serialVersionUID = 7983195730016979888L; + private static Color darkWarningColor; + + static { + initColors(); + } + /* * private GeodeticComputationStrategy geodeticComputation = * GeodeticComputationStrategy.SPHERICAL; @@ -85,7 +93,7 @@ public class SimulationPreferencesPanel extends PreferencesPanel { StyledLabel warning = new StyledLabel(String.format( "%s", trans.get("pref.dlg.lbl.launchWarning")), 0, StyledLabel.Style.BOLD); - warning.setFontColor(GUIUtil.getUITheme().getDarkWarningColor()); + warning.setFontColor(darkWarningColor); warning.setToolTipText(trans.get("pref.dlg.lbl.launchWarning.ttip")); subsub.add(warning, "spanx, wrap para"); @@ -294,4 +302,13 @@ public class SimulationPreferencesPanel extends PreferencesPanel { * public void fireContentsChanged() { super.fireContentsChanged(this, 0, * getSize()); } } */ + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(SimulationPreferencesPanel::updateColors); + } + + private static void updateColors() { + darkWarningColor = GUIUtil.getUITheme().getDarkWarningColor(); + } } diff --git a/swing/src/net/sf/openrocket/gui/figure3d/RocketFigure3d.java b/swing/src/net/sf/openrocket/gui/figure3d/RocketFigure3d.java index cc65d95ae..c8a309881 100644 --- a/swing/src/net/sf/openrocket/gui/figure3d/RocketFigure3d.java +++ b/swing/src/net/sf/openrocket/gui/figure3d/RocketFigure3d.java @@ -35,6 +35,7 @@ import javax.swing.SwingUtilities; import javax.swing.event.MouseInputAdapter; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -98,13 +99,19 @@ public class RocketFigure3d extends JPanel implements GLEventListener { float[] lightPosition = new float[] { 1, 4, 1, 0 }; RocketRenderer rr = new FigureRenderer(); + + private static Color backgroundColor; + + static { + initColors(); + } public RocketFigure3d(final OpenRocketDocument document) { this.document = document; this.rkt = document.getRocket(); this.setLayout(new BorderLayout()); - - //Only initialize GL if 3d is enabled. + + // Only initialize GL if 3d is enabled. if (is3dEnabled()) { //Fixes a linux / X bug: Splash must be closed before GL Init SplashScreen splash = Splash.getSplashScreen(); @@ -114,6 +121,15 @@ public class RocketFigure3d extends JPanel implements GLEventListener { initGLCanvas(); } } + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(RocketFigure3d::updateColors); + } + + private static void updateColors() { + backgroundColor = GUIUtil.getUITheme().getBackgroundColor(); + } public void flushTextureCaches() { ((GLAutoDrawable) canvas).invoke(true, new GLRunnable() { @@ -289,7 +305,6 @@ public class RocketFigure3d extends JPanel implements GLEventListener { GL2 gl = drawable.getGL().getGL2(); GLU glu = new GLU(); - Color backgroundColor = GUIUtil.getUITheme().getBackgroundColor(); gl.glClearColor(backgroundColor.getRed()/255f, backgroundColor.getGreen()/255f, backgroundColor.getBlue()/255f, backgroundColor.getAlpha()/255f); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); diff --git a/swing/src/net/sf/openrocket/gui/figureelements/CGCaret.java b/swing/src/net/sf/openrocket/gui/figureelements/CGCaret.java index 77361260f..81a413cdb 100644 --- a/swing/src/net/sf/openrocket/gui/figureelements/CGCaret.java +++ b/swing/src/net/sf/openrocket/gui/figureelements/CGCaret.java @@ -1,6 +1,7 @@ package net.sf.openrocket.gui.figureelements; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import java.awt.Color; import java.awt.geom.Area; @@ -19,6 +20,12 @@ public class CGCaret extends Caret { private static Area caret = null; + private static Color CGColor; + + static { + initColors(); + } + /** * Create a new CGCaret at the specified coordinates. */ @@ -26,6 +33,15 @@ public class CGCaret extends Caret { super(x,y); } + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(CGCaret::updateColors); + } + + private static void updateColors() { + CGColor = GUIUtil.getUITheme().getCGColor(); + } + /** * Returns the Area corresponding to the caret. The Area object is created only once, * after which the object is cloned for new copies. @@ -58,7 +74,7 @@ public class CGCaret extends Caret { */ @Override protected Color getColor() { - return GUIUtil.getUITheme().getCGColor(); + return CGColor; } } diff --git a/swing/src/net/sf/openrocket/gui/figureelements/CPCaret.java b/swing/src/net/sf/openrocket/gui/figureelements/CPCaret.java index a5b66a233..17c2aebae 100644 --- a/swing/src/net/sf/openrocket/gui/figureelements/CPCaret.java +++ b/swing/src/net/sf/openrocket/gui/figureelements/CPCaret.java @@ -1,6 +1,7 @@ package net.sf.openrocket.gui.figureelements; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import java.awt.Color; import java.awt.geom.Area; @@ -18,6 +19,12 @@ public class CPCaret extends Caret { private static Area caret = null; + private static Color CPColor; + + static { + initColors(); + } + /** * Create a new CPCaret at the specified coordinates. */ @@ -25,6 +32,15 @@ public class CPCaret extends Caret { super(x,y); } + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(CPCaret::updateColors); + } + + private static void updateColors() { + CPColor = GUIUtil.getUITheme().getCPColor(); + } + /** * Returns the Area object of the caret. The Area object is created only once, * after which new copies are cloned from it. @@ -53,6 +69,6 @@ public class CPCaret extends Caret { */ @Override protected Color getColor() { - return GUIUtil.getUITheme().getCPColor(); + return CPColor; } } diff --git a/swing/src/net/sf/openrocket/gui/figureelements/RocketInfo.java b/swing/src/net/sf/openrocket/gui/figureelements/RocketInfo.java index 1836ae644..83bc688f8 100644 --- a/swing/src/net/sf/openrocket/gui/figureelements/RocketInfo.java +++ b/swing/src/net/sf/openrocket/gui/figureelements/RocketInfo.java @@ -3,6 +3,7 @@ package net.sf.openrocket.gui.figureelements; import static net.sf.openrocket.util.Chars.ALPHA; import static net.sf.openrocket.util.Chars.THETA; +import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics2D; @@ -12,6 +13,7 @@ import java.awt.geom.Rectangle2D; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.gui.util.SwingPreferences; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.logging.Warning; import net.sf.openrocket.logging.WarningSet; import net.sf.openrocket.l10n.Translator; @@ -64,13 +66,35 @@ public class RocketInfo implements FigureElement { private Graphics2D g2 = null; private float line = 0; private float x1, x2, y1, y2; - + + private static Color textColor; + private static Color dimTextColor; + private static Color warningColor; + private static Color flightDataTextActiveColor; + private static Color flightDataTextInactiveColor; + + static { + initColors(); + } public RocketInfo(FlightConfiguration configuration) { this.configuration = configuration; this.stabilityUnits = UnitGroup.stabilityUnits(configuration); this.secondaryStabilityUnits = UnitGroup.secondaryStabilityUnits(configuration); } + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(RocketInfo::updateColors); + } + + private static void updateColors() { + textColor = GUIUtil.getUITheme().getTextColor(); + dimTextColor = GUIUtil.getUITheme().getDimTextColor(); + warningColor = GUIUtil.getUITheme().getWarningColor(); + flightDataTextActiveColor = GUIUtil.getUITheme().getFlightDataTextActiveColor(); + flightDataTextInactiveColor = GUIUtil.getUITheme().getFlightDataTextInactiveColor(); + } @Override @@ -176,7 +200,7 @@ public class RocketInfo implements FigureElement { GlyphVector massLineWithoutMotors = createText(massTextWithoutMotors); - g2.setColor(GUIUtil.getUITheme().getTextColor()); + g2.setColor(textColor); g2.drawGlyphVector(name, x1, y1); g2.drawGlyphVector(lengthLine, x1, y1+line); @@ -234,7 +258,7 @@ public class RocketInfo implements FigureElement { unitWidth = unitWidth + spaceWidth; stabUnitWidth = stabUnitWidth + spaceWidth; - g2.setColor(GUIUtil.getUITheme().getTextColor()); + g2.setColor(textColor); // Draw the stability, CG & CP values (and units) g2.drawGlyphVector(stabValue, (float)(x2-stabRect.getWidth()), y1); @@ -261,7 +285,7 @@ public class RocketInfo implements FigureElement { atPos = (float)(x2 - atTextRect.getWidth()); } - g2.setColor(GUIUtil.getUITheme().getDimTextColor()); + g2.setColor(dimTextColor); g2.drawGlyphVector(atText, atPos, y1 + 3*line); } @@ -411,7 +435,7 @@ public class RocketInfo implements FigureElement { float y = y2 - line * (texts.length-1); - g2.setColor(GUIUtil.getUITheme().getWarningColor()); + g2.setColor(warningColor); for (GlyphVector v: texts) { Rectangle2D rect = v.getVisualBounds(); @@ -427,7 +451,7 @@ public class RocketInfo implements FigureElement { if (calculatingData) { //// Calculating... GlyphVector calculating = createText(trans.get("RocketInfo.Calculating")); - g2.setColor(GUIUtil.getUITheme().getTextColor()); + g2.setColor(textColor); g2.drawGlyphVector(calculating, x1, (float)(y2-height)); } } @@ -485,17 +509,17 @@ public class RocketInfo implements FigureElement { width += 5; if (!calculatingData) - g2.setColor(GUIUtil.getUITheme().getFlightDataTextActiveColor()); + g2.setColor(flightDataTextActiveColor); else - g2.setColor(GUIUtil.getUITheme().getFlightDataTextInactiveColor()); + g2.setColor(flightDataTextInactiveColor); - g2.drawGlyphVector(apogee, (float)x1, (float)(y2-2*line)); - g2.drawGlyphVector(maxVelocity, (float)x1, (float)(y2-line)); - g2.drawGlyphVector(maxAcceleration, (float)x1, (float)(y2)); + g2.drawGlyphVector(apogee, x1, y2-2*line); + g2.drawGlyphVector(maxVelocity, x1, y2-line); + g2.drawGlyphVector(maxAcceleration, x1, y2); - g2.drawGlyphVector(apogeeValue, (float)(x1+width), (float)(y2-2*line)); - g2.drawGlyphVector(velocityValue, (float)(x1+width), (float)(y2-line)); - g2.drawGlyphVector(accelerationValue, (float)(x1+width), (float)(y2)); + g2.drawGlyphVector(apogeeValue, (float)(x1+width), y2-2*line); + g2.drawGlyphVector(velocityValue, (float)(x1+width), y2-line); + g2.drawGlyphVector(accelerationValue, (float)(x1+width), y2); return 3*line; } diff --git a/swing/src/net/sf/openrocket/gui/help/tours/SlideSetManager.java b/swing/src/net/sf/openrocket/gui/help/tours/SlideSetManager.java index 7828dfd8d..14e822b36 100644 --- a/swing/src/net/sf/openrocket/gui/help/tours/SlideSetManager.java +++ b/swing/src/net/sf/openrocket/gui/help/tours/SlideSetManager.java @@ -13,6 +13,7 @@ import java.util.Map; import javax.swing.text.html.StyleSheet; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.util.BugException; /** @@ -32,7 +33,12 @@ public class SlideSetManager { private final String baseDir; private final Map slideSets = new LinkedHashMap(); - + + private static Color textColor; + + static { + initColors(); + } /** * Sole constructor. @@ -45,6 +51,15 @@ public class SlideSetManager { } this.baseDir = baseDir; } + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(SlideSetManager::updateColors); + } + + private static void updateColors() { + textColor = GUIUtil.getUITheme().getTextColor(); + } /** @@ -132,7 +147,6 @@ public class SlideSetManager { try { StyleSheet ss = new StyleSheet(); - Color textColor = GUIUtil.getUITheme().getTextColor(); ss.addRule(String.format("p { color: rgb(%d, %d, %d, %d)", textColor.getRed(), textColor.getGreen(), textColor.getBlue(), textColor.getAlpha())); InputStreamReader reader = new InputStreamReader(in, "UTF-8"); diff --git a/swing/src/net/sf/openrocket/gui/help/tours/SlideShowComponent.java b/swing/src/net/sf/openrocket/gui/help/tours/SlideShowComponent.java index 561ee518b..a7272ec9e 100644 --- a/swing/src/net/sf/openrocket/gui/help/tours/SlideShowComponent.java +++ b/swing/src/net/sf/openrocket/gui/help/tours/SlideShowComponent.java @@ -7,12 +7,14 @@ import javax.swing.JEditorPane; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextPane; +import javax.swing.border.Border; import javax.swing.event.HyperlinkListener; import javax.swing.text.html.HTMLDocument; import javax.swing.text.html.StyleSheet; import net.sf.openrocket.gui.components.ImageDisplayComponent; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; /** * Component that displays a single slide, with the image on top and @@ -30,10 +32,16 @@ public class SlideShowComponent extends JSplitPane { private final ImageDisplayComponent imageDisplay; private final JEditorPane textPane; + private static Border border; + + static { + initColors(); + } + public SlideShowComponent() { super(VERTICAL_SPLIT); - + imageDisplay = new ImageDisplayComponent(); imageDisplay.setPreferredSize(new Dimension(WIDTH, HEIGHT_IMAGE)); this.setLeftComponent(imageDisplay); @@ -45,11 +53,20 @@ public class SlideShowComponent extends JSplitPane { textPane.setPreferredSize(new Dimension(WIDTH, HEIGHT_TEXT)); JScrollPane scrollPanel = new JScrollPane(textPane); - textPane.setBorder(GUIUtil.getUITheme().getBorder()); + textPane.setBorder(border); this.setRightComponent(scrollPanel); this.setResizeWeight(((double) HEIGHT_IMAGE) / (HEIGHT_IMAGE + HEIGHT_TEXT)); } + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(SlideShowComponent::updateColors); + } + + private static void updateColors() { + border = GUIUtil.getUITheme().getBorder(); + } diff --git a/swing/src/net/sf/openrocket/gui/main/DesignPanel.java b/swing/src/net/sf/openrocket/gui/main/DesignPanel.java index f4e7c274d..d0c460cde 100644 --- a/swing/src/net/sf/openrocket/gui/main/DesignPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/DesignPanel.java @@ -5,6 +5,7 @@ import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.configdialog.ComponentConfigDialog; import net.sf.openrocket.gui.main.componenttree.ComponentTree; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.gui.widgets.IconButton; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.rocketcomponent.AxialStage; @@ -24,6 +25,7 @@ import javax.swing.KeyStroke; import javax.swing.ScrollPaneConstants; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; +import javax.swing.border.Border; import javax.swing.border.TitledBorder; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; @@ -51,6 +53,12 @@ public class DesignPanel extends JSplitPane { private static final Translator trans = Application.getTranslator(); private final Component tree; + private static Border border; + + static { + initColors(); + } + public DesignPanel(final BasicFrame parent, final OpenRocketDocument document, final ComponentTree tree) { super(JSplitPane.HORIZONTAL_SPLIT, true); setResizeWeight(0.5); @@ -174,7 +182,7 @@ public class DesignPanel extends JSplitPane { // Place tree inside scroll pane JScrollPane scroll = new JScrollPane(tree); - tree.setBorder(GUIUtil.getUITheme().getBorder()); + tree.setBorder(border); panel.add(scroll, "spany, wmin 140px, grow, wrap"); @@ -230,6 +238,15 @@ public class DesignPanel extends JSplitPane { this.setRightComponent(panel); } + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(DesignPanel::updateColors); + } + + private static void updateColors() { + border = GUIUtil.getUITheme().getBorder(); + } + /** * Highlight all child components of a stage/rocket/podset when it is selected * @param tree the tree in which the component selection took place diff --git a/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeRenderer.java b/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeRenderer.java index 742a0c6d2..ec0f2f33c 100644 --- a/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeRenderer.java +++ b/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeRenderer.java @@ -1,12 +1,14 @@ package net.sf.openrocket.gui.main.componenttree; import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Component; import java.awt.FlowLayout; import java.awt.Font; import java.util.List; import javax.swing.BorderFactory; +import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; @@ -18,6 +20,7 @@ import javax.swing.tree.TreePath; import net.sf.openrocket.gui.main.ComponentIcons; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.rocketcomponent.MassComponent; import net.sf.openrocket.rocketcomponent.MassComponent.MassComponentType; @@ -31,6 +34,21 @@ import net.sf.openrocket.util.TextUtil; public class ComponentTreeRenderer extends DefaultTreeCellRenderer { private static final Translator trans = Application.getTranslator(); + + private static Color textSelectionBackgroundColor; + private static Color textSelectionForegroundColor; + private static Color componentTreeBackgroundColor; + private static Color componentTreeForegroundColor; + private static Icon massOverrideSubcomponentIcon; + private static Icon massOverrideIcon; + private static Icon CGOverrideSubcomponentIcon; + private static Icon CGOverrideIcon; + private static Icon CDOverrideSubcomponentIcon; + private static Icon CDOverrideIcon; + + static { + initColors(); + } @Override public Component getTreeCellRendererComponent(JTree tree, Object value, @@ -81,12 +99,12 @@ public class ComponentTreeRenderer extends DefaultTreeCellRenderer { // Set the background and foreground colors of the text JLabel if (sel) { textLabel.setOpaque(true); - textLabel.setBackground(GUIUtil.getUITheme().getTextSelectionBackgroundColor()); - textLabel.setForeground(GUIUtil.getUITheme().getTextSelectionForegroundColor()); + textLabel.setBackground(textSelectionBackgroundColor); + textLabel.setForeground(textSelectionForegroundColor); } else { textLabel.setOpaque(true); // Set this to true to allow the background color to be visible - textLabel.setBackground(GUIUtil.getUITheme().getComponentTreeBackgroundColor()); - textLabel.setForeground(GUIUtil.getUITheme().getComponentTreeForegroundColor()); + textLabel.setBackground(componentTreeBackgroundColor); + textLabel.setForeground(componentTreeForegroundColor); } applyToolTipText(components, c, panel); @@ -99,23 +117,23 @@ public class ComponentTreeRenderer extends DefaultTreeCellRenderer { c.isCDOverridden() || c.getCDOverriddenBy() != null) { JPanel p = new JPanel(); p.setLayout(new FlowLayout(FlowLayout.LEFT, 1, 1)); - p.setBackground(GUIUtil.getUITheme().getComponentTreeBackgroundColor()); - p.setForeground(GUIUtil.getUITheme().getComponentTreeForegroundColor()); + p.setBackground(componentTreeBackgroundColor); + p.setForeground(componentTreeForegroundColor); p.add(comp/* , BorderLayout.WEST */); if (c.getMassOverriddenBy() != null) { - p.add(new JLabel(GUIUtil.getUITheme().getMassOverrideSubcomponentIcon())); + p.add(new JLabel(massOverrideSubcomponentIcon)); } else if (c.isMassOverridden()) { - p.add(new JLabel(GUIUtil.getUITheme().getMassOverrideIcon())); + p.add(new JLabel(massOverrideIcon)); } if (c.getCGOverriddenBy() != null) { - p.add(new JLabel(GUIUtil.getUITheme().getCGOverrideSubcomponentIcon())); + p.add(new JLabel(CGOverrideSubcomponentIcon)); } else if (c.isCGOverridden()) { - p.add(new JLabel(GUIUtil.getUITheme().getCGOverrideIcon())); + p.add(new JLabel(CGOverrideIcon)); } if (c.getCDOverriddenBy() != null) { - p.add(new JLabel(GUIUtil.getUITheme().getCDOverrideSubcomponentIcon())); + p.add(new JLabel(CDOverrideSubcomponentIcon)); } else if (c.isCDOverridden()) { - p.add(new JLabel(GUIUtil.getUITheme().getCDOverrideIcon())); + p.add(new JLabel(CDOverrideIcon)); } // Make sure the tooltip also works on the override icons @@ -131,6 +149,25 @@ public class ComponentTreeRenderer extends DefaultTreeCellRenderer { return comp; } + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(ComponentTreeRenderer::updateColors); + } + + private static void updateColors() { + textSelectionBackgroundColor = GUIUtil.getUITheme().getTextSelectionBackgroundColor(); + textSelectionForegroundColor = GUIUtil.getUITheme().getTextSelectionForegroundColor(); + componentTreeBackgroundColor = GUIUtil.getUITheme().getComponentTreeBackgroundColor(); + componentTreeForegroundColor = GUIUtil.getUITheme().getComponentTreeForegroundColor(); + + massOverrideSubcomponentIcon = GUIUtil.getUITheme().getMassOverrideSubcomponentIcon(); + massOverrideIcon = GUIUtil.getUITheme().getMassOverrideIcon(); + CGOverrideSubcomponentIcon = GUIUtil.getUITheme().getCGOverrideSubcomponentIcon(); + CGOverrideIcon = GUIUtil.getUITheme().getCGOverrideIcon(); + CDOverrideSubcomponentIcon = GUIUtil.getUITheme().getCDOverrideSubcomponentIcon(); + CDOverrideIcon = GUIUtil.getUITheme().getCDOverrideIcon(); + } + private void applyToolTipText(List components, RocketComponent c, JComponent comp) { String tooltipText; if (components != null && components.size() > 1 && components.contains(c)) { diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurablePanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurablePanel.java index ee6cb3b80..47f3249cb 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurablePanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurablePanel.java @@ -25,6 +25,7 @@ import javax.swing.table.DefaultTableCellRenderer; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.main.FlightConfigurationPanel; import net.sf.openrocket.gui.util.SwingPreferences; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.util.ArrayList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,6 +56,13 @@ public abstract class FlightConfigurablePanel listeners = new LinkedList(); + + private static Color backgroundColor; + + static { + initColors(); + } public AbstractScaleFigure() { @@ -70,10 +77,19 @@ public abstract class AbstractScaleFigure extends JPanel { this.setPreferredSize(new Dimension(100,100)); setSize(100,100); - setBackground(GUIUtil.getUITheme().getBackgroundColor()); + setBackground(backgroundColor); setOpaque(true); } + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(AbstractScaleFigure::updateColors); + } + + private static void updateColors() { + backgroundColor = GUIUtil.getUITheme().getBackgroundColor(); + } + public int getBorderHeight(){ return borderThickness_px.height; } public int getBorderWidth(){ return borderThickness_px.width; } diff --git a/swing/src/net/sf/openrocket/gui/scalefigure/FinPointFigure.java b/swing/src/net/sf/openrocket/gui/scalefigure/FinPointFigure.java index a8688bec7..dc0ed7c77 100644 --- a/swing/src/net/sf/openrocket/gui/scalefigure/FinPointFigure.java +++ b/swing/src/net/sf/openrocket/gui/scalefigure/FinPointFigure.java @@ -16,6 +16,7 @@ import java.util.LinkedList; import java.util.List; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.rocketcomponent.FreeformFinSet; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.SymmetricComponent; @@ -58,23 +59,33 @@ public class FinPointFigure extends AbstractScaleFigure { private Rectangle2D.Double[] finPointHandles = null; private int selectedIndex = -1; + private static Color backgroundColor; private static Color finPointBodyLineColor; private static Color finPointGridMajorLineColor; private static Color finPointGridMinorLineColor; private static Color finPointPointColor; private static Color finPointSelectedPointColor; + + static { + initColors(); + } public FinPointFigure(FreeformFinSet finset) { this.finset = finset; - setBackground(GUIUtil.getUITheme().getBackgroundColor()); + setBackground(backgroundColor); setOpaque(true); - updateColors(); updateFigure(); } + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(FinPointFigure::updateColors); + } + private static void updateColors() { + backgroundColor = GUIUtil.getUITheme().getBackgroundColor(); finPointBodyLineColor = GUIUtil.getUITheme().getFinPointBodyLineColor(); finPointGridMajorLineColor = GUIUtil.getUITheme().getFinPointGridMajorLineColor(); finPointGridMinorLineColor = GUIUtil.getUITheme().getFinPointGridMinorLineColor(); diff --git a/swing/src/net/sf/openrocket/gui/scalefigure/RocketFigure.java b/swing/src/net/sf/openrocket/gui/scalefigure/RocketFigure.java index 22f4d8d67..50dd4d1ae 100644 --- a/swing/src/net/sf/openrocket/gui/scalefigure/RocketFigure.java +++ b/swing/src/net/sf/openrocket/gui/scalefigure/RocketFigure.java @@ -18,6 +18,7 @@ import java.util.*; import java.util.Map.Entry; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.rocketcomponent.AxialStage; import net.sf.openrocket.rocketcomponent.ParallelStage; import net.sf.openrocket.rocketcomponent.PodSet; @@ -93,6 +94,13 @@ public class RocketFigure extends AbstractScaleFigure { private final ArrayList relativeExtra = new ArrayList(); private final ArrayList absoluteExtra = new ArrayList(); + + private static Color motorFillColor; + private static Color motorBorderColor; + + static { + initColors(); + } /** @@ -108,6 +116,16 @@ public class RocketFigure extends AbstractScaleFigure { updateFigure(); } + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(RocketFigure::updateColors); + } + + private static void updateColors() { + motorFillColor = GUIUtil.getUITheme().getMotorFillColor(); + motorBorderColor = GUIUtil.getUITheme().getMotorBorderColor(); + } + public Point getAutoZoomPoint(){ return new Point( Math.max(0, originLocation_px.x - borderThickness_px.width), Math.max(0, - borderThickness_px.height)); @@ -291,8 +309,8 @@ public class RocketFigure extends AbstractScaleFigure { RenderingHints.VALUE_STROKE_NORMALIZE); // Draw motors - Color fillColor = GUIUtil.getUITheme().getMotorFillColor(); - Color borderColor = GUIUtil.getUITheme().getMotorBorderColor(); + Color fillColor = motorFillColor; + Color borderColor = motorBorderColor; FlightConfiguration config = rocket.getSelectedConfiguration(); for (MotorConfiguration curInstance : config.getActiveMotors()) { diff --git a/swing/src/net/sf/openrocket/gui/scalefigure/ScaleScrollPane.java b/swing/src/net/sf/openrocket/gui/scalefigure/ScaleScrollPane.java index e30bfe840..bb33d649b 100644 --- a/swing/src/net/sf/openrocket/gui/scalefigure/ScaleScrollPane.java +++ b/swing/src/net/sf/openrocket/gui/scalefigure/ScaleScrollPane.java @@ -26,6 +26,7 @@ import javax.swing.event.ChangeListener; import net.sf.openrocket.gui.adaptors.DoubleModel; import net.sf.openrocket.gui.components.UnitSelector; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.unit.Tick; import net.sf.openrocket.unit.Unit; import net.sf.openrocket.unit.UnitGroup; @@ -72,6 +73,12 @@ public class ScaleScrollPane extends JScrollPane private Point2D.Double viewCenter_frac = new Point2D.Double(0.5f, 0.5f); + private static Color textColor; + + static { + initColors(); + } + /** * Create a scale scroll pane. * @@ -83,7 +90,7 @@ public class ScaleScrollPane extends JScrollPane if (!(component instanceof AbstractScaleFigure)) { throw new IllegalArgumentException("component must implement ScaleFigure"); } - + this.component = component; this.figure = (AbstractScaleFigure) component; @@ -127,6 +134,15 @@ public class ScaleScrollPane extends JScrollPane viewport.addMouseMotionListener(this); viewport.addComponentListener(this); } + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(ScaleScrollPane::updateColors); + } + + private static void updateColors() { + textColor = GUIUtil.getUITheme().getTextColor(); + } public AbstractScaleFigure getFigure() { return figure; @@ -399,7 +415,7 @@ public class ScaleScrollPane extends JScrollPane } // Set color & hints - g2.setColor(GUIUtil.getUITheme().getTextColor()); + g2.setColor(textColor); g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); g2.setRenderingHint(RenderingHints.KEY_RENDERING, diff --git a/swing/src/net/sf/openrocket/gui/simulation/SimulationOptionsPanel.java b/swing/src/net/sf/openrocket/gui/simulation/SimulationOptionsPanel.java index 82e49ff9a..653d1d80d 100644 --- a/swing/src/net/sf/openrocket/gui/simulation/SimulationOptionsPanel.java +++ b/swing/src/net/sf/openrocket/gui/simulation/SimulationOptionsPanel.java @@ -22,6 +22,7 @@ import javax.swing.JScrollPane; import javax.swing.JSpinner; import javax.swing.MenuElement; import javax.swing.SwingUtilities; +import javax.swing.border.Border; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; @@ -36,6 +37,7 @@ import net.sf.openrocket.gui.components.StyledLabel.Style; import net.sf.openrocket.gui.components.UnitSelector; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.gui.util.Icons; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.simulation.RK4SimulationStepper; import net.sf.openrocket.simulation.SimulationOptions; @@ -62,12 +64,19 @@ class SimulationOptionsPanel extends JPanel { private JPanel currentExtensions; final JPopupMenu extensionMenu; JMenu extensionMenuCopyExtension; + + private static Color textColor; + private static Border border; + + static { + initColors(); + } SimulationOptionsPanel(OpenRocketDocument document, final Simulation simulation) { super(new MigLayout("fill")); this.document = document; this.simulation = simulation; - + final SimulationOptions conditions = simulation.getOptions(); JPanel sub, subsub; @@ -207,14 +216,24 @@ class SimulationOptionsPanel extends JPanel { currentExtensions = new JPanel(new MigLayout("fillx, gap 0 0, ins 0")); JScrollPane scroll = new JScrollPane(currentExtensions); - currentExtensions.setBorder(GUIUtil.getUITheme().getBorder()); - scroll.setForeground(GUIUtil.getUITheme().getTextColor()); + currentExtensions.setBorder(border); + scroll.setForeground(textColor); // &#$%! scroll pane will not honor "growy"... sub.add(scroll, "growx, growy, h 100%"); updateCurrentExtensions(); } + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(SimulationOptionsPanel::updateColors); + } + + private static void updateColors() { + textColor = GUIUtil.getUITheme().getTextColor(); + border = GUIUtil.getUITheme().getBorder(); + } private JPopupMenu getExtensionMenu() { Set extensions = Application.getInjector().getInstance(new Key>() { diff --git a/swing/src/net/sf/openrocket/gui/simulation/SimulationPlotPanel.java b/swing/src/net/sf/openrocket/gui/simulation/SimulationPlotPanel.java index 54d773456..11fcbeb32 100644 --- a/swing/src/net/sf/openrocket/gui/simulation/SimulationPlotPanel.java +++ b/swing/src/net/sf/openrocket/gui/simulation/SimulationPlotPanel.java @@ -12,7 +12,6 @@ import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JComboBox; -import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; @@ -20,6 +19,7 @@ import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTable; +import javax.swing.border.Border; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; @@ -33,6 +33,7 @@ import net.sf.openrocket.gui.plot.SimulationPlotDialog; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.gui.util.Icons; import net.sf.openrocket.gui.util.SwingPreferences; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.simulation.FlightDataBranch; import net.sf.openrocket.simulation.FlightDataType; @@ -40,7 +41,6 @@ import net.sf.openrocket.simulation.FlightEvent; import net.sf.openrocket.startup.Application; import net.sf.openrocket.startup.Preferences; import net.sf.openrocket.unit.Unit; -import net.sf.openrocket.util.Color; import net.sf.openrocket.util.Utils; import net.sf.openrocket.gui.widgets.SelectColorButton; @@ -107,11 +107,18 @@ public class SimulationPlotPanel extends JPanel { private int modifying = 0; - private DescriptionArea simPlotPanelDesc; + private DescriptionArea simPlotPanelDesc; + + private static java.awt.Color darkWarningColor; + private static Border border; + + static { + initColors(); + } public SimulationPlotPanel(final Simulation simulation) { super(new MigLayout("fill")); - + this.simulation = simulation; if (simulation.getSimulatedData() == null || simulation.getSimulatedData().getBranchCount() == 0) { @@ -205,7 +212,7 @@ public class SimulationPlotPanel extends JPanel { //// The data will be plotted in time order even if the X axis type is not time. simPlotPanelDesc = new DescriptionArea("", 2, -2f, false); simPlotPanelDesc.setVisible(false); - simPlotPanelDesc.setForeground(GUIUtil.getUITheme().getDarkWarningColor()); + simPlotPanelDesc.setForeground(darkWarningColor); simPlotPanelDesc.setViewportBorder(BorderFactory.createEmptyBorder()); this.add(simPlotPanelDesc, "width 1px, growx 1, wrap unrel"); @@ -220,7 +227,7 @@ public class SimulationPlotPanel extends JPanel { typeSelectorPanel = new JPanel(new MigLayout("gapy rel")); JScrollPane scroll = new JScrollPane(typeSelectorPanel); - scroll.setBorder(GUIUtil.getUITheme().getBorder()); + scroll.setBorder(border); this.add(scroll, "spany 3, height 10px, wmin 400lp, grow 100, gapright para"); @@ -379,6 +386,16 @@ public class SimulationPlotPanel extends JPanel { updatePlots(); } + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(SimulationPlotPanel::updateColors); + } + + private static void updateColors() { + darkWarningColor = GUIUtil.getUITheme().getDarkWarningColor(); + border = GUIUtil.getUITheme().getBorder(); + } + private void updateStyleEventWidgets(JLabel styleEventMarker, JRadioButton radioVerticalMarker, JRadioButton radioIcon) { if (modifying > 0) return; diff --git a/swing/src/net/sf/openrocket/gui/util/BetterListCellRenderer.java b/swing/src/net/sf/openrocket/gui/util/BetterListCellRenderer.java index a91da30c5..dfbb02be0 100644 --- a/swing/src/net/sf/openrocket/gui/util/BetterListCellRenderer.java +++ b/swing/src/net/sf/openrocket/gui/util/BetterListCellRenderer.java @@ -4,6 +4,7 @@ package net.sf.openrocket.gui.util; import javax.swing.DefaultListCellRenderer; import javax.swing.JLabel; import javax.swing.JList; +import java.awt.Color; import java.awt.Component; /** @@ -12,6 +13,14 @@ import java.awt.Component; * @author Sibo Van Gool */ public class BetterListCellRenderer extends DefaultListCellRenderer { + private static Color rowBackgroundDarkerColor; + private static Color rowBackgroundLighterColor; + private static Color textSelectionForegroundColor; + private static Color textColor; + + static { + initColors(); + } @Override public Component getListCellRendererComponent(JList list, Object value, int index, @@ -21,17 +30,29 @@ public class BetterListCellRenderer extends DefaultListCellRenderer { // Alternating row colors if (!isSelected) { if (index % 2 == 0) { - label.setBackground(GUIUtil.getUITheme().getRowBackgroundDarkerColor()); + label.setBackground(rowBackgroundDarkerColor); } else { - label.setBackground(GUIUtil.getUITheme().getRowBackgroundLighterColor()); + label.setBackground(rowBackgroundLighterColor); } } // Text color if (isSelected) { - label.setForeground(GUIUtil.getUITheme().getTextSelectionForegroundColor()); + label.setForeground(textSelectionForegroundColor); } else { - label.setForeground(GUIUtil.getUITheme().getTextColor()); + label.setForeground(textColor); } return label; } + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(BetterListCellRenderer::updateColors); + } + + private static void updateColors() { + rowBackgroundDarkerColor = GUIUtil.getUITheme().getRowBackgroundDarkerColor(); + rowBackgroundLighterColor = GUIUtil.getUITheme().getRowBackgroundLighterColor(); + textSelectionForegroundColor = GUIUtil.getUITheme().getTextSelectionForegroundColor(); + textColor = GUIUtil.getUITheme().getTextColor(); + } } diff --git a/swing/src/net/sf/openrocket/gui/util/UITheme.java b/swing/src/net/sf/openrocket/gui/util/UITheme.java index 612792f5f..7af6a200e 100644 --- a/swing/src/net/sf/openrocket/gui/util/UITheme.java +++ b/swing/src/net/sf/openrocket/gui/util/UITheme.java @@ -18,8 +18,10 @@ import java.awt.Color; import java.awt.Font; import java.io.IOException; import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; @@ -83,6 +85,27 @@ public class UITheme { Border getBorder(); void formatScriptTextArea(RSyntaxTextArea textArea); + + // Static list of listeners + static List themeChangeListeners = new ArrayList<>(); + + // Static method to add a listener + static void addUIThemeChangeListener(Runnable listener) { + // TODO: implement this once you have implemented invalidation for each listener so that we don't get memory leaks + //themeChangeListeners.add(listener); + } + + // Static method to remove a listener + static void removeUIThemeChangeListener(Runnable listener) { + themeChangeListeners.remove(listener); + } + + // Static method to notify all listeners + static void notifyUIThemeChangeListeners() { + for (Runnable listener : themeChangeListeners) { + listener.run(); + } + } } public static boolean isLightTheme(Theme theme) { @@ -115,6 +138,9 @@ public class UITheme { GUIUtil.setBestLAF(); setGlobalFontSize(prefs.getUIFontSize()); + + // After applying the theme settings, notify listeners + Theme.notifyUIThemeChangeListeners(); } @Override @@ -338,6 +364,9 @@ public class UITheme { LafManager.install(new DarculaTheme()); setGlobalFontSize(prefs.getUIFontSize()); + + // After applying the theme settings, notify listeners + Theme.notifyUIThemeChangeListeners(); } @Override diff --git a/swing/src/net/sf/openrocket/simulation/extension/impl/JavaCodeConfigurator.java b/swing/src/net/sf/openrocket/simulation/extension/impl/JavaCodeConfigurator.java index eea237e11..6ce79068b 100644 --- a/swing/src/net/sf/openrocket/simulation/extension/impl/JavaCodeConfigurator.java +++ b/swing/src/net/sf/openrocket/simulation/extension/impl/JavaCodeConfigurator.java @@ -10,11 +10,14 @@ import javax.swing.event.DocumentListener; import net.sf.openrocket.document.Simulation; import net.sf.openrocket.gui.components.StyledLabel; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.plugin.Plugin; import net.sf.openrocket.simulation.extension.AbstractSwingSimulationExtensionConfigurator; import net.sf.openrocket.startup.Application; +import java.awt.Color; + @Plugin public class JavaCodeConfigurator extends AbstractSwingSimulationExtensionConfigurator { private JavaCode extension; @@ -23,9 +26,24 @@ public class JavaCodeConfigurator extends AbstractSwingSimulationExtensionConfig private static final Translator trans = Application.getTranslator(); + private static Color darkWarningColor; + + static { + initColors(); + } + public JavaCodeConfigurator() { super(JavaCode.class); } + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(JavaCodeConfigurator::updateColors); + } + + private static void updateColors() { + darkWarningColor = GUIUtil.getUITheme().getDarkWarningColor(); + } @Override protected JComponent getConfigurationComponent(final JavaCode extension, Simulation simulation, JPanel panel) { @@ -35,7 +53,7 @@ public class JavaCodeConfigurator extends AbstractSwingSimulationExtensionConfig classNameField = new JTextField(extension.getClassName()); panel.add(classNameField, "growx, wrap"); this.errorMsg = new StyledLabel(); - errorMsg.setFontColor(GUIUtil.getUITheme().getDarkWarningColor()); + errorMsg.setFontColor(darkWarningColor); errorMsg.setVisible(false); panel.add(errorMsg, "growx, wrap"); From 08695a8ffb90bdf041dde02ecc9aed0d5e7f5e12 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Fri, 22 Sep 2023 18:29:06 +0200 Subject: [PATCH 17/17] Add UI color for multi-comp edit color --- .../configdialog/RocketComponentConfig.java | 4 +++- .../gui/simulation/SimulationEditDialog.java | 18 +++++++++++++++++- .../net/sf/openrocket/gui/util/UITheme.java | 16 ++++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java index a62a0e969..0239958b8 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java @@ -100,6 +100,7 @@ public class RocketComponentConfig extends JPanel { private boolean allMassive; // Checks whether all listener components, and this component, are massive private static Color darkWarningColor; + private static Color multiCompEditColor; private static Border border; static { @@ -203,6 +204,7 @@ public class RocketComponentConfig extends JPanel { private static void updateColors() { darkWarningColor = GUIUtil.getUITheme().getDarkWarningColor(); + multiCompEditColor = GUIUtil.getUITheme().getMultiCompEditColor(); border = GUIUtil.getUITheme().getBorder(); } @@ -270,7 +272,7 @@ public class RocketComponentConfig extends JPanel { //// Multi-comp edit label multiCompEditLabel = new StyledLabel(" ", -1, Style.BOLD); - multiCompEditLabel.setFontColor(new Color(170, 0, 100)); + multiCompEditLabel.setFontColor(multiCompEditColor); buttonPanel.add(multiCompEditLabel, "split 2"); //// Mass: diff --git a/swing/src/net/sf/openrocket/gui/simulation/SimulationEditDialog.java b/swing/src/net/sf/openrocket/gui/simulation/SimulationEditDialog.java index 096bfc576..51fd38235 100644 --- a/swing/src/net/sf/openrocket/gui/simulation/SimulationEditDialog.java +++ b/swing/src/net/sf/openrocket/gui/simulation/SimulationEditDialog.java @@ -33,6 +33,7 @@ import net.sf.openrocket.document.events.DocumentChangeEvent; import net.sf.openrocket.gui.components.ConfigurationComboBox; import net.sf.openrocket.gui.components.StyledLabel; import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.UITheme; import net.sf.openrocket.gui.widgets.SelectColorButton; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.rocketcomponent.FlightConfiguration; @@ -61,6 +62,12 @@ public class SimulationEditDialog extends JDialog { private final boolean initialIsSaved; // Whether the document was saved before the dialog was opened private boolean isModified = false; // Whether the simulation has been modified private final boolean isNewSimulation; // Whether you are editing a new simulation, or an existing one + + private static Color multiCompEditColor; + + static { + initColors(); + } public SimulationEditDialog(Window parent, final OpenRocketDocument document, boolean isNewSimulation, Simulation... sims) { //// Edit simulation @@ -102,6 +109,15 @@ public class SimulationEditDialog extends JDialog { GUIUtil.setDisposableDialogOptions(this, null); } + + private static void initColors() { + updateColors(); + UITheme.Theme.addUIThemeChangeListener(SimulationEditDialog::updateColors); + } + + private static void updateColors() { + multiCompEditColor = GUIUtil.getUITheme().getMultiCompEditColor(); + } private boolean isSingleEdit() { return simulationList.length == 1; @@ -247,7 +263,7 @@ public class SimulationEditDialog extends JDialog { //// Multi-simulation edit if (simulationList.length > 1) { StyledLabel multiSimEditLabel = new StyledLabel("", -1, StyledLabel.Style.BOLD); - multiSimEditLabel.setFontColor(new Color(170, 0, 100)); + multiSimEditLabel.setFontColor(multiCompEditColor); multiSimEditLabel.setText(trans.get("simedtdlg.title.MultiSimEdit")); StringBuilder components = new StringBuilder(trans.get("simedtdlg.title.MultiSimEdit.ttip")); for (int i = 0; i < simulationList.length; i++) { diff --git a/swing/src/net/sf/openrocket/gui/util/UITheme.java b/swing/src/net/sf/openrocket/gui/util/UITheme.java index 7af6a200e..59dcae0c4 100644 --- a/swing/src/net/sf/openrocket/gui/util/UITheme.java +++ b/swing/src/net/sf/openrocket/gui/util/UITheme.java @@ -45,6 +45,7 @@ public class UITheme { Color getRowBackgroundDarkerColor(); Color getFlightDataTextActiveColor(); Color getFlightDataTextInactiveColor(); + Color getMultiCompEditColor(); // Component colors String getDefaultBodyComponentColor(); @@ -208,6 +209,11 @@ public class UITheme { return new Color(0,0,127,127); } + @Override + public Color getMultiCompEditColor() { + return new Color(170, 0, 100); + } + @Override public String getDefaultBodyComponentColor() { return "0,0,240"; @@ -434,6 +440,11 @@ public class UITheme { return new Color(128, 166, 230, 127); } + @Override + public Color getMultiCompEditColor() { + return new Color(222, 146, 176); + } + @Override public String getDefaultBodyComponentColor() { return "150,162,255"; @@ -668,6 +679,11 @@ public class UITheme { return getCurrentTheme().getFlightDataTextInactiveColor(); } + @Override + public Color getMultiCompEditColor() { + return getCurrentTheme().getMultiCompEditColor(); + } + @Override public String getDefaultBodyComponentColor() { return getCurrentTheme().getDefaultBodyComponentColor();