From 2cd6cfcc403f1fd088a4ae1c90a109c371843cc2 Mon Sep 17 00:00:00 2001 From: Luis <1105281+lpenap@users.noreply.github.com> Date: Tue, 17 Jun 2025 11:30:44 -0300 Subject: [PATCH 1/2] Add side panel with example buttons --- .../example/constructs/app/ui/MainWindow.java | 81 ++++++++++++++++--- 1 file changed, 68 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java b/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java index a112fd3..aa60075 100644 --- a/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java +++ b/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java @@ -8,6 +8,7 @@ import java.io.IOException; import javax.imageio.ImageIO; +import javax.swing.BoxLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; @@ -19,10 +20,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; import com.penapereira.example.constructs.app.properties.ApplicationProperties; import com.penapereira.example.constructs.app.properties.Messages; +import com.penapereira.example.constructs.app.ExampleRunnerInterface; @Component public class MainWindow extends JFrame { @@ -36,8 +39,13 @@ public class MainWindow extends JFrame { @Autowired Messages msg; - @Autowired - ApplicationProperties props; + @Autowired + ApplicationProperties props; + + @Autowired + ApplicationContext ctx; + + private java.util.Map examples; public MainWindow() { super(); @@ -73,19 +81,21 @@ private void loadIcon() { private JPanel getMainComponent() { JPanel mainPanel = new JPanel(new BorderLayout()); - JPanel infoPanel = new JPanel(new GridLayout(4, 1)); - createCenteredTitle(msg.getGreeting(), infoPanel); - createCenteredLabelOnPanel(msg.getInfo(), infoPanel); - createCenteredHyperlink(msg.getHomeUrl(), infoPanel); - mainPanel.add(infoPanel, BorderLayout.NORTH); + JPanel infoPanel = new JPanel(new GridLayout(4, 1)); + createCenteredTitle(msg.getGreeting(), infoPanel); + createCenteredLabelOnPanel(msg.getInfo(), infoPanel); + createCenteredHyperlink(msg.getHomeUrl(), infoPanel); + mainPanel.add(infoPanel, BorderLayout.NORTH); - outputArea = new JTextArea(10, 40); - outputArea.setEditable(false); - JScrollPane scrollPane = new JScrollPane(outputArea); - scrollPane.setBorder(javax.swing.BorderFactory.createTitledBorder(msg.getOutputTitle())); - mainPanel.add(scrollPane, BorderLayout.CENTER); + mainPanel.add(createExamplesPanel(), BorderLayout.WEST); - return mainPanel; + outputArea = new JTextArea(10, 40); + outputArea.setEditable(false); + JScrollPane scrollPane = new JScrollPane(outputArea); + scrollPane.setBorder(javax.swing.BorderFactory.createTitledBorder(msg.getOutputTitle())); + mainPanel.add(scrollPane, BorderLayout.CENTER); + + return mainPanel; } private void createCenteredTitle(String text, JPanel panel) { @@ -117,4 +127,49 @@ public void appendOutput(String text) { } } + private JPanel createExamplesPanel() { + examples = ctx.getBeansOfType(ExampleRunnerInterface.class); + + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + panel.setBorder(javax.swing.BorderFactory.createTitledBorder(msg.getExamplesFound())); + + javax.swing.JButton allButton = new javax.swing.JButton("Run All"); + allButton.addActionListener(e -> runAllExamples()); + panel.add(allButton); + + examples.forEach((name, runner) -> { + String clean = name.replaceFirst("ExampleRunner", ""); + javax.swing.JButton btn = new javax.swing.JButton(clean); + btn.addActionListener(e -> runExample(runner)); + panel.add(btn); + }); + + return panel; + } + + private void runExample(ExampleRunnerInterface runner) { + new Thread(() -> { + try { + log.trace(msg.getSeparator()); + runner.runExample(); + } catch (Exception e) { + log.error("Error executing example", e); + } + }).start(); + } + + private void runAllExamples() { + new Thread(() -> { + examples.values().forEach(r -> { + try { + log.trace(msg.getSeparator()); + r.runExample(); + } catch (Exception e) { + log.error("Error executing example", e); + } + }); + }).start(); + } + } From 6cd4b94c9447667717187fbbf2ba909305650439 Mon Sep 17 00:00:00 2001 From: Luis <1105281+lpenap@users.noreply.github.com> Date: Tue, 17 Jun 2025 12:46:21 -0300 Subject: [PATCH 2/2] feat: add preserve log checkbox --- .../constructs/app/properties/Messages.java | 1 + .../example/constructs/app/ui/MainWindow.java | 19 +++++++++++++++++-- src/main/resources/application.properties | 1 + 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/penapereira/example/constructs/app/properties/Messages.java b/src/main/java/com/penapereira/example/constructs/app/properties/Messages.java index 3c46b0a..7d89040 100644 --- a/src/main/java/com/penapereira/example/constructs/app/properties/Messages.java +++ b/src/main/java/com/penapereira/example/constructs/app/properties/Messages.java @@ -19,4 +19,5 @@ public class Messages { protected String enableDebugToSeeExamplesList; protected String separator; protected String outputTitle; + protected String preserveLog; } diff --git a/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java b/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java index aa60075..aed7bfe 100644 --- a/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java +++ b/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java @@ -15,6 +15,7 @@ import javax.swing.JScrollPane; import javax.swing.JSeparator; import javax.swing.JTextArea; +import javax.swing.JCheckBox; import javax.swing.SwingConstants; import org.slf4j.Logger; @@ -34,7 +35,8 @@ public class MainWindow extends JFrame { private static final long serialVersionUID = 1L; - private JTextArea outputArea; + private JTextArea outputArea; + private JCheckBox preserveLogCheck; @Autowired Messages msg; @@ -93,7 +95,14 @@ private JPanel getMainComponent() { outputArea.setEditable(false); JScrollPane scrollPane = new JScrollPane(outputArea); scrollPane.setBorder(javax.swing.BorderFactory.createTitledBorder(msg.getOutputTitle())); - mainPanel.add(scrollPane, BorderLayout.CENTER); + + preserveLogCheck = new JCheckBox(msg.getPreserveLog()); + + JPanel outputPanel = new JPanel(new BorderLayout()); + outputPanel.add(preserveLogCheck, BorderLayout.NORTH); + outputPanel.add(scrollPane, BorderLayout.CENTER); + + mainPanel.add(outputPanel, BorderLayout.CENTER); return mainPanel; } @@ -149,6 +158,9 @@ private JPanel createExamplesPanel() { } private void runExample(ExampleRunnerInterface runner) { + if (!preserveLogCheck.isSelected()) { + outputArea.setText(""); + } new Thread(() -> { try { log.trace(msg.getSeparator()); @@ -160,6 +172,9 @@ private void runExample(ExampleRunnerInterface runner) { } private void runAllExamples() { + if (!preserveLogCheck.isSelected()) { + outputArea.setText(""); + } new Thread(() -> { examples.values().forEach(r -> { try { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 5fb1a0c..5544824 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -19,5 +19,6 @@ msg.examplesFound=Implemented examples found msg.enableTraceToSeeExamplesDetails= [*] Please enable TRACE log level if you want to see examples output msg.enableDebugToSeeExamplesList= [*] Please enable DEBUG log level if you want to see the examples list msg.outputTitle=Output +msg.preserveLog=Preserve log msg.separator=------------------------------------------------------------- \ No newline at end of file