Code Sketch
bhimraj
Category: Art
import scala.swing._
import scala.swing.event._
import java.awt.Color
import java.awt.Graphics2D
import java.awt.Font
import java.awt.event.MouseEvent
import scala.collection.mutable
object KojoSocialApp {
// Global databases (Local Memory)
private val registeredUsers = mutable.Map[String, String]()
private val chatHistories = mutable.Map[String, mutable.ListBuffer[ChatMessage]]()
case class ChatMessage(sender: String, text: String)
def main(args: Array[String]): Unit = {
// Default Dummy Users Testing ke liye
registeredUsers("user1") = "Rahul123"
registeredUsers("user2") = "Amit99"
registeredUsers("user3") = "Priya2026"
javax.swing.SwingUtilities.invokeLater(new Runnable {
def run(): Unit = {
val startFrame = new StartupSearchLoginFrame()
startFrame.visible = true
}
})
}
// 1. LOGIN & REGISTER FRAME
class StartupSearchLoginFrame extends MainFrame {
title = "Kojo Social App - Login & Register"
resizable = false
minimumSize = new Dimension(440, 330)
centerOnScreen()
val searchIdField = new TextField(10)
val searchPasswordField = new PasswordField(10)
val searchLoginButton = new Button("Login")
val newIdField = new TextField(10)
val newPasswordField = new PasswordField(10)
val createAccountButton = new Button("Register New Account")
val messageLabel = new Label("Enter your ID & Password to login or register.") {
foreground = new Color(0, 100, 0)
font = new Font("Arial", Font.BOLD, 12)
}
contents = new BoxPanel(Orientation.Vertical) {
border = Swing.EmptyBorder(20, 20, 20, 20)
contents += new Label("=== Welcome to Kojo Social Chat ===") { font = new Font("Arial", Font.BOLD, 15) }
contents += Swing.VStrut(15)
contents += new Label("Already have an ID? Login here:")
contents += Swing.VStrut(5)
contents += new BoxPanel(Orientation.Horizontal) {
contents += new Label("ID: ")
contents += searchIdField
contents += Swing.HStrut(5)
contents += new Label("Pass: ")
contents += searchPasswordField
contents += Swing.HStrut(10)
contents += searchLoginButton
}
contents += Swing.VStrut(15)
contents += new Separator()
contents += Swing.VStrut(15)
contents += new Label("New User? Register with ID & Password:")
contents += Swing.VStrut(8)
contents += new BoxPanel(Orientation.Horizontal) {
contents += new Label("ID: ")
contents += newIdField
}
contents += Swing.VStrut(5)
contents += new BoxPanel(Orientation.Horizontal) {
contents += new Label("Pass: ")
contents += newPasswordField
}
contents += Swing.VStrut(12)
contents += createAccountButton
contents += Swing.VStrut(10)
contents += messageLabel
}
listenTo(searchLoginButton)
listenTo(createAccountButton)
reactions += {
case ButtonClicked(`searchLoginButton`) =>
val idToSearch = searchIdField.text.trim
val enteredPass = new String(searchPasswordField.peer.getPassword).trim
if (idToSearch.isEmpty || enteredPass.isEmpty) {
messageLabel.text = "Please enter both ID and Password!"
messageLabel.foreground = Color.RED
} else if (registeredUsers.contains(idToSearch)) {
val correctPass = registeredUsers(idToSearch)
if (correctPass == enteredPass) {
val dashboard = new FullScreenDashboard(idToSearch)
dashboard.peer.setExtendedState(java.awt.Frame.MAXIMIZED_BOTH)
dashboard.visible = true
this.dispose()
} else {
messageLabel.text = "Incorrect Password!"
messageLabel.foreground = Color.RED
}
} else {
messageLabel.text = "ID not found! Please register below."
messageLabel.foreground = Color.RED
}
case ButtonClicked(`createAccountButton`) =>
val id = newIdField.text.trim
val pass = new String(newPasswordField.peer.getPassword).trim
if (id.isEmpty || pass.isEmpty) {
messageLabel.text = "Enter both ID and Password to register!"
messageLabel.foreground = Color.RED
} else if (registeredUsers.contains(id)) {
messageLabel.text = "This ID already exists! Try logging in above."
messageLabel.foreground = Color.RED
} else {
registeredUsers(id) = pass
val dashboard = new FullScreenDashboard(id)
dashboard.peer.setExtendedState(java.awt.Frame.MAXIMIZED_BOTH)
dashboard.visible = true
this.dispose()
}
}
}
// 2. DASHBOARD WITH SEARCH & CHAT OPTION
class FullScreenDashboard(currentUserId: String) extends MainFrame {
title = "Kojo Chat - Logged in as: " + currentUserId
minimumSize = new Dimension(1024, 728)
val searchField = new TextField(15)
val searchButton = new Button("Search ID")
val searchResultLabel = new Label("Search any ID to start chatting...") {
foreground = Color.BLUE
font = new Font("Arial", Font.BOLD, 13)
}
val startChatButton = new Button("Start Chat") {
font = new Font("Arial", Font.BOLD, 13)
foreground = new Color(0, 128, 0)
enabled = false
}
var searchedTargetUser: String = ""
val limBtn = new Button("LIM")
val topPanel = new BoxPanel(Orientation.Horizontal) {
border = Swing.EmptyBorder(15, 20, 15, 20)
contents += new Label("Search User ID: ") { font = new Font("Arial", Font.BOLD, 14) }
contents += Swing.HStrut(10)
contents += searchField
contents += Swing.HStrut(10)
contents += searchButton
contents += Swing.HStrut(20)
contents += searchResultLabel
contents += Swing.HStrut(15)
contents += startChatButton
contents += Swing.HGlue
contents += limBtn
}
val drawingCanvas = new Panel {
background = new Color(245, 247, 250)
override def paintComponent(g: Graphics2D): Unit = {
super.paintComponent(g)
g.setRenderingHint(java.awt.RenderingHints.KEY_ANTIALIASING, java.awt.RenderingHints.VALUE_ANTIALIAS_ON)
val w = size.width
val h = size.height
val diameter = (Math.min(w, h) * 0.60).toInt
val r = diameter / 2
val cx = w / 2
val cy = h / 2
g.setColor(new Color(41, 128, 185))
g.fillOval(cx - r, cy - r, diameter, diameter)
g.setColor(Color.WHITE)
g.setFont(new Font("Arial", Font.BOLD, (diameter * 0.12).toInt))
val text = "My ID: " + currentUserId
val metrics = g.getFontMetrics
g.drawString(text, cx - (metrics.stringWidth(text) / 2), cy + 10)
}
}
val logoutButton = new Button("Logout") {
foreground = Color.RED
font = new Font("Arial", Font.BOLD, 12)
}
val bottomPanel = new BoxPanel(Orientation.Horizontal) {
border = Swing.EmptyBorder(10, 20, 15, 20)
contents += Swing.HGlue
contents += logoutButton
}
contents = new BorderPanel {
layout(topPanel) = BorderPanel.Position.North
layout(drawingCanvas) = BorderPanel.Position.Center
layout(bottomPanel) = BorderPanel.Position.South
}
listenTo(searchButton)
listenTo(startChatButton)
listenTo(limBtn)
listenTo(logoutButton)
listenTo(searchField.keys)
reactions += {
case ButtonClicked(`searchButton`) =>
performSearch()
case ButtonClicked(`startChatButton`) =>
if (searchedTargetUser.nonEmpty) {
val chatWin = new LiveChatFrame(currentUserId, searchedTargetUser)
chatWin.visible = true
}
case ButtonClicked(`limBtn`) =>
Dialog.showMessage(this, s"Logged-in ID: $currentUserId", "LIM", Dialog.Message.Info)
case ButtonClicked(`logoutButton`) =>
val confirm = Dialog.showConfirmation(this, "Are you sure you want to logout?", "Logout", Dialog.Options.YesNo, Dialog.Message.Question)
if (confirm == Dialog.Result.Yes) {
val loginScreen = new StartupSearchLoginFrame()
loginScreen.visible = true
this.dispose()
}
case KeyPressed(_, Key.Enter, _, _) =>
performSearch()
}
def performSearch(): Unit = {
val queryId = searchField.text.trim
if (queryId.isEmpty) {
searchResultLabel.text = "Please enter an ID!"
searchResultLabel.foreground = Color.RED
startChatButton.enabled = false
} else if (queryId == currentUserId) {
searchResultLabel.text = "You cannot chat with yourself!"
searchResultLabel.foreground = Color.RED
startChatButton.enabled = false
} else if (registeredUsers.contains(queryId)) {
searchedTargetUser = queryId
searchResultLabel.text = s"Found ID: $queryId"
searchResultLabel.foreground = new Color(39, 174, 96)
startChatButton.enabled = true
} else {
searchResultLabel.text = "No user found!"
searchResultLabel.foreground = Color.RED
startChatButton.enabled = false
searchedTargetUser = ""
}
}
}
// 3. LIVE CHAT WINDOW
class LiveChatFrame(userA: String, userB: String) extends MainFrame {
private val chatKey = if (userA < userB) s"$userA-$userB" else s"$userB-$userA"
title = s"Live Chat: $userA & $userB"
minimumSize = new Dimension(450, 450)
centerOnScreen()
val chatArea = new TextArea(15, 35) {
editable = false
lineWrap = true
wordWrap = true
font = new Font("Arial", Font.PLAIN, 13)
}
val messageInput = new TextField(25)
val sendButton = new Button("Send")
def refreshChat(): Unit = {
val messages = chatHistories.getOrElse(chatKey, mutable.ListBuffer())
val sb = new StringBuilder
for (msg <- messages) {
sb.append(s"[${msg.sender}]:${msg.text}\n")
}
chatArea.text = sb.toString()
chatArea.peer.setCaretPosition(chatArea.text.length)
}
refreshChat()
contents = new BoxPanel(Orientation.Vertical) {
border = Swing.EmptyBorder(15, 15, 15, 15)
contents += new Label(s"Chatting with: $userB") {
font = new Font("Arial", Font.BOLD, 14)
}
contents += Swing.VStrut(10)
contents += new ScrollPane(chatArea)
contents += Swing.VStrut(10)
contents += new BoxPanel(Orientation.Horizontal) {
contents += messageInput
contents += Swing.HStrut(10)
contents += sendButton
}
}
listenTo(sendButton)
listenTo(messageInput.keys)
reactions += {
case ButtonClicked(`sendButton`) =>
sendMessage()
case KeyPressed(_, Key.Enter, _, _) =>
sendMessage()
}
def sendMessage(): Unit = {
val text = messageInput.text.trim
if (text.nonEmpty) {
val list = chatHistories.getOrElseUpdate(chatKey, mutable.ListBuffer())
list += ChatMessage(userA, text)
messageInput.text = ""
refreshChat()
}
}
}
}
// App Trigger
KojoSocialApp.main(Array())