Curs 5 Paradigma orientata eveniment

128
Curs 5 1

Transcript of Curs 5 Paradigma orientata eveniment

Page 1: Curs 5 Paradigma orientata eveniment

Curs 5

1

Page 2: Curs 5 Paradigma orientata eveniment

EvenimenteUn eveniment poate fi definit ca un tip

de semnal catre program.

Acesta ii indica programului ca ceva s-a intamplat

Page 3: Curs 5 Paradigma orientata eveniment

Forma generala a unui eveniment in EDP

Page 4: Curs 5 Paradigma orientata eveniment

Paradigma orientata eveniment Sistemul asteapta evenimentele (generate de utilizator

(in principal)) si acestea vor declansa (trigger) metodele de tratarea a lor.

Polling

Interrupt-driven

Event-driven

Tratarea evenimentelor asincrone

Page 5: Curs 5 Paradigma orientata eveniment

Metoda 1 - PollingInteractiunea este guvernata de o bucla infinita:

Loop forever:

{ i=1..n

read input i

respond to input I

inc I }

Metoda #2 Interrupt-driven

Page 6: Curs 5 Paradigma orientata eveniment

Metoda #3: Event-driven Interactiunea este din nou guvernat de o bucla:main()

{

while(true)

{

Event e = get_event();//primeste eveniment

process_event(e); // trateaza eveniment

}

}

Page 7: Curs 5 Paradigma orientata eveniment

Avantajele procesarii orientate eveniment

Sunt mai portabile

Permit tratarea mai rapida

Se pot folosi de suportul sistemului de operare

Incurajeaza reutilizarea codului.

Page 8: Curs 5 Paradigma orientata eveniment

1. Generatoare de evenimente: tastura si maus

2. Sursa evenimente: sistem sau definit de utilizator

3. Bucla de evenimente: asteapta continuu evenimente sprea fi tratate

4. Gestionari de evenimente: metodele necesare tratariieveenimentelor (majoritatea definite de utilizator, unelefiind ale sistemului)

5. Event mapper: distribuite evenimentele catre gestionariicorespunzatori fiecaruia

6. Inregistrarea evenimentelor: informeaza un event mapper despre asocierea intre evenimente si gestionari

Page 9: Curs 5 Paradigma orientata eveniment

Diagarama de secventa pentru EDPApp

User

: Event

Handler

: Event

Mapper

: UI

Object

actiuni

Genereazaevenimente

Distribuieevenimente

Inregistreazagestionarul de evenimente

procesareevenimente

Page 10: Curs 5 Paradigma orientata eveniment

Tratarea evenimentelor

10

Dispatcher/Distribuitor/Mapper:

Page 11: Curs 5 Paradigma orientata eveniment

In general programatorul trebuie sa descrietratarea evenimentului.

• registrul de evenimente si cu bucla de evenimente sunt de obicei implementate de sistem

• Aplicatiile implementeaza gestionarul

• gestionarul de evenimente trebuie sa urmezestandardele descrise in interfetele furnizate de sistem

• gestionarul trebuie sa fi inregistrat

Page 12: Curs 5 Paradigma orientata eveniment

EDP – aplicatii consola

12

#include <iostream>using namespace std;int value; // globalint main() {

// Initializationchar s = '+';value = 0;while(1) { // event loop

cout << "Please select an operation (+,-,q): \n";cin >> s; //wait for an event to be generated by the userswitch(s){ //event mapper

case '+': //event registrationadd(); break; //event handler

case '-': //event registrationsub(); break; //event handler

Page 13: Curs 5 Paradigma orientata eveniment

case 'q': //event registrationexit(1); //event handler

}}

return(1); }// event handlersvoid add () { // "+" event handler

int in;cout << "Please select an integer: \n";cin >> in;value += in;cout << "The current value is: " << value << "\n";

}void sub () { // "-" event handler

int in;cout << "Please select an integer: \n";cin >> in;value -= in;cout << "The current value is: " << value << "\n";

}

Page 14: Curs 5 Paradigma orientata eveniment

Secvential EDP

Text putin modest

GUI inutil majoritar

Page 15: Curs 5 Paradigma orientata eveniment

Proiectarea unei aplicatii EDP - GUI

• Stabilirea interactiunii vizuale si a evenimentelor:

Look & Feel

Page 16: Curs 5 Paradigma orientata eveniment

O interfata este buna daca are urmatoarelecaracteristici:

• Eleganta:

• Il ghideaza

• Ofera informatii ajutatoare (hint)

• Foloseste o ierarhie de interfete

• Permite ca utilizatorul sa faca greseli

16

Page 17: Curs 5 Paradigma orientata eveniment

Pick Correlation

Procesul de selectie a unei ferestre sau aplicatiicare trebuie sa trateze un eveniment oarecare(deoarece le apartine) se numeste corelatia de selectie (pick correlation)

Page 18: Curs 5 Paradigma orientata eveniment

Ce sunt widgets? Sunt obiectele din cadrul unui GUI orientat obiect.

Desi fiecare fereastra este un widget

Nu toate widget sunt ferestre

Page 19: Curs 5 Paradigma orientata eveniment

EDP in HTML

19

Page 20: Curs 5 Paradigma orientata eveniment

20

Sectiune de pagina: <div>

<div>Look at me!

</div>

Event-Driven Programming in HTML

Camp text: <input /> Atributul type trebuie setat pe "text"<div>

Name: <input type="text" /></div>

Page 21: Curs 5 Paradigma orientata eveniment

21

Buton: <input />

