Curs 5 Paradigma orientata eveniment

Post on 02-Feb-2017

265 views 5 download

Transcript of Curs 5 Paradigma orientata eveniment

Curs 5

1

EvenimenteUn eveniment poate fi definit ca un tip

de semnal catre program.

Acesta ii indica programului ca ceva s-a intamplat

Forma generala a unui eveniment in EDP

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

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

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

}

}

Avantajele procesarii orientate eveniment

Sunt mai portabile

Permit tratarea mai rapida

Se pot folosi de suportul sistemului de operare

Incurajeaza reutilizarea codului.

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

Diagarama de secventa pentru EDPApp

User

: Event

Handler

: Event

Mapper

: UI

Object

actiuni

Genereazaevenimente

Distribuieevenimente

Inregistreazagestionarul de evenimente

procesareevenimente

Tratarea evenimentelor

10

Dispatcher/Distribuitor/Mapper:

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

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

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";

}

Secvential EDP

Text putin modest

GUI inutil majoritar

Proiectarea unei aplicatii EDP - GUI

• Stabilirea interactiunii vizuale si a evenimentelor:

Look & Feel

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

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)

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

Desi fiecare fereastra este un widget

Nu toate widget sunt ferestre

EDP in HTML

19

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>

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!");

}

22

Citirea date de la utilizator

Un element HTML are urmatoarea structura

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")

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 + "!");

}

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!");

}}

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!");

}

EDP in Java

27

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

Exemplu GUI

{Frame}

eticheta{label}

Camp text{textfield}

buton{button}

componente

Clase eveniment

AWTEvent EventObject

AdjustmentEvent

ComponentEvent

TextEvent

ItemEvent

ActionEvent

InputEvent

WindowEvent

MouseEvent

KeyEvent

ContainerEvent

FocusEvent

PaintEvent

ListSelectionEvent

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

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

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

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

35

java.awt.event.ActionEvent

java.awt.event.ActionEvent

+getActionCommand(): String

+getModifiers(): int

+getWhen(): long

java.util.EventObject

+getSource(): Object

java.awt.event.AWTEvent

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).

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

}

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

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

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

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.

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)

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

44

AWT components

45

Modele de proiectare AWT

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

Modelu pod (bridge) permite existentametodelor pereche

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

47

Relatia dintre componentele AWT si cele de nivel superior ale Swing

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

49

Componentele Swing derivate din JComponent

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

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:

52

Model-View-Controller (MVC)

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

53

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

aplicatii aceasta ramane la indemana programatorului. .

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

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

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

57

Cateva organizatoare pentru unele containere

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

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);

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 }}

61

Ierarhia de evenimentea Java

etc..

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)

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 ()+ "]");}

});

}}

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.

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

66

Crearea unui frame simpluimport javax.swing.JFrame;

public class SimpleFrame extends JFrame

{

public static void main (String [ ] args) {

new SimpleFrame ().setVisible (true);

}

}

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 ();

}

}

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

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

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

EDP in .NET

71

WinForms WinForms - Este o alta denumire pentru aplicatii GUI

standard de tip windows

Abstractizare FCL se comporta ca un strat de abstractizare

System.Windows.Forms.Form

CLR

Windows OS

instantaclasei FCLobiect

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();

Metodele Form Actiunile care pot fi efectuate de catre

un Form :

– Activate:

– Close:

– Hide:

– Refresh:

– Show:

– ShowDialog:

form.Hide(); ...

form.Show();

Evenimentele formei

– Load:

– Closing:

– Closed:

– Resize:

– Click:

– KeyPress:

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;

}

Codul din spate

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

Functii de tratare a evenimentelor (Call-backs)

Evenimentele sunt apelate de obiecte ascunse (din spate)…

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

Proiectarea codului

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.

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

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

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() );

}

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

Python Event Driven Programming

86

EDP in Python folosind cs1graphics

class BasicHandler(EventHandler):

def handle(self, event):

print 'Event Triggered'

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

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))

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)

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

92

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

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)

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)

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.

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()

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')

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( )

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

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

Clase eveniment pentru Android

Looper

Handler

MessageQueue

Message

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

103

‹Event-driven ‹architecture

‹(EDA)

Arhitectura orientata eveniment EDA ?

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

Producatorevenimente

Procesorevenimente

Consumatorde

evenimente

Comportamentul bazat pe evenimente al unei aplicatii

Event-driven apps

Observare

Procesarepredictiva

Diseminareainformatiei

Comportamentoperational

dinamic

Diagnostic activ

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

Publicare/Subscriere - PubSub

Publisher

Topica

Subscriber Subscriber

Consuma evenimentul

Publica un eveniment

Consuma evenimentul

Publicare/Subscriere bazata pe topica

Publisher

Topica

Subscriber Subscriber

Publica evenimentul

SubtopicaSubscriber

Consuma evenimentul

Consuma evenimentul Consuma evenimentul

Punct la Punct

Publisher SubscriberQueue

Cerere-Raspuns

Publisher/Subscriber

SubscriberTopic

Subscriber

Subscriber

Stocheaza si Retrimite

Publisher /Subscriber

SubscriberTopic

Subscriber

Subscriber

Data

Pipeline

Publisher SubscriberTopic Subscriber Subscriber

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

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

XMPP Extensible Messaging and Presence Protocol

(XMPP)

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

115

AMQP protocol The Advanced Message Queuing Protocol (AMQP)

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

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

ActiveMQ Apache ActiveMQ este un broker de mesaje open

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

118

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

middleware orientat pe servicii bazat pe Java (MOM) API

119

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

ZeroMQ

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

121

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

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

124

Exemplu de arhitectura EDA

125

Aplicatii tipice CEP

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

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

No Events here!!!

128