diff --git a/src/main/java/tihwin/AwesomeMediator.java b/src/main/java/tihwin/AwesomeMediator.java index 6aa5809..1864378 100644 --- a/src/main/java/tihwin/AwesomeMediator.java +++ b/src/main/java/tihwin/AwesomeMediator.java @@ -26,6 +26,7 @@ public class AwesomeMediator { private final static AwesomeMediator INSTANCE = new AwesomeMediator(); private MainAppUi mainAppUi; + private static int scale = Settings.INSTANCE.getScaleFactor(); private AwesomeMediator(){} public static void setMainUi(MainAppUi ui){ @@ -42,4 +43,15 @@ public class AwesomeMediator { public static void setDestination(File folder){ INSTANCE.mainAppUi.setDestinationDir(folder); } + + public static int getScaleValue() { + return scale; + } + + public static void increaseScaleValue() { + AwesomeMediator.scale++; + } + public static void decreaseScaleValue() { + AwesomeMediator.scale--; + } } diff --git a/src/main/java/tihwin/Main.java b/src/main/java/tihwin/Main.java index afdccbe..13c4ea8 100644 --- a/src/main/java/tihwin/Main.java +++ b/src/main/java/tihwin/Main.java @@ -1,5 +1,5 @@ /* - Copyright 2022 Dmitry Isaenko + Copyright 2022-2025 Dmitry Isaenko This file is part of Tihwin. @@ -32,10 +32,10 @@ public class Main { frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - Image img = new ImageIcon(Objects.requireNonNull(MainAppUi.class.getClassLoader().getResource("tray_icon.gif"))).getImage(); + Image img = new ImageIcon(Objects.requireNonNull( + MainAppUi.class.getClassLoader().getResource("tray_icon.gif"))).getImage(); frame.setIconImage(img); frame.setMinimumSize(new Dimension(700, 350)); - //frame.setResizable(false); frame.setVisible(true); } } diff --git a/src/main/java/tihwin/MainAppUi.form b/src/main/java/tihwin/MainAppUi.form index 474e4c6..f2fd9d0 100644 --- a/src/main/java/tihwin/MainAppUi.form +++ b/src/main/java/tihwin/MainAppUi.form @@ -146,7 +146,7 @@ - + @@ -159,7 +159,7 @@ - + @@ -178,9 +178,9 @@ - + - + diff --git a/src/main/java/tihwin/MainAppUi.java b/src/main/java/tihwin/MainAppUi.java index e0d912b..2d9b363 100644 --- a/src/main/java/tihwin/MainAppUi.java +++ b/src/main/java/tihwin/MainAppUi.java @@ -33,12 +33,12 @@ import javax.swing.border.Border; import javax.swing.border.LineBorder; import javax.swing.text.AbstractDocument; import java.awt.*; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; +import java.awt.event.*; import java.io.File; import java.lang.reflect.Method; -import java.util.Locale; -import java.util.ResourceBundle; +import java.util.*; +import java.util.List; +import java.util.stream.Collectors; public class MainAppUi extends JFrame { private JPanel mainPanel; @@ -61,7 +61,8 @@ public class MainAppUi extends JFrame { private JButton zoomInBtn; private JButton zoomOutBtn; private ResourceBundle resourceBundle; - int scale; + + private List components; private String recentRomLocation; private File diskImage; @@ -75,6 +76,21 @@ public class MainAppUi extends JFrame { $$$setupUI$$$(); resourceBundle = ResourceBundle.getBundle("locale"); AwesomeMediator.setMainUi(this); + mainPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) + .put(KeyStroke.getKeyStroke(KeyEvent.VK_ADD, InputEvent.CTRL_DOWN_MASK), "zoomIn"); + mainPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) + .put(KeyStroke.getKeyStroke(KeyEvent.VK_SUBTRACT, InputEvent.CTRL_DOWN_MASK), "zoomOut"); + Action zoom = new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + if ("+".equals(e.getActionCommand())) + zoomIn(); + else + zoomOut(); + } + }; + mainPanel.getActionMap().put("zoomIn", zoom); + mainPanel.getActionMap().put("zoomOut", zoom); setLocationRelativeTo(null); // Set window on [kinda] center new FilesDropListener(mainPanel); setContentPane(mainPanel); @@ -100,7 +116,7 @@ public class MainAppUi extends JFrame { Settings.INSTANCE.setDestination(destinationDirectoryLbl.getText()); Settings.INSTANCE.setDvdSelected(DVDRadioButton.isSelected()); Settings.INSTANCE.setLocale(((LocaleHolder) ulLangComboBox.getSelectedItem()).getLocaleCode()); - Settings.INSTANCE.setScaleFactor(scale); + Settings.INSTANCE.setScaleFactor(AwesomeMediator.getScaleValue()); } }); @@ -114,51 +130,25 @@ public class MainAppUi extends JFrame { destinationSelectBtn.addMouseListener(new TwButtonsActionListener()); titleField.setBorder(new LineBorder(Color.lightGray)); - scale = Settings.INSTANCE.getScaleFactor(); applyScaling(); } private void applyScaling() { - if (scale == 0) - return; + components = Arrays.stream(mainPanel.getComponents()).collect(Collectors.toList()); + components.add(statusLbl); + components.add(ulLangComboBox); - for (Component component : mainPanel.getComponents()) - applyScalingOnComponent(component); - applyScalingOnComponent(statusLbl); - applyScalingOnComponent(ulLangComboBox); - } - - private void applyScalingOnComponent(Component component) { - Font defaultFont = component.getFont(); - component.setFont(new Font(defaultFont.getName(), defaultFont.getStyle(), defaultFont.getSize() + scale)); + ScaleUi.applyInitialScale(components); } private void zoomIn() { - for (Component c : mainPanel.getComponents()) - increaseElementScale(c); - increaseElementScale(statusLbl); - increaseElementScale(ulLangComboBox); - scale++; - } - - private void increaseElementScale(Component component) { - Font defaultFont = component.getFont(); - component.setFont(new Font(defaultFont.getName(), defaultFont.getStyle(), defaultFont.getSize() + 1)); + ScaleUi.increaseScale(components); + pack(); } private void zoomOut() { - if (scale == 0) - return; - for (Component c : mainPanel.getComponents()) - decreaseElementScale(c); - decreaseElementScale(statusLbl); - decreaseElementScale(ulLangComboBox); - scale--; - } - - private void decreaseElementScale(Component component) { - Font defaultFont = component.getFont(); - component.setFont(new Font(defaultFont.getName(), defaultFont.getStyle(), defaultFont.getSize() - 1)); + ScaleUi.decreaseScale(components); + pack(); } private void diskImageSelectEventHandler() { @@ -338,24 +328,24 @@ public class MainAppUi extends JFrame { progressBar.setIndeterminate(false); mainPanel.add(progressBar, cc.xyw(1, 12, 9, CellConstraints.FILL, CellConstraints.TOP)); final JPanel panel1 = new JPanel(); - panel1.setLayout(new GridLayoutManager(2, 2, 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 label1 = new JLabel(); label1.setIcon(new ImageIcon(getClass().getResource("/banner.png"))); label1.setText(""); - panel1.add(label1, new GridConstraints(0, 0, 2, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + 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.setBackground(new Color(-9251843)); ulLangComboBox.setForeground(new Color(-1)); 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, 1, false)); final JPanel panel2 = new JPanel(); - panel2.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 0)); + panel2.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5)); panel2.setAlignmentX(0.0f); panel2.setAlignmentY(0.0f); panel2.setFocusable(false); panel2.setOpaque(false); - panel1.add(panel2, new GridConstraints(1, 1, 1, 1, GridConstraints.ANCHOR_NORTHEAST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 2, false)); + panel1.add(panel2, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_NORTHWEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); zoomInBtn = new JButton(); zoomInBtn.setAlignmentY(0.0f); zoomInBtn.setBorderPainted(false); diff --git a/src/main/java/tihwin/ScaleUi.java b/src/main/java/tihwin/ScaleUi.java new file mode 100644 index 0000000..686a7c3 --- /dev/null +++ b/src/main/java/tihwin/ScaleUi.java @@ -0,0 +1,119 @@ +/* + Copyright 2025 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 . + */ +package tihwin; + +import javax.swing.*; +import java.awt.*; +import java.util.List; + +import static tihwin.ScaleUi.ScalePolicy.DECREASE; +import static tihwin.ScaleUi.ScalePolicy.INCREASE; +import static tihwin.ScaleUi.ScalePolicy.INIT; + +public class ScaleUi { + + public enum ScalePolicy { + INCREASE, + DECREASE, + INIT + } + + private static final String[] DEFAULTS = new String[] { + "Label.font", + "Button.font", + "ComboBox.font", + "TextField.font", + "List.font", + "Tree.font", + "TableHeader.font" + }; + + public static void applyInitialScale(List components) { + if (AwesomeMediator.getScaleValue() == 0) + return; + for (Component component : components) + applyInitialScale(component); + applyOnDefaults(INIT); + } + public static void applyInitialScale(Component component) { + applyOn(component, AwesomeMediator.getScaleValue()); + } + + public static void increaseScale(List components) { + for (Component component : components) + increaseScale(component); + applyOnDefaults(INCREASE); + } + private static void increaseScale(Component component) { + applyOn(component, +1); + } + + public static void decreaseScale(List components) { + if (AwesomeMediator.getScaleValue() <= 0) + return; + for (Component component : components) + decreaseScale(component); + applyOnDefaults(DECREASE); + } + private static void decreaseScale(Component component) { + applyOn(component, -1); + } + + private static void applyOn(Component component, int factor) { + Font defaultFont = component.getFont(); + component.setFont(new Font(defaultFont.getName(), defaultFont.getStyle(), defaultFont.getSize() + factor)); + } + + private static void applyOnDefaults(ScalePolicy policy){ + switch (policy){ + case INIT: + for (String defaultElement: DEFAULTS) + initDefault(defaultElement); + break; + case INCREASE: + for (String defaultElement: DEFAULTS) + increaseDefault(defaultElement); + AwesomeMediator.increaseScaleValue(); + break; + case DECREASE: + for (String defaultElement: DEFAULTS) + decreaseDefault(defaultElement); + AwesomeMediator.decreaseScaleValue(); + break; + } + } + + private static void initDefault(String name){ + applyOnDefault(name, AwesomeMediator.getScaleValue()); + } + + private static void increaseDefault(String name){ + applyOnDefault(name, +1); + } + + private static void decreaseDefault(String name){ + applyOnDefault(name, -1); + } + + private static void applyOnDefault(String name, int factor){ + Font defaultFont = UIManager.getDefaults().getFont(name); + UIManager.getDefaults().put(name, new Font(defaultFont.getName(), defaultFont.getStyle(), + defaultFont.getSize()+factor)); + } +} diff --git a/src/main/java/tihwin/UpdateUlTableUi.java b/src/main/java/tihwin/UpdateUlTableUi.java index b145274..2b89b78 100644 --- a/src/main/java/tihwin/UpdateUlTableUi.java +++ b/src/main/java/tihwin/UpdateUlTableUi.java @@ -1,6 +1,6 @@ /* - Copyright "2022" Dmitry Isaenko + Copyright "2022-2025" Dmitry Isaenko This file is part of Tihwin. @@ -40,6 +40,7 @@ public class UpdateUlTableUi extends JFrame { private JTable table; private UlTableModel model; private JButton saveChangesBtn; + private JButton selectUlBtn; private final JLabel ulLocationLbl; private JLabel statusLbl; @@ -53,6 +54,7 @@ public class UpdateUlTableUi extends JFrame { this.recentRomLocation = ulDestinationLocation; setupTable(); setupSaveButton(); + createSelectUlLocationButton(); FormLayout primaryPanelLayout = new FormLayout( "80dlu, 2dlu, fill:pref:grow", @@ -64,7 +66,7 @@ public class UpdateUlTableUi extends JFrame { primaryPanel.add(getScrollPane(), new CellConstraints(1, 1, 3, 1, CellConstraints.DEFAULT, CellConstraints.DEFAULT, new Insets(0, 0, 0, 0))); - primaryPanel.add(getSelectUlLocationButton(), new CellConstraints(1, 2, 1, 1, + primaryPanel.add(selectUlBtn, new CellConstraints(1, 2, 1, 1, CellConstraints.DEFAULT, CellConstraints.DEFAULT, new Insets(3, 3, 3, 3))); primaryPanel.add(ulLocationLbl, new CellConstraints(3, 2, 1, 1, @@ -83,7 +85,8 @@ public class UpdateUlTableUi extends JFrame { Image img = new ImageIcon(Objects.requireNonNull( MainAppUi.class.getClassLoader().getResource("tray_icon.gif"))).getImage(); setIconImage(img); - setMinimumSize(new Dimension(800, 400)); + int scaledWidth = (int) (800 * (AwesomeMediator.getScaleValue() / 20.0 + 1)); + setMinimumSize(new Dimension(scaledWidth, 500)); setVisible(true); setTitle(resourceBundle.getString("ulManager")); @@ -119,11 +122,10 @@ public class UpdateUlTableUi extends JFrame { scrollPane.setPreferredSize(new Dimension(0,50)); return scrollPane; } - private JButton getSelectUlLocationButton(){ - JButton selectUlBtn = new JButton(resourceBundle.getString("ulManagerWindow_SelectUlCfgBtn")); + private void createSelectUlLocationButton(){ + selectUlBtn = new JButton(resourceBundle.getString("ulManagerWindow_SelectUlCfgBtn")); selectUlBtn.setBackground(Color.getHSBColor(0.5591398f, 0.12156863f, 1)); selectUlBtn.addActionListener(actionEvent -> selectUlCfgAction()); - return selectUlBtn; } private JPanel getStatusPanel(){ statusLbl = new JLabel(); diff --git a/src/main/java/tihwin/ui/LanguageComboBox.java b/src/main/java/tihwin/ui/LanguageComboBox.java index e70126a..fbd0b30 100644 --- a/src/main/java/tihwin/ui/LanguageComboBox.java +++ b/src/main/java/tihwin/ui/LanguageComboBox.java @@ -1,6 +1,6 @@ /* - Copyright "2022" Dmitry Isaenko + Copyright "2022-2025" Dmitry Isaenko This file is part of Tihwin. @@ -32,8 +32,8 @@ import java.util.List; public class LanguageComboBox extends JComboBox { private static final Color COLOR_SKY_BLUE = new Color(114, 211, 253); - private final Color COLOR_DARK = new Color(71, 81, 93); - private final Border myBorder = new EmptyBorder(5, 10, 5, 10); + private static final Color COLOR_DARK = new Color(71, 81, 93); + private static final Border BORDER = new EmptyBorder(5, 10, 5, 10); public LanguageComboBox(){ super(); @@ -58,7 +58,7 @@ public class LanguageComboBox extends JComboBox { JLabel component = (JLabel) current.getListCellRendererComponent(list, localeHolder, index, isSelected, hasFocus); component.setHorizontalAlignment(SwingConstants.RIGHT); - component.setBorder(myBorder); + component.setBorder(BORDER); if (isSelected) { component.setForeground(COLOR_DARK); diff --git a/src/main/java/tihwin/ui/ulupdater/UlCdDvdCellEditor.java b/src/main/java/tihwin/ui/ulupdater/UlCdDvdCellEditor.java index 82a56ce..827f87b 100644 --- a/src/main/java/tihwin/ui/ulupdater/UlCdDvdCellEditor.java +++ b/src/main/java/tihwin/ui/ulupdater/UlCdDvdCellEditor.java @@ -23,12 +23,7 @@ package tihwin.ui.ulupdater; import javax.swing.*; public class UlCdDvdCellEditor extends DefaultCellEditor { - static { - CD_DVD = new String[]{"CD", "DVD"}; - } - private static final String[] CD_DVD; - public UlCdDvdCellEditor(){ - super(new JComboBox<>(CD_DVD)); + super(new JComboBox<>(new String[]{"CD", "DVD"})); } } diff --git a/src/main/java/tihwin/ui/ulupdater/UlTableColumnModel.java b/src/main/java/tihwin/ui/ulupdater/UlTableColumnModel.java index 4a2e4bb..a224e54 100644 --- a/src/main/java/tihwin/ui/ulupdater/UlTableColumnModel.java +++ b/src/main/java/tihwin/ui/ulupdater/UlTableColumnModel.java @@ -1,6 +1,6 @@ /* - Copyright "2022" Dmitry Isaenko + Copyright "2022-2025" Dmitry Isaenko This file is part of Tihwin. @@ -38,27 +38,27 @@ public class UlTableColumnModel extends DefaultTableColumnModel { getColumn(0).setMinWidth(20); getColumn(0).setPreferredWidth(25); - getColumn(0).setMaxWidth(50); + //getColumn(0).setMaxWidth(50); getColumn(1).setMinWidth(200); getColumn(1).setPreferredWidth(230); - getColumn(1).setMaxWidth(300); + //getColumn(1).setMaxWidth(300); getColumn(2).setMinWidth(100); getColumn(2).setPreferredWidth(135); - getColumn(2).setMaxWidth(150); + //getColumn(2).setMaxWidth(150); getColumn(3).setMinWidth(75); getColumn(3).setPreferredWidth(100); - getColumn(3).setMaxWidth(125); + //getColumn(3).setMaxWidth(125); getColumn(4).setMinWidth(50); getColumn(4).setPreferredWidth(75); - getColumn(4).setMaxWidth(100); + //getColumn(4).setMaxWidth(100); getColumn(5).setMinWidth(100); getColumn(5).setPreferredWidth(135); - getColumn(5).setMaxWidth(150); + //getColumn(5).setMaxWidth(150); JTextField textField = new JTextField(); ((AbstractDocument) textField.getDocument()).setDocumentFilter(new TitleFieldFilter()); @@ -69,7 +69,6 @@ public class UlTableColumnModel extends DefaultTableColumnModel { getColumn(5).setCellEditor(new UlButtonCellEditor()); setColumnSelectionAllowed(false); - } @Override diff --git a/src/main/java/tihwin/ui/ulupdater/UlTableContentJLabelRenderer.java b/src/main/java/tihwin/ui/ulupdater/UlTableContentJLabelRenderer.java index 30a69a7..114e096 100644 --- a/src/main/java/tihwin/ui/ulupdater/UlTableContentJLabelRenderer.java +++ b/src/main/java/tihwin/ui/ulupdater/UlTableContentJLabelRenderer.java @@ -1,6 +1,6 @@ /* - Copyright "2022" Dmitry Isaenko + Copyright "2022-2025" Dmitry Isaenko This file is part of Tihwin. @@ -20,6 +20,8 @@ */ package tihwin.ui.ulupdater; +import tihwin.ScaleUi; + import javax.swing.*; import javax.swing.border.EmptyBorder; import javax.swing.table.DefaultTableCellRenderer; @@ -34,6 +36,7 @@ public class UlTableContentJLabelRenderer extends DefaultTableCellRenderer { JLabel label = (JLabel)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); label.setBackground(Color.getHSBColor(0, 0, 0.9411765f)); label.setBorder(new EmptyBorder(0, 3, 0, 3)); + ScaleUi.applyInitialScale(label); switch (column){ case 0: case 3: diff --git a/src/main/java/tihwin/ui/ulupdater/UlTableHeaderRenderer.java b/src/main/java/tihwin/ui/ulupdater/UlTableHeaderRenderer.java index 9558dda..e838994 100644 --- a/src/main/java/tihwin/ui/ulupdater/UlTableHeaderRenderer.java +++ b/src/main/java/tihwin/ui/ulupdater/UlTableHeaderRenderer.java @@ -1,6 +1,6 @@ /* - Copyright "2022" Dmitry Isaenko + Copyright "2022-2025" Dmitry Isaenko This file is part of Tihwin. @@ -20,6 +20,8 @@ */ package tihwin.ui.ulupdater; +import tihwin.AwesomeMediator; + import javax.swing.*; import javax.swing.border.LineBorder; import javax.swing.table.DefaultTableCellRenderer; @@ -29,11 +31,11 @@ public class UlTableHeaderRenderer extends DefaultTableCellRenderer { @Override public Component getTableCellRendererComponent(JTable table, Object value, - boolean isSelected, boolean hasFocus, - int row, int column){ + boolean isSelected, boolean hasFocus, + int row, int column){ JLabel label = (JLabel)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); Font font = label.getFont(); - label.setFont(new Font(font.getFontName(), Font.BOLD, font.getSize())); + label.setFont(new Font(font.getFontName(), Font.BOLD, font.getSize()+ AwesomeMediator.getScaleValue())); label.setBorder(new LineBorder(Color.darkGray)); label.setHorizontalAlignment(SwingConstants.CENTER); label.setBackground(Color.getHSBColor(0.33333334f, 0.12765957f, 0.92156863f)); diff --git a/src/main/resources/locale_id_ID.properties b/src/main/resources/locale_in_ID.properties similarity index 96% rename from src/main/resources/locale_id_ID.properties rename to src/main/resources/locale_in_ID.properties index 8d4b394..381bc77 100644 --- a/src/main/resources/locale_id_ID.properties +++ b/src/main/resources/locale_in_ID.properties @@ -8,7 +8,7 @@ InterruptedAndFilesDeletedText = Tugas terhenti dan berkas pecahan telah dihapus InterruptedAndFilesNotDeletedText = Tugas terhenti dan berkas pecahan TIDAK dihapus InterruptedText = Terhenti isoFilesText = Berkas ISO -WelcomeText = Selamat datang! Saya Tihwin: utilitas format ul untuk PS2 Anda! GPLv3+, 2022\u00E2\u0080\u00932025, Dmitry Isaenko +WelcomeText = Selamat datang! Saya Tihwin: utilitas format ul untuk PS2 Anda! GPLv3+, 2022-2025, Dmitry Isaenko SelectBtn = Pilih SelectDiskImageText = Pilih citra disk SetDestinationDirectoryText = Pilih direktori tujuan