<div><input type="button" value="Click Me!" />

</div>

Gestionarul de eveniment pentru buton

<div><input type="button" value="Click Me!" onclick="myFunction();" />

</div>

function myFunction() {alert("Hello, world!");

}

Page 22: Curs 5 Paradigma orientata eveniment

22

Citirea date de la utilizator

Un element HTML are urmatoarea structura

Page 23: Curs 5 Paradigma orientata eveniment

23

Identificarea elementelor HTML

<div>Name: <input type="text" id="name" />

</div>

Accesarea elementelor HTML in JavaScript Accesarea unui elemnt HTML prin ID, se face :

document.getElementById("<ID>")

Exemplu:

document.getElementById("name")

Page 24: Curs 5 Paradigma orientata eveniment

24

Accesarea atributeleor elementelor HTML

Sintaxa generala este prezentata mai jos:document.getElementById("<ID>").<attribute>

Exemplu:document.getElementById("name").value

(campurile text stocheaza inputul utilizator in atributul value )

Reanalizam exemplul anterior Snippet HTML

Fisierul JavaScript

<div>Name: <input type="text" id="name" /><br /><input type="button" value="Greet!" onclick="welcome();"

/></div>

function welcome() {var name = document.getElementById("name").value; alert("Hi, " + name + "!");

}

Page 25: Curs 5 Paradigma orientata eveniment

25

Exemplu Snippet HTML

Fisier JavaScript

<div>Name: <input type="text" id="name" /><br />Age: <input type="text" id="age" /><br /><input type="button" value="Submit" onclick="checkAge();"

/></div>

function checkAge() {var userName = document.getElementById("name").value;var age = document.getElementById("age").value;

if (age < 21) {alert(userName + ", you can't drink!");

} else {alert("Hi " + userName + ", drink away!");

}}

Page 26: Curs 5 Paradigma orientata eveniment

26

Schimbarea valorilor atributului Snippet HTML

Fisier JavaScript

<div>Name: <input type="text" id="name" /><br /><input type="button" value="Greet!" onclick="welcome();"

/></div>

function welcome() {var name = document.getElementById("name").value;alert(name + ", I don't like your name. You are now Bob.");document.getElementById("name").value = "Bob";alert("Hi Bob!");

}

Page 27: Curs 5 Paradigma orientata eveniment

EDP in Java

27

Page 28: Curs 5 Paradigma orientata eveniment

Frame in AWT Frame este un container pentru componente

Frame cu controale de

windows normale

Menu Optional

Trei containerein Frame cu

Border Layout

Componente UI in interiorul

containerelorfiecare cu layout

propriu

Page 29: Curs 5 Paradigma orientata eveniment

Exemplu GUI

{Frame}

eticheta{label}

Camp text{textfield}

buton{button}

componente

Page 30: Curs 5 Paradigma orientata eveniment

Clase eveniment

AWTEvent EventObject

AdjustmentEvent

ComponentEvent

TextEvent

ItemEvent

ActionEvent

InputEvent

WindowEvent

MouseEvent

KeyEvent

ContainerEvent

FocusEvent

PaintEvent

ListSelectionEvent

Page 31: Curs 5 Paradigma orientata eveniment

31

Cele mai comune actiuni utilizatorActiune utilizator Obiect Sursa Tip eveniment generat

Apasa un buton Jbutton ActionEvent

Marcheaza o cutie de selectie JCheckBox ItemEvent, ActionEvent

Selecteaza un buton radio JRadioButton ItemEvent, ActionEvent

Apasa return intr-un camp text JTextField ActionEvent

Selecteaza un nou element JComboBox ItemEvent, ActionEvent

Window opened, closed, etc. Window WindowEvent

Mouse pressed, released, etc. Component MouseEvent

Key released, pressed, etc. Component KeyEvent

Page 32: Curs 5 Paradigma orientata eveniment

32

Model de delegare

sursa: SourceClass

+addXListener(listener: XListener)

listener: ListenerClass

Actiune Utilizatorr

Genereaza un eveniment XListener

+handler(event: XEvent)

Inregistrata prin invocarea source.addXListener(listener);

(a) o component sursa cu un gestionar generic

sursa: JButton

+addActionListener(listener: ActionListener)

listener: CustomListenerClass

ActionListener

+actionPerformed(event: ActionEvent)

Inregistrat prin apelul lui source.addActionListener(listener);

(b) O component sursa JButton cu un gestionar ActionListener

Page 33: Curs 5 Paradigma orientata eveniment

33

Functii interne ale unei componente sursa

sursa: SourceClass

+addXListener(XListener listener)

(a) Functii interne ale unui obiect sursa generic

event: XEvent listener1 listener2 … listenern

Mentine o lista

Apeleaza/Invoca listener1.handler(event) listener2.handler(event) … listenern.handler(event)

Un eveniment este generat

sursa: JButton

+addActionListener(ActionListener listener)

(b) Functie interna a obiectului JButton

event: ActionEvent

listener1 listener2 … listenern

Mentine o lista

Apeleaza listener1.actionPerformed(event) listener2.actionPerformed(event) … listenern.actionPerformed(event)

Un eveniment este declansat

Page 34: Curs 5 Paradigma orientata eveniment

34

Exemplu model delegareJButton jbt = new JButton("OK");ActionListener listener = new OKListener();jbt.addActionListener(listener);

Clasa Eveniment Interfata Gestionar Metode Gestionar (Handlers)ActionEvent ActionListener actionPerformed(ActionEvent)ItemEvent ItemListener itemStateChanged(ItemEvent)WindowEvent WindowListener windowClosing(WindowEvent)

