├── manifest.mf ├── src └── org │ └── fbb │ └── balkna │ ├── model │ ├── package-info.java │ ├── WavPlayer.java │ ├── WavPlayerProvider.java │ ├── Substituable.java │ ├── Trainable.java │ ├── ImagesSaver.java │ ├── primitives │ │ ├── history │ │ │ ├── RecordType.java │ │ │ ├── NonRepeatedArrayList.java │ │ │ ├── RecordWithOrigin.java │ │ │ ├── StatisticHelper.java │ │ │ └── Record.java │ │ ├── LocalisedString.java │ │ ├── SetDefaults.java │ │ ├── Cycles.java │ │ ├── TimeShift.java │ │ ├── Trainings.java │ │ ├── Exercises.java │ │ ├── TrainingOverrides.java │ │ ├── ExerciseOverrides.java │ │ └── Exercise.java │ ├── Exportable.java │ ├── settings │ │ ├── BoolSettingsRecord.java │ │ ├── StringSettingsRecord.java │ │ ├── IntSettingsRecord.java │ │ ├── SettingsRecord.java │ │ └── PluginlistProvider.java │ ├── graphs │ │ ├── Steppable.java │ │ ├── GatheredDay.java │ │ ├── AbstractGraph.java │ │ ├── DayTimes.java │ │ └── DayStatst.java │ ├── merged │ │ ├── uncompressed │ │ │ └── timeUnits │ │ │ │ ├── TrainingTime.java │ │ │ │ ├── PausaTime.java │ │ │ │ ├── BigRestTime.java │ │ │ │ ├── SmallRestTime.java │ │ │ │ └── BasicTime.java │ │ ├── MergedExerciseWrapper.java │ │ └── MergedExercise.java │ ├── Statisticable.java │ ├── PluginFactoryProvider.java │ ├── utils │ │ ├── TimeUtils.java │ │ ├── XmlConstants.java │ │ ├── IoUtils.java │ │ └── XmlUtils.java │ ├── Translator.java │ └── SoundProvider.java │ ├── data │ ├── imgs │ │ ├── app │ │ │ ├── ico.png │ │ │ ├── title.png │ │ │ ├── title1.png │ │ │ └── title2.png │ │ ├── exercises │ │ │ ├── a01.jpg │ │ │ ├── a02.jpg │ │ │ ├── a03.jpg │ │ │ ├── a04.jpg │ │ │ ├── a05.jpg │ │ │ ├── a06.jpg │ │ │ ├── a07.jpg │ │ │ ├── a08.jpg │ │ │ ├── a09.jpg │ │ │ ├── a10.jpg │ │ │ ├── b03.jpg │ │ │ ├── b04.jpg │ │ │ ├── b05.jpg │ │ │ ├── b06.jpg │ │ │ ├── b07.jpg │ │ │ ├── b08.jpg │ │ │ ├── b09.jpg │ │ │ ├── b10.jpg │ │ │ ├── b11.jpg │ │ │ ├── c01.jpg │ │ │ ├── c05.jpg │ │ │ ├── c06.jpg │ │ │ ├── c07.jpg │ │ │ ├── c09.jpg │ │ │ ├── c10.jpg │ │ │ └── c11.jpg │ │ └── trainings │ │ │ ├── fbb2.jpg │ │ │ └── fbb3.jpg │ ├── soundpacks │ │ ├── cs │ │ │ ├── 1.wav │ │ │ ├── 2.wav │ │ │ ├── 3.wav │ │ │ ├── start.wav │ │ │ ├── change.wav │ │ │ ├── endPause.wav │ │ │ ├── endRun.wav │ │ │ ├── halfRun.wav │ │ │ ├── endChange.wav │ │ │ ├── halfPause.wav │ │ │ ├── halfSerie.wav │ │ │ ├── lastSerie.wav │ │ │ ├── threeQats.wav │ │ │ ├── halfTraining.wav │ │ │ ├── lastExercise.wav │ │ │ ├── trainingEnd.wav │ │ │ ├── endChangeSmall.wav │ │ │ ├── threeQatsPause.wav │ │ │ ├── threeQatsSerie.wav │ │ │ └── threeQatsTraining.wav │ │ ├── en │ │ │ ├── 1.wav │ │ │ ├── 2.wav │ │ │ ├── 3.wav │ │ │ ├── start.wav │ │ │ ├── change.wav │ │ │ ├── endPause.wav │ │ │ ├── endRun.wav │ │ │ ├── halfRun.wav │ │ │ ├── endChange.wav │ │ │ ├── halfPause.wav │ │ │ ├── halfSerie.wav │ │ │ ├── lastSerie.wav │ │ │ ├── threeQats.wav │ │ │ ├── halfTraining.wav │ │ │ ├── lastExercise.wav │ │ │ ├── trainingEnd.wav │ │ │ ├── endChangeSmall.wav │ │ │ ├── threeQatsPause.wav │ │ │ ├── threeQatsSerie.wav │ │ │ └── threeQatsTraining.wav │ │ ├── cs_female │ │ │ ├── 1.wav │ │ │ ├── 2.wav │ │ │ ├── 3.wav │ │ │ ├── change.wav │ │ │ ├── endRun.wav │ │ │ ├── start.wav │ │ │ ├── endPause.wav │ │ │ ├── halfRun.wav │ │ │ ├── endChange.wav │ │ │ ├── halfPause.wav │ │ │ ├── halfSerie.wav │ │ │ ├── lastSerie.wav │ │ │ ├── threeQats.wav │ │ │ ├── trainingEnd.wav │ │ │ ├── halfTraining.wav │ │ │ ├── lastExercise.wav │ │ │ ├── endChangeSmall.wav │ │ │ ├── threeQatsPause.wav │ │ │ ├── threeQatsSerie.wav │ │ │ └── threeQatsTraining.wav │ │ ├── cs_male │ │ │ ├── 1.wav │ │ │ ├── 2.wav │ │ │ ├── 3.wav │ │ │ ├── start.wav │ │ │ ├── change.wav │ │ │ ├── endPause.wav │ │ │ ├── endRun.wav │ │ │ ├── halfRun.wav │ │ │ ├── endChange.wav │ │ │ ├── halfPause.wav │ │ │ ├── halfSerie.wav │ │ │ ├── lastSerie.wav │ │ │ ├── threeQats.wav │ │ │ ├── halfTraining.wav │ │ │ ├── lastExercise.wav │ │ │ ├── trainingEnd.wav │ │ │ ├── endChangeSmall.wav │ │ │ ├── threeQatsPause.wav │ │ │ ├── threeQatsSerie.wav │ │ │ └── threeQatsTraining.wav │ │ ├── en_female │ │ │ ├── 1.wav │ │ │ ├── 2.wav │ │ │ ├── 3.wav │ │ │ ├── change.wav │ │ │ ├── endRun.wav │ │ │ ├── start.wav │ │ │ ├── endPause.wav │ │ │ ├── halfRun.wav │ │ │ ├── endChange.wav │ │ │ ├── halfPause.wav │ │ │ ├── halfSerie.wav │ │ │ ├── lastSerie.wav │ │ │ ├── threeQats.wav │ │ │ ├── trainingEnd.wav │ │ │ ├── halfTraining.wav │ │ │ ├── lastExercise.wav │ │ │ ├── endChangeSmall.wav │ │ │ ├── threeQatsPause.wav │ │ │ ├── threeQatsSerie.wav │ │ │ └── threeQatsTraining.wav │ │ ├── en_male │ │ │ ├── 1.wav │ │ │ ├── 2.wav │ │ │ ├── 3.wav │ │ │ ├── start.wav │ │ │ ├── change.wav │ │ │ ├── endPause.wav │ │ │ ├── endRun.wav │ │ │ ├── halfRun.wav │ │ │ ├── endChange.wav │ │ │ ├── halfPause.wav │ │ │ ├── halfSerie.wav │ │ │ ├── lastSerie.wav │ │ │ ├── threeQats.wav │ │ │ ├── halfTraining.wav │ │ │ ├── lastExercise.wav │ │ │ ├── trainingEnd.wav │ │ │ ├── endChangeSmall.wav │ │ │ ├── threeQatsPause.wav │ │ │ ├── threeQatsSerie.wav │ │ │ └── threeQatsTraining.wav │ │ └── piip-beep │ │ │ ├── 1.wav │ │ │ ├── 2.wav │ │ │ ├── 3.wav │ │ │ ├── endRun.wav │ │ │ ├── start.wav │ │ │ ├── halfRun.wav │ │ │ ├── endChange.wav │ │ │ ├── halfPause.wav │ │ │ ├── halfSerie.wav │ │ │ ├── lastSerie.wav │ │ │ ├── threeQats.wav │ │ │ ├── trainingEnd.wav │ │ │ ├── halfTraining.wav │ │ │ ├── lastExercise.wav │ │ │ ├── endChangeSmall.wav │ │ │ ├── threeQatsPause.wav │ │ │ ├── threeQatsSerie.wav │ │ │ ├── threeQatsTraining.wav │ │ │ └── readme │ ├── locales │ │ └── bundles │ │ │ ├── Messages.properties │ │ │ └── Messages_cs.properties │ └── trainings1.xml │ ├── sun │ ├── package-info.java │ └── Timeable.java │ ├── known-plugins │ ├── Packages.java │ └── swing │ └── locales │ ├── SwingTranslator.java │ └── bundles │ └── Messages.properties ├── .gitignore ├── balkna-todo └── nbproject ├── genfiles.properties ├── project.xml └── project.properties /manifest.mf: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | X-COMMENT: Main-Class will be added automatically by build 3 | 4 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/package-info.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model; 2 | 3 | /** 4 | * all done 5 | * 6 | */ -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/app/ico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/app/ico.png -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/app/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/app/title.png -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/app/title1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/app/title1.png -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/app/title2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/app/title2.png -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs/1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs/1.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs/2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs/2.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs/3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs/3.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en/1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en/1.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en/2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en/2.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en/3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en/3.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/a01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/a01.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/a02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/a02.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/a03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/a03.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/a04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/a04.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/a05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/a05.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/a06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/a06.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/a07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/a07.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/a08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/a08.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/a09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/a09.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/a10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/a10.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/b03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/b03.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/b04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/b04.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/b05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/b05.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/b06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/b06.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/b07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/b07.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/b08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/b08.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/b09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/b09.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/b10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/b10.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/b11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/b11.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/c01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/c01.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/c05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/c05.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/c06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/c06.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/c07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/c07.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/c09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/c09.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/c10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/c10.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/exercises/c11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/exercises/c11.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/trainings/fbb2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/trainings/fbb2.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/imgs/trainings/fbb3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/imgs/trainings/fbb3.jpg -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs/start.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs/start.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en/start.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en/start.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs/change.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs/change.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs/endPause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs/endPause.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs/endRun.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs/endRun.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs/halfRun.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs/halfRun.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_female/1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_female/1.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_female/2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_female/2.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_female/3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_female/3.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_male/1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_male/1.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_male/2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_male/2.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_male/3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_male/3.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en/change.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en/change.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en/endPause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en/endPause.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en/endRun.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en/endRun.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en/halfRun.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en/halfRun.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_female/1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_female/1.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_female/2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_female/2.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_female/3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_female/3.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_male/1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_male/1.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_male/2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_male/2.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_male/3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_male/3.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/piip-beep/1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/piip-beep/1.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/piip-beep/2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/piip-beep/2.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/piip-beep/3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/piip-beep/3.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs/endChange.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs/endChange.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs/halfPause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs/halfPause.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs/halfSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs/halfSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs/lastSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs/lastSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs/threeQats.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs/threeQats.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_male/start.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_male/start.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en/endChange.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en/endChange.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en/halfPause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en/halfPause.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en/halfSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en/halfSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en/lastSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en/lastSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en/threeQats.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en/threeQats.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_male/start.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_male/start.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs/halfTraining.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs/halfTraining.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs/lastExercise.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs/lastExercise.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs/trainingEnd.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs/trainingEnd.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_female/change.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_female/change.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_female/endRun.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_female/endRun.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_female/start.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_female/start.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_male/change.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_male/change.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_male/endPause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_male/endPause.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_male/endRun.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_male/endRun.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_male/halfRun.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_male/halfRun.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en/halfTraining.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en/halfTraining.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en/lastExercise.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en/lastExercise.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en/trainingEnd.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en/trainingEnd.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_female/change.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_female/change.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_female/endRun.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_female/endRun.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_female/start.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_female/start.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_male/change.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_male/change.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_male/endPause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_male/endPause.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_male/endRun.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_male/endRun.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_male/halfRun.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_male/halfRun.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/piip-beep/endRun.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/piip-beep/endRun.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/piip-beep/start.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/piip-beep/start.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs/endChangeSmall.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs/endChangeSmall.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs/threeQatsPause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs/threeQatsPause.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs/threeQatsSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs/threeQatsSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_female/endPause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_female/endPause.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_female/halfRun.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_female/halfRun.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_male/endChange.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_male/endChange.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_male/halfPause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_male/halfPause.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_male/halfSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_male/halfSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_male/lastSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_male/lastSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_male/threeQats.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_male/threeQats.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en/endChangeSmall.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en/endChangeSmall.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en/threeQatsPause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en/threeQatsPause.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en/threeQatsSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en/threeQatsSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_female/endPause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_female/endPause.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_female/halfRun.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_female/halfRun.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_male/endChange.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_male/endChange.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_male/halfPause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_male/halfPause.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_male/halfSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_male/halfSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_male/lastSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_male/lastSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_male/threeQats.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_male/threeQats.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/piip-beep/halfRun.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/piip-beep/halfRun.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs/threeQatsTraining.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs/threeQatsTraining.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_female/endChange.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_female/endChange.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_female/halfPause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_female/halfPause.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_female/halfSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_female/halfSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_female/lastSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_female/lastSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_female/threeQats.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_female/threeQats.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_female/trainingEnd.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_female/trainingEnd.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_male/halfTraining.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_male/halfTraining.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_male/lastExercise.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_male/lastExercise.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_male/trainingEnd.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_male/trainingEnd.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en/threeQatsTraining.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en/threeQatsTraining.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_female/endChange.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_female/endChange.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_female/halfPause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_female/halfPause.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_female/halfSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_female/halfSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_female/lastSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_female/lastSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_female/threeQats.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_female/threeQats.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_female/trainingEnd.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_female/trainingEnd.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_male/halfTraining.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_male/halfTraining.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_male/lastExercise.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_male/lastExercise.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_male/trainingEnd.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_male/trainingEnd.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/piip-beep/endChange.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/piip-beep/endChange.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/piip-beep/halfPause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/piip-beep/halfPause.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/piip-beep/halfSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/piip-beep/halfSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/piip-beep/lastSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/piip-beep/lastSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/piip-beep/threeQats.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/piip-beep/threeQats.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/piip-beep/trainingEnd.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/piip-beep/trainingEnd.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_female/halfTraining.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_female/halfTraining.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_female/lastExercise.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_female/lastExercise.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_male/endChangeSmall.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_male/endChangeSmall.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_male/threeQatsPause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_male/threeQatsPause.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_male/threeQatsSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_male/threeQatsSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_female/halfTraining.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_female/halfTraining.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_female/lastExercise.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_female/lastExercise.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_male/endChangeSmall.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_male/endChangeSmall.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_male/threeQatsPause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_male/threeQatsPause.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_male/threeQatsSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_male/threeQatsSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/piip-beep/halfTraining.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/piip-beep/halfTraining.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/piip-beep/lastExercise.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/piip-beep/lastExercise.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_female/endChangeSmall.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_female/endChangeSmall.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_female/threeQatsPause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_female/threeQatsPause.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_female/threeQatsSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_female/threeQatsSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_male/threeQatsTraining.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_male/threeQatsTraining.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_female/endChangeSmall.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_female/endChangeSmall.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_female/threeQatsPause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_female/threeQatsPause.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_female/threeQatsSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_female/threeQatsSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_male/threeQatsTraining.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_male/threeQatsTraining.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/piip-beep/endChangeSmall.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/piip-beep/endChangeSmall.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/piip-beep/threeQatsPause.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/piip-beep/threeQatsPause.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/piip-beep/threeQatsSerie.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/piip-beep/threeQatsSerie.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/cs_female/threeQatsTraining.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/cs_female/threeQatsTraining.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/en_female/threeQatsTraining.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/en_female/threeQatsTraining.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/piip-beep/threeQatsTraining.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/data/soundpacks/piip-beep/threeQatsTraining.wav -------------------------------------------------------------------------------- /src/org/fbb/balkna/sun/package-info.java: -------------------------------------------------------------------------------- 1 | 2 | package org.fbb.balkna.sun; 3 | /** 4 | * This package contains copypasted classes from openjdk which android dont support and i was not able to workaround. 5 | * How shameful. 6 | * 7 | * Sorry. 8 | * 9 | */ -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/WavPlayer.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model; 2 | 3 | /** 4 | * 5 | * @author jvanek 6 | */ 7 | public interface WavPlayer { 8 | 9 | 10 | public void playAsync(); 11 | public void playSound(); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/WavPlayerProvider.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model; 2 | 3 | import java.net.URL; 4 | 5 | /** 6 | * 7 | * @author jvanek 8 | */ 9 | public interface WavPlayerProvider { 10 | 11 | WavPlayer createPlayer(URL u); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/Substituable.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model; 2 | 3 | /** 4 | * 5 | * @author jvanek 6 | */ 7 | public interface Substituable { 8 | 9 | public String getId(); 10 | 11 | public String getIdAsMcro(); 12 | 13 | public String getName(); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | 3 | # Mobile Tools for Java (J2ME) 4 | .mtj.tmp/ 5 | 6 | # Package Files # 7 | *.jar 8 | *.war 9 | *.ear 10 | 11 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 12 | hs_err_pid* 13 | /nbproject/private/ 14 | /build/ 15 | /dist/ 16 | /assembly/ 17 | -------------------------------------------------------------------------------- /balkna-todo: -------------------------------------------------------------------------------- 1 | Add weight support 2 | - based on default weight for exercise? 3 | support units? handle percentage? 4 | 5 | custom (editor) 6 | - single hang 7 | - cvik 8 | - kompelxni trenink 9 | - cyklus 10 | 11 | xml - plugin requires - url, requires for url + ex/train IDS (aby znova nestahova kdyz uz jou) 12 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/Trainable.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model; 2 | 3 | import org.fbb.balkna.model.primitives.Cycle; 4 | import org.fbb.balkna.model.primitives.Training; 5 | 6 | 7 | /** 8 | * 9 | * @author jvanek 10 | */ 11 | public interface Trainable extends Substituable, Statisticable, Exportable{ 12 | 13 | public Training getTraining(); 14 | public Cycle getCycle(); 15 | 16 | 17 | 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/ImagesSaver.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model; 2 | 3 | import java.io.File; 4 | import java.io.IOException; 5 | import java.util.List; 6 | 7 | /** 8 | * 9 | * @author jvanek 10 | */ 11 | public interface ImagesSaver { 12 | 13 | public void writeExercisesImagesToDir(File imgDir, List i) throws IOException; 14 | 15 | public void writeTrainingsImagesToDir(File imgDir, List is) throws IOException; 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/primitives/history/RecordType.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.primitives.history; 2 | 3 | import org.fbb.balkna.model.Translator; 4 | 5 | /** 6 | * 7 | * @author jvanek 8 | */ 9 | public enum RecordType { 10 | FINISHED, STARTED, CANCELED, FINISHED_WITH_SKIPPS, CONTINUED, MODIFIED, NOW /*meta element for now*/; 11 | 12 | 13 | public String toNiceString() { 14 | return Translator.R(toString()); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /nbproject/genfiles.properties: -------------------------------------------------------------------------------- 1 | build.xml.data.CRC32=1eaf3f60 2 | build.xml.script.CRC32=4cd1684f 3 | build.xml.stylesheet.CRC32=8064a381@1.75.2.48 4 | # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. 5 | # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. 6 | nbproject/build-impl.xml.data.CRC32=77ed2ba6 7 | nbproject/build-impl.xml.script.CRC32=1c1b4ea2 8 | nbproject/build-impl.xml.stylesheet.CRC32=876e7a8f@1.75.2.48 9 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/Exportable.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model; 2 | 3 | import java.io.File; 4 | import java.io.IOException; 5 | import java.util.List; 6 | 7 | /** 8 | * 9 | * @author jvanek 10 | */ 11 | public interface Exportable { 12 | 13 | public String getStory(); 14 | 15 | public String getStory(boolean html); 16 | 17 | public File export(File root, ImagesSaver im) throws IOException; 18 | 19 | public String[] getImages(); 20 | 21 | public List getExerciseImages(); 22 | ; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /nbproject/project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | org.netbeans.modules.java.j2seproject 4 | 5 | 6 | FlashBalknaModel 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/settings/BoolSettingsRecord.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.settings; 2 | 3 | /** 4 | * 5 | * @author jvanek 6 | */ 7 | public class BoolSettingsRecord extends SettingsRecord { 8 | 9 | public BoolSettingsRecord(Boolean defaultValue, String key) { 10 | super(defaultValue, key); 11 | } 12 | 13 | @Override 14 | public void fromString(String t) { 15 | if (t.equals("null")) { 16 | setValue(null); 17 | } else { 18 | setValue(Boolean.valueOf(t)); 19 | } 20 | 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/settings/StringSettingsRecord.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.settings; 2 | 3 | /** 4 | * 5 | * @author jvanek 6 | */ 7 | public class StringSettingsRecord extends SettingsRecord{ 8 | 9 | public StringSettingsRecord(String defaultValue, String key) { 10 | super(defaultValue, key); 11 | } 12 | 13 | 14 | @Override 15 | public void fromString(String t){ 16 | setValue(t); 17 | } 18 | 19 | @Override 20 | public String writeString(){ 21 | return value; 22 | } 23 | 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/settings/IntSettingsRecord.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.settings; 2 | 3 | /** 4 | * 5 | * @author jvanek 6 | */ 7 | public class IntSettingsRecord extends SettingsRecord{ 8 | 9 | public IntSettingsRecord(Integer defaultValue, String key) { 10 | super(defaultValue, key); 11 | } 12 | 13 | 14 | @Override 15 | public void fromString(String t){ 16 | if (t.equals("null")){ 17 | setValue(null); 18 | } else { 19 | setValue(Integer.valueOf(t)); 20 | } 21 | 22 | } 23 | 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/graphs/Steppable.java: -------------------------------------------------------------------------------- 1 | 2 | package org.fbb.balkna.model.graphs; 3 | 4 | import java.text.SimpleDateFormat; 5 | 6 | /** 7 | * 8 | * @author jvanek 9 | * @param 10 | */ 11 | public interface Steppable extends Comparable{ 12 | 13 | public static final SimpleDateFormat sdfMore = new SimpleDateFormat("d.M"); 14 | public static final SimpleDateFormat sdfDay = new SimpleDateFormat("HH:mm"); 15 | 16 | public long getStep() ; 17 | 18 | public void setStep(long step) ; 19 | 20 | public void setEasyFormater(SimpleDateFormat easyFormater) ; 21 | 22 | public SimpleDateFormat getEasyFormater(); 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/primitives/history/NonRepeatedArrayList.java: -------------------------------------------------------------------------------- 1 | 2 | package org.fbb.balkna.model.primitives.history; 3 | 4 | import java.util.ArrayList; 5 | 6 | /** 7 | * 8 | * @author jvanek 9 | * @param 10 | */ 11 | public class NonRepeatedArrayList extends ArrayList { 12 | 13 | @Override 14 | public synchronized boolean add(E e) { 15 | if(this.isEmpty()){ 16 | return super.add(e); 17 | 18 | } else { 19 | if (!super.get(super.size()-1).equals(e)){ 20 | return super.add(e); 21 | } 22 | } 23 | return false; 24 | } 25 | 26 | 27 | 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/merged/uncompressed/timeUnits/TrainingTime.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.merged.uncompressed.timeUnits; 2 | 3 | import org.fbb.balkna.model.Model; 4 | import org.fbb.balkna.model.SoundProvider; 5 | import org.fbb.balkna.model.merged.MergedExercise; 6 | 7 | /** 8 | * 9 | * @author jvanek 10 | */ 11 | public class TrainingTime extends BasicTime { 12 | 13 | public TrainingTime(int originalValue, MergedExercise originator) { 14 | super(originalValue, originator); 15 | } 16 | 17 | @Override 18 | public void play() { 19 | if (Model.getModel().isLaud()) { 20 | SoundProvider.getInstance().getPSstart().playAsync(); 21 | } 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/soundpacks/piip-beep/readme: -------------------------------------------------------------------------------- 1 | vysoka hlasita - VH 2 | divna ticha - DT 3 | 4 | 1.wav VH 5 | 2.wav DT DT 6 | 3.wav VH VH VH 7 | change.wav ? 8 | endChange.wav VH VVVVHHHHHH VVVVVHHHHHHH DT DDDDTTTTTT 9 | endPause.wav ? 10 | endRun.wav VH VVVVHHHHHH 11 | halfPause.wav DT VH 12 | halfRun.wav VH DT 13 | halfSerie.wav DT DDDDTTT 14 | halfTraining.wav DDDDTTT DDDDTTT 15 | lastExercise.wav dddddddhhhhhhhhhhh dddddddhhhhhhhhhhh 16 | lastSerie.wav dddddddhhhhhhhhhhh 17 | start.wav VVVVVHHHHH 18 | threeQatsPause.wav DT DT VH VH 19 | threeQatsSerie.wav DT DT DDDDTTT 20 | threeQatsTraining.wav DDDDTTT DDDDTTT DDDDTTT 21 | threeQats.wav VH DT VH DT 22 | trainingEnd.wav VH DH dddddddhhhhhhhhhhh 23 | 24 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/Statisticable.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.BufferedWriter; 5 | import java.io.File; 6 | import java.io.IOException; 7 | import java.util.List; 8 | import org.fbb.balkna.model.primitives.history.Record; 9 | import org.fbb.balkna.model.primitives.history.StatisticHelper; 10 | 11 | /** 12 | * 13 | * @author jvanek 14 | */ 15 | public interface Statisticable { 16 | 17 | public String getId(); 18 | public void load(BufferedReader br) throws IOException; 19 | public void save(BufferedWriter bw) throws IOException; 20 | public List getRecords(); 21 | public File getFile(); 22 | public void addRecord(Record r); 23 | public StatisticHelper getStatsHelper(); 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/merged/uncompressed/timeUnits/PausaTime.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.merged.uncompressed.timeUnits; 2 | 3 | import org.fbb.balkna.model.Model; 4 | import org.fbb.balkna.model.SoundProvider; 5 | import org.fbb.balkna.model.Translator; 6 | import org.fbb.balkna.model.merged.MergedExercise; 7 | 8 | /** 9 | * 10 | * @author jvanek 11 | */ 12 | public class PausaTime extends BasicTime { 13 | 14 | public PausaTime(int originalValue, MergedExercise originator) { 15 | super(originalValue, originator); 16 | } 17 | 18 | @Override 19 | public String getInformaiveTitle() { 20 | return Translator.R("pause"); 21 | } 22 | 23 | @Override 24 | public void play() { 25 | if (Model.getModel().isLaud()) { 26 | SoundProvider.getInstance().getPSendRun().playAsync(); 27 | } 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/merged/uncompressed/timeUnits/BigRestTime.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.merged.uncompressed.timeUnits; 2 | 3 | import org.fbb.balkna.model.Model; 4 | import org.fbb.balkna.model.SoundProvider; 5 | import org.fbb.balkna.model.Translator; 6 | import org.fbb.balkna.model.merged.MergedExercise; 7 | 8 | /** 9 | * 10 | * @author jvanek 11 | */ 12 | public class BigRestTime extends PausaTime { 13 | 14 | public BigRestTime(int originalValue, MergedExercise originator) { 15 | super(originalValue, originator); 16 | } 17 | 18 | @Override 19 | public String getInformaiveTitle() { 20 | return Translator.R("PauseWillChange"); 21 | } 22 | 23 | @Override 24 | public void play() { 25 | if (Model.getModel().isLaud()) { 26 | SoundProvider.getInstance().getPSendChange().playAsync(); 27 | } 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/merged/uncompressed/timeUnits/SmallRestTime.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.merged.uncompressed.timeUnits; 2 | 3 | import org.fbb.balkna.model.Model; 4 | import org.fbb.balkna.model.SoundProvider; 5 | import org.fbb.balkna.model.Translator; 6 | import org.fbb.balkna.model.merged.MergedExercise; 7 | 8 | /** 9 | * when BigRestime should be used, but ids are equals 10 | * 11 | * @author jvanek 12 | */ 13 | public class SmallRestTime extends BigRestTime { 14 | 15 | public SmallRestTime(int originalValue, MergedExercise originator) { 16 | super(originalValue, originator); 17 | } 18 | 19 | @Override 20 | public String getInformaiveTitle() { 21 | return Translator.R("PauseWillChangeSlightly"); 22 | } 23 | 24 | @Override 25 | public void play() { 26 | if (Model.getModel().isLaud()) { 27 | SoundProvider.getInstance().getPSendChangeSmall().playAsync(); 28 | } 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/PluginFactoryProvider.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model; 2 | 3 | import java.net.URL; 4 | import java.util.List; 5 | import org.fbb.balkna.model.utils.JavaPluginProvider; 6 | 7 | /** 8 | * 9 | * @author jvanek 10 | */ 11 | public abstract class PluginFactoryProvider { 12 | 13 | private static class PluginFactoryProviderHolder { 14 | 15 | //https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java 16 | //https://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom 17 | private static PluginFactoryProvider INSTANCE; 18 | 19 | private static PluginFactoryProvider getInstance() { 20 | if (INSTANCE == null) { 21 | INSTANCE = new JavaPluginProvider(); 22 | } 23 | return PluginFactoryProviderHolder.INSTANCE; 24 | } 25 | 26 | 27 | } 28 | 29 | public static PluginFactoryProvider getInstance() { 30 | return PluginFactoryProviderHolder.getInstance(); 31 | } 32 | 33 | 34 | 35 | public abstract void addResource(URL u) throws Exception ; 36 | public abstract List searchResourceInPlugins(String regex) throws Exception ; 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/locales/bundles/Messages.properties: -------------------------------------------------------------------------------- 1 | # Default (English) model messages 2 | 3 | AppTitle=Flash Boulder Balkna 4 | 5 | RNoResource=No text found for: {0} 6 | 7 | TrainingMoreInfo=Welcome to FlashBalkna trainng program! 8 | GetWarm=Get warm and grab the board! 9 | train=Train: {0} 10 | rest=Rest: {0} 11 | iterations=Iterations: {0}x 12 | finalPause=Final pause: {0} 13 | Next=Next: 14 | Now=Now! 15 | Ende=Finished! 16 | PauseWillChange=Pause - exercise change! 17 | PauseWillChangeSlightly=Pause - exercise timing change! 18 | pause=Pause! 19 | last=last 20 | 21 | restDay=Suggested rest. 22 | 23 | Pause=Pause 24 | Continue=Continue.... 25 | 26 | overview=Overview: 27 | details=Details: 28 | 29 | TotalTime=Total time: {0} 30 | TotalTimeExercise=Total time exercise: {0} 31 | TotalTimeResting=Total time resting: {0} 32 | TotalExercises=Total exercises: {0} 33 | TotalDifferentExercises=Total different exercises: {0} 34 | 35 | WarningTimeShift=Warning, time modifiers applied! 36 | TrainingsShift=Trainings 37 | PausesShift=Pauses 38 | IterationsShift=Iterations 39 | RestsShift=Rests 40 | 41 | FINISHED=Finished 42 | STARTED=Started 43 | CANCELED=Canceled 44 | FINISHED_WITH_SKIPPS=Finished with skipping 45 | CONTINUED=Continued 46 | MODIFIED=Modified 47 | NOW=Now -------------------------------------------------------------------------------- /src/org/fbb/balkna/known-plugins: -------------------------------------------------------------------------------- 1 | #split on two or more semicolons 2 | #state(only stable/testing recognized);;home page;;latest download bits;;description 3 | stable;;https://github.com/judovana/FlashBalknaTestPlugin;;https://github.com/judovana/FlashBalknaTestPlugin/releases/download/FlashBalknaTestPlugin-3.0/FlashBalknaTestPlugin_3.0.jar;;Exemplar plugin with demonstrations of capabilities. in Addition contains easy/advanced and advance/hard trainings and 6 long cycles based on those. 4 | stable;;https://github.com/judovana/FlashBalknaAixPlugin;;https://github.com/judovana/FlashBalknaAixPlugin/releases/download/FlashBalknaAixPlugin-0.3/FlashBalknaAixPlugin_0.3.jar;;Plugin containing Jirous' cycles for Aix PU board. 5 | testing;;https://github.com/judovana/FlashBalknaPluginMontana201605;;https://github.com/judovana/FlashBalknaPluginMontana201605/releases/download/FlashBalknaPluginMontana201605-0.2/FlashBalknaPluginMontana201605_0.2.jar;;30+ weeks long long-term-cycle based on article "powering fingers" from Montana 2016/05. 6 | testing;;https://github.com/judovana/FlashBalknaMultiTrainerPlugin;;https://github.com/judovana/FlashBalknaMultiTrainerPlugin/releases/download/FlashBalknaMultiTrainerPlugin_0.5/FlashBalknaMultiTrainerPlugin_0.5.jar;;trx 15 exercises and training, + multitrainer 12 exercises and 8 trainings + Sasa's workout 8 exercises and 3 trainings. All for begginers. 7 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/utils/TimeUtils.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.utils; 2 | 3 | import org.fbb.balkna.model.merged.uncompressed.MainTimer; 4 | import org.fbb.balkna.model.merged.uncompressed.timeUnits.BasicTime; 5 | 6 | /** 7 | * 8 | * @author jvanek 9 | */ 10 | public class TimeUtils { 11 | 12 | public static String secondsToHours(int s) { 13 | int h = s / 3600; 14 | int q = s % 3600; 15 | int m = q / 60; 16 | int ss = q % 60; 17 | return align(h) + ":" + align(m) + ":" + align(ss); 18 | } 19 | 20 | public static String secondsToMinutes(int s) { 21 | int m = s / 60; 22 | int ss = s % 60; 23 | return align(m) + ":" + align(ss); 24 | } 25 | 26 | private static String align(int i) { 27 | String s = String.valueOf(i); 28 | if (s.length() == 0) { 29 | return "00" + s; 30 | } 31 | if (s.length() == 1) { 32 | return "0" + s; 33 | } 34 | return s; 35 | } 36 | 37 | public static String getRemainingTime(BasicTime c, MainTimer model) { 38 | if (c != null) { 39 | return TimeUtils.secondsToHours(c.getCurrentValue() + model.getFutureTime()) + "/" + TimeUtils.secondsToHours(model.getTotalTime()); 40 | } else { 41 | return TimeUtils.secondsToHours(model.getFutureTime()) + "/" + TimeUtils.secondsToHours(model.getTotalTime()); 42 | } 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/utils/XmlConstants.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.utils; 2 | 3 | /** 4 | * 5 | * @author jvanek 6 | */ 7 | public class XmlConstants { 8 | 9 | public static final String LOCALE = "locale"; 10 | public static final String ID = "id"; 11 | public static final String NAME = "name"; 12 | public static final String DESCRIPTION = "description"; 13 | public static final String REST = "rest"; 14 | public static final String ITERATIONS = "iterations"; 15 | public static final String PAUSE = "pause"; 16 | public static final String TIME = "time"; 17 | public static final String DEFAULTS = "defaults"; 18 | public static final String IMAGES = "images"; 19 | public static final String IMAGE = "image"; 20 | public static final String DESCRIPTIONS = "descriptions"; 21 | public static final String NAMES = "names"; 22 | public static final String EXERCISE = "exercise"; 23 | public static final String EXERCISES_SET = "exercises-set"; 24 | public static final String TRAINING = "training"; 25 | public static final String TRAININGS = "trainings"; 26 | public static final String CYCLE = "cycle"; 27 | public static final String EXERCISES = "exercises"; 28 | public static final String OVERRIDES = "overrides"; 29 | public static final String CHANGES = "changes"; 30 | public static final String SUGGESTBREAK = "suggestbreak"; 31 | public static final String SET_DEFAULTS = "set-defaults"; 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/locales/bundles/Messages_cs.properties: -------------------------------------------------------------------------------- 1 | # Czech model messages # 2 | 3 | AppTitle=Flash Boulder Balkna 4 | 5 | RNoResource=Nenalezen text pro: {0} 6 | 7 | TrainingMoreInfo=V\u00edtejte v tr\u00e9ninkov\u00e9 aplikaci FlashBalkna! 8 | GetWarm=Zah\u0159ej se a chytni balknu! 9 | train=Tr\u00e9nink: {0} 10 | rest=Odpo\u010dinek: {0} 11 | iterations=Opakovan\u00ed: {0}x 12 | finalPause=Z\u00e1v\u011bre\u010dn\u00e1 pauza: {0} 13 | Next=N\u00e1sleduj\u00edc\u00ed: 14 | Now=Prob\u00edhaj\u00edc\u00ed! 15 | Ende=\u00daplnej konec! 16 | PauseWillChange=Pauza - bude zm\u011bna! 17 | PauseWillChangeSlightly=Pauza - bude mal\u00e1 zm\u011bna! 18 | pause=Pauza! 19 | last=posledn\u00ed 20 | 21 | restDay=Doporu\u010den odpo\u010dinek. 22 | 23 | Pause=Pauza 24 | Continue=Pokra\u010dovat.... 25 | 26 | overview=P\u0159ehled: 27 | details=Detaily: 28 | 29 | TotalTime=Celkov\u00fd \u010das: {0} 30 | TotalTimeExercise=Celkem cvi\u010den\u00ed: {0} 31 | TotalTimeResting=Celkem odpo\u010dink\u016f: {0} 32 | TotalExercises=Cvi\u010debn\u00edch celk\u016f: {0} 33 | TotalDifferentExercises=R\u016fzn\u00fdch cvik\u016f: {0} 34 | 35 | WarningTimeShift=Pozor, modifik\u00e1tory tr\u00e9ninku zapnuty! 36 | TrainingsShift=Tr\u00e9ninky 37 | PausesShift=Pauzy 38 | IterationsShift=Iterace 39 | RestsShift=Odpo\u010dinky 40 | 41 | FINISHED=Dokon\u010deno 42 | STARTED=Za\u010dnuto 43 | CANCELED=Zru\u0161eno 44 | FINISHED_WITH_SKIPPS=Dokon\u010deno s p\u0159eskakov\u00e1n\u00edm 45 | CONTINUED=Pokra\u010dov\u00e1no 46 | MODIFIED=Upraveno 47 | NOW=Nyn\u00ed -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/primitives/LocalisedString.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.primitives; 2 | 3 | import java.util.List; 4 | import org.fbb.balkna.model.Translator; 5 | 6 | public class LocalisedString { 7 | 8 | public static String getMainLocale() { 9 | return Translator.getLocale(); 10 | } 11 | 12 | static String findLocalised(List localisedNames) { 13 | for (LocalisedString s : localisedNames) { 14 | if (s.locale.equals(getMainLocale())) { 15 | return s.string; 16 | } 17 | } 18 | for (LocalisedString s : localisedNames) { 19 | if (getMainLocale().matches(".*" + s.locale)) { 20 | return s.string; 21 | } 22 | } 23 | for (LocalisedString s : localisedNames) { 24 | if (getMainLocale().matches(s.locale + ".*")) { 25 | return s.string; 26 | } 27 | } 28 | for (LocalisedString s : localisedNames) { 29 | if (getMainLocale().matches(".*" + s.locale + ".*")) { 30 | return s.string; 31 | } 32 | } 33 | return null; 34 | } 35 | private final String locale; 36 | private final String string; 37 | 38 | public LocalisedString(String locale, String string) { 39 | this.locale = locale; 40 | this.string = string; 41 | } 42 | 43 | public String getLocale() { 44 | return locale; 45 | } 46 | 47 | public String getString() { 48 | return string; 49 | } 50 | 51 | @Override 52 | public String toString() { 53 | return locale+"@"+string; 54 | } 55 | 56 | 57 | 58 | } 59 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/sun/Timeable.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 1995, Oracle and/or its affiliates. All rights reserved. 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 | * 5 | * This code is free software; you can redistribute it and/or modify it 6 | * under the terms of the GNU General Public License version 2 only, as 7 | * published by the Free Software Foundation. Oracle designates this 8 | * particular file as subject to the "Classpath" exception as provided 9 | * by Oracle in the LICENSE file that accompanied this code. 10 | * 11 | * This code is distributed in the hope that it will be useful, but WITHOUT 12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 | * version 2 for more details (a copy is included in the LICENSE file that 15 | * accompanied this code). 16 | * 17 | * You should have received a copy of the GNU General Public License version 18 | * 2 along with this work; if not, write to the Free Software Foundation, 19 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 | * 21 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 | * or visit www.oracle.com if you need additional information or have any 23 | * questions. 24 | */ 25 | 26 | package org.fbb.balkna.sun; 27 | 28 | /** 29 | * This interface is used by the Timer class. A class that uses 30 | * Timer objects must implement this interface. 31 | * 32 | * @see Timer 33 | * @author Patrick Chan 34 | */ 35 | public interface Timeable { 36 | /** 37 | * This method is executed every time a timer owned by this 38 | * object ticks. An object can own more than one timer but 39 | * all timers call this method when they tick; 40 | * you can use the supplied timer parameter to determine 41 | * which timer has ticked. 42 | * @param timer a handle to the timer that has just ticked. 43 | */ 44 | public void tick(Timer timer); 45 | } 46 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/settings/SettingsRecord.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.settings; 2 | 3 | import java.io.BufferedWriter; 4 | import java.io.IOException; 5 | 6 | /** 7 | * 8 | * @author jvanek 9 | */ 10 | public abstract class SettingsRecord { 11 | 12 | T value; 13 | final T defaultValue; 14 | final String key; 15 | 16 | public SettingsRecord(T defaultValue, String key) { 17 | this.value = defaultValue; 18 | this.defaultValue = defaultValue; 19 | this.key = key; 20 | } 21 | 22 | public T getDefaultValue() { 23 | return defaultValue; 24 | } 25 | 26 | public T getValue() { 27 | return value; 28 | } 29 | 30 | public void setValue(T value) { 31 | this.value = value; 32 | } 33 | 34 | public String getKey() { 35 | return key; 36 | } 37 | 38 | 39 | 40 | public abstract void fromString(String t); 41 | 42 | public String writeString() { 43 | return value.toString(); 44 | } 45 | 46 | public void writeObjectAsPropertyToWriter(BufferedWriter fw) throws IOException { 47 | writeObjectAsProperty(key, value, defaultValue, fw); 48 | 49 | } 50 | 51 | public String defaultAsString() { 52 | return " Default: " + objectAsPropertyString(key, defaultValue); 53 | } 54 | 55 | 56 | public String valueAsString() { 57 | return objectAsPropertyString(key, value); 58 | } 59 | 60 | private static String objectAsPropertyString(String key, Object value) { 61 | if (value == null) { 62 | return key + "=null"; 63 | } 64 | return (key + "=" + value.toString()); 65 | } 66 | 67 | private void writeObjectAsProperty(String key, T value, T defult, BufferedWriter fw) throws IOException { 68 | if ((value == null && defult != null)) { 69 | fw.write(objectAsPropertyString(key, value)); 70 | fw.newLine(); 71 | return; 72 | } 73 | if ((value == null && defult == null) || value.equals(defult)) { 74 | //not saving ddefaults 75 | } else { 76 | fw.write(objectAsPropertyString(key, value)); 77 | fw.newLine(); 78 | } 79 | } 80 | 81 | } 82 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/Packages.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna; 2 | 3 | import java.net.URL; 4 | import java.util.ArrayList; 5 | import java.util.HashSet; 6 | import java.util.List; 7 | import java.util.Set; 8 | import org.fbb.balkna.model.PluginFactoryProvider; 9 | 10 | /** 11 | * 12 | * @author jvanek 13 | */ 14 | public class Packages { 15 | 16 | public static final Package PACKAGE_ROOT = Packages.class.getPackage(); 17 | public static final String PACKAGE_ROOT_NAME = PACKAGE_ROOT.getName(); 18 | public static final String DATA = PACKAGE_ROOT_NAME + ".data"; 19 | public static final String IMAGES = DATA + ".imgs"; 20 | public static final String IMAGES_APP = IMAGES + ".app"; 21 | public static final String IMAGES_EXE = IMAGES + ".exercises"; 22 | public static final String IMAGES_TRA = IMAGES + ".trainings"; 23 | public static final String SOUND_PACK = DATA + ".soundpacks"; 24 | private static final String[] INTERNAL_SOUND_PACKS = {"cs", "cs_female", "cs_male", "en", "en_female", "en_male", "piip-beep"}; 25 | public static final String[] LANGUAGES = {" ", "cs", "en"}; 26 | public static final String DEFAULT_SOUND_PACK = INTERNAL_SOUND_PACKS[0]; 27 | 28 | public static String[] SOUND_PACKS() { 29 | Set pluginPacks = new HashSet(0); 30 | try { 31 | List allWavs = PluginFactoryProvider.getInstance().searchResourceInPlugins(".*\\.wav"); 32 | for (URL wav : allWavs) { 33 | String file = wav.getFile(); 34 | String[] soundPack = file.split("[/\\\\]+"); 35 | pluginPacks.add(soundPack[soundPack.length - 2]); 36 | } 37 | 38 | } catch (Exception ex) { 39 | ex.printStackTrace(); 40 | } 41 | String[] SOUND_PACKS = new String[INTERNAL_SOUND_PACKS.length + pluginPacks.size()]; 42 | for (int i = 0; i < INTERNAL_SOUND_PACKS.length; i++) { 43 | String IS = INTERNAL_SOUND_PACKS[i]; 44 | SOUND_PACKS[i] = IS; 45 | } 46 | int i =0; 47 | for (String pluginPack : pluginPacks) { 48 | SOUND_PACKS[i+INTERNAL_SOUND_PACKS.length] = pluginPack; 49 | i++; 50 | } 51 | return SOUND_PACKS; 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/graphs/GatheredDay.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.graphs; 2 | 3 | import java.text.SimpleDateFormat; 4 | import java.util.ArrayList; 5 | import java.util.Date; 6 | import java.util.List; 7 | import org.fbb.balkna.model.primitives.history.RecordWithOrigin; 8 | 9 | /** 10 | * 11 | * @author jvanek 12 | */ 13 | public class GatheredDay implements Steppable { 14 | 15 | private final Date day; 16 | private final List sources = new ArrayList(); 17 | private SimpleDateFormat easyFormater; 18 | private long step; 19 | 20 | public GatheredDay(Date day) { 21 | this.day = day; 22 | } 23 | 24 | public GatheredDay(Date day, RecordWithOrigin gathered) { 25 | this(day); 26 | sources.add(gathered); 27 | } 28 | 29 | /** 30 | * @return the day 31 | */ 32 | public Date getDay() { 33 | return day; 34 | } 35 | 36 | @Override 37 | public int compareTo(GatheredDay o) { 38 | return (int) (this.day.getTime() - o.day.getTime()); 39 | } 40 | 41 | @Override 42 | public long getStep() { 43 | return step; 44 | } 45 | 46 | @Override 47 | public void setStep(long step) { 48 | this.step = step; 49 | } 50 | 51 | @Override 52 | public void setEasyFormater(SimpleDateFormat easyFormater) { 53 | this.easyFormater = easyFormater; 54 | } 55 | 56 | @Override 57 | public SimpleDateFormat getEasyFormater() { 58 | return easyFormater; 59 | } 60 | 61 | public String getAdaptedDateTime() { 62 | return easyFormater.format(day); 63 | } 64 | 65 | public void addRecord(RecordWithOrigin source) { 66 | sources.add(source); 67 | } 68 | 69 | public List getSources() { 70 | return sources; 71 | } 72 | 73 | @Override 74 | public String toString() { 75 | String s = day.toString(); 76 | if (getEasyFormater() != null) { 77 | s = getAdaptedDateTime(); 78 | } 79 | s += ": " + clazzesToString(sources); 80 | return s; 81 | } 82 | 83 | private String clazzesToString(List sources) { 84 | StringBuilder sb = new StringBuilder(); 85 | for (RecordWithOrigin source : sources) { 86 | sb.append(source.toString()).append("; "); 87 | } 88 | return sb.toString(); 89 | } 90 | 91 | } 92 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/primitives/SetDefaults.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.primitives; 2 | 3 | import java.util.List; 4 | import static org.fbb.balkna.model.utils.XmlConstants.ITERATIONS; 5 | import static org.fbb.balkna.model.utils.XmlConstants.PAUSE; 6 | import static org.fbb.balkna.model.utils.XmlConstants.REST; 7 | import static org.fbb.balkna.model.utils.XmlConstants.TIME; 8 | import org.fbb.balkna.model.utils.XmlUtils; 9 | import org.w3c.dom.Element; 10 | import org.w3c.dom.Node; 11 | 12 | /** 13 | * 14 | * @author jvanek 15 | */ 16 | public class SetDefaults { 17 | 18 | private static final SetDefaults empty = new SetDefaults(null, null, null, null); 19 | 20 | private final Integer time; //default time of exercise in seconds 21 | private final Integer pause; //default time of pause in seconds 22 | private final Integer iterations; //defualt number of iterations 23 | private final Integer rest; //defualt time of rest after all iterations 24 | 25 | private SetDefaults(Integer t, Integer p, Integer i, Integer r) { 26 | time = t; 27 | pause = p; 28 | iterations = i; 29 | rest = r; 30 | } 31 | 32 | public Integer getIterations() { 33 | return iterations; 34 | } 35 | 36 | public Integer getPause() { 37 | return pause; 38 | } 39 | 40 | public Integer getRest() { 41 | return rest; 42 | } 43 | 44 | public Integer getTime() { 45 | return time; 46 | } 47 | 48 | static SetDefaults emptyDeafults() { 49 | return empty; 50 | } 51 | 52 | public static SetDefaults parse(final Node node) { 53 | Integer time = null; 54 | Integer pause = null; 55 | Integer iterations = null; 56 | Integer rest = null; 57 | List interlayer = XmlUtils.getRealChilds(node); 58 | for (Element nn : interlayer) { 59 | //jdk6 comaptible:( 60 | if (nn.getNodeName().equals(TIME)) { 61 | time = Integer.valueOf(nn.getTextContent()); 62 | } else if (nn.getNodeName().equals(PAUSE)) { 63 | pause = Integer.valueOf(nn.getTextContent()); 64 | } else if (nn.getNodeName().equals(ITERATIONS)) { 65 | iterations = Integer.valueOf(nn.getTextContent()); 66 | } else if (nn.getNodeName().equals(REST)) { 67 | rest = Integer.valueOf(nn.getTextContent()); 68 | } 69 | } 70 | return new SetDefaults(time, pause, iterations, rest); 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/merged/MergedExerciseWrapper.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.merged; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | import org.fbb.balkna.model.merged.uncompressed.timeUnits.BasicTime; 6 | 7 | /** 8 | * 9 | * @author jvanek 10 | */ 11 | public class MergedExerciseWrapper { 12 | 13 | private final List src; 14 | 15 | public MergedExerciseWrapper(List r) { 16 | this.src = r; 17 | } 18 | 19 | public int getSize() { 20 | return src.size(); 21 | } 22 | 23 | public int getIterations() { 24 | int i = 0; 25 | for (MergedExercise src1 : src) { 26 | i += src1.getIterations(); 27 | } 28 | return i; 29 | } 30 | 31 | public int getActiveTime() { 32 | int i = 0; 33 | for (MergedExercise src1 : src) { 34 | i += src1.getIterations() * src1.getTime(); 35 | } 36 | return i; 37 | } 38 | 39 | public int getRestTime() { 40 | int i = 0; 41 | for (MergedExercise src1 : src) { 42 | i += (src1.getIterations() - 1) * src1.getPause() + src1.getRest(); 43 | } 44 | return i; 45 | } 46 | 47 | public String getStory(boolean html) { 48 | StringBuilder sb = new StringBuilder(); 49 | int i = 0; 50 | for (MergedExercise src1 : src) { 51 | i++; 52 | sb.append(src1.getStory(i, html)); 53 | breakLine(html, sb); 54 | 55 | } 56 | return sb.toString(); 57 | } 58 | 59 | private void breakLine(boolean html, StringBuilder sb) { 60 | if (html) { 61 | sb.append("
"); 62 | } 63 | sb.append("\n"); 64 | } 65 | 66 | public int getTime() { 67 | return getRestTime() + getActiveTime(); 68 | } 69 | 70 | public List decompress() { 71 | List r = new ArrayList(); 72 | for (int i = 0; i < src.size(); i++) { 73 | MergedExercise src1 = src.get(i); 74 | List decompressed = src1.decompress(null); 75 | if (i < src.size() - 1) { 76 | MergedExercise src2 = src.get(i + 1); 77 | List decompressed2 = src2.decompress(null); 78 | if (decompressed2.size() > 0) { 79 | decompressed = src1.decompress(decompressed2.get(0)); 80 | } 81 | } 82 | r.addAll(decompressed); 83 | } 84 | return r; 85 | 86 | } 87 | 88 | } 89 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/primitives/history/RecordWithOrigin.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.fbb.balkna.model.primitives.history; 7 | 8 | import org.fbb.balkna.model.Substituable; 9 | import org.fbb.balkna.model.primitives.Cycle; 10 | import org.fbb.balkna.model.primitives.Exercise; 11 | import org.fbb.balkna.model.primitives.Training; 12 | import org.fbb.balkna.swing.locales.SwingTranslator; 13 | 14 | /** 15 | * 16 | * @author jvanek 17 | */ 18 | public class RecordWithOrigin implements Comparable { 19 | 20 | public static RecordWithOrigin NOW() { 21 | return new RecordWithOrigin(new Substituable() { 22 | 23 | @Override 24 | public String getId() { 25 | return null; 26 | } 27 | 28 | @Override 29 | public String getName() { 30 | return "* *"; 31 | } 32 | 33 | @Override 34 | public String getIdAsMcro() { 35 | return null; 36 | } 37 | }, Record.create(RecordType.NOW, null)) { 38 | @Override 39 | public String toString() { 40 | return this.getRecord().toNiceString(); 41 | } 42 | }; 43 | } 44 | 45 | private final Substituable origin; 46 | private final Record record; 47 | 48 | public static boolean SHOW_CLASS=true; 49 | 50 | public RecordWithOrigin(Substituable origin, Record record) { 51 | this.origin = origin; 52 | this.record = record; 53 | } 54 | 55 | public Substituable getOrigin() { 56 | return origin; 57 | } 58 | 59 | public Record getRecord() { 60 | return record; 61 | } 62 | 63 | @Override 64 | public int compareTo(RecordWithOrigin t) { 65 | //overflows 66 | //return (int) (record.getWhen() - t.record.getWhen()); 67 | return this.record.getWhen()t.record.getWhen()?1:0; 69 | } 70 | 71 | @Override 72 | public String toString() { 73 | return record.toNiceString() + " - " + origin.getName() + addClass(); 74 | } 75 | 76 | private String classToString() { 77 | if (origin instanceof Exercise) { 78 | return (SwingTranslator.R("mainTabExercise")); 79 | } else if (origin instanceof Training) { 80 | return (SwingTranslator.R("mainTabTrainings")); 81 | } else if (origin instanceof Cycle) { 82 | return (SwingTranslator.R("mainTabCycles")); 83 | } else { 84 | return "?"; 85 | } 86 | } 87 | 88 | private String addClass() { 89 | if (!SHOW_CLASS){ 90 | return ""; 91 | } 92 | return " (" + classToString() + ")"; 93 | } 94 | 95 | } 96 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/primitives/Cycles.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.primitives; 2 | 3 | import java.io.File; 4 | import java.util.ArrayList; 5 | import java.util.Collections; 6 | import java.util.List; 7 | import org.fbb.balkna.model.Model; 8 | import org.fbb.balkna.model.primitives.history.Record; 9 | import org.fbb.balkna.model.primitives.history.RecordWithOrigin; 10 | import org.fbb.balkna.model.utils.XmlConstants; 11 | import org.fbb.balkna.model.utils.XmlUtils; 12 | import org.w3c.dom.Element; 13 | import org.w3c.dom.Node; 14 | 15 | /** 16 | * 17 | * @author jvanek 18 | */ 19 | public class Cycles { 20 | 21 | public List gatherStatistics() { 22 | String[] names = getStatsDir().list(); 23 | ArrayList a = new ArrayList(names.length); 24 | for (String name : names) { 25 | Cycle i = getCycleById(name); 26 | if (i != null) { 27 | List rs = i.getRecords(); 28 | for (Record r : rs) { 29 | a.add(new RecordWithOrigin(i, r)); 30 | } 31 | } 32 | } 33 | return a; 34 | } 35 | 36 | private static class CyclesHolder { 37 | 38 | public static Cycles instance; 39 | 40 | public static Cycles getInstance() { 41 | if (instance == null) { 42 | instance = new Cycles(); 43 | } 44 | return instance; 45 | } 46 | 47 | public static Cycles reloadInstance() { 48 | instance = new Cycles(); 49 | return instance; 50 | } 51 | } 52 | 53 | public static Cycles getInstance() { 54 | return CyclesHolder.getInstance(); 55 | } 56 | 57 | public static Cycles reloadInstance() { 58 | return CyclesHolder.reloadInstance(); 59 | } 60 | 61 | private final List cycles = new ArrayList(); 62 | 63 | public Cycles() { 64 | try { 65 | loadDefaults(); 66 | } catch (Exception ex) { 67 | throw new RuntimeException(ex); 68 | } 69 | } 70 | 71 | private void loadDefaults() { 72 | try { 73 | List all = XmlUtils.getDataNodes("cycles", XmlConstants.CYCLE); 74 | for (Node node : all) { 75 | Cycle ex = Cycle.parse(node); 76 | cycles.add(ex); 77 | } 78 | } catch (Exception ex) { 79 | throw new RuntimeException(ex); 80 | } 81 | 82 | } 83 | 84 | public List getCycles() { 85 | return Collections.unmodifiableList(cycles); 86 | } 87 | 88 | public static File getStatsDir() { 89 | File f = new File(Model.getModel().getStatsDir(), "cycles"); 90 | if (!f.exists()) { 91 | f.mkdirs(); 92 | } 93 | return f; 94 | } 95 | 96 | public Cycle getCycleById(String id) { 97 | for (Cycle training : cycles) { 98 | if (training.getId().equals(id)) { 99 | return training; 100 | } 101 | } 102 | return null; 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /nbproject/project.properties: -------------------------------------------------------------------------------- 1 | annotation.processing.enabled=true 2 | annotation.processing.enabled.in.editor=false 3 | annotation.processing.processors.list= 4 | annotation.processing.run.all.processors=true 5 | annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output 6 | application.title=FlashBalknaModel 7 | application.vendor=judovana 8 | auxiliary.org-netbeans-spi-editor-hints-projects.perProjectHintSettingsFile=nbproject/cfg_hints.xml 9 | build.classes.dir=${build.dir}/classes 10 | build.classes.excludes=**/*.java,**/*.form 11 | # This directory is removed when the project is cleaned: 12 | build.dir=build 13 | build.generated.dir=${build.dir}/generated 14 | build.generated.sources.dir=${build.dir}/generated-sources 15 | # Only compile against the classpath explicitly listed here: 16 | build.sysclasspath=ignore 17 | build.test.classes.dir=${build.dir}/test/classes 18 | build.test.results.dir=${build.dir}/test/results 19 | # Uncomment to specify the preferred debugger connection transport: 20 | #debug.transport=dt_socket 21 | debug.classpath=\ 22 | ${run.classpath} 23 | debug.test.classpath=\ 24 | ${run.test.classpath} 25 | # Files in build.classes.dir which should be excluded from distribution jar 26 | dist.archive.excludes= 27 | # This directory is removed when the project is cleaned: 28 | dist.dir=dist 29 | dist.jar=${dist.dir}/FlashBalknaModel.jar 30 | dist.javadoc.dir=${dist.dir}/javadoc 31 | endorsed.classpath= 32 | excludes= 33 | includes=** 34 | jar.archive.disabled=${jnlp.enabled} 35 | jar.compress=false 36 | jar.index=${jnlp.enabled} 37 | javac.classpath= 38 | # Space-separated list of extra javac options 39 | javac.compilerargs= 40 | javac.deprecation=false 41 | javac.processorpath=\ 42 | ${javac.classpath} 43 | javac.source=8 44 | javac.target=8 45 | javac.test.classpath=\ 46 | ${javac.classpath}:\ 47 | ${build.classes.dir} 48 | javac.test.processorpath=\ 49 | ${javac.test.classpath} 50 | javadoc.additionalparam= 51 | javadoc.author=false 52 | javadoc.encoding=${source.encoding} 53 | javadoc.noindex=false 54 | javadoc.nonavbar=false 55 | javadoc.notree=false 56 | javadoc.private=false 57 | javadoc.splitindex=true 58 | javadoc.use=true 59 | javadoc.version=false 60 | javadoc.windowtitle= 61 | jnlp.codebase.type=no.codebase 62 | jnlp.descriptor=application 63 | jnlp.enabled=false 64 | jnlp.mixed.code=default 65 | jnlp.offline-allowed=false 66 | jnlp.signed=false 67 | jnlp.signing= 68 | jnlp.signing.alias= 69 | jnlp.signing.keystore= 70 | main.class=org.fbb.balkna.model.utils.WavPlayerImpl 71 | # Optional override of default Codebase manifest attribute, use to prevent RIAs from being repurposed 72 | manifest.custom.codebase= 73 | # Optional override of default Permissions manifest attribute (supported values: sandbox, all-permissions) 74 | manifest.custom.permissions= 75 | manifest.file=manifest.mf 76 | meta.inf.dir=${src.dir}/META-INF 77 | mkdist.disabled=false 78 | platform.active=default_platform 79 | run.classpath=\ 80 | ${javac.classpath}:\ 81 | ${build.classes.dir} 82 | # Space-separated list of JVM arguments used when running the project. 83 | # You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. 84 | # To set system properties for unit tests define test-sys-prop.name=value: 85 | run.jvmargs= 86 | run.test.classpath=\ 87 | ${javac.test.classpath}:\ 88 | ${build.test.classes.dir} 89 | source.encoding=UTF-8 90 | src.dir=src 91 | test.src.dir=test 92 | Application.version = 2.2 93 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/graphs/AbstractGraph.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.graphs; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collection; 5 | import java.util.Collections; 6 | import java.util.Comparator; 7 | import java.util.Date; 8 | import java.util.HashSet; 9 | import java.util.List; 10 | import java.util.Map; 11 | import java.util.Set; 12 | 13 | /** 14 | * 15 | * @author jvanek 16 | */ 17 | public abstract class AbstractGraph { 18 | 19 | protected static int CWIDTH = 40; 20 | 21 | 22 | 23 | 24 | protected static int getMaxRecord(List list) { 25 | int max = 0; 26 | for (DayStatst list1 : list) { 27 | if (list1.getMax() > max) { 28 | max = list1.getMax(); 29 | } 30 | } 31 | return max; 32 | } 33 | 34 | protected static int getMaxTimeInTimes(List list) { 35 | int max = 0; 36 | for (DayTimes list1 : list) { 37 | if (list1.getMaxTime()> max) { 38 | max = list1.getMaxTime();//seconds 39 | } 40 | } 41 | return max/60;//minutes! 42 | } 43 | 44 | 45 | protected static int getMaxCyclesuseInTimes(List list) { 46 | int max = 0; 47 | for (DayTimes list1 : list) { 48 | if (list1.getCyclesOperationms()> max) { 49 | max = list1.getCyclesOperationms(); 50 | } 51 | } 52 | return max; 53 | } 54 | protected static List getClasses(List list) { 55 | Set classes = new HashSet(4); 56 | int max = 0; 57 | for (DayStatst list1 : list) { 58 | list1.fillClasses(classes); 59 | } 60 | List l = new ArrayList(classes); 61 | Collections.sort(l, new Comparator() { 62 | 63 | @Override 64 | public int compare(Class o1, Class o2) { 65 | return o1.getSimpleName().compareTo(o2.getSimpleName()); 66 | } 67 | }); 68 | return l; 69 | } 70 | 71 | 72 | 73 | protected static List getDataAsList(Map data) { 74 | Collection vals = data.values(); 75 | List list = new ArrayList(vals); 76 | Collections.sort(list); 77 | if (list.isEmpty()) { 78 | return list; 79 | } 80 | dealWithNow(list); 81 | return list; 82 | } 83 | 84 | protected static List getTimeDataAsList(Map data) { 85 | Collection vals = data.values(); 86 | List list = new ArrayList(vals); 87 | Collections.sort(list); 88 | if (list.isEmpty()) { 89 | return list; 90 | } 91 | //dealWithNow(list); 92 | //now should not be already dealed earlier 93 | return list; 94 | } 95 | 96 | protected static void dealWithNow(List list) { 97 | DayStatst l1 = list.get(0); 98 | DayStatst l2 = list.get(list.size() - 1); 99 | dealNow(l1, getClasses(list)); 100 | dealNow(l2, getClasses(list)); 101 | } 102 | 103 | protected static void dealNow(DayStatst l1, List classes) { 104 | if (l1.isNothing()) { 105 | l1.detach(classes); 106 | } 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/primitives/TimeShift.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.primitives; 2 | 3 | import static org.fbb.balkna.model.Translator.R; 4 | 5 | /** 6 | * 7 | * @author jvanek 8 | */ 9 | public class TimeShift { 10 | 11 | private double training; 12 | private double pause; 13 | private double rest; 14 | private double iterations; 15 | 16 | public TimeShift() { 17 | this.training = 1d; 18 | this.pause = 1d; 19 | this.rest = 1d; 20 | this.iterations = 1d; 21 | } 22 | 23 | public TimeShift(TimeShift d) { 24 | this.training = d.training; 25 | this.pause = d.pause; 26 | this.rest = d.rest; 27 | this.iterations = d.iterations; 28 | } 29 | 30 | @Override 31 | public boolean equals(Object obj) { 32 | if (!(obj instanceof TimeShift)) { 33 | return false; 34 | } 35 | TimeShift o = (TimeShift) obj; 36 | return o.pause == pause 37 | && o.rest == rest 38 | && o.training == training 39 | && o.iterations == iterations; 40 | } 41 | 42 | @Override 43 | public int hashCode() { 44 | int hash = 3; 45 | hash = 79 * hash + (int) (Double.doubleToLongBits(this.training) ^ (Double.doubleToLongBits(this.training) >>> 32)); 46 | hash = 79 * hash + (int) (Double.doubleToLongBits(this.pause) ^ (Double.doubleToLongBits(this.pause) >>> 32)); 47 | hash = 79 * hash + (int) (Double.doubleToLongBits(this.rest) ^ (Double.doubleToLongBits(this.rest) >>> 32)); 48 | hash = 79 * hash + (int) (Double.doubleToLongBits(this.iterations) ^ (Double.doubleToLongBits(this.iterations) >>> 32)); 49 | return hash; 50 | } 51 | 52 | /** 53 | * @return the training 54 | */ 55 | public double getTraining() { 56 | return training; 57 | } 58 | 59 | /** 60 | * @param training the training to set 61 | */ 62 | public void setTraining(double training) { 63 | this.training = training; 64 | } 65 | 66 | /** 67 | * @return the pause 68 | */ 69 | public double getPause() { 70 | return pause; 71 | } 72 | 73 | /** 74 | * @param pause the pause to set 75 | */ 76 | public void setPause(double pause) { 77 | this.pause = pause; 78 | } 79 | 80 | /** 81 | * @return the rest 82 | */ 83 | public double getRest() { 84 | return rest; 85 | } 86 | 87 | /** 88 | * @param rest the rest to set 89 | */ 90 | public void setRest(double rest) { 91 | this.rest = rest; 92 | } 93 | 94 | public double getIterations() { 95 | return iterations; 96 | } 97 | 98 | public void setIterations(double iterations) { 99 | this.iterations = iterations; 100 | } 101 | 102 | @Override 103 | public String toString() { 104 | return R("TrainingsShift") + ": " + training + ", " 105 | + R("PausesShift") + ": " + pause + ", " 106 | + R("IterationsShift") + ": " + iterations + ", " 107 | + R("RestsShift") + ": " + rest; 108 | } 109 | 110 | public String statInfo() { 111 | return "T:" + training + "," 112 | + "P:" + pause + "," 113 | + "I:" + iterations + "," 114 | + "R:" + rest; 115 | } 116 | 117 | } 118 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/primitives/Trainings.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.primitives; 2 | 3 | import java.io.File; 4 | import java.util.ArrayList; 5 | import java.util.Collections; 6 | import java.util.List; 7 | import org.fbb.balkna.model.Model; 8 | import org.fbb.balkna.model.primitives.history.Record; 9 | import org.fbb.balkna.model.primitives.history.RecordWithOrigin; 10 | import org.fbb.balkna.model.utils.XmlConstants; 11 | import org.fbb.balkna.model.utils.XmlUtils; 12 | import org.w3c.dom.Element; 13 | import org.w3c.dom.Node; 14 | 15 | /** 16 | * 17 | * @author jvanek 18 | */ 19 | public class Trainings { 20 | 21 | public List gatherStatistics() { 22 | String[] names = getStatsDir().list(); 23 | ArrayList a = new ArrayList(names.length); 24 | for (String name : names) { 25 | Training i = getTrainingById(name); 26 | if (i != null) { 27 | List rs = i.getRecords(); 28 | for (Record r : rs) { 29 | a.add(new RecordWithOrigin(i, r)); 30 | } 31 | } 32 | } 33 | return a; 34 | } 35 | 36 | public List gatherFakeTrainingsStatistics() { 37 | String[] names = getStatsDir().list(); 38 | ArrayList a = new ArrayList(names.length); 39 | for (String name : names) { 40 | Exercise e = Exercises.getInstance().getExerciseById(name); 41 | if (e != null) { 42 | Training i = new Training(e); 43 | List rs = i.getRecords(); 44 | for (Record r : rs) { 45 | a.add(new RecordWithOrigin(i, r)); 46 | } 47 | } 48 | } 49 | return a; 50 | } 51 | 52 | private static class TrainingsHolder { 53 | 54 | public static Trainings instance; 55 | 56 | public static Trainings getInstance() { 57 | if (instance == null) { 58 | instance = new Trainings(); 59 | } 60 | return instance; 61 | } 62 | 63 | public static Trainings reloadInstance() { 64 | instance = new Trainings(); 65 | return instance; 66 | } 67 | } 68 | 69 | public static Trainings getInstance() { 70 | return TrainingsHolder.getInstance(); 71 | } 72 | 73 | public static Trainings reloadInstance() { 74 | return TrainingsHolder.reloadInstance(); 75 | } 76 | 77 | private final List trainings = new ArrayList(); 78 | 79 | public Trainings() { 80 | try { 81 | loadDefaults(); 82 | } catch (Exception ex) { 83 | throw new RuntimeException(ex); 84 | } 85 | } 86 | 87 | private void loadDefaults() { 88 | try { 89 | List all = XmlUtils.getDataNodes("trainings", XmlConstants.TRAINING); 90 | for (Node node : all) { 91 | Training ex = Training.parse(node); 92 | trainings.add(ex); 93 | } 94 | } catch (Exception ex) { 95 | throw new RuntimeException(ex); 96 | } 97 | 98 | } 99 | 100 | public List getTrainings() { 101 | return Collections.unmodifiableList(trainings); 102 | } 103 | 104 | public Training getTrainingById(String id) { 105 | for (Training training : trainings) { 106 | if (training.getId().equals(id)){ 107 | return training; 108 | } 109 | } 110 | return null; 111 | } 112 | 113 | public static File getStatsDir() { 114 | File f = new File(Model.getModel().getStatsDir(), "trainings"); 115 | if (!f.exists()) { 116 | f.mkdirs(); 117 | } 118 | return f; 119 | } 120 | 121 | } 122 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/graphs/DayTimes.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.graphs; 2 | 3 | import java.text.SimpleDateFormat; 4 | import java.util.Date; 5 | import org.fbb.balkna.model.primitives.Exercise; 6 | import org.fbb.balkna.model.primitives.Training; 7 | 8 | /** 9 | * 10 | * @author jvanek 11 | */ 12 | public class DayTimes implements Steppable { 13 | 14 | private final Date day; 15 | private int cyclesOperationms = 0; 16 | private int trainTime = 0; 17 | private int exercisesTimes = 0; 18 | private SimpleDateFormat easyFormater; 19 | private long step; 20 | 21 | public DayTimes(Date day) { 22 | this.day = day; 23 | } 24 | 25 | public static DayTimes fake(Date day) { 26 | DayTimes d = new DayTimes(day); 27 | d.detach(); 28 | return d; 29 | } 30 | 31 | public boolean isNothing() { 32 | return isNothing(cyclesOperationms) 33 | && isNothing(trainTime) 34 | && isNothing(exercisesTimes); 35 | } 36 | 37 | private static boolean isNothing(int i) { 38 | return i < 0; 39 | } 40 | 41 | public void detach() { 42 | cyclesOperationms = -1; 43 | trainTime = -1; 44 | exercisesTimes = -1; 45 | } 46 | 47 | /** 48 | * @return the day 49 | */ 50 | public Date getDay() { 51 | return day; 52 | } 53 | 54 | public void incCycles(int i) { 55 | cyclesOperationms += i; 56 | } 57 | 58 | public void incTrains(int c) {//seconds 59 | trainTime += c; 60 | } 61 | 62 | public void incExs(int c) {//seconds 63 | exercisesTimes += c; 64 | } 65 | 66 | public int getCyclesOperationms() { 67 | return cyclesOperationms; 68 | } 69 | 70 | public int getExercisesTimes() {//seconds 71 | return exercisesTimes; 72 | } 73 | 74 | public int getTrainTime() {//seconds 75 | return trainTime; 76 | } 77 | 78 | public int getExercisesTimesMinutes() { 79 | return exercisesTimes/60; 80 | } 81 | 82 | public int getTrainTimeMinutes() { 83 | return trainTime/60; 84 | } 85 | 86 | 87 | @Override 88 | public int compareTo(DayTimes o) { 89 | return (int) (this.day.getTime() - o.day.getTime()); 90 | } 91 | 92 | public int getMaxTime() { //not exacly usefull to mix with cycles... 93 | return Math.max(trainTime, exercisesTimes); 94 | } 95 | 96 | @Override 97 | public long getStep() { 98 | return step; 99 | } 100 | 101 | @Override 102 | public void setStep(long step) { 103 | this.step = step; 104 | } 105 | 106 | @Override 107 | public void setEasyFormater(SimpleDateFormat easyFormater) { 108 | this.easyFormater = easyFormater; 109 | } 110 | 111 | @Override 112 | public SimpleDateFormat getEasyFormater() { 113 | return easyFormater; 114 | } 115 | 116 | public String getAdaptedDateTime() { 117 | return easyFormater.format(day); 118 | } 119 | 120 | void incExTr(Class clazz, long realTime) { 121 | if (clazz.equals(Training.class)) { 122 | incTrains((int) realTime); 123 | } else if (clazz.equals(Exercise.class)) { 124 | incExs((int) realTime); 125 | } else { 126 | throw new RuntimeException("Unsupported class " + clazz); 127 | } 128 | } 129 | 130 | void detachCy() { 131 | cyclesOperationms=-1; 132 | } 133 | 134 | void detachTr() { 135 | trainTime=-1; 136 | } 137 | 138 | void detachEx() { 139 | exercisesTimes=-1; 140 | } 141 | 142 | @Override 143 | public String toString() { 144 | String s = day.toString(); 145 | if (getEasyFormater() != null) { 146 | s = getAdaptedDateTime(); 147 | } 148 | s += ": cycles: " + cyclesOperationms+"x, trainings: "+trainTime+"s, exercises: "+exercisesTimes+"s."; 149 | return s; 150 | } 151 | 152 | 153 | } 154 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/utils/IoUtils.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.utils; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.BufferedWriter; 5 | import java.io.File; 6 | import java.io.FileInputStream; 7 | import java.io.FileOutputStream; 8 | import java.io.IOException; 9 | import java.io.InputStreamReader; 10 | import java.io.OutputStreamWriter; 11 | import java.net.URL; 12 | import java.util.ArrayList; 13 | import java.util.List; 14 | import org.fbb.balkna.model.Model; 15 | import org.fbb.balkna.model.PluginFactoryProvider; 16 | import org.fbb.balkna.model.Statisticable; 17 | import org.fbb.balkna.model.primitives.history.Record; 18 | import org.fbb.balkna.model.primitives.history.RecordWithOrigin; 19 | 20 | /** 21 | * 22 | * @author jvanek 23 | */ 24 | public class IoUtils { 25 | 26 | public static void saveStatisticable(Statisticable i) throws IOException { 27 | if (!Model.getModel().isSaveStats()) { 28 | return; 29 | } 30 | boolean savedMessage = Record.SHOW_MESSAGE; 31 | boolean savedClass = RecordWithOrigin.SHOW_CLASS; 32 | Record.SHOW_MESSAGE=true; 33 | RecordWithOrigin.SHOW_CLASS=false; 34 | File f = i.getFile(); 35 | BufferedWriter fr = null; 36 | try { 37 | fr = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), "utf-8")); 38 | i.save(fr); 39 | } finally { 40 | Record.SHOW_MESSAGE=savedMessage; 41 | RecordWithOrigin.SHOW_CLASS=savedClass; 42 | if (fr != null) { 43 | fr.close(); 44 | } 45 | } 46 | } 47 | 48 | public static void loadStatisticable(Statisticable i) throws IOException { 49 | File f = i.getFile(); 50 | if (f.exists()) { 51 | BufferedReader fr = null; 52 | try { 53 | fr = new BufferedReader(new InputStreamReader(new FileInputStream(f))); 54 | i.load(fr); 55 | } finally { 56 | if (fr != null) { 57 | fr.close(); 58 | } 59 | } 60 | } 61 | } 62 | 63 | public static URL getFile(String subPackage, String fileName) { 64 | String res = toResource(subPackage, fileName); 65 | URL found = IoUtils.class.getResource(res); 66 | //regular classapth 67 | if (found != null) { 68 | return found; 69 | } 70 | //plugins 71 | return JavaPluginProvider.getPluginPaths().findFile(res); 72 | 73 | } 74 | 75 | private static String toResource(String subPackage, String fileName) { 76 | String res = subPackage + "."; 77 | res = "/" + res.replace(".", "/") + fileName; 78 | return res; 79 | } 80 | 81 | public static List getFiles(String subPackage, String fileRoot, String suffix) { 82 | List presearch = new ArrayList(0); 83 | try { 84 | presearch = PluginFactoryProvider.getInstance().searchResourceInPlugins(toResource(subPackage, fileRoot + ".*\\." + suffix)); 85 | } catch (Exception ex) { 86 | ex.printStackTrace(); 87 | } 88 | List l = new ArrayList(); 89 | //presearch fopund everyting in plugins 90 | //themian jar should have only *1 and *2, so try them 91 | int i = -1; 92 | while (true) { 93 | i++; 94 | if (i > 2) { 95 | break; 96 | } 97 | URL in = getFile(subPackage, fileRoot + i + "." + suffix); 98 | if (in == null) { 99 | //break; try all 2 100 | continue; 101 | } 102 | l.add(in); 103 | } 104 | for (URL l1 : presearch) { 105 | if (!l.contains(l1)){ 106 | l.add(l1); 107 | } 108 | } 109 | return l; 110 | 111 | } 112 | 113 | public static StringBuilder htmlWrap(StringBuilder s) { 114 | s.insert(0, "").append(""); 115 | return s; 116 | } 117 | 118 | } 119 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/primitives/history/StatisticHelper.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.primitives.history; 2 | 3 | import org.fbb.balkna.model.Statisticable; 4 | import org.fbb.balkna.model.Substituable; 5 | import org.fbb.balkna.model.merged.uncompressed.MainTimer; 6 | import org.fbb.balkna.model.merged.uncompressed.timeUnits.BasicTime; 7 | import org.fbb.balkna.model.primitives.Cycle; 8 | import org.fbb.balkna.model.primitives.Exercise; 9 | import org.fbb.balkna.model.primitives.Training; 10 | import org.fbb.balkna.model.settings.Settings; 11 | import org.fbb.balkna.model.utils.TimeUtils; 12 | 13 | /** 14 | * 15 | * @author jvanek 16 | */ 17 | public class StatisticHelper { 18 | 19 | 20 | private final Statisticable parent; 21 | 22 | public StatisticHelper(Statisticable parent) { 23 | this.parent = parent; 24 | } 25 | 26 | public void finishedWithSkips(String message) { 27 | parent.addRecord(Record.create(RecordType.FINISHED_WITH_SKIPPS, message)); 28 | } 29 | 30 | public void finished(String message) { 31 | parent.addRecord(Record.create(RecordType.FINISHED, message)); 32 | } 33 | 34 | public void canceled(String message) { 35 | parent.addRecord(Record.create(RecordType.CANCELED, message)); 36 | } 37 | 38 | public void started(String message) { 39 | parent.addRecord(Record.create(RecordType.STARTED, message)); 40 | } 41 | 42 | public void continued(String message) { 43 | parent.addRecord(Record.create(RecordType.CONTINUED, message)); 44 | } 45 | 46 | public void modified(String message) { 47 | parent.addRecord(Record.create(RecordType.MODIFIED, message)); 48 | } 49 | 50 | private static String substituableToString(Substituable src2) { 51 | return (src2 == null ? "" : " - " + src2.getIdAsMcro()); 52 | } 53 | 54 | private static String generateTrainingsTitle(Cycle c, Training t, Exercise ex) { 55 | return "cycle: " + substituableToString(c) 56 | + "; training: " + substituableToString(t) 57 | + "; exercise: " + substituableToString(ex); 58 | 59 | } 60 | 61 | public static String generateMessage(Cycle c, Training t, Exercise ex) { 62 | return generateTrainingsTitle(c, t, ex)+"; "+generateModifiers(); 63 | } 64 | 65 | private static String generateCurrentTime(BasicTime t) { 66 | if (t == null) { 67 | return "current: "; 68 | } else { 69 | return "current: " + TimeUtils.secondsToHours(t.getCurrentValue()); 70 | } 71 | } 72 | 73 | public static String generateTime(BasicTime t, MainTimer model) { 74 | return generateCurrentTime(t) + "; " + generateTotalTime(t, model); 75 | } 76 | 77 | private static String generateTotalTime(BasicTime t, MainTimer model) { 78 | if (model == null) { 79 | return "totoal: "; 80 | } else { 81 | return "total: " + TimeUtils.getRemainingTime(t, model); 82 | } 83 | } 84 | 85 | public static String generateMessage(Cycle c, Training tr, MainTimer model) { 86 | try { 87 | return StatisticHelper.generateMessage(c, tr, model.getCurrent().getOriginator().getOriginal(), model.getCurrent(), model, model.getSkipps()); 88 | } catch (Exception exx) { 89 | return exx.toString(); 90 | } 91 | } 92 | 93 | public static String generateMessage(Cycle c, Training tr, Exercise ex, BasicTime ti, MainTimer model, Integer skipps) { 94 | try { 95 | return generateTrainingsTitle(c, tr, ex) + "; " + generateTime(ti, model) + "; skipps" + intToStrSafe(skipps) + "; " + generateModifiers(); 96 | } catch (Exception exx) { 97 | return exx.toString(); 98 | } 99 | } 100 | 101 | private static String intToStrSafe(Integer src2) { 102 | return (src2 == null ? "" : " - " + src2.toString()); 103 | } 104 | 105 | private static String generateModifiers() { 106 | return "TimeShift: "+ Settings.getSettings().getTimeShift().statInfo()+"; "+Settings.getSettings().getSingleExerciseOverrideInfo().replaceFirst("=", ": "); 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/primitives/history/Record.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.primitives.history; 2 | 3 | import java.text.SimpleDateFormat; 4 | import java.util.Date; 5 | import org.fbb.balkna.model.Substituable; 6 | import org.fbb.balkna.model.primitives.Cycles; 7 | import org.fbb.balkna.model.primitives.Exercises; 8 | import org.fbb.balkna.model.primitives.Trainings; 9 | 10 | /** 11 | * 12 | * @author jvanek 13 | */ 14 | public class Record implements Comparable { 15 | 16 | public static final int minTime = 500; 17 | 18 | final RecordType what; 19 | final long when; 20 | final String message; 21 | 22 | public static boolean SHOW_MESSAGE = false; 23 | 24 | private Record(long when, RecordType what, String message) { 25 | this.what = what; 26 | this.when = when; 27 | this.message = message; 28 | } 29 | 30 | @Override 31 | public String toString() { 32 | String s = when + " " + what; 33 | if (SHOW_MESSAGE && message != null) { 34 | s = s + " " + message; 35 | } 36 | return s; 37 | } 38 | 39 | public String toNiceString() { 40 | String s = format(when) + " " + what.toNiceString(); 41 | if (SHOW_MESSAGE && message != null) { 42 | s = s + " - " + processIDs(message); 43 | } 44 | return s; 45 | } 46 | 47 | public static Record create(RecordType what, String message) { 48 | return new Record(System.currentTimeMillis(), what, message); 49 | 50 | } 51 | 52 | public static Record fromString(String s) { 53 | s = s.trim(); 54 | String[] ss = s.split("\\s+"); 55 | int i = s.indexOf(ss[1]); 56 | String message = s.substring(i + ss[1].length()).trim(); 57 | return new Record(Long.valueOf(ss[0]), RecordType.valueOf(ss[1]), message); 58 | } 59 | 60 | private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd EEEEEEEE HH:mm:ss"); 61 | 62 | private static String format(long when) { 63 | return sdf.format(new Date(when)); 64 | } 65 | 66 | // public static void main(String[] args) { 67 | // System.out.println(Record.create(Type.STARTED).toNiceString()); 68 | // } 69 | @Override 70 | public int compareTo(Record t) { 71 | return (int) (when - t.when); 72 | } 73 | 74 | public RecordType getWhat() { 75 | return what; 76 | } 77 | 78 | public long getWhen() { 79 | return when; 80 | } 81 | 82 | @Override 83 | public boolean equals(Object obj) { 84 | if (!(obj instanceof Record)) { 85 | return false; 86 | } 87 | Record r = (Record) obj; 88 | return r.what == this.what && r.when == this.when; 89 | } 90 | 91 | @Override 92 | public int hashCode() { 93 | int hash = 3; 94 | hash = 37 * hash + (this.what != null ? this.what.hashCode() : 0); 95 | hash = 37 * hash + (int) (this.when ^ (this.when >>> 32)); 96 | return hash; 97 | } 98 | 99 | private String processIDs(String message) { 100 | String orogonal = message; 101 | try { 102 | while (message.contains("%{")) { 103 | int start = message.indexOf("%{"); 104 | int end = message.indexOf("}"); 105 | String macroBody = message.substring(start + 2, end); 106 | String[] macroParts = macroBody.split(";"); 107 | String[] keys = macroParts[0].split("-"); 108 | String substitued; 109 | Substituable found = null; 110 | if (keys[0].equals("c")) { 111 | found = Cycles.getInstance().getCycleById(keys[1]); 112 | } else if (keys[0].equals("t")) { 113 | found = Trainings.getInstance().getTrainingById(keys[1]); 114 | } else if (keys[0].equals("e")) { 115 | found = Exercises.getInstance().getExerciseById(keys[1]); 116 | }; 117 | if (found != null) { 118 | substitued = found.getName(); 119 | } else { 120 | substitued = macroParts[1]; 121 | } 122 | message = message.substring(0, start) + substitued + message.substring(end + 1); 123 | } 124 | return message; 125 | } catch (Exception ex) { 126 | return orogonal + "(" + ex.toString() + ")"; 127 | } 128 | } 129 | 130 | } 131 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/Translator.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model; 2 | 3 | import java.text.MessageFormat; 4 | import java.util.Locale; 5 | import java.util.MissingResourceException; 6 | import java.util.ResourceBundle; 7 | 8 | /** 9 | * Utility class to provide simple methods to help localize messages 10 | */ 11 | public class Translator { 12 | 13 | public static String getLocale() { 14 | String s = getInstance().resources.getLocale().toString(); 15 | //System.out.println(s); 16 | return s; 17 | } 18 | 19 | private void reload(String locale) { 20 | try { 21 | if (locale == null || locale.trim().isEmpty()) { 22 | resources = ResourceBundle.getBundle(defaultBundle); 23 | } else { 24 | resources = ResourceBundle.getBundle(defaultBundle, new Locale(locale)); 25 | } 26 | } catch (Exception ex) { 27 | throw new IllegalStateException("No bundles found for Locale: " + Locale.getDefault().toString() 28 | + "and missing base resource bundle in jar:\\" + defaultBundle + "/Messages.properties"); 29 | } 30 | } 31 | 32 | private static class TranslatorHolder { 33 | 34 | //https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java 35 | //https://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom 36 | private static final Translator INSTANCE = new Translator(); 37 | 38 | private static Translator getTransaltor() { 39 | return TranslatorHolder.INSTANCE; 40 | } 41 | } 42 | 43 | /** 44 | * the localized resource strings 45 | */ 46 | private ResourceBundle resources; 47 | private static final String defaultBundle = "org.fbb.balkna.data.locales.bundles.Messages"; 48 | 49 | Translator() { 50 | this(defaultBundle); 51 | } 52 | 53 | Translator(String s) { 54 | try { 55 | resources = ResourceBundle.getBundle(s); 56 | } catch (Exception ex) { 57 | throw new IllegalStateException("No bundles found for Locale: " + Locale.getDefault().toString() 58 | + "and missing base resource bundle in jar:\\" + s + "/Messages.properties"); 59 | } 60 | } 61 | 62 | public static Translator getInstance() { 63 | return TranslatorHolder.getTransaltor(); 64 | } 65 | 66 | public static void load(String locale) { 67 | TranslatorHolder.getTransaltor().reload(locale); 68 | } 69 | 70 | /** 71 | * Return a translated (localized) version of the message 72 | * 73 | * @param message the message to translate 74 | * @return a string representing the localized message 75 | */ 76 | public static String R(String message) { 77 | return R(message, new Object[0]); 78 | } 79 | 80 | /** 81 | * @param message key to be found in properties 82 | * @param params params to be expanded to message 83 | * @return the localized string for the message 84 | */ 85 | public static String R(String message, Object... params) { 86 | return getInstance().getMessage(message, params); 87 | } 88 | 89 | /** 90 | * @return the localized resource string using the specified arguments. 91 | * @param key key to be found in properties 92 | * @param args params to be expanded to message 93 | */ 94 | protected String getMessage(String key, Object... args) { 95 | return MessageFormat.format(getMessage(key), args); 96 | } 97 | 98 | /** 99 | * Returns the localized resource string identified by the specified key. If 100 | * the message is empty, a null is returned. 101 | */ 102 | private String getMessage(String key) { 103 | try { 104 | String result = resources.getString(key); 105 | if (result.length() == 0) { 106 | return ""; 107 | } else { 108 | return result; 109 | } 110 | } catch (NullPointerException e) { 111 | return getMessage("RNoResource", new Object[]{key}); 112 | } catch (MissingResourceException e) { 113 | return multiCatchTool(key); 114 | } catch (ClassCastException ee) { 115 | return multiCatchTool(key); 116 | } 117 | } 118 | 119 | private String multiCatchTool(String key) { 120 | if ("RNoResource".equals(key)) { 121 | return "No localized text found"; 122 | } else { 123 | return getMessage("RNoResource", new Object[]{key}); 124 | } 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/primitives/Exercises.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.primitives; 2 | 3 | import java.io.File; 4 | import java.util.ArrayList; 5 | import java.util.Collection; 6 | import java.util.HashMap; 7 | import java.util.List; 8 | import java.util.Map; 9 | import org.fbb.balkna.model.Model; 10 | import org.fbb.balkna.model.primitives.history.Record; 11 | import org.fbb.balkna.model.primitives.history.RecordWithOrigin; 12 | import org.fbb.balkna.model.utils.XmlConstants; 13 | import org.fbb.balkna.model.utils.XmlUtils; 14 | import org.w3c.dom.Element; 15 | 16 | /** 17 | * 18 | * @author jvanek 19 | */ 20 | public class Exercises { 21 | 22 | public static final String WARM_UP_ID = "internalWarmUp"; 23 | 24 | public List gatherStatistics() { 25 | String[] names = getStatsDir().list(); 26 | ArrayList a = new ArrayList(names.length); 27 | for (String name : names) { 28 | Exercise i = getExerciseById(name); 29 | if (i != null) { 30 | List rs = i.getRecords(); 31 | for (Record r : rs) { 32 | a.add(new RecordWithOrigin(i, r)); 33 | } 34 | } 35 | } 36 | return a; 37 | } 38 | 39 | private static class ExercisesHolder { 40 | 41 | public static Exercises instance; 42 | 43 | public static Exercises getInstance() { 44 | if (instance == null) { 45 | instance = new Exercises(); 46 | } 47 | return instance; 48 | } 49 | 50 | public static Exercises reloadInstance() { 51 | instance = new Exercises(); 52 | return instance; 53 | } 54 | } 55 | 56 | public static Exercises getInstance() { 57 | return ExercisesHolder.getInstance(); 58 | } 59 | 60 | public static Exercises reloadInstance() { 61 | return ExercisesHolder.reloadInstance(); 62 | } 63 | 64 | private final Map exercises = new HashMap(); 65 | 66 | public Exercises() { 67 | try { 68 | loadDefaults(); 69 | } catch (Exception ex) { 70 | throw new RuntimeException(ex); 71 | } 72 | } 73 | 74 | public Exercise getExerciseById(String id) { 75 | return getInstance().exercises.get(id); 76 | 77 | } 78 | 79 | public Exercise getWarmUpExercise() { 80 | return getExerciseById(WARM_UP_ID); 81 | 82 | } 83 | 84 | private void loadDefaults() { 85 | try { 86 | List sets = XmlUtils.getDataNodes("exercises", XmlConstants.EXERCISES_SET); 87 | for (Element set : sets) { 88 | List childs = XmlUtils.getRealChilds(set); 89 | SetDefaults currentDefaults = SetDefaults.emptyDeafults(); 90 | //first found defaults 91 | for (Element child : childs) { 92 | if (child.getNodeName().equals(XmlConstants.SET_DEFAULTS)) { 93 | currentDefaults = SetDefaults.parse(child); 94 | } 95 | } 96 | //now found all exercises, set defaults if exists 97 | for (Element child : childs) { 98 | if (child.getNodeName().equals(XmlConstants.EXERCISE)) { 99 | 100 | Exercise ex = Exercise.parse(child, currentDefaults); 101 | Exercise old = exercises.put(ex.getId(), ex); 102 | if (old != null) { 103 | //throw new RuntimeException("Exercise id " + ex.getId() + " already presented. thats fatal"); 104 | //overwriting is ok. "update" 105 | } 106 | } 107 | } 108 | } 109 | }catch(Exception ex){ 110 | throw new RuntimeException(ex); 111 | } 112 | } 113 | 114 | public List getExercises() { 115 | List l = new ArrayList(exercises.size()); 116 | Collection q = exercises.values(); 117 | for (Exercise q1 : q) { 118 | l.add(q1); 119 | } 120 | //return Collections.unmodifiableList(l); 121 | return l; 122 | } 123 | 124 | public static File getStatsDir() { 125 | File f = new File(Model.getModel().getStatsDir(), "exercises"); 126 | if (!f.exists()) { 127 | f.mkdirs(); 128 | } 129 | return f; 130 | } 131 | 132 | } 133 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/swing/locales/SwingTranslator.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.swing.locales; 2 | 3 | import java.text.MessageFormat; 4 | import java.util.Locale; 5 | import java.util.MissingResourceException; 6 | import java.util.ResourceBundle; 7 | 8 | /** 9 | * Utility class to provide simple methods to help localize messages 10 | */ 11 | public class SwingTranslator { 12 | 13 | public static String getLocale() { 14 | String s = getInstance().resources.getLocale().toString(); 15 | //System.out.println(s); 16 | return s; 17 | } 18 | 19 | private void reload(String locale) { 20 | try { 21 | if (locale == null || locale.trim().isEmpty()) { 22 | resources = ResourceBundle.getBundle(defaultBundle); 23 | } else { 24 | resources = ResourceBundle.getBundle(defaultBundle, new Locale(locale)); 25 | } 26 | } catch (Exception ex) { 27 | throw new IllegalStateException("No bundles found for Locale: " + Locale.getDefault().toString() 28 | + "and missing base resource bundle in jar:\\" + defaultBundle + "/Messages.properties"); 29 | } 30 | } 31 | 32 | private static class TranslatorHolder { 33 | 34 | //https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java 35 | //https://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom 36 | private static final SwingTranslator INSTANCE = new SwingTranslator(); 37 | 38 | private static SwingTranslator getTransaltor() { 39 | return TranslatorHolder.INSTANCE; 40 | } 41 | } 42 | 43 | /** 44 | * the localized resource strings 45 | */ 46 | private ResourceBundle resources; 47 | private static final String defaultBundle = "org.fbb.balkna.swing.locales.bundles.Messages"; 48 | 49 | SwingTranslator() { 50 | this(defaultBundle); 51 | } 52 | 53 | SwingTranslator(String s) { 54 | try { 55 | resources = ResourceBundle.getBundle(s); 56 | } catch (Exception ex) { 57 | ex.printStackTrace(); 58 | throw new IllegalStateException("No bundles found for Locale: " + Locale.getDefault().toString() 59 | + "and missing base resource bundle in jar:\\" + s + "/Messages.properties"); 60 | } 61 | } 62 | 63 | public static SwingTranslator getInstance() { 64 | return TranslatorHolder.getTransaltor(); 65 | } 66 | 67 | public static void load(String locale) { 68 | TranslatorHolder.getTransaltor().reload(locale); 69 | } 70 | 71 | /** 72 | * Return a translated (localized) version of the message 73 | * 74 | * @param message the message to translate 75 | * @return a string representing the localized message 76 | */ 77 | public static String R(String message) { 78 | return R(message, new Object[0]); 79 | } 80 | 81 | /** 82 | * @param message key to be found in properties 83 | * @param params params to be expanded to message 84 | * @return the localized string for the message 85 | */ 86 | public static String R(String message, Object... params) { 87 | return getInstance().getMessage(message, params); 88 | } 89 | 90 | /** 91 | * @return the localized resource string using the specified arguments. 92 | * @param key key to be found in properties 93 | * @param args params to be expanded to message 94 | */ 95 | protected String getMessage(String key, Object... args) { 96 | return MessageFormat.format(getMessage(key), args); 97 | } 98 | 99 | /** 100 | * Returns the localized resource string identified by the specified key. If 101 | * the message is empty, a null is returned. 102 | */ 103 | private String getMessage(String key) { 104 | try { 105 | String result = resources.getString(key); 106 | if (result.length() == 0) { 107 | return ""; 108 | } else { 109 | return result; 110 | } 111 | } catch (NullPointerException e) { 112 | return getMessage("RNoResource", new Object[]{key}); 113 | } catch (MissingResourceException e) { 114 | return multiCatchTool(key); 115 | } catch (ClassCastException ee) { 116 | return multiCatchTool(key); 117 | } 118 | } 119 | 120 | private String multiCatchTool(String key) { 121 | if ("RNoResource".equals(key)) { 122 | return "No localized text found"; 123 | } else { 124 | return getMessage("RNoResource", new Object[]{key}); 125 | } 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/utils/XmlUtils.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.utils; 2 | 3 | import java.io.IOException; 4 | import java.io.InputStream; 5 | import java.net.URL; 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | import javax.xml.parsers.DocumentBuilder; 9 | import javax.xml.parsers.DocumentBuilderFactory; 10 | import javax.xml.parsers.ParserConfigurationException; 11 | import org.fbb.balkna.Packages; 12 | import org.fbb.balkna.model.primitives.LocalisedString; 13 | import org.w3c.dom.Document; 14 | import org.w3c.dom.Node; 15 | import org.w3c.dom.NodeList; 16 | import org.xml.sax.SAXException; 17 | 18 | import static org.fbb.balkna.model.utils.XmlConstants.*; 19 | import org.w3c.dom.Element; 20 | 21 | /** 22 | * 23 | * @author jvanek 24 | */ 25 | public class XmlUtils { 26 | 27 | public static List getDataNodes(String fileRoot, String element) throws ParserConfigurationException, SAXException, IOException { 28 | return getNodes(Packages.DATA, fileRoot, element); 29 | } 30 | 31 | public static List getNodes(String pkg, String fileRoot, String element) throws ParserConfigurationException, SAXException, IOException { 32 | List srcs = IoUtils.getFiles(pkg, fileRoot, "xml"); 33 | List l = new ArrayList(); 34 | for (URL src : srcs) { 35 | InputStream in = src.openStream(); 36 | try { 37 | DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 38 | DocumentBuilder db = dbf.newDocumentBuilder(); 39 | Document doc = db.parse(in); 40 | NodeList exs = doc.getElementsByTagName(element); 41 | for (int x = 0; x < exs.getLength(); x++) { 42 | Node item = exs.item(x); 43 | if (item instanceof Element) { 44 | l.add((Element) item); 45 | } 46 | } 47 | } finally { 48 | // in.close(); 49 | } 50 | } 51 | return l; 52 | } 53 | 54 | public static List getRealChilds(Node node) { 55 | List interlayer = new ArrayList(); 56 | NodeList l = node.getChildNodes(); 57 | for (int i = 0; i < l.getLength(); i++) { 58 | Node n = l.item(i); 59 | if (n instanceof Element) { 60 | interlayer.add(((Element) n)); 61 | } 62 | } 63 | return interlayer; 64 | } 65 | 66 | public static String getDefaultName(Element n) { 67 | return getNonLocalised(NAME, n); 68 | 69 | } 70 | 71 | public static String getLocaleAtt(Element n) { 72 | String s = n.getAttribute(LOCALE); 73 | if (s == null) { 74 | return s; 75 | } 76 | if (s.trim().isEmpty()) { 77 | return null; 78 | } 79 | return s; 80 | } 81 | 82 | public static List getLocalisedNames(Element node) { 83 | return getLocalised(NAME, node); 84 | } 85 | 86 | public static List getLocalised(String name, Element node) { 87 | List r = new ArrayList(); 88 | List l = getRealChilds(node); 89 | for (Element n : l) { 90 | if (n.getNodeName().equals(name) && getLocaleAtt(n) != null) { 91 | r.add(new LocalisedString(getLocaleAtt(n), n.getTextContent())); 92 | } 93 | } 94 | return r; 95 | } 96 | 97 | private static String getNonLocalised(String name, Element node) { 98 | List l = getRealChilds(node); 99 | for (Element n : l) { 100 | if (n.getNodeName().equals(name) && getLocaleAtt(n) == null) { 101 | return n.getTextContent(); 102 | } 103 | } 104 | throw new RuntimeException("Non localised form of " + name + " not found!"); 105 | } 106 | 107 | public static String getDefaultDescription(Element n) { 108 | return getNonLocalised(DESCRIPTION, n); 109 | } 110 | 111 | public static List getLocalisedDescriptions(Element node) { 112 | return getLocalised(DESCRIPTION, node); 113 | } 114 | 115 | public static List getImages(Element node) { 116 | return getByName(IMAGE, node); 117 | } 118 | 119 | public static List getByName(String name, Element node) { 120 | List r = new ArrayList(); 121 | List l = getRealChilds(node); 122 | for (Element n : l) { 123 | if (n.getNodeName().equals(name)) { 124 | r.add(n.getTextContent()); 125 | } 126 | } 127 | return r; 128 | } 129 | 130 | } 131 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/merged/uncompressed/timeUnits/BasicTime.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.merged.uncompressed.timeUnits; 2 | 3 | import java.util.List; 4 | import org.fbb.balkna.model.Model; 5 | import org.fbb.balkna.model.SoundProvider; 6 | import org.fbb.balkna.model.Translator; 7 | import org.fbb.balkna.model.merged.MergedExercise; 8 | import org.fbb.balkna.model.merged.uncompressed.MainTimer; 9 | import org.fbb.balkna.model.settings.Settings; 10 | import org.fbb.balkna.model.utils.IoUtils; 11 | import org.fbb.balkna.model.utils.TimeUtils; 12 | 13 | /** 14 | * 15 | * @author jvanek 16 | */ 17 | public abstract class BasicTime { 18 | 19 | private final int originalValue; 20 | private int currentValue; 21 | private final MergedExercise originator; 22 | 23 | public BasicTime(int originalValue, MergedExercise originator) { 24 | this.originalValue = originalValue; 25 | resetTime(); 26 | this.originator = originator; 27 | } 28 | 29 | public int getCurrentValue() { 30 | return currentValue; 31 | } 32 | 33 | public int getOriginalValue() { 34 | return originalValue; 35 | } 36 | 37 | public MergedExercise getOriginator() { 38 | return originator; 39 | } 40 | 41 | @Override 42 | public String toString() { 43 | return TimeUtils.secondsToMinutes(currentValue) + "/" + TimeUtils.secondsToMinutes(originalValue); 44 | } 45 | 46 | public String getHtmlPreview1(boolean markup) { 47 | StringBuilder sb = new StringBuilder(); 48 | sb.append(getInformaiveTitle()); 49 | if (markup) { 50 | sb.append("
"); 51 | } 52 | sb.append("\n"); 53 | sb.append(TimeUtils.secondsToMinutes(originalValue)); 54 | if (markup) { 55 | sb = IoUtils.htmlWrap(sb); 56 | } 57 | return sb.toString(); 58 | } 59 | 60 | public String getInformaiveTitle() { 61 | return originator.getOriginal().getName(); 62 | } 63 | 64 | public String getEndMssage() { 65 | return Translator.R("Ende"); 66 | } 67 | 68 | public void resetTime() { 69 | this.currentValue = originalValue; 70 | } 71 | 72 | public void currentMinusMinus() { 73 | currentValue--; 74 | } 75 | 76 | public void soundLogicRuntime(MainTimer model) { 77 | BasicTime c = this; 78 | if (!Model.getModel().isLaud()) { 79 | return; 80 | } 81 | if (c.getCurrentValue() - 2 == 0) { 82 | SoundProvider.getInstance().getPSthree().playAsync(); 83 | } else if (c.getCurrentValue() - 1 == 0) { 84 | SoundProvider.getInstance().getPStwo().playAsync(); 85 | } else if (c.getCurrentValue() == 0) { 86 | SoundProvider.getInstance().getPSone().playAsync(); 87 | } else if (c.getCurrentValue() == c.getOriginalValue() / 2) { 88 | if (c instanceof PausaTime) { 89 | SoundProvider.getInstance().getPShalfPause().playAsync(); 90 | } else { 91 | SoundProvider.getInstance().getPShalfRun().playAsync(); 92 | } 93 | } else if (c.getCurrentValue() == (c.getOriginalValue()) / 4) { 94 | if (c instanceof PausaTime) { 95 | SoundProvider.getInstance().getPSthreeQatsPause().playAsync(); 96 | } else { 97 | SoundProvider.getInstance().getPSthreeQuatsRun().playAsync(); 98 | } 99 | } else if (c.getCurrentValue() == (3 * (c.getOriginalValue())) / 4) { 100 | if (Settings.getSettings().isPlayLongTermSounds()) { 101 | if (c instanceof PausaTime) { 102 | if (model.isLastExercise()) { 103 | SoundProvider.getInstance().getPSlastExercise().playAsync(); 104 | } else if (model.isHalfSerie()) { 105 | SoundProvider.getInstance().getPShalfSerie().playAsync(); 106 | } else if (model.isThreeQatsSerie()) { 107 | SoundProvider.getInstance().getPSthreeQatsSerie().playAsync(); 108 | } 109 | } 110 | if (c instanceof BigRestTime) { 111 | if (model.isLastSerie()) { 112 | SoundProvider.getInstance().getPSlastSerie().playAsync(); 113 | } else if (model.isHalfTraining()) { 114 | SoundProvider.getInstance().getPShalfTraining().playAsync(); 115 | } else if (model.isThreeQatsTraining()) { 116 | SoundProvider.getInstance().getPSthreeQatsTraining().playAsync(); 117 | } 118 | } 119 | 120 | } 121 | 122 | } 123 | } 124 | 125 | public abstract void play(); 126 | 127 | public static void playEnd() { 128 | if (!Model.getModel().isLaud()) { 129 | return; 130 | } 131 | SoundProvider.getInstance().getPStrainingEnd().playAsync(); 132 | } 133 | 134 | } 135 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/graphs/DayStatst.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.graphs; 2 | 3 | import java.text.SimpleDateFormat; 4 | import java.util.Collection; 5 | import java.util.Date; 6 | import java.util.HashMap; 7 | import java.util.Map; 8 | import java.util.Set; 9 | 10 | /** 11 | * 12 | * @author jvanek 13 | */ 14 | public class DayStatst implements Steppable { 15 | 16 | private final Date day; 17 | private final Map passes = new HashMap(); 18 | private final Map failes = new HashMap(); 19 | private final Map startss = new HashMap(); 20 | private SimpleDateFormat easyFormater; 21 | private long step; 22 | 23 | public DayStatst(Date day) { 24 | this.day = day; 25 | } 26 | 27 | public static DayStatst fake(Date day, Collection classes) { 28 | DayStatst d = new DayStatst(day); 29 | d.detach(classes); 30 | return d; 31 | } 32 | 33 | public boolean isNothing() { 34 | return isNothing(passes) 35 | && isNothing(failes) 36 | && isNothing(startss); 37 | } 38 | 39 | private static boolean isNothing(Map m) { 40 | Iterable classes = m.keySet(); 41 | for (Class classe : classes) { 42 | if (getValue(m, classe) > 0) { 43 | return false; 44 | } 45 | } 46 | return true; 47 | } 48 | 49 | public void detach(Collection classes) { 50 | detachOne(passes, classes); 51 | detachOne(failes, classes); 52 | detachOne(startss, classes); 53 | } 54 | 55 | public void detach() { 56 | detachOne(passes); 57 | detachOne(failes); 58 | detachOne(startss); 59 | } 60 | 61 | private static void detachOne(Map map) { 62 | detachOne(map, map.keySet()); 63 | } 64 | 65 | private static void detachOne(Map map, Collection classes) { 66 | for (Class classe : classes) { 67 | map.put(classe, -1); 68 | } 69 | } 70 | 71 | /** 72 | * @return the day 73 | */ 74 | public Date getDay() { 75 | return day; 76 | } 77 | 78 | public void incPass(Class c) { 79 | incValue(passes, c); 80 | } 81 | 82 | public void incFail(Class c) { 83 | incValue(failes, c); 84 | } 85 | 86 | public void incStart(Class c) { 87 | incValue(startss, c); 88 | } 89 | 90 | private static int incValue(Map map, Class c) { 91 | Integer i = map.get(c); 92 | if (i == null) { 93 | map.put(c, 1); 94 | return 1; 95 | } else { 96 | map.put(c, i + 1); 97 | return i + 1; 98 | } 99 | } 100 | 101 | public int getPasses(Class c) { 102 | return getValue(passes, c); 103 | 104 | } 105 | 106 | private static int getValue(Map map, Class c) { 107 | Integer i = map.get(c); 108 | if (i == null) { 109 | return 0; 110 | } else { 111 | return i; 112 | } 113 | } 114 | 115 | public int getFails(Class c) { 116 | return getValue(failes, c); 117 | 118 | } 119 | 120 | public int getStarts(Class c) { 121 | return getValue(startss, c); 122 | 123 | } 124 | 125 | @Override 126 | public int compareTo(DayStatst o) { 127 | return (int) (this.day.getTime() - o.day.getTime()); 128 | } 129 | 130 | public int getMax() { 131 | return Math.max(Math.max(getMax(passes), getMax(failes)), getMax(startss)); 132 | } 133 | 134 | private int getMaxi(Collection c) { 135 | int max = 0; 136 | for (Integer c1 : c) { 137 | if (c1 == null) { 138 | continue; 139 | } 140 | max = Math.max(max, c1); 141 | } 142 | return max; 143 | } 144 | 145 | private int getMax(Map map) { 146 | return getMaxi(map.values()); 147 | } 148 | 149 | public void fillClasses(Set classes) { 150 | fillClasses(classes, passes); 151 | fillClasses(classes, failes); 152 | fillClasses(classes, startss); 153 | } 154 | 155 | private void fillClasses(Set classes, Map passes) { 156 | Set k = passes.keySet(); 157 | for (Class k1 : k) { 158 | classes.add(k1); 159 | 160 | } 161 | } 162 | 163 | @Override 164 | public long getStep() { 165 | return step; 166 | } 167 | 168 | @Override 169 | public void setStep(long step) { 170 | this.step = step; 171 | } 172 | 173 | @Override 174 | public void setEasyFormater(SimpleDateFormat easyFormater) { 175 | this.easyFormater = easyFormater; 176 | } 177 | 178 | @Override 179 | public SimpleDateFormat getEasyFormater() { 180 | return easyFormater; 181 | } 182 | 183 | public String getAdaptedDateTime() { 184 | return easyFormater.format(day); 185 | } 186 | 187 | @Override 188 | public String toString() { 189 | String s = day.toString(); 190 | if (getEasyFormater() != null) { 191 | s = getAdaptedDateTime(); 192 | } 193 | s += ";passes: " + clazzesToString(passes); 194 | s += ";failes: " + clazzesToString(failes); 195 | s += ";starts: " + clazzesToString(startss); 196 | return s; 197 | } 198 | 199 | private String clazzesToString(Map m) { 200 | Set> ms = m.entrySet(); 201 | StringBuilder sb = new StringBuilder(); 202 | for (Map.Entry m1 : ms) { 203 | sb.append(m1.getKey().getSimpleName()).append(": ").append(getValue(m, m1.getKey())); 204 | } 205 | return sb.toString(); 206 | } 207 | 208 | } 209 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/merged/MergedExercise.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change merged license header, choose License Headers in Project Properties. 3 | * To change merged template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package org.fbb.balkna.model.merged; 7 | 8 | import java.util.ArrayList; 9 | import java.util.List; 10 | import org.fbb.balkna.model.Translator; 11 | import org.fbb.balkna.model.merged.uncompressed.timeUnits.BasicTime; 12 | import org.fbb.balkna.model.merged.uncompressed.timeUnits.BigRestTime; 13 | import org.fbb.balkna.model.merged.uncompressed.timeUnits.PausaTime; 14 | import org.fbb.balkna.model.merged.uncompressed.timeUnits.SmallRestTime; 15 | import org.fbb.balkna.model.merged.uncompressed.timeUnits.TrainingTime; 16 | import org.fbb.balkna.model.primitives.Exercise; 17 | import org.fbb.balkna.model.primitives.ExerciseOverrides; 18 | import org.fbb.balkna.model.primitives.Exercises; 19 | import org.fbb.balkna.model.primitives.TimeShift; 20 | import org.fbb.balkna.model.primitives.Training; 21 | import org.fbb.balkna.model.utils.TimeUtils; 22 | 23 | /** 24 | * 25 | * @author jvanek 26 | */ 27 | public class MergedExercise { 28 | 29 | //inherited 30 | private Exercise parent; 31 | //merged 32 | private Integer time; //default time of exercise in seconds 33 | private Integer iterations; //defualt number of iterations 34 | private Integer rest; //defualt time of rest after all iterations 35 | //merged and substituted if neededs 36 | private Integer pause; //default time of pause in seconds 37 | 38 | 39 | 40 | public static MergedExercise MergedExercise(ExerciseOverrides over, TimeShift t) { 41 | return MergedExercise(Exercises.getInstance().getExerciseById(over.getTargetId()), over, t); 42 | } 43 | 44 | private static MergedExercise MergedExercise(Exercise deflt, ExerciseOverrides over, TimeShift t) { 45 | MergedExercise merged = new MergedExercise(); 46 | merged.parent = deflt; 47 | 48 | merged.time = over.getTime(); 49 | merged.iterations = over.getIterations(); 50 | merged.rest = over.getRest(); 51 | merged.pause = over.getPause(); 52 | 53 | if (merged.time == null) { 54 | merged.time = deflt.getTime(); 55 | } 56 | if (merged.iterations == null) { 57 | merged.iterations = deflt.getIterations(); 58 | } 59 | if (merged.rest == null) { 60 | merged.rest = deflt.getRest(); 61 | } 62 | 63 | if (merged.pause == null) { 64 | merged.pause = deflt.getPause(); 65 | } 66 | 67 | if (merged.rest == null) { 68 | merged.rest = merged.pause; 69 | } 70 | 71 | merged.time = (int) Math.round(t.getTraining() * (double) merged.time); 72 | merged.iterations = (int) Math.round(t.getIterations()* (double) merged.iterations); 73 | merged.rest = (int) Math.round(t.getRest() * (double) merged.rest); 74 | merged.pause = (int) Math.round(t.getPause() * (double) merged.pause); 75 | 76 | return merged; 77 | 78 | } 79 | 80 | public Integer getIterations() { 81 | return iterations; 82 | } 83 | 84 | public Integer getPause() { 85 | return pause; 86 | } 87 | 88 | public Integer getRest() { 89 | return rest; 90 | } 91 | 92 | public Integer getTime() { 93 | return time; 94 | } 95 | 96 | public Exercise getOriginal() { 97 | return parent; 98 | } 99 | 100 | public String getStory(int i, boolean html) { 101 | String n = i + ") " + getOriginal().getName() + ":"; 102 | if (html) { 103 | n = "

" + n + "

"; 104 | } 105 | n += breakLine(html) + toString(html); 106 | return n; 107 | } 108 | 109 | public String toString(boolean html) { 110 | String s = Translator.R("train", TimeUtils.secondsToMinutes(getTime())) + breakLine(html) 111 | + Translator.R("rest", TimeUtils.secondsToMinutes(getPause())) + breakLine(html) 112 | + Translator.R("iterations", getIterations()) + breakLine(html) 113 | + Translator.R("finalPause", TimeUtils.secondsToMinutes(getRest())) + breakLine(html) 114 | + getOriginal().getDescription() + breakLine(html) 115 | + getImageAsTExt(html); 116 | 117 | return s; 118 | } 119 | 120 | private String breakLine(boolean html) { 121 | if (html) { 122 | return "
\n"; 123 | } 124 | return "\n"; 125 | } 126 | 127 | @Override 128 | public String toString() { 129 | return toString(false); 130 | } 131 | 132 | public List decompress(BasicTime next) { 133 | List r = new ArrayList(); 134 | if (iterations == 0) { 135 | return r; 136 | } 137 | for (int i = 1; i < iterations; i++) { 138 | r.add(new TrainingTime(getTime(), this)); 139 | r.add(new PausaTime(getPause(), this)); 140 | } 141 | r.add(new TrainingTime(getTime(), this)); 142 | if (next == null) { 143 | r.add(new BigRestTime(getRest(), this)); 144 | } else { 145 | //we know next exercise 146 | if (next.getOriginator().getOriginal().getId().equals(this.getOriginal().getId())){ 147 | r.add(new SmallRestTime(getRest(), this)); 148 | }else{ 149 | r.add(new BigRestTime(getRest(), this)); 150 | } 151 | } 152 | return r; 153 | } 154 | 155 | private String getImageAsTExt(boolean html) { 156 | StringBuilder sb = new StringBuilder(); 157 | List iims = getOriginal().getImages(); 158 | for (String iim : iims) { 159 | if (html) { 160 | sb.append(" "); 164 | } else { 165 | sb.append(iim).append(";"); 166 | } 167 | } 168 | return sb.toString(); 169 | } 170 | 171 | } 172 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/data/trainings1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | fbb1 9 | 10 | FBB training level easy 11 | FBB lehký trénink 12 | 13 | 17 | 23 | 24 | 25 | 26 | 27 | 15 28 | 10 29 | 30 | 31 | a01 32 | 33 | 34 | 38 | 39 | 40 | 41 | a02 42 | 43 | 44 | a03 45 | 46 | 47 | a04 48 | 49 | 50 | a05 51 | 52 | 53 | a06 54 | 55 | 56 | a07 57 | 58 | 59 | a08 60 | 61 | 62 | a09 63 | 64 | 65 | a10 66 | 67 | 68 | 69 | 70 | 71 | 72 | fbb2 73 | 74 | FBB training advanced 75 | FBB trénink středně těžký 76 | 77 | 81 | 84 | 85 | 86 | 87 | 88 | 10 89 | 10 90 | 91 | 92 | a01 93 | 94 | 95 | a06 96 | 97 | 98 | b03 99 | 100 | 101 | b04 102 | 103 | 104 | b05 105 | 106 | 107 | b06 108 | 109 | 110 | b07 111 | 112 | 113 | b08 114 | 115 | 116 | b09 117 | 118 | 119 | b10 120 | 121 | 122 | b11 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | fbb3 131 | 132 | FBB training hard 133 | FBB trénink těžký 134 | 135 | 138 | 139 | 140 | 141 | 142 | 10 143 | 10 144 | 145 | 146 | c01 147 | 148 | 149 | b03 150 | 151 | 152 | b07 153 | 154 | 155 | b08 156 | 157 | 158 | c05 159 | 160 | 161 | c06 162 | 163 | 164 | c07 165 | 166 | 167 | b08 168 | 169 | 170 | c09 171 | 172 | 173 | c10 174 | 175 | 176 | c11 177 | 178 | 179 | 180 | 181 | 182 | 183 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/primitives/TrainingOverrides.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.primitives; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | import org.fbb.balkna.model.Translator; 6 | import org.fbb.balkna.model.utils.TimeUtils; 7 | import org.fbb.balkna.model.utils.XmlConstants; 8 | import static org.fbb.balkna.model.utils.XmlConstants.ITERATIONS; 9 | import static org.fbb.balkna.model.utils.XmlConstants.PAUSE; 10 | import static org.fbb.balkna.model.utils.XmlConstants.REST; 11 | import static org.fbb.balkna.model.utils.XmlConstants.TIME; 12 | import org.fbb.balkna.model.utils.XmlUtils; 13 | import static org.fbb.balkna.model.utils.XmlUtils.getRealChilds; 14 | import org.w3c.dom.Element; 15 | 16 | /** 17 | * 18 | * @author jvanek 19 | */ 20 | public class TrainingOverrides { 21 | 22 | private final String targetId; 23 | //overrides 24 | private final Double time; // time of exercise multiplyer 25 | private final Double pause; //time of pause multiplyer 26 | private final Double iterations; //number of iterations multiplyer 27 | private final Double rest; //time of rest after all iterations multiplyer 28 | 29 | private final Pause restday; 30 | 31 | private TrainingOverrides(Double time, Double pause, Double iterations, Double rest, String targetId, Pause sb) { 32 | if (targetId == null) { 33 | throw new NullPointerException(); 34 | } 35 | this.time = time; 36 | this.pause = pause; 37 | this.iterations = iterations; 38 | this.rest = rest; 39 | this.targetId = targetId; 40 | this.restday = sb; 41 | } 42 | 43 | static TrainingOverrides parse(Element excercise) { 44 | String targetId = null; 45 | Double time = null; 46 | Double pause = null; 47 | Double iterations = null; 48 | Double rest = null; 49 | Pause restday = null; 50 | //jdk6:( 51 | List idAndOverrides = getRealChilds(excercise); 52 | for (Element idOrOVerrides : idAndOverrides) { 53 | if (idOrOVerrides.getNodeName().equals(XmlConstants.ID)) { 54 | targetId = idOrOVerrides.getTextContent(); 55 | } else if (idOrOVerrides.getNodeName().equals(XmlConstants.SUGGESTBREAK)) { 56 | restday = Pause.parse(idOrOVerrides); 57 | } else if (idOrOVerrides.getNodeName().equals(XmlConstants.CHANGES)) { 58 | List l = getRealChilds(idOrOVerrides); 59 | for (Element nn : l) { 60 | if (nn.getNodeName().equals(TIME)) { 61 | time = Double.valueOf(nn.getTextContent()); 62 | } else if (nn.getNodeName().equals(PAUSE)) { 63 | pause = Double.valueOf(nn.getTextContent()); 64 | } else if (nn.getNodeName().equals(ITERATIONS)) { 65 | iterations = Double.valueOf(nn.getTextContent()); 66 | } else if (nn.getNodeName().equals(REST)) { 67 | rest = Double.valueOf(nn.getTextContent()); 68 | } 69 | } 70 | } 71 | } 72 | if (targetId == null) { 73 | System.err.println("no id for " + excercise.toString()); 74 | } 75 | if (time == null) { 76 | time = 1d; 77 | } 78 | if (pause == null) { 79 | pause = 1d; 80 | } 81 | if (iterations == null) { 82 | iterations = 1d; 83 | } 84 | if (rest == null) { 85 | rest = 1d; 86 | } 87 | return new TrainingOverrides(time, pause, iterations, rest, targetId, restday); 88 | } 89 | 90 | public Training getTraining() { 91 | Training base = Trainings.getInstance().getTrainingById(targetId); 92 | if (base == null) { 93 | return null; 94 | } 95 | return base.transform(this); 96 | 97 | } 98 | 99 | public Double getIterations() { 100 | return iterations; 101 | } 102 | 103 | public Double getPause() { 104 | return pause; 105 | } 106 | 107 | public Double getRest() { 108 | return rest; 109 | } 110 | 111 | public Double getTime() { 112 | return time; 113 | } 114 | 115 | public String getTargetId() { 116 | return targetId; 117 | } 118 | 119 | public Pause getRestday() { 120 | return restday; 121 | } 122 | 123 | 124 | @Override 125 | public String toString() { 126 | return getHeader(0, false); 127 | } 128 | 129 | String getHeader(int i, boolean html) { 130 | 131 | String n = i + ") " + Trainings.getInstance().getTrainingById(targetId).getName(); 132 | n += breakLine(html) + toString(html); 133 | return n; 134 | } 135 | 136 | public String toString(boolean html) { 137 | String s = Translator.R("train", (getTime())) + breakLine(html) 138 | + Translator.R("rest", (getPause())) + breakLine(html) 139 | + Translator.R("iterations", getIterations()) + breakLine(html) 140 | + Translator.R("finalPause", (getRest())) + breakLine(html); 141 | if (restday != null) { 142 | if (html) { 143 | s += ""; 144 | } 145 | s += " ** " + Translator.R("restDay") + " ** " + restday.getDescription() + breakLine(html); 146 | if (html) { 147 | s += "" + breakLine(html); 148 | } 149 | } 150 | return s; 151 | } 152 | 153 | private String breakLine(boolean html) { 154 | if (html) { 155 | return "
\n"; 156 | } 157 | return "\n"; 158 | } 159 | 160 | public static class Pause { 161 | 162 | private final String description; 163 | private final List localisedDescriptions; 164 | 165 | public Pause(String description, List localisedDescriptions) { 166 | this.description = description; 167 | this.localisedDescriptions = localisedDescriptions; 168 | } 169 | 170 | private static Pause parse(Element node) { 171 | String description = null; 172 | List localisedDescriptions = new ArrayList(); 173 | List interlayer = XmlUtils.getRealChilds(node); 174 | for (Element n : interlayer) { 175 | if (n.getNodeName().equals(XmlConstants.DESCRIPTIONS)) { 176 | description = XmlUtils.getDefaultDescription(n); 177 | localisedDescriptions = XmlUtils.getLocalisedDescriptions(n); 178 | } 179 | } 180 | return new Pause(description, localisedDescriptions); 181 | 182 | } 183 | 184 | public String getDescription() { 185 | String s = LocalisedString.findLocalised(localisedDescriptions); 186 | if (s != null) { 187 | return s; 188 | } 189 | if (description == null) { 190 | return ""; 191 | } 192 | return description; 193 | } 194 | } 195 | 196 | } 197 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/primitives/ExerciseOverrides.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.primitives; 2 | 3 | import java.util.List; 4 | import org.fbb.balkna.model.utils.TimeUtils; 5 | import org.fbb.balkna.model.utils.XmlConstants; 6 | import static org.fbb.balkna.model.utils.XmlConstants.ITERATIONS; 7 | import static org.fbb.balkna.model.utils.XmlConstants.PAUSE; 8 | import static org.fbb.balkna.model.utils.XmlConstants.REST; 9 | import static org.fbb.balkna.model.utils.XmlConstants.TIME; 10 | import static org.fbb.balkna.model.utils.XmlUtils.getRealChilds; 11 | import org.w3c.dom.Element; 12 | 13 | /** 14 | * 15 | * @author jvanek 16 | */ 17 | public class ExerciseOverrides { 18 | 19 | private final String targetId; 20 | //overrides 21 | private final Integer time; //default time of exercise in seconds 22 | private final Integer pause; //default time of pause in seconds 23 | private final Integer iterations; //defualt number of iterations 24 | private final Integer rest; //defualt time of rest after all iterations 25 | 26 | public ExerciseOverrides(Integer time, Integer pause, Integer iterations, Integer rest, String targetId) { 27 | if (targetId == null) { 28 | throw new NullPointerException(); 29 | } 30 | this.time = time; 31 | this.pause = pause; 32 | this.iterations = iterations; 33 | this.rest = rest; 34 | this.targetId = targetId; 35 | } 36 | 37 | static class Override { 38 | 39 | static Override read(Element idOrOVerrides) { 40 | Override o = new Override(); 41 | List l = getRealChilds(idOrOVerrides); 42 | for (Element nn : l) { 43 | if (nn.getNodeName().equals(TIME)) { 44 | o.time = Integer.valueOf(nn.getTextContent()); 45 | } else if (nn.getNodeName().equals(PAUSE)) { 46 | o.pause = Integer.valueOf(nn.getTextContent()); 47 | } else if (nn.getNodeName().equals(ITERATIONS)) { 48 | o.iterations = Integer.valueOf(nn.getTextContent()); 49 | } else if (nn.getNodeName().equals(REST)) { 50 | o.rest = Integer.valueOf(nn.getTextContent()); 51 | } 52 | } 53 | return o; 54 | } 55 | 56 | Integer time = null; 57 | Integer pause = null; 58 | Integer iterations = null; 59 | Integer rest = null; 60 | 61 | public Override() { 62 | } 63 | 64 | private void copyApplicable(Override defaultOverride) { 65 | if (time == null){ 66 | time = defaultOverride.time; 67 | } 68 | if (pause == null){ 69 | pause = defaultOverride.pause; 70 | } 71 | if (iterations == null){ 72 | iterations = defaultOverride.iterations; 73 | } 74 | if (rest == null){ 75 | rest = defaultOverride.rest; 76 | } 77 | } 78 | 79 | } 80 | 81 | static ExerciseOverrides parse(Element excercise) { 82 | return parse(excercise, new Override()); 83 | } 84 | static ExerciseOverrides parse(Element excercise, Override defaultOverride) { 85 | String targetId = null; 86 | Override o = new Override(); 87 | //jdk6:( 88 | List idAndOverrides = getRealChilds(excercise); 89 | for (Element idOrOVerrides : idAndOverrides) { 90 | if (idOrOVerrides.getNodeName().equals(XmlConstants.ID)) { 91 | targetId = idOrOVerrides.getTextContent(); 92 | } else if (idOrOVerrides.getNodeName().equals(XmlConstants.OVERRIDES)) { 93 | o = Override.read(idOrOVerrides); 94 | 95 | } 96 | } 97 | if (targetId == null) { 98 | System.err.println("no id for " + excercise.toString()); 99 | } 100 | o.copyApplicable(defaultOverride); 101 | return new ExerciseOverrides(o.time, o.pause, o.iterations, o.rest, targetId); 102 | } 103 | 104 | public Integer getIterations() { 105 | return iterations; 106 | } 107 | 108 | public Integer getPause() { 109 | return pause; 110 | } 111 | 112 | public Integer getRest() { 113 | return rest; 114 | } 115 | 116 | public Integer getTime() { 117 | return time; 118 | } 119 | 120 | public String getTargetId() { 121 | return targetId; 122 | } 123 | 124 | ExerciseOverrides transform(TrainingOverrides override) { 125 | Exercise src = Exercises.getInstance().getExerciseById(targetId); 126 | Integer t = time; 127 | Integer p = pause; 128 | Integer it = iterations; 129 | Integer r = rest; 130 | String id = targetId; 131 | 132 | if (t == null) { 133 | t = src.getTime(); 134 | } 135 | if (p == null) { 136 | p = src.getPause(); 137 | } 138 | if (it == null) { 139 | it = src.getIterations(); 140 | } 141 | if (r == null) { 142 | r = src.getRest(); 143 | } 144 | double tt = (double) t * override.getTime(); 145 | double pp = (double) p * override.getPause(); 146 | double iitt = (double) it * override.getIterations(); 147 | double rr = (double) r * override.getRest(); 148 | return new ExerciseOverrides((int) tt, (int) pp, (int) iitt, (int) rr, targetId); 149 | } 150 | 151 | public static ExerciseOverrides fakeFromString(String s) { 152 | return fakeFromString(s, "TmpPreview"); 153 | } 154 | 155 | public static ExerciseOverrides fakeFromString(String s, String id) { 156 | Integer time = null; 157 | Integer pause = null; 158 | Integer iterations = null; 159 | Integer rest = null; 160 | String[] ss = s.split("\\W+"); 161 | if (ss.length == 4) { 162 | time = stringToIntSafe(ss[0]); 163 | pause = stringToIntSafe(ss[1]); 164 | iterations = stringToIntSafe(ss[2]); 165 | rest = stringToIntSafe(ss[3]); 166 | } 167 | return new ExerciseOverrides(time, pause, iterations, rest, id); 168 | 169 | } 170 | 171 | private static Integer stringToIntSafe(String s) { 172 | try { 173 | return Integer.valueOf(s.trim()); 174 | } catch (Throwable t) { 175 | return null; 176 | } 177 | } 178 | 179 | public String format() { 180 | String s = ""; 181 | if (time != null) { 182 | s += TimeUtils.secondsToMinutes(time); 183 | } else { 184 | s += " --"; 185 | } 186 | 187 | if (pause != null) { 188 | s += " " + TimeUtils.secondsToMinutes(pause); 189 | } else { 190 | s += " --"; 191 | } 192 | 193 | if (iterations != null) { 194 | s += " " + iterations + "x"; 195 | } else { 196 | s += " --"; 197 | } 198 | 199 | if (rest != null) { 200 | s += " " + TimeUtils.secondsToMinutes(rest); 201 | } else { 202 | s += " --"; 203 | } 204 | 205 | return s; 206 | } 207 | 208 | } 209 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/swing/locales/bundles/Messages.properties: -------------------------------------------------------------------------------- 1 | # Default (English) model messages 2 | 3 | RNoResource=No text found for: {0} 4 | 5 | StartTraining=Start training 6 | StartTraining1=Start cycle 7 | StartTraining2=Continue cycle 8 | StartTraining3=Finish cycle 9 | 10 | SwingInfoLine1=Click to training for more info. Press F1 for settings. 11 | SwingInfoLine2=Click to right side of images will scroll images right. Left, oposite. 12 | SwingInfoLine3=In training window, left click to list or description text will make it disappear. 13 | SwingInfoLine4=In training window, right click to image will move it to timer panel 14 | SwingInfoLine5=Clicking the timer will reappear all hidden panels. 15 | SwingInfoLine6=Double click will remove set central image. 16 | 17 | 18 | AndroidInfoLine1=Touch training for more info. Even more info by long touch on text. Change everything on *** settings. 19 | AndroidInfoLine2=Touch right side of images will scroll images right. Left, oposite. 20 | AndroidInfoLine3=In training window, touch the list or description text to make it disappear. 21 | AndroidInfoLine4=In training window, long touch on image will move it to timer panel 22 | AndroidInfoLine5=Touching the timer will reappear all hidden panels. 23 | AndroidInfoLine6=Long touch will remove image from central image. 24 | 25 | AndroidAdvanced=Show advanced buttons 26 | 27 | AndroidBackTraining=Are you sure to cancel training? 28 | AndroidBackYes=Ok, give up 29 | AndroidBackNo=No, continue training 30 | 31 | AndroidDownloadTitle=Download started, please wait to it finish. 32 | AndroidDownloadMessage=You have just started to download plugin {0}. Please wait until it is finished and installed. (still better then frozen app, huh?) 33 | AndroidDownloadFinishedTitle=Download completed. 34 | AndroidDownloadFinishedMessage=You have just download plugin {0}. Do anything to start installation. 35 | AndroidDownloadTitle=FBB balkna new plugin: {0} 36 | 37 | NoCyclesFound=Is this empty? Try download FlashBalknaTestPlugin (defualt in Training Settings),\n or read FlashBalknaTestPlugin's README.md (on same URL as plugin) and create your own cycles/trainings/exercises! 38 | 39 | ForceRaatio=force images to keep ratio 40 | Autoiterate=autoiterate images on timer with speed (s): (0 disabled) 41 | mute=mute 42 | Soundpack=Soundpack: 43 | SetSoundpack=Set soundpack 44 | playLongTermSounds=Play also training and series related sounds 45 | 46 | localPlugin=Load plugin from filesystem. Experimental!!! 47 | 48 | Test=Test 49 | LanguageChange=Change trainings language 50 | Language=Language: 51 | TutorialModeLabel=-- Tutorial mode settings -- 52 | PauseOnExercise=pause on each new exercise 53 | PauseOnSerie=pause on each new serie 54 | CheaterSettings=-- Cheater settings -- 55 | Skipping=allow skipping 56 | Credits=-- For FBB application by judovana -- 57 | Close=Save and close 58 | Export=Export current training to Html 59 | ExportAndroid=Export current training to Html via long touch on description 60 | Upload=Download following jar as trainings 61 | directDownload=Direct download (will freeze during download, but may overcome some permission issues) 62 | alowScreenChange=Allow the dynamical changes of layout when items in training are clicked 63 | inhibitSleepAndroid=Forbid android to fall asleep during training 64 | invertScreenLayout=Invert default behavior, when small screens show main training view 65 | saveStats=Save statistics 66 | 67 | 68 | trainingBack=Training back 69 | trainingFwd=Training forward 70 | trainingCurrent=Current training: {0} 71 | 72 | resetButton=Reset settings to default values 73 | 74 | jumpBack=Jump back 75 | # not localised, there is logoc on this button 76 | #Start=Start! 77 | skipForward=Skip forward 78 | 79 | ManagePlugins=Manage plugins 80 | ExerciseModifiers=Exercise modifiers (you need to restart the training to make them effect): 81 | TrainingTimesModifier=Training times modifier: 82 | PauseTimesModifier=Pause times modifier: 83 | RestTimesModifier=Rest times modifier: 84 | iterationsModifiers=Iterations modifier: 85 | singleTrainingOverride=Overrides default settings of Individual Exercises. 4 numbers (or letters to ignore the field) - Time Pause Iterations Rest 86 | CylesClearWarning=Are you sure you wont to delete all recorded progress on cycles? 87 | 88 | SaveForOfline=Save for offline usage 89 | DeletePlugin=Delete (please restart app rather) 90 | 91 | 92 | settingsTab=Training Settings 93 | appearenceTab=Appearence 94 | statsTab=Statistics 95 | 96 | colorsInfo=Here you can change some system colors/sizes. Long touch/righ click/0 for *system* value. Also not all changes may be immidiate. 97 | trainingDelimiterSizeLabel=Width of line between trainings (android only) 98 | trainingDelimiterColorLabel=Color of trainings delimiter line (android only) 99 | selectedItemColorLabel=Color of selected item in lists (android only) 100 | mainTimerSizeLabel=Size of text of main timer 101 | mainTimerColorLabel=Color of text in main timer 102 | mainTimerPositionLabelV=Position of label in main timer (vertical) 103 | mainTimerPositionLabelH=Position of label in main timer (horizontal) 104 | 105 | mainTabExercise=Individual Exercises 106 | mainTabTrainings=Trainings 107 | mainTabCycles=Long-term Cycles 108 | delete=Delete 109 | messages=Messages 110 | Next=Graphs 111 | 112 | # TUI 113 | NoGui=Cant start GUI, switching to TUI 114 | TuiWelcome=Welcome to geek's training TUI 115 | TuiHelp1=You can disable all graphic/sound operations by -disableImages and -disableSounds. 116 | TuiHelp2=You can control the output in same way as ConsoleImageViewer does (just without file): 117 | # rendering is from n to 1 118 | TuiMainCommands1=Type "train " to start training 119 | TuiMainCommands11=Type "train t p r i" to start training with time shift 120 | TuiMainCommands12=Where t p r i are floating numbers for Training Pause Rest Iteration shift" 121 | TuiMainCommands2=Type "info " to show info training 122 | TuiMainCommands3=Type "images " to show training images 123 | TuiMainCommands4=Type "exit" or "quit" to exit 124 | TuiMainCommands5=Type "properties" to list settings 125 | TuiMainCommands6=All changes of settigns goes through {0} or via "set PROPERTY=value" 126 | TuiMainCommands7=Or "get URL", where url is plugin. Plugin got like this will not be saved 127 | TuiMainCommands8=You must downlaod plugins manually (or via gui) to {0}/plugins 128 | TuiMainCommands9=Type "export " to export training to html and palin text 129 | TuiMainCommands10=Type "save" to save settings 130 | TuiMainCommands20=Type "sound" to test sounds. You can type also soundpack as parameter. 131 | TuiMainCommands100=Type "trainings" to list trainings, "exercises" to list exercise, "cycles" to lst cycles 132 | TuiMainCommands101=Type "statistics" to print statistics. As addition you may type 4x true/false to show: exercises, trainings, cycles, messages. Defaults are "statistics false true true false. 133 | TuiMainCommands103=Type "known-plugins" to tempt network and cache for list of known-plugins. 134 | TuiMainCommands102=Type "history" or "h" for history of commands. With optional parameter it substitute Nth command (0, latest. Synonym hh.) 135 | 136 | TuiPause=Paused on demand! Press enter to continue, type p/n and enter for previous/next image. s for skip and b for back 137 | 138 | TuiSoundDissabled=Warning, sounds are globally disabled! 139 | TuiImagesDissabled=Warning, images are globally disabled! 140 | 141 | TuiSoundInfo1 = available soundpacks: 142 | TuiSoundInfo2 = Playing from {0} 143 | 144 | PPnetwork=List correctly obtained from network. 145 | PPcache=Network failure, list obtained from latest known source. 146 | PPlocal=No network or cached source. Using outdated in-app list. 147 | PPerror=Error to get any list. Sorry. 148 | PPstate=State 149 | PPstateTesting=Testing 150 | PPstateSable=Stable 151 | PPstateUnknow=Unknown 152 | PPhomePage=Home Page 153 | PPlink=Direct link 154 | PPuse=Use 155 | PPdesc=Description 156 | PPkp=Known Plugins 157 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/settings/PluginlistProvider.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.settings; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.BufferedWriter; 5 | import java.io.File; 6 | import java.io.FileOutputStream; 7 | import java.io.IOException; 8 | import java.io.InputStreamReader; 9 | import java.io.OutputStreamWriter; 10 | import java.net.MalformedURLException; 11 | import java.net.URL; 12 | import java.nio.charset.StandardCharsets; 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | import org.fbb.balkna.swing.locales.SwingTranslator; 16 | 17 | /** 18 | * 19 | * @author jvanek 20 | */ 21 | public class PluginlistProvider { 22 | 23 | private static final String FILE_NAME = "known-plugins"; 24 | private static final String exUrl = "https://raw.githubusercontent.com/judovana/FlashBalknaModel/master/src/org/fbb/balkna/" + FILE_NAME; 25 | private static final String inPath = "/org/fbb/balkna/" + FILE_NAME; 26 | 27 | private static URL getExURL() throws MalformedURLException { 28 | return new URL(exUrl); 29 | } 30 | 31 | private static URL getInURL() throws MalformedURLException { 32 | return PluginlistProvider.class.getResource(inPath); 33 | } 34 | 35 | private static URL getCachedURL() throws MalformedURLException { 36 | return getCacheFile().toURI().toURL(); 37 | } 38 | 39 | private static File getCacheFile() throws MalformedURLException { 40 | return new File(System.getProperty("java.io.tmpdir"), FILE_NAME); 41 | } 42 | 43 | public static enum PluginState { 44 | 45 | STABLE, TESTING, UNKNOWN; 46 | 47 | public String getResolution() { 48 | switch (this) { 49 | case STABLE: 50 | return SwingTranslator.R("PPstateSable"); 51 | case TESTING: 52 | return SwingTranslator.R("PPstateTesting"); 53 | case UNKNOWN: 54 | return SwingTranslator.R("PPstateUnknow"); 55 | } 56 | return "Unknown Error explaining state"; 57 | } 58 | 59 | } 60 | 61 | public static class ParsedLine { 62 | 63 | private final String stateOrig; 64 | private final PluginState state; 65 | private final String homePageOrig; 66 | private final URL homePage; 67 | private final String urlOrig; 68 | private final URL url; 69 | private final String description; 70 | 71 | public ParsedLine(String stateOrig, String homePageOrig, String urlOrig, String description) throws MalformedURLException { 72 | this.stateOrig = stateOrig; 73 | this.homePageOrig = homePageOrig; 74 | this.urlOrig = urlOrig; 75 | this.description = description; 76 | homePage = new URL(this.homePageOrig); 77 | url = new URL(this.urlOrig); 78 | if (this.stateOrig.equalsIgnoreCase("testing")) { 79 | state = PluginState.TESTING; 80 | } else if (this.stateOrig.equalsIgnoreCase("stable")) { 81 | state = PluginState.STABLE; 82 | } else { 83 | state = PluginState.UNKNOWN; 84 | } 85 | } 86 | 87 | public URL getHomePage() { 88 | return homePage; 89 | } 90 | 91 | public PluginState getState() { 92 | return state; 93 | } 94 | 95 | public String getDescription() { 96 | return description; 97 | } 98 | 99 | public URL getUrl() { 100 | return url; 101 | } 102 | 103 | private String getLine() { 104 | return stateOrig + ";;" + homePageOrig + ";;" + urlOrig + ";;" + description; 105 | } 106 | 107 | } 108 | 109 | private static List readFromUrl(URL u) throws IOException { 110 | List r = new ArrayList(); 111 | BufferedReader in = null; 112 | try { 113 | in = new BufferedReader(new InputStreamReader(u.openStream(), StandardCharsets.UTF_8)); 114 | while (true) { 115 | String s = in.readLine(); 116 | if (s == null) { 117 | break; 118 | } 119 | s = s.trim(); 120 | if (s.startsWith("#")) { 121 | continue; 122 | } 123 | String[] ss = s.split(";;+"); 124 | r.add(new ParsedLine(ss[0].trim(), ss[1].trim(), ss[2].trim(), ss[3].trim())); 125 | } 126 | } finally { 127 | if (in != null) { 128 | in.close(); 129 | } 130 | } 131 | return r; 132 | } 133 | 134 | private static void cache(List items) throws IOException { 135 | save(getCacheFile(), items); 136 | } 137 | 138 | private static void save(File f, List items) throws IOException { 139 | BufferedWriter in = null; 140 | try { 141 | in = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), StandardCharsets.UTF_8)); 142 | for (ParsedLine item : items) { 143 | in.write(item.getLine()); 144 | in.newLine(); 145 | } 146 | } finally { 147 | if (in != null) { 148 | in.close(); 149 | } 150 | } 151 | 152 | } 153 | 154 | public static enum LoadedPluginsState { 155 | 156 | NETWORK, CACHE, LOCAL, FATALTY; 157 | 158 | public String getResolution() { 159 | switch (this) { 160 | case NETWORK: 161 | return SwingTranslator.R("PPnetwork"); 162 | case CACHE: 163 | return SwingTranslator.R("PPcache"); 164 | case LOCAL: 165 | return SwingTranslator.R("PPlocal"); 166 | case FATALTY: 167 | return SwingTranslator.R("PPerror"); 168 | } 169 | return "Unknown Error explaining state"; 170 | } 171 | } 172 | 173 | public static class LoadedPlugins { 174 | 175 | private final List r; 176 | private final LoadedPluginsState w; 177 | 178 | public LoadedPlugins(List r, LoadedPluginsState w) { 179 | this.r = r; 180 | this.w = w; 181 | } 182 | 183 | public List getResult() { 184 | return r; 185 | } 186 | 187 | public LoadedPluginsState getSource() { 188 | return w; 189 | } 190 | 191 | @Override 192 | public String toString() { 193 | return super.toString() + " - " + r.size() + " - " + w; 194 | } 195 | 196 | } 197 | 198 | public static LoadedPlugins obtain() { 199 | List r = null; 200 | //network 201 | try { 202 | r = readFromUrl(getExURL()); 203 | if (r != null && !r.isEmpty()) { 204 | try { 205 | //save it 206 | cache(r); 207 | System.out.println("Cache updated sucesfully. " + getCacheFile()); 208 | } catch (Exception ex) { 209 | ex.printStackTrace(); 210 | } 211 | System.out.println("Loaded remote file. " + getExURL()); 212 | return new LoadedPlugins(r, LoadedPluginsState.NETWORK); 213 | } 214 | } catch (Exception ex) { 215 | ex.printStackTrace(); 216 | } 217 | //cache 218 | try { 219 | r = readFromUrl(getCachedURL()); 220 | if (r != null && !r.isEmpty()) { 221 | System.out.println("Read from cache: " + getCacheFile()); 222 | return new LoadedPlugins(r, LoadedPluginsState.CACHE); 223 | } 224 | } catch (Exception ex) { 225 | ex.printStackTrace(); 226 | } 227 | 228 | try { 229 | r = readFromUrl(getInURL()); 230 | if (r != null && !r.isEmpty()) { 231 | System.out.println("Read from app: " + getInURL()); 232 | return new LoadedPlugins(r, LoadedPluginsState.LOCAL); 233 | } 234 | } catch (Exception ex) { 235 | ex.printStackTrace(); 236 | } 237 | System.out.println("All ways failed"); 238 | return new LoadedPlugins(new ArrayList(0), LoadedPluginsState.FATALTY); 239 | } 240 | 241 | public static void main(String... args) { 242 | LoadedPlugins r = obtain(); 243 | System.out.println("" + r); 244 | } 245 | 246 | } 247 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/primitives/Exercise.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model.primitives; 2 | 3 | import org.fbb.balkna.model.Substituable; 4 | import java.io.BufferedReader; 5 | import java.io.BufferedWriter; 6 | import java.io.File; 7 | import java.io.IOException; 8 | import java.util.ArrayList; 9 | import java.util.Collections; 10 | import java.util.List; 11 | import org.fbb.balkna.model.Model; 12 | import org.fbb.balkna.model.Statisticable; 13 | import org.fbb.balkna.model.primitives.history.NonRepeatedArrayList; 14 | import org.fbb.balkna.model.primitives.history.Record; 15 | import org.fbb.balkna.model.primitives.history.RecordType; 16 | import org.fbb.balkna.model.primitives.history.StatisticHelper; 17 | import org.fbb.balkna.model.utils.IoUtils; 18 | import org.fbb.balkna.model.utils.XmlUtils; 19 | import static org.fbb.balkna.model.utils.XmlUtils.getRealChilds; 20 | import org.w3c.dom.Node; 21 | import static org.fbb.balkna.model.utils.XmlConstants.*; 22 | import org.w3c.dom.Element; 23 | 24 | /** 25 | * 26 | * @author jvanek 27 | */ 28 | public class Exercise implements Substituable, Statisticable { 29 | 30 | private final String id; 31 | private final String name; 32 | private final List localisedNames; 33 | private final String description; 34 | private final List localisedDescriptions; 35 | private final List images; 36 | //defaults 37 | private final Integer time; //default time of exercise in seconds 38 | private final Integer pause; //default time of pause in seconds 39 | private final Integer iterations; //defualt number of iterations 40 | private final Integer rest; //defualt time of rest after all iterations 41 | 42 | private final List statistics = new NonRepeatedArrayList(); 43 | private boolean load = false; 44 | 45 | private Exercise(String id, String name, String des, Integer time, Integer pause, Integer iters, Integer rest, List localisedNames, List localisedDescriptions, List images) { 46 | if (id == null) { 47 | throw new NullPointerException(); 48 | } 49 | this.id = id; 50 | this.name = name; 51 | this.description = des; 52 | this.time = time; 53 | this.pause = pause; 54 | this.iterations = iters; 55 | this.rest = rest; 56 | this.localisedNames = localisedNames; 57 | this.localisedDescriptions = localisedDescriptions; 58 | this.images = images; 59 | Model.substituteImages(images, this); 60 | } 61 | 62 | public static Exercise parse(final Node node, SetDefaults defaults) { 63 | 64 | String id = null; 65 | String name = null; 66 | List localisedNames = new ArrayList(); 67 | String description = null; 68 | List localisedDescriptions = new ArrayList(); 69 | List images = new ArrayList(); 70 | Integer time = null; 71 | Integer pause = null; 72 | Integer iterations = null; 73 | Integer rest = null; 74 | List interlayer = XmlUtils.getRealChilds(node); 75 | for (Element n : interlayer) { 76 | //jdk6 comaptible:( 77 | if (n.getNodeName().equals(ID)) { 78 | id = n.getTextContent(); 79 | } else if (n.getNodeName().equals(NAMES)) { 80 | name = XmlUtils.getDefaultName(n); 81 | localisedNames = XmlUtils.getLocalisedNames(n); 82 | } else if (n.getNodeName().equals(DESCRIPTIONS)) { 83 | description = XmlUtils.getDefaultDescription(n); 84 | localisedDescriptions = XmlUtils.getLocalisedDescriptions(n); 85 | } else if (n.getNodeName().equals(IMAGES)) { 86 | images = XmlUtils.getImages(n); 87 | } else if (n.getNodeName().equals(DEFAULTS)) { 88 | List l = getRealChilds(n); 89 | for (Element nn : l) { 90 | if (nn.getNodeName().equals(TIME)) { 91 | time = Integer.valueOf(nn.getTextContent()); 92 | } else if (nn.getNodeName().equals(PAUSE)) { 93 | pause = Integer.valueOf(nn.getTextContent()); 94 | } else if (nn.getNodeName().equals(ITERATIONS)) { 95 | iterations = Integer.valueOf(nn.getTextContent()); 96 | } else if (nn.getNodeName().equals(REST)) { 97 | rest = Integer.valueOf(nn.getTextContent()); 98 | break; 99 | } 100 | } 101 | break; 102 | 103 | } 104 | } 105 | if (time == null) { 106 | time = defaults.getTime(); 107 | } 108 | if (pause == null) { 109 | pause = defaults.getPause(); 110 | } 111 | if (iterations == null) { 112 | iterations = defaults.getIterations(); 113 | } 114 | if (rest == null) { 115 | rest = defaults.getRest(); 116 | } 117 | return new Exercise(id, name, description, time, pause, iterations, rest, localisedNames, localisedDescriptions, images); 118 | } 119 | 120 | @Override 121 | public String getId() { 122 | return id; 123 | } 124 | 125 | @Override 126 | public String getIdAsMcro() { 127 | return "%{e-"+getId()+";"+getName()+"}"; 128 | } 129 | 130 | @Override 131 | public String getName() { 132 | String s = LocalisedString.findLocalised(localisedNames); 133 | if (s != null) { 134 | return s; 135 | } 136 | return name; 137 | } 138 | 139 | public String getDescription() { 140 | String s = getDescriptionIml(); 141 | if (s == null) { 142 | return getName(); 143 | } 144 | return s; 145 | } 146 | 147 | private String getDescriptionIml() { 148 | String s = LocalisedString.findLocalised(localisedDescriptions); 149 | if (s != null) { 150 | return s; 151 | } 152 | return description; 153 | } 154 | 155 | public Integer getTime() { 156 | return time; 157 | } 158 | 159 | public Integer getPause() { 160 | return pause; 161 | } 162 | 163 | public Integer getIterations() { 164 | return iterations; 165 | } 166 | 167 | public Integer getRest() { 168 | return rest; 169 | } 170 | 171 | public List getImages() { 172 | return Collections.unmodifiableList(images); 173 | } 174 | 175 | @Override 176 | public String toString() { 177 | return getName(); 178 | } 179 | 180 | List getLocalisedNames() { 181 | return localisedNames; 182 | } 183 | 184 | List getLocalisedDescriptions() { 185 | return localisedDescriptions; 186 | } 187 | 188 | 189 | @Override 190 | public File getFile() { 191 | return new File(Exercises.getStatsDir(), getId()); 192 | } 193 | 194 | public void load() { 195 | try { 196 | IoUtils.loadStatisticable(this); 197 | } catch (Exception ex) { 198 | ex.printStackTrace(); 199 | } 200 | } 201 | 202 | @Override 203 | public void load(BufferedReader fr) throws IOException { 204 | if (load) { 205 | return; 206 | } 207 | load = true; 208 | while (true) { 209 | String s = fr.readLine(); 210 | if (s == null) { 211 | break; 212 | } 213 | if (s.trim().isEmpty()){ 214 | continue; 215 | 216 | } 217 | statistics.add(Record.fromString(s)); 218 | } 219 | 220 | } 221 | 222 | public void save() { 223 | try { 224 | IoUtils.saveStatisticable(this); 225 | } catch (Exception ex) { 226 | ex.printStackTrace(); 227 | } 228 | } 229 | 230 | @Override 231 | public void save(BufferedWriter fr) throws IOException { 232 | for (Record r : statistics) { 233 | fr.write(r.toString()); 234 | fr.newLine(); 235 | 236 | } 237 | 238 | } 239 | 240 | @Override 241 | public List getRecords() { 242 | load(); 243 | return Collections.unmodifiableList(statistics); 244 | } 245 | 246 | private Record lastRecord; 247 | @Override 248 | public synchronized void addRecord(Record r) { 249 | load(); 250 | if (lastRecord == null) { 251 | statistics.add(r); 252 | save(); 253 | } else { 254 | Record q = lastRecord; 255 | if (Math.abs(q.compareTo(r)) > Record.minTime && q.getWhat()!=r.getWhat()) {//somebody clicking to fast? 256 | statistics.add(r); 257 | save(); 258 | } 259 | } 260 | lastRecord = r; 261 | 262 | } 263 | 264 | @Override 265 | public StatisticHelper getStatsHelper() { 266 | return new StatisticHelper(this); 267 | } 268 | 269 | } 270 | -------------------------------------------------------------------------------- /src/org/fbb/balkna/model/SoundProvider.java: -------------------------------------------------------------------------------- 1 | package org.fbb.balkna.model; 2 | 3 | import java.net.URL; 4 | import java.util.Random; 5 | import org.fbb.balkna.Packages; 6 | import org.fbb.balkna.model.utils.IoUtils; 7 | 8 | /** 9 | * 10 | * @author jvanek 11 | */ 12 | public class SoundProvider { 13 | 14 | private static final String one = "1"; 15 | private static final String two = "2"; 16 | private static final String three = "3"; 17 | private static final String change = "change"; 18 | private static final String endPause = "endPause"; 19 | private static final String endRun = "endRun"; 20 | private static final String halfPause = "halfPause"; 21 | private static final String halfRun = "halfRun"; 22 | private static final String start = "start"; 23 | private static final String threeQatsPause = "threeQatsPause"; 24 | private static final String threeQuatsRun = "threeQats"; 25 | private static final String endChange = "endChange"; 26 | private static final String endChangeSmall = "endChangeSmall"; 27 | private static final String halfSerie = "halfSerie"; 28 | private static final String halfTraining = "halfTraining"; 29 | private static final String lastExercise = "lastExercise"; 30 | private static final String lastSerie = "lastSerie"; 31 | private static final String threeQatsSerie = "threeQatsSerie"; 32 | private static final String threeQatsTraining = "threeQatsTraining"; 33 | private static final String trainingEnd = "trainingEnd"; 34 | 35 | //for testing 36 | String[] all = {one, two, three, change, endPause, endRun, halfPause, halfRun, start, threeQatsPause, threeQuatsRun, endChange, halfSerie, halfTraining, lastExercise, lastSerie, threeQatsSerie, threeQatsTraining, trainingEnd}; 37 | 38 | private static final String suffix = ".wav"; 39 | 40 | private WavPlayer PSone; 41 | private WavPlayer PStwo; 42 | private WavPlayer PSthree; 43 | private WavPlayer PSchange; 44 | private WavPlayer PSendPause; 45 | private WavPlayer PSendRun; 46 | private WavPlayer PShalfPause; 47 | private WavPlayer PShalfRun; 48 | private WavPlayer PSstart; 49 | private WavPlayer PSthreeQatsPause; 50 | private WavPlayer PSthreeQuatsRun; 51 | private WavPlayer PSendChange; 52 | private WavPlayer PSendChangeSmall; 53 | private WavPlayer PShalfSerie; 54 | private WavPlayer PShalfTraining; 55 | private WavPlayer PSlastExercise; 56 | private WavPlayer PSlastSerie; 57 | private WavPlayer PSthreeQatsSerie; 58 | private WavPlayer PSthreeQatsTraining; 59 | private WavPlayer PStrainingEnd; 60 | 61 | private String usedSoundPack; 62 | private final WavPlayerProvider provider; 63 | 64 | public final void load(String name) { 65 | usedSoundPack = name; 66 | String soundPack = getPackage(name); 67 | PSone = provider.createPlayer(getUrl(soundPack, one)); 68 | PStwo = provider.createPlayer(getUrl(soundPack, two)); 69 | PSthree = provider.createPlayer(getUrl(soundPack, three)); 70 | PSchange = provider.createPlayer(getUrl(soundPack, change)); 71 | PSendPause = provider.createPlayer(getUrl(soundPack, endPause)); 72 | PSendRun = provider.createPlayer(getUrl(soundPack, endRun)); 73 | PShalfPause = provider.createPlayer(getUrl(soundPack, halfPause)); 74 | PShalfRun = provider.createPlayer(getUrl(soundPack, halfRun)); 75 | PSstart = provider.createPlayer(getUrl(soundPack, start)); 76 | PSthreeQatsPause = provider.createPlayer(getUrl(soundPack, threeQatsPause)); 77 | PSthreeQuatsRun = provider.createPlayer(getUrl(soundPack, threeQuatsRun)); 78 | PSendChange = provider.createPlayer(getUrl(soundPack, endChange)); 79 | PSendChangeSmall = provider.createPlayer(getUrl(soundPack, endChangeSmall)); 80 | PShalfSerie = provider.createPlayer(getUrl(soundPack, halfSerie)); 81 | PShalfTraining = provider.createPlayer(getUrl(soundPack, halfTraining)); 82 | PSlastExercise = provider.createPlayer(getUrl(soundPack, lastExercise)); 83 | PSlastSerie = provider.createPlayer(getUrl(soundPack, lastSerie)); 84 | PSthreeQatsSerie = provider.createPlayer(getUrl(soundPack, threeQatsSerie)); 85 | PSthreeQatsTraining = provider.createPlayer(getUrl(soundPack, threeQatsTraining)); 86 | PStrainingEnd = provider.createPlayer(getUrl(soundPack, trainingEnd)); 87 | } 88 | 89 | private URL getUrl(String soundPack, String f) { 90 | URL u = IoUtils.getFile(soundPack, f + suffix); 91 | if (u!=null){ 92 | return u; 93 | } 94 | //GOOD! 95 | return IoUtils.getFile(getDefaultSoundPack(), f + suffix); 96 | //testing: 97 | //return IoUtils.getFile(getPackage("fbbhorror"), f + suffix); 98 | } 99 | 100 | /** 101 | * @return the PSone 102 | */ 103 | public WavPlayer getPSone() { 104 | return PSone; 105 | } 106 | 107 | /** 108 | * @return the PStwo 109 | */ 110 | public WavPlayer getPStwo() { 111 | return PStwo; 112 | } 113 | 114 | /** 115 | * @return the PSthree 116 | */ 117 | public WavPlayer getPSthree() { 118 | return PSthree; 119 | } 120 | 121 | /** 122 | * @return the PSchange 123 | */ 124 | public WavPlayer getPSchange() { 125 | return PSchange; 126 | } 127 | 128 | /** 129 | * @return the PSendPause 130 | */ 131 | public WavPlayer getPSendPause() { 132 | return PSendPause; 133 | } 134 | 135 | /** 136 | * @return the PSendRun 137 | */ 138 | public WavPlayer getPSendRun() { 139 | return PSendRun; 140 | } 141 | 142 | /** 143 | * @return the PShalfPause 144 | */ 145 | public WavPlayer getPShalfPause() { 146 | return PShalfPause; 147 | } 148 | 149 | /** 150 | * @return the PShalfRun 151 | */ 152 | public WavPlayer getPShalfRun() { 153 | return PShalfRun; 154 | } 155 | 156 | /** 157 | * @return the PSstart 158 | */ 159 | public WavPlayer getPSstart() { 160 | return PSstart; 161 | } 162 | 163 | /** 164 | * @return the PSthreeQatsPause 165 | */ 166 | public WavPlayer getPSthreeQatsPause() { 167 | return PSthreeQatsPause; 168 | } 169 | 170 | public WavPlayer getPSthreeQuatsRun() { 171 | return PSthreeQuatsRun; 172 | } 173 | 174 | public WavPlayer getPSendChange() { 175 | return PSendChange; 176 | } 177 | 178 | public WavPlayer getPSendChangeSmall() { 179 | return PSendChangeSmall; 180 | } 181 | public void test(String name) { 182 | String soundPack = getPackage(name); 183 | WavPlayer test = provider.createPlayer(getUrl(soundPack, all[new Random().nextInt(all.length)])); 184 | test.playAsync(); 185 | } 186 | 187 | public void test() { 188 | test(getUsedSoundPack()); 189 | } 190 | 191 | /** 192 | * @return the PShalfSerie 193 | */ 194 | public WavPlayer getPShalfSerie() { 195 | return PShalfSerie; 196 | } 197 | 198 | /** 199 | * @return the PShalfTraining 200 | */ 201 | public WavPlayer getPShalfTraining() { 202 | return PShalfTraining; 203 | } 204 | 205 | /** 206 | * @return the PSlastExercise 207 | */ 208 | public WavPlayer getPSlastExercise() { 209 | return PSlastExercise; 210 | } 211 | 212 | /** 213 | * @return the PSlastSerie 214 | */ 215 | public WavPlayer getPSlastSerie() { 216 | return PSlastSerie; 217 | } 218 | 219 | /** 220 | * @return the PSthreeQatsSerie 221 | */ 222 | public WavPlayer getPSthreeQatsSerie() { 223 | return PSthreeQatsSerie; 224 | } 225 | 226 | /** 227 | * @return the PSthreeQatsTraining 228 | */ 229 | public WavPlayer getPSthreeQatsTraining() { 230 | return PSthreeQatsTraining; 231 | } 232 | 233 | /** 234 | * @return the PStrainingEnd 235 | */ 236 | public WavPlayer getPStrainingEnd() { 237 | return PStrainingEnd; 238 | } 239 | 240 | private static class SoundProviderHolder { 241 | 242 | public static SoundProvider instance; 243 | 244 | public static SoundProvider getInstance() { 245 | if (instance == null) { 246 | throw new RuntimeException("SondProvider not yet initialised"); 247 | } 248 | return instance; 249 | } 250 | 251 | public static void createInstance(WavPlayerProvider wpp) { 252 | if (instance != null) { 253 | System.err.println("SondProvider already initialised"); 254 | } else { 255 | instance = new SoundProvider(wpp); 256 | } 257 | } 258 | } 259 | 260 | public static SoundProvider getInstance() { 261 | return SoundProviderHolder.getInstance(); 262 | } 263 | 264 | static void createInstance(WavPlayerProvider javaxWawPlayerProvider) { 265 | SoundProviderHolder.createInstance(javaxWawPlayerProvider); 266 | } 267 | 268 | public SoundProvider(WavPlayerProvider proider) { 269 | this.provider = proider; 270 | load(Packages.DEFAULT_SOUND_PACK); 271 | } 272 | 273 | public static String getDefaultSoundPack() { 274 | return getPackage(Packages.DEFAULT_SOUND_PACK); 275 | } 276 | 277 | private static String getPackage(String name) { 278 | return Packages.SOUND_PACK + "." + name; 279 | } 280 | 281 | public String getUsedSoundPack() { 282 | return usedSoundPack; 283 | } 284 | 285 | } 286 | --------------------------------------------------------------------------------