Merge commit '77d3a60869e7a780c6ae069e51530e1eacece5e2'
[fanfix.git] / src / jexer / backend / SwingSessionInfo.java
index 7457f57a0d73b185f1f618e4a035faade6e7c88b..2f74d7012130e0eeda1f44c4721396d645493b35 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"),
@@ -35,7 +35,11 @@ import java.awt.Insets;
  * Swing to support queryWindowSize().  The username is blank, language is
  * "en_US", with a 80x25 text window.
  */
-public final class SwingSessionInfo implements SessionInfo {
+public class SwingSessionInfo implements SessionInfo {
+
+    // ------------------------------------------------------------------------
+    // Variables --------------------------------------------------------------
+    // ------------------------------------------------------------------------
 
     /**
      * The Swing JFrame or JComponent.
@@ -72,6 +76,48 @@ public final class SwingSessionInfo implements SessionInfo {
      */
     private int windowHeight = 25;
 
+    // ------------------------------------------------------------------------
+    // Constructors -----------------------------------------------------------
+    // ------------------------------------------------------------------------
+
+    /**
+     * Public constructor.
+     *
+     * @param swing the Swing JFrame or JComponent
+     * @param textWidth the width of a cell in pixels
+     * @param textHeight the height of a cell in pixels
+     */
+    public SwingSessionInfo(final SwingComponent swing, final int textWidth,
+        final int textHeight) {
+
+        this.swing      = swing;
+        this.textWidth  = textWidth;
+        this.textHeight = textHeight;
+    }
+
+    /**
+     * Public constructor.
+     *
+     * @param swing the Swing JFrame or JComponent
+     * @param textWidth the width of a cell in pixels
+     * @param textHeight the height of a cell in pixels
+     * @param width the number of columns
+     * @param height the number of rows
+     */
+    public SwingSessionInfo(final SwingComponent swing, final int textWidth,
+        final int textHeight, final int width, final int height) {
+
+        this.swing              = swing;
+        this.textWidth          = textWidth;
+        this.textHeight         = textHeight;
+        this.windowWidth        = width;
+        this.windowHeight       = height;
+    }
+
+    // ------------------------------------------------------------------------
+    // SessionInfo ------------------------------------------------------------
+    // ------------------------------------------------------------------------
+
     /**
      * Username getter.
      *
@@ -127,68 +173,54 @@ public final class SwingSessionInfo implements SessionInfo {
     }
 
     /**
-     * Set the dimensions of a single text cell.
-     *
-     * @param textWidth the width of a cell in pixels
-     * @param textHeight the height of a cell in pixels
+     * Re-query the text window size.
      */
-    public void setTextCellDimensions(final int textWidth,
-        final int textHeight) {
+    public void queryWindowSize() {
+        Insets insets = swing.getInsets();
+        int width = swing.getWidth() - insets.left - insets.right;
+        int height = swing.getHeight() - insets.top - insets.bottom;
+        // In theory, if Java reported pixel-perfect dimensions, the
+        // expressions above would precisely line up with the requested
+        // window size from SwingComponent.setDimensions().  In practice,
+        // there appears to be a small difference.  Add half a text cell in
+        // both directions before the division to hopefully reach the same
+        // result as setDimensions() was supposed to give us.
+        width += (textWidth / 2);
+        height += (textHeight / 2);
+        windowWidth = width / textWidth;
+        windowHeight = height / textHeight;
 
-        this.textWidth  = textWidth;
-        this.textHeight = textHeight;
+        /*
+        System.err.printf("queryWindowSize(): frame %d %d window %d %d\n",
+            swing.getWidth(), swing.getHeight(),
+            windowWidth, windowHeight);
+        */
     }
 
+    // ------------------------------------------------------------------------
+    // SwingSessionInfo -------------------------------------------------------
+    // ------------------------------------------------------------------------
+
     /**
-     * Public constructor.
+     * Set the dimensions of a single text cell.
      *
-     * @param swing the Swing JFrame or JComponent
      * @param textWidth the width of a cell in pixels
      * @param textHeight the height of a cell in pixels
      */
-    public SwingSessionInfo(final SwingComponent swing, final int textWidth,
+    public void setTextCellDimensions(final int textWidth,
         final int textHeight) {
 
-        this.swing      = swing;
         this.textWidth  = textWidth;
         this.textHeight = textHeight;
     }
 
     /**
-     * Public constructor.
+     * Getter for the underlying Swing component.
      *
-     * @param swing the Swing JFrame or JComponent
-     * @param textWidth the width of a cell in pixels
-     * @param textHeight the height of a cell in pixels
-     * @param width the number of columns
-     * @param height the number of rows
-     */
-    public SwingSessionInfo(final SwingComponent swing, final int textWidth,
-        final int textHeight, final int width, final int height) {
-
-        this.swing              = swing;
-        this.textWidth          = textWidth;
-        this.textHeight         = textHeight;
-        this.windowWidth        = width;
-        this.windowHeight       = height;
-    }
-
-    /**
-     * Re-query the text window size.
+     * @return the SwingComponent
      */
-    public void queryWindowSize() {
-        Insets insets = swing.getInsets();
-        int width = swing.getWidth() - insets.left - insets.right;
-        int height = swing.getHeight() - insets.top - insets.bottom;
-        windowWidth = width / textWidth;
-        windowHeight = height / textHeight;
-
-        /*
-        System.err.printf("queryWindowSize(): frame %d %d window %d %d\n",
-            swing.getWidth(), swing.getHeight(),
-            windowWidth, windowHeight);
-        */
-
+    public SwingComponent getSwingComponent() {
+        return swing;
     }
 
 }