windowOpened(WindowEvent)windowIconified(WindowEvent)windowDeiconified(WindowEvent)windowClosed(WindowEvent)windowActivated(WindowEvent)windowDeactivated(WindowEvent)

ContainerEvent ContainerListener componentAdded(ContainerEvent)componentRemoved(ContainerEvent)

MouseEvent MouseListener mousePressed(MouseEvent)mouseReleased(MouseEvent)mouseClicked(MouseEvent)mouseExited(MouseEvent)mouseEntered(MouseEvent)

KeyEvent KeyListener keyPressed(KeyEvent)keyReleased(KeyEvent)keyTypeed(KeyEvent)

Selectie gestionare eveniment disponibile

Page 35: Curs 5 Paradigma orientata eveniment

35

java.awt.event.ActionEvent

java.awt.event.ActionEvent

+getActionCommand(): String

+getModifiers(): int

+getWhen(): long

java.util.EventObject

+getSource(): Object

java.awt.event.AWTEvent

Page 36: Curs 5 Paradigma orientata eveniment

36

Gestionari interniO clasa de gestionare / ascultare (listener) este

proiectata pentru a crea un obiect listener pentru o componenta GUI (cum ar fi un buton).

Page 37: Curs 5 Paradigma orientata eveniment

37

O clasa interna anonima O clasa interna anonima este o clasa interioara fara

nume.

O clasa anonima este declarata dupa cum urmeaza:

new NumeSuperClasa/NumeInterfata() {// Implementeza sau suprascrier metodele din superclasa sau

interfata// orice alte metode care mai sunt necesare

}

Page 38: Curs 5 Paradigma orientata eveniment

38

Evenimente Maus

java.awt.event.MouseEvent

+getButton(): int

+getClickCount(): int

+getPoint(): java.awt.Point

+getX(): int

+getY(): int

java.awt.event.InputEvent

+getWhen(): long

+isAltDown(): boolean

+isControlDown(): boolean

+isMetaDown(): boolean

+isShiftDown(): boolean

Page 39: Curs 5 Paradigma orientata eveniment

39

Gestiunea evenimentelor maus Java furnizeaza doua interfete listener: MouseListener si MouseMotionListener, pentruaputea gestiona evenimentele acestuia

java.awt.event.MouseListener

+mousePressed(e: MouseEvent): void

+mouseReleased(e: MouseEvent): void

+mouseClicked(e: MouseEvent): void

+mouseEntered(e: MouseEvent): void

+mouseExited(e: MouseEvent): void

java.awt.event.MouseMotionListener

+mouseDragged(e: MouseEvent): void

+mouseMoved(e: MouseEvent): void

Page 40: Curs 5 Paradigma orientata eveniment

40

Gestiunea evenimentelor tastatura• Pentru a procesa un eveniment de la tastatura se vor folosi

urmatorii gestionari din interfata KeyListener:• keyPressed(KeyEvent e)este apelata la apasarea unei taste• keyReleased(KeyEvent e)apelata la eliberarea unei taste.• keyTyped(KeyEvent e)apelata atunci cand o tasta este apelata

si eliberata.

• Cele mai utilizate definitii de coduri taste sunt• Home VK_HOME• End VK_END• Page Up VK_PGUP• Page Down VK_PGDN

java.awt.event.KeyEvent

+getKeyChar(): char

+getKeyCode(): int

java.awt.event.InputEvent

Page 41: Curs 5 Paradigma orientata eveniment

41

Clasa Timer

javax.swing.Timer

+Timer(delay: int, listener: ActionListener)

+addActionListener(listener: ActionListener): void

+start(): void

+stop(): void

+setDelay(delay: int): void

• Clasa Timer poate fi folosita in controlul animatiei.

• De exemplu pentru afisarea unui mesaj in miscare.

Page 42: Curs 5 Paradigma orientata eveniment

42

AWT vs. SwingJava furnizeaza doua seturi de componente GUI components

("controale")

AWT (Abstract Windowing Toolkit) - este biblioteca initiala de componente (Java 1.0 modificata in Java 1.1)

Utilizeaza modelul de delegare a evenimentelor (din Java 1.1.)

Swing este biblioteca imbunatatita de componente Gui ca parte a JFC (Java Foundation Classes), (dupa Java 1.2)

Page 43: Curs 5 Paradigma orientata eveniment

43

Componentele AWT ”pereche”

Fiecare componenta nativa din AWT are o imagine (sau componenta pereche) in GUI nativ al Windows

Fiecare componenta GUI isi va asuma automat aparenta/imaginea/prezentarea determinata de sistemul de operare gazda

Componentele AWT sunt legate direct catre abilitatile GUI locale ale OS

Page 44: Curs 5 Paradigma orientata eveniment

44

AWT components

Page 45: Curs 5 Paradigma orientata eveniment

45

Modele de proiectare AWT

Modelul Compozit (Composite): organizeazacomponentele intr-o structura ierarhicaarborescenta

Modelu pod (bridge) permite existentametodelor pereche

Page 46: Curs 5 Paradigma orientata eveniment

46

Componente Swing Compnentele Swing sunt scrise, manipulate si afisate

complet in Java

Componentele Swing au prezentarea si comporatamentul (look-and-feel) independente de platforma sistemului de operare gazda

Page 47: Curs 5 Paradigma orientata eveniment

47

Relatia dintre componentele AWT si cele de nivel superior ale Swing

Page 48: Curs 5 Paradigma orientata eveniment

