Code Sketch


n yoiiiiii
By: Mhalsakant School
Category: Programming
import javax.swing._
import java.awt._
import java.awt.event._
import java.awt.geom._
import scala.math._

// ============================================================
// KUNDALI PURAN
// VEDIC KUNDALI CALCULATOR - SINGLE FILE
// ============================================================

val window = new JFrame("KUNDALI PURAN - Vedic Kundali")

window.setDefaultCloseOperation(
  WindowConstants.EXIT_ON_CLOSE
)

window.setSize(1200, 800)
window.setResizable(false)

// ============================================================
// MAIN PANEL
// ============================================================

val mainPanel = new JPanel()
mainPanel.setLayout(null)
mainPanel.setBackground(
  new Color(8, 8, 28)
)

window.setContentPane(mainPanel)

// ============================================================
// TITLE
// ============================================================

val title = new JLabel(
  "<html><center>" +
  "<font color='#FFD76A' size='6'>" +
  "? KUNDALI PURAN ?" +
  "</font><br>" +
  "<font color='#EBD9A0' size='3'>" +
  "Vedic ? Sidereal ? Birth Chart Calculator" +
  "</font>" +
  "</center></html>",
  SwingConstants.CENTER
)

title.setBounds(
  170,
  15,
  860,
  90
)

mainPanel.add(title)

// ============================================================
// INPUT CARD
// ============================================================

val inputCard = new JPanel()
inputCard.setLayout(null)

inputCard.setBackground(
  new Color(24, 20, 50)
)

inputCard.setBorder(
  BorderFactory.createLineBorder(
    new Color(220, 170, 70),
    2
  )
)

inputCard.setBounds(
  35,
  120,
  480,
  610
)

mainPanel.add(inputCard)

// ============================================================
// RESULT CARD
// ============================================================

val resultCard = new JPanel()
resultCard.setLayout(null)

resultCard.setBackground(
  new Color(18, 17, 42)
)

resultCard.setBorder(
  BorderFactory.createLineBorder(
    new Color(220, 170, 70),
    2
  )
)

resultCard.setBounds(
  535,
  120,
  630,
  610
)

mainPanel.add(resultCard)

// ============================================================
// INPUT TITLE
// ============================================================

val inputTitle = new JLabel(
  "? BIRTH DETAILS ?",
  SwingConstants.CENTER
)

inputTitle.setForeground(
  new Color(255, 220, 120)
)

inputTitle.setFont(
  new Font(
    "Serif",
    Font.BOLD,
    24
  )
)

inputTitle.setBounds(
  40,
  20,
  400,
  40
)

inputCard.add(inputTitle)

// ============================================================
// LABEL HELPER
// ============================================================

def addInputLabel(
  text: String,
  y: Int
): JLabel = {

  val label = new JLabel(text)

  label.setForeground(
    new Color(240, 230, 205)
  )

  label.setFont(
    new Font(
      "SansSerif",
      Font.BOLD,
      15
    )
  )

  label.setBounds(
    35,
    y,
    150,
    30
  )

  inputCard.add(label)

  label
}

// ============================================================
// FIELD HELPER
// ============================================================

def addInputField(
  y: Int
): JTextField = {

  val field = new JTextField()

  field.setFont(
    new Font(
      "SansSerif",
      Font.PLAIN,
      16
    )
  )

  field.setBackground(
    new Color(250, 245, 230)
  )

  field.setForeground(
    new Color(30, 25, 40)
  )

  field.setBounds(
    185,
    y,
    255,
    36
  )

  inputCard.add(field)

  field
}

// ============================================================
// INPUTS
// ============================================================

addInputLabel(
  "First Name",
  80
)

val firstName =
  addInputField(77)

addInputLabel(
  "Surname",
  130
)

val surname =
  addInputField(127)

addInputLabel(
  "Birth Date",
  180
)

val birthDate =
  addInputField(177)

birthDate.setToolTipText(
  "DD/MM/YYYY"
)

addInputLabel(
  "Birth Time",
  230
)

val birthTime =
  addInputField(227)

birthTime.setToolTipText(
  "HH:MM:SS"
)

addInputLabel(
  "Birth Place",
  280
)

val birthPlace =
  addInputField(277)

addInputLabel(
  "Latitude",
  330
)

val latitude =
  addInputField(327)

