Apache Trinidad

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    1 Favorite & 1 Group

    Apache Trinidad - Presentation Transcript

    1. Apache Trinidad Hochwertige JSF Komponenten und vieles mehr...
      • Das Trinidad Projekt
      • Die Komponenten
        • Welche Komponenten finden sich wo?
        • Demonstration einiger Komponenten
      • Das Framework
        • HTML Ajax RenderKit
        • Dialog Framework
        • Optimierte Komponentenspeicherung
        • Menu Model Abstraction
        • Maven 2 Faces plugin
        • Personalization Framework
        • RenderKit Skinning Architektur
    2. Das Apache Trinidad Projekt
      • Schenkung von Oracle
      • Gesponsert von der Apache MyFaces PMC
        • Mentor Craig McClanahan (Mr. Struts)
      • Apache Incubator bis Sonntag
        • 8 Committer (vier von Oracle)
        • Wachsende Community
      • Unterprojekt von MyFaces (seit Sonntag)
      • Apache 2.0 Lizenz
    3. Was wurde eingebracht [1]?
      • JSF Komponenten
        • rund 100 Komponenten plus Zusatz-Features
      • Darüber hinaus
        • HTML AJAX RenderKit
        • Dialog Framework
        • Optimierte Speicherung des Komponentenstatus
        • Test Framework
    4. Was wurde eingebracht [2]?
      • Menu Model Abstraktion
      • Maven 2 Faces Plugin
        • Um Trinidad zu builden
        • Generiert Komponenten, Tags und XML-Dateien
      • Personalization Framework
      • RenderKit Skinning Architektur
      • Unterstützung von Facelets!
    5. Arbeiten mit Apache Trinidad Der tägliche Umgang mit Apache Trinidad
    6. Das Trinidad-Projekt (1)
      • http://incubator.apache.org/adffaces
      • Wiki-Seite
        • http://wiki.apache.org/myfaces/Trinidad
      • SVN-Checkout
        • https://svn.apache.org/repos/asf/incubator/adffaces/trunk/
      • Bilden des Projekts (Konsole):
        • cd trinidad/trinidad
        • mvn install
    7. Das Trinidad-Projekt (2)
      • Trinidad Archetype
        • lauffähiges Projekt-Gerüst mit Maven/Trinidad
      mvn archetype:create -DarchetypeGroupId=org.apache.myfaces.trinidadbuild -DarchetypeArtifactId=myfaces-archetype-trinidad -DarchetypeVersion=incubator-m1-SNAPSHOT -DgroupId=myAppId -DartifactId=testApp
    8. Das Trinidad-Projekt (3)
      • Trinidad JAR Files
        • trinidad-api-1.0.0-incubating
        • trinidad-impl-1.0.0-incubating
      • Erstes Release innerhalb Apache
        • Download via webpage
        • Maven2 Incubator Repository
        • http://wiki.apache.org/myfaces/Trinidad
    9. Die Projektstruktur (1)
      • 4 Module
        • trinidad-api
          • Basisklassen, abstrakte Klassen
          • Eingriff nur für Trinidad-Entwickler notwendig
        • trinidad-impl
          • Renderer-Klassen, Util-Klassen, Funktionalität…
          • Eingriff bei Erstellung/Veränderung von Komponenten
        • trinidad-demo
    10. Die Projektstruktur (2)
      • trinidad-build
        • zentrale Stelle für Definierung von
          • Komponenten
          • Renderern
          • Validatoren
          • Konvertern
          • Events
        • rinidad-buildsrcmain esourcesMETA-INFmaven-faces-plugin
        • Generierung von Komponenten- & Tag-Klassen
    11. JSF Komponentenentwicklung
      • Schreiben von Komponenten-, Render-, Tag-Klassen
      • Definierung der Klassen/Zuordnungen in XML
      • Abläufe immer sehr ähnlich
      • fehleranfällig
      • “ unnötiger” Schreibaufwand
      • Einzig echter Aufwand
        • Implementierung des Renderers
    12. Komponenten in Trinidad
      • Nur schreiben der Rendererklasse
      • in trinidad-impl
        • trinidad-implsrcmainjavaorgapachemyfaces rinidadinternal enderkitcore
      • Definierung der Komponente in trinidad-build
      • Refactoring & Generierung bei mvn install in Trinidad-.jars
        • trinidad-api: Komponentenklassen
        • trinidad-impl: Rendererklassen
        • trinidad-impl: Taglibs
          • Facelet’s Support for free, almost free...
    13. Die Komponenten von Trinidad Zurücklehnen und Entspannen!
    14. Core Komponenten [1]
      • • <tr:breadCrumbs/> -Navigation
      • • <tr:chart/> - Diagramm
      • • <tr:chooseColor/> - Datumseingabe
      • • <tr:chooseDate/> - Farbeingabe
      • • <tr:column/> - Spalte
      • • <tr:commandButton /> - Button
      • • <tr:commandLink /> - Schaltfläche
    15.  
    16. Core Komponenten [1]
    17. ChooseDate
      • Die chooseDate Komponente wird mit einer inputDate Komponente verwendet
      • Schnelle Auswahl eines Datums ohne zweites Fenster
      < tr:chooseDate id= &quot; ch1 &quot; shortDesc=&quot;Choose Date&quot;/> < tr:inputDate id=&quot;df1a&quot; chooseId= &quot; ch1 &quot; shortDesc=&quot;Choose Date&quot;/>
    18. Core Komponenten [2]
      • • <tr:commandNavigationItem /> - Navigation
      • • <tr:document/> - Seitencontainer
      • • <tr:form/> - Formular
      • • <tr:goButton /> - Button (kein Action)
      • • <tr:goLink /> - Link (kein Action)
      • • <tr:group /> - Gruppierung
      • • <tr:icon /> - Skin Icon
    19. Document
      • Generiert die HTML Elemente:
        • <html>, <body>, und <head>
      • Kann ebenso in allen nicht-HTML Seiten verwendet werden
      <tr:document> <f:facet name=&quot;metaContainer&quot; > <f:verbatim><script...../></f:verbatim> </f:facet> </tr:document>
    20. Core Komponenten [3]
      • • <tr:image /> - Bild (<img>)
      • • <tr:importScript /> - Script Imports
      • • <tr:inputColor /> - Farbeingabe
      • • <tr:inputDate /> - Datumseingabe
      • • <tr:inputFile /> - Upload
      • • <tr:inputHidden /> - Hidden Field
      • • <tr:inputListOfValues /> aka LOV 
    21. Core Komponenten [3]
    22. Core Komponenten [3]
    23. ListOfValues
      • Spezialform einer text field Komponente
      • Mit Dialogsupport um einen Wert auszuwählen
        • Trinidad Dialog Framework (später)
      <tr:inputListOfValues label=&quot;Country:&quot; value=&quot;#{bean.value}&quot; searchDesc=&quot;Pick your country&quot; action=&quot;dialog:periodicTable&quot; />
    24. Core Komponenten [4]
      • • <tr:inputNumberSpinbox /> - Spinbox
      • • <tr:inputText /> - Text
      • • <tr:iterator /> - besseres forEach
      • • <tr:legend /> - Legende
      • • <tr:media /> - „Multimedia“
      • • <tr:message /> - FacesMessage
      • • <tr:messages /> - Messages...
    25.  
    26. InputNumberSpinbox
      • Spezielle input Komponente (für Zahlen)
      • Input Widget mit rauf/runter Pfeilen
      • stepSize
      <tr:inputNumberSpinbox value=&quot;#{bean.year}&quot; minimum=&quot;1900&quot; maximum=&quot;2050&quot; />
    27. Core Komponenten [5]
      • • <tr:navigationPane/> - Navigationscontainer
      • • <tr:navigationTree /> - Navigationscontainer
      • • <tr:outputDocument /> - Text Format
      • • <tr:outputFormatted /> - HTML Ausgabe
      • • <tr:outputLabel /> - Label
      • • <tr:outputText /> - Textausgabe
      • • <tr:page /> - Seiten Layout
    28.  
    29. NavigationPane / Tree
      • Generiert mehrere navigation items
      • Ein Knoten, der im Focus liegt, wird als selected gerendert.
      <tr:navigationPane hint=&quot;tabs&quot; > <tr:commandNavigationItem text=&quot;Page 1&quot; partialSubmit=&quot;true&quot; actionListener = &quot;#{demoCommandNavigationItem.navigationIt emAction}&quot; />... </tr:navigationPane>
    30. Core Komponenten [6]
      • • <tr:panelAccordion /> - Accordion
      • • <tr:panelBorderLayout /> - Layout
      • • <tr:panelBox /> - Layout
      • • <tr:panelButtonBar /> - Button-Layout
      • • <tr:panelChoice /> - Choice-Layout
      • • <tr:panelFormLayout /> - Form-Layout
      • • <tr:panelGroupLayout/> - Gruppen-Layout
    31. Core Komponenten [6]
    32.  
    33. Core Komponenten [7]
      • • <tr:panelHeader /> - Header für Bereich
      • • <tr:panelHorizontalLayout /> - Layout
      • • <tr:panelLabelAndMessage /> - Container *
      • • <tr:panelList /> - HTML Listen
      • • <tr:panelPage /> - page-Erweiterung
      • • <tr:panelPageHeader /> - Page-Header
      • • <tr:panelPartialRoot /> - PPR Support
    34.  
    35.  
    36. PanelLabelAndMessage
      • Layout Komponente
      • Kindkomponenten meistens input Komp.
      • Facetunterstützung (help/end)
      <tr:panelLabelAndMessage for=&quot;selectDate &quot;> <f:facet name=&quot;help&quot; > <tr:outputText value=&quot;Pick a date&quot;/> </f:facet> <tr:inputDate id=&quot;selectDate&quot;simple=&quot;true&quot;/> </tr:panelLabelAndMessage>
    37. Core Komponenten [8]
      • • <tr:panelRadio /> - Wie panelChoice
      • • <tr:panelSideBar /> - Seitennavigation
      • • <tr:panelTabbed /> - Tabs...
      • • <tr:panelTip /> - Hinweise
      • • <tr:poll/> - PPR Komponente
      • • <tr:processChoiceBar /> - Button + Choice
      • • <tr:progessIndicator /> - PPR Fortschritt
    38.  
    39.  
    40. Poll / ProgressIndicator
      • Poll sendet PPR Request (in Millisek.)
      • ProgressIndicator hat spezielle Modelklasse
        • BoundedRangeModel (abstract) und impl DefaultBoundedRangeModel
      <tr:poll id= &quot; poll &quot; interval= &quot; 2000 &quot; /> <tr:progressIndicator action= &quot; end &quot; partialTriggers= &quot; poll &quot; value= &quot; #{bean.model} &quot; > ..
    41. Core Komponenten [9]
      • • <tr:resetButton /> - Button
      • • <tr:selectBooleanCheckbox /> - Checkbox
      • • <tr:selectBooleanRadio /> - Radio-Button
      • • <tr:selectItem /> - Select Item
      • • <tr:selectManyCheckbox /> - „many“ Checkbox
      • • <tr:selectManyListbox /> - „many“ Listbox
    42. SelectManyCheckbox
      • Generiert mehrere checkbox Felder
      <tr:selectManyCheckbox label=&quot;Label&quot; value=&quot;#{list.intArray}&quot; > <tr:selectItem label=&quot;First&quot; value=&quot;1&quot; /> <tr:selectItem label=&quot;Second&quot; value=&quot;2&quot; /> <tr:selectItem label=&quot;Third&quot; value=&quot;3&quot; /> </tr:selectManyCheckbox>
    43. Core Komponenten [10]
      • • <tr:selectManyShuttle /> - Picklist
      • • <tr:selectOneChoice /> - Choice-Auswahl
      • • <tr:selectOneListbox /> - Listbox-Auswahl
      • • <tr:selectOneRadio /> - Radio-Auswahl
      • • <tr:selectOrderShuttle /> - Picklist
      • • <tr:selectRangeChoiceBar /> - Range-Auswahl
      • • <tr:separator /> - Separation
    44.  
    45.  
    46. Shuttle Komponenten
      • Komponente um Werte von vorne nach hinten zu verschieben („pick list“)
      <tr:selectManyShuttle value=„#{bean.value} ”> <f:selectItems value=“#{bean.items}” /> </tr:selectManyShuttle> <tr:selectOrderShuttle reorderOnly=“true” > ...
    47. Core Komponenten [11]
      • • <tr:showDetail /> - „Toggling“
      • • <tr:showDetailHeader /> - „Toggling“
      • • <tr:showDetailItem /> - Detail-Item
      • • <tr:singleStepButtonBar /> - 1vonN-Button
      • • <tr:spacer /> - Leer-Element
      • • <tr:subform /> - Teil-Formular
    48.  
    49. SingleStepButtonBar
      • Rendert zwei Buttons
        • Previous
        • Next
        • Text für den aktuellen „state“
      <tr:singleStepButtonBar id=&quot;singleStep1&quot; selectedStep=&quot;2&quot; maxStep=&quot;5&quot; text=&quot;Stage&quot; previousAction=&quot;#{action.app1}&quot; nextAction=&quot;#{action.app2} &quot; />
    50. Core Komponenten [12]
      • • <tr:table /> - Tabelle
      • • <tr:train /> - Train
      • • <tr:tree /> - Tree
      • • <tr:treeTable /> - TreeTable
    51.  
    52. Core Komponenten [12]
    53. Table - Sortieren <tr:column sortProperty=&quot;nachname&quot; sortable=&quot;true&quot; headerText=&quot;Nachname&quot; formatType=&quot;text&quot;> <tr:outputText value=&quot;#{person.nachname}&quot;/> </tr:column>
    54. Table - Selektieren <tr:table binding=&quot;#{mybean.table}&quot; rowSelection=&quot;multiple&quot; ...> <f:facet name=&quot;footer&quot;> <tr:commandButton text=&quot;Delete&quot; actionListener=&quot;#{mybean.performDelete}&quot;/> </f:facet> ... </tr:table>
    55. Table – Selektieren - Backend
      • public void performDelete(ActionEvent action) {
      • Set<String> selection = table.getSelectionState().getKeySet();
      • List<Person> selectedObjects = new ArrayList<Person>();
      • for (String rowKey: selection) {
      • table.setRowKey(rowKey);
      • selectedObjects.add((Person) table.getRowData());
      • }
      • personList.removeAll(selectedObjects);
      • table.getSelectionState().clear();
      • }
    56. HTML Komponenten
      • • <tr:body />
      • • <tr:cellFormat />
      • • <tr:frame />
      • • <tr:frameBorderLayout />
      • • <tr:head />
      • • <tr:html />
      • • <tr:rowLayout />
      • • <tr:script />
      • • <tr:styleSheet />
      • • <tr:tableLayout />
    57. Helfer Objekte [1]
      • • <tr:attribute /> (nicht im JSF 1.2 branch)
      • • <tr:forEach /> (nicht im JSF 1.2 branch)
      • • <tr:validator /> (nicht im JSF 1.2 branch)
      • • <tr:colorConverter />
      • • <tr:dateTimeConverter />
      • • <tr:numberConverter />
    58. Helfer Objekte [2]
      • • <tr:resetActionListener />
      • • <tr:returnActionListener />
      • • <tr:setActionListener /> (JSF 1.2 *)
      • • <tr:validateByteLength />
      • • <tr:validateDateTimeRange />
      • • <tr:regExpValidator />
    59. Helfer Objekte [3]
      • • <tr:validateDateRestriction />
      • invalidDaysOfWeek – String[]
      • invalidMonths – String[]
      • invalidDays – DateListProvider
      • public List <Date> getDateList(FacesContext context,
      • Calendar base,
      • Date rangeStart,
      • Date rangeEnd);
    60. Was bringt <tr:xxx /> ?
    61. Trinidad JSF Tags ...
      • Keine Notwendigkeit nur Trinidad Tags zu verwenden (nicht wie bei Tobago)
      • Tags können mit Standardtags gemischt werden (auch Tomahawk)
      • Trinidad Tags sind mächtiger:
        • oft mehr Features
        • Verwendbar innerhalb von <tr:forEach /> (standardmäßig nicht)
        • Effizienteres client side state saving
          • pro Komponente reduzierte Größe
    62. Standard vs Trinidad [1]
      • accesskey – accessKey
      • readonly – readOnly
      • alt and/or title – shortDesc
      • Style – inlineStyle
      • dir, lang – n/a (dir durch skinning)
      • h:outputLabel / h:inputText 
        • tr:inputText label=„myLabel“
      • h:panelGrid  tr:panelBox
    63. Standard vs Trinidad [2]
      • commandButton
        • value vs text
      • form
        • Kein NamingContainer (in Trinidad  )
          • Unterstützt legacy JS besser
      • inputSecret
        • in Trinidad nicht vorhanden, stattdessen: secret Attribut bei inputText
      • uvm ... (siehe h ttp://incubator.apache.org/adffaces/spec-diff.html )
    64. Nur so wenige Komponenten?
    65. HTML AJAX RenderKit
      • aka PPR (Partial Page Rendering)
      • Inkrementelle DOM-Aktualisierung
      • <iframe>-Kommunikations-Kanal (kein XmlHttpRequest …)
        • unterstützt file-upload
      • Client-side Validierungen (kein form.submit())
      • Bei allen Komponenten dabei
        • auch weiterführend; z.b. Table data paging
    66. Verwendung von PPR
      • Drei wichtige Attribute:
        • autoSubmit
          • Für input Komponenten um eine action zu feuern
        • partialSubmit
          • Für command Komponenten ( link/button )
        • partialTriggers
          • Für listener s
            • Beziehen sich auf partial/auto Submit Komponente
            • „ repainting“ der Komponente
    67. <tr:selectOneRadio value=&quot;#{partialBean.selectOne}&quot; autoSubmit=&quot;true&quot; id=&quot;select1&quot; > <tr:selectItem label=&quot;First&quot; value=&quot;Beer&quot; /> <tr:selectItem label=&quot;Second&quot; value=&quot;more beer&quot; /> <tr:selectItem label=&quot;Third&quot; value=&quot;sold out!&quot; /> </tr:selectOneRadio> <tr:outputText value=&quot;#{partialBean.selectOne}&quot; partialTriggers=&quot;select1 &quot;/>
    68. Verwendung von PPR
      • Via Java API:
      • UIXTable table = ( UIXTable ) event.getComponent().findComponent( &quot;userTable&quot; );
      • table.setValue( this . users );
      • RequestContext afContext = RequestContext. getCurrentInstance ();
      • afContext.addPartialTarget(table);
    69. Poll Komponente
      • Oder... ein live-ticker
      <tr:poll pollListener =&quot;#{stocksBean.onPoll}&quot; interval=&quot;2000&quot; id=&quot;pollid&quot; /> <tr:table id=&quot;data&quot; binding=&quot;#{stocksBean.table}&quot; border=&quot;2&quot; partialTriggers=&quot;pollid&quot; var=&quot;stock&quot; > ... </tr:table>
    70. Poll Komponente (Bean)
      • PollEvent / PollListener
      public void onPoll(PollEvent event) { initStocks(); }
    71. Dialog Framework
      • Verschachtelte page-flows
        • wizards
      • Erweiterte Navigation „outcomes“ action=“ dialog: wizard” (konfigurierbar)
      • Isolierter Dialog/Prozess-scope
        • #{ processScope. wizardBean}
      • LaunchEvent und ReturnEvent
    72. Dialog Framework
      • Beispiel:
      <tr:commandButton id=&quot;button2&quot; text=&quot;No Account?&quot; action=&quot;#{dialogBean.createAccount}&quot; launchListener=&quot;#{dialogBean.launch}&quot; returnListener=&quot;#{dialogBean.returned}&quot; immediate=&quot;true&quot; useWindow=&quot;true&quot; windowWidth=&quot;250&quot; windowHeight=&quot;250&quot;/>
    73. public String createAccount(){ RequestContext rCtx = RequestContext.getCurrentInstance(); Map<String, Object> process = rCtx.getPageFlowScope(); process.put(&quot;tmpUser&quot;, new User()); return &quot;dialog:newAccount&quot;; } public void returned(ReturnEvent event){ User u = (User) event.getReturnValue(); ... RequestContext.getCurrentInstance() .getPageFlowScope().clear() }
    74. Optimierte Status-Speicherung
      • JSF UIComponentBase basiert auf JavaBeans
        • Benutzt Java- Reflection für Map Zugriffe
      • Trinidad UIXComponentBase benutzt eine Map
        • JavaBeans property Methoden delegieren zur Map
        • Map benutzt PropertyKeys für optimierte Performance
      • Eliminiert die Notwendigkeit
        • saveState() und restoreState() Methoden der Komponente zu schreiben
    75. „ klassische“ JSF Komponente
      • „ normale“ setter Methoden / „funny“ getter Methoden
      public String getFoo(){ if (_foo != null) return _foo; ValueBinding vb = getValueBinding(&quot;foo&quot;); return vb != null ? (String)vb.getValue(getFacesContext()) : null; }
    76. Trinidad Komponenten
      • Generierte Komponenten...
      • getProperty() / setProperty()
        • UIXComponentBase
      final public String getFoo(){ return ComponentUtils.resolveString(getProperty (FOO_KEY) ); }
    77. Maven 2 Faces Plugin
      • Komponentenbehandlung siehe voriges Kapitel
      • JavaCC Plugin
        • legacy
      • TagDoc Plugin
        • generiert Tag - D o k u f ü r JSF
        • faces-config.xml metadata
        • Doku von facets / events uvm.
      • i18n Plugin
      • JavaScript Plugin
        • Obfuscator, …
      • Jdev Plugin
      • XTRS Plugin
    78. Personalization Framework
      • Eine Webapplikation für viele end-user
        • Jeder möchte das Erscheinungsbild anpassen
        • z.B. Reihenfolge der Komponenten ändern
      • ChangeManager wird benachrichtigt, wenn Benutzer die Änderung durchführt
        • Unterstützt auch Session-basierende Änderungen
    79. RenderKit Extension
      • Senden von JavaScript an den Client:
      FacesContext facesContext = FacesContext.getCurrentInstance(); ExtendedRenderKitService service = (ExtendedRenderKitService)Service.getRenderKitService (facesContext,ExtendedRenderKitService.class); service.addScript(facesContext,&quot;alert('Script added by ExtendedRenderKitService')&quot;);
    80. RenderKit Skinning Architecture
      • Bisher: Styling über styleClass oder style
      • Passiert auf Ebene von DOM-Knoten
      • Besser: Abstraktes Styling auf Komponentenebene
      • Trinidad Skinning
        • Anpassbares look and feel
        • Portabel über Applikationen hinweg
        • Portabel über RenderKits hinweg
        • Null Code
      • CSS 3.0 Syntax
    81. RenderKit Skinning Architecture
      • Anlegen einer CSS Datei
        • Registrieren der Datei in der trinidad-config.xml und der trinidad-skins.xml
      • Referenzieren auf Komponenten über Pseudoelemente
        • af|Komponente::Attribut { … }
        • zb.:
        • af|panelTabbed::tab
        • {
        • font-weight:bold;
        • font-family:Tahoma;
        • padding:2px 8px;
        • }
    82. RenderKit Skinning Architecture
      • auch vordefinierte globale Selektoren
        • .AFButtonServerText:alias {..}
        • :alias heißt, dass Style mehrere Komponenten beeinflußt
        • http://incubator.apache.org/adffaces/skin-selectors.html
    83. Konfiguration
      • /WEB-INF/trinidad-config.xml
      • <?xml version=&quot;1.0&quot;?>
      • <trinidad-config xmlns=&quot;http://myfaces.apache.org/trinidad/config&quot;>
      • <!-- Enable debug output -->
      • <debug-output>true</debug-output>
      • <accessibility-mode>
      • #{user.accessibilityMode}
      • </accessibility-mode>
      • <skin-family>customSkin</skin-family>
      • </trinidad-config>
    84. Interessante Konfigurationsitems
      • Accessibility: default, inaccessible, screen-reader
      • right-to-left: false, true
      • debug-output: false, true
    85. Demo Anwendung FacesGoodies
      • Quickstart für Trinidad
        • Facelets und Shale
        • Spring 2 und JPA (Toplink als Impl)
      • http://code.google.com/p/facesgoodies
      • Frei nutzbar für Ihr (erstes) Trinidad Projekt

    + mwessendorfmwessendorf, 3 years ago

    custom

    13326 views, 1 favs, 1 embeds more stats

    A German presentation on Apache Trinidad, at the JA more

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 13326
      • 13325 on SlideShare
      • 1 from embeds
    • Comments 0
    • Favorites 1
    • Downloads 246
    Most viewed embeds
    • 1 views on http://www.3tools.de

    more

    All embeds
    • 1 views on http://www.3tools.de

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories

    Groups / Events