diff --git a/.gitignore b/.gitignore index 8e837c50d..c6c678662 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,11 @@ *.iml *node_modules *target +.project +.settings +.classpath +*.log web-ui/javascript/build web-ui/javascript/report.*.json + +**/.DS_Store \ No newline at end of file diff --git a/core/src/main/java/studio/core/v1/writer/fs/FsStoryPackWriter.java b/core/src/main/java/studio/core/v1/writer/fs/FsStoryPackWriter.java index 6e1e55682..823f05999 100644 --- a/core/src/main/java/studio/core/v1/writer/fs/FsStoryPackWriter.java +++ b/core/src/main/java/studio/core/v1/writer/fs/FsStoryPackWriter.java @@ -44,7 +44,8 @@ public class FsStoryPackWriter { public Path write(StoryPack pack, Path outputFolder) throws Exception { // Create pack folder: last 8 digits of uuid - File packFolder = new File(outputFolder.toFile(), transformUuid(UUID.fromString(pack.getUuid()))); +// File packFolder = new File(outputFolder.toFile(), transformUuid(UUID.fromString(pack.getUuid()))); + File packFolder = outputFolder.toFile(); packFolder.mkdirs(); // Write night mode diff --git a/driver/src/main/java/studio/driver/LibUsbDetectionHelper.java b/driver/src/main/java/studio/driver/LibUsbDetectionHelper.java index 61748fb48..b3c2c665f 100644 --- a/driver/src/main/java/studio/driver/LibUsbDetectionHelper.java +++ b/driver/src/main/java/studio/driver/LibUsbDetectionHelper.java @@ -98,7 +98,11 @@ public static void initializeLibUsb(DeviceVersion deviceVersion, DeviceHotplugEv } } LOGGER.info("Exiting libusb..."); - LibUsb.exit(context); + + try { + LibUsb.exit(context); + } catch(IllegalStateException e) { + } }) ); } diff --git a/driver/src/main/java/studio/driver/fs/FsStoryTellerAsyncDriver.java b/driver/src/main/java/studio/driver/fs/FsStoryTellerAsyncDriver.java index 4c00b6aa9..eeb05088d 100644 --- a/driver/src/main/java/studio/driver/fs/FsStoryTellerAsyncDriver.java +++ b/driver/src/main/java/studio/driver/fs/FsStoryTellerAsyncDriver.java @@ -51,63 +51,72 @@ public class FsStoryTellerAsyncDriver { private List listeners = new ArrayList<>(); - public FsStoryTellerAsyncDriver() { - // Initialize libusb, handle and propagate hotplug events - LOGGER.fine("Registering hotplug listener"); - LibUsbDetectionHelper.initializeLibUsb(DeviceVersion.DEVICE_VERSION_2, new DeviceHotplugEventListener() { - @Override - public void onDevicePlugged(Device device) { - // Wait for a partition to be mounted which contains the .md file - LOGGER.fine("Waiting for device partition..."); - for (int i = 0; i < FS_MOUNTPOINT_RETRY && partitionMountPoint==null; i++) { - try { - Thread.sleep(FS_MOUNTPOINT_POLL_DELAY); - DeviceUtils.listMountPoints().forEach(path -> { - LOGGER.finest("Looking for .md file on mount point / drive: " + path); - File mdFile = new File(path, DEVICE_METADATA_FILENAME); - if (mdFile.exists()) { - partitionMountPoint = path; - LOGGER.info("FS device partition located: " + partitionMountPoint); - } - }); - } catch (InterruptedException e) { - LOGGER.log(Level.SEVERE, "Failed to locate device partition", e); - } + private boolean simulating = false; + public FsStoryTellerAsyncDriver(boolean simulating) { + this(); + this.simulating = simulating; + } + + + private DeviceHotplugEventListener defaultListener = new DeviceHotplugEventListener() { + @Override + public void onDevicePlugged(Device device) { + // Wait for a partition to be mounted which contains the .md file + LOGGER.fine("Waiting for device partition..."); + for (int i = 0; i < FS_MOUNTPOINT_RETRY && partitionMountPoint==null; i++) { + try { + Thread.sleep(FS_MOUNTPOINT_POLL_DELAY); + DeviceUtils.listMountPoints().forEach(path -> { + LOGGER.finest("Looking for .md file on mount point / drive: " + path); + File mdFile = new File(path, DEVICE_METADATA_FILENAME); + if (mdFile.exists()) { + partitionMountPoint = path; + LOGGER.info("FS device partition located: " + partitionMountPoint); } + }); + } catch (InterruptedException e) { + LOGGER.log(Level.SEVERE, "Failed to locate device partition", e); + } + } - if (partitionMountPoint == null) { - throw new StoryTellerException("Could not locate device partition"); - } + if (partitionMountPoint == null) { + throw new StoryTellerException("Could not locate device partition"); + } - // Update device reference - FsStoryTellerAsyncDriver.this.device = device; - // Notify listeners - FsStoryTellerAsyncDriver.this.listeners.forEach(listener -> listener.onDevicePlugged(device)); - } + // Update device reference + FsStoryTellerAsyncDriver.this.device = device; + // Notify listeners + FsStoryTellerAsyncDriver.this.listeners.forEach(listener -> listener.onDevicePlugged(device)); + } - @Override - public void onDeviceUnplugged(Device device) { - // Update device reference - FsStoryTellerAsyncDriver.this.device = null; - FsStoryTellerAsyncDriver.this.partitionMountPoint = null; - // Notify listeners - FsStoryTellerAsyncDriver.this.listeners.forEach(listener -> listener.onDeviceUnplugged(device)); - } - } - ); + @Override + public void onDeviceUnplugged(Device device) { + // Update device reference + FsStoryTellerAsyncDriver.this.device = null; + FsStoryTellerAsyncDriver.this.partitionMountPoint = null; + // Notify listeners + FsStoryTellerAsyncDriver.this.listeners.forEach(listener -> listener.onDeviceUnplugged(device)); + } + }; + + public FsStoryTellerAsyncDriver() { + // Initialize libusb, handle and propagate hotplug events + LOGGER.fine("Registering hotplug listener"); + LibUsbDetectionHelper.initializeLibUsb(DeviceVersion.DEVICE_VERSION_2, defaultListener); } public void registerDeviceListener(DeviceHotplugEventListener listener) { this.listeners.add(listener); - if (this.device != null) { + if (this.device != null || this.simulating) { + this.defaultListener.onDevicePlugged(null); listener.onDevicePlugged(this.device); } } public CompletableFuture getDeviceInfos() { - if (this.device == null || this.partitionMountPoint == null) { + if (!simulating && (this.device == null || this.partitionMountPoint == null)) { return CompletableFuture.failedFuture(new StoryTellerException("No device plugged")); } FsDeviceInfos infos = new FsDeviceInfos(); @@ -235,7 +244,7 @@ private long readAsciiToLong(FileInputStream fis, int numberBytes) throws IOExce public CompletableFuture> getPacksList() { - if (this.device == null || this.partitionMountPoint == null) { + if (!simulating && (this.device == null || this.partitionMountPoint == null)) { return CompletableFuture.failedFuture(new StoryTellerException("No device plugged")); } @@ -308,7 +317,7 @@ private CompletableFuture> readPackIndex() { public CompletableFuture reorderPacks(List uuids) { - if (this.device == null || this.partitionMountPoint == null) { + if (!simulating && (this.device == null || this.partitionMountPoint == null)) { return CompletableFuture.failedFuture(new StoryTellerException("No device plugged")); } @@ -331,7 +340,7 @@ public CompletableFuture reorderPacks(List uuids) { } public CompletableFuture deletePack(String uuid) { - if (this.device == null || this.partitionMountPoint == null) { + if (!simulating && (this.device == null || this.partitionMountPoint == null)) { return CompletableFuture.failedFuture(new StoryTellerException("No device plugged")); } @@ -397,7 +406,7 @@ private CompletableFuture writePackIndex(List packUUIDs) { public CompletableFuture downloadPack(String uuid, String outputPath, TransferProgressListener listener) { - if (this.device == null || this.partitionMountPoint == null) { + if (!simulating && (this.device == null || this.partitionMountPoint == null)) { return CompletableFuture.failedFuture(new StoryTellerException("No device plugged")); } @@ -433,7 +442,7 @@ public CompletableFuture downloadPack(String uuid, String output } public CompletableFuture uploadPack(String uuid, String inputPath, TransferProgressListener listener) { - if (this.device == null || this.partitionMountPoint == null) { + if (!simulating && (this.device == null || this.partitionMountPoint == null)) { return CompletableFuture.failedFuture(new StoryTellerException("No device plugged")); } diff --git a/pom.xml b/pom.xml index b1d0f160a..0cacb1fae 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,8 @@ core driver metadata - web-ui + + studio-desktop @@ -49,7 +50,7 @@ commons-io commons-io - 2.6 + 2.13.0 commons-codec diff --git a/studio-desktop/Lunii-Transfert.app/Contents/Info.plist b/studio-desktop/Lunii-Transfert.app/Contents/Info.plist new file mode 100755 index 000000000..a50d4bd12 --- /dev/null +++ b/studio-desktop/Lunii-Transfert.app/Contents/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleName + Lunii Transfert + + CFBundleExecutable + studio.sh + + CFBundleIconFile + lunii.png + + CFBundleInfoDictionaryVersion + 6.0 + + CFBundlePackageType + APPL + + CFBundleSignature + ???? + + CFBundleIdentifier + studio.GUI + + diff --git a/studio-desktop/build_macos_app.sh b/studio-desktop/build_macos_app.sh new file mode 100755 index 000000000..59417c394 --- /dev/null +++ b/studio-desktop/build_macos_app.sh @@ -0,0 +1,18 @@ +#!/bin/bash + + +cp -r Lunii-Transfert.app target/ +cp target/studio.sh target/Lunii-Transfert.app/Contents/MacOS +cp target/lunii.png target/Lunii-Transfert.app/Contents/Resources +cp -r target/lib/ target/Lunii-Transfert.app/Contents/Resources/Java/lib +cp libusb4java-1.3.0-darwin-aarch64.jar target/Lunii-Transfert.app/Contents/Resources/Java/lib/ +cp target/$1.jar target/Lunii-Transfert.app/Contents/Resources/Java + +rm -rf /tmp/buildlunii +mkdir -p /tmp/buildlunii +cp -r target/Lunii-Transfert.app /tmp/buildlunii +ln -s /Applications/ /tmp/buildlunii/Applications + +hdiutil create -fs HFS+ -srcfolder "/tmp/buildlunii" -volname Lunii-Transfert target/Lunii-Transfert.dmg + +rm -rf /tmp/buildlunii \ No newline at end of file diff --git a/studio-desktop/libusb4java-1.3.0-darwin-aarch64.jar b/studio-desktop/libusb4java-1.3.0-darwin-aarch64.jar new file mode 100644 index 000000000..24462c1e2 Binary files /dev/null and b/studio-desktop/libusb4java-1.3.0-darwin-aarch64.jar differ diff --git a/studio-desktop/pom.xml b/studio-desktop/pom.xml new file mode 100644 index 000000000..f969d0b6c --- /dev/null +++ b/studio-desktop/pom.xml @@ -0,0 +1,218 @@ + + + studio-parent + studio + 0.4.1-SNAPSHOT + + 4.0.0 + 0.4.1-SNAPSHOT + studio-desktop + + + studio + studio-core + ${project.parent.version} + + + studio + studio-metadata + ${project.parent.version} + + + studio + studio-driver + ${project.parent.version} + + + net.harawata + appdirs + 1.2.2 + + + com.google.code.gson + gson + + + commons-io + commons-io + + + commons-codec + commons-codec + + + com.googlecode.soundlibs + vorbisspi + 1.0.3.3 + + + com.googlecode.soundlibs + mp3spi + 1.9.5.4 + + + junit + junit + + + + + org.usb4java + usb4java + 1.3.0 + + + de.sciss + jump3r + 1.0.5 + + + org.apache.logging.log4j + log4j-api + 2.13.2 + + + org.apache.logging.log4j + log4j-core + 2.13.2 + + + org.apache.logging.log4j + log4j-jul + 2.13.2 + + + org.apache.poi + poi + 5.2.3 + + + org.apache.poi + poi-ooxml + 5.2.3 + + + org.jxls + jxls-jexcel + 1.0.9 + + + org.dhatim + fastexcel-reader + 0.15.3 + + + org.dhatim + fastexcel + 0.15.3 + + + org.apache.xmlgraphics + batik-all + 1.17 + + + + + + src/main/java + + **/*.properties + **/*.svg + + + + + src/main/resources + + studio.sh + studio.bat + + true + + + + src/main/resources + + studio.sh + studio.bat + lunii.png + + + .. + true + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + + copy-dependencies + prepare-package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + exec-maven-plugin + org.codehaus.mojo + + + bundle_macosapp + package + + exec + + + ${basedir}/build_macos_app.sh + ${project.build.finalName} + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.1 + + + make-assembly + package + + single + + + + + + src/main/assembly/dist.xml + + + + studio.GUI + + + + + + + + + maven-compiler-plugin + + 11 + 11 + + + + + + \ No newline at end of file diff --git a/studio-desktop/prefs.ini b/studio-desktop/prefs.ini new file mode 100644 index 000000000..b22a7bbe4 --- /dev/null +++ b/studio-desktop/prefs.ini @@ -0,0 +1,3 @@ +#auto-generated +#Thu Jul 25 16:25:40 CEST 2024 +libraryPath=/Users/horfee/Documents/studio-library diff --git a/studio-desktop/src/main/assembly/dist.xml b/studio-desktop/src/main/assembly/dist.xml new file mode 100644 index 000000000..f4d7d86cb --- /dev/null +++ b/studio-desktop/src/main/assembly/dist.xml @@ -0,0 +1,42 @@ + + + + + dist + + zip + + + + + false + lib + false + compile + + + + + + ${project.build.directory} + + + ${project.build.finalName}.jar + + + + ${project.build.directory} + + + studio.sh + studio.bat + + 0755 + + + + \ No newline at end of file diff --git a/studio-desktop/src/main/java/studio/DeviceListTransferHandler.java b/studio-desktop/src/main/java/studio/DeviceListTransferHandler.java new file mode 100644 index 000000000..4e0347e4f --- /dev/null +++ b/studio-desktop/src/main/java/studio/DeviceListTransferHandler.java @@ -0,0 +1,104 @@ +package studio; + +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.IntStream; + +import javax.swing.DefaultListModel; +import javax.swing.JList; +import javax.swing.TransferHandler; + +import studio.database.JsonPack; + +public class DeviceListTransferHandler extends TransferHandler { + + private JList libraryPacksList; + private JList devicePacksList; + + public DeviceListTransferHandler(JList libraryList, JList deviceList) { + super(); + this.libraryPacksList = libraryList; + this.devicePacksList = deviceList; + } + + private static final long serialVersionUID = -6050701764610620507L; + + public boolean canImport(TransferHandler.TransferSupport support) { + if (!support.isDataFlavorSupported(DataFlavor.stringFlavor)) { + return false; + } + if (!support.getComponent().getName().equals("devices")) { + return false; + } + + JList.DropLocation dl = (JList.DropLocation) support.getDropLocation(); + return dl.getIndex() != -1; + } + + public boolean importData(TransferHandler.TransferSupport support) { + if (!canImport(support)) { + return false; + } + + Transferable transferable = support.getTransferable(); + String transferMe; + try { + transferMe = (String) transferable.getTransferData(DataFlavor.stringFlavor); + } catch (UnsupportedFlavorException | IOException e) { + e.printStackTrace(); + return false; + } + + String source = transferMe.substring(0, transferMe.indexOf(": ")); + List uuids = List.of(transferMe.substring(transferMe.indexOf(": ") + 2).split(",")); + + JList list = source.equals("library") ? libraryPacksList + : source.equals("devices") ? devicePacksList : null; + if (list == null) + return false; + + final DefaultListModel model = ((DefaultListModel) list.getModel()); + + List indices = new ArrayList(); + for (String uuid : uuids) { + indices.add(IntStream.range(0, model.getSize()).filter(i -> uuid.equals(model.get(i).getUuid())) + .findFirst().getAsInt()); + } + + JList.DropLocation dl = (JList.DropLocation) support.getDropLocation(); + final Integer dropTargetIndex = dl.getIndex(); + + if (source.equals("devices")) { + int nbBeforeDropIndex = (int) indices.stream().filter((v) -> v < dropTargetIndex.intValue()) + .count(); + List objects = new ArrayList(); + for (int index = indices.size() - 1; index >= 0; index--) { + objects.add(model.remove(indices.get(index))); + } + + int insertIndex = dropTargetIndex - nbBeforeDropIndex; + + for (int i = objects.size() - 1; i >= 0; i--) { + model.add(insertIndex++, objects.get(i)); + + } + } else { + List existingPacks = List + .of(((DefaultListModel) ((JList) support.getComponent()).getModel()) + .toArray()); + List existingUUIDs = existingPacks.stream().map(p -> ((JsonPack) p).getUuid()).toList(); + + List toAdd = indices.stream().map(i -> model.get(i)) + .filter(pack -> existingUUIDs.stream().allMatch(s -> !s.equalsIgnoreCase(pack.getUuid()))) + .toList(); + ((DefaultListModel) devicePacksList.getModel()).addAll(dropTargetIndex, toAdd); + } + + return true; + } + +} diff --git a/studio-desktop/src/main/java/studio/GUI.java b/studio-desktop/src/main/java/studio/GUI.java new file mode 100644 index 000000000..7a188569f --- /dev/null +++ b/studio-desktop/src/main/java/studio/GUI.java @@ -0,0 +1,1673 @@ +package studio; + +import java.awt.BorderLayout; +import java.awt.Desktop; +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.Font; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.Label; +import java.awt.Toolkit; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.StringSelection; +import java.awt.datatransfer.Transferable; +import java.awt.dnd.DnDConstants; +import java.awt.dnd.DragGestureEvent; +import java.awt.dnd.DragGestureListener; +import java.awt.dnd.DragSource; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.InputEvent; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.WindowEvent; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Locale; +import java.util.Optional; +import java.util.Properties; +import java.util.ResourceBundle; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import javax.swing.BoxLayout; +import javax.swing.DefaultComboBoxModel; +import javax.swing.DefaultListModel; +import javax.swing.DropMode; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JProgressBar; +import javax.swing.JScrollPane; +import javax.swing.JSpinner; +import javax.swing.JSplitPane; +import javax.swing.JTextField; +import javax.swing.KeyStroke; +import javax.swing.ListSelectionModel; +import javax.swing.SpinnerNumberModel; +import javax.swing.SwingConstants; +import javax.swing.TransferHandler; +import javax.swing.UIManager; +import javax.swing.border.TitledBorder; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.ListDataEvent; +import javax.swing.event.ListDataListener; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + +import org.apache.commons.io.FileUtils; +import org.apache.poi.common.usermodel.HyperlinkType; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFFont; +import org.apache.poi.xssf.usermodel.XSSFHyperlink; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.usb4java.Device; + +import net.harawata.appdirs.AppDirsFactory; +import studio.database.JsonPack; +import studio.database.Library; +import studio.driver.event.DeviceHotplugEventListener; +import studio.driver.event.TransferProgressListener; +import studio.driver.fs.FsStoryTellerAsyncDriver; +import studio.driver.model.TransferStatus; +import studio.driver.model.fs.FsDeviceInfos; +import studio.driver.model.fs.FsStoryPackInfos; +import studio.driver.model.raw.RawDeviceInfos; +import studio.driver.model.raw.RawStoryPackInfos; +import studio.driver.raw.LibUsbMassStorageHelper; +import studio.driver.raw.RawStoryTellerAsyncDriver; + +public class GUI { + + private JFrame frmLuniiTransfer; + private JTextField serialNumberTextBox; + private JTextField uUIDTextBox; + private JTextField firmwareTextBox; + private JTextField totalSizeTextBox; + private JTextField usedSizeTextBox; + + private FsStoryTellerAsyncDriver fsDriver; + private RawStoryTellerAsyncDriver rawDriver; + private JList devicePacksList; + private JList libraryPacksList; + private Library library; + private DefaultListModel libraryPacksModel; + private DefaultListModel devicePacksModel; + + private boolean fsDriverUsed = false; + private boolean rawDriverUsed = false; + private JProgressBar installUninstallProgressBar; + private JProgressBar globalProgressBar; + private JLabel devicePacksSummaryLabel; + private JLabel libraryPacksSummaryLabel; + private JButton btnValidate; + private JButton btnRefresh; + private JButton btnDownloadPackages; + private JButton btnRefreshLibrary; + private ResourceBundle localization; + private Label lblTransferingPack; + private boolean mustCancel = false; + private GridBagLayout statusLayout; + private JPanel statusPanel; + private JButton btnCancel; + private JLabel libraryPathLabel; + private PlaceholderTextField librarySearchTextField; + private PlaceholderTextField deviceSearchTextField; + private JCheckBox displayOnlyNotOnDeviceCheckBox; + private JPanel panel_1; + private JComboBox languageFilterComboBox; + private JLabel lblNewLabel; + private JSpinner spinner; + private JLabel lblNewLabel_1; + private JSpinner spinner_1; + private DefaultComboBoxModel availableLanguagesModel; + + /** + * Launch the application. + */ + public static void main(String[] args) { + + int javaVersion = Runtime.version().feature(); + if ( javaVersion < 14 ) { + JOptionPane.showMessageDialog(null, + "You must install and use Java version 14+ to run this program", + "Unsupported version of java", + JOptionPane.ERROR_MESSAGE); + + System.exit(1); + } + + + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + + GUI window = new GUI(); + window.frmLuniiTransfer.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public GUI() { + localization = ResourceBundle.getBundle("studio/localization/Translation", Locale.getDefault()); + + initialize(); + initializeLunii(); + + } + + private CompletableFuture> loadPacksFromDevice() { + if (fsDriverUsed) { + return fsDriver.getPacksList().thenComposeAsync((List packs) -> { + return library.loadDatabase().thenApplyAsync((Void v) -> { + List res = packs.stream().map(pack -> library.getPackForUUID(pack.getUuid().toString())) + .filter(Optional::isPresent).map(Optional::get).toList(); + return res; + }); + }); + } else if (rawDriverUsed) { + return rawDriver.getPacksList().thenComposeAsync((List packs) -> { + return library.loadDatabase().thenApplyAsync((Void v) -> { + List res = packs.stream().map(pack -> library.getPackForUUID(pack.getUuid().toString())) + .filter(Optional::isPresent).map(Optional::get).toList(); + return res; + }); + }); + } else { + return CompletableFuture.supplyAsync(() -> new ArrayList()); + } + } + + private void initializeLunii() { + String libraryFolder = System.getProperty("user.home"); + File prefsFile = new File(AppDirsFactory.getInstance().getUserConfigDir("Lunii-Transfert", "0.4.1", "horfee") + "/prefs.ini"); + if ( prefsFile.exists()) { + Properties prop = new java.util.Properties(); + try { + prop.load(new FileInputStream(prefsFile)); + } catch (IOException e) { + } + libraryFolder = prop.getProperty("libraryPath"); + if ( libraryFolder == null ) { + libraryFolder = System.getProperty("user.home"); + } + + } + library = Library.getInstance(libraryFolder); + + libraryPathLabel.setText("Path: " + library.getLibraryPath()); + library.getPacks().thenAcceptAsync((List packs) -> { + libraryPacksModel.addAll(packs); + btnRefreshLibrary.setEnabled(true); + + Set languages = packs.stream().map( (JsonPack p) -> { + return p.getLocalizedInfos() == null || p.getLocalizedInfos().isEmpty() ? null : p.getLocalizedInfos().keySet().iterator().next(); + }).collect(Collectors.toSet()); + if ( !languages.contains(null) ) { + languages.add(null); + } + + availableLanguagesModel.removeAllElements(); + availableLanguagesModel.addAll(languages); + }); + + fsDriver = new FsStoryTellerAsyncDriver(false); + rawDriver = new RawStoryTellerAsyncDriver(); + + fsDriver.registerDeviceListener(new DeviceHotplugEventListener() { + + @Override + public void onDeviceUnplugged(Device device) { + devicePacksModel.clear(); + serialNumberTextBox.setText(""); + uUIDTextBox.setText(""); + firmwareTextBox.setText(""); + totalSizeTextBox.setText(""); + usedSizeTextBox.setText(""); + + btnDownloadPackages.setEnabled(false); + btnValidate.setEnabled(false); + btnRefresh.setEnabled(false); + } + + @Override + public void onDevicePlugged(Device device) { + FsDeviceInfos deviceInfos; + try { + deviceInfos = fsDriver.getDeviceInfos().get(); + serialNumberTextBox.setText(deviceInfos.getSerialNumber()); + uUIDTextBox.setText(UUID.nameUUIDFromBytes(deviceInfos.getUuid()).toString()); + firmwareTextBox.setText(deviceInfos.getFirmwareMajor() + "." + deviceInfos.getFirmwareMinor()); + totalSizeTextBox.setText(FileUtils.byteCountToDisplaySize(deviceInfos.getSdCardSizeInBytes())); + usedSizeTextBox.setText(FileUtils.byteCountToDisplaySize(deviceInfos.getUsedSpaceInBytes())); + + btnDownloadPackages.setEnabled(false); + btnValidate.setEnabled(false); + btnRefresh.setEnabled(false); + + fsDriverUsed = true; + rawDriverUsed = false; + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + + loadPacksFromDevice().thenAcceptAsync((packs) -> { + devicePacksModel.clear(); + devicePacksModel.addAll(packs); + + btnDownloadPackages.setEnabled(true); + btnValidate.setEnabled(true); + btnRefresh.setEnabled(true); + }); + + } + }); + + rawDriver.registerDeviceListener(new DeviceHotplugEventListener() { + + @Override + public void onDeviceUnplugged(Device device) { + devicePacksModel.clear(); + serialNumberTextBox.setText(""); + uUIDTextBox.setText(""); + firmwareTextBox.setText(""); + totalSizeTextBox.setText(""); + usedSizeTextBox.setText(""); + + btnDownloadPackages.setEnabled(false); + btnValidate.setEnabled(false); + btnRefresh.setEnabled(false); + + } + + @Override + public void onDevicePlugged(Device device) { + RawDeviceInfos deviceInfos; + try { + deviceInfos = rawDriver.getDeviceInfos().get(); + serialNumberTextBox.setText(deviceInfos.getSerialNumber()); + uUIDTextBox.setText(deviceInfos.getUuid().toString()); + // uUIDTextBox.setText(deviceInfos.getUuid().toString()); + firmwareTextBox.setText(deviceInfos.getFirmwareMajor() + "." + deviceInfos.getFirmwareMinor()); + totalSizeTextBox.setText(FileUtils.byteCountToDisplaySize( + deviceInfos.getSdCardSizeInSectors() * LibUsbMassStorageHelper.SECTOR_SIZE)); + usedSizeTextBox.setText(FileUtils.byteCountToDisplaySize( + deviceInfos.getUsedSpaceInSectors() * LibUsbMassStorageHelper.SECTOR_SIZE)); + + btnDownloadPackages.setEnabled(false); + btnValidate.setEnabled(false); + btnRefresh.setEnabled(false); + + fsDriverUsed = false; + rawDriverUsed = true; + + } catch (InterruptedException | ExecutionException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + loadPacksFromDevice().thenAcceptAsync((packs) -> { + devicePacksModel.clear(); + devicePacksModel.addAll(packs); + + btnDownloadPackages.setEnabled(true); + btnValidate.setEnabled(true); + btnRefresh.setEnabled(true); + + }); + + } + }); + + } + + private void refreshFreeSpaceOnDevice() { + try { + if (fsDriverUsed) { + FsDeviceInfos deviceInfos; + deviceInfos = fsDriver.getDeviceInfos().get(); + + usedSizeTextBox.setText(FileUtils.byteCountToDisplaySize(deviceInfos.getUsedSpaceInBytes())); + + } else if (rawDriverUsed) { + RawDeviceInfos deviceInfos = rawDriver.getDeviceInfos().get(); + usedSizeTextBox.setText(FileUtils.byteCountToDisplaySize( + deviceInfos.getUsedSpaceInSectors() * LibUsbMassStorageHelper.SECTOR_SIZE)); + + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + } + + + private void filterLibrary() { + String language = (String)languageFilterComboBox.getSelectedItem(); + int from = (int)spinner.getValue(); + int to = (int)spinner_1.getValue(); + + library.getPacks().thenAcceptAsync( (List packs) -> { + Stream stream = packs.stream(); + if ( language != null ) { + stream = stream.filter( (JsonPack pack) -> { + return pack.getLocalizedInfos().keySet().contains(language); + }); + } + if ( from > 0 ) { + stream = stream.filter( (JsonPack pack) -> pack.getAgeMin() >= from); + } + if ( to > 0 ) { + stream = stream.filter( (JsonPack pack) -> pack.getAgeMax() == -1 ? pack.getAgeMin() <= to : pack.getAgeMax() <= to); + } + libraryPacksModel.clear(); + libraryPacksModel.addAll(stream.collect(Collectors.toList())); + + + }); + + + } + + /** + * Initialize the contents of the frame. + */ + private void initialize() { + frmLuniiTransfer = new JFrame(); + frmLuniiTransfer.setIconImage(Toolkit.getDefaultToolkit().getImage(GUI.class.getResource("/lunii.png")));// .getDefaultToolkit().getImage("/Users/horfee/Developpement/studio.GoodOne/studio-desktop/src/main/resources/logolunii.jpeg")); + frmLuniiTransfer.setTitle(localization.getString("Frame.Title")); + frmLuniiTransfer.setBounds(100, 100, 1024, 720); + frmLuniiTransfer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frmLuniiTransfer.getContentPane().setLayout(new BoxLayout(frmLuniiTransfer.getContentPane(), BoxLayout.X_AXIS)); + + JPanel panel = new JPanel(); + frmLuniiTransfer.getContentPane().add(panel); + panel.setLayout(new BorderLayout(0, 0)); + + JPanel informationPanel = new JPanel(); + panel.add(informationPanel, BorderLayout.NORTH); + GridBagLayout gbl_informationPanel = new GridBagLayout(); + gbl_informationPanel.columnWidths = new int[] { 0, 0, 0, 0 }; + gbl_informationPanel.rowHeights = new int[] { 0, 0, 0, 0, 0, 0, 0 }; + gbl_informationPanel.columnWeights = new double[] { 0.0, 1.0, 0.0, 1.0 }; + gbl_informationPanel.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE }; + informationPanel.setLayout(gbl_informationPanel); + + JLabel deviceInformationLabel = new JLabel(localization.getString("Device.Information")); + GridBagConstraints gbc_deviceInformationLabel = new GridBagConstraints(); + gbc_deviceInformationLabel.gridwidth = 4; + gbc_deviceInformationLabel.fill = GridBagConstraints.HORIZONTAL; + gbc_deviceInformationLabel.gridx = 0; + gbc_deviceInformationLabel.gridy = 0; + gbc_deviceInformationLabel.insets = new Insets(5, 5, 5, 0); + informationPanel.add(deviceInformationLabel, gbc_deviceInformationLabel); + + JLabel serialNumberLabel = new JLabel(localization.getString("Device.serialnum"));// "Serial number :"); + GridBagConstraints gbc_serialNumberLabel = new GridBagConstraints(); + gbc_serialNumberLabel.anchor = GridBagConstraints.EAST; + gbc_serialNumberLabel.insets = new Insets(5, 5, 5, 5); + gbc_serialNumberLabel.gridx = 0; + gbc_serialNumberLabel.gridy = 1; + informationPanel.add(serialNumberLabel, gbc_serialNumberLabel); + + serialNumberTextBox = new JTextField(); + serialNumberTextBox.setEditable(false); + GridBagConstraints gbc_serialNumberTextBox = new GridBagConstraints(); + gbc_serialNumberTextBox.weightx = 1.0; + gbc_serialNumberTextBox.gridwidth = 3; + gbc_serialNumberTextBox.insets = new Insets(5, 0, 5, 0); + gbc_serialNumberTextBox.fill = GridBagConstraints.HORIZONTAL; + gbc_serialNumberTextBox.gridx = 1; + gbc_serialNumberTextBox.gridy = 1; + informationPanel.add(serialNumberTextBox, gbc_serialNumberTextBox); + serialNumberTextBox.setColumns(10); + + JLabel uUIDLabel = new JLabel(localization.getString("Device.UUID"));// :"); + GridBagConstraints gbc_uUIDLabel = new GridBagConstraints(); + gbc_uUIDLabel.anchor = GridBagConstraints.EAST; + gbc_uUIDLabel.insets = new Insets(5, 5, 5, 5); + gbc_uUIDLabel.gridx = 0; + gbc_uUIDLabel.gridy = 2; + informationPanel.add(uUIDLabel, gbc_uUIDLabel); + + uUIDTextBox = new JTextField(); + uUIDTextBox.setEditable(false); + GridBagConstraints gbc_uUIDTextBox = new GridBagConstraints(); + gbc_uUIDTextBox.weightx = 1.0; + gbc_uUIDTextBox.gridwidth = 3; + gbc_uUIDTextBox.insets = new Insets(5, 0, 5, 0); + gbc_uUIDTextBox.fill = GridBagConstraints.HORIZONTAL; + gbc_uUIDTextBox.gridx = 1; + gbc_uUIDTextBox.gridy = 2; + informationPanel.add(uUIDTextBox, gbc_uUIDTextBox); + uUIDTextBox.setColumns(10); + + JLabel FirmwareLabel = new JLabel(localization.getString("Device.firmware"));// "Firmware :"); + GridBagConstraints gbc_FirmwareLabel = new GridBagConstraints(); + gbc_FirmwareLabel.anchor = GridBagConstraints.EAST; + gbc_FirmwareLabel.insets = new Insets(5, 0, 5, 5); + gbc_FirmwareLabel.gridx = 0; + gbc_FirmwareLabel.gridy = 3; + informationPanel.add(FirmwareLabel, gbc_FirmwareLabel); + + firmwareTextBox = new JTextField(); + firmwareTextBox.setEditable(false); + GridBagConstraints gbc_firmwareTextBox = new GridBagConstraints(); + gbc_firmwareTextBox.weightx = 1.0; + gbc_firmwareTextBox.gridwidth = 3; + gbc_firmwareTextBox.insets = new Insets(5, 0, 5, 0); + gbc_firmwareTextBox.fill = GridBagConstraints.HORIZONTAL; + gbc_firmwareTextBox.gridx = 1; + gbc_firmwareTextBox.gridy = 3; + informationPanel.add(firmwareTextBox, gbc_firmwareTextBox); + firmwareTextBox.setColumns(10); + + JLabel sizeLabel = new JLabel(localization.getString("Device.size")); + GridBagConstraints gbc_sizeLabel = new GridBagConstraints(); + gbc_sizeLabel.anchor = GridBagConstraints.EAST; + gbc_sizeLabel.insets = new Insets(5, 5, 5, 5); + gbc_sizeLabel.gridx = 0; + gbc_sizeLabel.gridy = 4; + informationPanel.add(sizeLabel, gbc_sizeLabel); + + totalSizeTextBox = new JTextField(); + totalSizeTextBox.setEditable(false); + GridBagConstraints gbc_totalSizeTextBox = new GridBagConstraints(); + gbc_totalSizeTextBox.weightx = 1.0; + gbc_totalSizeTextBox.insets = new Insets(5, 0, 5, 5); + gbc_totalSizeTextBox.fill = GridBagConstraints.HORIZONTAL; + gbc_totalSizeTextBox.gridx = 1; + gbc_totalSizeTextBox.gridy = 4; + informationPanel.add(totalSizeTextBox, gbc_totalSizeTextBox); + totalSizeTextBox.setColumns(10); + + JLabel sizeUsedLabel = new JLabel(localization.getString("Device.used")); + GridBagConstraints gbc_sizeUsedLabel = new GridBagConstraints(); + gbc_sizeUsedLabel.insets = new Insets(5, 5, 5, 5); + gbc_sizeUsedLabel.anchor = GridBagConstraints.EAST; + gbc_sizeUsedLabel.gridx = 2; + gbc_sizeUsedLabel.gridy = 4; + informationPanel.add(sizeUsedLabel, gbc_sizeUsedLabel); + + usedSizeTextBox = new JTextField(); + usedSizeTextBox.setEditable(false); + GridBagConstraints gbc_usedSizeTextBox = new GridBagConstraints(); + gbc_usedSizeTextBox.weightx = 1.0; + gbc_usedSizeTextBox.insets = new Insets(5, 0, 5, 0); + gbc_usedSizeTextBox.fill = GridBagConstraints.HORIZONTAL; + gbc_usedSizeTextBox.gridx = 3; + gbc_usedSizeTextBox.gridy = 4; + informationPanel.add(usedSizeTextBox, gbc_usedSizeTextBox); + usedSizeTextBox.setColumns(10); + + libraryPathLabel = new JLabel("Library" + (library == null ? "" : library.getLibraryPath())); + libraryPathLabel.setFont(new Font("Lucida Grande", Font.ITALIC, 10)); + GridBagConstraints gbc_libraryPathLabel = new GridBagConstraints(); + gbc_libraryPathLabel.gridwidth = 4; + gbc_libraryPathLabel.anchor = GridBagConstraints.EAST; + gbc_libraryPathLabel.gridx = 0; + gbc_libraryPathLabel.gridy = 5; + gbc_libraryPathLabel.insets = new Insets(5, 5, 5, 5); + informationPanel.add(libraryPathLabel, gbc_libraryPathLabel); + + devicePacksModel = new DefaultListModel(); + + + DragGestureListener dgl = new DragGestureListener() { + + @Override + public void dragGestureRecognized(DragGestureEvent dge) { + String source = dge.getComponent().getName(); + System.out.println("Recognized"); + if (source.equals("devices") || source.equals("library")) { + String selectedIndices = ((JList) dge.getComponent()).getSelectedValuesList().stream() + .map(JsonPack::getUuid).collect(Collectors.joining(",")); + StringSelection transferable = new StringSelection(source + ": " + selectedIndices); + System.out.println("start drag"); + dge.getDragSource().startDrag(dge, DragSource.DefaultMoveDrop, transferable, null); + } + } + }; + + DragSource.getDefaultDragSource().createDefaultDragGestureRecognizer(libraryPacksList, DnDConstants.ACTION_MOVE, dgl); + libraryPacksModel = new DefaultListModel(); + devicePacksModel.addListDataListener(new ListDataListener() { + + @Override + public void intervalAdded(ListDataEvent e) { + devicePacksSummaryLabel.setText(devicePacksList.getSelectionModel().getSelectedItemsCount() + "/" + + devicePacksList.getModel().getSize()); + + } + + @Override + public void intervalRemoved(ListDataEvent e) { + devicePacksSummaryLabel.setText(devicePacksList.getSelectionModel().getSelectedItemsCount() + "/" + + devicePacksList.getModel().getSize()); + + } + + @Override + public void contentsChanged(ListDataEvent e) { + devicePacksSummaryLabel.setText(devicePacksList.getSelectionModel().getSelectedItemsCount() + "/" + + devicePacksList.getModel().getSize()); + + } + + }); + libraryPacksModel.addListDataListener(new ListDataListener() { + + @Override + public void intervalAdded(ListDataEvent e) { + libraryPacksSummaryLabel.setText(libraryPacksList.getSelectionModel().getSelectedItemsCount() + "/" + + libraryPacksModel.getSize()); + + } + + @Override + public void intervalRemoved(ListDataEvent e) { + libraryPacksSummaryLabel.setText(libraryPacksList.getSelectionModel().getSelectedItemsCount() + "/" + + libraryPacksModel.getSize()); + + } + + @Override + public void contentsChanged(ListDataEvent e) { + libraryPacksSummaryLabel.setText(libraryPacksList.getSelectionModel().getSelectedItemsCount() + "/" + + libraryPacksModel.getSize()); + + } + + }); + + JSplitPane splitPane = new JSplitPane(); + splitPane.setResizeWeight(0.5); + panel.add(splitPane, BorderLayout.CENTER); + + + JPanel deviceListPanel = new JPanel(); + splitPane.setLeftComponent(deviceListPanel); + deviceListPanel.setLayout(new BorderLayout(0, 0)); + deviceListPanel.setBorder(new TitledBorder(null, localization.getString("Device.list"), TitledBorder.LEADING, + TitledBorder.TOP, null, null)); + + deviceSearchTextField = new PlaceholderTextField(); + deviceListPanel.add(deviceSearchTextField, BorderLayout.NORTH); + deviceSearchTextField.setPlaceHolder(localization.getString("Device.search")); + deviceSearchTextField.addKeyListener(new KeyAdapter() { + @Override + public void keyTyped(KeyEvent e) { + if ( e.getKeyChar() == KeyEvent.VK_ENTER ) { + String searchText = deviceSearchTextField.getText().toLowerCase(); + boolean found = false; + int i; + int startIndex = devicePacksList.getSelectedIndex() + 1; + for(i = startIndex; i < devicePacksModel.getSize() && !found; i++) { + JsonPack element = devicePacksModel.get(i); + found = element.getTitle() != null && element.getTitle().toLowerCase().contains(searchText) || element.getLocalizedInfos() != null && element.getLocalizedInfos().values().stream().anyMatch( (localizedInfos) -> (localizedInfos.getTitle() != null && localizedInfos.getTitle().toLowerCase().contains(searchText)) || (localizedInfos.getDescription() != null && localizedInfos.getDescription().toLowerCase().contains(searchText))); + } + if ( found ) { + devicePacksList.setSelectedIndex(i - 1); + devicePacksList.ensureIndexIsVisible(i - 1); + } else if ( startIndex > 0 ) { + devicePacksList.clearSelection(); + this.keyTyped((e)); + } + } else if ( e.getKeyChar() == KeyEvent.VK_ESCAPE ) { + deviceSearchTextField.setText(""); + } + } + }); + + JScrollPane devicePacksScrollPane = new JScrollPane(); + deviceListPanel.add(devicePacksScrollPane); + devicePacksList = new JList(devicePacksModel); + devicePacksList.addKeyListener(new KeyAdapter() { + @Override + public void keyTyped(KeyEvent e) { + + if (e.getExtendedKeyCode() == KeyEvent.VK_DELETE) { + int[] selection = devicePacksList.getSelectedIndices(); + for (int i = selection.length - 1; i >= 0; i--) { + devicePacksModel.remove(selection[i]); + } + } else if (e.getExtendedKeyCode() == KeyEvent.VK_ESCAPE) { + devicePacksList.getSelectionModel().clearSelection(); + } + } + }); + devicePacksList.setCellRenderer(new JsonPackCell(localization)); + devicePacksList.setName("devices"); + devicePacksScrollPane.setViewportView(devicePacksList); + //devicePacksList.setDragEnabled(true); + devicePacksList.setDropMode(DropMode.INSERT); + devicePacksList.getSelectionModel().addListSelectionListener(new ListSelectionListener() { + + @Override + public void valueChanged(ListSelectionEvent e) { + devicePacksSummaryLabel.setText(devicePacksList.getSelectionModel().getSelectedItemsCount() + "/" + + devicePacksList.getModel().getSize()); + + } + + }); + DragSource.getDefaultDragSource().createDefaultDragGestureRecognizer(devicePacksList, DnDConstants.ACTION_MOVE, dgl); + + JPanel panel_4 = new JPanel(); + deviceListPanel.add(panel_4, BorderLayout.SOUTH); + GridBagLayout gbl_panel_4 = new GridBagLayout(); + gbl_panel_4.columnWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 1.0 }; + gbl_panel_4.rowWeights = new double[] { 0.0 }; + panel_4.setLayout(gbl_panel_4); + + btnDownloadPackages = new JButton(localization.getString("Device.download"));// "Download"); + btnDownloadPackages.setEnabled(false); + GridBagConstraints gbc_btnDownloadPackages = new GridBagConstraints(); + gbc_btnDownloadPackages.anchor = GridBagConstraints.NORTHWEST; + gbc_btnDownloadPackages.insets = new Insets(0, 0, 5, 5); + gbc_btnDownloadPackages.gridx = 0; + gbc_btnDownloadPackages.gridy = 0; + panel_4.add(btnDownloadPackages, gbc_btnDownloadPackages); + btnDownloadPackages.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + + btnRefresh.setEnabled(false); + btnDownloadPackages.setEnabled(false); + btnValidate.setEnabled(false); + btnCancel.setEnabled(true); + + CompletableFuture.runAsync(() -> { + int[] selected = devicePacksList.getSelectedIndices(); + if (selected.length == 0) { + selected = IntStream.range(0, devicePacksModel.getSize()).toArray(); + } + globalProgressBar.setString("0/" + selected.length); + globalProgressBar.setStringPainted(true); + globalProgressBar.setMaximum(selected.length); + + Arrays.stream(selected).boxed().map((i) -> devicePacksModel.get(i)).forEach((pack) -> { + boolean mustCancelLocal = false; + synchronized (this) { + mustCancelLocal = mustCancel; + } + if (fsDriverUsed && !mustCancelLocal) { + try { + + JsonPack jsonPack = library.getPackForUUID(pack.getUuid()).get(); + String packTitle = jsonPack.getTitle(); + if (packTitle == null) + packTitle = jsonPack.getLocalizedInfos().values().iterator().next().getTitle(); + lblTransferingPack.setText(localization.getString("Transfering.transferringpack") + .replace("{}", packTitle)); + fsDriver.downloadPack(pack.getUuid(), library.getLibraryPath(), + new TransferProgressListener() { + + @Override + public void onProgress(TransferStatus status) { + installUninstallProgressBar.setMinimum(0); + installUninstallProgressBar.setMaximum(status.getTotal()); + installUninstallProgressBar.setValue(status.getTransferred()); + + } + + @Override + public void onComplete(TransferStatus status) { + } + }).get(); + + } catch (InterruptedException | ExecutionException e1) { + e1.printStackTrace(); + } finally { + installUninstallProgressBar.setValue(installUninstallProgressBar.getMaximum()); + globalProgressBar.setValue(globalProgressBar.getValue() + 1); + globalProgressBar + .setString(globalProgressBar.getValue() + "/" + globalProgressBar.getMaximum()); + } + } else if (rawDriverUsed && !mustCancelLocal) { + try { + JsonPack jsonPack = library.getPackForUUID(pack.getUuid()).get(); + String packTitle = jsonPack.getTitle(); + if (packTitle == null) + packTitle = jsonPack.getLocalizedInfos().values().iterator().next().getTitle(); + lblTransferingPack.setText(localization.getString("Transfering.transferringpack") + .replace("{}", packTitle)); + + rawDriver.downloadPack(pack.getUuid(), + Files.newOutputStream( + Paths.get(library.getLibraryPath(), pack.getUuid() + ".pack")), + new TransferProgressListener() { + + @Override + public void onProgress(TransferStatus status) { + installUninstallProgressBar.setMinimum(0); + installUninstallProgressBar.setMaximum(status.getTotal()); + installUninstallProgressBar.setValue(status.getTransferred()); + } + + @Override + public void onComplete(TransferStatus status) { + } + }).get(); + } catch (IOException | InterruptedException | ExecutionException e1) { + e1.printStackTrace(); + } finally { + installUninstallProgressBar.setValue(installUninstallProgressBar.getMaximum()); + globalProgressBar.setValue(globalProgressBar.getValue() + 1); + globalProgressBar + .setString(globalProgressBar.getValue() + "/" + globalProgressBar.getMaximum()); + } + } + }); + + synchronized (this) { + mustCancel = false; + } + + lblTransferingPack.setText(""); + installUninstallProgressBar.setValue(0); + globalProgressBar.setValue(0); + globalProgressBar.setStringPainted(false); + btnRefresh.setEnabled(true); + btnDownloadPackages.setEnabled(true); + btnValidate.setEnabled(true); + btnCancel.setEnabled(false); + }); + + } + }); + + btnValidate = new JButton(localization.getString("Device.validate"));// "Validate"); + btnValidate.setEnabled(false); + GridBagConstraints gbc_btnValidate = new GridBagConstraints(); + gbc_btnValidate.anchor = GridBagConstraints.NORTHWEST; + gbc_btnValidate.insets = new Insets(0, 0, 5, 5); + gbc_btnValidate.gridx = 1; + gbc_btnValidate.gridy = 0; + panel_4.add(btnValidate, gbc_btnValidate); + btnValidate.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + btnRefresh.setEnabled(false); + btnValidate.setEnabled(false); + btnDownloadPackages.setEnabled(false); + btnCancel.setEnabled(true); + + loadPacksFromDevice().thenAcceptAsync((packs) -> { + try { + + List uuids = packs.stream().map(pack -> pack.getUuid()).toList(); + List uuidsInList = Arrays.asList(devicePacksModel.toArray()).stream() + .map(pack -> ((JsonPack) pack).getUuid()).toList(); + + // Packs to uninstall + List toUninstall = new ArrayList(uuids); + toUninstall.removeAll(uuidsInList); + + // Packs to add + List toInstall = new ArrayList(uuidsInList); + toInstall.removeAll(uuids); + + int nbSteps = toUninstall.size() + toInstall.size() + 1; + boolean mustCancelLocal = false; + + globalProgressBar.setMinimum(0); + globalProgressBar.setMaximum(nbSteps); + globalProgressBar.setValue(0); + globalProgressBar.setString("0/" + nbSteps); + globalProgressBar.setStringPainted(true); + + synchronized (this) { + mustCancelLocal = mustCancel; + } + if (fsDriverUsed && !mustCancelLocal) { + toUninstall.forEach((pack) -> { + try { + synchronized (this) { + if (mustCancel) + return; + } + JsonPack jsonPack = library.getPackForUUID(pack).get(); + String packTitle = jsonPack.getTitle(); + if (packTitle == null) + packTitle = jsonPack.getLocalizedInfos().values().iterator().next().getTitle(); + lblTransferingPack.setText(localization.getString("Transfering.deletingpack") + .replace("{}", packTitle)); + statusPanel.updateUI(); + fsDriver.deletePack(pack).get(); + + refreshFreeSpaceOnDevice(); + } catch (InterruptedException | ExecutionException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } finally { + globalProgressBar.setValue(globalProgressBar.getValue() + 1); + globalProgressBar.setString( + globalProgressBar.getValue() + "/" + globalProgressBar.getMaximum()); + } + }); + } else if (rawDriverUsed && !mustCancelLocal) { + toUninstall.forEach((pack) -> { + try { + synchronized (this) { + if (mustCancel) + return; + } + JsonPack jsonPack = library.getPackForUUID(pack).get(); + String packTitle = jsonPack.getTitle(); + if (packTitle == null) + packTitle = jsonPack.getLocalizedInfos().values().iterator().next().getTitle(); + lblTransferingPack.setText(localization.getString("Transfering.deletingpack") + .replace("{}", packTitle)); + statusPanel.updateUI(); + rawDriver.deletePack(pack).get(); + + refreshFreeSpaceOnDevice(); + } catch (InterruptedException | ExecutionException e1) { + e1.printStackTrace(); + } finally { + globalProgressBar.setValue(globalProgressBar.getValue() + 1); + globalProgressBar.setString( + globalProgressBar.getValue() + "/" + globalProgressBar.getMaximum()); + } + }); + } + + TransferProgressListener progressListener = new TransferProgressListener() { + + @Override + public void onProgress(TransferStatus status) { + installUninstallProgressBar.setMinimum(0); + installUninstallProgressBar.setMaximum(status.getTotal()); + installUninstallProgressBar.setValue(status.getTransferred()); + + } + + @Override + public void onComplete(TransferStatus status) { + installUninstallProgressBar.setValue(installUninstallProgressBar.getMaximum()); + } + }; + + synchronized (this) { + mustCancelLocal = mustCancel; + } + if (fsDriverUsed && !mustCancelLocal) { + toInstall.forEach((pack) -> { + try { + synchronized (this) { + if (mustCancel) + return; + } + JsonPack jsonPack = library.getPackForUUID(pack).get(); + String packTitle = jsonPack.getTitle(); + if (packTitle == null) + packTitle = jsonPack.getLocalizedInfos().values().iterator().next().getTitle(); + lblTransferingPack.setText(localization.getString("Transfering.transferringpack") + .replace("{}", packTitle)); + statusPanel.updateUI(); + fsDriver.uploadPack(pack, library.getFolderForUUID(pack), progressListener).get(); + + refreshFreeSpaceOnDevice(); + } catch (InterruptedException | ExecutionException e1) { + e1.printStackTrace(); + } finally { + globalProgressBar.setValue(globalProgressBar.getValue() + 1); + globalProgressBar.setString( + globalProgressBar.getValue() + "/" + globalProgressBar.getMaximum()); + } + }); + } else if (rawDriverUsed && !mustCancelLocal) { + toInstall.forEach((pack) -> { + try { + synchronized (this) { + if (mustCancel) + return; + } + JsonPack jsonPack = library.getPackForUUID(pack).get(); + String packTitle = jsonPack.getTitle(); + if (packTitle == null) + packTitle = jsonPack.getLocalizedInfos().values().iterator().next().getTitle(); + lblTransferingPack.setText(localization.getString("Transfering.transferringpack") + .replace("{}", packTitle)); + statusPanel.updateUI(); + rawDriver.uploadPack(null, 0, progressListener).get(); + + refreshFreeSpaceOnDevice(); + } catch (InterruptedException | ExecutionException e1) { + e1.printStackTrace(); + } finally { + globalProgressBar.setValue(globalProgressBar.getValue() + 1); + globalProgressBar.setString( + globalProgressBar.getValue() + "/" + globalProgressBar.getMaximum()); + } + }); + } + + // Reorder packs + synchronized (this) { + mustCancelLocal = mustCancel; + } + if (fsDriverUsed && !mustCancelLocal) { + try { + lblTransferingPack.setText(localization.getString("Transfering.reordering")); + statusPanel.updateUI(); + + fsDriver.reorderPacks(uuidsInList).get(); + } catch (InterruptedException | ExecutionException e1) { + e1.printStackTrace(); + } finally { + globalProgressBar.setValue(globalProgressBar.getValue() + 1); + globalProgressBar + .setString(globalProgressBar.getValue() + "/" + globalProgressBar.getMaximum()); + } + } else { + try { + rawDriver.reorderPacks(uuidsInList).get(); + } catch (InterruptedException | ExecutionException e1) { + e1.printStackTrace(); + } finally { + globalProgressBar.setValue(globalProgressBar.getValue() + 1); + globalProgressBar + .setString(globalProgressBar.getValue() + "/" + globalProgressBar.getMaximum()); + + } + } + + } catch (Exception e2) { + e2.printStackTrace(); + } + + synchronized (this) { + mustCancel = false; + } + btnRefresh.setEnabled(true); + btnValidate.setEnabled(true); + btnCancel.setEnabled(false); + btnDownloadPackages.setEnabled(true); + lblTransferingPack.setText(localization.getString("Transfering.done")); + + installUninstallProgressBar.setValue(0); + globalProgressBar.setValue(0); + globalProgressBar.setString(null); + statusPanel.updateUI(); + }); + } + }); + + btnRefresh = new JButton(localization.getString("Device.refresh")); + btnRefresh.setEnabled(false); + GridBagConstraints gbc_btnRefersh = new GridBagConstraints(); + gbc_btnRefersh.anchor = GridBagConstraints.NORTHWEST; + gbc_btnRefersh.insets = new Insets(0, 0, 5, 5); + gbc_btnRefersh.gridx = 2; + gbc_btnRefersh.gridy = 0; + panel_4.add(btnRefresh, gbc_btnRefersh); + btnRefresh.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + btnDownloadPackages.setEnabled(false); + btnValidate.setEnabled(false); + btnRefresh.setEnabled(false); + + devicePacksModel.clear(); + loadPacksFromDevice().thenAcceptAsync((packs) -> { + devicePacksModel.clear(); + devicePacksModel.addAll(packs); + + btnDownloadPackages.setEnabled(true); + btnValidate.setEnabled(true); + btnRefresh.setEnabled(true); + }); + + } + }); + + btnCancel = new JButton(localization.getString("Device.cancel")); + + btnCancel.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + synchronized (this) { + mustCancel = true; + } + btnCancel.setEnabled(false); + } + }); + btnCancel.setEnabled(false); + GridBagConstraints gbc_btnCancel = new GridBagConstraints(); + gbc_btnCancel.anchor = GridBagConstraints.NORTHWEST; + gbc_btnCancel.insets = new Insets(0, 0, 5, 5); + gbc_btnCancel.gridx = 3; + gbc_btnCancel.gridy = 0; + panel_4.add(btnCancel, gbc_btnCancel); + + devicePacksSummaryLabel = new JLabel("-/-"); + GridBagConstraints gbc_devicePacksSummaryLabel = new GridBagConstraints(); + gbc_devicePacksSummaryLabel.insets = new Insets(0, 0, 5, 5); + gbc_devicePacksSummaryLabel.anchor = GridBagConstraints.EAST; + gbc_devicePacksSummaryLabel.gridx = 4; + gbc_devicePacksSummaryLabel.gridy = 0; + panel_4.add(devicePacksSummaryLabel, gbc_devicePacksSummaryLabel); + + JPanel libraryListPanel = new JPanel(); + splitPane.setRightComponent(libraryListPanel); + libraryListPanel.setLayout(new BorderLayout(0, 0)); + libraryListPanel.setBorder(new TitledBorder(null, localization.getString("Library.list"), TitledBorder.LEADING, + TitledBorder.TOP, null, null)); + + JScrollPane libraryPacksScrollPane = new JScrollPane(); + libraryListPanel.add(libraryPacksScrollPane); + libraryPacksList = new JList(libraryPacksModel); + devicePacksList.setTransferHandler(new DeviceListTransferHandler(libraryPacksList, devicePacksList)); + + libraryPacksScrollPane.setViewportView(libraryPacksList); + libraryPacksList.setName("library"); + libraryPacksList.setCellRenderer(new JsonPackCell(localization)); + //libraryPacksList.setDragEnabled(true); + libraryPacksList.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent evt) { + JList list = (JList) evt.getSource(); + if (evt.getClickCount() == 2) { + int index = list.locationToIndex(evt.getPoint()); + if (index == -1) + return; + if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { + Locale currentLocale = Locale.getDefault(); + JsonPack story = libraryPacksModel.get(index); + String slug = story.getSlug(); + + try { + String url = "https://lunii.com/" + currentLocale.getCountry().toLowerCase() + "-" + + currentLocale.getLanguage() + "/luniistore-catalogue/" + slug; + Desktop.getDesktop().browse(new URI(url)); + } catch (IOException | URISyntaxException e1) { + } + + } + } + } + }); + libraryPacksList.getSelectionModel().addListSelectionListener(new ListSelectionListener() { + + @Override + public void valueChanged(ListSelectionEvent e) { + libraryPacksSummaryLabel.setText(libraryPacksList.getSelectionModel().getSelectedItemsCount() + "/" + + libraryPacksModel.getSize()); + + } + + }); + libraryPacksList.addKeyListener(new KeyAdapter() { + @Override + public void keyTyped(KeyEvent e) { + + if (e.getExtendedKeyCode() == KeyEvent.VK_ESCAPE) { + libraryPacksList.getSelectionModel().clearSelection(); + } + } + }); + + DragSource.getDefaultDragSource().createDefaultDragGestureRecognizer(libraryPacksList, DnDConstants.ACTION_MOVE, dgl); + + libraryPacksList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + + JPanel panel_6 = new JPanel(); + libraryListPanel.add(panel_6, BorderLayout.SOUTH); + GridBagLayout gbl_panel_6 = new GridBagLayout(); + gbl_panel_6.columnWeights = new double[] { 0.0, 0.0, 1.0 }; + panel_6.setLayout(gbl_panel_6); + panel_6.setMinimumSize(new Dimension(100, 100)); + + btnRefreshLibrary = new JButton(localization.getString("Library.refresh")); + btnRefreshLibrary.setEnabled(false); + GridBagConstraints gbc_btnRefreshLibrary = new GridBagConstraints(); + gbc_btnRefreshLibrary.anchor = GridBagConstraints.NORTHWEST; + gbc_btnRefreshLibrary.insets = new Insets(0, 0, 0, 5); + gbc_btnRefreshLibrary.gridx = 0; + gbc_btnRefreshLibrary.gridy = 0; + panel_6.add(btnRefreshLibrary, gbc_btnRefreshLibrary); + btnRefreshLibrary.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + btnRefreshLibrary.setEnabled(false); + libraryPacksModel.clear(); + library.refreshDatabase().thenRunAsync(() -> { + library.getPacks().thenAcceptAsync((List packs) -> { + Set languages = packs.stream().map( (JsonPack p) -> { + return p.getLocalizedInfos() == null || p.getLocalizedInfos().isEmpty() ? null : p.getLocalizedInfos().keySet().iterator().next(); + }).collect(Collectors.toSet()); + if ( !languages.contains(null) ) { + languages.add(null); + } + availableLanguagesModel.removeAllElements(); + availableLanguagesModel.addAll(languages); + libraryPacksModel.addAll(packs); + btnRefreshLibrary.setEnabled(true); + + }); + }); + + } + }); + + displayOnlyNotOnDeviceCheckBox = new JCheckBox(localization.getString("Library.filteronlynotpresentonbox")); + displayOnlyNotOnDeviceCheckBox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + boolean filter = displayOnlyNotOnDeviceCheckBox.isSelected(); + if ( filter ) { + library.getPacks().thenAcceptAsync( (List list) -> { + libraryPacksModel.clear(); + List filtered = list.stream().filter( (JsonPack p) -> { + return !devicePacksModel.contains(p); + }).toList(); + libraryPacksModel.addAll(filtered); + }); + } else { + library.getPacks().thenAcceptAsync( (List list) -> { + libraryPacksModel.clear(); + libraryPacksModel.addAll(list); + }); + } + } + }); + GridBagConstraints gbc_displayOnlyNotOnDeviceCheckBox = new GridBagConstraints(); + gbc_displayOnlyNotOnDeviceCheckBox.anchor = GridBagConstraints.NORTHWEST; + gbc_displayOnlyNotOnDeviceCheckBox.insets = new Insets(0, 0, 0, 5); + gbc_displayOnlyNotOnDeviceCheckBox.gridx = 1; + gbc_displayOnlyNotOnDeviceCheckBox.gridy = 0; + panel_6.add(displayOnlyNotOnDeviceCheckBox, gbc_displayOnlyNotOnDeviceCheckBox); + + libraryPacksSummaryLabel = new JLabel("-/-"); + GridBagConstraints gbc_libraryPacksSummaryLabel = new GridBagConstraints(); + gbc_libraryPacksSummaryLabel.anchor = GridBagConstraints.EAST; + gbc_libraryPacksSummaryLabel.gridx = 2; + gbc_libraryPacksSummaryLabel.gridy = 0; + panel_6.add(libraryPacksSummaryLabel, gbc_libraryPacksSummaryLabel); + + panel_1 = new JPanel(); + libraryListPanel.add(panel_1, BorderLayout.NORTH); + GridBagLayout gbl_panel_1 = new GridBagLayout(); + //gbl_panel_1.columnWidths = new int[] {51, 52, 60, 60, 60, 60, 30}; + //gbl_panel_1.rowHeights = new int[]{27, 0}; + gbl_panel_1.columnWeights = new double[]{0.0, 1.0, 0.0, 0.0, 0.0, 0.0}; + gbl_panel_1.rowWeights = new double[]{0.0}; + panel_1.setLayout(gbl_panel_1); + + + availableLanguagesModel = new DefaultComboBoxModel(); + languageFilterComboBox = new JComboBox(availableLanguagesModel); + languageFilterComboBox.setRenderer(new LanguagesCellRenderer()); + languageFilterComboBox.setMinimumSize(new Dimension(70, 20)); + languageFilterComboBox.setPreferredSize(new Dimension(70, 20)); + GridBagConstraints gbc_comboBox = new GridBagConstraints(); + gbc_comboBox.anchor = GridBagConstraints.WEST; + gbc_comboBox.insets = new Insets(0, 0, 0, 5); + gbc_comboBox.gridx = 0; + gbc_comboBox.gridy = 0; + panel_1.add(languageFilterComboBox, gbc_comboBox); + languageFilterComboBox.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + filterLibrary(); + + } + }); + + librarySearchTextField = new PlaceholderTextField(); + GridBagConstraints gbc_librarySearchTextField = new GridBagConstraints(); + gbc_librarySearchTextField.weightx = 10.0; + gbc_librarySearchTextField.fill = GridBagConstraints.HORIZONTAL; + gbc_librarySearchTextField.anchor = GridBagConstraints.NORTH; + gbc_librarySearchTextField.insets = new Insets(0, 0, 0, 5); + gbc_librarySearchTextField.gridx = 1; + gbc_librarySearchTextField.gridy = 0; + panel_1.add(librarySearchTextField, gbc_librarySearchTextField); + librarySearchTextField.setPlaceHolder(localization.getString("Library.search")); + librarySearchTextField.addKeyListener(new KeyAdapter() { + @Override + public void keyTyped(KeyEvent e) { + if ( e.getKeyChar() == KeyEvent.VK_ENTER ) { + String searchText = librarySearchTextField.getText().toLowerCase(); + boolean found = false; + int i; + int startIndex = libraryPacksList.getSelectedIndex() + 1; + for(i = startIndex; i < libraryPacksModel.getSize() && !found; i++) { + JsonPack element = libraryPacksModel.get(i); + found = element.getTitle() != null && element.getTitle().toLowerCase().contains(searchText) || element.getLocalizedInfos() != null && element.getLocalizedInfos().values().stream().anyMatch( (localizedInfos) -> (localizedInfos.getTitle() != null && localizedInfos.getTitle().toLowerCase().contains(searchText)) || (localizedInfos.getDescription() != null && localizedInfos.getDescription().toLowerCase().contains(searchText))); + } + if ( found ) { + libraryPacksList.setSelectedIndex(i - 1); + libraryPacksList.ensureIndexIsVisible(i - 1); + } else if ( startIndex > 0 ) { + libraryPacksList.clearSelection(); + this.keyTyped((e)); + } + } else if ( e.getKeyChar() == KeyEvent.VK_ESCAPE ) { + librarySearchTextField.setText(""); + } + } + }); + + lblNewLabel = new JLabel(localization.getString("Library.searchFrom")); + lblNewLabel.setHorizontalAlignment(SwingConstants.TRAILING); + GridBagConstraints gbc_lblNewLabel = new GridBagConstraints(); + gbc_lblNewLabel.anchor = GridBagConstraints.EAST; + //gbc_lblNewLabel.anchor = GridBagConstraints.WEST; + gbc_lblNewLabel.insets = new Insets(0, 0, 0, 5); + gbc_lblNewLabel.gridx = 2; + gbc_lblNewLabel.gridy = 0; + panel_1.add(lblNewLabel, gbc_lblNewLabel); + + spinner = new JSpinner(new SpinnerNumberModel(0, 0, 13, 1)); + GridBagConstraints gbc_spinner = new GridBagConstraints(); + gbc_spinner.anchor = GridBagConstraints.NORTHEAST; + gbc_spinner.insets = new Insets(0, 0, 0, 5); + gbc_spinner.gridx = 3; + gbc_spinner.gridy = 0; + panel_1.add(spinner, gbc_spinner); + spinner.addChangeListener(new ChangeListener() { + + @Override + public void stateChanged(ChangeEvent e) { + filterLibrary(); + + } + }); + + lblNewLabel_1 = new JLabel(localization.getString("Library.searchTo")); + GridBagConstraints gbc_lblNewLabel_1 = new GridBagConstraints(); + gbc_lblNewLabel_1.anchor = GridBagConstraints.EAST; + gbc_lblNewLabel_1.insets = new Insets(0, 0, 0, 5); + gbc_lblNewLabel_1.gridx = 4; + gbc_lblNewLabel_1.gridy = 0; + panel_1.add(lblNewLabel_1, gbc_lblNewLabel_1); + + spinner_1 = new JSpinner(new SpinnerNumberModel(0, 0, 13, 1)); + GridBagConstraints gbc_spinner_1 = new GridBagConstraints(); + gbc_spinner_1.insets = new Insets(0, 0, 0, 5); + gbc_spinner_1.anchor = GridBagConstraints.NORTHEAST; + gbc_spinner_1.gridx = 5; + gbc_spinner_1.gridy = 0; + panel_1.add(spinner_1, gbc_spinner_1); + spinner_1.addChangeListener(new ChangeListener() { + + @Override + public void stateChanged(ChangeEvent e) { + filterLibrary(); + + } + }); + + statusPanel = new JPanel(); + panel.add(statusPanel, BorderLayout.SOUTH); + statusLayout = new GridBagLayout(); + statusLayout.columnWeights = new double[] { 0.0, 1.0, 0.0, 1.0 }; + statusPanel.setLayout(statusLayout); + + lblTransferingPack = new Label(localization.getString("Transfer.notransfer")); + GridBagConstraints gbc_lblTransferingPack = new GridBagConstraints(); + gbc_lblTransferingPack.fill = GridBagConstraints.HORIZONTAL; + gbc_lblTransferingPack.insets = new Insets(0, 5, 0, 5); + gbc_lblTransferingPack.gridy = 0; + gbc_lblTransferingPack.gridx = 0; + statusPanel.add(lblTransferingPack, gbc_lblTransferingPack); + + installUninstallProgressBar = new JProgressBar(); + GridBagConstraints gbc_installUninstallProgressBar = new GridBagConstraints(); + gbc_installUninstallProgressBar.fill = GridBagConstraints.HORIZONTAL; + gbc_installUninstallProgressBar.insets = new Insets(0, 0, 0, 5); + gbc_installUninstallProgressBar.gridx = 1; + gbc_installUninstallProgressBar.gridy = 0; + statusPanel.add(installUninstallProgressBar, gbc_installUninstallProgressBar); + + Label lblProgress = new Label(localization.getString("Transfer.globalProgress")); + GridBagConstraints gbc_lblProgress = new GridBagConstraints(); + gbc_lblProgress.fill = GridBagConstraints.HORIZONTAL; + gbc_lblProgress.insets = new Insets(0, 0, 0, 5); + gbc_lblProgress.gridx = 2; + gbc_lblProgress.gridy = 0; + statusPanel.add(lblProgress, gbc_lblProgress); + + globalProgressBar = new JProgressBar(); + globalProgressBar.setStringPainted(false); + GridBagConstraints gbc_globalProgressBar = new GridBagConstraints(); + gbc_globalProgressBar.fill = GridBagConstraints.HORIZONTAL; + gbc_globalProgressBar.insets = new Insets(0, 0, 0, 5); + gbc_globalProgressBar.gridx = 3; + gbc_globalProgressBar.gridy = 0; + statusPanel.add(globalProgressBar, gbc_globalProgressBar); + GridBagConstraints gbc_splitPane = new GridBagConstraints(); + gbc_splitPane.fill = GridBagConstraints.BOTH; + gbc_splitPane.gridx = 0; + gbc_splitPane.gridy = 0; + gbc_splitPane.insets = new Insets(0, 5, 0, 5); + + JMenuBar menuBar = new JMenuBar(); + frmLuniiTransfer.setJMenuBar(menuBar); + + JMenu mnNewMenu = new JMenu(localization.getString("File.title"));// "File"); + mnNewMenu.setMnemonic('F'); + menuBar.add(mnNewMenu); + + JMenuItem mntmNewMenuItem = new JMenuItem(localization.getString("File.quit"));// "Quit"); + mntmNewMenuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + frmLuniiTransfer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frmLuniiTransfer.dispatchEvent(new WindowEvent(frmLuniiTransfer, WindowEvent.WINDOW_CLOSING)); + + } + }); + + + JMenuItem changeLibraryPathMenuItem = new JMenuItem(localization.getString("Library.changePath")); + + changeLibraryPathMenuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + JFileChooser chooser = new JFileChooser(); + chooser.setCurrentDirectory(new java.io.File(library.getLibraryPath())); + chooser.setDialogTitle(localization.getString("Library.ChooseLibraryFolder")); + + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + chooser.setAcceptAllFileFilterUsed(false); + if (chooser.showOpenDialog(frmLuniiTransfer) == JFileChooser.APPROVE_OPTION) { + String path = chooser.getSelectedFile().getAbsolutePath(); + Properties prop = new java.util.Properties(); + prop.setProperty("libraryPath", path); + File file = new File(AppDirsFactory.getInstance().getUserConfigDir("Lunii-Transfert", "0.4.1", "horfee")); + if ( !file.exists()) { + file.mkdirs(); + } + file = new File(file.getAbsolutePath() + "/prefs.ini"); + try(FileOutputStream fos = new FileOutputStream( file )) { + prop.store(fos, "auto-generated"); + } catch (IOException e1) { + e1.printStackTrace(); + } + + library = Library.getInstance(path); + btnRefreshLibrary.doClick(); + libraryPathLabel.setText(localization.getString("Library.infoPath").replace("{}", library.getLibraryPath())); + } + } + }); + mnNewMenu.add(changeLibraryPathMenuItem); + + JMenuItem importMenuItem = new JMenuItem(localization.getString("File.import")); + importMenuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + JFileChooser chooser = new JFileChooser(); + chooser.setDialogTitle(localization.getString("Import.ChooseImportEntry")); + chooser.setMultiSelectionEnabled(true); + if (chooser.showOpenDialog(frmLuniiTransfer) == JFileChooser.APPROVE_OPTION) { + for (File f : chooser.getSelectedFiles()) { + if (f.isDirectory()) { + for (File toImport : f.listFiles()) { + library.tryToImport(toImport.toPath()); + } + } else { + library.tryToImport(f.toPath()); + } + } + btnRefreshLibrary.doClick(); + } + } + }); + mnNewMenu.add(importMenuItem); + + JMenuItem exportMenuItem = new JMenuItem(localization.getString("File.export")); + exportMenuItem.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + JFileChooser chooser = new JFileChooser(); + chooser.setDialogTitle(localization.getString("Export.SaveFile")); + chooser.setMultiSelectionEnabled(true); + chooser.setAcceptAllFileFilterUsed(false); + + if (chooser.showSaveDialog(frmLuniiTransfer) == JFileChooser.APPROVE_OPTION) { + int response = JOptionPane.showConfirmDialog(frmLuniiTransfer, "Export entire library ?", "Export library", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); + if ( response == JOptionPane.CANCEL_OPTION ) { + return; + } + + List data = new ArrayList<>(); + List downloadedLibrary = Collections.list(libraryPacksModel.elements()).stream().map( (JsonPack pack) -> pack.getUuid()).toList(); + List downloadedOnDevice = Collections.list(devicePacksModel.elements()).stream().map( (JsonPack pack) -> pack.getUuid()).toList(); + + if ( response == JOptionPane.YES_OPTION ) { + try { + data = library.getAllLuniiPacks().get(); + } catch (InterruptedException | ExecutionException e1) { + e1.printStackTrace(); + return; + } + } else if ( response == JOptionPane.NO_OPTION ) { + data = Collections.list(libraryPacksModel.elements()); + + } + + XSSFWorkbook workbook = new XSSFWorkbook(); + XSSFSheet sheet = workbook.createSheet("Library"); +// sheet.setColumnWidth(0, 6000); +// sheet.setColumnWidth(1, 4000); + + XSSFRow header = sheet.createRow(0); + + CellStyle headerStyle = workbook.createCellStyle(); + headerStyle.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex()); + headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + XSSFFont font = ((XSSFWorkbook) workbook).createFont(); + font.setFontName("Arial"); + font.setFontHeightInPoints((short) 16); + font.setBold(true); + headerStyle.setFont(font); + + XSSFCell headerCell = header.createCell(0); + headerCell.setCellValue("Ref"); + headerCell.setCellStyle(headerStyle); + + headerCell = header.createCell(1); + headerCell.setCellValue("Title"); + headerCell.setCellStyle(headerStyle); + + headerCell = header.createCell(2); + headerCell.setCellValue("Age - From"); + headerCell.setCellStyle(headerStyle); + + headerCell = header.createCell(3); + headerCell.setCellValue("Age - To"); + headerCell.setCellStyle(headerStyle); + + headerCell = header.createCell(4); + headerCell.setCellValue("Link"); + headerCell.setCellStyle(headerStyle); + + headerCell = header.createCell(5); + headerCell.setCellValue("Downloaded"); + headerCell.setCellStyle(headerStyle); + + headerCell = header.createCell(6); + headerCell.setCellValue("Present on the device"); + headerCell.setCellStyle(headerStyle); + + headerCell = header.createCell(7); + headerCell.setCellValue("Locale"); + headerCell.setCellStyle(headerStyle); + + sheet.setAutoFilter(new CellRangeAddress(0,0,0,7)); + + Locale locale = Locale.getDefault(); + data.forEach( (JsonPack pack) -> { + XSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1); + XSSFCell dataCell = dataRow.createCell(0); + dataCell.setCellValue(pack.getUuid()); + String usedLocale = locale.getDisplayLanguage(); + + dataCell = dataRow.createCell(1); + String title = pack.getTitle(); + if ( title == null || title.length() == 0 ) { + title = pack.getResolvedTitle(locale); + if ( title == null || title.length() == 0 ) { + usedLocale = pack.getLocalizedInfos().keySet().iterator().next().replace("_", "-"); + title = pack.getResolvedTitle(Locale.forLanguageTag(usedLocale)); + usedLocale = Locale.forLanguageTag(usedLocale).getDisplayLanguage(); + + } + } + dataCell.setCellValue(title); + + dataCell = dataRow.createCell(2); + if ( pack.getAgeMin() != -1 ) { + dataCell.setCellValue(pack.getAgeMin()); + } + + dataCell = dataRow.createCell(3); + if ( pack.getAgeMax() != -1 ) { + dataCell.setCellValue(pack.getAgeMax()); + } + + dataCell = dataRow.createCell(4); + String url = "https://lunii.com/" + locale.getCountry().toLowerCase() + "-" + locale.getLanguage() + "/luniistore-catalogue/" + pack.getSlug(); + XSSFHyperlink link = (XSSFHyperlink)workbook.getCreationHelper().createHyperlink(HyperlinkType.URL); + link.setAddress(url); + dataCell.setCellValue(url); + dataCell.setHyperlink((XSSFHyperlink) link); + + + dataCell = dataRow.createCell(5); + dataCell.setCellValue(downloadedLibrary.contains(pack.getUuid())); + + dataCell = dataRow.createCell(6); + dataCell.setCellValue(downloadedOnDevice.contains(pack.getUuid())); + + dataCell = dataRow.createCell(7); + dataCell.setCellValue(usedLocale); + + }); + + for(int i = 0; i < sheet.getRow(0).getLastCellNum(); i++) { + sheet.autoSizeColumn(i); + } + + FileOutputStream fos; + try { + fos = new FileOutputStream(chooser.getSelectedFile()); + workbook.write(fos); + fos.close(); + } catch (FileNotFoundException e1) { + e1.printStackTrace(); + } catch (IOException e1) { + e1.printStackTrace(); + } finally { + try { + workbook.close(); + } catch (IOException e1) { + e1.printStackTrace(); + } + } + + + } + + } + + }); + mnNewMenu.add(exportMenuItem); + mntmNewMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, InputEvent.META_DOWN_MASK)); + mnNewMenu.add(mntmNewMenuItem); + + } + + + class MyListDropHandler extends TransferHandler { + private static final long serialVersionUID = -6453689410470088604L; + + JList list; + + public MyListDropHandler(JList list) { + this.list = list; + } + + public boolean canImport(TransferHandler.TransferSupport support) { + if (!support.isDataFlavorSupported(DataFlavor.stringFlavor)) { + return false; + } + JList.DropLocation dl = (JList.DropLocation) support.getDropLocation(); + return dl.getIndex() != -1; + } + + public boolean importData(TransferHandler.TransferSupport support) { + if (!canImport(support)) { + return false; + } + + Transferable transferable = support.getTransferable(); + Object indexString; + try { + indexString = (Object) transferable.getTransferData(DataFlavor.stringFlavor); + } catch (Exception e) { + return false; + } + + List indices = Arrays.stream(indexString.toString().split(",")).mapToInt(Integer::parseInt).boxed().toList(); + JList.DropLocation dl = (JList.DropLocation) support.getDropLocation(); + final Integer dropTargetIndex = dl.getIndex(); + + int nbBeforeDropIndex = (int) indices.stream().filter((v) -> v < dropTargetIndex.intValue()).count(); + + List objects = new ArrayList(); + for (int index = indices.size() - 1; index >= 0; index--) { + objects.add(((DefaultListModel) list.getModel()).remove(indices.get(index))); + } + + int insertIndex = dropTargetIndex - nbBeforeDropIndex; + + for (int i = objects.size() - 1; i >= 0; i--) { + ((DefaultListModel) list.getModel()).add(insertIndex++, objects.get(i)); + + } + + return true; + } + } +} diff --git a/studio-desktop/src/main/java/studio/JsonPackCell.java b/studio-desktop/src/main/java/studio/JsonPackCell.java new file mode 100644 index 000000000..42a53a4dc --- /dev/null +++ b/studio-desktop/src/main/java/studio/JsonPackCell.java @@ -0,0 +1,236 @@ +package studio; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; +import java.util.ResourceBundle; +import java.util.concurrent.CompletableFuture; + +import javax.swing.DefaultListModel; +import javax.swing.ImageIcon; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.ListCellRenderer; +import javax.swing.UIManager; +import javax.swing.border.Border; +import javax.swing.plaf.UIResource; + +import org.apache.commons.io.FileUtils; + +import studio.database.JsonPack; +import studio.database.LocalizedInfos; + + +class JsonPackCell implements ListCellRenderer, UIResource { + + private static final long serialVersionUID = -9095012373460466070L; + + private transient String locale = Locale.getDefault().toLanguageTag().replace("-", "_"); + + private static final Border noBorder = UIManager.getBorder("List.cellNoFocusBorder"); + private static final Border selectedAndFocusedBorder = UIManager.getBorder("List.focusSelectedCellHighlightBorder"); + private static final Border focusBorder = UIManager.getBorder("List.focusCellHighlightBorder"); + + private ResourceBundle localization; + + JsonPackCell(ResourceBundle bundle) { + super(); + initialize(); + localization = bundle; + + } + + + private JPanel initialize() { + JPanel res = new JPanel(); + GridBagLayout gridBagLayout = new GridBagLayout(); + gridBagLayout.columnWeights = new double[]{0.0, 1.0, 1.0}; + res.setLayout(gridBagLayout); + + JLabel icon = new JLabel(); + icon.setName("icon"); + icon.setPreferredSize(new Dimension(64, 64)); + GridBagConstraints gbc_icon = new GridBagConstraints(); + gbc_icon.gridheight = 3; + gbc_icon.insets = new Insets(5, 5, 0, 5); + gbc_icon.gridx = 0; + gbc_icon.gridy = 0; + icon.setMinimumSize(new Dimension(64,64)); + res.add(icon, gbc_icon); + + JLabel title = new JLabel(); + title.setText("title"); + title.setName("title"); + GridBagConstraints gbc_title = new GridBagConstraints(); + gbc_title.anchor = GridBagConstraints.WEST; + gbc_title.insets = new Insets(5, 5, 5, 5); + gbc_title.gridx = 1; + gbc_title.gridy = 0; + gbc_title.weightx = 0.5; + res.add(title, gbc_title); + + JLabel subTitle = new JLabel(); + subTitle.setText("subTitle"); + subTitle.setName("subtitle"); + GridBagConstraints gbc_subTitle = new GridBagConstraints(); + gbc_subTitle.anchor = GridBagConstraints.WEST; + gbc_subTitle.insets = new Insets(0, 5, 5, 5); + gbc_subTitle.gridx = 1; + gbc_subTitle.gridy = 1; + res.add(subTitle, gbc_subTitle); + + + JLabel ageLabel = new JLabel(); + ageLabel.setText("age"); + ageLabel.setName("age"); + GridBagConstraints gbc_ageLabel = new GridBagConstraints(); + gbc_ageLabel.anchor = GridBagConstraints.WEST; + gbc_ageLabel.insets = new Insets(0, 5, 0, 5); + gbc_ageLabel.gridx = 1; + gbc_ageLabel.gridy = 2; + res.add(ageLabel, gbc_ageLabel); + + res.setPreferredSize(new Dimension(412, 64)); + + JLabel sizeLabel = new JLabel(); + sizeLabel.setText("size"); + sizeLabel.setName("size"); + GridBagConstraints gbc_sizeLabel = new GridBagConstraints(); + gbc_sizeLabel.anchor = GridBagConstraints.EAST; + gbc_sizeLabel.gridx = 2; + gbc_sizeLabel.gridy = 2; + gbc_sizeLabel.insets = new Insets(0, 0, 0, 5); + res.add(sizeLabel, gbc_sizeLabel); + + return res; + } + + @Override + public Component getListCellRendererComponent(JList list, JsonPack value, int index, + boolean isSelected, boolean cellHasFocus) { + + JPanel res = this.initialize(); + res.setComponentOrientation(list.getComponentOrientation()); + + Color bg = null; + Color fg = null; + + JList.DropLocation dropLocation = list.getDropLocation(); + if (dropLocation != null + && !dropLocation.isInsert() + && dropLocation.getIndex() == index) { + + bg = (Color)UIManager.get("List.dropCellBackground"); + fg = (Color)UIManager.get("List.dropCellForeground"); + + isSelected = true; + } + + if (isSelected) { + res.setBackground(bg == null ? list.getSelectionBackground() : bg); + res.setForeground(fg == null ? list.getSelectionForeground() : fg); + } + else { + if ( index % 2 == 0 ) { + res.setBackground(list.getBackground()); + } else { + res.setBackground(new Color(240, 240, 240)); + } + + res.setForeground(list.getForeground()); + } + + Border border = null; + if (cellHasFocus) { + if (isSelected) { + border = selectedAndFocusedBorder; + } + if (border == null) { + border = focusBorder; + } + } else { + border = noBorder; + } + res.setBorder(border); + + + + final LocalizedInfos defaultLocalizedInfos = value.getLocalizedInfos().containsKey(locale) ? value.getLocalizedInfos().get(locale) : (!value.getLocalizedInfos().isEmpty() ? value.getLocalizedInfos().values().iterator().next() : null); + + List components = List.of(res.getComponents()); + +// if ( defaultLocalizedInfos != null ) { + + components.stream().filter( (c) -> "icon".equals(c.getName())).findFirst().ifPresent( ( c) -> { + if ( defaultLocalizedInfos != null && defaultLocalizedInfos.hasFetchImage() ) { + ((JLabel)c).setIcon(new ImageIcon(defaultLocalizedInfos.getThumbnail())); + } else { + + CompletableFuture.runAsync(() -> { + if ( defaultLocalizedInfos == null ) return; + defaultLocalizedInfos.getThumbnail(); + DefaultListModel model = (DefaultListModel) list.getModel(); + model.setElementAt(value, index); + }); + } + + }); + +// } + + components.stream().filter( (c) -> "title".equals(c.getName())).findFirst().ifPresent( ( c) -> { + String strTitle = value.getTitle(); + if ( strTitle == null && defaultLocalizedInfos != null ) strTitle = defaultLocalizedInfos.getTitle(); + ((JLabel)c).setText(strTitle); + }); + + components.stream().filter( (c) -> "subtitle".equals(c.getName())).findFirst().ifPresent( ( c) -> { + String strSubTitle = value.getSubtitle(); + if ( strSubTitle == null && defaultLocalizedInfos != null ) strSubTitle = defaultLocalizedInfos.getSubtitle(); + ((JLabel)c).setText(strSubTitle); + }); + + components.stream().filter( (c) -> "age".equals(c.getName())).findFirst().ifPresent( ( c) -> { + if ( !(value.getAgeMin() == 0 && value.getAgeMax() == 0) ) { + String strAge = ""; + if ( value.getAgeMin() == -1 && value.getAgeMax() != -1 ) { + strAge = substituteParameters(localization.getString("JsonPackCell.age2"), value.getAgeMax()); + } else if ( value.getAgeMin() != -1 && value.getAgeMax() == -1 ) { + strAge = substituteParameters(localization.getString("JsonPackCell.age1"), value.getAgeMin()); + } else if ( value.getAgeMin() != -1 && value.getAgeMax() != -1 ) { + strAge = substituteParameters(localization.getString("JsonPackCell.age3"), value.getAgeMin(), value.getAgeMax()); + + } + ((JLabel)c).setText(strAge); + } else { + ((JLabel)c).setText(""); + } + }); + components.stream().filter( (c) -> "size".equals(c.getName())).findFirst().ifPresent( ( c) -> { + if ( value.getSize() != 0 ) { + String strSize = FileUtils.byteCountToDisplaySize(FileUtils.ONE_KB * value.getSize()); + ((JLabel)c).setText(strSize); + } else { + ((JLabel)c).setText(""); + } + }); + + return res; + } + + private static String substituteParameters(String message, Object ... params) { + while(message.indexOf("{}") > -1 && params.length > 0 ) { + message = message.replaceFirst("\\{\\}", (params[0] != null ? params[0].toString() : "")); + params = Arrays.copyOfRange(params, 1, params.length); + } + return message; + } + + } \ No newline at end of file diff --git a/studio-desktop/src/main/java/studio/LanguagesCellRenderer.java b/studio-desktop/src/main/java/studio/LanguagesCellRenderer.java new file mode 100644 index 000000000..e2d8a2f55 --- /dev/null +++ b/studio-desktop/src/main/java/studio/LanguagesCellRenderer.java @@ -0,0 +1,109 @@ +package studio; + +import static org.apache.batik.transcoder.SVGAbstractTranscoder.KEY_WIDTH; +import static org.apache.batik.transcoder.XMLAbstractTranscoder.KEY_DOCUMENT_ELEMENT; +import static org.apache.batik.transcoder.XMLAbstractTranscoder.KEY_DOCUMENT_ELEMENT_NAMESPACE_URI; +import static org.apache.batik.transcoder.XMLAbstractTranscoder.KEY_DOM_IMPLEMENTATION; +import static org.apache.batik.util.SVGConstants.SVG_NAMESPACE_URI; +import static org.apache.batik.util.SVGConstants.SVG_SVG_TAG; + +import java.awt.Component; +import java.awt.Dimension; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +import javax.swing.DefaultListCellRenderer; +import javax.swing.ImageIcon; +import javax.swing.JList; + +import org.apache.batik.anim.dom.SVGDOMImplementation; +import org.apache.batik.transcoder.TranscoderException; +import org.apache.batik.transcoder.TranscoderInput; +import org.apache.batik.transcoder.TranscoderOutput; +import org.apache.batik.transcoder.TranscodingHints; +import org.apache.batik.transcoder.image.ImageTranscoder; + +public class LanguagesCellRenderer extends DefaultListCellRenderer { + + private static Map mappings = new HashMap(); + + /** + * Reads in an SVG image file and return it as a BufferedImage with the given width and a height + * where the original aspect ratio is preserved. + * + * @param url URL referencing the SVG image file, which is typically an XML file + * @param width width in pixels the returned BufferedImage should be + * + * @return a valid image representing the SVG file + * @throws IOException if the file cannot be parsed as valid SVG + */ + public static BufferedImage loadSvg(URL url, float width) throws IOException { + SvgTranscoder transcoder = new SvgTranscoder(); + transcoder.setTranscodingHints(getHints(width)); + try { + TranscoderInput input = new TranscoderInput(url.openStream()); + transcoder.transcode(input, null); + } catch (TranscoderException e) { + throw new IOException("Error parsing SVG file " + url, e); + } + BufferedImage image = transcoder.getImage(); + return image; + } + + private static TranscodingHints getHints(float width) { + TranscodingHints hints = new TranscodingHints(); + hints.put(KEY_DOM_IMPLEMENTATION, SVGDOMImplementation.getDOMImplementation()); + hints.put(KEY_DOCUMENT_ELEMENT_NAMESPACE_URI, SVG_NAMESPACE_URI); + hints.put(KEY_DOCUMENT_ELEMENT, SVG_SVG_TAG); + hints.put(KEY_WIDTH, width); + return hints; + } + + private static class SvgTranscoder extends ImageTranscoder { + + private BufferedImage image = null; + + @Override + public BufferedImage createImage(int width, int height) { + image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + return image; + } + + @Override + public void writeImage(BufferedImage img, TranscoderOutput out) {} + + BufferedImage getImage() { + return image; + } + } + + + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, + boolean cellHasFocus) { + + if ( value == null ) { + return super.getListCellRendererComponent(list, "-", index, isSelected, cellHasFocus); + } + ImageIcon icon = mappings.get(value.toString()); + if ( icon == null ) { + URL url = getClass().getResource("/studio/flags/" + value.toString().split("_")[1].toLowerCase() + ".svg"); + try { + icon = new ImageIcon(loadSvg(url, 24)); + } catch (IOException e) { + e.printStackTrace(); + } + mappings.put(value.toString(), icon); + } + + super.getListCellRendererComponent(list, icon, index, isSelected, cellHasFocus); + this.setPreferredSize(new Dimension(32, 32)); + return this; + + //return res; + } + +} diff --git a/studio-desktop/src/main/java/studio/PlaceholderTextField.java b/studio-desktop/src/main/java/studio/PlaceholderTextField.java new file mode 100644 index 000000000..4c38275ef --- /dev/null +++ b/studio-desktop/src/main/java/studio/PlaceholderTextField.java @@ -0,0 +1,41 @@ +package studio; + +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.RenderingHints; + +import javax.swing.JTextField; + +public class PlaceholderTextField extends JTextField { + + private static final long serialVersionUID = 7150729146333944077L; + + + private String placeHolder; + + + public String getPlaceHolder() { + return placeHolder; + } + + + public void setPlaceHolder(String placeHolder) { + this.placeHolder = placeHolder; + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + + if (placeHolder == null || placeHolder.length() == 0 || getText().length() > 0) { + return; + } + + final Graphics2D g2 = (Graphics2D) g; + g2.setRenderingHint( + RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + g2.setColor(getDisabledTextColor()); + g2.drawString(placeHolder, getInsets().left, g.getFontMetrics().getMaxAscent() + getInsets().top); + } +} diff --git a/studio-desktop/src/main/java/studio/database/JsonPack.java b/studio-desktop/src/main/java/studio/database/JsonPack.java new file mode 100644 index 000000000..3e92e30f1 --- /dev/null +++ b/studio-desktop/src/main/java/studio/database/JsonPack.java @@ -0,0 +1,150 @@ +package studio.database; + +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import com.google.gson.annotations.SerializedName; + +public class JsonPack { + + @Override + public boolean equals(Object obj) { + return obj instanceof JsonPack && uuid.equals(((JsonPack)obj).uuid); + } + + @SerializedName("uuid") + private String uuid; + + @SerializedName("age_max") + private int ageMax; + + @SerializedName("age_min") + private int ageMin; + + @SerializedName("creation_date") + private Date creationDate; + + @SerializedName("slug") + private String slug; + + @SerializedName("modification_date") + private Date modificationDate; + + @SerializedName("duration") + private int duration; + + @SerializedName("is_factory") + private boolean isFactory; + + @SerializedName("title") + private String title; + + @SerializedName("subtitle") + private String subtitle; + + @SerializedName("night_mode_playable") + private boolean nightMode; + + @SerializedName("keywords") + private String keywords; + + @SerializedName("authors") + private Map authors; + + @SerializedName("previews") + private List previews; + + @SerializedName("tellers") + private Map tellers; + + @SerializedName("localized_infos") + private Map localizedInfos = new HashMap<>(); + + @SerializedName("size") + private long size; + + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } + + public String getSlug() { + return slug; + } + + public String getUuid() { + return uuid; + } + + public int getAgeMax() { + return ageMax; + } + + public int getAgeMin() { + return ageMin; + } + + public Date getCreationDate() { + return creationDate; + } + + public Date getModificationDate() { + return modificationDate; + } + + public int getDuration() { + return duration; + } + + public boolean isFactory() { + return isFactory; + } + + public String getTitle() { + return title; + } + + public String getSubtitle() { + return subtitle; + } + + public boolean isNightMode() { + return nightMode; + } + + public String getKeywords() { + return keywords; + } + + public Collection getAuthors() { + return authors.values(); + } + + public List getPreviews() { + return previews; + } + + public Collection getTellers() { + return tellers.values(); + } + + public Map getLocalizedInfos() { + return localizedInfos; + } + + + public String getResolvedTitle(Locale l) { + String locale = l.toLanguageTag().replace("-", "_"); + return getTitle() != null ? getTitle() : + getLocalizedInfos().get(locale) != null ? localizedInfos.get(locale).getTitle() : + localizedInfos.values().isEmpty() ? localizedInfos.values().iterator().next().getTitle() : ""; + } +} \ No newline at end of file diff --git a/studio-desktop/src/main/java/studio/database/Library.java b/studio-desktop/src/main/java/studio/database/Library.java new file mode 100644 index 000000000..0d8dd610e --- /dev/null +++ b/studio-desktop/src/main/java/studio/database/Library.java @@ -0,0 +1,443 @@ +package studio.database; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.lang.reflect.Type; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.annotations.SerializedName; + +import studio.core.v1.model.StoryPack; +import studio.core.v1.model.metadata.StoryPackMetadata; +import studio.core.v1.reader.archive.ArchiveStoryPackReader; +import studio.core.v1.reader.binary.BinaryStoryPackReader; +import studio.core.v1.reader.fs.FsStoryPackReader; +import studio.core.v1.utils.PackAssetsCompression; +import studio.core.v1.writer.fs.FsStoryPackWriter; + +public class Library { + + public static final String TOKEN_URL = "https://server-auth-prod.lunii.com/guest/create"; + public static final String DATABASE_URL = "https://server-data-prod.lunii.com/v2/packs"; + public static final String RESOURCE_URL = "https://storage.googleapis.com/lunii-data-prod"; + + private JsonResponse packsDatabase; + + private JsonResponse localDatabase; + + private static volatile Library instance; + + private static Gson gson; + + private String libraryPath; + + static { + GsonBuilder builder = new GsonBuilder(); + builder.registerTypeAdapter(Date.class, new JsonDeserializer() { + + @Override + public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + return new Date(json.getAsLong()); + } + + }); + builder.setPrettyPrinting(); + + + gson = builder.create(); + + } + public static Library getInstance(String path) { + if (instance != null && instance.libraryPath.equals(path)) { + return instance; + } + synchronized(Library.class) { + if (instance == null || !instance.libraryPath.equals(path)) { + instance = new Library(path); + } + return instance; + } + } + + private Library(String path) { + packsDatabase = null; + this.libraryPath = path; + localDatabase = new JsonResponse(); + localDatabase.packs = new HashMap<>(); + } + + public String getLibraryPath() { + return libraryPath; + } + + public String getFolderForUUID(String uuid) { + try { + return Files.list(Paths.get(libraryPath)).filter( (path) -> { + Optional res = this.readPackFile(path); + if ( res.isPresent() && res.get().getUuid().equals(uuid)) return true; + return false; + }).findFirst().get().toString(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + } + + + private JsonPack fromEnrichedData(StoryPackMetadata metaData) { + JsonObject obj = new JsonObject(); + + + obj.addProperty("title", metaData.getTitle()); + obj.addProperty("description", metaData.getDescription()); + obj.addProperty("uuid", metaData.getUuid()); + obj.addProperty("version", metaData.getVersion()); + return gson.fromJson(obj, JsonPack.class); + } + + private Optional readPackFile(Path path) { + // Handle all file formats + if (path.toString().endsWith(".zip")) { + try (FileInputStream fis = new FileInputStream(path.toFile())) { + System.out.println("Reading archive pack metadata in folder " + path.toString()); + ArchiveStoryPackReader packReader = new ArchiveStoryPackReader(); + StoryPackMetadata meta = packReader.readMetadata(fis); + + if (meta != null) { + System.out.println("Pack found for UUID " + meta.getUuid()); + //return Optional.of(new LibraryPack(path, Files.getLastModifiedTime(path).toMillis() , meta)); + Optional res = packsDatabase.getPacks().stream().filter( (JsonPack p) -> p.getUuid().equalsIgnoreCase(meta.getUuid())).findFirst(); + if ( !res.isPresent() ) { + System.out.println("Package not found for UUID " + meta.getUuid()); + } + return res; + } + System.out.println("No pack found..."); + return Optional.empty(); + } catch (IOException e) { + System.out.println("Failed to read archive-format pack " + path.toString() + " from local library"); + //e.printStackTrace(); + return Optional.empty(); + } + } else if (path.toString().endsWith(".pack")) { + try (FileInputStream fis = new FileInputStream(path.toFile())) { + System.out.println("Reading raw pack metadata in folder " + path.toString()); + BinaryStoryPackReader packReader = new BinaryStoryPackReader(); + StoryPackMetadata meta = packReader.readMetadata(fis); + if ( meta != null && meta.getUuid() != null ) { + System.out.println("Pack found for UUID " + meta.getUuid()); + Optional res = packsDatabase.getPacks() + .stream() + .filter( (JsonPack p) -> + p.getUuid().equalsIgnoreCase(meta.getUuid())) + .findFirst(); + if ( !res.isPresent() ) { + System.out.println("Package not found for UUID " + meta.getUuid()); + } + return res; + } + System.out.println("No pack found..."); + return Optional.empty(); + } catch (IOException e) { + System.out.println("Failed to read raw format pack " + path.toString() + " from local library"); + //e.printStackTrace(); + return Optional.empty(); + } + } else if (Files.isDirectory(path)) { + try { + System.out.println("Reading FS pack metadata in folder " + path.toString()); + FsStoryPackReader packReader = new FsStoryPackReader(); + StoryPackMetadata meta = packReader.readMetadata(path); + if (meta != null) { + System.out.println("Pack found for UUID " + meta.getUuid()); + Optional res = packsDatabase.getPacks().stream().filter( (JsonPack p) -> p.getUuid().equalsIgnoreCase(meta.getUuid())).findFirst(); + if ( !res.isPresent() ) { + System.out.println("Package not found for UUID " + meta.getUuid()); + } + return res; + } + System.out.println("No pack found..."); + return Optional.empty(); + } catch (Exception e) { + System.out.println("Failed to read FS format pack " + path.toString() + " from local library"); + //e.printStackTrace(); + return Optional.empty(); + } + } + + // Ignore other files + return Optional.empty(); + } + + + + public CompletableFuture refreshDatabase() { + packsDatabase = null; + return getPacks(); + } + + + public CompletableFuture loadDatabase() { + + return CompletableFuture.runAsync( () -> { + if ( packsDatabase != null ) return; + try { + URL getToken = new URL(TOKEN_URL); + InputStream stream = getToken.openStream(); + + JsonObject response = new Gson().fromJson(new InputStreamReader(stream), JsonObject.class); + + String token = response.getAsJsonObject("response").getAsJsonObject("token").get("server").getAsString(); + + URL getDatabase = new URL(DATABASE_URL); + URLConnection connection = getDatabase.openConnection(); + connection.addRequestProperty("X-AUTH-TOKEN", token); + + packsDatabase = gson.fromJson(new InputStreamReader(connection.getInputStream()), JsonResponse.class); + System.out.println(); + System.out.println("Official database from Lunii server repo contains packages : "); + + String locale = Locale.getDefault().toLanguageTag().replaceAll("-", "_"); + packsDatabase.getPacks().stream().forEach( pack -> { + String packTitle; + if ( pack.getTitle() != null ) packTitle = pack.getTitle(); + else { + packTitle = pack.getLocalizedInfos().get(locale) != null ? pack.getLocalizedInfos().get(locale).getTitle() : null; + Iterator> it = pack.getLocalizedInfos().entrySet().iterator(); + while ( packTitle == null && it.hasNext() ) { + Entry entry = it.next(); + packTitle = entry.getValue().getTitle() + " - (" + entry.getKey() + ")"; + } + } + System.out.println(pack.getUuid() + " - " + packTitle); + }); + + try(FileInputStream fis = new FileInputStream(Path.of(this.libraryPath, "unofficials.json").toFile())) { + localDatabase = gson.fromJson(new InputStreamReader(fis), JsonResponse.class); + if (localDatabase == null || localDatabase.packs == null ) { + localDatabase = new JsonResponse(); + localDatabase.packs = new HashMap<>(); + } + + System.out.println("Unofficial database from Lunii server repo contains packages : "); + localDatabase.getPacks().stream().forEach( pack -> { + String packTitle; + if ( pack.getTitle() != null ) packTitle = pack.getTitle(); + else { + packTitle = pack.getLocalizedInfos().get(locale) != null ? pack.getLocalizedInfos().get(locale).getTitle() : null; + Iterator> it = pack.getLocalizedInfos().entrySet().iterator(); + while ( packTitle == null && it.hasNext() ) { + Entry entry = it.next(); + packTitle = entry.getValue().getTitle() + " - (" + entry.getKey() + ")"; + } + } + System.out.println(pack.getUuid() + " - " + packTitle); + }); + + localDatabase.packs.entrySet().forEach( (Entry entry) -> { + packsDatabase.packs.put(entry.getKey(), entry.getValue()); + }); + } catch(IOException e) { + e.printStackTrace(); + + } + } catch(NullPointerException e) { + e.printStackTrace(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + }); + + + } + + public Optional getPackForUUID(String uuid) { + if ( packsDatabase == null ) return null; + return packsDatabase.getPacks().stream().filter( (pack) -> pack.getUuid().equalsIgnoreCase(uuid)).findAny(); + } + + + public CompletableFuture> getAllLuniiPacks() { + return loadDatabase().thenComposeAsync( (Void v) -> CompletableFuture.supplyAsync( () -> packsDatabase.getPacks().stream().toList())); + } + + public CompletableFuture> getPacks() { + return loadDatabase().thenComposeAsync( (Void v) -> { + return CompletableFuture.supplyAsync(() -> { + try { + return Files.list(Paths.get(libraryPath)) + .map( this::readPackFile ) + .filter( Optional::isPresent ) + .map( Optional::get ) + .sorted((o1, o2) -> o1.getResolvedTitle(Locale.getDefault()).compareTo(o2.getResolvedTitle(Locale.getDefault()))) + .toList(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return new ArrayList(); + }); + }); + } + + protected class JsonResponse { + + @SerializedName("response") + private Map packs; + + public Collection getPacks() { + return packs.values(); + } + + + } + + + public boolean tryToImport(Path path) { + if ( path.toString().endsWith(".zip") ) { + ArchiveStoryPackReader packReader = new ArchiveStoryPackReader(); + try(FileInputStream fis = new FileInputStream(path.toFile())) { + StoryPack pack = packReader.read(fis); + fis.close(); + + //StoryPack packWithPreparedAssets = PackAssetsCompression.withPreparedAssetsFirmware2dot4(pack); + + + Optional jsonPack = this.getPackForUUID(pack.getUuid()); + if ( jsonPack.isEmpty() ) { + String packTitle = pack.getEnriched() != null ? pack.getEnriched().getTitle().toLowerCase() : null; + if ( packTitle == null ) { + return false; + } + + jsonPack = this.packsDatabase.getPacks().parallelStream().filter( (final JsonPack p) ->{ + System.out.println("Current pack main title : " + p.getTitle()); + System.out.println("All titles :"); + String concat = p.getLocalizedInfos().values().stream().map((locinfo) -> locinfo.getTitle()).reduce( (val1, val2) -> val1 + ", " + val2).orElseGet(() -> ""); + System.out.println(concat); + //String concat = String.join("," , titles); + return + (p.getTitle() != null && p.getTitle().toLowerCase().contains(packTitle)) || + p.getLocalizedInfos().values().stream().anyMatch( (locInfo) -> { + return locInfo.getTitle() != null && locInfo.getTitle().toLowerCase().contains(packTitle); + }); + } +// + //p.getLocalizedInfos().entrySet().stream().anyMatch( (entry) -> entry.getValue().getTitle() != null && entry.getValue().toString().equalsIgnoreCase(pack.getEnriched().getTitle())) + + + ).findAny(); + } + if ( jsonPack.isPresent() ) { + pack.setUuid(jsonPack.get().getUuid()); + } else { + + try(FileInputStream fis2 = new FileInputStream(path.toFile())) { + StoryPackMetadata metaData = packReader.readMetadata(fis2); + JsonPack customJsonPack = fromEnrichedData(metaData); + String random = metaData.getUuid(); + this.localDatabase.packs.put(random, customJsonPack); + CompletableFuture.runAsync( () -> { + try { + File unofficialsFile = Path.of(this.libraryPath, "unofficials.json").toFile(); + FileWriter fileWriter = new FileWriter(unofficialsFile); + gson.toJson(this.localDatabase, fileWriter); + fileWriter.flush(); + fileWriter.close(); + } catch (IOException e) { + e.printStackTrace(); + } + }); + this.packsDatabase.packs.put(random, customJsonPack); + }catch(Exception e) { + e.printStackTrace(); + } + } + + if ( Path.of(this.libraryPath, pack.getUuid()).toFile().exists() ) { + return false; + } + + //this.officalPacksDatabase.getPacks().stream().filter((JsonPack p) -> p.getUuid().equalsIgnoreCase(meta.getUuid())).findFirst(); + FsStoryPackWriter writer = new FsStoryPackWriter(); + + Path outputPath = Path.of(this.libraryPath, pack.getUuid()); + writer.write(pack, outputPath); + + + + return true; + + + } catch (Exception e) { + e.printStackTrace(); + } + } else if ( path.toString().endsWith(".pack") ) { + BinaryStoryPackReader packReader = new BinaryStoryPackReader(); + FileInputStream fis; + try { + fis = new FileInputStream(path.toFile()); + + StoryPack storyPack = packReader.read(fis); + fis.close(); + + // Prepare assets (RLE-encoded BMP, audio must already be MP3) + StoryPack packWithPreparedAssets = PackAssetsCompression.withPreparedAssetsFirmware2dot4(storyPack); + + FsStoryPackWriter writer = new FsStoryPackWriter(); + Path outputPath = Path.of(this.libraryPath, storyPack.getUuid()); + + writer.write(packWithPreparedAssets, outputPath); + return true; + } catch (Exception e) { + e.printStackTrace(); + } + + } else if ( Files.isDirectory(path) ) { + FsStoryPackReader packReader = new FsStoryPackReader(); + StoryPack pack; + try { + pack = packReader.read(path); + Path outputPath = Path.of(this.libraryPath, pack.getUuid()); + Files.move(path, outputPath); + return true; + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return false; + + } +} diff --git a/studio-desktop/src/main/java/studio/database/LocalizedInfos.java b/studio-desktop/src/main/java/studio/database/LocalizedInfos.java new file mode 100644 index 000000000..948f11742 --- /dev/null +++ b/studio-desktop/src/main/java/studio/database/LocalizedInfos.java @@ -0,0 +1,76 @@ +package studio.database; + +import java.net.URL; +import java.util.List; + +import org.apache.commons.io.IOUtils; + +import com.google.gson.annotations.SerializedName; + +public class LocalizedInfos extends Thumbnailable { + + protected class JsonImage { + @SerializedName("image_url") + private String url; + + public String getUrl() { + return url; + } + + } + + @SerializedName("description") + private String description; + + @SerializedName("image") + private JsonImage image; + + @SerializedName("subtitle") + private String subtitle; + + @SerializedName("title") + private String title; + + @SerializedName("previews") + private List previews; + + public String getDescription() { + return description; + } + + public String getImageUrl() { + return image.getUrl(); + } + + public String getSubtitle() { + return subtitle; + } + + public String getTitle() { + return title; + } + + public List getPreviews() { + return previews; + } + + private byte[] imageData; + + + public boolean hasFetchImage() { + return imageData != null; + } + + public byte[] getImage() { + if ( this.imageData != null ) return imageData; + try { + + URL url = new URL(Library.RESOURCE_URL + this.getImageUrl().replaceAll("\\s", "%20")); + return imageData = IOUtils.toByteArray(url); + } catch (Exception e) { + } + return new byte[0]; + + } + +} \ No newline at end of file diff --git a/studio-desktop/src/main/java/studio/database/Person.java b/studio-desktop/src/main/java/studio/database/Person.java new file mode 100644 index 000000000..8ddbf35e1 --- /dev/null +++ b/studio-desktop/src/main/java/studio/database/Person.java @@ -0,0 +1,43 @@ +package studio.database; + +import java.net.URL; + +import org.apache.commons.io.IOUtils; + +import com.google.gson.annotations.SerializedName; + +public class Person extends Thumbnailable { + @SerializedName("gender") + private String gender; + + @SerializedName("name") + private String name; + + @SerializedName("image") + private String image; + + public String getGender() { + return gender; + } + + public String getName() { + return name; + } + + public String getImageUrl() { + return image; + } + + private byte[] imageData; + + public byte[] getImage() { + if ( this.imageData != null ) return imageData; + try { + URL url = new URL(Library.RESOURCE_URL + this.image); + return imageData = IOUtils.toByteArray(url); + } catch (Exception e) { + } + return new byte[0]; + } + +} \ No newline at end of file diff --git a/studio-desktop/src/main/java/studio/database/Thumbnailable.java b/studio-desktop/src/main/java/studio/database/Thumbnailable.java new file mode 100644 index 000000000..4f2e27675 --- /dev/null +++ b/studio-desktop/src/main/java/studio/database/Thumbnailable.java @@ -0,0 +1,45 @@ +package studio.database; + +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import javax.imageio.ImageIO; + +public abstract class Thumbnailable { + + public abstract byte[] getImage(); + + private byte[] thumbnailImage; + + public byte[] getThumbnail() { + if ( thumbnailImage != null ) return thumbnailImage; + + + try { + BufferedImage source = ImageIO.read(new ByteArrayInputStream(getImage())); + BufferedImage bimage = new BufferedImage(64, 64, BufferedImage.TYPE_INT_ARGB); + + // Draw the image on to the buffered image + Graphics2D bGr = bimage.createGraphics(); + bGr.setRenderingHint(RenderingHints.KEY_INTERPOLATION, + RenderingHints.VALUE_INTERPOLATION_BILINEAR); + bGr.drawImage(source, 0, 0, 64, 64, 0, 0, source.getWidth(null), source.getHeight(null), null); + bGr.dispose(); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ImageIO.write(bimage, "png", baos); + + thumbnailImage = baos.toByteArray(); + } catch (IOException e) { + thumbnailImage = new byte[0]; + } + + return thumbnailImage; + + } + +} diff --git a/studio-desktop/src/main/java/studio/flags/ad.svg b/studio-desktop/src/main/java/studio/flags/ad.svg new file mode 100644 index 000000000..4bd91b72b --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ad.svg @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ae.svg b/studio-desktop/src/main/java/studio/flags/ae.svg new file mode 100644 index 000000000..b59e11352 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ae.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/af.svg b/studio-desktop/src/main/java/studio/flags/af.svg new file mode 100644 index 000000000..0b7939c69 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/af.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ag.svg b/studio-desktop/src/main/java/studio/flags/ag.svg new file mode 100644 index 000000000..9b951b6a5 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ag.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ai.svg b/studio-desktop/src/main/java/studio/flags/ai.svg new file mode 100644 index 000000000..eeaebcf64 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ai.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/al.svg b/studio-desktop/src/main/java/studio/flags/al.svg new file mode 100644 index 000000000..15ee8bbe2 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/al.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/am.svg b/studio-desktop/src/main/java/studio/flags/am.svg new file mode 100644 index 000000000..a188adfe4 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/am.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ao.svg b/studio-desktop/src/main/java/studio/flags/ao.svg new file mode 100644 index 000000000..46d6600ad --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ao.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/aq.svg b/studio-desktop/src/main/java/studio/flags/aq.svg new file mode 100644 index 000000000..a4d9a201f --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/aq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ar.svg b/studio-desktop/src/main/java/studio/flags/ar.svg new file mode 100644 index 000000000..984d6ea6a --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ar.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/arab.svg b/studio-desktop/src/main/java/studio/flags/arab.svg new file mode 100644 index 000000000..841f11adf --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/arab.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/as.svg b/studio-desktop/src/main/java/studio/flags/as.svg new file mode 100644 index 000000000..b0789e9c9 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/as.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/at.svg b/studio-desktop/src/main/java/studio/flags/at.svg new file mode 100644 index 000000000..758ced641 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/at.svg @@ -0,0 +1,4 @@ + + + + diff --git a/studio-desktop/src/main/java/studio/flags/au.svg b/studio-desktop/src/main/java/studio/flags/au.svg new file mode 100644 index 000000000..38bb24505 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/au.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/aw.svg b/studio-desktop/src/main/java/studio/flags/aw.svg new file mode 100644 index 000000000..1f03d61a2 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/aw.svg @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ax.svg b/studio-desktop/src/main/java/studio/flags/ax.svg new file mode 100644 index 000000000..481d2a33c --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ax.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/az.svg b/studio-desktop/src/main/java/studio/flags/az.svg new file mode 100644 index 000000000..d692e2250 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/az.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ba.svg b/studio-desktop/src/main/java/studio/flags/ba.svg new file mode 100644 index 000000000..456ca1236 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ba.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/bb.svg b/studio-desktop/src/main/java/studio/flags/bb.svg new file mode 100644 index 000000000..5af2bd030 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/bb.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/bd.svg b/studio-desktop/src/main/java/studio/flags/bd.svg new file mode 100644 index 000000000..86fcfbab0 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/bd.svg @@ -0,0 +1,4 @@ + + + + diff --git a/studio-desktop/src/main/java/studio/flags/be.svg b/studio-desktop/src/main/java/studio/flags/be.svg new file mode 100644 index 000000000..31d6210c7 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/be.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/bf.svg b/studio-desktop/src/main/java/studio/flags/bf.svg new file mode 100644 index 000000000..a5078df3f --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/bf.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/bg.svg b/studio-desktop/src/main/java/studio/flags/bg.svg new file mode 100644 index 000000000..78412c5d2 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/bg.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/bh.svg b/studio-desktop/src/main/java/studio/flags/bh.svg new file mode 100644 index 000000000..2d131aa59 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/bh.svg @@ -0,0 +1,4 @@ + + + + diff --git a/studio-desktop/src/main/java/studio/flags/bi.svg b/studio-desktop/src/main/java/studio/flags/bi.svg new file mode 100644 index 000000000..36a0d3a68 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/bi.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/bj.svg b/studio-desktop/src/main/java/studio/flags/bj.svg new file mode 100644 index 000000000..bb27414c0 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/bj.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/bl.svg b/studio-desktop/src/main/java/studio/flags/bl.svg new file mode 100644 index 000000000..65550d936 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/bl.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/bm.svg b/studio-desktop/src/main/java/studio/flags/bm.svg new file mode 100644 index 000000000..b4df19244 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/bm.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/bn.svg b/studio-desktop/src/main/java/studio/flags/bn.svg new file mode 100644 index 000000000..b536651cf --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/bn.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/bo.svg b/studio-desktop/src/main/java/studio/flags/bo.svg new file mode 100644 index 000000000..b69b23089 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/bo.svg @@ -0,0 +1,674 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/bq.svg b/studio-desktop/src/main/java/studio/flags/bq.svg new file mode 100644 index 000000000..4b9168e13 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/bq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/br.svg b/studio-desktop/src/main/java/studio/flags/br.svg new file mode 100644 index 000000000..be62f6ff9 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/br.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/bs.svg b/studio-desktop/src/main/java/studio/flags/bs.svg new file mode 100644 index 000000000..0faa4bbac --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/bs.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/bt.svg b/studio-desktop/src/main/java/studio/flags/bt.svg new file mode 100644 index 000000000..81f6788c0 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/bt.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/bv.svg b/studio-desktop/src/main/java/studio/flags/bv.svg new file mode 100644 index 000000000..dcc6ad106 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/bv.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/bw.svg b/studio-desktop/src/main/java/studio/flags/bw.svg new file mode 100644 index 000000000..328e13c11 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/bw.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/by.svg b/studio-desktop/src/main/java/studio/flags/by.svg new file mode 100644 index 000000000..ab7984dc9 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/by.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/bz.svg b/studio-desktop/src/main/java/studio/flags/bz.svg new file mode 100644 index 000000000..e99106a56 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/bz.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ca.svg b/studio-desktop/src/main/java/studio/flags/ca.svg new file mode 100644 index 000000000..84cde348e --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ca.svg @@ -0,0 +1,4 @@ + + + + diff --git a/studio-desktop/src/main/java/studio/flags/cc.svg b/studio-desktop/src/main/java/studio/flags/cc.svg new file mode 100644 index 000000000..f6c1755ce --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/cc.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/cd.svg b/studio-desktop/src/main/java/studio/flags/cd.svg new file mode 100644 index 000000000..ea1772873 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/cd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/cefta.svg b/studio-desktop/src/main/java/studio/flags/cefta.svg new file mode 100644 index 000000000..ff1a19bb6 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/cefta.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/cf.svg b/studio-desktop/src/main/java/studio/flags/cf.svg new file mode 100644 index 000000000..b0625db75 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/cf.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/cg.svg b/studio-desktop/src/main/java/studio/flags/cg.svg new file mode 100644 index 000000000..f7868842f --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/cg.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ch.svg b/studio-desktop/src/main/java/studio/flags/ch.svg new file mode 100644 index 000000000..52578bfde --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ch.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ci.svg b/studio-desktop/src/main/java/studio/flags/ci.svg new file mode 100644 index 000000000..2abf64119 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ci.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ck.svg b/studio-desktop/src/main/java/studio/flags/ck.svg new file mode 100644 index 000000000..43a105763 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ck.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/cl.svg b/studio-desktop/src/main/java/studio/flags/cl.svg new file mode 100644 index 000000000..5fb6096b7 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/cl.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/cm.svg b/studio-desktop/src/main/java/studio/flags/cm.svg new file mode 100644 index 000000000..ed4952b43 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/cm.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/cn.svg b/studio-desktop/src/main/java/studio/flags/cn.svg new file mode 100644 index 000000000..e152f0166 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/cn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/co.svg b/studio-desktop/src/main/java/studio/flags/co.svg new file mode 100644 index 000000000..5804bfe48 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/co.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/cp.svg b/studio-desktop/src/main/java/studio/flags/cp.svg new file mode 100644 index 000000000..ea3bfdcb4 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/cp.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/cr.svg b/studio-desktop/src/main/java/studio/flags/cr.svg new file mode 100644 index 000000000..4e7889e22 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/cr.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/cu.svg b/studio-desktop/src/main/java/studio/flags/cu.svg new file mode 100644 index 000000000..a28490235 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/cu.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/cv.svg b/studio-desktop/src/main/java/studio/flags/cv.svg new file mode 100644 index 000000000..1170cd767 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/cv.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/cw.svg b/studio-desktop/src/main/java/studio/flags/cw.svg new file mode 100644 index 000000000..57062abaa --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/cw.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/cx.svg b/studio-desktop/src/main/java/studio/flags/cx.svg new file mode 100644 index 000000000..f14536f03 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/cx.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/cy.svg b/studio-desktop/src/main/java/studio/flags/cy.svg new file mode 100644 index 000000000..39a87c870 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/cy.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/cz.svg b/studio-desktop/src/main/java/studio/flags/cz.svg new file mode 100644 index 000000000..dcd0a6b1e --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/cz.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/de.svg b/studio-desktop/src/main/java/studio/flags/de.svg new file mode 100644 index 000000000..05a0a69ae --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/de.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/dg.svg b/studio-desktop/src/main/java/studio/flags/dg.svg new file mode 100644 index 000000000..0b8baf149 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/dg.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/dj.svg b/studio-desktop/src/main/java/studio/flags/dj.svg new file mode 100644 index 000000000..f5534d2a0 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/dj.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/dk.svg b/studio-desktop/src/main/java/studio/flags/dk.svg new file mode 100644 index 000000000..5aaaa1906 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/dk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/dm.svg b/studio-desktop/src/main/java/studio/flags/dm.svg new file mode 100644 index 000000000..6f8f36646 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/dm.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/do.svg b/studio-desktop/src/main/java/studio/flags/do.svg new file mode 100644 index 000000000..867e12d1a --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/do.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/dz.svg b/studio-desktop/src/main/java/studio/flags/dz.svg new file mode 100644 index 000000000..8abcd258e --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/dz.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/eac.svg b/studio-desktop/src/main/java/studio/flags/eac.svg new file mode 100644 index 000000000..385fe9d66 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/eac.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ec.svg b/studio-desktop/src/main/java/studio/flags/ec.svg new file mode 100644 index 000000000..9545c5ddd --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ec.svg @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ee.svg b/studio-desktop/src/main/java/studio/flags/ee.svg new file mode 100644 index 000000000..5a6a7e37e --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ee.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/eg.svg b/studio-desktop/src/main/java/studio/flags/eg.svg new file mode 100644 index 000000000..3ef77112c --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/eg.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/eh.svg b/studio-desktop/src/main/java/studio/flags/eh.svg new file mode 100644 index 000000000..ae509fa8b --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/eh.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/er.svg b/studio-desktop/src/main/java/studio/flags/er.svg new file mode 100644 index 000000000..0f140e092 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/er.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/es-ct.svg b/studio-desktop/src/main/java/studio/flags/es-ct.svg new file mode 100644 index 000000000..a06a2e3d3 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/es-ct.svg @@ -0,0 +1,4 @@ + + + + diff --git a/studio-desktop/src/main/java/studio/flags/es-ga.svg b/studio-desktop/src/main/java/studio/flags/es-ga.svg new file mode 100644 index 000000000..2fecfa090 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/es-ga.svg @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/es-pv.svg b/studio-desktop/src/main/java/studio/flags/es-pv.svg new file mode 100644 index 000000000..7d383ed5e --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/es-pv.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/es.svg b/studio-desktop/src/main/java/studio/flags/es.svg new file mode 100644 index 000000000..0e6338fac --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/es.svg @@ -0,0 +1,547 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/et.svg b/studio-desktop/src/main/java/studio/flags/et.svg new file mode 100644 index 000000000..eb7f3c423 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/et.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/eu.svg b/studio-desktop/src/main/java/studio/flags/eu.svg new file mode 100644 index 000000000..4a07fbe58 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/eu.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/fi.svg b/studio-desktop/src/main/java/studio/flags/fi.svg new file mode 100644 index 000000000..aba2ef3b0 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/fi.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/fj.svg b/studio-desktop/src/main/java/studio/flags/fj.svg new file mode 100644 index 000000000..7a1cade2d --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/fj.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/fk.svg b/studio-desktop/src/main/java/studio/flags/fk.svg new file mode 100644 index 000000000..21e654f22 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/fk.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/fm.svg b/studio-desktop/src/main/java/studio/flags/fm.svg new file mode 100644 index 000000000..4f7d31324 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/fm.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/fo.svg b/studio-desktop/src/main/java/studio/flags/fo.svg new file mode 100644 index 000000000..eec994583 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/fo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/fr.svg b/studio-desktop/src/main/java/studio/flags/fr.svg new file mode 100644 index 000000000..0f60170fc --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/fr.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ga.svg b/studio-desktop/src/main/java/studio/flags/ga.svg new file mode 100644 index 000000000..113a5b58a --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ga.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gb-eng.svg b/studio-desktop/src/main/java/studio/flags/gb-eng.svg new file mode 100644 index 000000000..ee48fed99 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gb-eng.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gb-nir.svg b/studio-desktop/src/main/java/studio/flags/gb-nir.svg new file mode 100644 index 000000000..77a91f071 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gb-nir.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gb-sct.svg b/studio-desktop/src/main/java/studio/flags/gb-sct.svg new file mode 100644 index 000000000..44d38cc10 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gb-sct.svg @@ -0,0 +1,4 @@ + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gb-wls.svg b/studio-desktop/src/main/java/studio/flags/gb-wls.svg new file mode 100644 index 000000000..31268824c --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gb-wls.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gb.svg b/studio-desktop/src/main/java/studio/flags/gb.svg new file mode 100644 index 000000000..ce4d1e000 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gb.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gd.svg b/studio-desktop/src/main/java/studio/flags/gd.svg new file mode 100644 index 000000000..c3b2cef56 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gd.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ge.svg b/studio-desktop/src/main/java/studio/flags/ge.svg new file mode 100644 index 000000000..53b709fc1 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ge.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gf.svg b/studio-desktop/src/main/java/studio/flags/gf.svg new file mode 100644 index 000000000..9cf5aa2b1 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gg.svg b/studio-desktop/src/main/java/studio/flags/gg.svg new file mode 100644 index 000000000..480f5503f --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gh.svg b/studio-desktop/src/main/java/studio/flags/gh.svg new file mode 100644 index 000000000..a64271b84 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gh.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gi.svg b/studio-desktop/src/main/java/studio/flags/gi.svg new file mode 100644 index 000000000..7b26bb2e9 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gi.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gl.svg b/studio-desktop/src/main/java/studio/flags/gl.svg new file mode 100644 index 000000000..eaa817b1a --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gl.svg @@ -0,0 +1,4 @@ + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gm.svg b/studio-desktop/src/main/java/studio/flags/gm.svg new file mode 100644 index 000000000..2a8f72443 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gm.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gn.svg b/studio-desktop/src/main/java/studio/flags/gn.svg new file mode 100644 index 000000000..ae81f9d7b --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gn.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gp.svg b/studio-desktop/src/main/java/studio/flags/gp.svg new file mode 100644 index 000000000..9dd8e3bba --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gp.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gq.svg b/studio-desktop/src/main/java/studio/flags/gq.svg new file mode 100644 index 000000000..5fd7b6a17 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gq.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gr.svg b/studio-desktop/src/main/java/studio/flags/gr.svg new file mode 100644 index 000000000..a2688303a --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gr.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gs.svg b/studio-desktop/src/main/java/studio/flags/gs.svg new file mode 100644 index 000000000..1db72cffb --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gs.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gt.svg b/studio-desktop/src/main/java/studio/flags/gt.svg new file mode 100644 index 000000000..97ea6aa5b --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gt.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gu.svg b/studio-desktop/src/main/java/studio/flags/gu.svg new file mode 100644 index 000000000..57024874f --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gu.svg @@ -0,0 +1,23 @@ + + + + + + + + + + G + U + A + M + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gw.svg b/studio-desktop/src/main/java/studio/flags/gw.svg new file mode 100644 index 000000000..61a054812 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gw.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/gy.svg b/studio-desktop/src/main/java/studio/flags/gy.svg new file mode 100644 index 000000000..35e2f08bb --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/gy.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/hk.svg b/studio-desktop/src/main/java/studio/flags/hk.svg new file mode 100644 index 000000000..eef02a18b --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/hk.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/hm.svg b/studio-desktop/src/main/java/studio/flags/hm.svg new file mode 100644 index 000000000..1f4d00704 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/hm.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/hn.svg b/studio-desktop/src/main/java/studio/flags/hn.svg new file mode 100644 index 000000000..847df20c7 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/hn.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/hr.svg b/studio-desktop/src/main/java/studio/flags/hr.svg new file mode 100644 index 000000000..91009eb7d --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/hr.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ht.svg b/studio-desktop/src/main/java/studio/flags/ht.svg new file mode 100644 index 000000000..a61736cda --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ht.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/hu.svg b/studio-desktop/src/main/java/studio/flags/hu.svg new file mode 100644 index 000000000..088242d93 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/hu.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ic.svg b/studio-desktop/src/main/java/studio/flags/ic.svg new file mode 100644 index 000000000..096603d4b --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ic.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/id.svg b/studio-desktop/src/main/java/studio/flags/id.svg new file mode 100644 index 000000000..df0801815 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/id.svg @@ -0,0 +1,4 @@ + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ie.svg b/studio-desktop/src/main/java/studio/flags/ie.svg new file mode 100644 index 000000000..e13de22df --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ie.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/il.svg b/studio-desktop/src/main/java/studio/flags/il.svg new file mode 100644 index 000000000..0a2a6d99b --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/il.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/im.svg b/studio-desktop/src/main/java/studio/flags/im.svg new file mode 100644 index 000000000..cff1c4b2b --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/im.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/in.svg b/studio-desktop/src/main/java/studio/flags/in.svg new file mode 100644 index 000000000..26a02cff0 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/in.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/io.svg b/studio-desktop/src/main/java/studio/flags/io.svg new file mode 100644 index 000000000..6f1a8ca20 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/io.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/iq.svg b/studio-desktop/src/main/java/studio/flags/iq.svg new file mode 100644 index 000000000..a64456d4f --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/iq.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ir.svg b/studio-desktop/src/main/java/studio/flags/ir.svg new file mode 100644 index 000000000..095d9717e --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ir.svg @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/is.svg b/studio-desktop/src/main/java/studio/flags/is.svg new file mode 100644 index 000000000..26510b99e --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/is.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/it.svg b/studio-desktop/src/main/java/studio/flags/it.svg new file mode 100644 index 000000000..b9596d050 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/it.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/je.svg b/studio-desktop/src/main/java/studio/flags/je.svg new file mode 100644 index 000000000..8a9fdd57e --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/je.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/jm.svg b/studio-desktop/src/main/java/studio/flags/jm.svg new file mode 100644 index 000000000..07f023c79 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/jm.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/jo.svg b/studio-desktop/src/main/java/studio/flags/jo.svg new file mode 100644 index 000000000..fbbd68104 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/jo.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/jp.svg b/studio-desktop/src/main/java/studio/flags/jp.svg new file mode 100644 index 000000000..118686a0e --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/jp.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ke.svg b/studio-desktop/src/main/java/studio/flags/ke.svg new file mode 100644 index 000000000..110600ec9 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ke.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/kg.svg b/studio-desktop/src/main/java/studio/flags/kg.svg new file mode 100644 index 000000000..2ab176a3b --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/kg.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/kh.svg b/studio-desktop/src/main/java/studio/flags/kh.svg new file mode 100644 index 000000000..4b63b327d --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/kh.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ki.svg b/studio-desktop/src/main/java/studio/flags/ki.svg new file mode 100644 index 000000000..14dab1530 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ki.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/km.svg b/studio-desktop/src/main/java/studio/flags/km.svg new file mode 100644 index 000000000..d9b775119 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/km.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/kn.svg b/studio-desktop/src/main/java/studio/flags/kn.svg new file mode 100644 index 000000000..42d5adfe5 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/kn.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/kp.svg b/studio-desktop/src/main/java/studio/flags/kp.svg new file mode 100644 index 000000000..253930406 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/kp.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/kr.svg b/studio-desktop/src/main/java/studio/flags/kr.svg new file mode 100644 index 000000000..af3d35eb5 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/kr.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/kw.svg b/studio-desktop/src/main/java/studio/flags/kw.svg new file mode 100644 index 000000000..b2fe54faa --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/kw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ky.svg b/studio-desktop/src/main/java/studio/flags/ky.svg new file mode 100644 index 000000000..e55d5207d --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ky.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/kz.svg b/studio-desktop/src/main/java/studio/flags/kz.svg new file mode 100644 index 000000000..f9f9b98fe --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/kz.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/la.svg b/studio-desktop/src/main/java/studio/flags/la.svg new file mode 100644 index 000000000..af70d0dcc --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/la.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/lb.svg b/studio-desktop/src/main/java/studio/flags/lb.svg new file mode 100644 index 000000000..65201091b --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/lb.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/lc.svg b/studio-desktop/src/main/java/studio/flags/lc.svg new file mode 100644 index 000000000..aa18fac83 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/lc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/li.svg b/studio-desktop/src/main/java/studio/flags/li.svg new file mode 100644 index 000000000..bf8181029 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/li.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/lk.svg b/studio-desktop/src/main/java/studio/flags/lk.svg new file mode 100644 index 000000000..08212a5b8 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/lk.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/lr.svg b/studio-desktop/src/main/java/studio/flags/lr.svg new file mode 100644 index 000000000..74382abbe --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/lr.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ls.svg b/studio-desktop/src/main/java/studio/flags/ls.svg new file mode 100644 index 000000000..605c087af --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ls.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/lt.svg b/studio-desktop/src/main/java/studio/flags/lt.svg new file mode 100644 index 000000000..52ada948c --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/lt.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/lu.svg b/studio-desktop/src/main/java/studio/flags/lu.svg new file mode 100644 index 000000000..037c31524 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/lu.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/lv.svg b/studio-desktop/src/main/java/studio/flags/lv.svg new file mode 100644 index 000000000..5af883c70 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/lv.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ly.svg b/studio-desktop/src/main/java/studio/flags/ly.svg new file mode 100644 index 000000000..4375a9eaf --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ly.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ma.svg b/studio-desktop/src/main/java/studio/flags/ma.svg new file mode 100644 index 000000000..804166728 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ma.svg @@ -0,0 +1,4 @@ + + + + diff --git a/studio-desktop/src/main/java/studio/flags/mc.svg b/studio-desktop/src/main/java/studio/flags/mc.svg new file mode 100644 index 000000000..04173a415 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/mc.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/md.svg b/studio-desktop/src/main/java/studio/flags/md.svg new file mode 100644 index 000000000..18a77ea92 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/md.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/me.svg b/studio-desktop/src/main/java/studio/flags/me.svg new file mode 100644 index 000000000..37e96b00a --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/me.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/mf.svg b/studio-desktop/src/main/java/studio/flags/mf.svg new file mode 100644 index 000000000..8d3285b86 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/mf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/mg.svg b/studio-desktop/src/main/java/studio/flags/mg.svg new file mode 100644 index 000000000..4f901cad0 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/mg.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/mh.svg b/studio-desktop/src/main/java/studio/flags/mh.svg new file mode 100644 index 000000000..1db268d22 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/mh.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/mk.svg b/studio-desktop/src/main/java/studio/flags/mk.svg new file mode 100644 index 000000000..0ee923a35 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/mk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ml.svg b/studio-desktop/src/main/java/studio/flags/ml.svg new file mode 100644 index 000000000..665d6b243 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ml.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/mm.svg b/studio-desktop/src/main/java/studio/flags/mm.svg new file mode 100644 index 000000000..391f0c70b --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/mm.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/mn.svg b/studio-desktop/src/main/java/studio/flags/mn.svg new file mode 100644 index 000000000..998fe5ceb --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/mn.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/mo.svg b/studio-desktop/src/main/java/studio/flags/mo.svg new file mode 100644 index 000000000..bd5cbcd98 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/mo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/mp.svg b/studio-desktop/src/main/java/studio/flags/mp.svg new file mode 100644 index 000000000..6179fb7d7 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/mp.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/mq.svg b/studio-desktop/src/main/java/studio/flags/mq.svg new file mode 100644 index 000000000..dcf005443 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/mq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/mr.svg b/studio-desktop/src/main/java/studio/flags/mr.svg new file mode 100644 index 000000000..ffe8c114f --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/mr.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ms.svg b/studio-desktop/src/main/java/studio/flags/ms.svg new file mode 100644 index 000000000..c06dfccf8 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ms.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/mt.svg b/studio-desktop/src/main/java/studio/flags/mt.svg new file mode 100644 index 000000000..f53431568 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/mt.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/mu.svg b/studio-desktop/src/main/java/studio/flags/mu.svg new file mode 100644 index 000000000..2afe1d384 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/mu.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/mv.svg b/studio-desktop/src/main/java/studio/flags/mv.svg new file mode 100644 index 000000000..c9a6c5bcc --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/mv.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/mw.svg b/studio-desktop/src/main/java/studio/flags/mw.svg new file mode 100644 index 000000000..25bbf2efc --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/mw.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/mx.svg b/studio-desktop/src/main/java/studio/flags/mx.svg new file mode 100644 index 000000000..bb991c17f --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/mx.svg @@ -0,0 +1,377 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/my.svg b/studio-desktop/src/main/java/studio/flags/my.svg new file mode 100644 index 000000000..b10f76e61 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/my.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/mz.svg b/studio-desktop/src/main/java/studio/flags/mz.svg new file mode 100644 index 000000000..bb751482c --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/mz.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/na.svg b/studio-desktop/src/main/java/studio/flags/na.svg new file mode 100644 index 000000000..36ac8d77e --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/na.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/nc.svg b/studio-desktop/src/main/java/studio/flags/nc.svg new file mode 100644 index 000000000..1cc81eb01 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/nc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ne.svg b/studio-desktop/src/main/java/studio/flags/ne.svg new file mode 100644 index 000000000..a96b027ab --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ne.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/nf.svg b/studio-desktop/src/main/java/studio/flags/nf.svg new file mode 100644 index 000000000..d9be1566c --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/nf.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ng.svg b/studio-desktop/src/main/java/studio/flags/ng.svg new file mode 100644 index 000000000..62813e861 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ng.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ni.svg b/studio-desktop/src/main/java/studio/flags/ni.svg new file mode 100644 index 000000000..847f33125 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ni.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/nl.svg b/studio-desktop/src/main/java/studio/flags/nl.svg new file mode 100644 index 000000000..49ca5bc00 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/nl.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/no.svg b/studio-desktop/src/main/java/studio/flags/no.svg new file mode 100644 index 000000000..939920d40 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/no.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/np.svg b/studio-desktop/src/main/java/studio/flags/np.svg new file mode 100644 index 000000000..498a1000f --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/np.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/nr.svg b/studio-desktop/src/main/java/studio/flags/nr.svg new file mode 100644 index 000000000..c8c827e70 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/nr.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/nu.svg b/studio-desktop/src/main/java/studio/flags/nu.svg new file mode 100644 index 000000000..ce316723d --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/nu.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/nz.svg b/studio-desktop/src/main/java/studio/flags/nz.svg new file mode 100644 index 000000000..ee617d6f2 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/nz.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/om.svg b/studio-desktop/src/main/java/studio/flags/om.svg new file mode 100644 index 000000000..2021f9386 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/om.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/pa.svg b/studio-desktop/src/main/java/studio/flags/pa.svg new file mode 100644 index 000000000..108c40bff --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/pa.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/pc.svg b/studio-desktop/src/main/java/studio/flags/pc.svg new file mode 100644 index 000000000..a38dd212b --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/pc.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/pe.svg b/studio-desktop/src/main/java/studio/flags/pe.svg new file mode 100644 index 000000000..9ba4c6124 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/pe.svg @@ -0,0 +1,4 @@ + + + + diff --git a/studio-desktop/src/main/java/studio/flags/pf.svg b/studio-desktop/src/main/java/studio/flags/pf.svg new file mode 100644 index 000000000..92b2803c5 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/pf.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/pg.svg b/studio-desktop/src/main/java/studio/flags/pg.svg new file mode 100644 index 000000000..8c8a2b8eb --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/pg.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ph.svg b/studio-desktop/src/main/java/studio/flags/ph.svg new file mode 100644 index 000000000..7ae39fec8 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ph.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/pk.svg b/studio-desktop/src/main/java/studio/flags/pk.svg new file mode 100644 index 000000000..e71cd9261 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/pk.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/pl.svg b/studio-desktop/src/main/java/studio/flags/pl.svg new file mode 100644 index 000000000..8c43577b0 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/pl.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/pm.svg b/studio-desktop/src/main/java/studio/flags/pm.svg new file mode 100644 index 000000000..950c6e8c0 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/pm.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/pn.svg b/studio-desktop/src/main/java/studio/flags/pn.svg new file mode 100644 index 000000000..0bae95e0d --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/pn.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/pr.svg b/studio-desktop/src/main/java/studio/flags/pr.svg new file mode 100644 index 000000000..eb302ad45 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/pr.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ps.svg b/studio-desktop/src/main/java/studio/flags/ps.svg new file mode 100644 index 000000000..2c10079c1 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ps.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/pt.svg b/studio-desktop/src/main/java/studio/flags/pt.svg new file mode 100644 index 000000000..95ad6d79d --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/pt.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/pw.svg b/studio-desktop/src/main/java/studio/flags/pw.svg new file mode 100644 index 000000000..ef6be7983 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/pw.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/py.svg b/studio-desktop/src/main/java/studio/flags/py.svg new file mode 100644 index 000000000..e7e1bced9 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/py.svg @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/qa.svg b/studio-desktop/src/main/java/studio/flags/qa.svg new file mode 100644 index 000000000..897a21bca --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/qa.svg @@ -0,0 +1,4 @@ + + + + diff --git a/studio-desktop/src/main/java/studio/flags/re.svg b/studio-desktop/src/main/java/studio/flags/re.svg new file mode 100644 index 000000000..41d87d938 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/re.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ro.svg b/studio-desktop/src/main/java/studio/flags/ro.svg new file mode 100644 index 000000000..e6cf0f6e1 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ro.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/rs.svg b/studio-desktop/src/main/java/studio/flags/rs.svg new file mode 100644 index 000000000..d10ebb3e4 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/rs.svg @@ -0,0 +1,296 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ru.svg b/studio-desktop/src/main/java/studio/flags/ru.svg new file mode 100644 index 000000000..f428b0ccb --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ru.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/rw.svg b/studio-desktop/src/main/java/studio/flags/rw.svg new file mode 100644 index 000000000..3d484fd90 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/rw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/sa.svg b/studio-desktop/src/main/java/studio/flags/sa.svg new file mode 100644 index 000000000..fd6418eef --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/sa.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/sb.svg b/studio-desktop/src/main/java/studio/flags/sb.svg new file mode 100644 index 000000000..398c70847 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/sb.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/sc.svg b/studio-desktop/src/main/java/studio/flags/sc.svg new file mode 100644 index 000000000..2996bac45 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/sc.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/sd.svg b/studio-desktop/src/main/java/studio/flags/sd.svg new file mode 100644 index 000000000..0b9abdc8a --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/sd.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/se.svg b/studio-desktop/src/main/java/studio/flags/se.svg new file mode 100644 index 000000000..8f3f134d2 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/se.svg @@ -0,0 +1,4 @@ + + + + diff --git a/studio-desktop/src/main/java/studio/flags/sg.svg b/studio-desktop/src/main/java/studio/flags/sg.svg new file mode 100644 index 000000000..60625e97f --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/sg.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/sh-ac.svg b/studio-desktop/src/main/java/studio/flags/sh-ac.svg new file mode 100644 index 000000000..85cd9d1c5 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/sh-ac.svg @@ -0,0 +1,690 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/sh-hl.svg b/studio-desktop/src/main/java/studio/flags/sh-hl.svg new file mode 100644 index 000000000..4cb199048 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/sh-hl.svg @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/sh-ta.svg b/studio-desktop/src/main/java/studio/flags/sh-ta.svg new file mode 100644 index 000000000..7933fc21b --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/sh-ta.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/sh.svg b/studio-desktop/src/main/java/studio/flags/sh.svg new file mode 100644 index 000000000..2fd372750 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/sh.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/si.svg b/studio-desktop/src/main/java/studio/flags/si.svg new file mode 100644 index 000000000..33a03c625 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/si.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/sj.svg b/studio-desktop/src/main/java/studio/flags/sj.svg new file mode 100644 index 000000000..ecb9c796b --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/sj.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/sk.svg b/studio-desktop/src/main/java/studio/flags/sk.svg new file mode 100644 index 000000000..d1868226c --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/sk.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/sl.svg b/studio-desktop/src/main/java/studio/flags/sl.svg new file mode 100644 index 000000000..b649f1bd5 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/sl.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/sm.svg b/studio-desktop/src/main/java/studio/flags/sm.svg new file mode 100644 index 000000000..30c249015 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/sm.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/sn.svg b/studio-desktop/src/main/java/studio/flags/sn.svg new file mode 100644 index 000000000..ff9cf2eb3 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/sn.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/so.svg b/studio-desktop/src/main/java/studio/flags/so.svg new file mode 100644 index 000000000..4848dbe0b --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/so.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/sr.svg b/studio-desktop/src/main/java/studio/flags/sr.svg new file mode 100644 index 000000000..0ca359627 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/sr.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ss.svg b/studio-desktop/src/main/java/studio/flags/ss.svg new file mode 100644 index 000000000..bb50fac15 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ss.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/st.svg b/studio-desktop/src/main/java/studio/flags/st.svg new file mode 100644 index 000000000..c5e7c5ce6 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/st.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/sv.svg b/studio-desktop/src/main/java/studio/flags/sv.svg new file mode 100644 index 000000000..14e98b058 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/sv.svg @@ -0,0 +1,594 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/sx.svg b/studio-desktop/src/main/java/studio/flags/sx.svg new file mode 100644 index 000000000..758f483c9 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/sx.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/sy.svg b/studio-desktop/src/main/java/studio/flags/sy.svg new file mode 100644 index 000000000..39e63f7fb --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/sy.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/sz.svg b/studio-desktop/src/main/java/studio/flags/sz.svg new file mode 100644 index 000000000..12ae0cdc6 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/sz.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/tc.svg b/studio-desktop/src/main/java/studio/flags/tc.svg new file mode 100644 index 000000000..0b5af9811 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/tc.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/td.svg b/studio-desktop/src/main/java/studio/flags/td.svg new file mode 100644 index 000000000..8201312b6 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/td.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/tf.svg b/studio-desktop/src/main/java/studio/flags/tf.svg new file mode 100644 index 000000000..1ab7f6a8f --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/tf.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/tg.svg b/studio-desktop/src/main/java/studio/flags/tg.svg new file mode 100644 index 000000000..32c28af4f --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/tg.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/th.svg b/studio-desktop/src/main/java/studio/flags/th.svg new file mode 100644 index 000000000..35141d39a --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/th.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/tj.svg b/studio-desktop/src/main/java/studio/flags/tj.svg new file mode 100644 index 000000000..9232ec1d3 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/tj.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/tk.svg b/studio-desktop/src/main/java/studio/flags/tk.svg new file mode 100644 index 000000000..9ff92e5ee --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/tk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/tl.svg b/studio-desktop/src/main/java/studio/flags/tl.svg new file mode 100644 index 000000000..4fbb245e9 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/tl.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/tm.svg b/studio-desktop/src/main/java/studio/flags/tm.svg new file mode 100644 index 000000000..ac39386b8 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/tm.svg @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/tn.svg b/studio-desktop/src/main/java/studio/flags/tn.svg new file mode 100644 index 000000000..ab3e36e4b --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/tn.svg @@ -0,0 +1,4 @@ + + + + diff --git a/studio-desktop/src/main/java/studio/flags/to.svg b/studio-desktop/src/main/java/studio/flags/to.svg new file mode 100644 index 000000000..3f1b60079 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/to.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/tr.svg b/studio-desktop/src/main/java/studio/flags/tr.svg new file mode 100644 index 000000000..0fe9017c9 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/tr.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/tt.svg b/studio-desktop/src/main/java/studio/flags/tt.svg new file mode 100644 index 000000000..0f7f26e7e --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/tt.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/tv.svg b/studio-desktop/src/main/java/studio/flags/tv.svg new file mode 100644 index 000000000..098b91610 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/tv.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/tw.svg b/studio-desktop/src/main/java/studio/flags/tw.svg new file mode 100644 index 000000000..83f4e442e --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/tw.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/tz.svg b/studio-desktop/src/main/java/studio/flags/tz.svg new file mode 100644 index 000000000..846cbb5ad --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/tz.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ua.svg b/studio-desktop/src/main/java/studio/flags/ua.svg new file mode 100644 index 000000000..7ceb89463 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ua.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ug.svg b/studio-desktop/src/main/java/studio/flags/ug.svg new file mode 100644 index 000000000..a82a8fcf6 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ug.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/um.svg b/studio-desktop/src/main/java/studio/flags/um.svg new file mode 100644 index 000000000..b8d4502e6 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/um.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/un.svg b/studio-desktop/src/main/java/studio/flags/un.svg new file mode 100644 index 000000000..322569d14 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/un.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/us.svg b/studio-desktop/src/main/java/studio/flags/us.svg new file mode 100644 index 000000000..a7220476a --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/us.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/uy.svg b/studio-desktop/src/main/java/studio/flags/uy.svg new file mode 100644 index 000000000..f6b08b280 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/uy.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/uz.svg b/studio-desktop/src/main/java/studio/flags/uz.svg new file mode 100644 index 000000000..3385bc5aa --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/uz.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/va.svg b/studio-desktop/src/main/java/studio/flags/va.svg new file mode 100644 index 000000000..9348ad238 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/va.svg @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/vc.svg b/studio-desktop/src/main/java/studio/flags/vc.svg new file mode 100644 index 000000000..21d41a805 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/vc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ve.svg b/studio-desktop/src/main/java/studio/flags/ve.svg new file mode 100644 index 000000000..665135ba6 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ve.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/vg.svg b/studio-desktop/src/main/java/studio/flags/vg.svg new file mode 100644 index 000000000..cfcbbba42 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/vg.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/vi.svg b/studio-desktop/src/main/java/studio/flags/vi.svg new file mode 100644 index 000000000..081f8c6c9 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/vi.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/vn.svg b/studio-desktop/src/main/java/studio/flags/vn.svg new file mode 100644 index 000000000..49a68f02e --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/vn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/vu.svg b/studio-desktop/src/main/java/studio/flags/vu.svg new file mode 100644 index 000000000..0e695b95a --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/vu.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/wf.svg b/studio-desktop/src/main/java/studio/flags/wf.svg new file mode 100644 index 000000000..5ba64e4da --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/wf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ws.svg b/studio-desktop/src/main/java/studio/flags/ws.svg new file mode 100644 index 000000000..ab08fdb91 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ws.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/xk.svg b/studio-desktop/src/main/java/studio/flags/xk.svg new file mode 100644 index 000000000..28bdeadbd --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/xk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/xx.svg b/studio-desktop/src/main/java/studio/flags/xx.svg new file mode 100644 index 000000000..5a44cb701 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/xx.svg @@ -0,0 +1,4 @@ + + + + diff --git a/studio-desktop/src/main/java/studio/flags/ye.svg b/studio-desktop/src/main/java/studio/flags/ye.svg new file mode 100644 index 000000000..2ccb23bf6 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/ye.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/yt.svg b/studio-desktop/src/main/java/studio/flags/yt.svg new file mode 100644 index 000000000..41a4408cb --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/yt.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/za.svg b/studio-desktop/src/main/java/studio/flags/za.svg new file mode 100644 index 000000000..397696eda --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/za.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/zm.svg b/studio-desktop/src/main/java/studio/flags/zm.svg new file mode 100644 index 000000000..a2084fb28 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/zm.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/flags/zw.svg b/studio-desktop/src/main/java/studio/flags/zw.svg new file mode 100644 index 000000000..98e1a42d4 --- /dev/null +++ b/studio-desktop/src/main/java/studio/flags/zw.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/studio-desktop/src/main/java/studio/localization/Translation.properties b/studio-desktop/src/main/java/studio/localization/Translation.properties new file mode 100644 index 000000000..4d085f387 --- /dev/null +++ b/studio-desktop/src/main/java/studio/localization/Translation.properties @@ -0,0 +1,36 @@ +Frame.Title=Lunii Transfer +Device.Information=Device information: +Device.serialnum=Serial number: +Device.UUID=UUID: +Device.firmware=Firmware: +Device.size=Size : +Device.used=Used : +Device.download=Download +Device.list=Device +Device.validate=Commit +Device.refresh=Refresh +Device.cancel=Cancel +Device.search=Search +Transfer.notransfer=No transfer +Transfering.transferringpack=Transferring pack {} +Transfering.deletingpack=Deleting pack {} +Transfering.reordering=Ordering packs +Transfering.done=Done +Transfer.globalProgress=Progress +Library.list=List +Library.refresh=Refresh library +Library.filteronlynotpresentonbox=Only not present +File.title=File +File.import=Import... +File.quit=Quit +File.export=Export... +Export.SaveFile=Save file +Library.search=Search +Library.searchFrom=From +Library.searchTo=To +Library.changePath=Change library path... +Library.ChooseLibraryFolder=Choose file +Import.ChooseImportEntry=Choose file or folder +JsonPackCell.age1=From {} years +JsonPackCell.age2=To {} years +JsonPackCell.age3=From {} to {} years \ No newline at end of file diff --git a/studio-desktop/src/main/java/studio/localization/Translation_fr_FR.properties b/studio-desktop/src/main/java/studio/localization/Translation_fr_FR.properties new file mode 100644 index 000000000..51332d301 --- /dev/null +++ b/studio-desktop/src/main/java/studio/localization/Translation_fr_FR.properties @@ -0,0 +1,36 @@ +Frame.Title=Lunii Transfert +Device.Information=Information sur la lunii: +Device.serialnum=Numéro de série: +Device.UUID=UUID: +Device.firmware=Firmware: +Device.size=Taille : +Device.used=Utilisé : +Device.download=Télécharger +Device.list=Boite lunii +Device.validate=Valider +Device.refresh=Rafraichir +Device.cancel=Annuler +Device.search=Rechercher +Transfer.notransfer=Aucun transfert +Transfering.transferringpack=Transfert du pack {} +Transfering.deletingpack=Suppression du pack {} +Transfering.reordering=Tri des packs +Transfering.done=Terminé +Transfer.globalProgress=Progression +Library.list=Liste +Library.refresh=Rafraichir la librairie +Library.filteronlynotpresentonbox=Seulement non présent +File.title=Fichier +File.import=Importer... +File.quit=Quitter +File.export=Exporter... +Export.SaveFile=Sauvegarder le fichier +Library.search=Rechercher +Library.searchFrom=De +Library.searchTo=À +Library.changePath=Changer le répertoire de la librairie... +Library.ChooseLibraryFolder=Choisir le répertoire +Import.ChooseImportEntry=Choisissez un fichier ou répertoire... +JsonPackCell.age1=À partir de {} ans +JsonPackCell.age2=Jusqu'à {} ans +JsonPackCell.age3=De {} à {} ans \ No newline at end of file diff --git a/studio-desktop/src/main/resources/META-INF/MANIFEST.MF b/studio-desktop/src/main/resources/META-INF/MANIFEST.MF new file mode 100644 index 000000000..78692c366 --- /dev/null +++ b/studio-desktop/src/main/resources/META-INF/MANIFEST.MF @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +Created-By: Apache Maven 3.9.0 +Built-By: horfee +Build-Jdk: 19.0.2 +Main-Class: studio.GUI + diff --git a/studio-desktop/src/main/resources/log4j2.xml b/studio-desktop/src/main/resources/log4j2.xml new file mode 100644 index 000000000..f41508df6 --- /dev/null +++ b/studio-desktop/src/main/resources/log4j2.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/studio-desktop/src/main/resources/logolunii.jpeg b/studio-desktop/src/main/resources/logolunii.jpeg new file mode 100644 index 000000000..5341b4d6f Binary files /dev/null and b/studio-desktop/src/main/resources/logolunii.jpeg differ diff --git a/studio-desktop/src/main/resources/lunii.png b/studio-desktop/src/main/resources/lunii.png new file mode 100644 index 000000000..4aeec981f Binary files /dev/null and b/studio-desktop/src/main/resources/lunii.png differ diff --git a/studio-desktop/src/main/resources/studio.bat b/studio-desktop/src/main/resources/studio.bat new file mode 100755 index 000000000..f0b5a0a10 --- /dev/null +++ b/studio-desktop/src/main/resources/studio.bat @@ -0,0 +1,7 @@ +@echo off + + +set VERSION=${project.build.finalName} +set STUDIO_CP=".\lib\*;%VERSION%.jar;." + +java -cp "%STUDIO_CP%" -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager studio.GUI diff --git a/studio-desktop/src/main/resources/studio.sh b/studio-desktop/src/main/resources/studio.sh new file mode 100755 index 000000000..91b118867 --- /dev/null +++ b/studio-desktop/src/main/resources/studio.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +ARCH="$(uname -s)" +APP_PATH=`dirname $0` +VERSION=${project.build.finalName} + +if [ "${ARCH}" == "Darwin" ]; then + STUDIO_CP=$APP_PATH/lib/*:$APP_PATH/$VERSION.jar:$APP_PATH/../Resources/Java/lib/*:$APP_PATH/../Resources/Java/$VERSION.jar + java -Dcom.apple.mrj.application.apple.menu.about.name="Lunii Transfert" -Dapple.awt.application.name="Lunii Transfert" -Xdock:description="Lunii Transfert" -Xdock:icon=$APP_PATH/../Resources/lunii.png -cp $STUDIO_CP -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager studio.GUI +else + STUDIO_CP=$APP_PATH/lib/*:$APP_PATH:$APP_PATH/$VERSION.jar + java -cp $STUDIO_CP -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager studio.GUI +fi