latitude.setToolTipText(
  "Example: 18.5204"
)

addInputLabel(
  "Longitude",
  380
)

val longitude =
  addInputField(377)

longitude.setToolTipText(
  "Example: 73.8567"
)

addInputLabel(
  "Timezone",
  430
)

val timezone =
  addInputField(427)

timezone.setText(
  "5.5"
)

// ============================================================
// INFO
// ============================================================

val smallInfo = new JLabel(
  "<html><center>" +
  "For India normally use timezone <b>5.5</b>.<br>" +
  "Latitude/Longitude should be the actual<br>" +
  "birth-place coordinates for accurate Lagna."
  +
  "</center></html>",
  SwingConstants.CENTER
)

smallInfo.setForeground(
  new Color(210, 195, 160)
)

smallInfo.setFont(
  new Font(
    "SansSerif",
    Font.PLAIN,
    12
  )
)

smallInfo.setBounds(
  30,
  475,
  420,
  55
)

inputCard.add(smallInfo)

// ============================================================
// BUTTON
// ============================================================

val calculateButton =
  new JButton(
    "? CALCULATE KUNDALI ?"
  )

calculateButton.setFont(
  new Font(
    "SansSerif",
    Font.BOLD,
    16
  )
)

calculateButton.setForeground(
  Color.WHITE
)

calculateButton.setBackground(
  new Color(
    160,
    85,
    25
  )
)

calculateButton.setFocusPainted(
  false
)

calculateButton.setBounds(
  55,
  540,
  370,
  48
)

inputCard.add(calculateButton)

// ============================================================
// RESULT TITLE
// ============================================================

val resultTitle =
  new JLabel(
    "? KUNDALI REPORT ?",
    SwingConstants.CENTER
  )

resultTitle.setForeground(
  new Color(
    255,
    220,
    120
  )
)

resultTitle.setFont(
  new Font(
    "Serif",
    Font.BOLD,
    24
  )
)

resultTitle.setBounds(
  40,
  18,
  550,
  40
)

resultCard.add(resultTitle)

// ============================================================
// RESULT TEXT
// ============================================================

val result =
  new JTextArea()

result.setEditable(false)
result.setLineWrap(false)

result.setFont(
  new Font(
    "Monospaced",
    Font.PLAIN,
    14
  )
)

result.setForeground(
  new Color(
    250,
    235,
    190
  )
)

result.setBackground(
  new Color(
    10,
    10,
    28
  )
)

result.setBorder(
  BorderFactory.createLineBorder(
    new Color(
      130,
      100,
      50
    )
  )
)

val scroll =
  new JScrollPane(result)

scroll.setBounds(
  25,
  70,
  580,
  515
)

resultCard.add(scroll)

// ============================================================
// MATH UTILITIES
// ============================================================

def normalize(
  value: Double
): Double = {

  var x = value % 360.0

  if (x < 0) {
    x += 360.0
  }

  x
}

// ============================================================
// JULIAN DAY
// ============================================================

def julianDay(
  year: Int,
  month: Int,
  day: Int,
  hour: Int,
  minute: Int,
  second: Int,
  timezone: Double
): Double = {

  var y = year
  var m = month

  if (m <= 2) {
    y -= 1
    m += 12
  }

  val A =
    floor(y / 100.0)

  val B =
    2.0 - A + floor(A / 4.0)

  val decimalHour =
    hour +
    minute / 60.0 +
    second / 3600.0 -
    timezone

  val jd =
    floor(
      365.25 * (y + 4716)
    ) +
    floor(
      30.6001 * (m + 1)
    ) +
    day +
    B -
    1524.5 +
    decimalHour / 24.0

  jd
}

// ============================================================
// APPROXIMATE LAHIRI AYANAMSHA
// ============================================================

def lahiriAyanamsha(
  jd: Double
): Double = {

  val t =
    (jd - 2451545.0) /
    36525.0

  val ayan =
    23.85675 +
    0.013968 * t

  ayan
}

// ============================================================
// SIDEREAL CONVERSION
// ============================================================

def sidereal(
  tropical: Double,
  jd: Double
): Double = {

  normalize(
    tropical -
    lahiriAyanamsha(jd)
  )
}

// ============================================================
// SIGN
// ============================================================