48

Organizarea bibliotecii GUI Biblioteca de clase este organizata ierarhic pornind de la

java.awt.Component

Componentele grele de nivel superior depind de modelul pereche al AWT

Astfel javax.swing.JWindow, javax.swing.JFrame, javax.swing.JDialog, si javax.swing.Japplet,

extind componentele AWT :

java.awt.Window, java.awt.Frame, java.awt.Dialog, si java.applet.Applet

Page 49: Curs 5 Paradigma orientata eveniment

49

Componentele Swing derivate din JComponent

Page 50: Curs 5 Paradigma orientata eveniment

50

Componentele Swing Componentele usoare ale Swing au la baza in

ierarhie pe javax.swing.JComponent

Care la randul ei extinde java.awt.Container

Componentele usoare sunt implementate complet in Java si nu au nici o legatura cu sistemul de operare gazda

Page 51: Curs 5 Paradigma orientata eveniment

51

Model-View-Controller (MVC)

Componentele Swing sunt bazate intern pe arhitectura MVC (Model-View-Controller)

In acest caz orice componenta este impartita in trei obiecte separate:

View

model:

controller:

Page 52: Curs 5 Paradigma orientata eveniment

52

Model-View-Controller (MVC)

De obicei interactiunile dintre controler si view sunt tratate in comun ca la Smalltalk

Page 53: Curs 5 Paradigma orientata eveniment

53

Componente MVC interne din JButton AWT si Swing nu determina totusi arhitectura intregii

aplicatii aceasta ramane la indemana programatorului. .

Page 54: Curs 5 Paradigma orientata eveniment

54

Organizarea componentelor in GUI

Clasele de nivel superior Swing classes - JWindow (Frame fara decoratiuni), JFrame, JDialog, si JApplet –folosesc un content pane implicit pe post de container pentru componente:

add (component); // in cadrul content pane propriu

javax.swing.JPanel si alte containere sunt utilizate sa organizeze containerele intro ierarhie (tridimensionala) conform necesitatilor aplicatiei

Page 55: Curs 5 Paradigma orientata eveniment

55

Gestionare de organizare in pagina Un gestionar de organizare (layout

managers) in pagina este un obiect care gestioneaza atat dimensiunea cat si pozitionarea unei/unor componente intr-un container

Page 56: Curs 5 Paradigma orientata eveniment

56

AWT si Swing furnizeaza un numar de organizatoareimplicite, printre care si:

flow, border, grid, si box

JFrame foloseste organizatorul border layout (Nord, Centru,..)

JPanel foloseste organizatorul flow (linie cu linie)

container.setLayout (new FlowLayout ());

Se poate usor dezvolta propriul gestionar de pozitionare prin implementarea lui LayoutManager(sau LayoutManager2 )

Gestionarii de pozitionare/ organizatorii sunt bazati pemodelul Strategy

Gestionare de organizare in pagina

Page 57: Curs 5 Paradigma orientata eveniment

57

Cateva organizatoare pentru unele containere

Page 58: Curs 5 Paradigma orientata eveniment

58

Tratarea evenimentelor GUI

Folosirea gestionarilor de evenimente om Java este numit modelul cu delegarea evenimentelor :

Procesarea unui eveniment este

Cand o componenta GUI este creata, se va inregistra si gestionarul de evenimente

Acesta va gestiona evenimente

Page 59: Curs 5 Paradigma orientata eveniment

59

Tratarea evenimentelor GUI Un gestionar de evenimente poate asculta / primi

evenimente de la mai multe surse de evenimente si de asemenea trata evenimente de diverse tipuri

component.addXListener (aListener);

Page 60: Curs 5 Paradigma orientata eveniment

60

Tratarea evenimentelor GUI void eventHandler (EventType event) { . . }

class MyClass implements EventTypeListener

{ . .

public void eventHandler (EventType e) {

// procesarea evenimet . .

}

}

De obicei gestionarii sunt definiti ca clase interioare anonime

. . new EventTypeListener () {

public void eventHandler (EventType e) {

poate accesa obiectul inclus }}

Page 61: Curs 5 Paradigma orientata eveniment

61

Ierarhia de evenimentea Java

etc..

Page 62: Curs 5 Paradigma orientata eveniment

62

Tratarea evenimentelor GUI

in AWT, fiecarui obiect eveniment i se asociaza un identificator

Interfetele pentru gestionarii de eveniment pot furniza multiple metode care sa separe un eveniment pe diverse nivele de detaliu (pressed, released, clicked)

Page 63: Curs 5 Paradigma orientata eveniment

63

Exemplu evenimente mauspublic class MouseFrame extends JFrame{

public MouseFrame () {

setSize (250, 300); setTitle ("Mouse moves");addMouseMotionListener

(new MouseMotionAdapter ()

{public void mouseMoved (MouseEvent e)

{System.out.println ("Mouse moved to [" +

e.getX () + ", " + e.getY ()+ "]");}

});

}}

Page 64: Curs 5 Paradigma orientata eveniment

64

Obiecte eveniment si clase gestionarActionEvent ActionListener

WindowEvent WindowListener

WindowAdapter

MouseEvent MouseListener

MouseAdapter

MouseMotionListener

MouseMotionAdapter

KeyEvent KeyListener

KeyAdapter

ItemEvent ItemListener

• XListener este o interfata

• XAdapter este o clasa care implementeaza interfatagestionar corespunzatoare

etc.

Page 65: Curs 5 Paradigma orientata eveniment

65

