diff --git a/src/main/java/rdiger36/StudioBridge/MainMenu.java b/src/main/java/rdiger36/StudioBridge/MainMenu.java index 251c71a..1bec839 100644 --- a/src/main/java/rdiger36/StudioBridge/MainMenu.java +++ b/src/main/java/rdiger36/StudioBridge/MainMenu.java @@ -47,7 +47,7 @@ public class MainMenu { static String PrinterIP, PrinterName, PrinterSerial, PrinterType; // Application version - static String version = "102"; + static String version = "105"; // Set boolean for checking updates on startup static boolean checkForUpdate = true; @@ -245,6 +245,18 @@ public void actionPerformed(ActionEvent e) { } }); + JMenuItem mntmMultiPrinterSetup = new JMenuItem("Multiple Printer Setup"); + mnSettings.add(mntmMultiPrinterSetup); + + mntmMultiPrinterSetup.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + new MultiPrinterSetup(frmStudioBridge); + + } + }); + // Action listener for copyright button btnCopy.addActionListener(new ActionListener() { @Override @@ -284,7 +296,17 @@ public void actionPerformed(ActionEvent e) { } } - UDPPackage.send(frmStudioBridge, txtIP.getText(), txtSerial.getText(), getModel(cbxModel.getSelectedItem().toString()), txtName.getText()); + // Determine which UDP port (2021 or 1990) is in use, or set to 0 if none is available + int remoteUdpPort = UDPPackage.getAvailableUDPPort(); + + // Check if a valid port was assigned to remoteUdpPort + if (remoteUdpPort > 0) { + + UDPPackage.send(frmStudioBridge, txtIP.getText(), txtSerial.getText(), getModel(cbxModel.getSelectedItem().toString()), txtName.getText(), remoteUdpPort, false); + } else { + // Show a warning if Bambu Studio is not running + new DialogOneButton(frmStudioBridge, null, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Warning! Bambu Studio is not running!", "Ok").showDialog(); + } } }); @@ -326,7 +348,7 @@ public void actionPerformed(ActionEvent e) { String profile = cbxProfile.getSelectedItem().toString(); - if (!profile.equals("New profile") || !profile.equals("Import profile") || !profile.equals("---")) { + if (!profile.equals("New profile") && !profile.equals("Import profile") && !profile.equals("---")) { int response = new DialogTwoButtons(frmStudioBridge, null,new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Attention! Do you want to delete the profile: \"" + cbxProfile.getSelectedItem() + "\"?", "Yes", "No").showDialog(); @@ -370,15 +392,24 @@ public void actionPerformed(ActionEvent e) { setProfile(profilePath); cbxProfile.addItem(profileName); cbxProfile.setSelectedItem(profileName); + } else { + cbxProfile.setSelectedItem("New profile"); } } else if (cbxProfile.getSelectedItem().toString().equals("---")) { - if (!MainMenu.lastUsedProfile.equals("New profile") && !MainMenu.lastUsedProfile.equals("Import profile") && !MainMenu.lastUsedProfile.equals("---")) { - cbxProfile.setSelectedItem(MainMenu.lastUsedProfile); - } else { - cbxProfile.setSelectedItem("New profile"); - } + if (MainMenu.lastUsedProfile != null) { + + if (!MainMenu.lastUsedProfile.equals("New profile") && !MainMenu.lastUsedProfile.equals("Import profile") && !MainMenu.lastUsedProfile.equals("---")) { + cbxProfile.setSelectedItem(MainMenu.lastUsedProfile); + } else { + cbxProfile.setSelectedItem("New profile"); + } + + } else { + cbxProfile.setSelectedItem("New profile"); + } + } else { // Construct the path to the profile configuration file. @@ -465,7 +496,7 @@ private void getAllProfiles(JComboBox comboBox) { * @param model The model name as selected by the user. * @return The formatted model name. */ - private String getModel(String model) { + public static String getModel(String model) { switch (model) { case "A1": model = "N2S"; break; case "A1 Mini": model = "N1"; break; diff --git a/src/main/java/rdiger36/StudioBridge/MultiPrinterSetup.java b/src/main/java/rdiger36/StudioBridge/MultiPrinterSetup.java new file mode 100644 index 0000000..e0149d9 --- /dev/null +++ b/src/main/java/rdiger36/StudioBridge/MultiPrinterSetup.java @@ -0,0 +1,292 @@ +package rdiger36.StudioBridge; + +import java.awt.Dialog.ModalExclusionType; +import java.awt.Dimension; +import java.awt.Toolkit; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.SwingUtilities; +import javax.swing.table.DefaultTableModel; +import net.miginfocom.swing.MigLayout; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JProgressBar; + +/** + * Class responsible for managing the setup of multiple printers within a GUI. + * Provides functionality to import printers, select/deselect them, and send configuration packages. + */ +public class MultiPrinterSetup { + private JTable table; + + private volatile boolean stopThread = false; + private volatile boolean printerSelected = false; + + private static ArrayList errors = new ArrayList<>(); + + /** + * Constructor that initializes the MultiPrinterSetup dialog. + * + * @param frmStudioBridge The parent JFrame for positioning the dialog. + */ + @SuppressWarnings("serial") + public MultiPrinterSetup(JFrame frmStudioBridge) { + JDialog dialInfo = new JDialog(); + dialInfo.setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE); + dialInfo.setModal(true); + dialInfo.setAlwaysOnTop(true); + dialInfo.setTitle("Multiple Printer Setup"); + dialInfo.setIconImage(Toolkit.getDefaultToolkit().getImage(MultiPrinterSetup.class.getResource("/icon.png"))); + dialInfo.setBounds(100, 100, 602, 482); + dialInfo.toFront(); + dialInfo.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + stopThread = true; + dialInfo.dispose(); + } + }); + + JScrollPane scrollPane = new JScrollPane(); + + table = new JTable(); + table.setFocusTraversalKeysEnabled(false); + table.setFocusable(false); + table.setModel(new DefaultTableModel( + new Object[][] {}, + new String[] { "Name", "IP-Address", "Serial", "Model", "Send Package" } + ) { + Class[] columnTypes = new Class[] { + Object.class, Object.class, Object.class, Object.class, Boolean.class + }; + + public Class getColumnClass(int columnIndex) { + return columnTypes[columnIndex]; + } + }); + + // Set preferred column widths + table.getColumnModel().getColumn(0).setPreferredWidth(110); + table.getColumnModel().getColumn(1).setPreferredWidth(164); + table.getColumnModel().getColumn(2).setPreferredWidth(159); + table.getColumnModel().getColumn(3).setPreferredWidth(108); + table.getColumnModel().getColumn(4).setPreferredWidth(93); + scrollPane.setViewportView(table); + + dialInfo.getContentPane().setLayout(new MigLayout("", "[188.00,grow][223.00,grow][390.00][]", "[grow][bottom][]")); + dialInfo.getContentPane().add(scrollPane, "cell 0 0 4 1,grow"); + + importPrinters(table); + + // Adjust scroll pane size based on content + int maxVisibleRows = 10; + int rowHeight = table.getRowHeight(); + int tableHeaderHeight = table.getTableHeader().getPreferredSize().height; + int visibleRows = Math.min(table.getRowCount(), maxVisibleRows); + int preferredHeight = (rowHeight * visibleRows) + tableHeaderHeight + 5; + int totalColumnWidth = 0; + + for (int col = 0; col < table.getColumnCount(); col++) { + totalColumnWidth += table.getColumnModel().getColumn(col).getPreferredWidth(); + } + + int padding = 30; + scrollPane.setPreferredSize(new Dimension(totalColumnWidth + padding, preferredHeight)); + + JProgressBar progressBar = new JProgressBar(); + progressBar.setIndeterminate(true); + progressBar.setVisible(false); + progressBar.setStringPainted(true); + dialInfo.getContentPane().add(progressBar, "cell 1 1,grow"); + + JButton btnSendPrinters = new JButton("Send selected Printers"); + btnSendPrinters.addActionListener(e -> sendSelectedPrinters(frmStudioBridge, dialInfo, progressBar)); + dialInfo.getContentPane().add(btnSendPrinters, "cell 0 1,grow"); + + JButton btnSelAll = new JButton("Select All"); + btnSelAll.addActionListener(e -> setAllBooleans(true)); + dialInfo.getContentPane().add(btnSelAll, "cell 2 1,alignx right"); + + JButton btnDeSelAll = new JButton("Deselect All"); + btnDeSelAll.addActionListener(e -> setAllBooleans(false)); + dialInfo.getContentPane().add(btnDeSelAll, "cell 3 1,alignx left"); + + dialInfo.requestFocus(); + dialInfo.pack(); + dialInfo.setLocationRelativeTo(frmStudioBridge); + dialInfo.setVisible(true); + } + + /** + * Imports printer configurations from files and populates the JTable. + * + * @param table The JTable to populate with printer data. + */ + private void importPrinters(JTable table) { + DefaultTableModel model = (DefaultTableModel) table.getModel(); + File folder = new File(MainMenu.ProfilesDir); + + if (folder.isDirectory()) { + File[] files = folder.listFiles(); + + if (files != null) { + for (File file : files) { + if (file.isFile() && file.toString().endsWith("sbp")) { + try (BufferedReader br = new BufferedReader(new FileReader(file))) { + String line, ipAddress = "", printerSN = "", printerType = "", printerName = ""; + + while ((line = br.readLine()) != null) { + String[] parts = line.split("=", 2); + if (parts.length == 2) { + switch (parts[0].trim()) { + case "IP-Address": ipAddress = parts[1].trim(); break; + case "PrinterSN": printerSN = parts[1].trim(); break; + case "PrinterType": printerType = getModel(parts[1].trim()); break; + case "PrinterName": printerName = parts[1].trim(); break; + } + } + } + model.addRow(new Object[]{printerName, ipAddress, printerSN, printerType, false}); + + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + } + + /** + * Selects or deselects all printers in the table. + * + * @param value true to select all, false to deselect all. + */ + private void setAllBooleans(boolean value) { + DefaultTableModel model = (DefaultTableModel) table.getModel(); + for (int i = 0; i < model.getRowCount(); i++) { + model.setValueAt(value, i, 4); + } + } + + /** + * Maps model codes to model names. + * + * @param model The model code as a string. + * @return The corresponding model name. + */ + private String getModel(String model) { + switch (model) { + case "0": return "A1"; + case "1": return "A1 Mini"; + case "2": return "P1P"; + case "3": return "P1S"; + case "4": return "X1"; + case "5": return "X1C"; + case "6": return "X1E"; + default: return model; + } + } + + /** + * Handles the process of sending selected printers' data. + * + * @param frmStudioBridge The parent JFrame. + * @param dialInfo The dialog interface. + * @param progressBar The progress bar to indicate sending status. + */ + private void sendSelectedPrinters(JFrame frmStudioBridge, JDialog dialInfo, JProgressBar progressBar) { + // This method handles the sending logic for selected printers. + + stopThread = false; + errors.clear(); + Thread sendingThread = new Thread(() -> { + progressBar.setString("Check Printers..."); + progressBar.setVisible(true); + + printerSelected = false; + + // Determine which UDP port (2021 or 1990) is in use, or set to 0 if none is available + int remoteUdpPort = UDPPackage.getAvailableUDPPort(); + + // Check if a valid port was assigned to remoteUdpPort + if (remoteUdpPort > 0) { + + DefaultTableModel model = (DefaultTableModel) table.getModel(); + int rowCount = model.getRowCount(); + + for (int i = 0; i < rowCount && !stopThread; i++) { + Boolean shouldSend = (Boolean) model.getValueAt(i, 4); + if (shouldSend != null && shouldSend) { + + printerSelected = true; + + String NAME = (String) model.getValueAt(i, 0); + String IP_ADRESS = (String) model.getValueAt(i, 1); + String SERIAL = (String) model.getValueAt(i, 2); + String MODEL = (String) model.getValueAt(i, 3); + + SwingUtilities.invokeLater(() -> progressBar.setString("Send Package for " + NAME)); + + if (!UDPPackage.send(frmStudioBridge, IP_ADRESS, SERIAL, MainMenu.getModel(MODEL), NAME, remoteUdpPort, true)) { + errors.add(NAME + " - " + IP_ADRESS + " - " + MODEL); + } + + try { + Thread.sleep(1000); // Simulierte Verzögerung + } catch (InterruptedException e) { + // Thread wurde unterbrochen, daher beenden wir den Prozess + Thread.currentThread().interrupt(); + break; + } + } + } + + SwingUtilities.invokeLater(() -> { + progressBar.setVisible(false); + if (!stopThread) { + dialInfo.setModal(false); + if (printerSelected) { + if (!errors.isEmpty()) { + String errorsOn = ""; + + for (String error : errors) { + errorsOn = errorsOn + error + "
"; + } + + new DialogOneButton(null, dialInfo, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Attention! Following printers could not send to Bambu Studio:
" + errorsOn + "", "Ok").showDialog(); + } else { + new DialogOneButton(null, dialInfo, new ImageIcon(MainMenu.class.getResource("/success.png")), "Packages sent to Bambu Studio", "Ok").showDialog(); + } + } else { + new DialogOneButton(null, dialInfo, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Attention! Please select at least one printer!", "Back").showDialog(); + } + dialInfo.setModal(true); + } + }); + + + + } else { + SwingUtilities.invokeLater(() -> { + progressBar.setVisible(false); + if (!stopThread) { + dialInfo.setModal(false); + new DialogOneButton(null, dialInfo, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Warning! Bambu Studio is not running!", "Ok").showDialog(); + dialInfo.setModal(true); + } + }); + } + }); + + sendingThread.start(); + } +} \ No newline at end of file diff --git a/src/main/java/rdiger36/StudioBridge/UDPPackage.java b/src/main/java/rdiger36/StudioBridge/UDPPackage.java index c7d9954..e029390 100644 --- a/src/main/java/rdiger36/StudioBridge/UDPPackage.java +++ b/src/main/java/rdiger36/StudioBridge/UDPPackage.java @@ -9,7 +9,6 @@ import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Date; - import javax.swing.ImageIcon; import javax.swing.JFrame; @@ -29,7 +28,7 @@ * */ public class UDPPackage { - + /** * Sends a specific UDP data packet to the local Bambu Studio instance. * @@ -39,63 +38,58 @@ public class UDPPackage { * @param PrinterModel The model of the 3D printer. * @param PrinterName The display name of the 3D printer. */ - public static void send(JFrame mainFrame, String printerIP, String PrinterSN, String PrinterModel, String PrinterName) { + public static boolean send(JFrame mainFrame, String printerIP, String PrinterSN, String PrinterModel, String PrinterName, int remoteUdpPort, boolean multiMode) { String localhost = "127.0.0.1"; // IP address of the local PC String PrinterSignal = "-44"; // WiFi signal quality String PrinterConnection = "lan"; // Connection mode (LAN) String PrinterBindCloud = "free"; // Cloud status (not connected) - - // Determine which UDP port (2021 or 1990) is in use, or set to 0 if none is available - int remoteUdpPort = getAvailableUDPPort(); - int sourceUdpPort = 0; // Source port (0 = system assigned) - // Check if a valid port was assigned to remoteUdpPort - if (remoteUdpPort > 0) { - try { - // Current date for HTTP headers - String date = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z").format(new Date()); - - // Create the message to be sent - String message = "HTTP/1.1 200 OK\r\n" + - "Server: Buildroot/2018.02-rc3 UPnP/1.0 ssdpd/1.8\r\n" + - "Date: " + date + "\r\n" + - "Location: " + printerIP + "\r\n" + - "ST: urn:bambulab-com:device:3dprinter:1\r\n" + - "EXT:\r\n" + - "USN: " + PrinterSN + "\r\n" + - "Cache-Control: max-age=1800\r\n" + - "DevModel.bambu.com: " + PrinterModel + "\r\n" + - "DevName.bambu.com: " + PrinterName + "\r\n" + - "DevSignal.bambu.com: " + PrinterSignal + "\r\n" + - "DevConnect.bambu.com: " + PrinterConnection + "\r\n" + - "DevBind.bambu.com: " + PrinterBindCloud + "\r\n\r\n"; + boolean success = false; + + try { + // Current date for HTTP headers + String date = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z").format(new Date()); - // Initialize the UDP client - DatagramSocket udpClient = new DatagramSocket(sourceUdpPort); - byte[] byteBuffer = message.getBytes(StandardCharsets.US_ASCII); - InetAddress remoteIp = InetAddress.getByName(localhost); + // Create the message to be sent + String message = "HTTP/1.1 200 OK\r\n" + + "Server: Buildroot/2018.02-rc3 UPnP/1.0 ssdpd/1.8\r\n" + + "Date: " + date + "\r\n" + + "Location: " + printerIP + "\r\n" + + "ST: urn:bambulab-com:device:3dprinter:1\r\n" + + "EXT:\r\n" + + "USN: " + PrinterSN + "\r\n" + + "Cache-Control: max-age=1800\r\n" + + "DevModel.bambu.com: " + PrinterModel + "\r\n" + + "DevName.bambu.com: " + PrinterName + "\r\n" + + "DevSignal.bambu.com: " + PrinterSignal + "\r\n" + + "DevConnect.bambu.com: " + PrinterConnection + "\r\n" + + "DevBind.bambu.com: " + PrinterBindCloud + "\r\n\r\n"; - // Send the UDP message - DatagramPacket packet = new DatagramPacket(byteBuffer, byteBuffer.length, remoteIp, remoteUdpPort); - udpClient.send(packet); + // Initialize the UDP client + DatagramSocket udpClient = new DatagramSocket(0); + byte[] byteBuffer = message.getBytes(StandardCharsets.US_ASCII); + InetAddress remoteIp = InetAddress.getByName(localhost); - // Confirmation of sent bytes - if (packet.getLength() != byteBuffer.length) { - new DialogOneButton(mainFrame, null, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Warning! Failed to send the package to Bambu Studio!", "Ok").showDialog(); - } else { - new DialogOneButton(mainFrame, null, new ImageIcon(MainMenu.class.getResource("/success.png")), "Package sent successfully to Bambu Studio", "Ok").showDialog(); - } + // Send the UDP message + DatagramPacket packet = new DatagramPacket(byteBuffer, byteBuffer.length, remoteIp, remoteUdpPort); + udpClient.send(packet); - // Close the UDP client - udpClient.close(); - } catch (Exception e) { - // Show a warning that the package could not be sent to Bambu Studio - new DialogOneButton(mainFrame, null, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Warning! Failed to send the package to Bambu Studio!", "Ok").showDialog(); + // Confirmation of sent bytes + if (packet.getLength() != byteBuffer.length) { + if (!multiMode) new DialogOneButton(mainFrame, null, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Warning! Failed to send the package to Bambu Studio!", "Ok").showDialog(); + } else { + if (!multiMode) new DialogOneButton(mainFrame, null, new ImageIcon(MainMenu.class.getResource("/success.png")), "Package sent successfully to Bambu Studio", "Ok").showDialog(); + success = true; } - } else { - // Show a warning if Bambu Studio is not running - new DialogOneButton(mainFrame, null, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Warning! Bambu Studio is not running!", "Ok").showDialog(); + + + // Close the UDP client + udpClient.close(); + } catch (Exception e) { + // Show a warning that the package could not be sent to Bambu Studio + if (!multiMode) new DialogOneButton(mainFrame, null, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Warning! Failed to send the package to Bambu Studio!", "Ok").showDialog(); } + return success; } /** @@ -104,7 +98,7 @@ public static void send(JFrame mainFrame, String printerIP, String PrinterSN, St * * @return the port number if available, or 0 if none are available. */ - private static int getAvailableUDPPort() { + static int getAvailableUDPPort() { int[] portsToCheck = {2021, 1990}; String os = System.getProperty("os.name").toLowerCase(); diff --git a/src/main/java/rdiger36/StudioBridge/UI.java b/src/main/java/rdiger36/StudioBridge/UI.java index 5451a3a..6acbae6 100644 --- a/src/main/java/rdiger36/StudioBridge/UI.java +++ b/src/main/java/rdiger36/StudioBridge/UI.java @@ -22,16 +22,19 @@ public static void changeLAF(boolean mode) { if (mode) { // Set the Look and Feel to a dark theme using FlatLaf UIManager.setLookAndFeel("com.formdev.flatlaf.FlatDarkLaf"); - // Configure additional UI properties for the dark theme - UIManager.put("TitlePane.menuBarEmbedded", true); - UIManager.put("TitlePane.unifiedBackground", true); - UIManager.put("MenuItem.selectionType", "underline"); - FlatLaf.setUseNativeWindowDecorations(true); // Use native decorations for windows - FlatLaf.updateUI(); // Refresh the UI to apply changes + } else { // Revert to the system's default Look and Feel - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + UIManager.setLookAndFeel("com.formdev.flatlaf.FlatLightLaf"); } + + // Configure additional UI properties for the dark theme + UIManager.put("TitlePane.menuBarEmbedded", true); + UIManager.put("TitlePane.unifiedBackground", true); + UIManager.put("MenuItem.selectionType", "underline"); + FlatLaf.setUseNativeWindowDecorations(true); // Use native decorations for windows + FlatLaf.updateUI(); // Refresh the UI to apply changes + } catch (Exception e1) { // Print stack trace if an exception occurs during Look and Feel change e1.printStackTrace(); diff --git a/target/classes/META-INF/maven/rdiger36/StudioBridge/pom.properties b/target/classes/META-INF/maven/rdiger36/StudioBridge/pom.properties index cfce2b6..c9281b4 100644 --- a/target/classes/META-INF/maven/rdiger36/StudioBridge/pom.properties +++ b/target/classes/META-INF/maven/rdiger36/StudioBridge/pom.properties @@ -1,7 +1,7 @@ #Generated by Maven Integration for Eclipse -#Tue Nov 26 18:42:10 CET 2024 +#Tue Feb 04 23:49:14 CET 2025 artifactId=StudioBridge groupId=rdiger36 -m2e.projectLocation=/Users/niklas/Downloads/StudioBridge-main +m2e.projectLocation=/Users/niklas/eclipse-workspace/Workspace/StudioBridge-main m2e.projectName=StudioBridge version=0.0.1-SNAPSHOT diff --git a/target/classes/rdiger36/StudioBridge/MainMenu$10.class b/target/classes/rdiger36/StudioBridge/MainMenu$10.class index 7b1f777..b65ed76 100644 Binary files a/target/classes/rdiger36/StudioBridge/MainMenu$10.class and b/target/classes/rdiger36/StudioBridge/MainMenu$10.class differ diff --git a/target/classes/rdiger36/StudioBridge/MainMenu$11.class b/target/classes/rdiger36/StudioBridge/MainMenu$11.class new file mode 100644 index 0000000..82fefa6 Binary files /dev/null and b/target/classes/rdiger36/StudioBridge/MainMenu$11.class differ diff --git a/target/classes/rdiger36/StudioBridge/MainMenu$5.class b/target/classes/rdiger36/StudioBridge/MainMenu$5.class index 641ae20..f6e70dd 100644 Binary files a/target/classes/rdiger36/StudioBridge/MainMenu$5.class and b/target/classes/rdiger36/StudioBridge/MainMenu$5.class differ diff --git a/target/classes/rdiger36/StudioBridge/MainMenu$6.class b/target/classes/rdiger36/StudioBridge/MainMenu$6.class index 0b14775..8bb772a 100644 Binary files a/target/classes/rdiger36/StudioBridge/MainMenu$6.class and b/target/classes/rdiger36/StudioBridge/MainMenu$6.class differ diff --git a/target/classes/rdiger36/StudioBridge/MainMenu$7.class b/target/classes/rdiger36/StudioBridge/MainMenu$7.class index 105f840..fab8cbb 100644 Binary files a/target/classes/rdiger36/StudioBridge/MainMenu$7.class and b/target/classes/rdiger36/StudioBridge/MainMenu$7.class differ diff --git a/target/classes/rdiger36/StudioBridge/MainMenu$8.class b/target/classes/rdiger36/StudioBridge/MainMenu$8.class index a0ac14f..eba44f5 100644 Binary files a/target/classes/rdiger36/StudioBridge/MainMenu$8.class and b/target/classes/rdiger36/StudioBridge/MainMenu$8.class differ diff --git a/target/classes/rdiger36/StudioBridge/MainMenu$9.class b/target/classes/rdiger36/StudioBridge/MainMenu$9.class index b6cb642..10d83f0 100644 Binary files a/target/classes/rdiger36/StudioBridge/MainMenu$9.class and b/target/classes/rdiger36/StudioBridge/MainMenu$9.class differ diff --git a/target/classes/rdiger36/StudioBridge/MainMenu.class b/target/classes/rdiger36/StudioBridge/MainMenu.class index a8396ce..d5d9688 100644 Binary files a/target/classes/rdiger36/StudioBridge/MainMenu.class and b/target/classes/rdiger36/StudioBridge/MainMenu.class differ diff --git a/target/classes/rdiger36/StudioBridge/MultiPrinterSetup$1.class b/target/classes/rdiger36/StudioBridge/MultiPrinterSetup$1.class new file mode 100644 index 0000000..1ff5f6b Binary files /dev/null and b/target/classes/rdiger36/StudioBridge/MultiPrinterSetup$1.class differ diff --git a/target/classes/rdiger36/StudioBridge/MultiPrinterSetup$2.class b/target/classes/rdiger36/StudioBridge/MultiPrinterSetup$2.class new file mode 100644 index 0000000..1965615 Binary files /dev/null and b/target/classes/rdiger36/StudioBridge/MultiPrinterSetup$2.class differ diff --git a/target/classes/rdiger36/StudioBridge/MultiPrinterSetup.class b/target/classes/rdiger36/StudioBridge/MultiPrinterSetup.class new file mode 100644 index 0000000..4366ed0 Binary files /dev/null and b/target/classes/rdiger36/StudioBridge/MultiPrinterSetup.class differ diff --git a/target/classes/rdiger36/StudioBridge/UDPPackage.class b/target/classes/rdiger36/StudioBridge/UDPPackage.class index 16646ac..a321c83 100644 Binary files a/target/classes/rdiger36/StudioBridge/UDPPackage.class and b/target/classes/rdiger36/StudioBridge/UDPPackage.class differ diff --git a/target/classes/rdiger36/StudioBridge/UI.class b/target/classes/rdiger36/StudioBridge/UI.class index b5b8ae4..26c6a3c 100644 Binary files a/target/classes/rdiger36/StudioBridge/UI.class and b/target/classes/rdiger36/StudioBridge/UI.class differ