def signName(
  longitude: Double
): String = {

  val names =
    Array(
      "Mesha (Aries)",
      "Vrishabha (Taurus)",
      "Mithuna (Gemini)",
      "Karka (Cancer)",
      "Simha (Leo)",
      "Kanya (Virgo)",
      "Tula (Libra)",
      "Vrishchika (Scorpio)",
      "Dhanu (Sagittarius)",
      "Makara (Capricorn)",
      "Kumbha (Aquarius)",
      "Meena (Pisces)"
    )

  names(
    floor(
      normalize(longitude) / 30.0
    ).toInt
  )
}

// ============================================================
// DEGREE FORMAT
// ============================================================

def degreeText(
  longitude: Double
): String = {

  val x =
    normalize(longitude)

  val signDegree =
    x % 30.0

  val d =
    floor(signDegree).toInt

  val min =
    floor(
      (signDegree - d) * 60.0
    ).toInt

  val sec =
    floor(
      (
        (
          signDegree - d
        ) * 60.0 - min
      ) * 60.0
    ).toInt

  d + "� " +
  min + "' " +
  sec + "\""
}

// ============================================================
// SUN LONGITUDE
// ============================================================

def sunLongitude(
  jd: Double
): Double = {

  val n =
    jd - 2451545.0

  val L =
    normalize(
      280.460 +
      0.9856474 * n
    )

  val g =
    toRadians(
      normalize(
        357.528 +
        0.9856003 * n
      )
    )

  val lambda =
    L +
    1.915 * sin(g) +
    0.020 * sin(2.0 * g)

  normalize(lambda)
}

// ============================================================
// MOON LONGITUDE
// ============================================================

def moonLongitude(
  jd: Double
): Double = {

  val n =
    jd - 2451545.0

  val L =
    normalize(
      218.316 +
      13.176396 * n
    )

  val M =
    toRadians(
      normalize(
        134.963 +
        13.064993 * n
      )
    )

  val F =
    toRadians(
      normalize(
        93.272 +
        13.229350 * n
      )
    )

  val lon =
    L +
    6.289 * sin(M) +
    1.274 * sin(
      toRadians(
        2.0 * (
          normalize(
            297.850 +
            12.190749 * n
          )
        )
      ) - M
    ) +
    0.658 * sin(
      toRadians(
        2.0 * (
          normalize(
            357.529 +
            0.9856003 * n
          )
        )
      )
    ) +
    0.214 * sin(2.0 * M) -
    0.186 * sin(
      toRadians(
        normalize(
          357.529 +
          0.9856003 * n
        )
      )
    )

  normalize(lon)
}

// ============================================================
// MERCURY APPROXIMATION
// ============================================================

def mercuryLongitude(
  jd: Double
): Double = {

  val n =
    jd - 2451545.0

  normalize(
    252.25084 +
    4.09233445 * n
  )
}

// ============================================================
// VENUS APPROXIMATION
// ============================================================

def venusLongitude(
  jd: Double
): Double = {

  val n =
    jd - 2451545.0

  normalize(
    181.97973 +
    1.60213034 * n
  )
}

// ============================================================
// MARS APPROXIMATION
// ============================================================

def marsLongitude(
  jd: Double
): Double = {

  val n =
    jd - 2451545.0

  normalize(
    355.433 +
    0.5240208 * n
  )
}

// ============================================================
// JUPITER APPROXIMATION
// ============================================================

def jupiterLongitude(
  jd: Double
): Double = {

  val n =
    jd - 2451545.0

  normalize(
    34.351 +
    0.0830853 * n
  )
}

// ============================================================
// SATURN APPROXIMATION
// ============================================================

def saturnLongitude(
  jd: Double
): Double = {

  val n =
    jd - 2451545.0

  normalize(
    50.077 +
    0.0334442 * n
  )
}

// ============================================================
// RAHU
// ============================================================

def rahuLongitude(
  jd: Double
): Double = {

  val n =
    jd - 2451545.0

  normalize(
    125.04452 -
    0.0529538083 * n
  )
}

// ============================================================
// KETU
// ============================================================

def ketuLongitude(
  jd: Double
): Double = {

  normalize(
    rahuLongitude(jd) + 180.0
  )
}

// ============================================================
// NAKSHATRA
// ============================================================

