Merge pull request #1858 from SiboVG/issue-1768
[#1768] Add welcome dialog
This commit is contained in:
commit
cb4fda112d
136
ReleaseNotes.md
136
ReleaseNotes.md
@ -1,6 +1,20 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
!! NOTE: This HTML formatting is required for the welcome info dialog.
|
||||||
|
Always encapsulate each release with a <div> tag and the correct id.
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div>
|
||||||
|
|
||||||
Release Notes
|
Release Notes
|
||||||
=============
|
=============
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="22.02.beta.05">
|
||||||
|
|
||||||
OpenRocket 22.02.beta.05 (2022-09-28)
|
OpenRocket 22.02.beta.05 (2022-09-28)
|
||||||
------------------------
|
------------------------
|
||||||
(through PR1688)
|
(through PR1688)
|
||||||
@ -66,6 +80,10 @@ OpenRocket 22.02.beta.05 (2022-09-28)
|
|||||||
* Fixed overlapping labels in motor selection diameter filter slider (fixes #1643)
|
* Fixed overlapping labels in motor selection diameter filter slider (fixes #1643)
|
||||||
* More Russian translation updates
|
* More Russian translation updates
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="22.02.beta.04">
|
||||||
|
|
||||||
OpenRocket 22.02.beta.04 (2022-06-17)
|
OpenRocket 22.02.beta.04 (2022-06-17)
|
||||||
------------------------
|
------------------------
|
||||||
(through PR1456)
|
(through PR1456)
|
||||||
@ -102,6 +120,9 @@ However, the JAR file will still allow Java 11 *or* 17, so if you want to keep e
|
|||||||
* Updated guided tours
|
* Updated guided tours
|
||||||
* Improved Russian translation
|
* Improved Russian translation
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="22.02.beta.03">
|
||||||
|
|
||||||
OpenRocket 22.02.beta.03 (2022-05-18)
|
OpenRocket 22.02.beta.03 (2022-05-18)
|
||||||
------------------------
|
------------------------
|
||||||
@ -131,6 +152,10 @@ OpenRocket 22.02.beta.03 (2022-05-18)
|
|||||||
* Improved time step selection for descent
|
* Improved time step selection for descent
|
||||||
* Java 17 is now included in the packaged installers and supported by the JAR file.
|
* Java 17 is now included in the packaged installers and supported by the JAR file.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="22.02.beta.02">
|
||||||
|
|
||||||
OpenRocket 22.02.beta.02 (2022-03-26)
|
OpenRocket 22.02.beta.02 (2022-03-26)
|
||||||
------------------------
|
------------------------
|
||||||
(through PR1261)
|
(through PR1261)
|
||||||
@ -161,6 +186,9 @@ NOTE: Tube fin simulation is currently broken, and will be fixed in a future bet
|
|||||||
* Set default color for all components to #BBBBBB, with Shine=30 (closes issue 1192)
|
* Set default color for all components to #BBBBBB, with Shine=30 (closes issue 1192)
|
||||||
* Update Mac installer style to more standard "drag app to Applications folder"
|
* Update Mac installer style to more standard "drag app to Applications folder"
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="22.02.beta.01">
|
||||||
|
|
||||||
OpenRocket 22.02.beta.01 (2022-02-25)
|
OpenRocket 22.02.beta.01 (2022-02-25)
|
||||||
------------------------
|
------------------------
|
||||||
@ -239,6 +267,10 @@ OpenRocket 22.02.beta.01 (2022-02-25)
|
|||||||
|
|
||||||
..._plus many, many additional bug fixes and refinements_
|
..._plus many, many additional bug fixes and refinements_
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="15.03">
|
||||||
|
|
||||||
OpenRocket 15.03 (2015-03-28)
|
OpenRocket 15.03 (2015-03-28)
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
@ -258,6 +290,10 @@ Bug Fixes
|
|||||||
|
|
||||||
* Always use the correct filename extension when saving
|
* Always use the correct filename extension when saving
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="14.11">
|
||||||
|
|
||||||
OpenRocket 14.11 (2014-11-02)
|
OpenRocket 14.11 (2014-11-02)
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
@ -269,6 +305,10 @@ Bug Fixes
|
|||||||
|
|
||||||
* Fixed a couple of bugs.
|
* Fixed a couple of bugs.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="14.06">
|
||||||
|
|
||||||
OpenRocket 14.06 (2014-06-25)
|
OpenRocket 14.06 (2014-06-25)
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
@ -282,6 +322,10 @@ Bug Fixes
|
|||||||
|
|
||||||
* Fixed annoying IndexOutOfBounds bug in tables.
|
* Fixed annoying IndexOutOfBounds bug in tables.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="14.05">
|
||||||
|
|
||||||
OpenRocket 14.05 (2014-05-21)
|
OpenRocket 14.05 (2014-05-21)
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
@ -296,6 +340,10 @@ Bug Fixes
|
|||||||
* Updated thrustcurves
|
* Updated thrustcurves
|
||||||
* Updated 3d libraries to 2.1.5
|
* Updated 3d libraries to 2.1.5
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="14.03">
|
||||||
|
|
||||||
OpenRocket 14.03 (2014-03-20)
|
OpenRocket 14.03 (2014-03-20)
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
@ -308,6 +356,10 @@ Bug Fixes
|
|||||||
* Fixes to the flight configuration tab and motor selection dialog
|
* Fixes to the flight configuration tab and motor selection dialog
|
||||||
* Updated thrustcurves
|
* Updated thrustcurves
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="13.11.2">
|
||||||
|
|
||||||
OpenRocket 13.11.2 (2014-01-01)
|
OpenRocket 13.11.2 (2014-01-01)
|
||||||
-------------------------------
|
-------------------------------
|
||||||
|
|
||||||
@ -318,6 +370,10 @@ Bug Fixes
|
|||||||
* Fix couple of layout issues
|
* Fix couple of layout issues
|
||||||
* Updated Spanish, French and Chinese translations
|
* Updated Spanish, French and Chinese translations
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="13.11.1">
|
||||||
|
|
||||||
OpenRocket 13.11.1 (2013-11-15)
|
OpenRocket 13.11.1 (2013-11-15)
|
||||||
-------------------------------
|
-------------------------------
|
||||||
|
|
||||||
@ -329,6 +385,10 @@ Bug Fixes
|
|||||||
* Fixed various exceptions in flight configuration tables due to column reordering
|
* Fixed various exceptions in flight configuration tables due to column reordering
|
||||||
* Fixed NPE when deleting a configuration
|
* Fixed NPE when deleting a configuration
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="13.11">
|
||||||
|
|
||||||
OpenRocket 13.11 (2013-11-08)
|
OpenRocket 13.11 (2013-11-08)
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
@ -343,6 +403,10 @@ Bug Fixes
|
|||||||
* Updated jogl to correct 3d problems on various platforms
|
* Updated jogl to correct 3d problems on various platforms
|
||||||
* Fixed NPE introduced by changes in Java 1.7.0_45-b18
|
* Fixed NPE introduced by changes in Java 1.7.0_45-b18
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="13.09.1">
|
||||||
|
|
||||||
OpenRocket 13.09.1 (2013-10-05)
|
OpenRocket 13.09.1 (2013-10-05)
|
||||||
-------------------------------
|
-------------------------------
|
||||||
|
|
||||||
@ -350,6 +414,9 @@ This release contains a number of bug fixes, updated 3D JOGL
|
|||||||
libraries. Added preliminary thrustcurves for Aerotech C3 and D2 18mm
|
libraries. Added preliminary thrustcurves for Aerotech C3 and D2 18mm
|
||||||
reloads.
|
reloads.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="13.09">
|
||||||
|
|
||||||
OpenRocket 13.09 (2013-09-08)
|
OpenRocket 13.09 (2013-09-08)
|
||||||
-----------------------------
|
-----------------------------
|
||||||
@ -357,6 +424,9 @@ OpenRocket 13.09 (2013-09-08)
|
|||||||
This release contains a number of bug fixes, updated 3D JOGL
|
This release contains a number of bug fixes, updated 3D JOGL
|
||||||
libraries, and separates simulation edit and plot dialogs.
|
libraries, and separates simulation edit and plot dialogs.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="13.05">
|
||||||
|
|
||||||
OpenRocket 13.05 (2013-05-04)
|
OpenRocket 13.05 (2013-05-04)
|
||||||
-----------------------------
|
-----------------------------
|
||||||
@ -384,6 +454,9 @@ New Features
|
|||||||
scroll with mouse wheel. If the alt key is used with either of these, only the domain is zoomed. Richard
|
scroll with mouse wheel. If the alt key is used with either of these, only the domain is zoomed. Richard
|
||||||
contributed a more logical mouse controlled zoom - right click and drag will zoom (either domain, range or both).
|
contributed a more logical mouse controlled zoom - right click and drag will zoom (either domain, range or both).
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="12.09.1">
|
||||||
|
|
||||||
OpenRocket 12.09.1 (2012-06-28)
|
OpenRocket 12.09.1 (2012-06-28)
|
||||||
-------------------------------
|
-------------------------------
|
||||||
@ -392,6 +465,9 @@ Bug-fix release for 12.09, fixing numerous bugs. Only new feature is
|
|||||||
the possiblity to automatically open the latest design file on startup
|
the possiblity to automatically open the latest design file on startup
|
||||||
(in Edit -> Preferences -> Options).
|
(in Edit -> Preferences -> Options).
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="12.09">
|
||||||
|
|
||||||
OpenRocket 12.09 (2012-09-16)
|
OpenRocket 12.09 (2012-09-16)
|
||||||
------------------------------
|
------------------------------
|
||||||
@ -411,6 +487,9 @@ Numerous new features by many contributors
|
|||||||
- Calibration rulers added to printed templates
|
- Calibration rulers added to printed templates
|
||||||
- Translations in Czech and Polish, numerous updates
|
- Translations in Czech and Polish, numerous updates
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="12.03">
|
||||||
|
|
||||||
OpenRocket 12.03 (2012-03-17)
|
OpenRocket 12.03 (2012-03-17)
|
||||||
------------------------------
|
------------------------------
|
||||||
@ -430,6 +509,9 @@ release you can open files and examine existing simulations, stability
|
|||||||
data and motor files. The Android port is thanks to work by Kevin
|
data and motor files. The Android port is thanks to work by Kevin
|
||||||
Ruland.
|
Ruland.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="1.1.9">
|
||||||
|
|
||||||
OpenRocket 1.1.9 (2011-11-24)
|
OpenRocket 1.1.9 (2011-11-24)
|
||||||
------------------------------
|
------------------------------
|
||||||
@ -440,6 +522,9 @@ to work by Richard Graham. Printing of transitions, nose cone
|
|||||||
profiles and fin marking guides is available thanks to Doug Pedrick.
|
profiles and fin marking guides is available thanks to Doug Pedrick.
|
||||||
It also contains some usability features and bug fixes.
|
It also contains some usability features and bug fixes.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="1.1.8">
|
||||||
|
|
||||||
OpenRocket 1.1.8 (2011-08-25)
|
OpenRocket 1.1.8 (2011-08-25)
|
||||||
------------------------------
|
------------------------------
|
||||||
@ -448,6 +533,9 @@ This release contains bug fixes to the optimization methods.
|
|||||||
It also contains a workaround to a JRE bug that prevents running
|
It also contains a workaround to a JRE bug that prevents running
|
||||||
OpenRocket on Java 7.
|
OpenRocket on Java 7.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="1.1.7">
|
||||||
|
|
||||||
OpenRocket 1.1.7 (2011-08-12)
|
OpenRocket 1.1.7 (2011-08-12)
|
||||||
------------------------------
|
------------------------------
|
||||||
@ -456,6 +544,9 @@ This release contains automatic rocket design optimization
|
|||||||
functionality. However, be cautious when using it and take the
|
functionality. However, be cautious when using it and take the
|
||||||
results with a grain of salt.
|
results with a grain of salt.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="1.1.6">
|
||||||
|
|
||||||
OpenRocket 1.1.6 (2011-07-22)
|
OpenRocket 1.1.6 (2011-07-22)
|
||||||
------------------------------
|
------------------------------
|
||||||
@ -465,6 +556,9 @@ translations by Tripoli Spain, Tripoli France and Stefan Lobas
|
|||||||
(ERIG e.V.). The release also contains rocket design scaling support
|
(ERIG e.V.). The release also contains rocket design scaling support
|
||||||
and numerous bug fixes.
|
and numerous bug fixes.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="1.1.5">
|
||||||
|
|
||||||
OpenRocket 1.1.5 (2011-06-10)
|
OpenRocket 1.1.5 (2011-06-10)
|
||||||
------------------------------
|
------------------------------
|
||||||
@ -473,12 +567,18 @@ Removed native printing support. Printing is now handled via PDF
|
|||||||
viewer, which should make printing much more reliable and less
|
viewer, which should make printing much more reliable and less
|
||||||
bug-prone.
|
bug-prone.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="1.1.4">
|
||||||
|
|
||||||
OpenRocket 1.1.4 (2011-03-05)
|
OpenRocket 1.1.4 (2011-03-05)
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
Initial printing support by Doug Pedrick, and various bug fixes.
|
Initial printing support by Doug Pedrick, and various bug fixes.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="1.1.3">
|
||||||
|
|
||||||
OpenRocket 1.1.3 (2010-10-06)
|
OpenRocket 1.1.3 (2010-10-06)
|
||||||
------------------------------
|
------------------------------
|
||||||
@ -486,12 +586,18 @@ OpenRocket 1.1.3 (2010-10-06)
|
|||||||
Support for drag-drop moving and copying of components. Fixes a
|
Support for drag-drop moving and copying of components. Fixes a
|
||||||
severe bug in the undo system.
|
severe bug in the undo system.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="1.1.2">
|
||||||
|
|
||||||
OpenRocket 1.1.2 (2010-09-07)
|
OpenRocket 1.1.2 (2010-09-07)
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
Fixes a severe bug that prevented adding stages to rockets.
|
Fixes a severe bug that prevented adding stages to rockets.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="1.1.1">
|
||||||
|
|
||||||
OpenRocket 1.1.1 (2010-09-03)
|
OpenRocket 1.1.1 (2010-09-03)
|
||||||
------------------------------
|
------------------------------
|
||||||
@ -501,6 +607,9 @@ curve loading and selection, faster startup time and bug fixes.
|
|||||||
|
|
||||||
Old simulation listeners are incompatible with this release.
|
Old simulation listeners are incompatible with this release.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="1.1.0">
|
||||||
|
|
||||||
OpenRocket 1.1.0 (2010-03-21)
|
OpenRocket 1.1.0 (2010-03-21)
|
||||||
------------------------------
|
------------------------------
|
||||||
@ -508,6 +617,9 @@ OpenRocket 1.1.0 (2010-03-21)
|
|||||||
Support for loading RockSim rocket design files (.rkt) thanks to
|
Support for loading RockSim rocket design files (.rkt) thanks to
|
||||||
Doug Pedrick.
|
Doug Pedrick.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="1.0.0">
|
||||||
|
|
||||||
OpenRocket 1.0.0 (2010-03-10)
|
OpenRocket 1.0.0 (2010-03-10)
|
||||||
------------------------------
|
------------------------------
|
||||||
@ -515,6 +627,9 @@ OpenRocket 1.0.0 (2010-03-10)
|
|||||||
Added numerous new motor thrustcurves from thrustcurve.org, and fixed
|
Added numerous new motor thrustcurves from thrustcurve.org, and fixed
|
||||||
a few more bugs.
|
a few more bugs.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="0.9.6">
|
||||||
|
|
||||||
OpenRocket 0.9.6 (2010-02-17)
|
OpenRocket 0.9.6 (2010-02-17)
|
||||||
------------------------------
|
------------------------------
|
||||||
@ -523,6 +638,9 @@ Updated aerodynamic calculation methods to be more in line with the
|
|||||||
Barrowman method and enhanced simulation time step selection. Fixed
|
Barrowman method and enhanced simulation time step selection. Fixed
|
||||||
numerous bugs.
|
numerous bugs.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="0.9.5">
|
||||||
|
|
||||||
OpenRocket 0.9.5 (2009-11-28)
|
OpenRocket 0.9.5 (2009-11-28)
|
||||||
------------------------------
|
------------------------------
|
||||||
@ -530,6 +648,9 @@ OpenRocket 0.9.5 (2009-11-28)
|
|||||||
Fixed a serious defect which prevented adding a tube coupler and
|
Fixed a serious defect which prevented adding a tube coupler and
|
||||||
centering ring on the same body tube. Other minor improvements.
|
centering ring on the same body tube. Other minor improvements.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="0.9.4">
|
||||||
|
|
||||||
OpenRocket 0.9.4 (2009-11-24)
|
OpenRocket 0.9.4 (2009-11-24)
|
||||||
------------------------------
|
------------------------------
|
||||||
@ -538,6 +659,9 @@ Added through-the-wall fin tabs, attaching components to tube
|
|||||||
couplers, material editing and automatic update checks, and fixed
|
couplers, material editing and automatic update checks, and fixed
|
||||||
numerous of the most commonly occurring bugs.
|
numerous of the most commonly occurring bugs.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="0.9.3">
|
||||||
|
|
||||||
OpenRocket 0.9.3 (2009-09-01)
|
OpenRocket 0.9.3 (2009-09-01)
|
||||||
------------------------------
|
------------------------------
|
||||||
@ -546,6 +670,9 @@ Numerous bug fixes and enhancements including data exporting, showing
|
|||||||
flight events in plots, example rocket designs, splitting clustered
|
flight events in plots, example rocket designs, splitting clustered
|
||||||
inner tubes and automated bug reporting.
|
inner tubes and automated bug reporting.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="0.9.2">
|
||||||
|
|
||||||
OpenRocket 0.9.2 (2009-07-13)
|
OpenRocket 0.9.2 (2009-07-13)
|
||||||
------------------------------
|
------------------------------
|
||||||
@ -554,6 +681,9 @@ Fixed imperial unit conversions. Significant UI enhancements to the
|
|||||||
motor configuration edit dialog, motor selection dialog and file
|
motor configuration edit dialog, motor selection dialog and file
|
||||||
open/save.
|
open/save.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="0.9.1">
|
||||||
|
|
||||||
OpenRocket 0.9.1 (2009-06-09)
|
OpenRocket 0.9.1 (2009-06-09)
|
||||||
------------------------------
|
------------------------------
|
||||||
@ -561,8 +691,14 @@ OpenRocket 0.9.1 (2009-06-09)
|
|||||||
Bug fixes to file dialog and saving; initial support for cut/copy/paste
|
Bug fixes to file dialog and saving; initial support for cut/copy/paste
|
||||||
of simulations.
|
of simulations.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="0.9.0">
|
||||||
|
|
||||||
OpenRocket 0.9.0 (2009-05-24)
|
OpenRocket 0.9.0 (2009-05-24)
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
Initial release.
|
Initial release.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
<property file="resources/build.properties" />
|
<property file="resources/build.properties" />
|
||||||
|
|
||||||
|
<property name="root.dir" value=".."/> <!-- Root directory -->
|
||||||
<property name="src.dir" value="${basedir}/src"/> <!-- Source directory -->
|
<property name="src.dir" value="${basedir}/src"/> <!-- Source directory -->
|
||||||
<property name="src-test.dir" value="${basedir}/test"/> <!-- Test directory -->
|
<property name="src-test.dir" value="${basedir}/test"/> <!-- Test directory -->
|
||||||
<property name="build.dir" value="${basedir}/build"/> <!-- Build directory -->
|
<property name="build.dir" value="${basedir}/build"/> <!-- Build directory -->
|
||||||
@ -34,6 +35,7 @@
|
|||||||
<pathelement location="${build-test.dir}"/>
|
<pathelement location="${build-test.dir}"/>
|
||||||
<pathelement location="${classes.dir}"/>
|
<pathelement location="${classes.dir}"/>
|
||||||
<pathelement location="${src-test.dir}"/>
|
<pathelement location="${src-test.dir}"/>
|
||||||
|
<pathelement location="${root.dir}"/>
|
||||||
<fileset dir="${libtest.dir}/" includes="*.jar"/>
|
<fileset dir="${libtest.dir}/" includes="*.jar"/>
|
||||||
</path>
|
</path>
|
||||||
|
|
||||||
|
|||||||
@ -356,6 +356,13 @@ generalprefs.lbl.language = Interface language
|
|||||||
generalprefs.languages.default = System default
|
generalprefs.languages.default = System default
|
||||||
generalprefs.lbl.languageEffect = The language will change the next time you start OpenRocket.
|
generalprefs.lbl.languageEffect = The language will change the next time you start OpenRocket.
|
||||||
|
|
||||||
|
! Welcome dialog
|
||||||
|
welcome.dlg.title = Welcome to OpenRocket
|
||||||
|
welcome.dlg.lbl.thankYou = Thank you for downloading OpenRocket
|
||||||
|
welcome.dlg.lbl.seeReleaseNotes = See the release notes below to find what's new.
|
||||||
|
welcome.dlg.checkbox.dontShowAgain = Don't show this dialog again
|
||||||
|
welcome.dlg.btn.close.ttip = Cool! Now leave me alone\u2026
|
||||||
|
|
||||||
! Software update checker
|
! Software update checker
|
||||||
update.dlg.error.title = Unable to retrieve update information
|
update.dlg.error.title = Unable to retrieve update information
|
||||||
update.dlg.error = An error occurred while communicating with the server.
|
update.dlg.error = An error occurred while communicating with the server.
|
||||||
@ -366,6 +373,8 @@ update.dlg.newerVersion.title = Newer version detected
|
|||||||
update.dlg.newerVersion = You are either running a test/unofficial release of OpenRocket, or you have a time machine and are running an official release from the future.\n\nYour version: %s\nLatest official release: %s
|
update.dlg.newerVersion = You are either running a test/unofficial release of OpenRocket, or you have a time machine and are running an official release from the future.\n\nYour version: %s\nLatest official release: %s
|
||||||
update.dlg.updateAvailable.title = Update available
|
update.dlg.updateAvailable.title = Update available
|
||||||
update.dlg.updateAvailable.lbl.title = A new version of OpenRocket is available!
|
update.dlg.updateAvailable.lbl.title = A new version of OpenRocket is available!
|
||||||
|
update.dlg.btn.remindMeLater = Remind Me Later
|
||||||
|
update.dlg.checkbox.skipThisVersion = Skip This Version
|
||||||
update.dlg.updateAvailable.lbl.yourVersion = OpenRocket %s is available! \u2015 you have %s. Would you like to download it now?
|
update.dlg.updateAvailable.lbl.yourVersion = OpenRocket %s is available! \u2015 you have %s. Would you like to download it now?
|
||||||
update.dlg.updateAvailable.lbl.releaseNotes = Release notes:
|
update.dlg.updateAvailable.lbl.releaseNotes = Release notes:
|
||||||
update.dlg.updateAvailable.txtPane.readMore = Read more on GitHub
|
update.dlg.updateAvailable.txtPane.readMore = Read more on GitHub
|
||||||
|
|||||||
@ -9,7 +9,7 @@ public abstract class Communicator {
|
|||||||
protected static final String BUG_REPORT_URL;
|
protected static final String BUG_REPORT_URL;
|
||||||
|
|
||||||
protected static final String UPDATE_URL;
|
protected static final String UPDATE_URL;
|
||||||
protected static final String UPDATE_ADDITIONAL_URL; // Extra URL needed for the update checker
|
protected static final String UPDATE_URL_LATEST; // Extra URL needed for the latest GitHub release
|
||||||
|
|
||||||
static {
|
static {
|
||||||
String url;
|
String url;
|
||||||
@ -21,10 +21,10 @@ public abstract class Communicator {
|
|||||||
url = System.getProperty("openrocket.debug.updateurl");
|
url = System.getProperty("openrocket.debug.updateurl");
|
||||||
if (url == null) {
|
if (url == null) {
|
||||||
url = "https://api.github.com/repos/openrocket/openrocket/releases";
|
url = "https://api.github.com/repos/openrocket/openrocket/releases";
|
||||||
UPDATE_ADDITIONAL_URL = "https://api.github.com/repos/openrocket/openrocket/releases/latest";
|
UPDATE_URL_LATEST = "https://api.github.com/repos/openrocket/openrocket/releases/latest";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
UPDATE_ADDITIONAL_URL = null;
|
UPDATE_URL_LATEST = null;
|
||||||
}
|
}
|
||||||
UPDATE_URL = url;
|
UPDATE_URL = url;
|
||||||
}
|
}
|
||||||
|
|||||||
112
core/src/net/sf/openrocket/communication/GitHubAPIUtil.java
Normal file
112
core/src/net/sf/openrocket/communication/GitHubAPIUtil.java
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
package net.sf.openrocket.communication;
|
||||||
|
|
||||||
|
import net.sf.openrocket.l10n.Translator;
|
||||||
|
import net.sf.openrocket.startup.Application;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import javax.json.Json;
|
||||||
|
import javax.json.JsonReader;
|
||||||
|
import javax.json.stream.JsonParsingException;
|
||||||
|
import javax.net.ssl.HttpsURLConnection;
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.StringReader;
|
||||||
|
import java.net.ConnectException;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.SocketTimeoutException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.UnknownHostException;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility functions for the GitHub API.
|
||||||
|
*/
|
||||||
|
public class GitHubAPIUtil {
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(GitHubAPIUtil.class);
|
||||||
|
private static final Translator trans = Application.getTranslator();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a URL with a set of parameters included.
|
||||||
|
* E.g. url = github.com/openrocket/openrocket/releases, params = {"lorem", "ipsum"}
|
||||||
|
* => formatted url: github.com/openrocket/openrocket/releases?lorem=ipsum
|
||||||
|
* @param url base URL
|
||||||
|
* @param params parameters to include
|
||||||
|
* @return formatted URL (= base URL with parameters)
|
||||||
|
*/
|
||||||
|
public static String generateUrlWithParameters(String url, Map<String, String> params) {
|
||||||
|
StringBuilder formattedUrl = new StringBuilder(url);
|
||||||
|
formattedUrl.append("?"); // Identifier for start of query string (for parameters)
|
||||||
|
|
||||||
|
// Append the parameters to the URL
|
||||||
|
int idx = 0;
|
||||||
|
for (Map.Entry<String, String> e : params.entrySet()) {
|
||||||
|
formattedUrl.append(String.format("%s=%s", e.getKey(), e.getValue()));
|
||||||
|
if (idx < params.size() - 1) {
|
||||||
|
formattedUrl.append("&"); // Identifier for more parameters
|
||||||
|
}
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
return formattedUrl.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetches the JSON info from the specified GitHub API URL.
|
||||||
|
* @param urlLink GitHub API link of the desired releases
|
||||||
|
* @return JSON-formatted string (can be a JSON-array or JSON-object)
|
||||||
|
* @throws Exception if an error occurred (e.g. no internet connection)
|
||||||
|
*/
|
||||||
|
public static String fetchPageInfo(String urlLink) throws Exception {
|
||||||
|
HttpsURLConnection connection = null;
|
||||||
|
try {
|
||||||
|
// Set up connection info to the GitHub release page
|
||||||
|
URL url = new URL(urlLink);
|
||||||
|
connection = (HttpsURLConnection) url.openConnection();
|
||||||
|
connection.setRequestMethod("GET");
|
||||||
|
connection.setRequestProperty("Accept", "application/json");
|
||||||
|
connection.setUseCaches(false);
|
||||||
|
connection.setAllowUserInteraction(false);
|
||||||
|
connection.setConnectTimeout(Communicator.CONNECTION_TIMEOUT);
|
||||||
|
connection.setReadTimeout(Communicator.CONNECTION_TIMEOUT);
|
||||||
|
|
||||||
|
// Connect to the GitHub page and get the status response code
|
||||||
|
connection.connect();
|
||||||
|
int status = connection.getResponseCode();
|
||||||
|
log.debug("Update checker response code: " + status);
|
||||||
|
|
||||||
|
// Invalid response code
|
||||||
|
if (status != 200) {
|
||||||
|
log.warn(String.format("Bad response code from server: %d", status));
|
||||||
|
throw new Exception(String.format(trans.get("update.fetcher.badResponse"), status));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read the response JSON data into a StringBuilder
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
||||||
|
String line;
|
||||||
|
while ((line = br.readLine()) != null) {
|
||||||
|
sb.append(line).append("\n");
|
||||||
|
}
|
||||||
|
br.close();
|
||||||
|
|
||||||
|
return sb.toString();
|
||||||
|
} catch (UnknownHostException | SocketTimeoutException | ConnectException e) {
|
||||||
|
log.warn(String.format("Could not connect to URL: %s. Please check your internet connection.", urlLink));
|
||||||
|
throw new Exception(trans.get("update.fetcher.badConnection"));
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
log.warn("Malformed URL: " + urlLink);
|
||||||
|
throw new Exception(String.format(trans.get("update.fetcher.malformedURL"), urlLink));
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new Exception(String.format("Exception - %s: %s", e, e.getMessage()));
|
||||||
|
} finally { // Close the connection to the release page
|
||||||
|
if (connection != null) {
|
||||||
|
try {
|
||||||
|
connection.disconnect();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
log.warn("Could not disconnect update checker connection");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,56 @@
|
|||||||
|
package net.sf.openrocket.communication;
|
||||||
|
|
||||||
|
import net.sf.openrocket.aerodynamics.WarningSet;
|
||||||
|
import net.sf.openrocket.file.simplesax.AbstractElementHandler;
|
||||||
|
import net.sf.openrocket.file.simplesax.ElementHandler;
|
||||||
|
import net.sf.openrocket.file.simplesax.PlainTextHandler;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class that parses ReleaseNotes.md.
|
||||||
|
* <p>
|
||||||
|
* Releases are stored in an HTML <div> object with as id attribute the release version.
|
||||||
|
* E.g. <div id="15.03">...</div>
|
||||||
|
* The content of the div is the release notes for that version.
|
||||||
|
*/
|
||||||
|
public class ReleaseNotesHandler extends AbstractElementHandler {
|
||||||
|
private final String buildVersion;
|
||||||
|
private String releaseNotes = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param buildVersion the build version to search the release notes for (e.g. "22.02")
|
||||||
|
*/
|
||||||
|
public ReleaseNotesHandler(String buildVersion) {
|
||||||
|
this.buildVersion = buildVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ElementHandler openElement(String element, HashMap<String, String> attributes, WarningSet warnings) throws SAXException {
|
||||||
|
if (element.equals("body")) { // The release notes are encapsulated in a root <body> tag (required for XML parsing)
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
if (element.equals("div") && Objects.equals(attributes.get("id"), this.buildVersion)) {
|
||||||
|
return PlainTextHandler.INSTANCE;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void closeElement(String element, HashMap<String, String> attributes, String content, WarningSet warnings) throws SAXException {
|
||||||
|
super.closeElement(element, attributes, content, warnings);
|
||||||
|
|
||||||
|
if (element.equals("div")) {
|
||||||
|
this.releaseNotes = content.trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the release notes for the build version
|
||||||
|
*/
|
||||||
|
public String getReleaseNotes() {
|
||||||
|
return releaseNotes;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,14 +1,6 @@
|
|||||||
package net.sf.openrocket.communication;
|
package net.sf.openrocket.communication;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.io.StringReader;
|
import java.io.StringReader;
|
||||||
import java.net.ConnectException;
|
|
||||||
import java.net.MalformedURLException;
|
|
||||||
import java.net.SocketTimeoutException;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.net.UnknownHostException;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@ -31,7 +23,6 @@ import javax.json.JsonArrayBuilder;
|
|||||||
import javax.json.JsonObject;
|
import javax.json.JsonObject;
|
||||||
import javax.json.JsonReader;
|
import javax.json.JsonReader;
|
||||||
import javax.json.stream.JsonParsingException;
|
import javax.json.stream.JsonParsingException;
|
||||||
import javax.net.ssl.HttpsURLConnection;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class that initiates fetching software update information.
|
* Class that initiates fetching software update information.
|
||||||
@ -79,7 +70,7 @@ public class UpdateInfoRetriever {
|
|||||||
*/
|
*/
|
||||||
public boolean isRunning() {
|
public boolean isRunning() {
|
||||||
if (this.fetcher == null) {
|
if (this.fetcher == null) {
|
||||||
throw new IllegalStateException("startFetchUpdateInfo() has not been called");
|
throw new IllegalStateException("Fetcher has not been called yet");
|
||||||
}
|
}
|
||||||
return this.fetcher.isAlive();
|
return this.fetcher.isAlive();
|
||||||
}
|
}
|
||||||
@ -100,7 +91,7 @@ public class UpdateInfoRetriever {
|
|||||||
*/
|
*/
|
||||||
public UpdateInfo getUpdateInfo() {
|
public UpdateInfo getUpdateInfo() {
|
||||||
if (this.fetcher == null) {
|
if (this.fetcher == null) {
|
||||||
throw new IllegalStateException("startFetchUpdateInfo() has not been called");
|
throw new IllegalStateException("Fetcher has not been called yet");
|
||||||
}
|
}
|
||||||
return this.fetcher.info;
|
return this.fetcher.info;
|
||||||
}
|
}
|
||||||
@ -175,15 +166,15 @@ public class UpdateInfoRetriever {
|
|||||||
|
|
||||||
// Get release tags from release page
|
// Get release tags from release page
|
||||||
String relUrl = Communicator.UPDATE_URL;
|
String relUrl = Communicator.UPDATE_URL;
|
||||||
relUrl = generateUrlWithParameters(relUrl, params);
|
relUrl = GitHubAPIUtil.generateUrlWithParameters(relUrl, params);
|
||||||
JsonArray arr1 = retrieveReleaseJSONArr(relUrl);
|
JsonArray arr1 = retrieveReleaseJSONArr(relUrl);
|
||||||
|
|
||||||
if (arr1 == null) return null;
|
if (arr1 == null) return null;
|
||||||
if (Communicator.UPDATE_ADDITIONAL_URL == null) return arr1;
|
if (Communicator.UPDATE_URL_LATEST == null) return arr1;
|
||||||
|
|
||||||
// Get release tags from latest release page
|
// Get release tags from latest release page
|
||||||
String latestRelUrl = Communicator.UPDATE_ADDITIONAL_URL;
|
String latestRelUrl = Communicator.UPDATE_URL_LATEST;
|
||||||
latestRelUrl = generateUrlWithParameters(latestRelUrl, params);
|
latestRelUrl = GitHubAPIUtil.generateUrlWithParameters(latestRelUrl, params);
|
||||||
JsonArray arr2 = retrieveReleaseJSONArr(latestRelUrl);
|
JsonArray arr2 = retrieveReleaseJSONArr(latestRelUrl);
|
||||||
|
|
||||||
if (arr2 == null) return null;
|
if (arr2 == null) return null;
|
||||||
@ -209,73 +200,26 @@ public class UpdateInfoRetriever {
|
|||||||
* @throws UpdateCheckerException if an error occurred (e.g. no internet connection)
|
* @throws UpdateCheckerException if an error occurred (e.g. no internet connection)
|
||||||
*/
|
*/
|
||||||
private JsonArray retrieveReleaseJSONArr(String urlLink) throws UpdateCheckerException {
|
private JsonArray retrieveReleaseJSONArr(String urlLink) throws UpdateCheckerException {
|
||||||
JsonArray jsonArr;
|
|
||||||
|
|
||||||
HttpsURLConnection connection = null;
|
|
||||||
try {
|
try {
|
||||||
// Set up connection info to the GitHub release page
|
String pageInfo = GitHubAPIUtil.fetchPageInfo(urlLink);
|
||||||
URL url = new URL(urlLink);
|
|
||||||
connection = (HttpsURLConnection) url.openConnection();
|
|
||||||
connection.setRequestMethod("GET");
|
|
||||||
connection.setRequestProperty("Accept", "application/json");
|
|
||||||
connection.setUseCaches(false);
|
|
||||||
connection.setAllowUserInteraction(false);
|
|
||||||
connection.setConnectTimeout(Communicator.CONNECTION_TIMEOUT);
|
|
||||||
connection.setReadTimeout(Communicator.CONNECTION_TIMEOUT);
|
|
||||||
|
|
||||||
// Connect to the GitHub page and get the status response code
|
// Read the release page as a JSON object
|
||||||
connection.connect();
|
JsonReader reader = Json.createReader(new StringReader(pageInfo));
|
||||||
int status = connection.getResponseCode();
|
|
||||||
log.debug("Update checker response code: " + status);
|
|
||||||
|
|
||||||
// Invalid response code
|
|
||||||
if (status != 200) {
|
|
||||||
log.warn(String.format("Bad response code from server: %d", status));
|
|
||||||
throw new UpdateCheckerException(String.format(trans.get("update.fetcher.badResponse"), status));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read the response JSON data into a StringBuilder
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
|
||||||
String line;
|
|
||||||
while ((line = br.readLine()) != null) {
|
|
||||||
sb.append(line).append("\n");
|
|
||||||
}
|
|
||||||
br.close();
|
|
||||||
|
|
||||||
// Read the release page as a JSON array
|
|
||||||
JsonReader reader = Json.createReader(new StringReader(sb.toString()));
|
|
||||||
|
|
||||||
// The reader-content can be a JSON array or just a JSON object
|
// The reader-content can be a JSON array or just a JSON object
|
||||||
try { // Case: JSON array
|
try { // Case: JSON array
|
||||||
jsonArr = reader.readArray();
|
return reader.readArray();
|
||||||
} catch (JsonParsingException e) { // Case: JSON object
|
} catch (JsonParsingException e) { // Case: JSON object
|
||||||
JsonArrayBuilder builder = Json.createArrayBuilder();
|
JsonArrayBuilder builder = Json.createArrayBuilder();
|
||||||
reader = Json.createReader(new StringReader(sb.toString()));
|
reader = Json.createReader(new StringReader(pageInfo));
|
||||||
JsonObject obj = reader.readObject();
|
JsonObject obj = reader.readObject();
|
||||||
builder.add(obj);
|
builder.add(obj);
|
||||||
jsonArr = builder.build();
|
return builder.build();
|
||||||
}
|
}
|
||||||
} catch (UnknownHostException | SocketTimeoutException | ConnectException e) {
|
} catch (Exception e) {
|
||||||
log.warn(String.format("Could not connect to URL: %s. Please check your internet connection.", urlLink));
|
throw new UpdateCheckerException(e);
|
||||||
throw new UpdateCheckerException(trans.get("update.fetcher.badConnection"));
|
|
||||||
} catch (MalformedURLException e) {
|
|
||||||
log.warn("Malformed URL: " + urlLink);
|
|
||||||
throw new UpdateCheckerException(String.format(trans.get("update.fetcher.malformedURL"), urlLink));
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new UpdateCheckerException(String.format("Exception - %s: %s", e, e.getMessage()));
|
|
||||||
} finally { // Close the connection to the release page
|
|
||||||
if (connection != null) {
|
|
||||||
try {
|
|
||||||
connection.disconnect();
|
|
||||||
} catch (Exception ex) {
|
|
||||||
log.warn("Could not disconnect update checker connection");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return jsonArr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sometimes release names start with a pre-tag, as is the case for e.g. 'android-13.11', where 'android' is the pre-tag.
|
* Sometimes release names start with a pre-tag, as is the case for e.g. 'android-13.11', where 'android' is the pre-tag.
|
||||||
@ -494,30 +438,6 @@ public class UpdateInfoRetriever {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate a URL with a set of parameters included.
|
|
||||||
* E.g. url = github.com/openrocket/openrocket/releases, params = {"lorem", "ipsum"}
|
|
||||||
* => formatted url: github.com/openrocket/openrocket/releases?lorem=ipsum
|
|
||||||
* @param url base URL
|
|
||||||
* @param params parameters to include
|
|
||||||
* @return formatted URL (= base URL with parameters)
|
|
||||||
*/
|
|
||||||
private String generateUrlWithParameters(String url, Map<String, String> params) {
|
|
||||||
StringBuilder formattedUrl = new StringBuilder(url);
|
|
||||||
formattedUrl.append("?"); // Identifier for start of query string (for parameters)
|
|
||||||
|
|
||||||
// Append the parameters to the URL
|
|
||||||
int idx = 0;
|
|
||||||
for (Map.Entry<String, String> e : params.entrySet()) {
|
|
||||||
formattedUrl.append(String.format("%s=%s", e.getKey(), e.getValue()));
|
|
||||||
if (idx < params.size() - 1) {
|
|
||||||
formattedUrl.append("&"); // Identifier for more parameters
|
|
||||||
}
|
|
||||||
idx++;
|
|
||||||
}
|
|
||||||
return formattedUrl.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exception for the update checker
|
* Exception for the update checker
|
||||||
*/
|
*/
|
||||||
@ -525,6 +445,10 @@ public class UpdateInfoRetriever {
|
|||||||
public UpdateCheckerException(String message) {
|
public UpdateCheckerException(String message) {
|
||||||
super(message);
|
super(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public UpdateCheckerException(Throwable cause) {
|
||||||
|
super(cause);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,47 @@
|
|||||||
|
package net.sf.openrocket.communication;
|
||||||
|
|
||||||
|
import net.sf.openrocket.aerodynamics.WarningSet;
|
||||||
|
import net.sf.openrocket.file.simplesax.SimpleSAX;
|
||||||
|
import net.sf.openrocket.util.BuildProperties;
|
||||||
|
import org.xml.sax.InputSource;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
|
||||||
|
public abstract class WelcomeInfoRetriever {
|
||||||
|
/**
|
||||||
|
* Retrieves the release notes of the current build version from the ReleaseNotes.md file.
|
||||||
|
* @param version the build version to search the release notes for (e.g. "22.02")
|
||||||
|
* @return the release notes of the current build version
|
||||||
|
* @throws IOException if the file could not be read
|
||||||
|
*/
|
||||||
|
public static String retrieveWelcomeInfo(String version) throws IOException {
|
||||||
|
ClassLoader cl = WelcomeInfoRetriever.class.getClassLoader();
|
||||||
|
InputStream in = cl.getResourceAsStream("ReleaseNotes.md");
|
||||||
|
if (in == null) {
|
||||||
|
throw new FileNotFoundException("ReleaseNotes.md not found");
|
||||||
|
}
|
||||||
|
InputSource source = new InputSource(new InputStreamReader(in));
|
||||||
|
ReleaseNotesHandler handler = new ReleaseNotesHandler(version);
|
||||||
|
WarningSet warnings = new WarningSet();
|
||||||
|
|
||||||
|
try {
|
||||||
|
SimpleSAX.readXML(source, handler, warnings);
|
||||||
|
return handler.getReleaseNotes();
|
||||||
|
} catch (SAXException e) {
|
||||||
|
throw new IOException(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the release notes of the current build version from the ReleaseNotes.md file.
|
||||||
|
* @return the release notes of the current build version
|
||||||
|
* @throws IOException if the file could not be read
|
||||||
|
*/
|
||||||
|
public static String retrieveWelcomeInfo() throws IOException {
|
||||||
|
return retrieveWelcomeInfo(BuildProperties.getVersion());
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -56,9 +56,11 @@ public abstract class Preferences implements ChangeSource {
|
|||||||
|
|
||||||
public static final String PLOT_SHOW_POINTS = "ShowPlotPoints";
|
public static final String PLOT_SHOW_POINTS = "ShowPlotPoints";
|
||||||
|
|
||||||
|
private static final String IGNORE_WELCOME = "IgnoreWelcome";
|
||||||
|
|
||||||
private static final String CHECK_UPDATES = "CheckUpdates";
|
private static final String CHECK_UPDATES = "CheckUpdates";
|
||||||
|
|
||||||
private static final String IGNORE_VERSIONS = "IgnoreVersions";
|
private static final String IGNORE_UPDATE_VERSIONS = "IgnoreUpdateVersions";
|
||||||
private static final String CHECK_BETA_UPDATES = "CheckBetaUpdates";
|
private static final String CHECK_BETA_UPDATES = "CheckBetaUpdates";
|
||||||
|
|
||||||
public static final String MOTOR_DIAMETER_FILTER = "MotorDiameterMatch";
|
public static final String MOTOR_DIAMETER_FILTER = "MotorDiameterMatch";
|
||||||
@ -143,7 +145,29 @@ public abstract class Preferences implements ChangeSource {
|
|||||||
public abstract java.util.prefs.Preferences getNode(String nodeName);
|
public abstract java.util.prefs.Preferences getNode(String nodeName);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ******************************************************************************************
|
* Welcome dialog
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets to ignore opening the welcome dialog for the supplied OpenRocket build version.
|
||||||
|
* @param version build version to ignore opening the welcome dialog for (e.g. "22.02")
|
||||||
|
* @param ignore true to ignore, false to show the welcome dialog
|
||||||
|
*/
|
||||||
|
public final void setIgnoreWelcome(String version, boolean ignore) {
|
||||||
|
this.putBoolean(IGNORE_WELCOME + "_" + version, ignore);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether to ignore opening the welcome dialog for the supplied OpenRocket build version.
|
||||||
|
* @param version build version (e.g. "22.02")
|
||||||
|
* @return true if no welcome dialog should be opened for the supplied version
|
||||||
|
*/
|
||||||
|
public final boolean getIgnoreWelcome(String version) {
|
||||||
|
return this.getBoolean(IGNORE_WELCOME + "_" + version, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Software updater
|
||||||
*/
|
*/
|
||||||
public final boolean getCheckUpdates() {
|
public final boolean getCheckUpdates() {
|
||||||
return this.getBoolean(CHECK_UPDATES, BuildProperties.getDefaultCheckUpdates());
|
return this.getBoolean(CHECK_UPDATES, BuildProperties.getDefaultCheckUpdates());
|
||||||
@ -153,12 +177,12 @@ public abstract class Preferences implements ChangeSource {
|
|||||||
this.putBoolean(CHECK_UPDATES, check);
|
this.putBoolean(CHECK_UPDATES, check);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final List<String> getIgnoreVersions() {
|
public final List<String> getIgnoreUpdateVersions() {
|
||||||
return List.of(this.getString(IGNORE_VERSIONS, "").split("\n"));
|
return List.of(this.getString(IGNORE_UPDATE_VERSIONS, "").split("\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void setIgnoreVersions(List<String> versions) {
|
public final void setIgnoreUpdateVersions(List<String> versions) {
|
||||||
this.putString(IGNORE_VERSIONS, String.join("\n", versions));
|
this.putString(IGNORE_UPDATE_VERSIONS, String.join("\n", versions));
|
||||||
}
|
}
|
||||||
|
|
||||||
public final boolean getCheckBetaUpdates() {
|
public final boolean getCheckBetaUpdates() {
|
||||||
@ -169,6 +193,11 @@ public abstract class Preferences implements ChangeSource {
|
|||||||
this.putBoolean(CHECK_BETA_UPDATES, check);
|
this.putBoolean(CHECK_BETA_UPDATES, check);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ******************************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
public final boolean getConfirmSimDeletion() {
|
public final boolean getConfirmSimDeletion() {
|
||||||
return this.getBoolean(CONFIRM_DELETE_SIMULATION, true);
|
return this.getBoolean(CONFIRM_DELETE_SIMULATION, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,27 @@
|
|||||||
|
package net.sf.openrocket.communication;
|
||||||
|
|
||||||
|
import net.sf.openrocket.util.BaseTestCase.BaseTestCase;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
public class WelcomeInfoTest extends BaseTestCase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Note: this unit test will fail if you don't run it using 'ant unittest', because otherwise
|
||||||
|
* it can't load the ReleaseNotes.md file.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testWelcomeInfo() throws Exception {
|
||||||
|
// Test the welcome info for the current build version
|
||||||
|
String welcomeInfo = WelcomeInfoRetriever.retrieveWelcomeInfo();
|
||||||
|
assertNotNull(welcomeInfo);
|
||||||
|
assertTrue(welcomeInfo.length() > 0);
|
||||||
|
|
||||||
|
// Test the release info for a bogus release version
|
||||||
|
welcomeInfo = WelcomeInfoRetriever.retrieveWelcomeInfo("bogus release");
|
||||||
|
assertNull(welcomeInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -30,7 +30,6 @@ import net.sf.openrocket.communication.AssetHandler.UpdatePlatform;
|
|||||||
import net.sf.openrocket.communication.ReleaseInfo;
|
import net.sf.openrocket.communication.ReleaseInfo;
|
||||||
import net.sf.openrocket.communication.UpdateInfo;
|
import net.sf.openrocket.communication.UpdateInfo;
|
||||||
import net.sf.openrocket.gui.components.StyledLabel;
|
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.GUIUtil;
|
||||||
import net.sf.openrocket.gui.util.Icons;
|
import net.sf.openrocket.gui.util.Icons;
|
||||||
import net.sf.openrocket.gui.util.SwingPreferences;
|
import net.sf.openrocket.gui.util.SwingPreferences;
|
||||||
@ -58,6 +57,7 @@ public class UpdateInfoDialog extends JDialog {
|
|||||||
|
|
||||||
JPanel panel = new JPanel(new MigLayout("insets n n 8px n, fill"));
|
JPanel panel = new JPanel(new MigLayout("insets n n 8px n, fill"));
|
||||||
|
|
||||||
|
// OpenRocket logo on the left
|
||||||
panel.add(new JLabel(Icons.getScaledIcon(Icons.loadImageIcon("pix/icon/icon-about.png", "OpenRocket"), 0.6)),
|
panel.add(new JLabel(Icons.getScaledIcon(Icons.loadImageIcon("pix/icon/icon-about.png", "OpenRocket"), 0.6)),
|
||||||
"spany, top, gapright 20px, cell 0 0");
|
"spany, top, gapright 20px, cell 0 0");
|
||||||
|
|
||||||
@ -124,7 +124,7 @@ public class UpdateInfoDialog extends JDialog {
|
|||||||
|
|
||||||
// Lower row buttons
|
// Lower row buttons
|
||||||
//// Remind me later button
|
//// Remind me later button
|
||||||
JButton btnLater = new SelectColorButton("Remind Me Later");
|
JButton btnLater = new SelectColorButton(trans.get("update.dlg.btn.remindMeLater"));
|
||||||
btnLater.addActionListener(new ActionListener() {
|
btnLater.addActionListener(new ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
@ -134,15 +134,15 @@ public class UpdateInfoDialog extends JDialog {
|
|||||||
panel.add(btnLater, "skip 1, split 2");
|
panel.add(btnLater, "skip 1, split 2");
|
||||||
|
|
||||||
//// Skip this version button
|
//// Skip this version button
|
||||||
JButton btnSkip = new SelectColorButton("Skip This Version");
|
JButton btnSkip = new SelectColorButton(trans.get("update.dlg.checkbox.skipThisVersion"));
|
||||||
btnSkip.addActionListener(new ActionListener() {
|
btnSkip.addActionListener(new ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
List<String> ignoreVersions = new ArrayList<>(preferences.getIgnoreVersions());
|
List<String> ignoreVersions = new ArrayList<>(preferences.getIgnoreUpdateVersions());
|
||||||
String ignore = release.getReleaseName();
|
String ignore = release.getReleaseName();
|
||||||
if (!ignoreVersions.contains(ignore)) {
|
if (!ignoreVersions.contains(ignore)) {
|
||||||
ignoreVersions.add(ignore);
|
ignoreVersions.add(ignore);
|
||||||
preferences.setIgnoreVersions(ignoreVersions);
|
preferences.setIgnoreUpdateVersions(ignoreVersions);
|
||||||
}
|
}
|
||||||
UpdateInfoDialog.this.dispose();
|
UpdateInfoDialog.this.dispose();
|
||||||
}
|
}
|
||||||
|
|||||||
115
swing/src/net/sf/openrocket/gui/dialogs/WelcomeDialog.java
Normal file
115
swing/src/net/sf/openrocket/gui/dialogs/WelcomeDialog.java
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
package net.sf.openrocket.gui.dialogs;
|
||||||
|
|
||||||
|
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.widgets.SelectColorButton;
|
||||||
|
import net.sf.openrocket.l10n.Translator;
|
||||||
|
import net.sf.openrocket.startup.Application;
|
||||||
|
import net.sf.openrocket.util.BuildProperties;
|
||||||
|
import net.sf.openrocket.util.MarkdownUtil;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import javax.swing.JButton;
|
||||||
|
import javax.swing.JCheckBox;
|
||||||
|
import javax.swing.JDialog;
|
||||||
|
import javax.swing.JLabel;
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.JScrollPane;
|
||||||
|
import javax.swing.JTextPane;
|
||||||
|
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;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dialog that opens when you start up OpenRocket. It will display the release notes of the current version.
|
||||||
|
*/
|
||||||
|
public class WelcomeDialog extends JDialog {
|
||||||
|
private static final Translator trans = Application.getTranslator();
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(WelcomeDialog.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param releaseNotes the release notes to display for the current version
|
||||||
|
*/
|
||||||
|
public WelcomeDialog(String releaseNotes) {
|
||||||
|
super(null, trans.get("welcome.dlg.title"), ModalityType.APPLICATION_MODAL);
|
||||||
|
|
||||||
|
JPanel panel = new JPanel(new MigLayout("insets n n 8px n, fill"));
|
||||||
|
|
||||||
|
// OpenRocket logo on the left
|
||||||
|
panel.add(new JLabel(Icons.getScaledIcon(Icons.loadImageIcon("pix/icon/icon-about.png", "OpenRocket"), 0.6)),
|
||||||
|
"spany, top, gapright 20px, cell 0 0");
|
||||||
|
|
||||||
|
// Thank you for downloading!
|
||||||
|
panel.add(new StyledLabel(trans.get("welcome.dlg.lbl.thankYou") + " " + BuildProperties.getVersion() + "!",
|
||||||
|
2, StyledLabel.Style.BOLD), "spanx, wrap");
|
||||||
|
|
||||||
|
// See the release notes below for what's new
|
||||||
|
panel.add(new StyledLabel(trans.get("welcome.dlg.lbl.seeReleaseNotes"),
|
||||||
|
1, StyledLabel.Style.PLAIN), "skip 1, spanx, wrap para");
|
||||||
|
|
||||||
|
// Release notes
|
||||||
|
final JTextPane textPane = new JTextPane();
|
||||||
|
textPane.setEditable(false);
|
||||||
|
textPane.setContentType("text/html");
|
||||||
|
textPane.setMargin(new Insets(10, 10, 10, 10));
|
||||||
|
textPane.putClientProperty(JTextPane.HONOR_DISPLAY_PROPERTIES, true);
|
||||||
|
|
||||||
|
String sb = "<html>" +
|
||||||
|
MarkdownUtil.toHtml(releaseNotes) + "<br><br>" +
|
||||||
|
"</html>";
|
||||||
|
textPane.addHyperlinkListener(new HyperlinkListener() {
|
||||||
|
@Override
|
||||||
|
public void hyperlinkUpdate(HyperlinkEvent e) {
|
||||||
|
if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) {
|
||||||
|
Desktop desktop = Desktop.getDesktop();
|
||||||
|
try {
|
||||||
|
desktop.browse(e.getURL().toURI());
|
||||||
|
} catch (Exception ex) {
|
||||||
|
log.warn("Exception hyperlink: " + ex.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
textPane.setText(sb);
|
||||||
|
textPane.setCaretPosition(0); // Scroll to the top
|
||||||
|
|
||||||
|
panel.add(new JScrollPane(textPane), "skip 1, left, spanx, grow, push, gapbottom 6px, wrap");
|
||||||
|
|
||||||
|
// Don't show this dialog again
|
||||||
|
JCheckBox dontShowAgain = new JCheckBox(trans.get("welcome.dlg.checkbox.dontShowAgain"));
|
||||||
|
dontShowAgain.setSelected(Application.getPreferences().getIgnoreWelcome(BuildProperties.getVersion())); // Normally this should never be true, but just in case
|
||||||
|
panel.add(dontShowAgain, "skip 1");
|
||||||
|
dontShowAgain.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
Application.getPreferences().setIgnoreWelcome(BuildProperties.getVersion(), dontShowAgain.isSelected());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Close button
|
||||||
|
JButton closeBtn = new SelectColorButton(trans.get("button.close"));
|
||||||
|
closeBtn.setToolTipText(trans.get("welcome.dlg.btn.close.ttip"));
|
||||||
|
closeBtn.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
WelcomeDialog.this.dispose();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
panel.add(closeBtn, "pushx, right, wrap");
|
||||||
|
|
||||||
|
panel.setPreferredSize(new Dimension(800, 600));
|
||||||
|
this.add(panel);
|
||||||
|
|
||||||
|
this.pack();
|
||||||
|
this.setLocationRelativeTo(null);
|
||||||
|
GUIUtil.setDisposableDialogOptions(this, closeBtn);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -342,7 +342,7 @@ public class GeneralPreferencesPanel extends PreferencesPanel {
|
|||||||
ReleaseInfo release = info.getLatestRelease();
|
ReleaseInfo release = info.getLatestRelease();
|
||||||
|
|
||||||
// Do nothing if the release is part of the ignore versions
|
// Do nothing if the release is part of the ignore versions
|
||||||
if (preferences.getIgnoreVersions().contains(release.getReleaseName())) {
|
if (preferences.getIgnoreUpdateVersions().contains(release.getReleaseName())) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import java.awt.GraphicsEnvironment;
|
|||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.stream.IntStream;
|
import java.util.stream.IntStream;
|
||||||
@ -19,10 +20,11 @@ import net.sf.openrocket.arch.SystemInfo.Platform;
|
|||||||
import net.sf.openrocket.communication.UpdateInfo;
|
import net.sf.openrocket.communication.UpdateInfo;
|
||||||
import net.sf.openrocket.communication.UpdateInfoRetriever;
|
import net.sf.openrocket.communication.UpdateInfoRetriever;
|
||||||
import net.sf.openrocket.communication.UpdateInfoRetriever.ReleaseStatus;
|
import net.sf.openrocket.communication.UpdateInfoRetriever.ReleaseStatus;
|
||||||
|
import net.sf.openrocket.communication.WelcomeInfoRetriever;
|
||||||
import net.sf.openrocket.database.Databases;
|
import net.sf.openrocket.database.Databases;
|
||||||
import net.sf.openrocket.gui.dialogs.UpdateInfoDialog;
|
import net.sf.openrocket.gui.dialogs.UpdateInfoDialog;
|
||||||
|
import net.sf.openrocket.gui.dialogs.WelcomeDialog;
|
||||||
import net.sf.openrocket.gui.main.BasicFrame;
|
import net.sf.openrocket.gui.main.BasicFrame;
|
||||||
import net.sf.openrocket.gui.main.MRUDesignFile;
|
|
||||||
import net.sf.openrocket.gui.main.Splash;
|
import net.sf.openrocket.gui.main.Splash;
|
||||||
import net.sf.openrocket.gui.main.SwingExceptionHandler;
|
import net.sf.openrocket.gui.main.SwingExceptionHandler;
|
||||||
import net.sf.openrocket.gui.util.GUIUtil;
|
import net.sf.openrocket.gui.util.GUIUtil;
|
||||||
@ -217,6 +219,7 @@ public class SwingStartup {
|
|||||||
if (!handleCommandLine(args)) {
|
if (!handleCommandLine(args)) {
|
||||||
BasicFrame startupFrame = BasicFrame.reopen();
|
BasicFrame startupFrame = BasicFrame.reopen();
|
||||||
BasicFrame.setStartupFrame(startupFrame);
|
BasicFrame.setStartupFrame(startupFrame);
|
||||||
|
showWelcomeDialog();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check whether update info has been fetched or whether it needs more time
|
// Check whether update info has been fetched or whether it needs more time
|
||||||
@ -277,7 +280,7 @@ public class SwingStartup {
|
|||||||
|
|
||||||
// Only display something when an update is found
|
// Only display something when an update is found
|
||||||
if (info != null && info.getException() == null && info.getReleaseStatus() == ReleaseStatus.OLDER &&
|
if (info != null && info.getException() == null && info.getReleaseStatus() == ReleaseStatus.OLDER &&
|
||||||
!preferences.getIgnoreVersions().contains(info.getLatestRelease().getReleaseName())) {
|
!preferences.getIgnoreUpdateVersions().contains(info.getLatestRelease().getReleaseName())) {
|
||||||
UpdateInfoDialog infoDialog = new UpdateInfoDialog(info);
|
UpdateInfoDialog infoDialog = new UpdateInfoDialog(info);
|
||||||
infoDialog.setVisible(true);
|
infoDialog.setVisible(true);
|
||||||
}
|
}
|
||||||
@ -291,6 +294,34 @@ public class SwingStartup {
|
|||||||
timer.start();
|
timer.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shows a welcome dialog displaying the release notes for this build version.
|
||||||
|
*/
|
||||||
|
public static void showWelcomeDialog() {
|
||||||
|
// Don't show if this build version is ignored
|
||||||
|
if (Application.getPreferences().getIgnoreWelcome(BuildProperties.getVersion())) {
|
||||||
|
log.debug("Welcome dialog ignored");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fetch this version's release notes
|
||||||
|
String releaseNotes;
|
||||||
|
try {
|
||||||
|
releaseNotes = WelcomeInfoRetriever.retrieveWelcomeInfo();
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("Error retrieving welcome info", e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (releaseNotes == null) {
|
||||||
|
log.debug("No release notes found");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show the dialog
|
||||||
|
WelcomeDialog dialog = new WelcomeDialog(releaseNotes);
|
||||||
|
dialog.setVisible(true);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles arguments passed from the command line. This may be used either
|
* Handles arguments passed from the command line. This may be used either
|
||||||
* when starting the first instance of OpenRocket or later when OpenRocket is
|
* when starting the first instance of OpenRocket or later when OpenRocket is
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user