#!/usr/bin/env gst Eval [ "Betöltjük a szükséges csomagokat." PackageLoader fileInPackage: 'GTK'. PackageLoader fileInPackage: 'Sockets' ] Object subclass: Client [ | connection messageReceiver nameArea messagesArea typingArea sendButton hSeparator1 hSeparator2 vSeparator mainLayout typingLayout window | "Az ablak bezárásának eseménykezelője." destroy [ "Értesítjük a többieket, hogy zárjuk a kapcsolatot." self sendMessage: (self getText: nameArea) , ' closed the connection.'; sendMessage: '|CONNECTION_CLOSED|'. "Elküldjük a záró üzenetet." "Bezárjuk a GTK-t." GTK.Gtk mainQuit ] "Beszúrja a paraméterül kapott szöveget a paraméterül kapott textview végére." insert: textview text: t [ textview getBuffer insertAtEnd: t displayString , Character cr asString ] "Törli a paraméterül kapott textview-n lévő szöveget." clear: textview [ textview getBuffer setText: '' ] "Visszaadja a paraméterül kapott textview-n lévő szöveget." getText: textview [ ^ textview getBuffer text ] "A küldés gomb eseménykezelője." sendButtonClicked [ | message | "Az üzenet elé írjuk a nameArea-ban megadott nevet, majd elküldjük az üzenetet és töröljük a gépelési területről." message := (self getText: nameArea) , ' ' , (self getText: typingArea). self sendMessage: message. self clear: typingArea ] "Elküldi a paraméterül kapott üzenetet a szervernek." sendMessage: message [ [ message displayOn: connection. (String with: (Character value: 10)) displayOn: connection. connection flush ] on: SystemExceptions.Exception do: [:ex | self insert: messagesArea text: 'Server offline.' ] ] "Létrehozza a kapcsolatot, illetve létrehozza és megjeleníti a grafikus objektumokat." show [ [ "Megnyitjuk a kapcsolatot." connection := (Sockets.Socket remote: 'localhost' port: 8000) ] on: SystemExceptions.Exception do: [:ex | self insert: messagesArea text: 'Server offline.' ]. "Létrehozzuk az alkalmazás ablakát, a kilépés szignált pedig eseménykezelőhöz kötjük." window := GTK.GtkWindow new: GTK.Gtk gtkWindowToplevel. window connectSignal: 'destroy' to: self selector: #destroy userData: nil. "Létrehozzuk a layoutokat és a határolókat az elemek tárolásához." mainLayout := GTK.GtkVBox new: false spacing: 0. typingLayout := GTK.GtkHBox new: false spacing: 0. hSeparator1 := GTK.GtkHSeparator new. hSeparator2 := GTK.GtkHSeparator new. vSeparator := GTK.GtkVSeparator new. "Létrehozzuk a szöveges mezőket, és beállítjuk a szerkeszthetőségüket." nameArea := (GTK.GtkTextView newWithBuffer: GTK.GtkTextBuffer new) setEditable: true. messagesArea := (GTK.GtkTextView newWithBuffer: GTK.GtkTextBuffer new) setEditable: false. typingArea := (GTK.GtkTextView newWithBuffer: GTK.GtkTextBuffer new) setEditable: true. "Létrehozzuk és eseménykezelőhöz kötjük a küldés gombot." sendButton := GTK.GtkButton newWithLabel: 'Send'. sendButton connectSignal: 'clicked' to: self selector: #sendButtonClicked userData: nil; setSizeRequest: 70 height: 70; show. "Beállítjuk az objektumok méretét, illetve megjelenítjük őket." nameArea setSizeRequest: 400 height: 15; show. messagesArea setSizeRequest: 400 height: 300; show. typingArea setSizeRequest: 400 height: 70; show. hSeparator1 setSizeRequest: 400 height: 5; show. hSeparator2 setSizeRequest: 400 height: 5; show. vSeparator setSizeRequest: 5 height: 70; show. "Hozzáadjuk a kész objektumokat a layoutokhoz." typingLayout add: typingArea; add: vSeparator; add: sendButton; show. mainLayout add: nameArea; add: hSeparator1; add: messagesArea; add: hSeparator2; add: typingLayout; show. "Hozzáadjuk az ablakhoz a layoutot, majd megjelenítjük." window add: mainLayout; show. "Elhelyezzük az alapétertelmezett szövegeket." self insert: nameArea text: 'Name'; insert: typingArea text: 'Type your message here...'. "Az üzenetek fogadása új szálon fut majd." messageReceiver := [ |msg run| msg := ''. run := true. [ run ] whileTrue: [ [ msg := (connection nextLine) "Fogadunk egy üzenetet." ] on: SystemExceptions.Exception do: [:ex | self insert: messagesArea text: 'Server offline.'. msg := '' ]. msg ~= '|CONNECTION_CLOSED|' ifFalse: [ run := false. "Ha bárki lezárta a kapcsolatot, befejezzük az üzenetek fogadását." ] ifTrue: [ self insert: messagesArea text: msg "Különben kiírjuk a kapott üzenetet a megfelelő textview-ba." ] ] ] newProcess. "Elnevezzük és elindítjuk a szálat." messageReceiver name: 'receiver'. messageReceiver resume. ] ] Eval [ "Elindítjuk a klienst és a GTK-t." client := Client new. client show. GTK.Gtk main ]