def nakshatraName(
  longitude: Double
): String = {

  val names =
    Array(
      "Ashwini",
      "Bharani",
      "Krittika",
      "Rohini",
      "Mrigashira",
      "Ardra",
      "Punarvasu",
      "Pushya",
      "Ashlesha",
      "Magha",
      "Purva Phalguni",
      "Uttara Phalguni",
      "Hasta",
      "Chitra",
      "Swati",
      "Vishakha",
      "Anuradha",
      "Jyeshtha",
      "Mula",
      "Purva Ashadha",
      "Uttara Ashadha",
      "Shravana",
      "Dhanishtha",
      "Shatabhisha",
      "Purva Bhadrapada",
      "Uttara Bhadrapada",
      "Revati"
    )

  val index =
    floor(
      normalize(longitude) /
      (360.0 / 27.0)
    ).toInt

  names(
    Math.min(
      26,
      Math.max(
        0,
        index
      )
    )
  )
}

// ============================================================
// PADA
// ============================================================

def nakshatraPada(
  longitude: Double
): Int = {

  val span =
    360.0 / 108.0

  (
    floor(
      normalize(longitude) /
      span
    ).toInt % 4
  ) + 1
}

// ============================================================
// VEDIC RASHI FROM MOON
// ============================================================

def moonRashi(
  moonSidereal: Double
): String = {

  signName(
    moonSidereal
  )
}

// ============================================================
// LAGNA APPROXIMATION
// ============================================================

def ascendant(
  jd: Double,
  latitude: Double,
  longitude: Double
): Double = {

  val T =
    (jd - 2451545.0) /
    36525.0

  val gmst =
    280.46061837 +
    360.98564736629 *
    (jd - 2451545.0) +
    0.000387933 *
    T * T -
    T * T * T / 38710000.0

  val lst =
    normalize(
      gmst + longitude
    )

  val phi =
    toRadians(latitude)

  val eps =
    toRadians(
      23.439291
    )

  val theta =
    toRadians(lst)

  val asc =
    atan2(
      -cos(theta),
      sin(theta) * cos(eps) +
      tan(phi) * sin(eps)
    )

  val degrees =
    toDegrees(asc)

  sidereal(
    normalize(degrees),
    jd
  )
}

// ============================================================
// HOUSE NUMBER
// ============================================================

def houseFromLongitude(
  planet: Double,
  lagna: Double
): Int = {

  val diff =
    normalize(
      planet - lagna
    )

  floor(
    diff / 30.0
  ).toInt + 1
}

// ============================================================
// BUILD REPORT
// ============================================================