Tratarea evenimentelor GUI Observatii de implementare a gestionarilor

Nu trebuie efectuate calcule consumatoare de timp sau apelate explicit functii de intarziere in cadrul gestionarilor de eveniment ( exact ca la intreruperi)

Altfel interfata utilizatir a programului se va bloca deoarece evenimentele vor astepta in coada spre a fi tratate

Page 66: Curs 5 Paradigma orientata eveniment

66

Crearea unui frame simpluimport javax.swing.JFrame;

public class SimpleFrame extends JFrame

{

public static void main (String [ ] args) {

new SimpleFrame ().setVisible (true);

}

}

Page 67: Curs 5 Paradigma orientata eveniment

67

Cum se inchide corect o aplicatieimport javax.swing.*;

import java.awt.event.*;

public class ClosingFrame extends JFrame

{

public static void main (String [ ] args) {

JFrame frame = new ClosingFrame ();

frame.setSize (300, 200);

frame.addWindowListener (

new WindowAdapter () {

public void windowClosing(WindowEvent e) {

System.exit (0); }}); // ignora insusi evenimentul

frame.setVisible (true); frame.toFront ();

}

}

Page 68: Curs 5 Paradigma orientata eveniment

68

Ca si mai inainte metoida main creaza o fereastra (ClosingFrame), dar de aceasta data se vor defini niste proprietati (size) si apoi lasa controlul pentru procesare inputului utilizatorului

Cum se inchide corect o aplicatie

Page 69: Curs 5 Paradigma orientata eveniment

69

import javax.swing.*;

import java.awt.event.*;

import java.awt.*;

