Merge commit 'e6bb1700749980e69b5e913acbfd276f129c24dc'
[nikiroo-utils.git] / src / jexer / demos / Demo6.java
index fba67a07a80101904018d56cddc4e9b21b6a1053..41d1f2c3f323b84a4feaa583534a34c793f06344 100644 (file)
@@ -3,7 +3,7 @@
  *
  * The MIT License (MIT)
  *
- * Copyright (C) 2017 Kevin Lamonte
+ * Copyright (C) 2019 Kevin Lamonte
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  */
 package jexer.demos;
 
+import java.util.ResourceBundle;
+
+import jexer.TApplication;
 import jexer.backend.*;
+import jexer.demos.DemoApplication;
 
 /**
  * This class shows off the use of MultiBackend and MultiScreen.
  */
 public class Demo6 {
 
+    /**
+     * Translated strings.
+     */
+    private static final ResourceBundle i18n = ResourceBundle.getBundle(Demo6.class.getName());
+
+    // ------------------------------------------------------------------------
+    // Demo6 ------------------------------------------------------------------
+    // ------------------------------------------------------------------------
+
     /**
      * Main entry point.
      *
@@ -42,22 +55,91 @@ public class Demo6 {
      */
     public static void main(final String [] args) {
         try {
+
+            /*
+             * In this demo we will create two applications spanning three
+             * screens.  One of the applications will have both an ECMA48
+             * screen and a Swing screen, with all I/O mirrored between them.
+             * The second application will have a Swing screen containing a
+             * window showing the first application, also mirroring I/O
+             * between the window and the other two screens.
+             */
+
             /*
-             * Spin up a Swing backend to match the ECMA48 backend on
-             * System.in/out.
+             * We create the first screen and use it to establish a
+             * MultiBackend.
              */
-            ECMA48Backend ecmaBackend = new ECMA48Backend(new Object(), null,
-                null);
+            ECMA48Backend ecmaBackend = new ECMA48Backend();
             MultiBackend multiBackend = new MultiBackend(ecmaBackend);
+
+            /*
+             * Now we create the first application (a standard demo).
+             */
             DemoApplication demoApp = new DemoApplication(multiBackend);
+
+            /*
+             * We will need the width and height of the ECMA48 screen, so get
+             * the Screen reference now.
+             */
             Screen multiScreen = multiBackend.getScreen();
 
-            SwingBackend swingBackend = new SwingBackend(new Object(),
-                multiScreen.getWidth(), multiScreen.getHeight(), 16);
+            /*
+             * Now we create the second screen (backend) for the first
+             * application.  It will be the same size as the ECMA48 screen,
+             * with a font size of 16 points.
+             */
+            SwingBackend swingBackend = new SwingBackend(multiScreen.getWidth(),
+                multiScreen.getHeight(), 16);
+
+            /*
+             * Add this screen to the MultiBackend, and at this point we have
+             * one demo application spanning two physical screens.
+             */
             multiBackend.addBackend(swingBackend);
             multiBackend.setListener(demoApp);
 
+            /*
+             * Time for the second application.  This one will have a single
+             * window mirroring the contents of the first application.  Let's
+             * make it a little larger than the first application's
+             * width/height.
+             */
+            int width = multiScreen.getWidth();
+            int height = multiScreen.getHeight();
+
+            /*
+             * Make a new Swing window for the second application.
+             */
+            SwingBackend monitorBackend = new SwingBackend(width + 5,
+                height + 5, 20);
+
+            /*
+             * Setup the second application, give it the basic file and
+             * window menus.
+             */
+            TApplication monitor = new TApplication(monitorBackend);
+            monitor.addToolMenu();
+            monitor.addFileMenu();
+            monitor.addWindowMenu();
+
+            /*
+             * Now add the third screen to the first application.  We want to
+             * change the object it locks on in its draw() method to the
+             * MultiScreen, that will dramatically reduce (not totally
+             * eliminate) screen tearing/artifacts.
+             */
+            TWindowBackend windowBackend = new TWindowBackend(demoApp,
+                monitor, i18n.getString("monitorWindow"),
+                width + 2, height + 2);
+            windowBackend.setDrawLock(multiScreen);
+            windowBackend.setOtherApplication(demoApp);
+            multiBackend.addBackend(windowBackend);
+
+            /*
+             * Three screens, two applications: spin them up!
+             */
             (new Thread(demoApp)).start();
+            (new Thread(monitor)).start();
         } catch (Exception e) {
             e.printStackTrace();
         }