def createReport(
  name: String,
  date: String,
  time: String,
  place: String,
  lat: Double,
  lon: Double,
  tz: Double,
  jd: Double
): String = {

  val sun =
    sidereal(
      sunLongitude(jd),
      jd
    )

  val moon =
    sidereal(
      moonLongitude(jd),
      jd
    )

  val mercury =
    sidereal(
      mercuryLongitude(jd),
      jd
    )

  val venus =
    sidereal(
      venusLongitude(jd),
      jd
    )

  val mars =
    sidereal(
      marsLongitude(jd),
      jd
    )

  val jupiter =
    sidereal(
      jupiterLongitude(jd),
      jd
    )

  val saturn =
    sidereal(
      saturnLongitude(jd),
      jd
    )

  val rahu =
    sidereal(
      rahuLongitude(jd),
      jd
    )

  val ketu =
    sidereal(
      ketuLongitude(jd),
      jd
    )

  val lagna =
    ascendant(
      jd,
      lat,
      lon
    )

  val moonNak =
    nakshatraName(moon)

  val pada =
    nakshatraPada(moon)

  val sb =
    new StringBuilder

  sb.append(
    "====================================================\n"
  )

  sb.append(
    "              KUNDALI PURAN\n"
  )

  sb.append(
    "          VEDIC BIRTH REPORT\n"
  )

  sb.append(
    "====================================================\n\n"
  )

  sb.append(
    "PERSONAL DETAILS\n"
  )

  sb.append(
    "----------------------------------------------------\n"
  )

  sb.append(
    "Name        : "
  )

  sb.append(name)

  sb.append("\n")

  sb.append(
    "Birth Date  : "
  )

  sb.append(date)

  sb.append("\n")

  sb.append(
    "Birth Time  : "
  )

  sb.append(time)

  sb.append("\n")

  sb.append(
    "Birth Place : "
  )

  sb.append(place)

  sb.append("\n")

  sb.append(
    "Latitude    : "
  )

  sb.append(lat)

  sb.append("\n")

  sb.append(
    "Longitude   : "
  )

  sb.append(lon)

  sb.append("\n")

  sb.append(
    "Timezone    : UTC "
  )

  sb.append(tz)

  sb.append("\n\n")

  sb.append(
    "CALCULATION\n"
  )

  sb.append(
    "----------------------------------------------------\n"
  )

  sb.append(
    "Julian Day       : "
  )

  sb.append(jd)

  sb.append("\n")

  sb.append(
    "Lahiri Ayanamsha : "
  )

  sb.append(
    lahiriAyanamsha(jd)
  )

  sb.append("�\n\n")

  sb.append(
    "LAGNA / ASCENDANT\n"
  )

  sb.append(
    "----------------------------------------------------\n"
  )

  sb.append(
    "Lagna Degree : "
  )

  sb.append(
    degreeText(lagna)
  )

  sb.append("\n")

  sb.append(
    "Lagna Rashi  : "
  )

  sb.append(
    signName(lagna)
  )

  sb.append("\n\n")

  sb.append(
    "MOON / JANMA DETAILS\n"
  )

  sb.append(
    "----------------------------------------------------\n"
  )

  sb.append(
    "Moon Degree  : "
  )

  sb.append(
    degreeText(moon)
  )

  sb.append("\n")

  sb.append(
    "Moon Rashi   : "
  )

  sb.append(
    moonRashi(moon)
  )

  sb.append("\n")

  sb.append(
    "Nakshatra    : "
  )

  sb.append(
    moonNak
  )

  sb.append("\n")

  sb.append(
    "Pada         : "
  )

  sb.append(
    pada
  )

  sb.append("\n\n")

  sb.append(
    "PLANETARY POSITIONS\n"
  )

  sb.append(
    "----------------------------------------------------\n"
  )

  sb.append(
    planetLine(
      "Sun",
      sun,
      lagna
    )
  )

  sb.append(
    planetLine(
      "Moon",
      moon,
      lagna
    )
  )

  sb.append(
    planetLine(
      "Mercury",
      mercury,
      lagna
    )
  )

  sb.append(
    planetLine(
      "Venus",
      venus,
      lagna
    )
  )

  sb.append(
    planetLine(
      "Mars",
      mars,
      lagna
    )
  )

  sb.append(
    planetLine(
      "Jupiter",
      jupiter,
      lagna
    )
  )

  sb.append(
    planetLine(
      "Saturn",
      saturn,
      lagna
    )
  )

  sb.append(
    planetLine(
      "Rahu",
      rahu,
      lagna
    )
  )

  sb.append(
    planetLine(
      "Ketu",
      ketu,
      lagna
    )
  )

  sb.append("\n")

  sb.append(
    "12 HOUSE STRUCTURE\n"
  )

  sb.append(
    "----------------------------------------------------\n"
  )

  var h =
    1

  while (
    h <= 12
  ) {

    val houseLongitude =
      normalize(
        lagna +
        (h - 1) * 30.0
      )

    sb.append(
      "House "
    )

    sb.append(h)

    sb.append(
      " : "
    )

    sb.append(
      signName(
        houseLongitude
      )
    )

    sb.append(
      "\n"
    )

    h += 1
  }

  sb.append("\n")

  sb.append(
    "TRADITIONAL READING\n"
  )

  sb.append(
    "----------------------------------------------------\n"
  )

  sb.append(
    "Janma Rashi : "
  )

  sb.append(
    moonRashi(moon)
  )

  sb.append("\n")

  sb.append(
    "Janma Nakshatra : "
  )

  sb.append(
    moonNak
  )

  sb.append("\n")

  sb.append(
    "Nakshatra Pada : "
  )

  sb.append(
    pada
  )

  sb.append("\n\n")

  sb.append(
    "IMPORTANT\n"
  )

  sb.append(
    "----------------------------------------------------\n"
  )

  sb.append(
    "This program calculates a sidereal-style chart.\n"
  )

  sb.append(
    "For professional-grade astronomical accuracy,\n"
  )

  sb.append(
    "the planetary ephemeris should be generated by\n"
  )

  sb.append(
    "a dedicated ephemeris engine such as Swiss Ephemeris.\n"
  )

  sb.append(
    "The present standalone version does not claim\n"
  )

  sb.append(
    "professional astronomical precision.\n"
  )

  sb.append(
    "\n====================================================\n"
  )

  sb.toString
}