public class ButtonFrame extends JFrame {

private JButton button = new JButton ("Push");

private JPanel panel = new JPanel ();

. .

public static void main (String [ ] args) {

JFrame frame = new ButtonFrame ();

frame.setDefaultCloseOperation

(JFrame.EXIT_ON_CLOSE);

frame.setVisible (true); frame.pack ();

} . .

Adaugarea de componente la o fereastra

Page 70: Curs 5 Paradigma orientata eveniment

70

public ButtonFrame () // constructor

{

panel.add (button); // foloseste flow layout

add (panel); // implicit: CENTER

button.addActionListener (new ActionListener () {

public void actionPerformed (ActionEvent e) {

String text = button.getText () + ", again";

button.setText (text);

pack (); }});

}

Adaugarea de componente la o fereastra

Page 71: Curs 5 Paradigma orientata eveniment

EDP in .NET

71

Page 72: Curs 5 Paradigma orientata eveniment

WinForms WinForms - Este o alta denumire pentru aplicatii GUI

standard de tip windows

Page 73: Curs 5 Paradigma orientata eveniment

Abstractizare FCL se comporta ca un strat de abstractizare

System.Windows.Forms.Form

CLR

Windows OS

instantaclasei FCLobiect

Page 74: Curs 5 Paradigma orientata eveniment

Proprietatile Form

Acestea controleaza aparenta vizuala:

– AutoScroll

– BackgroundImage

– ControlBox

– FormBorderStyle (modificabil in dimensiune?)

– Icon

– Location

– Size

– StartPosition

– Text (i.e. de exemplu captura unei ferestre (caption)

– WindowState (minimizata, maximizata, normala)

Form1 form;form = new Form1();form.WindowState = FormWindowState.Maximized;form.Show();

Page 75: Curs 5 Paradigma orientata eveniment

Metodele Form Actiunile care pot fi efectuate de catre

un Form :

– Activate:

– Close:

– Hide:

– Refresh:

– Show:

– ShowDialog:

form.Hide(); ...

form.Show();

Page 76: Curs 5 Paradigma orientata eveniment

Evenimentele formei

– Load:

– Closing:

– Closed:

– Resize:

– Click:

– KeyPress:

Page 77: Curs 5 Paradigma orientata eveniment

Exemple

Intreaba utilizatorul inainte de a inchide

forma:private void Form1_Closing(object sender,

System.ComponentModel.CancelEventArgs e){

DialogResult r;

r = MessageBox.Show("Do you really want to close?", "MyApp", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);

if (r == DialogResult.No)e.Cancel = true;

}

Page 78: Curs 5 Paradigma orientata eveniment

Codul din spate

Evenimentele sunt gestionate de metode care sunt “in spatele” interfetei vizuale

Page 79: Curs 5 Paradigma orientata eveniment

Functii de tratare a evenimentelor (Call-backs)

Evenimentele sunt apelate de obiecte ascunse (din spate)…

Page 80: Curs 5 Paradigma orientata eveniment

Mai jos este prezentat “Codul din spate” al Form…

Proiectarea codului

Page 81: Curs 5 Paradigma orientata eveniment

Controale Sunt obiecte UI (User-interface)

de forma :

Etichete

butoane

Cutii text

Menu-ri

Cutii de listare sau mixte

Butoane de optiuni

Cutii de selectie

etc.

Page 82: Curs 5 Paradigma orientata eveniment

Abstractiuni Ca si formele (forms), controalele sunt bazate pe clase

din Framework Class Library – FCL cum ar fi:

System.Windows.Forms.Label

System.Windows.Forms.TextBox

System.Windows.Forms.Button

etc.

Controalele sunt instante

ale acestor clase

obiect

obiect

obiect

obiect

obiect

obiect

Page 83: Curs 5 Paradigma orientata eveniment

Cine creaza aceste obiecte? Codul de control al instantelor

Este auto generat automat de catre Visual Studio

Cand o forma este creata sunt create si controalele ei

Page 84: Curs 5 Paradigma orientata eveniment

Butoane de comanda Foloste pentru utilizatorul care

efectueaza un task (accepta/nu nisteoptiuni, etc)

Proprietati mai importante:– Text:

– Font:

– Enabled:

Evenimente mai importante:– Click:

private void cmdAdd_Click(...){

int i, j, k;i = System.Convert.ToInt32( this.txtNum1.Text );j = System.Convert.ToInt32( this.txtNum2.Text );k = i + j; MessageBox.Show( "Sum = " + k.ToString() );

}

Page 85: Curs 5 Paradigma orientata eveniment

Cutii de text Foloste pentru afisare text sau pentru introducere /

modificare date Propprietati de baza:

– Text:refere continutul text (a string)– Modified:– ReadOnly:

Diverse tipuri de cutii text– MultiLine:– ScrollBars:

Evenimente mai importante:– Enter, Leave:– KeyPress:– KeyDown, KeyUp:– TextChanged:– Validating si Validated

Page 86: Curs 5 Paradigma orientata eveniment

Python Event Driven Programming

86

Page 87: Curs 5 Paradigma orientata eveniment

EDP in Python folosind cs1graphics

class BasicHandler(EventHandler):

def handle(self, event):

print 'Event Triggered'

Page 88: Curs 5 Paradigma orientata eveniment

Inregistrarea unui gestionar pentru un obiect grafic

Codul urmator va afisa 'Event Triggered' de fiecare data cand se da un click pe Canvas.

simple = BasicHandler()

# se creaza gestionarul obiectului

paper = Canvas()

paper.addHandler(simple)

#se asociaza/ataseaza gestionarul la obiectulgestionat

Page 89: Curs 5 Paradigma orientata eveniment

Un gestionar care retine starile (statefull)#in acest caz gestionarul va retine numarul total de click-uri care #au fost efectuate asupra lui si il va afisa la consolaclass CountingHandler(EventHandler):

def __init__(self):EventHandler.__init__(self) #apel parinteself.__count = 0 #constructor

def handle(self, event):self._count += 1print 'Event Triggered. Count: ', self._count

class TallyHandler(EventHandler):

def __init__(self, textObj):EventHandler.__init__(self)

self.__count = 0

self._text = textObj

self._textObj.setMessage(str(self._count)) #reset la 0

def handle(self, event):self._count += 1

self._textObj.setMessage(str(self._count))

Page 90: Curs 5 Paradigma orientata eveniment

90

Gestionar care se inchide dupa un singur evenimentclass HandleOnce(EventHandler):

def __init__(self, eventTrigger):EventHandler.__init__(self)self._trigger = eventTrigger

def handle(self, event):print "That's all folks!!!"self._trigger.removeHandler(self)

paper = Canvas( )oneTime = HandleOnce(paper)paper.addHandler(oneTime)

paper = Canvas(100,100)

score = Text(' ', 12, Point(40,40))

paper.add(score)

referee = TallyHandler(score) #creare gestionar

paper.addHandler(referee) #activare gestionar

Un gestionar care retine starile (statefull)

Page 91: Curs 5 Paradigma orientata eveniment

91

Evenimente Maus Pentru a afla tipul evenimentului se va folosi metoda

getDescription(). In cazul soricelului tipurile de eveniment pot fi :

'mouse click' – buton de maus apasat 'mouse release' – buton de maus eliberat 'mouse drag' – maus miscat

Pentru a afla coordonatele maus-ului se va folosi metodagetMouseLocation().

Aceasta va intoarce coordonatele maus cand se face click.

#Deseneaza un cerc atunci cand se da un click pe maus.class CircleDrawHandler(EventHandler):

def handle(self, event):if event.getDescription() == 'mouse click':

c = Circle(5, event.getMouseLocation())event.getTrigger().add(c) #adauga cercul la canvas

Page 92: Curs 5 Paradigma orientata eveniment

92

Evenimente Mauspaper = Canvas(100,100)handler = CircleDrawHandler( )paper.addHandler(handler)

Page 93: Curs 5 Paradigma orientata eveniment

93

class ClickAndReleaseHandler(EventHandler):def __init__(self):

EventHandler.__init__(self)self._mouseDragged = False

def handle(self, event):if event.getDescription( ) = 'mouse click':

self._mouseDragged = Falseelif event.getDescription() = 'mouse drag'

self._mouseDragged = Trueelif event.getDescription() == 'mouse release':

if self._mouseDragged:print 'Mouse was dragged'

else:print 'Mouse was clicked without dragging'

paper = Canvas( )dragDetector = ClickAndReleaseHandler()paper.addHandler(dragDetector)

Page 94: Curs 5 Paradigma orientata eveniment

94

Evenimente de tastatura Se poate folosi metoda getKey() care va determina care cheie a

fost apasata Mai jos este un cod ce afiseaza tasta apasata intr-un widget tip

Canvas Text.class KeyHandler(EventHandler):

def __init__(self, textObj):EventHandler.__init__(self)self._textobj = textObj

def handle(self, event):if event.getDescription( ) = 'keyboard':

self._textObj.setMessage(self._textObj.getMessage() +event.getKey())

elif event.getDescription() = 'mouse click'self._textObj.setMessage(' ') #sterge textul

paper = Canvas( )textDisplay = Text(' ', 12, Point(100,100))paper.add(textDisplay)echo = KeyHandler(textDisplay)paper.addHandler(echo)

Page 95: Curs 5 Paradigma orientata eveniment

95

Timerealarm = timer(10, True)

#10: ceas-ul va genera un eveniment dupa 10 secunde.

#True: inseamna ca ceas-ul va repeta la nesfarsit secventa la 10s.

alarm.start() #porneste ceasul.

Urmatorul exemplu bate secunda.

alarm = Timer(1, True)

stopwatch = CountingHandler()

alarm.addHandler(stopwatch)

print 'Ready . . .'

alarm.start( ) #afiseaza gata la fiecare secunda.

Page 96: Curs 5 Paradigma orientata eveniment

96

Rotirea unui cerc Urmatorul exemplu roteste un cerc in jurul unui punct

din afara cercului.class RotationHandler(EventHandler):

def __init__(self, shape):self._shape = shape

def handle(self, event):self._shape.rotate

paper = Canvas(100,100)sampleCircle = Circle(20, Point(50,20))sampleCircle.adjustReference(0,30)paper.add(sampleCircle)alarm = Timer(0.1, True)rotator = RotationHandler(sampleCircle)alarm.addHandler(rotator)alarm.start()

Page 97: Curs 5 Paradigma orientata eveniment

97

Utilizarea monitarelorclass ShapeHandler(EventHandler):

def __init__(self, monitor):EventHandler.__init__(self)self._monitor = monitor

def handle(self, event):if event.getDescription( ) == 'mouse drag':

self._monitor.release( ) #elibereaza la miscarea mauspaper = Canvas()checkpoint = Monitor()handler = ShapeHandler(checkpoint)cir = Circle(10, Point(50,50))cir.setFillColor('blue')cir.addHandler(handler)paper.add(cir)checkpoint.wait() #se asteapta pana cand maus-ul este miscat in interiorul

cerculuipaper.setBackgroundColor('green')

Page 98: Curs 5 Paradigma orientata eveniment

98

Adaugarea si mutarea de forme geometrice(Shape) pe Canvas

class ShapeHandler(EventHandler):

def __init__(self):

EventHandler.__init__(self):

self._mouseDragged= Falsedef handle(self, event):

shape = event.getTrigger( )

if event.getDescription( ) == 'mouse drag':old = event.getOldMouseLocation( )new = event.getMouseLocation( )shape.move(new.getX()–old.getX(),new.getY() -

old.getY( )

Page 99: Curs 5 Paradigma orientata eveniment

99

self._mouseDragged = Trueelif even.getDescription( ) == 'mouse click':

self._mouseDragged = Falseelif event.getDescription() == 'mouse release':

if not self._mouseDragged:shape.scale(1.5)

elif event.getDescription() == 'keyboard':shape.setFillColor(Color.randomColor())

class NewShapeHandler(EventHandler):

def __init__(self):

EventHandler.__init__(self)

self._shapeCode = 0

self._handler = ShapeHandler()

#o singura instanta va gestiona toate formele

Adaugarea si mutarea de forme geometrice(Shape) pe Canvas

Page 100: Curs 5 Paradigma orientata eveniment

100

def handle(self, event):if event.getDescription() == 'mouse click':

s = Circle(10)elif self._shapeCode == 1:

s = Square(10)elif self._shAapeCode == 2

s = Rectangle(15, 5)elif self._shapeCode == 3:

s = Polygon(Point(5,5), Point(0,-5),Point(-5,5))self._shapeCode = (self._shapeCode+1)% 4#avanseaza ciclic (prin multimea de forme)s.move(event.getMouseLocation().getX(),

event.getMouseLocation().getY())s.setFillColor('white')event.getTrigger().add(s) #adauga shape la canvass.addHandler(self._handler)

#inregistreaza ShapeHandler cu noul Shapepaper = Canvas(400, 300, 'white', 'Click me!')paper.addHandler(self._handler) #instantiaza gestionarul si le inregistreaza pe toate o data

Adaugarea si mutarea de forme geometrice (Shape) pe Canvas

Page 101: Curs 5 Paradigma orientata eveniment

Clase eveniment pentru Android

Looper

Handler

MessageQueue

Message

Page 102: Curs 5 Paradigma orientata eveniment

Adaugare servicii in Android (versiunea newbie)

UI clicks and

intents

Activity

Activity

Receiver

main event loop

main/UI thread

Service

Provider

Service

binder thread pool

incoming binder

messages

Page 103: Curs 5 Paradigma orientata eveniment

103

‹Event-driven ‹architecture

‹(EDA)

Page 104: Curs 5 Paradigma orientata eveniment

Arhitectura orientata eveniment EDA ?

‹ Reprezinta un model arhitectural care promoveaza detectia, consumul si reactia la apariatia unor evenimente

Producatorevenimente

Procesorevenimente

Consumatorde

evenimente

Page 105: Curs 5 Paradigma orientata eveniment

Comportamentul bazat pe evenimente al unei aplicatii

Event-driven apps

Observare

Procesarepredictiva

Diseminareainformatiei

Comportamentoperational

dinamic

Diagnostic activ

Page 106: Curs 5 Paradigma orientata eveniment

Ratiuni pentru dezvoltarea de aplicatiibazate pe EDP/EDA

‹ Exploatarea mai buna a paralelismului intrinsec si extrinsec

‹ O mai buna proiectare a sistemului‹ (de obicei fiecare eveniment isi are propriul gestionare (single

responsibility)

‹ Reducerea dependentelor din system (dependencies)

‹ Reducera gradului de cuplare intre module (coupling)

‹ Testare mai usoara

‹ Monitorizare in timpul executiei

‹ Scalabilitate

‹ O intretinere mai usoara

‹ etc

Page 107: Curs 5 Paradigma orientata eveniment

Publicare/Subscriere - PubSub

Publisher

Topica

Subscriber Subscriber

Consuma evenimentul

Publica un eveniment

Consuma evenimentul

Page 108: Curs 5 Paradigma orientata eveniment

Publicare/Subscriere bazata pe topica

Publisher

Topica

Subscriber Subscriber

Publica evenimentul

SubtopicaSubscriber

Consuma evenimentul

Consuma evenimentul Consuma evenimentul

Page 109: Curs 5 Paradigma orientata eveniment

Punct la Punct

Publisher SubscriberQueue

Page 110: Curs 5 Paradigma orientata eveniment

Cerere-Raspuns

Publisher/Subscriber

SubscriberTopic

Subscriber

Subscriber

Page 111: Curs 5 Paradigma orientata eveniment

Stocheaza si Retrimite

Publisher /Subscriber

SubscriberTopic

Subscriber

Subscriber

Data

Page 112: Curs 5 Paradigma orientata eveniment

Pipeline

Publisher SubscriberTopic Subscriber Subscriber

Page 113: Curs 5 Paradigma orientata eveniment

Mesaje inter- si intra- module/entitati‹ Transfer intern de mesaje in memorie cu cu ajutorul

selectorului de devenimente (dispatcher)

‹ Transfer intra- se poate realiza folosind

Page 114: Curs 5 Paradigma orientata eveniment

Products and technologies‹ Produse bazate pe protocolul XMPP

‹ Ejabberd

‹ Produse bazate pe protocolul AMQP ‹ RabbitMQ

‹ OpenAMQP

‹ Apache QPID

‹ Produse bazate pe protocolul STOMP ‹ ActiveMQ

‹ JMS

‹ Altele (MS)‹ MSMQ

‹ Azure Service Bus

‹ ZeroMQ

Page 115: Curs 5 Paradigma orientata eveniment

XMPP Extensible Messaging and Presence Protocol

(XMPP)

Un protocol de comunicare pentru aplicatii midlewareorientate pe mesaje care foloseste XML

115

Page 116: Curs 5 Paradigma orientata eveniment

AMQP protocol The Advanced Message Queuing Protocol (AMQP)

Protocol pentru layer de aplicatii open standard folosit in middleware orientate mesaj

Page 117: Curs 5 Paradigma orientata eveniment

RabbitMQ este un broker de mesaje open source saumiddleware orientat pe mesaje care implementeaza protocolul(AMQP).

RabbitMQ

STOMP Simple (or Streaming) Text Oriented Message Protocol

(STOMP), CUNOSCUT ANTERIOR CA TTMP, este un protocol simplu bazat pe text specific middleware orientate mesaj

Page 118: Curs 5 Paradigma orientata eveniment

ActiveMQ Apache ActiveMQ este un broker de mesaje open

source scris in Java impreuna cu un client complet de Java Message Service (JMS).

118

Page 119: Curs 5 Paradigma orientata eveniment

JMS API-ul Java Message Service (JMS) este un

middleware orientat pe servicii bazat pe Java (MOM) API

119

Page 120: Curs 5 Paradigma orientata eveniment

MSMQ Microsoft Message Queuing sau MSMQ este o

coada de mesaje deszoltata de MS si instalata in serverele acestuia incepand cu NT4

120

Windows Azure Service Bus

O infrastructura pentru comunicare prin mesaje intreaplicatii folosita pentru

Page 121: Curs 5 Paradigma orientata eveniment

ZeroMQ

ØMQ un alt sistem de mesaje orienta pemiddleware utilizat pentru dezvoltarejocuri, servicii financiare, sisteme embededcercetare si industria aerospatiala

121

Page 122: Curs 5 Paradigma orientata eveniment

122

Procesarea evenimentelor complexe

“Complex Event Processing (CEP) reprezinta un set detehnici si instrumente folosite pentru a intelege sicontrola sistemele de infomatii conduse/bazate peevenimente

Ceeste un eveniment complex ?• Un eveniment care apare ca un rezultat al unei

combinatii complexe de alte evenimente

Page 123: Curs 5 Paradigma orientata eveniment

123

EDA Definition:• Au o buna decuplare intre module – creatorul

evenimentului nu are ciunostiinte depreconsumarea acestuia

• Stiluri de procesare a unui eveniment• Procesare simpla –• Procesare pe flux: • Procesare complexa:

CEP – este o parte a EDA - Event Driven Architecture

Page 124: Curs 5 Paradigma orientata eveniment

124

Exemplu de arhitectura EDA

Page 125: Curs 5 Paradigma orientata eveniment

125

Aplicatii tipice CEP

Page 126: Curs 5 Paradigma orientata eveniment

126

CEP Comparison to traditional App

SQL – standard query language

Datele sunt mai statice in general

Query complexe sunt rare

Nu este potrivita pentru >mii queries / second

Se pot crea declansatoare peeveniment dar sunt lente

Page 127: Curs 5 Paradigma orientata eveniment

Referinte http://www.cs.gsu.edu/~cscnxx/index-2310.html

http://www.december.com/html/x1

http://www.cs1graphics.org/

David Luckham, The Power of Events: An Introduction to Complex Event Processing in Distributed Enterprise Systems Hardcover , Addison-Wesley Professional, 2002

http://www.complexevents.com/

http://dist.codehaus.org/esper/NYJavaSIG_May_30_2007.pdf

127

Page 128: Curs 5 Paradigma orientata eveniment

No Events here!!!

128