Add language selector, update build config, add launch4j, other small changes that does not make impact on functionality
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
8d860189d4
commit
2d30683436
16 changed files with 454 additions and 61 deletions
|
@ -3,8 +3,8 @@ type: docker
|
|||
name: default
|
||||
|
||||
steps:
|
||||
- name: build-install-locally
|
||||
image: maven:3-jdk-11
|
||||
- name: build
|
||||
image: maven:3-openjdk-17
|
||||
commands:
|
||||
- mvn -B -DskipTests clean install
|
||||
- mvn test -B
|
||||
|
@ -17,6 +17,7 @@ steps:
|
|||
commands:
|
||||
- mkdir -p /builds/Tihwin
|
||||
- cp target/Tihwin-*[0-9].jar /builds/Tihwin/
|
||||
- cp target/Tihwin-*[0-9].exe /builds/Tihwin/
|
||||
volumes:
|
||||
- name: builds
|
||||
path: /builds
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
## Tihwin
|
||||
![License](https://img.shields.io/badge/License-GPLv3-blue.svg) ![LatestVer](https://img.shields.io/github/release/developersu/Tihwin.svg) [![Build Status](https://ci.redrise.ru/api/badges/desu/Tihwin/status.svg)](https://ci.redrise.ru/desu/Tihwin)
|
||||
|
||||
OPL-compatible PS2 tool for making split files. Sort of ul.cfg manager or USBUtil.
|
||||
[по-русски](README_RU.md)
|
||||
|
||||
OPL-compatible PS2 tool for making split files. Sort of ul.cfg manager or USBUtil. Good for use on mac and linux.
|
||||
|
||||
![Application screenshot1](screenshots/1.png)
|
||||
![Application screenshot2](screenshots/2.png)
|
||||
|
@ -14,6 +16,10 @@ GitHubs are arising and passing, cozy mirrors are eternal: https://git.redrise.r
|
|||
|
||||
GNU GLPv3 or higher. Please see LICENSE.
|
||||
|
||||
#### Requirements
|
||||
|
||||
* Java
|
||||
|
||||
#### Feedback
|
||||
|
||||
Create new GitHub issue with bug report or proposition
|
||||
|
@ -21,6 +27,7 @@ Create new GitHub issue with bug report or proposition
|
|||
#### Thanks
|
||||
|
||||
* [DDinghoya](https://github.com/DDinghoya), who translated this application to Korean!
|
||||
* [Ignacio Grosso](https://github.com/blckbearx), who translated this application to Spanish!
|
||||
|
||||
#### Translations
|
||||
|
||||
|
|
38
README_RU.md
Normal file
38
README_RU.md
Normal file
|
@ -0,0 +1,38 @@
|
|||
## Tihwin
|
||||
![License](https://img.shields.io/badge/License-GPLv3-blue.svg) ![LatestVer](https://img.shields.io/github/release/developersu/Tihwin.svg) [![Build Status](https://ci.redrise.ru/api/badges/desu/Tihwin/status.svg)](https://ci.redrise.ru/desu/Tihwin)
|
||||
|
||||
Это OPL-совместимая утилита для PS2. Используется для создания т.н. «сплит-файлов». Это что-то вроде менеджера ul.cfg или, другими словами, аналог USBUtil. Отличной подойдёт для использования в маке и линуксе.
|
||||
|
||||
![Application screenshot1](screenshots/1.png)
|
||||
![Application screenshot2](screenshots/2.png)
|
||||
|
||||
#### Не будем теряться!
|
||||
|
||||
Гитхабы приходят и уходят, уютные зеркала же − вечны! https://git.redrise.ru/desu/Tihwin
|
||||
|
||||
#### Лицензия
|
||||
|
||||
GNU GLPv3 или выше. Ознакомьтесь с файлом LICENSE.
|
||||
|
||||
#### Требования
|
||||
|
||||
* Java
|
||||
|
||||
#### Обратная связь
|
||||
|
||||
Просто создайте новую issue с отчётом об ошибке или предложением.
|
||||
|
||||
#### Спасибо
|
||||
|
||||
* [DDinghoya](https://github.com/DDinghoya), кто перевели приложение на Корейский!
|
||||
* [Ignacio Grosso](https://github.com/blckbearx), кто перевели приложение на Испанский!
|
||||
|
||||
#### Переводы
|
||||
|
||||
Все знают что [вставьте_сюда_ваш_родной_язык] просто лучший! Вообще, просто на всякий случай, сделайте PR (пул реквест) или создайте issue с переведённым файлом `.../src/main/resources/locale.properties`
|
||||
|
||||
(Кстати, чтобы конвертировать фалйы ил любой локали в читабельный формат и обратно, можете воспользоваться этим сайтом [https://itpro.cz/juniconv/](https://itpro.cz/juniconv/))
|
||||
|
||||
#### Как поддержать
|
||||
|
||||
Да просто влепите звездочку GitHub
|
44
pom.xml
44
pom.xml
|
@ -8,7 +8,7 @@
|
|||
<name>Tihwin</name>
|
||||
|
||||
<artifactId>Tihwin</artifactId>
|
||||
<version>2.1</version>
|
||||
<version>2.2</version>
|
||||
|
||||
<url>https://github.com/developersu/${project.artifactId}/</url>
|
||||
<description>
|
||||
|
@ -120,6 +120,48 @@
|
|||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>com.akathist.maven.plugins.launch4j</groupId>
|
||||
<version>2.2.0</version>
|
||||
<artifactId>launch4j-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>l4j-Tihwin</id>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>launch4j</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<headerType>gui</headerType>
|
||||
<icon>tw_icon.ico</icon>
|
||||
<outfile>target/Tihwin-${project.version}-${maven.build.timestamp}.exe</outfile>
|
||||
<jar>target/${project.artifactId}-${project.version}-${maven.build.timestamp}.jar</jar>
|
||||
<errTitle>Tihwin</errTitle>
|
||||
<classPath>
|
||||
<mainClass>tihwin.Main</mainClass>
|
||||
<addDependencies>false</addDependencies>
|
||||
<preCp>anything</preCp>
|
||||
</classPath>
|
||||
<jre>
|
||||
<minVersion>1.8.0</minVersion>
|
||||
<path>%JAVA_HOME%;%PATH%</path>
|
||||
</jre>
|
||||
<versionInfo>
|
||||
<fileVersion>${project.version}.0.0</fileVersion>
|
||||
<txtFileVersion>${project.version}</txtFileVersion>
|
||||
<fileDescription>ul.cfg utility</fileDescription>
|
||||
<copyright>GNU General Public License v3, 2022 ${project.organization.name}, Russia</copyright>
|
||||
<productVersion>${project.version}.0.0</productVersion>
|
||||
<txtProductVersion>${project.version}</txtProductVersion>
|
||||
<companyName>${project.organization.name}</companyName>
|
||||
<productName>${project.name}</productName>
|
||||
<internalName>${project.name}</internalName>
|
||||
<originalFilename>${project.name}.exe</originalFilename>
|
||||
</versionInfo>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
|
@ -20,11 +20,13 @@ package tihwin;
|
|||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
Locale.setDefault(Settings.INSTANCE.getLocale());
|
||||
String appVersion = ResourceBundle.getBundle("app").getString("_version");
|
||||
MainAppUi frame = new MainAppUi("Tihwin "+appVersion);
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
<component id="3f7d8" class="javax.swing.JButton" binding="diskImageSelectBtn">
|
||||
<constraints>
|
||||
<grid row="2" column="0" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
|
||||
<forms top="0" left="5" bottom="0" right="0"/>
|
||||
<forms top="0" left="5" bottom="0" right="0" defaultalign-vert="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<background color="-2034433"/>
|
||||
|
@ -43,7 +43,7 @@
|
|||
<grid row="4" column="6" row-span="1" col-span="3" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="1" use-parent-layout="false">
|
||||
<preferred-size width="150" height="-1"/>
|
||||
</grid>
|
||||
<forms/>
|
||||
<forms top="0" left="0" bottom="0" right="5"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
</component>
|
||||
|
@ -75,7 +75,7 @@
|
|||
<text resource-bundle="locale" key="SelectBtn"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="ed01c" class="javax.swing.JLabel">
|
||||
<component id="ed01c" class="javax.swing.JLabel" binding="ulDestinationRoLbl">
|
||||
<constraints>
|
||||
<grid row="6" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
<forms/>
|
||||
|
@ -84,7 +84,7 @@
|
|||
<text resource-bundle="locale" key="ulDestinationLbl"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="778d6" class="javax.swing.JLabel">
|
||||
<component id="778d6" class="javax.swing.JLabel" binding="diskImageRoLbl">
|
||||
<constraints>
|
||||
<grid row="2" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
<forms/>
|
||||
|
@ -93,7 +93,7 @@
|
|||
<text resource-bundle="locale" key="DiskImageLbl"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="cbd88" class="javax.swing.JLabel">
|
||||
<component id="cbd88" class="javax.swing.JLabel" binding="titleRoLbl">
|
||||
<constraints>
|
||||
<grid row="4" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
<forms/>
|
||||
|
@ -167,7 +167,7 @@
|
|||
<indeterminate value="false"/>
|
||||
</properties>
|
||||
</component>
|
||||
<grid id="a5cce" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<grid id="a5cce" layout-manager="GridLayoutManager" row-count="1" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="0" left="0" bottom="0" right="0"/>
|
||||
<constraints>
|
||||
<grid row="0" column="0" row-span="1" col-span="9" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
|
||||
|
@ -187,6 +187,15 @@
|
|||
<text value=""/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="92f10" class="javax.swing.JComboBox" binding="ulLangComboBox" custom-create="true">
|
||||
<constraints>
|
||||
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="9" fill="1" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<clientProperties>
|
||||
<html.disable class="java.lang.Boolean" value="false"/>
|
||||
</clientProperties>
|
||||
</component>
|
||||
</children>
|
||||
</grid>
|
||||
<component id="824ea" class="javax.swing.JButton" binding="ulCfgBtn">
|
||||
|
|
|
@ -23,19 +23,20 @@ import com.intellij.uiDesigner.core.GridLayoutManager;
|
|||
import com.jgoodies.forms.layout.CellConstraints;
|
||||
import com.jgoodies.forms.layout.FormLayout;
|
||||
import tihwin.cd.ISO9660;
|
||||
import tihwin.ui.IsoFileFilter;
|
||||
import tihwin.ui.TitleFieldFilter;
|
||||
import tihwin.ui.UiUpdater;
|
||||
import tihwin.ui.*;
|
||||
import tihwin.ui.model.LocaleHolder;
|
||||
import tihwin.ul.UlConfiguration;
|
||||
import tihwin.ul.UlMaker;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.border.Border;
|
||||
import javax.swing.text.AbstractDocument;
|
||||
import java.awt.*;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.awt.event.WindowListener;
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Locale;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
public class MainAppUi extends JFrame {
|
||||
|
@ -52,7 +53,11 @@ public class MainAppUi extends JFrame {
|
|||
private JRadioButton CDRadioButton;
|
||||
private JRadioButton DVDRadioButton;
|
||||
private JButton ulCfgBtn;
|
||||
private final ResourceBundle resourceBundle;
|
||||
private JComboBox<LocaleHolder> ulLangComboBox;
|
||||
private JLabel diskImageRoLbl;
|
||||
private JLabel titleRoLbl;
|
||||
private JLabel ulDestinationRoLbl;
|
||||
private ResourceBundle resourceBundle;
|
||||
|
||||
private String recentRomLocation;
|
||||
private File diskImage;
|
||||
|
@ -63,6 +68,7 @@ public class MainAppUi extends JFrame {
|
|||
|
||||
public MainAppUi(String appName) {
|
||||
super(appName);
|
||||
$$$setupUI$$$();
|
||||
resourceBundle = ResourceBundle.getBundle("locale");
|
||||
AwesomeMediator.setMainUi(this);
|
||||
setLocationRelativeTo(null); // Set window on [kinda] center
|
||||
|
@ -80,22 +86,29 @@ public class MainAppUi extends JFrame {
|
|||
CDRadioButton.setSelected(true);
|
||||
recentRomLocation = Settings.INSTANCE.getRomLocation();
|
||||
destinationDirectoryLbl.setText(FilesHelper.getRealFolder(Settings.INSTANCE.getDestination()));
|
||||
|
||||
addWindowListener(getWindowListener());
|
||||
Border fitMoreTextOnButtonBorder = BorderFactory.createCompoundBorder(
|
||||
BorderFactory.createLineBorder(Color.lightGray),
|
||||
BorderFactory.createEmptyBorder(5, 5, 5, 5));
|
||||
diskImageSelectBtn.setBorder(fitMoreTextOnButtonBorder);
|
||||
destinationSelectBtn.setBorder(fitMoreTextOnButtonBorder);
|
||||
|
||||
}
|
||||
|
||||
private WindowListener getWindowListener() {
|
||||
return new WindowListener() {
|
||||
@Override
|
||||
public void windowOpened(WindowEvent windowEvent) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void windowClosing(WindowEvent windowEvent) {
|
||||
Settings.INSTANCE.setRomLocation(recentRomLocation);
|
||||
Settings.INSTANCE.setDestination(destinationDirectoryLbl.getText());
|
||||
Settings.INSTANCE.setDvdSelected(DVDRadioButton.isSelected());
|
||||
Settings.INSTANCE.setLocale(
|
||||
((LocaleHolder) ulLangComboBox.getSelectedItem()).getLocaleCode());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void windowOpened(WindowEvent windowEvent) {
|
||||
diskImageSelectBtn.grabFocus();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -104,22 +117,18 @@ public class MainAppUi extends JFrame {
|
|||
|
||||
@Override
|
||||
public void windowIconified(WindowEvent windowEvent) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void windowDeiconified(WindowEvent windowEvent) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void windowActivated(WindowEvent windowEvent) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void windowDeactivated(WindowEvent windowEvent) {
|
||||
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -221,11 +230,26 @@ public class MainAppUi extends JFrame {
|
|||
new UpdateUlTableUi(destinationDirectoryLbl.getText());
|
||||
}
|
||||
|
||||
{
|
||||
// GUI initializer generated by IntelliJ IDEA GUI Designer
|
||||
// >>> IMPORTANT!! <<<
|
||||
// DO NOT EDIT OR ADD ANY CODE HERE!
|
||||
$$$setupUI$$$();
|
||||
private void onLanguageChanged() {
|
||||
Locale newLocale = ((LocaleHolder) ulLangComboBox.getSelectedItem()).getLocale();
|
||||
Locale.setDefault(newLocale);
|
||||
resourceBundle = ResourceBundle.getBundle("locale");
|
||||
|
||||
diskImageSelectBtn.setText(resourceBundle.getString("SelectBtn"));
|
||||
destinationSelectBtn.setText(resourceBundle.getString("SelectBtn"));
|
||||
if (doWeConvertAnythingNow) {
|
||||
convertBtn.setText(resourceBundle.getString("AbortText"));
|
||||
statusLbl.setText(resourceBundle.getString("InProgressText"));
|
||||
} else
|
||||
convertBtn.setText(resourceBundle.getString("ConvertBtn"));
|
||||
|
||||
diskImageRoLbl.setText(resourceBundle.getString("DiskImageLbl"));
|
||||
titleRoLbl.setText(resourceBundle.getString("TitleLbl"));
|
||||
ulDestinationRoLbl.setText(resourceBundle.getString("ulDestinationLbl"));
|
||||
|
||||
CDRadioButton.setText(resourceBundle.getString("CD"));
|
||||
DVDRadioButton.setText(resourceBundle.getString("DVD"));
|
||||
ulCfgBtn.setText(resourceBundle.getString("editUlCfgBtn"));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -236,15 +260,16 @@ public class MainAppUi extends JFrame {
|
|||
* @noinspection ALL
|
||||
*/
|
||||
private void $$$setupUI$$$() {
|
||||
createUIComponents();
|
||||
mainPanel = new JPanel();
|
||||
mainPanel.setLayout(new FormLayout("fill:p:noGrow,left:4dlu:noGrow,fill:p:noGrow,left:4dlu:noGrow,fill:p:noGrow,fill:max(d;4px):noGrow,fill:d:grow,left:4dlu:noGrow,fill:p:noGrow", "center:max(d;4px):noGrow,top:4dlu:noGrow,center:max(d;4px):noGrow,top:4dlu:noGrow,center:max(d;4px):noGrow,top:4dlu:noGrow,center:max(d;4px):noGrow,top:4dlu:noGrow,center:max(d;4px):noGrow,top:p:grow,top:4dlu:noGrow,center:max(d;4px):noGrow"));
|
||||
diskImageSelectBtn = new JButton();
|
||||
diskImageSelectBtn.setBackground(new Color(-2034433));
|
||||
this.$$$loadButtonText$$$(diskImageSelectBtn, this.$$$getMessageFromBundle$$$("locale", "SelectBtn"));
|
||||
CellConstraints cc = new CellConstraints();
|
||||
mainPanel.add(diskImageSelectBtn, new CellConstraints(1, 3, 3, 1, CellConstraints.DEFAULT, CellConstraints.DEFAULT, new Insets(0, 5, 0, 0)));
|
||||
mainPanel.add(diskImageSelectBtn, new CellConstraints(1, 3, 3, 1, CellConstraints.DEFAULT, CellConstraints.CENTER, new Insets(0, 5, 0, 0)));
|
||||
titleField = new JTextField();
|
||||
mainPanel.add(titleField, cc.xyw(7, 5, 3));
|
||||
mainPanel.add(titleField, new CellConstraints(7, 5, 3, 1, CellConstraints.DEFAULT, CellConstraints.DEFAULT, new Insets(0, 0, 0, 5)));
|
||||
destinationDirectoryLbl = new JLabel();
|
||||
destinationDirectoryLbl.setText("");
|
||||
mainPanel.add(destinationDirectoryLbl, cc.xyw(7, 7, 3));
|
||||
|
@ -255,15 +280,15 @@ public class MainAppUi extends JFrame {
|
|||
destinationSelectBtn.setBackground(new Color(-2034433));
|
||||
this.$$$loadButtonText$$$(destinationSelectBtn, this.$$$getMessageFromBundle$$$("locale", "SelectBtn"));
|
||||
mainPanel.add(destinationSelectBtn, new CellConstraints(1, 7, 3, 1, CellConstraints.DEFAULT, CellConstraints.DEFAULT, new Insets(0, 5, 0, 0)));
|
||||
final JLabel label1 = new JLabel();
|
||||
this.$$$loadLabelText$$$(label1, this.$$$getMessageFromBundle$$$("locale", "ulDestinationLbl"));
|
||||
mainPanel.add(label1, cc.xy(5, 7));
|
||||
final JLabel label2 = new JLabel();
|
||||
this.$$$loadLabelText$$$(label2, this.$$$getMessageFromBundle$$$("locale", "DiskImageLbl"));
|
||||
mainPanel.add(label2, cc.xy(5, 3));
|
||||
final JLabel label3 = new JLabel();
|
||||
this.$$$loadLabelText$$$(label3, this.$$$getMessageFromBundle$$$("locale", "TitleLbl"));
|
||||
mainPanel.add(label3, cc.xy(5, 5));
|
||||
ulDestinationRoLbl = new JLabel();
|
||||
this.$$$loadLabelText$$$(ulDestinationRoLbl, this.$$$getMessageFromBundle$$$("locale", "ulDestinationLbl"));
|
||||
mainPanel.add(ulDestinationRoLbl, cc.xy(5, 7));
|
||||
diskImageRoLbl = new JLabel();
|
||||
this.$$$loadLabelText$$$(diskImageRoLbl, this.$$$getMessageFromBundle$$$("locale", "DiskImageLbl"));
|
||||
mainPanel.add(diskImageRoLbl, cc.xy(5, 3));
|
||||
titleRoLbl = new JLabel();
|
||||
this.$$$loadLabelText$$$(titleRoLbl, this.$$$getMessageFromBundle$$$("locale", "TitleLbl"));
|
||||
mainPanel.add(titleRoLbl, cc.xy(5, 5));
|
||||
CDRadioButton = new JRadioButton();
|
||||
this.$$$loadButtonText$$$(CDRadioButton, this.$$$getMessageFromBundle$$$("locale", "CD"));
|
||||
mainPanel.add(CDRadioButton, cc.xy(1, 5));
|
||||
|
@ -288,13 +313,15 @@ public class MainAppUi extends JFrame {
|
|||
progressBar.setIndeterminate(false);
|
||||
mainPanel.add(progressBar, cc.xyw(1, 11, 7, CellConstraints.FILL, CellConstraints.DEFAULT));
|
||||
final JPanel panel1 = new JPanel();
|
||||
panel1.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1));
|
||||
panel1.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1));
|
||||
panel1.setBackground(new Color(-9251843));
|
||||
mainPanel.add(panel1, cc.xyw(1, 1, 9));
|
||||
final JLabel label4 = new JLabel();
|
||||
label4.setIcon(new ImageIcon(getClass().getResource("/banner.png")));
|
||||
label4.setText("");
|
||||
panel1.add(label4, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
|
||||
final JLabel label1 = new JLabel();
|
||||
label1.setIcon(new ImageIcon(getClass().getResource("/banner.png")));
|
||||
label1.setText("");
|
||||
panel1.add(label1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
|
||||
ulLangComboBox.putClientProperty("html.disable", Boolean.FALSE);
|
||||
panel1.add(ulLangComboBox, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_NORTHWEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
|
||||
ulCfgBtn = new JButton();
|
||||
ulCfgBtn.setBackground(new Color(-2031648));
|
||||
ulCfgBtn.setMargin(new Insets(1, 1, 1, 1));
|
||||
|
@ -386,4 +413,8 @@ public class MainAppUi extends JFrame {
|
|||
return mainPanel;
|
||||
}
|
||||
|
||||
private void createUIComponents() {
|
||||
this.ulLangComboBox = new LanguageComboBox();
|
||||
ulLangComboBox.addActionListener(e -> onLanguageChanged());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,15 +18,19 @@
|
|||
*/
|
||||
package tihwin;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.prefs.Preferences;
|
||||
|
||||
public class Settings {
|
||||
public static final Settings INSTANCE = new Settings();
|
||||
|
||||
private final Preferences preferences;
|
||||
private final Locale locale;
|
||||
|
||||
Settings(){
|
||||
this.preferences = Preferences.userRoot().node("tihwin");
|
||||
String localeCode = preferences.get("locale", Locale.getDefault().toString());
|
||||
this.locale = new Locale(localeCode.substring(0, 2), localeCode.substring(3));
|
||||
}
|
||||
|
||||
public String getRomLocation(){
|
||||
|
@ -48,4 +52,7 @@ public class Settings {
|
|||
public void setDvdSelected(boolean value) {
|
||||
preferences.putBoolean("dvd_selected", value);
|
||||
}
|
||||
|
||||
public Locale getLocale(){ return this.locale; }
|
||||
public void setLocale(String localeId){ preferences.put("locale", localeId); }
|
||||
}
|
||||
|
|
76
src/main/java/tihwin/ui/LanguageComboBox.java
Normal file
76
src/main/java/tihwin/ui/LanguageComboBox.java
Normal file
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
|
||||
Copyright "2022" Dmitry Isaenko
|
||||
|
||||
This file is part of Tihwin.
|
||||
|
||||
Tihwin is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Tihwin is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Tihwin. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
package tihwin.ui;
|
||||
|
||||
import tihwin.ui.model.LocaleHolder;
|
||||
import tihwin.ui.model.SettingsLanguagesSetup;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.plaf.basic.BasicArrowButton;
|
||||
import javax.swing.plaf.basic.BasicComboBoxUI;
|
||||
import java.awt.*;
|
||||
import java.util.List;
|
||||
|
||||
public class LanguageComboBox extends JComboBox<LocaleHolder> {
|
||||
private static final Color COLOR_SKY_BLUE = new Color(114, 211, 253);
|
||||
|
||||
public LanguageComboBox(){
|
||||
super();
|
||||
UIManager.put("ComboBox.selectionForeground", COLOR_SKY_BLUE);
|
||||
UIManager.put("ComboBox.selectionBackground", Color.white);
|
||||
UIManager.put("ComboBox.squareButton", Boolean.FALSE);
|
||||
|
||||
setUI(new BasicComboBoxUI(){
|
||||
@Override
|
||||
protected JButton createArrowButton() {
|
||||
BasicArrowButton button = new BasicArrowButton(BasicArrowButton.SOUTH,
|
||||
COLOR_SKY_BLUE, COLOR_SKY_BLUE, Color.white, COLOR_SKY_BLUE);
|
||||
|
||||
button.setBorder(BorderFactory.createEmptyBorder());
|
||||
button.setVisible(false);
|
||||
return button;
|
||||
}
|
||||
});
|
||||
|
||||
ListCellRenderer<LocaleHolder> current = (ListCellRenderer<LocaleHolder>) getRenderer();
|
||||
|
||||
setRenderer((list, localeHolder, index, isSelected, hasFocus) -> {
|
||||
Component component = current.getListCellRendererComponent(list, localeHolder, index, isSelected, hasFocus);
|
||||
|
||||
if (isSelected) {
|
||||
component.setForeground(Color.black);
|
||||
component.setBackground(Color.ORANGE);
|
||||
} else {
|
||||
component.setForeground(Color.white);
|
||||
component.setBackground(COLOR_SKY_BLUE);
|
||||
}
|
||||
return component;
|
||||
});
|
||||
setForeground(Color.white);
|
||||
setBackground(COLOR_SKY_BLUE);
|
||||
SettingsLanguagesSetup setup = new SettingsLanguagesSetup();
|
||||
|
||||
List<LocaleHolder> languages = setup.getLanguages();
|
||||
for (LocaleHolder lang: languages)
|
||||
addItem(lang);
|
||||
this.setSelectedItem(setup.getRecentLanguage());
|
||||
}
|
||||
}
|
55
src/main/java/tihwin/ui/model/LocaleHolder.java
Normal file
55
src/main/java/tihwin/ui/model/LocaleHolder.java
Normal file
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
|
||||
Copyright "2022" Dmitry Isaenko
|
||||
|
||||
This file is part of Tihwin.
|
||||
|
||||
Tihwin is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Tihwin is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Tihwin. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
package tihwin.ui.model;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
public class LocaleHolder {
|
||||
|
||||
private final Locale locale;
|
||||
private final String localeCode;
|
||||
private final String languageName;
|
||||
|
||||
public LocaleHolder(String localeFileName) {
|
||||
String language = localeFileName.substring(7, 9);
|
||||
String country;
|
||||
if (localeFileName.length() > 23)
|
||||
country = localeFileName.substring(10, localeFileName.indexOf('.'));
|
||||
else
|
||||
country = localeFileName.substring(10, 12);
|
||||
this.locale = new Locale(language, country);
|
||||
this.localeCode = locale.toString();
|
||||
this.languageName = locale.getDisplayLanguage(locale).toUpperCase();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(){
|
||||
return languageName;
|
||||
}
|
||||
|
||||
public String getLocaleCode(){
|
||||
return localeCode;
|
||||
}
|
||||
|
||||
public Locale getLocale() {
|
||||
return locale;
|
||||
}
|
||||
}
|
127
src/main/java/tihwin/ui/model/SettingsLanguagesSetup.java
Normal file
127
src/main/java/tihwin/ui/model/SettingsLanguagesSetup.java
Normal file
|
@ -0,0 +1,127 @@
|
|||
/*
|
||||
|
||||
Copyright "2022" Dmitry Isaenko
|
||||
|
||||
This file is part of Tihwin.
|
||||
|
||||
Tihwin is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Tihwin is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Tihwin. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
package tihwin.ui.model;
|
||||
|
||||
import tihwin.Settings;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URL;
|
||||
import java.net.URLDecoder;
|
||||
import java.util.*;
|
||||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarFile;
|
||||
|
||||
public class SettingsLanguagesSetup {
|
||||
private final List<LocaleHolder> languages;
|
||||
private File thisApplicationFile;
|
||||
private LocaleHolder recentlyUsedLanguageHolder;
|
||||
|
||||
public SettingsLanguagesSetup() {
|
||||
this.languages = new ArrayList<>();
|
||||
parseFiles();
|
||||
sortLanguages();
|
||||
defineRecentlyUsedLanguageHolder();
|
||||
}
|
||||
|
||||
private void parseFiles() {
|
||||
if (isApplicationIsJar()) // Executed as JAR file
|
||||
parseFilesInsideJar();
|
||||
else // Executed within IDE
|
||||
parseFilesInFilesystem();
|
||||
}
|
||||
|
||||
private boolean isApplicationIsJar() {
|
||||
getThisApplicationFile();
|
||||
return thisApplicationFile != null && thisApplicationFile.isFile();
|
||||
}
|
||||
|
||||
private void getThisApplicationFile() {
|
||||
try {
|
||||
String encodedJarLocation =
|
||||
getClass().getProtectionDomain().getCodeSource().getLocation().getPath().replace("+", "%2B");
|
||||
this.thisApplicationFile = new File(URLDecoder.decode(encodedJarLocation, "UTF-8"));
|
||||
} catch (UnsupportedEncodingException uee) {
|
||||
uee.printStackTrace();
|
||||
this.thisApplicationFile = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void parseFilesInsideJar() {
|
||||
try {
|
||||
JarFile jar = new JarFile(thisApplicationFile);
|
||||
Enumeration<JarEntry> entries = jar.entries(); //gives ALL entries in jar
|
||||
while (entries.hasMoreElements()) {
|
||||
String name = entries.nextElement().getName();
|
||||
if (name.startsWith("locale_")) {
|
||||
languages.add(new LocaleHolder(name));
|
||||
}
|
||||
}
|
||||
jar.close();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void parseFilesInFilesystem() {
|
||||
URL resourceURL = this.getClass().getResource("/");
|
||||
String[] filesList = new File(resourceURL.getFile()).list(); // Screw it. This WON'T produce NullPointerException
|
||||
|
||||
for (String jarFileName : filesList) {
|
||||
if (jarFileName.startsWith("locale_")) {
|
||||
languages.add(new LocaleHolder(jarFileName));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void sortLanguages() {
|
||||
languages.sort(Comparator.comparing(LocaleHolder::toString));
|
||||
}
|
||||
|
||||
private void defineRecentlyUsedLanguageHolder() {
|
||||
Locale localeFromPreferences = Settings.INSTANCE.getLocale();
|
||||
|
||||
for (LocaleHolder holder : languages) {
|
||||
Locale holderLocale = holder.getLocale();
|
||||
|
||||
if (holderLocale.equals(localeFromPreferences)) {
|
||||
this.recentlyUsedLanguageHolder = holder;
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Otherwise define default one that is "en_US"
|
||||
for (LocaleHolder holder : languages) {
|
||||
if (holder.getLocaleCode().equals("en_US")) {
|
||||
this.recentlyUsedLanguageHolder = holder;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public List<LocaleHolder> getLanguages() {
|
||||
return languages;
|
||||
}
|
||||
|
||||
public LocaleHolder getRecentLanguage() {
|
||||
return recentlyUsedLanguageHolder;
|
||||
}
|
||||
}
|
|
@ -27,9 +27,19 @@ import java.util.List;
|
|||
import java.util.ResourceBundle;
|
||||
|
||||
public class UlTableModel extends DefaultTableModel {
|
||||
static {
|
||||
|
||||
private final String REMOVE_ME_BUTTON_TEXT;
|
||||
|
||||
private final String OK_STATUS;
|
||||
private final String INCONSISTENT_STATUS;
|
||||
|
||||
private final List<UlTableModelRecord> rows;
|
||||
private final List<UlTableModelRecord> removedRows;
|
||||
|
||||
public UlTableModel(){
|
||||
super();
|
||||
ResourceBundle bundle = ResourceBundle.getBundle("locale");
|
||||
COLUMNS = new String[]{
|
||||
String[] columns = new String[]{
|
||||
bundle.getString("ulManagerWindow_ColumnNameNumber"),
|
||||
bundle.getString("ulManagerWindow_ColumnNameTitle"),
|
||||
bundle.getString("ulManagerWindow_ColumnNamePublisherTitle"),
|
||||
|
@ -37,23 +47,11 @@ public class UlTableModel extends DefaultTableModel {
|
|||
bundle.getString("ulManagerWindow_ColumnCdDvdFlag"),
|
||||
"",
|
||||
""};
|
||||
super.setColumnIdentifiers(columns);
|
||||
REMOVE_ME_BUTTON_TEXT = bundle.getString("ulManagerWindow_Row_RemoveRowBtn");
|
||||
OK_STATUS = bundle.getString("Ok");
|
||||
INCONSISTENT_STATUS = bundle.getString("ulManagerWindow_InconsistentFileText");
|
||||
}
|
||||
private static final String[] COLUMNS;
|
||||
|
||||
private static final String REMOVE_ME_BUTTON_TEXT;
|
||||
|
||||
private static final String OK_STATUS;
|
||||
private static final String INCONSISTENT_STATUS;
|
||||
|
||||
private final List<UlTableModelRecord> rows;
|
||||
private final List<UlTableModelRecord> removedRows;
|
||||
|
||||
public UlTableModel(){
|
||||
super();
|
||||
super.setColumnIdentifiers(COLUMNS);
|
||||
this.rows = new ArrayList<>();
|
||||
this.removedRows = new ArrayList<>();
|
||||
}
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
0
src/main/resources/locale_en_US.properties
Normal file
0
src/main/resources/locale_en_US.properties
Normal file
|
@ -27,7 +27,7 @@ ulManager=Administrador de ul.cfg
|
|||
ulManagerWindow_ColumnNameNumber=#
|
||||
ulManagerWindow_ColumnNameTitle=T\u00EDtulo
|
||||
ulManagerWindow_ColumnNamePublisherTitle=T\u00EDtulo del editor
|
||||
ulManagerWindow_ColumnNameChunksCount=N\u00FAmero de fragmentos
|
||||
ulManagerWindow_ColumnNameChunksCount=N\u00FAm. fragmentos
|
||||
ulManagerWindow_ColumnCdDvdFlag=CD/DVD
|
||||
ulManagerWindow_Row_RemoveRowBtn=Eliminar
|
||||
ulManagerWindow_SaveBtn=Guardar cambios
|
||||
|
|
BIN
tw_icon.ico
Normal file
BIN
tw_icon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 118 KiB |
Loading…
Reference in a new issue