// ============================================================
// PLANET LINE
// ============================================================

def planetLine(
  name: String,
  longitude: Double,
  lagna: Double
): String = {

  val sb =
    new StringBuilder

  sb.append(
    name
  )

  sb.append(
    " " * Math.max(
      1,
      10 - name.length
    )
  )

  sb.append(
    ": "
  )

  sb.append(
    degreeText(longitude)
  )

  sb.append(
    " | "
  )

  sb.append(
    signName(longitude)
  )

  sb.append(
    " | House "
  )

  sb.append(
    houseFromLongitude(
      longitude,
      lagna
    )
  )

  sb.append("\n")

  sb.toString
}

// ============================================================
// CALCULATE BUTTON EVENT
// ============================================================

calculateButton.addActionListener(
  new ActionListener {

    override def actionPerformed(
      event: ActionEvent
    ): Unit = {

      try {

        val name =
          firstName.getText.trim

        val last =
          surname.getText.trim

        val date =
          birthDate.getText.trim

        val time =
          birthTime.getText.trim

        val place =
          birthPlace.getText.trim

        val lat =
          latitude.getText.trim.toDouble

        val lon =
          longitude.getText.trim.toDouble

        val tz =
          timezone.getText.trim.toDouble

        if (
          name.isEmpty ||
          last.isEmpty ||
          date.isEmpty ||
          time.isEmpty ||
          place.isEmpty
        ) {

          JOptionPane.showMessageDialog(
            window,
            "Please fill all birth details.",
            "Missing Information",
            JOptionPane.WARNING_MESSAGE
          )

        } else {

          val dp =
            date.split("/")

          val tp =
            time.split(":")

          if (
            dp.length != 3 ||
            (tp.length != 2 && tp.length != 3)
          ) {

            JOptionPane.showMessageDialog(
              window,
              "Use Date: DD/MM/YYYY\n" +
              "Use Time: HH:MM or HH:MM:SS",
              "Invalid Format",
              JOptionPane.ERROR_MESSAGE
            )

          } else {

            val day =
              dp(0).toInt

            val month =
              dp(1).toInt

            val year =
              dp(2).toInt

            val hour =
              tp(0).toInt

            val minute =
              tp(1).toInt

            val second =
              if (tp.length == 3)
                tp(2).toInt
              else
                0

            if (
              day < 1 ||
              day > 31 ||
              month < 1 ||
              month > 12 ||
              hour < 0 ||
              hour > 23 ||
              minute < 0 ||
              minute > 59 ||
              second < 0 ||
              second > 59 ||
              lat < -90 ||
              lat > 90 ||
              lon < -180 ||
              lon > 180 ||
              tz < -14 ||
              tz > 14
            ) {

              JOptionPane.showMessageDialog(
                window,
                "Please check Date, Time, Latitude,\n" +
                "Longitude and Timezone.",
                "Invalid Details",
                JOptionPane.ERROR_MESSAGE
              )

            } else {

              val jd =
                julianDay(
                  year,
                  month,
                  day,
                  hour,
                  minute,
                  second,
                  tz
                )

              val fullName =
                name + " " + last

              result.setText(
                createReport(
                  fullName,
                  date,
                  time,
                  place,
                  lat,
                  lon,
                  tz,
                  jd
                )
              )

              result.setCaretPosition(0)
            }
          }
        }

      } catch {

        case _: NumberFormatException =>

          JOptionPane.showMessageDialog(
            window,
            "Please enter valid numbers.",
            "Input Error",
            JOptionPane.ERROR_MESSAGE
          )

        case _: Exception =>

          JOptionPane.showMessageDialog(
            window,
            "Unable to calculate the chart.\n" +
            "Please check all entered details.",
            "Calculation Error",
            JOptionPane.ERROR_MESSAGE
          )
      }
    }
  }
)

// ============================================================
// START APPLICATION
// ============================================================

SwingUtilities.invokeLater(
  new Runnable {

    override def run(): Unit = {

      window.setLocationRelativeTo(null)

      window.setVisible(true)

      window.toFront()

      window.requestFocus()
    }
  }
)